Gene ado de e oalimen ación
de allada pa a DOMjudge
De ailed eedback gene a o o
DOMjudge
T abajo Fin de G ado
Cu so 2021-2022
Au o es
Rica do En ique F ei e Sacco
Ad ián González Cabanillas
E ik Ka lg en Dome cq
Félix Redondo Manzana es
Di ec o es
En ique Ma ín Ma ín
Manuel Mon eneg o Mon es
G ado en Ingenie ía In o má ica
Facul ad de In o má ica
Uni e sidad Complu ense de Mad id
2
3
Resumen
DOM eed es una aplicación web que o ece e oalimen ación a los pa icipan es
de un concu so de p og amación que se lle e a cabo median e el sis ema DOMjudge.
DOMjudge no o ece la posibilidad de mos a qué casos de p ueba de un p oblema
han allado, ya que únicamen e in o ma al usua io de si una solución es álida o
no. En DOM eed, sin emba go, pa a cada en ega in álida po pa e de un usua io
se mues a el caso de p ueba e óneo. De es a o ma, el usua io pod á agiliza el
p oceso de depu ación de su solución. No obs an e, el adminis ado del concu so
debe á desc ibi el o ma o de los iche os de en ada y salida pa a que se almacenen
en la base de da os de DOM eed. Pa a ello de inimos un lenguaje de especi icaciones
que pe mi e, dado un p oblema, de e mina cómo sepa a los casos de p ueba en
la en ada y la salida del mismo.
Palab as Cla e
DOMjudge, e oalimen ación, juez de p og amación, Reac , Node.js, aplica-
ción web, DOM eed, web sc aping, Exp ess
4
Abs ac
DOM eed is a web applica ion ha p o ides eedback o he pa icipan s o
a p og amming con es conduc ed using he DOMjudge sys em. DOMjudge does
no o e he possibili y o show which es cases o a p oblem ha e ailed, as i
only in o ms he use whe he a solu ion is alid o no . In DOM eed, howe e , o
each in alid submission by a use , he w ong es case is displayed. In his way, he
use can speed up he debugging p ocess o hei solu ion. Howe e , he con es
adminis a o mus desc ibe he o ma o he inpu and ou pu iles o be s o ed
in he DOM eed da abase. Fo his pu pose, we de ine a speci ica ion language
ha allows, gi en a p oblem, o de e mine how o sepa a e he es cases in he
inpu and ou pu o he p oblem.
Keywo ds
DOMjudge, eedback, p og amming judge, Reac , Node.js, web applica ion,
DOM eed, web sc aping, Exp ess
Índice gene al
1. In oducción 13
1.1. Mo i ación................................ 13
1.2. Obje i os ................................ 14
1.3. Plande abajo............................. 15
1.4. O ganización de la memo ia . . . . . . . . . . . . . . . . . . . . . . 17
2. In oduc ion 19
2.1. Mo i a ion................................ 19
2.2. Goals................................... 20
2.3. Wo kplan................................ 21
2.4. Repo o ganisa ion........................... 22
3. P elimina es 25
3.1. Ap endizaje de la p og amación y el uso de p oblemas . . . . . . . 25
3.2. Jueces de p og amación y su impo ancia en el ap endizaje . . . . . 26
3.3. Limi aciones de los jueces de p og amación . . . . . . . . . . . . . . 27
3.3.1. COMPILER-ERROR . . . . . . . . . . . . . . . . . . . . . . 27
3.3.2. WRONG-ANSWER . . . . . . . . . . . . . . . . . . . . . . 27
3.4. DOMjudge como juez de p og amación y su API . . . . . . . . . . . 27
3.5. G amá icas o males . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.5.1. De inición ............................ 29
3.5.2. Ejemplos............................. 29
3.6. Tecnologíasusadas ........................... 30
3.6.1. Ja aSc ip ............................ 30
3.6.2. Node.js ............................. 30
3.6.3. Exp ess.js ............................ 32
3.6.4. Reac .............................. 32
3.6.5. Reac Rou e .......................... 32
3.6.6. Boo s ap ............................ 34
3.6.7. Reac Boo s ap . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6.8. MySQL ............................. 34
3.6.9. PEG.js.............................. 36
3.6.10.Jes ............................... 37
5
6ÍNDICE GENERAL
4. O ganización del sis ema 39
4.1. DOMjudge................................ 39
4.2. Aplicación web o on end ....................... 40
4.2.1. Vis as del adminis ado . . . . . . . . . . . . . . . . . . . . 40
4.2.2. Vis as del usua io . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2.3. Máximo de co ecciones . . . . . . . . . . . . . . . . . . . . 42
4.3. Se ido o backend ........................... 42
4.3.1. npm ............................... 42
4.3.2. Pe iciones del usua io . . . . . . . . . . . . . . . . . . . . . . 43
4.3.3. Da os de DOMjudge . . . . . . . . . . . . . . . . . . . . . . 43
4.3.4. Da os de la base de da os . . . . . . . . . . . . . . . . . . . 44
4.3.5. P ocesamien o de los da os . . . . . . . . . . . . . . . . . . . 44
4.4. Basededa os.............................. 44
4.5. Analizado de casos de p ueba . . . . . . . . . . . . . . . . . . . . . 45
4.5.1. Comp obación de la alidez de una especi icación . . . . . . 45
4.5.2. Sepa ación de casos de p ueba . . . . . . . . . . . . . . . . . 46
5. Analizado de casos de p ueba 47
5.1. Lenguaje de especi icación . . . . . . . . . . . . . . . . . . . . . . . 47
5.1.1. Requisi os del lenguaje . . . . . . . . . . . . . . . . . . . . . 47
5.1.2. Desc ipción del lenguaje . . . . . . . . . . . . . . . . . . . . 49
5.1.3. Ejemplos de especi icaciones . . . . . . . . . . . . . . . . . . 52
5.1.3.1. Ejemplo1....................... 52
5.1.3.2. Ejemplo2....................... 52
5.1.3.3. Ejemplo3....................... 52
5.1.3.4. Ejemplos p oblemá icos . . . . . . . . . . . . . . . 53
5.1.4. API de comp obación de la alidez de una especi icación:
yToPa seG amma () ..................... 54
5.2. Sepa ación de los casos de p ueba . . . . . . . . . . . . . . . . . . . 54
5.2.1. Implemen ación de sepa a eCases() ............. 55
5.2.1.1. API de sepa ación de casos: sepa a eCases() . . . 55
5.2.1.2. Función auxilia : _sepa a eCases() ........ 56
5.2.2. TokenS eam .......................... 59
5.2.3. Reglas de p ocesamien o . . . . . . . . . . . . . . . . . . . . 60
5.2.3.1. Especi icaciones aplicables a cadenas acías . . . . 60
5.2.3.2. E aluación de una exp esión a i mé ica . . . . . . . 61
5.2.3.3. De iniciones de las eglas . . . . . . . . . . . . . . . 62
5.3. Ve i icación del co ec o uncionamien o del analizado . . . . . . . 65
6. Se ido p incipal: on end ybackend 67
6.1. F on end ................................. 67
6.1.1. Iniciodesesión ......................... 68
6.1.2. Cabece a............................. 68
6.1.3. Páginas del adminis ado . . . . . . . . . . . . . . . . . . . 69
6.1.3.1. Vis a de p oblemas . . . . . . . . . . . . . . . . . . 69
ÍNDICE GENERAL 7
6.1.3.2. Vis a de especi icaciones . . . . . . . . . . . . . . . 71
6.1.3.3. Vis a de en egas . . . . . . . . . . . . . . . . . . . 72
6.1.4. Páginas del usua io . . . . . . . . . . . . . . . . . . . . . . . 73
6.1.4.1. Vis a de en egas . . . . . . . . . . . . . . . . . . . 73
6.1.5. Vis a de co ecciones . . . . . . . . . . . . . . . . . . . . . . 75
6.1.6. Código de in e és . . . . . . . . . . . . . . . . . . . . . . . . 77
6.1.6.1. Man ene la sesión . . . . . . . . . . . . . . . . . . 77
6.1.6.2. Páginas p o egidas . . . . . . . . . . . . . . . . . . 78
6.1.6.3. No i icaciones . . . . . . . . . . . . . . . . . . . . . 81
6.2. Backend ................................. 83
6.2.1. Basededa os.......................... 84
6.2.1.1. Es uc u a de la base de da os . . . . . . . . . . . 84
enabled_submissions . . . . . . . . . . . . . . . . . . 84
p oblem_speci ica ions . . . . . . . . . . . . . . . . . 85
max_con es _a emp s . . . . . . . . . . . . . . . . . 86
max_p oblem_a emp s . . . . . . . . . . . . . . . . 86
6.2.1.2. Acceso a la base de da os . . . . . . . . . . . . . . 86
6.2.2. API de DOM eed . . . . . . . . . . . . . . . . . . . . . . . . 87
6.2.2.1. Midlewa es ...................... 87
6.2.2.2. Ob ención de da os de DOMjudge . . . . . . . . . 88
Concu sos po equipos . . . . . . . . . . . . . . . . . 89
P oblemas po concu so . . . . . . . . . . . . . . . . . 89
En egas po equipos . . . . . . . . . . . . . . . . . . 89
En egas po p oblemas . . . . . . . . . . . . . . . . . 89
6.2.2.3. Ges ión del núme o de co ecciones de p oblemas
yconcu sos ...................... 89
Núme o de co ecciones máximo de un concu so . . . 89
Núme o de co ecciones máximo de un p oblema . . . 90
Núme o de co ecciones disponibles de un equipo pa a
unp oblema................. 90
6.2.2.4. Ges ión de especi icaciones de un p oblema . . . . 90
Análisis de especi icaciones . . . . . . . . . . . . . . . 90
6.2.2.5. Sepa ación de casos de p ueba . . . . . . . . . . . . 91
Ob ención de casos de p ueba . . . . . . . . . . . . . 91
Sepa ación de los iche os . . . . . . . . . . . . . . . . 92
6.2.2.6. Ges ión de co ecciones . . . . . . . . . . . . . . . 92
Habili ación de en egas . . . . . . . . . . . . . . . . 92
Co ección de una en ega . . . . . . . . . . . . . . . 92
6.2.3. Web sc aping .......................... 92
7. Conclusiones y abajo u u o 95
7.1. Obje i os alcanzados . . . . . . . . . . . . . . . . . . . . . . . . . . 95
7.2. Di icul ades encon adas . . . . . . . . . . . . . . . . . . . . . . . . 96
7.2.1. G upo1............................. 96
7.2.2. G upo2............................. 96
8ÍNDICE GENERAL
7.3. T abajo u u o ............................. 97
7.3.1. Lenguaje de especi icación . . . . . . . . . . . . . . . . . . . 97
7.3.2. Implemen ación de la sepa ación de casos de p ueba . . . . . 97
7.3.3. F on end ............................. 98
7.3.4. Backend ............................. 98
8. Conclusions and Fu u e Wo k 99
8.1. Objec i es achie ed . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.2. Di icul ies encoun e ed . . . . . . . . . . . . . . . . . . . . . . . . . 100
8.2.1. G oup1 .............................100
8.2.2. G oup2 .............................100
8.3. Fu u ewo k...............................101
8.3.1. Speci ica ion language . . . . . . . . . . . . . . . . . . . . . 101
8.3.2. Implemen a ion o es case sepa a ion . . . . . . . . . . . . 101
8.3.3. F on end.............................101
8.3.4. Backend .............................102
9. Con ibuciones pe sonales 103
9.1. Félix Redondo Manzana es . . . . . . . . . . . . . . . . . . . . . . . 103
9.1.1. Sc aping .............................103
9.1.2. Algo i mo de búsqueda de caso e óneo . . . . . . . . . . . . 103
9.1.3. API de DOM eed . . . . . . . . . . . . . . . . . . . . . . . . 104
9.1.4. Páginas de la in e az web . . . . . . . . . . . . . . . . . . . 104
9.1.5. Sis ema de no i icaciones . . . . . . . . . . . . . . . . . . . . 104
9.1.6. Páginas p i adas . . . . . . . . . . . . . . . . . . . . . . . . 105
9.1.7. Man enimien o de la sesión del usua io . . . . . . . . . . . . 105
9.1.8. Segu ización de la API . . . . . . . . . . . . . . . . . . . . . 105
9.1.9. Llamada a la API de DOMjudge . . . . . . . . . . . . . . . 105
9.2. Rica do En ique F ei e Sacco . . . . . . . . . . . . . . . . . . . . . 105
9.2.1. API de DOM eed . . . . . . . . . . . . . . . . . . . . . . . . 106
9.2.2. Basededa os..........................106
9.2.3. Ges ión del núme o de co ecciones . . . . . . . . . . . . . . 106
9.2.4. Ges ión de especi icaciones . . . . . . . . . . . . . . . . . . . 107
9.2.5. In e azweb...........................107
9.2.6. In eg ación del sepa ado de casos en la aplicación web . . . 107
9.3. Ad ián González Cabanillas . . . . . . . . . . . . . . . . . . . . . . 107
9.3.1. G amá ica del lenguaje de especi icación . . . . . . . . . . . 107
9.3.2. Implemen ación de eglas . . . . . . . . . . . . . . . . . . . . 108
9.3.3. Va iables y es ados . . . . . . . . . . . . . . . . . . . . . . . 108
9.3.4. Especi icaciones que enlazan la en ada con la salida . . . . . 108
9.3.5. Elabo ación de es s . . . . . . . . . . . . . . . . . . . . . . 109
9.3.6. Ag upación de casos de p ueba sepa ados . . . . . . . . . . . 109
9.3.7. Manual de especi icaciones . . . . . . . . . . . . . . . . . . . 109
9.4. E ik Ka lg en Dome cq . . . . . . . . . . . . . . . . . . . . . . . . . 109
9.4.1. TokenS eam ..........................109
ÍNDICE GENERAL 9
9.4.2. G amá ica del lenguaje de especi icación . . . . . . . . . . . 110
9.4.3. Reglas de p ocesamien o . . . . . . . . . . . . . . . . . . . . 110
9.4.4. Sepa ación de casos de la en ada . . . . . . . . . . . . . . . 110
9.4.5. Elabo ación de es s . . . . . . . . . . . . . . . . . . . . . . 111
9.4.6. Documen os...........................111
A. Ejemplos de especi icaciones i
A.1. Ob ene el mínimo de un ec o . . . . . . . . . . . . . . . . . . . . i
A.1.1.Enunciado............................ i
A.1.2.Especi icaciones......................... ii
A.2.ElG ande................................ iii
A.2.1.Enunciado............................ i
A.2.2.Especi icaciones.........................
Bibliog a ía ix
16 CAPÍTULO 1. INTRODUCCIÓN
Figu a 1.1: Diag ama de Gan de las a eas de cada g upo a lo la go del cu so
2021/2022
Desa ollo du an e el segundo cua imes e (1 de eb e o de 2022 - 31
de ma zo de 2022) El g upo 1 comple ó el desa ollo del lenguaje de especi-
icación y la sepa ación de casos, cuyos esul ados pueden consul a se en el
capí ulo 5. Pa a p oba que la implemen ación de ambos e a la espe ada, se
c ea on múl iples es s usando Jes ( e sección 5.3). El g upo 2 se cen ó en
pe ecciona odo el abajo ealizado en el p ime cua imes e y en c ea
an o las pan allas de ges ión del adminis ado , como la base de da os nece-
sa ia pa a su uncionamien o. También se modi icó el algo i mo de búsqueda
del caso e óneo, pues se in oduje on nue os cambios en la especi icación.
El esul ado inal del abajo del g upo 2 se puede consul a en el capí ulo
6.
In eg ación del abajo de ambos g upos (1 de ab il de 2022 - 30 de
ab il de 2022) T as el desa ollo en pa alelo de ambos g upos, se lle a a cabo
la in eg ación del analizado de casos de p ueba con la aplicación web. El
esul ado de dicha in eg ación se explica en el capí ulo 4. El obje i o p incipal
de es a ase es comp oba que la especi icación in oducida es álida, así como
ealiza la sepa ación de los casos de p ueba u ilizando el abajo ealizado
po el g upo 1. Además, el g upo 2 hace nue as a eas de web sc aping pa a
ob ene los iche os de p ueba del p oblema a a a , pues has a ese momen o
se es aban u ilizando iche os gua dados de o ma local.
Elabo ación de la memo ia (1 de mayo de 2022 - 30 de mayo de 2022)
Elabo amos conjun amen e es e documen o con ayuda de nues os u o es,
que se enca ga on de e isa lo en a ias ocasiones.
1.4. ORGANIZACIÓN DE LA MEMORIA 17
1.4. O ganización de la memo ia
La es uc u a de la memo ia es la siguien e:
1. P elimina es: En el capí ulo 3 explicamos odos los concep os necesa ios
pa a en ende el es o de es a memo ia y del p oyec o.
2. O ganización del sis ema: Explicamos cómo es án in e conec ados los
componen es de DOM eed y qué ecnologías u ilizan en el capí ulo 4.
3. Analizado de casos de p ueba: De inimos el lenguaje de especi icación
y desc ibimos la sepa ación de los casos de p ueba en el capí ulo 5.
4. Backend y on end: Explicamos cómo unciona el se ido . Es o incluye
la página web, la base de da os, cómo se u iliza el analizado de casos y cómo
se ac ualizan los casos de p ueba con sepa ado es, así como la pe ición de
da os a DOMjudge y su pos e io a amien o median e la u ilización de su
API y el uso de web sc aping pa a los casos donde la API de DOMjudge no
p opo ciona los da os que necesi amos. Ve capí ulo 6.
5. Conclusiones y abajo u u o: Recapi ulamos los obje i os conseguidos,
discu imos has a qué pun o se han log ado y comen amos qué más cosas
que íamos añadi a DOM eed en el capí ulo 7(la sección Conclusions and
u u e wo k es idén ica pe o en inglés, capí ulo 8).
6. Con ibuciones pe sonales: Mencionamos las a eas que ha lle ado a cabo
cada uno de noso os en el capí ulo 9.
7. (Apéndice) Ejemplos de especi icación: Po úl imo, p esen amos ejem-
plos de especi icaciones pa a p oblemas eales de p og amación en el apéndice
A.
18 CAPÍTULO 1. INTRODUCCIÓN
Capí ulo 2
In oduc ion
In his epo we desc ibe he p ocess o designing and c ea ing a de ailed
eedback gene a o o DOMjudge which we ha e decided o call DOM eed. We
will s a his sec ion by men ioning wha mo i a ed us o c ea e DOM eed and
wha ou goals we e wi h his p ojec . Finally, we will de ail bo h ou wo k plan
and epo s uc u e.
2.1. Mo i a ion
DOMjudge is a p og amming judge mainly in ended o p og amming compe-
i ions, bu i is also equen ly used in ce ain subjec s aken in he Facul y o
Compu e Science a he Complu ense Uni e si y o Mad id. Mos o hese sub-
jec s a e o ien ed owa ds he eaching o algo i hms and da a s uc u es, o which
i is essen ial ha s uden s p ac ice wi h p og amming p oblems ha es hei
knowledge.
When a use submi s a solu ion o a gi en p oblem o DOMjudge, DOMjudge
compiles and execu es he solu ion, checking i s alidi y h ough a se ies o es
cases s o ed on he se e . DOMjudge cap u es he ou pu emi ed by he solu ion,
and checks ha i ma ches he expec ed ou pu o ha p oblem. I i does, he
judge esponds o he use wi h a CORRECT e edic . Con e sely, i he e is any dis-
c epancy be ween he ou pu ob ained and he expec ed ou pu , a WRONG-ANSWER
e dic is e u ned.
Howe e , he la e e dic me ely in o ms he s uden ha his solu ion is
inco ec , so he s uden is no gi en any clues ha migh help him o ix his
solu ion. This o ces hem ei he o hink abou wha hey may ha e done w ong,
o o ask hei eache wha p oblem hei solu ion p esen s o in which es case
i ails.
While we belie e ha a s uden needs o spend ime hinking abou wha
migh be going w ong wi h hei solu ion, we also belie e ha some au oma ic way
o gi ing hem a hin would be desi able. Fu he mo e, al hough we ha e ound
some p og amming judges ha show mo e de ailed eedback han DOMjudge (e.g.
Ju ge.o g [10, 17]), we ha e no ound a modi ied e sion o DOMjudge o an
applica ion ha in e ac s wi h DOMjudge ha shows mo e in o ma ion o w ong
19
20 CAPÍTULO 2. INTRODUCTION
solu ions. This is why we decided o c ea e DOM eed, a web applica ion whose
ole is o p o ide s uden s wi h mo e de ailed eedback han DOMjudge o w ong
solu ions.
2.2. Goals
When de eloping DOM eed, as men ioned abo e, we wan ed o p o ide be e
eedback o he s uden when a solu ion de eloped by him o his eam did no
gene a e he expec ed ou pu . To do so, we conside ed i con enien o show him
he es cases o which he solu ion ailed, which o ced us o:
1. Find a way o sepa a e es cases.
2. Gi en sepa a e es cases, check which es cases he s uden ails.
The second s ep was he simples , because once we ha e all he sepa a e es
cases, i is ela i ely i ial o compa e he expec ed ou pu and he s uden ’s
ou pu on a case-by-case basis un il we ind one whe e hey di e . Howe e , se-
pa a ing es cases om a ile is a signi ican ly mo e complex p oblem, as no all
p og amming p oblems ep esen es cases in he same way. The e o e, we deci-
ded o c ea e a language o speci ying es cases, and i is he ask o he eache
o de ine a co ec speci ica ion o he inpu and ou pu o a p oblem. Such a
language will need a way o delimi whe e each es case s a s and whe e i ends.
On he o he hand, we decided ha DOM eed would be a web applica ion
like DOMjudge. The e o e, we need o c ea e a web page wi h which bo h he
s uden and he eache would in e ac ( he on end), and a backend o in e ac
wi h DOMjudge oge he wi h i s own da abase. The in e ac ion wi h DOMjudge
is necessa y o be able o consul he deli e ies and p oblems wi h hei espec i e
iles wi h he inpu and ou pu es cases, hus a oiding he eache ha ing o
upload hese iles o DOM eed on his own. In ac , i also allows us o con ol
ha only s uden s and eache s who a e egis e ed in DOMjudge using he same
c eden ials can access DOM eed. The da abase, on he o he hand, is needed o
s o e in o ma ion ha we canno ge om DOMjudge, such as he speci ica ions
o each p oblem p o ided by he eache s.
In his web applica ion, he s uden would be able o see he ailed DOMjudge
submissions and disco e he es cases in which each ailed. Howe e , o p e en
he s uden om abusing his sys em, we decided ha he eache could limi he
numbe o imes he s uden could iew his in o ma ion pe p oblem and pe quiz.
Also, eache s would use he web applica ion o p o ide he speci ica ions o each
p oblem, as men ioned abo e.
In conclusion, we ha e de ined he ollowing main goals:
The de ini ion o a es case speci ica ion language and he implemen a ion
o a mechanism o sepa a e he es cases o a p oblem om a speci ica ion.
2.3. WORK PLAN 21
The de elopmen o a web applica ion ha allows he s uden o see in which
es case he s uden ’s deli e y has ailed and he adminis a o o eco d
he necessa y speci ica ions so ha he es cases can be sepa a ed om he
p oblem.
2.3. Wo k plan
A he beginning o he 2021/2022 academic yea , we di ided in o wo g oups,
so ha E ik Ka lg en Dome cq and Ad ián González Cabanillas (G oup 1) would
ha e he objec i e o achie ing he sepa a ion o es cases, while Félix Redondo
Manzana es and Rica do En ique F ei e Sacco would be in cha ge o he web ap-
plica ion (G oup 2). Fo bo h pa s, we es ablished wo k goals e e y wo weeks,
a which ime we me wi h he p ojec u o s (En ique Ma ín Ma ín and Manuel
Mon eneg o Mon es) o show he wo k we had p og essed. We also discussed he
p oblems ha had a isen and how we had sol ed hem. A he end o hese mee-
ings, new objec i es we e se o he ollowing wo weeks i we had comple ed he
pending asks.
Summa ising, he p ojec has been di ided in o se e al phases, indica ing which
objec i es ha e been achie ed in each phase and in which chap e s o he epo
hey a e explained. The miles ones achie ed a e shown in igu e 2.1 and a e des-
c ibed below:
Figu a 2.1: Gan cha o he asks o each g oup du ing he academic yea
2021/2022
P ojec analysis (20 Sep embe 2021 - 7 Oc obe 2021) We es ablished he
goals and scope o he p ojec . We began by in es iga ing he echnologies
22 CAPÍTULO 2. INTRODUCTION
we would use in he p ojec . Ou conclusions a e de ailed in he sec ion
3.6. G oup 1 was in cha ge o pe o ming p oo s o concep wi h he PEG.js
lib a y while g oup 2 spen ime amilia ising hemsel es wi h he DOMjudge
in e ace as well as he DOMjudge API.
De elopmen du ing he i s ou -mon h pe iod (8 Oc obe 2021 - 31
Janua y 2022)Du ing his s age, g oup 1 was implemen ing he mos basic
ea u es o he speci ica ion language and es case sepa a ion, adding new
unc ionali ies e e y wo weeks. On he o he hand, g oup 2 was wo king on
a i s e sion o he DOM eed web applica ion, whe e he i s i e a ion o
he ailed es case sea ch algo i hm, he i s DOM eed API endpoin s, and
he de elopmen o he issue display, deli e y and ix pages we e de eloped.
All he necessa y web sc aping was also pe o med o enable he download
o he ou pu ob ained om he use .
De elopmen du ing he second ou -mon h pe iod (1 Feb ua y 2022
- 31 Ma ch 2022) G oup 1 comple ed he de elopmen o he speci ica ion
language and he sepa a ion o cases, he esul s o which can be ound in
chap e 5. To es ha he implemen a ion o bo h was as expec ed, mul iple
es s we e c ea ed using Jes (see sec ion 5.3). G oup 2 ocused on e ining
all he wo k done in he i s e m and c ea ing bo h he adminis a o ma-
nagemen sc eens and he da abase necessa y o hei ope a ion. The sea ch
algo i hm o he e oneous case was also modi ied, as new changes we e ma-
de o he speci ica ion. The inal esul o g oup 2’s wo k can be ound in
chap e 6.
In eg a ion o he wo k o bo h g oups (1 Ap il 2022 - 30 Ap il 2022)
A e he pa allel de elopmen o bo h g oups, he in eg a ion o he es case
analyse wi h he web applica ion is ca ied ou . The esul o his in eg a ion
is explained in he chap e 4. The main goal o his phase is o check ha
he speci ica ion in oduced is alid, as well as o ca y ou he sepa a ion o
he es cases using he wo k done by g oup 1. In addi ion, g oup 2 pe o ms
new web sc aping asks o ob ain he es iles o he p oblem o be deal
wi h, as up o his poin , locally s o ed iles we e being used.
Repo (1 May 2022 - 30 May 2022) We join ly de eloped his documen
wi h he help o ou u o s, who we e esponsible o e ising i on se e al
occasions.
2.4. Repo o ganisa ion
The s uc u e o he epo is as ollows:
1. P elimina ies: In chap e 3 we explain all he concep s necessa y o un-
de s and he es o his epo and he p ojec .
2.4. REPORT ORGANISATION 23
2. Sys em o ganisa ion: We explain how DOM eed’s componen s a e in e -
connec ed and which echnologies hey use in chap e 4.
3. Tes case analyse : We de ine he speci ica ion language and desc ibe he
sepa a ion o he es cases in chap e 5.
4. Backend y on end: We explain how he se e wo ks. This includes he
web page, he da abase, how he case pa se is used and how es cases a e
upda ed wi h sepa a o s, as well as eques ing da a om DOMjudge and
hen p ocessing i using i s API and using web sc aping o cases whe e he
DOMjudge API does no p o ide he da a we need. See chap e 6.
5. Conclusions and u u e wo k: We ecap he objec i es achie ed, discuss
o wha ex en hey ha e been achie ed and discuss wha else we would
like o add o DOM eed in chap e 7(sec ion Conclusions and u u e wo k is
iden ical bu in English, chap e 8).
6. Pe sonal con ibu ions: We men ion he asks ca ied ou by each o us
in chap e 9.
7. (Appendix) Speci ica ion examples: Finally, we p esen examples o spe-
ci ica ions o eal p og amming p oblems in he appendix A.
24 CAPÍTULO 2. INTRODUCTION
Capí ulo 3
P elimina es
En es a sección se lis an y se explican los concep os necesa ios pa a en ende
el p oyec o, al igual que se p esen an las ecnologías usadas pa a el desa ollo del
mismo.
3.1. Ap endizaje de la p og amación y el uso de
p oblemas
A la ho a de ap ende a p og ama es undamen al la esolución de p oble-
mas pa a pone a p ueba los conocimien os adqui idos. En p og amación exis en
muchos ipos de p oblemas, pe o pa a odos ellos hay es concep os p incipales:
El p oblema a esol e en sí, que de e mina lo que se quie e calcula , y pa a
el cual se necesi a de ini un algo i mo.
Las en adas del p oblema, que son los pa áme os u opciones necesa ios
pa a que el p oblema se pueda esol e .
Y las salidas, que co esponden al esul ado del p oblema una ez que se ha
ejecu ado eniendo en cuen a las en adas.
Supongamos el siguien e p oblema: dados dos núme os en e os, enemos que
calcula su suma. Pa a ello de inimos un p og ama o algo i mo (po ejemplo, en
Ja aSc ip ) que ecibe dos pa áme os, en ada1 yen ada2, y de uel e el e-
sul ado de suma esos dos alo es, esul ado, como podemos e en la igu a
3.1:
1 unc ion suma ( a en ada1, a en ada2 ) {
2 a esul ado = en ada1 + en ada2 ;
3 e u n esul ado ;
4}
Figu a 3.1: Ejemplo de un p oblema de p og amación
25
32 CAPÍTULO 3. PRELIMINARES
es una g an en aja, pues o ece la posibilidad de u iliza la misma ecnología an o
en el on -end como en el back-end.
Node.js o ece una g an can idad de lib e ías que acili an el desa ollo de
aplicaciones, las cuales son ácilmen e ges ionables median e el ges o de paque es
de node: npm.
Además, Node.js es un lenguaje asínc ono basado en callbacks o p omesas,
pe mi iendo así a ende múl iples conexiones o llamadas simul áneamen e. Es o
ambién pe mi e que a eas que puedan oma cie o iempo pasen a segundo
plano, como el caso de llamadas a la API o a la base de da os y que así no se
de enga el lujo de la aplicación.
3.6.3. Exp ess.js
Exp ess.js [7] es un amewo k pa a Node.js que pe mi e es uc u a y en u a
aplicaciones web y c ea APIs. Además ambién o ece o as unciones como la
ges ión de sesiones y cookies. Debido a su sencillez y a que es á p og amado en
Node, se adap a pe ec amen e a odos los equisi os o eciendo g an lexibilidad
y endimien o.
Además Exp ess.js o ece g an sencillez a la ho a de desa olla cualquie ipo
de APIs, pues con una simple línea de código, se puede pone en uncionamien o
un se ido pa a que eciba pe iciones de clien es. Así mismo, o ece mul i ud de
mé odos pa a c ea y maneja co ec amen e las u as y pe iciones al se ido . En
la igu a 3.3 se puede e un cla o ejemplo de la simplicidad de Exp ess.js, donde
se es á c eando un se ido en pocas líneas de código.
Pa a el a amien o de las sesiones, cookies, pe misos, y en de ini i a, el análisis
de las pe iciones y la ges ión de e o es, se usan los middlewa es. Un middlewa e
es una unción que se si úa en e la solici ud inicial y la u a inal a la que se
p e ende llega y que puede ejecu a cualquie código, cambia la pe ición inicial,
modi ica la espues a o e mina la pe ición impidiendo que llegue a su u a inal.
3.6.4. Reac
Reac [20] es una biblio eca de Ja aSc ip que se u iliza pa a acili a la c ea-
ción de in e aces de usua io en el on -end (o na egado web). Es un lenguaje
decla a i o basado en componen es eu ilizables que se ende izan y ac ualizan
au omá icamen e cuando ocu e un cambio en la in o mación que mues a la apli-
cación.
Además de esul a cómodo pa a el desa ollo de la aplicación, Reac es una
ecnología ampliamen e u ilizada en la ac ualidad, lo cual ayuda a maximiza la
man enibilidad del sis ema.
3.6.5. Reac Rou e
Reac Rou e [19] es una lib e ía de en u amien o en Ja aSc ip basada en
componen es pa a Reac . Es a lib e ía pe mi e c ea un en u amien o dinámico en
3.6. TECNOLOGÍAS USADAS 33
1 a exp ess = equi e(’exp ess’)
2 a app = exp ess ()
3
4// middlewa e que mues a un mensaje po pan alla cada ez que
llega una pe icion al se ido en iando una espues a y
pe mi iendo que la llamada con inue
5app .use ( unc ion ( eq , es , nex ) {
6console . log (’Ha llegado una pe icion ’)
7nex ()
8})
9
10 // Se c ea un ou a / hello que de uel e ’hello wo ld ’ al clien e
11 app.ge (’/ hello ’, unc ion ( eq , es ) {
12 es. send(’hello wo ld ’)
13 })
14
15 // middlewa e que maneja los posibles e o es que se hayan
p oducido y de uel e un mensaje de e o
16 app .use ( unc ion (e , eq , es , nex ) {
17 console . e o ( e . s ack )
18 es . s a us (500) . send (’Algo ha salido mal ’)
19 })
20
21 // Se pone en ma cha un se ido que escucha po el pue o 3000
22 app.lis en(3000)
Figu a 3.3: Ejemplo de se ido en Exp ess.js
34 CAPÍTULO 3. PRELIMINARES
la pa e del se ido , ealiza edi ecciones, pasa pa áme os en las u as, ene
acceso al his o ial de na egación y maneja las páginas de e o es.
En esencia, es a ecnología pe mi e ca ga unos componen es u o os dinámi-
camen e dependiendo de la u a de la aplicación en la que es emos.
3.6.6. Boo s ap
Boo s ap [2] es un amewo k CSS que o ece di e sas uncionalidades y plan-
illas pa a el diseño del on -end de aplicaciones web. El amewo k combina an o
CSS como Ja aSc ip pa a da es ilo a la web.
El p incipal obje i o de Boo s ap es c ea una in e az web adap able ( es-
ponsi e), es deci , que la web se adap e dependiendo del disposi i o y amaño de
pan alla desde donde se es é accediendo. Así mismo, ambién con iene una g an
can idad de componen es ya c eados como ale as, ba as de p og eso y menús de
na egación, en e muchos o os. También añade una g an biblio eca de cien os de
iconos pa a pode u iliza en la web muy ácilmen e.
La decisión de u iliza Boo s ap pa a el diseño del p oyec o se debe a la in en-
ción de eplica el diseño de la aplicación de DOMjudge, la cual es á desa ollada
con Boo s ap.
3.6.7. Reac Boo s ap
Reac Boo s ap [18] eemplaza comple amen e la pa e de Ja aSc ip de Boo s-
ap eliminando JQue y, c eando componen es o almen e op imizados pa a Reac
y mucho mas iables. En la igu a 3.4 se puede e un ejemplo.
Como se puede e en la igu a, al u iliza Reac Boo s ap en ez de Boo s ap,
se ob iene un código mucho más decla a i o y ácil de esc ibi y lee . En ez de ene
que u iliza clases pa a de ini el es ilo de un componen e ’di ’ en Boo s ap, en
Reac Boo s ap se inse a un componen e, el cual in e namen e ya iene de inido
odo lo necesa io pa a su co ec o uncionamien o: clases, es ilos, código Ja aSc ip ,
lógica uncional, e c. Lo único que hay que de ini , en es e caso, al usa Reac
Boo s ap, es el componen e que se a a usa , Ale , que es de ipo dange y
que además puede ce a se añadiendo el a ibu o dismissible. También hay que
especi ica que se quie e una cabece a, Ale .Heading, y el cue po de la ale a, p.
Reac Boo s ap p opo ciona un código mucho más limpio y legible en e a
Boo s ap. Además, si nos ijamos, nos es amos aho ando la c eación del bo ón
po que el a ibu o dismissible lo inse a in e namen e, sin con a odas las clases
que no se añaden po que ya se incluyen po de ec o al c ea el componen e Ale .
3.6.8. MySQL
MySQL es un sis ema u ilizado pa a la adminis ación y ges ión de bases de
da os elacionales.
Un sis ema ges o de bases de da os elacional es una aplicación que se
enca ga de almacena y o ece ácil y ápido acceso a un conjun o de da os de
3.6. TECNOLOGÍAS USADAS 35
1
2// BOOTSTRAP
3
4impo Reac om ’ eac ’;
5
6 unc ion Example () {
7 e u n (
8<di class =" ale ale - dange ale - dismissible
9 ade show" ole=" ale ">
10 <s ong >Oh snap ! You go an e o ! </ s ong >
11 <p>
12 Change his and ha and y again .
13 </p>
14 <bu on ype ="bu on" class =" close "
15 da a - dismiss =" ale " a ia - label =" Close ">
16 <span a ia - hidden =" ue" >& imes ; </ span>
17 </bu on >
18 </di >
19 )
20 }
21
22 // REACT - BOOTSTRAP
23
24 impo Reac , { Componen } om ’ eac ’;
25 impo Ale om ’ eac - boo s ap / Ale ’;
26
27 unc ion Example () {
28 e u n (
29 <Ale dismissible a ian =" dange " >
30 <Ale .Heading >
31 Oh snap ! You go an e o !
32 </ Ale .Heading>
33 <p>
34 Change his and ha and y again .
35 </p>
36 </Ale >
37 )
38 }
Figu a 3.4: Compa a i a de Boo s ap con Reac -Boo s ap
36 CAPÍTULO 3. PRELIMINARES
1s a
2= addi i e
3
4addi i e
5= le :mul iplica i e "+" igh : addi i e { e u n le + igh ;
}
6/ mul iplica i e
7
8mul iplica i e
9= le : p ima y "*" igh :mul iplica i e { e u n le * igh ; }
10 / p ima y
11
12 p ima y
13 = in ege
14 /"(" addi i e:addi i e ")" { e u n addi i e ; }
15
16 in ege "in ege "
17 = digi s :[0 -9]+ { e u n pa seIn ( digi s . join ("") , 10); }
Figu a 3.5: G amá ica pa a exp esiones a i mé icas pa a PEG.js
mane a es uc u ada y o denada, ag upándolos median e ablas y elacionándolos
en e sí.
Pa a nues o p oyec o es a ecnología esul a de g an u ilidad a la ho a de
almacena in o mación que no podemos ob ene a pa i de la API de DOMjudge,
como las especi icaciones de los p oblemas o el núme o de e isiones asociado a
cada p oblema.
3.6.9. PEG.js
PEG.js es una lib e ía desa ollada en Ja aSc ip pa a gene a analizado es
sin ác icos o pa se s [16]. Es especialmen e adecuada pa a p ocesa lenguajes de
p og amación e incluso acaba cons uyendo in é p e es o compilado es. Además,
es á basada en g amá icas de exp esión de análisis sin ác ico (en inglés Pa sing
Exp ession G amma , y de ahí las siglas PEG) en ez de g amá icas LL(k)o
LR(k).
Al desca ga nos la lib e ía podemos ins ala ambién un comando pegjs con
el que gene a analizado es sin ác icos o pa se s a pa i de iche os como el de la
igu a 3.5, el cual es un ejemplo p o enien e de la documen ación de PEG.js [15].
En es e iche o se desc ibe una g amá ica pa a econoce exp esiones a i mé icas
de núme os en e os que sopo a el econocimien o de sumas, mul iplicaciones y
pa én esis.
Como podemos obse a , la es uc u a de es os iche os sigue una es uc u a
muy simila a la usada no malmen e pa a de ini g amá icas, lo cual acili a eno -
memen e el uso de la lib e ía. No obs an e, PEG.js ambién nos pe mi e ealiza
cálculos o p ocesamien os con las cadenas de ca ac e es que econoce cada egla
usando Ja aSc ip . De hecho, en el iche o de la igu a 3.5, la egla in ege hace
lo siguien e:
3.6. TECNOLOGÍAS USADAS 37
1. Reconoce una cadena de ca ac e es con solo dígi os ([0-9]+).
2. Asigna esa cadena a una a iable digi s.
3. Usa esa a iable en un agmen o de código en Ja aSc ip pa a con e i la
cadena a un núme o en e o. Nó ese que la a iable digi s con iene un a ay
de ca ac e es en ez de un s ing de Ja aSc ip , y po eso necesi amos usa
el mé odo join() pa a con e i lo a un s ing.
El es o de eglas uncionan de o ma pa ecida, pe o se usan pa a calcula el
alo de la exp esión a i mé ica pa iendo de los en e os econocidos po la egla
in ege . Po ello, al e mina de p ocesa una exp esión a i mé ica econocible
po la g amá ica que de ine es e iche o, el analizado sin ác ico de uel e el alo
de dicha exp esión. Pa a más de alles, éase la documen ación [15].
3.6.10. Jes
Jes [9] es una lib e ía implemen ada en Ja aSc ip pa a ejecu a es s que
unciona con Node.js, en e o as ecnologías. El p incipal a ac i o de es a lib e ía
es que unciona sin ene que con igu a nada y que incluye muchas uncionalidades
en un solo paque e. En e ellas se encuen an: es s, mocking de obje os, análisis
de cobe u a del código (code co e age), y mensajes muy in o ma i os en caso de
que un es alle ( éase la igu a 3.6, donde al in en a suma 1y2se espe a un 3
pe o se ob iene un 4).
Al se una lib e ía an comple a hemos decidido usa la con algunas pa es de
nues o p oyec o.
38 CAPÍTULO 3. PRELIMINARES
Figu a 3.6: Ejecución de Jes pa a una implemen ación no álida de una unción
de suma. El comando npm es llama in e namen e a Jes en es e p oyec o.
Capí ulo 4
O ganización del sis ema
El sis ema es á di idido en dos pa es. Po un lado, se encuen a la aplicación
web desa ollada DOM eed y, po o o lado, el juez de p og amación DOMjudge.
DOM eed a su ez es á compues o po una aplicación web con la que in e ac úa
el usua io, un se ido , una base de da os elacional y un analizado (o pa se )
de casos de p ueba. En la igu a 4.1 se mues a un diag ama explica i o de cómo
el sis ema es á es uc u ado. A con inuación, se de allan cada una de las pa es y
sus unciones p incipales de o ma especí ica.
Figu a 4.1: Diag ama explica i o con los di e en es componen es del sis ema
4.1. DOMjudge
DOMjudge es la base p incipal de DOM eed. Todas las uncionalidades desa-
olladas en DOM eed dependen di ec amen e de llamadas a la API de DOMjudge
[5]. La API de DOMjudge es limi ada, pues no p o ee de odas las llamadas que
39
40 CAPÍTULO 4. ORGANIZACIÓN DEL SISTEMA
se necesi an pa a que uncione DOM eed. Po ello, hemos enido que ecu i al
sc aping a la ho a de desca ga los iche os de p ueba y salidas del usua io
El sc aping es una écnica que si e pa a ex ae in o mación de páginas web
de mane a au oma izada. Exis en cie as he amien as que acili an el uso del
sc aping, pe o en es e caso, ya que su uso es pun ual, no se ha u ilizado ninguna.
Más adelan e, se de alla su uso en el p oyec o ( e sección 6.2.3).
4.2. Aplicación web o on end
El on end es la pa e de la aplicación con la que in e ac úa el usua io. Es la
enca gada de mos a la in o mación que se solici e. La aplicación es á di idida en
dos pa es independien es según el ol del usua io:
Una pa e de adminis ación, a la que accede el p o eso (de aho a en ade-
lan e el ‘adminis ado ’). Es e iene acceso a la con igu ación de odos los
concu sos.
O a pa e pa a el alumno (de aho a en adelan e el ‘usua io’), donde es e
puede consul a las en egas de los p oblemas del equipo al que pe enezca.
El on end es á p og amado en su o alidad en Reac [20]. Debido a que la
aplicación equie e de di e en es páginas pa a los dis in os componen es o uncio-
nalidades, hemos u ilizado Reac Rou e [19] pa a acili a el en u ado.
La aplicación web equie e de múl iples pe iciones al se ido pa a ob ene
odos los da os necesa ios. Pa a ello, decidimos u iliza la lib e ía Axios [1], la cual
p o ee de g andes ayudas a la ho a de hace pe iciones al se ido .
En cuan o a la maque ación y CSS, hemos u ilizado Reac Boo s ap [18], el
cual eemplaza a Boo s ap [2] como amewo k. A di e encia de Boo s ap, Reac
Boo s ap es á comple amen e op imizado pa a Reac , pe mi iendo así mejo as en
endimien o y en elocidad de desa ollo.
4.2.1. Vis as del adminis ado
Las pan allas del adminis ado se basan en la ges ión y con ol de DOM eed. El
adminis ado iene p i ilegios o ales de isualización, pudiendo accede a odas
las en egas o submissions de cualquie equipo.
La a ea p incipal del adminis ado es la de suminis a , pa a cada uno de
los p oblemas que hay egis ados en DOMjudge, una especi icación álida y un
núme o máximo de eces que un equipo puede e la solución a una en ega pa a
un p oblema de e minado y concu sos. En la sección 4.2.3 se explica de enidamen e
en qué consis e es a pa e.
4.2.2. Vis as del usua io
El ol p incipal del usua io en DOM eed es isualiza , pa a cualquie p oblema
donde DOMjudge haya mos ado un e edic o de WRONG-ANSWER, la salida
4.2. APLICACIÓN WEB O FRONTEND 41
Figu a 4.2: Vis a de adminis ado
espe ada en e a la salida ob enida de ejecu a la solución p opo cionada po el
usua io. Pa a ello hay que solici a al se ido esos da os.
De es a o ma, una ez hecha la pe ición, se mos a á una pan alla explica i a
donde se pueden e los casos de en ada, la salida espe ada y la salida ob enida
po la solución del usua io. El caso de p ueba en el que di ie e la salida espe ada
apa ece de colo ojo, pa a indica al usua io donde es á el e o en su solución del
p oblema.
Un usua io solamen e puede e los concu sos a los que pe enezca, así como
las en egas que haya hecho él mismo o su equipo. Además, solo pod á e las
soluciones en el caso de que enga co ecciones es an es o cuando ya ha solici ado
la ayuda pa a dicha en ega p e iamen e. Es e pun o se explica á con más de alle
en la sección 6.1.4.1.
Figu a 4.3: Vis a de usua io
48 CAPÍTULO 5. ANALIZADOR DE CASOS DE PRUEBA
In o mación p e ia
Caso de p ueba 1
Caso de p ueba 2
...
Caso de p ueba n
Fin de iche o
Figu a 5.1: Esquema de un iche o de casos de p ueba de en ada
In o mación p e ia
<sepa ado >
Caso de p ueba 1
<sepa ado >
Caso de p ueba 2
<sepa ado >
...
<sepa ado >
Caso de p ueba n
<sepa ado >
Fin de iche o
Figu a 5.2: Esquema de un iche o de casos de p ueba de en ada con sepa ado es
Además, debemos ene en cuen a que los iche os de muchos p oblemas ie-
nen algo de in o mación adicional al p incipio o al inal del p opio iche o que no
pe enece a ningún caso de p ueba, como mues a el esquema de la igu a 5.1. La
in o mación p esen e al p incipio del iche o suele indica el núme o de casos de
p ueba que con iene, mien as que la pa e inal se suele usa pa a indica que no
hay más casos de p ueba.
Po consiguien e, hemos conside ado que un caso de p ueba debe ene siemp e
un sepa ado an es y o o después, de modo que la in o mación del p incipio del
iche o solo end á un sepa ado después, y la del in del iche o end á el sepa ado
an es de la misma ( éase la igu a 5.2). De es a o ma podemos siemp e dis ingui
qué pa e de un iche o es un caso de p ueba o no.
Has a el momen o hemos is o qué c i e io aplica a la ho a de pone sepa ado-
es. No obs an e, necesi amos ambién especi ica qué es uc u a ienen los casos
de p ueba y la in o mación del p incipio y del inal del iche o.
Pa a ello p ime o necesi amos in oduci el concep o de oken ocomponen e/ o-
ken léxico. Un oken es una cadena de ca ac e es al que se le asigna un signi icado.
Po ejemplo, la cadena ‘1234’ se puede a a como un núme o en e o y pod íamos
llama lo un oken en e o. Po o o lado, la cadena ‘x’ pod ía se a ada como
el nomb e de una a iable o de una unción en un lenguaje de p og amación y
pod íamos denomina lo como un oken iden i icado . El concep o de oken es un-
damen al pa a pode desc ibi la es uc u a de los casos de p ueba de un iche o,
po lo cual decidimos inco po a lo a nues o lenguaje.
De hecho, muchos p oblemas de p og amación abajan con en adas o madas
5.1. LENGUAJE DE ESPECIFICACIÓN 49
únicamen e po núme os en e os. A aíz de es o, e a indispensable inclui un oken
de ipo núme o en e o a nues o lenguaje de especi icación. No obs an e, los p o-
blemas de p og amación ambién pueden espe a cadenas de ca ac e es o s ings,
po lo que decidimos ambién inclui un oken s ing. Es e oken se i ía pa a e-
p esen a cadenas de ca ac e es delimi adas po ca ac e es de espacio, abulado es
o in de línea. Además, en algunos p oblemas pa e de esas cadenas son siemp e
las mismas, po lo que con enía que nues o lenguaje de especi icación sopo ase
li e ales. Un li e al es un alo cons an e, como puede se ‘1’,‘abc’ o‘hello
wo ld’ (nó ese que el úl imo ejemplo incluye un espacio, po lo que equi ald ía a
dos okens s ing). Po úl imo, decidimos ambién inclui un oken pa a ep esen-
a líneas de ex o y o o pa a ep esen a el in de iche o al que llama emos EOF
(del inglés End O File).
Nues o lenguaje además necesi aba pode econoce exp esiones o madas po
secuencias de okens sepa adas po espacios, pe o ambién disyunciones de es as
mismas exp esiones. Po ejemplo, en algunos p oblemas el alumno iene que esc ibi
en la salida o bien un s ing o bien o o (po ejemplo, ‘SI’ o ‘NO’), así que decidimos
inclui disyunciones en el lenguaje.
Po úl imo, incluimos la posibilidad de que una exp esión se epi a, o bien un
núme o inde e minado de eces, o bien una can idad cons an e. De hecho, como
en la in o mación del p incipio de un iche o es á p esen e en muchas ocasiones el
núme o de casos de p ueba, decidimos añadi la posibilidad de que el núme o de
epe iciones dependa de un oken en e o an e io , de modo que una especi icación
pueda indica que el p ime oken es un en e o n, y que a con inuación hay ncasos
de p ueba.
5.1.2. Desc ipción del lenguaje
La g amá ica de la igu a 5.3 puede usa se como documen ación del lenguaje
de especi icación e incluye odas las ca ac e ís icas que comen amos en la sección
an e io . No obs an e, es ambigua, es deci , se pueden usa sus eglas de a ias
o mas dis in as pa a desc ibi una misma especi icación, lo cual complica eno -
memen e su uso a la ho a de implemen a un analizado o pa se del lenguaje.
Po an o, hemos de inido la g amá ica de la igu a 5.4, la cual no es ambigua y
desc ibe la p io idad a la ho a de aplica unas eglas sob e o as, algo de lo que
ca ecía la g amá ica de la igu a 5.3.
Po ejemplo, eamos la especi icación <in >∧(2 * 4 + 3). La g amá ica ambi-
gua ( igu a 5.3) no se ía capaz de disce ni si la exp esión 2 * 4 + 3 se p ocesa ía
como (2 * 4) + 3 o2 * (4 + 3), es deci , no sabe qué ope ación es más p io i a-
ia en e la mul iplicación y la suma. Es o es así po que las eglas exp ::= exp
+ exp yexp ::= exp * exp pueden usa se en cualquie o den. No obs an e,
la g amá ica no ambigua ( igu a 5.4) no p esen a al p oblema, pues la egla A1
::= A2 * A1 siemp e se iene que aplica después de la egla A0 ::= A1 + A0.
Sin emba go, la g amá ica no ambigua es signi ica i amen e más sencilla, po
lo que sigue siendo ú il pa a documen a las ca ac e ís icas del lenguaje.
50 CAPÍTULO 5. ANALIZADOR DE CASOS DE PRUEBA
Inicio ::=S EOF Fiche o de casos de p ueba
S::=Token Token
|S S Secuencia
|S ‘∥’ S Disyunción
|S ‘∧’ ep Repe ición
|‘–––’ Sepa ado de casos
ep ::=‘*’ Núme o inde e minado
|‘n’Núme o en e o
|‘x’Va iable
|‘(’ exp ‘)’
exp ::=‘n’Núme o en e o n
|‘x’Va iable
|exp ‘+’ exp Suma
|exp ‘-’ exp Res a
|exp ‘*’ exp Mul iplicación
|exp ‘/’ exp Di isión
|‘+’ exp Más una io
|‘-’ exp Menos una io
|‘(’ exp ‘)’ Exp esión en e pa én esis
Token ::=in
|s ing
|line
|li e al
in ::=‘<in >’ En e o
|‘<x:in >’ En e o asignado a una a iable x
s ing ::=‘<s ing>’ Cadena de ca ac e es
|‘<x:s ing>’
line ::=‘<line>’ Línea de ex o
|‘<x:line>’
li e al ::=‘”s”’Li e al sen e comillas dobles
Figu a 5.3: G amá ica ambigua del lenguaje de especi icación
5.1. LENGUAJE DE ESPECIFICACIÓN 51
Inicio ::=Disyunción EOF Fiche o de casos de p ueba
Disyunción ::=Secuencia ‘∥’ Disyunción
|Secuencia
Secuencia ::=Repe ición Secuencia
|Repe ición
Repe ición ::=S ‘∧’ ep
|S
S::=Token
|‘(’ Disyunción ‘)’
|‘–––’ Sepa ado de casos
ep ::=‘*’ Núme o inde e minado
|exp
exp ::=A3 Exp esión a i mé ica
A0 ::=A1 ‘+’ A0 Suma
|A1 ‘-’ A0 Res a
|A1
A1 ::=A2 ‘*’ A1 Mul iplicación
|A2 ‘/’ A1 Di isión
|A2
A2 ::=‘+’ A3 Más una io
|‘-’ A3 Menos una io
|A3
A3 ::=‘n’Núme o en e o n
|‘x’Va iable
|‘(’ A0 ‘)’ Exp esión en e pa én esis
Token ::=in
|s ing
|line
|li e al
in ::=‘<in >’ En e o
|‘<x:in >’ En e o asignado a una a iable x
s ing ::=‘<s ing>’ Cadena de ca ac e es
|‘<x:s ing>’
line ::=‘<line>’ Línea de ex o
|‘<x:line>’
li e al ::=‘”s”’Li e al sen e comillas dobles
Figu a 5.4: G amá ica desambiguada del lenguaje de especi icación
52 CAPÍTULO 5. ANALIZADOR DE CASOS DE PRUEBA
5.1.3. Ejemplos de especi icaciones
Pa a que el lec o se amilia ice con el lenguaje de especi icaciones desc i o en
las igu as 5.3 y 5.4, con iene que p esen emos algunos ejemplos sencillos. Pa a
ejemplos más a anzados, consul e el apéndice A, el cual con iene especi icaciones
pa a p oblemas eales de p og amación.
5.1.3.1. Ejemplo 1
Empecemos po un p oblema que siemp e iene un único caso de p ueba. Si
dicho caso de p ueba consis e de es núme os en e os, pod íamos usa la siguien e
especi icación:
--- <in > <in > <in > ---
La cual se puede ab e ia de la siguien e mane a:
--- <in >∧3 ---
Aquí <in > ep esen a un en e o cualquie a, y --- ep esen a el sepa ado de
casos de p ueba (lo que en las igu as 5.1 y 5.2 se denomina <sepa ado >). Como
mencionamos en la sección 5.1.1, un caso de p ueba debe ene un sepa ado an es
y o o después.
5.1.3.2. Ejemplo 2
Veamos un uso ípico de a iables. Tenemos un p oblema donde la en ada
empieza con un núme o nseguido de ncasos de p ueba, de modo que cada uno
consis e en o os dos núme os en e os. Una especi icación álida pod ía se la
siguien e:
<n:in > --- (<in > <in > ---)∧n
Con el oken <n:in >, el alo del p ime en e o de la en ada se gua da pa a
pode e e encia se pos e io men e con la a iable n. De hecho, se usa es e alo
npa a desc ibi cuán os casos de p ueba iene la en ada, usando ∧n. Además, al
igual que en el ejemplo an e io , cada caso de p ueba queda delimi ado po dos se-
pa ado es, mien as que <n:in > iene solo uno después al a a se de in o mación
p e ia a los casos de p ueba.
5.1.3.3. Ejemplo 3
Veamos es a ez un p oblema donde cada caso de p ueba de la en ada es, o
bien una cadena "comp a " seguida de un en e o, o bien una cadena " ende "
seguida ambién de un en e o. Además, supongamos que el núme o de casos es
inde e minado. En onces pod íamos usa la siguien e especi icación:
--- (("comp a " || " ende ") <in > ---)∧*
("comp a " || " ende ") indica que puede apa ece , al igual que dice el
enunciado, an o la cadena ‘comp a ’ como la cadena ‘ ende ’. Po o o lado,
∧*indica que puede habe 0 o más casos de p ueba.
5.1. LENGUAJE DE ESPECIFICACIÓN 53
5.1.3.4. Ejemplos p oblemá icos
Sea un p oblema de p og amación donde enemos un núme o inde e minado
de casos de p ueba, de modo que cada uno consis e de dos cadenas de ca ac e es
sin espacios, y delimi amos el in del iche o con la cadena ‘- in iche o-’ (es
un li e al). Una posible especi icación se ía la siguien e:
--- (<s ing> <s ing> ---)∧* "- in iche o-"
Es a especi icación p esen a un p oblema de inde e minismo debido a los e-
quisi os del enunciado. A menos que ningún caso de p ueba pudie a ene las
cadenas ‘- in’ y‘ iche o-’, si al i leyendo la en ada encon amos el li e al
‘- in iche o-’, no podemos asegu a que hayamos llegado al inal del iche-
o si no seguimos leyéndolo. Es o supone un p oblema a la ho a de p ocesa un
iche o de en ada jun o a es a especi icación, pues nos ue za a comp oba si el
li e al ‘- in iche o-’ son dos cadenas de un mismo caso de p ueba, y en caso
con a io enemos que ol e a ás y p ocesa lo como un li e al.
Es e p oblema de inde e minismo no solo exis e en e okens s ing y li e ales,
pues un núme o como el 0 puede se acep ado an o po "0" como <in >, como
ocu e en las siguien es especi icaciones:
--- (<in > ---)∧* "0"
--- ("0" ---)∧* "0"
Además, las siguien es especi icaciones siemp e p esen an los p oblemas an e-
io es, independien emen e de que los casos de p ueba engan siemp e un con enido
dis in o al del in de iche o:
--- (<s ing> ---)∧* <s ing>
--- (<in > ---)∧* <in >
De hecho, podemos gene aliza odos los casos an e io es. Dadas las especi i-
caciones R,SyT, la especi icación R S∧* T necesi a á el mecanismo de uel a
a ás mencionado an e io men e si exis e una cadena xque sea acep ada an-
o po la especi icación Scomo po T. Eso sí, en el caso de una especi icación
--- (S’ ---)∧* T, donde S′es la especi icación de un caso de p ueba, deja á de
supone un p oblema si dicha cadena xno apa ece nunca como caso de p ueba.
Es a uel a a ás complica eno memen e el p ocesamien o, y como e emos en
la sección 5.2, hemos decidido op a po implemen a un mecanismo al e na i o
pa a esol e el inde e minismo. Si enemos dos especi icaciones S1yS2,S1acep a
la cadena acía, y una cadena xes acep ada po ambas especi icaciones, a la ho a
de p ocesa la especi icación S1S2op a emos po desca a la especi icación S1y
p osegui con S2.
Es e mecanismo de p ocesamien o, no obs an e, iene a su ez el p oblema de
que algunas especi icaciones dejan de se aplicables a algunos iche os. Po ejemplo,
ol amos a conside a la siguien e especi icación:
54 CAPÍTULO 5. ANALIZADOR DE CASOS DE PRUEBA
--- (<in > ---)∧* <in >
Debido al mecanismo an e io , es a especi icación solo pod ía desc ibi iche os
con un único núme o en e o, el cual se i ía como in de iche o. Po an o, la
especi icación an e io equi ald ía a --- <in >.
Po o o lado, ol amos a conside a ambién la siguien e especi icación:
--- (<in > ---)∧* "0"
Es a especi icación se i ía pa a desc ibi cualquie iche o que consis a solo de
núme os en e os siemp e y cuando el 0 solo apa ezca al inal. En cambio, pa a un
iche o cuyo con enido sea 12 0 3 1 0, el p ime 0 se a a como in de iche o y
se igno an el es o de en e os, lo cual no ocu i ía si hubié amos implemen ado la
uel a a ás.
5.1.4. API de comp obación de la alidez de una especi ica-
ción: yToPa seG amma ()
Pa a comp oba la alidez de una especi icación dada po un p o eso , nues a
biblio eca dispone de la unción yToPa seG amma () ( e igu a 5.5), la cual
ecibe una especi icación y de uel e no solo si es álida de acue do a la g amá ica
de la igu a 5.4, sino ambién qué e o es hay en caso de que no lo sea.
1 unc ion yToPa seG amma (spec) {
2 y {
3pa seSpeci ica ion ( spec);
4 e u n { alid : ue, e o Message: unde ined };
5}ca ch ( e o ) {
6 e u n { alid : alse, e o Message : e o . message };
7}
8}
Figu a 5.5: yToPa seG amma (): Función pa a comp oba la alidez de una
especi icación
5.2. Sepa ación de los casos de p ueba
En es a sección se explica cómo unciona la sepa ación de casos de p ue-
ba a al o ni el. Nos cen a emos p ime o en la implemen ación de la unción
sepa a eCases(), que se enca ga de i sepa ando los casos de p ueba de en-
ada y de salida. Pos e io men e, e emos un ipo abs ac o de da os llamado
TokenS eam que hemos c eado pa a el a amien o de los okens de un iche o,
y inalmen e desc ibi emos unas eglas usadas pa a p ocesa la sepa ación de casos.
No explica emos la unción sepa a eInpu Cases(), pues unciona igual que
sepa a eCases(), pe o sepa ando solo los casos de p ueba de en ada.
5.2. SEPARACIÓN DE LOS CASOS DE PRUEBA 55
5.2.1. Implemen ación de sepa a eCases()
En es a sección p esen a emos dos unciones:
sepa a eCases(), que es la API que usa el se ido pa a sepa a los casos
de p ueba de en ada y de salida de sus espec i os iche os.
_sepa a eCases(), que iene la implemen ación eal de la sepa ación de los
casos de p ueba y es llamada in e namen e po sepa a eCases().
5.2.1.1. API de sepa ación de casos: sepa a eCases()
Pa a empeza , los pa áme os de en ada de la unción sepa a eCases() son:
inpu Filename: El nomb e del iche o con los casos de p ueba de en ada.
inpu Spec: La especi icación que desc ibe cómo sepa a los casos de p ueba
de en ada.
ou pu Filename: El nomb e del iche o con los casos de p ueba de salida.
ou pu Spec: La especi icación que desc ibe cómo sepa a los casos de p ueba
de salida.
sepa a o : Una cadena de ca ac e es que se aya a usa pa a sepa a los
casos de p ueba. Es un a gumen o opcional, po lo que si no se especi ica se
usa po de ec o la cadena ‘<==========>’.
A con inuación explicamos el código en sí de sepa a eCases() ( e igu a 5.6).
En p ime luga , al a a se de una API, se comp ueba que odos los a gumen os
an e io men e desc i os sean álidos, y que en el caso de no elegi un sepa ado
pa a los casos de p ueba se use el sepa ado po de ec o.
Después, en la unción auxilia c ea eCasesFile(), que es llamada an o pa a
la en ada como pa a la salida, c eamos una ca pe a nue a donde se gua da án
los iche os con los casos de p ueba sepa ados, e i icamos la especi icación y cons-
uimos un TokenS eam pa a okeniza o sepa a en okens el con enido de un
iche o ( e sección 5.2.2 pa a más in o mación).
Si no ha ocu ido ningún e o du an e la llamada a c ea eCasesFile() (po
una especi icación in álida, po ejemplo), se c ea un dicciona io pa a gua da el
es ado de las a iables de inidas en las especi icaciones. A es e dicciona io nos
e e i emos de aho a en adelan e como es ado. En in o má ica un dicciona io es
una colección de pa es (cla e, alo ) cuyas cla es no se epi en. La cla e puede se
de cualquie ipo de da os. En nues o caso, es de ipo ‘s ing’ po que co esponde
al nomb e de una a iable. Po o o lado, los en e os y li e ales son los únicos ipos
de da os sopo ados en nues o dicciona io. La necesidad de ene un dicciona io es
debido a que se pueden e e encia a iables en las especi icaciones, y un dicciona io
es una mane a muy e ec i a de gua da y consul a pos e io men e su alo .
Po úl imo, as habe ealizado la sepa ación de casos, se comp ueba si ha
habido algún e o en el p oceso en la unción checkFo E o s(). Finalmen e, se
56 CAPÍTULO 5. ANALIZADOR DE CASOS DE PRUEBA
de uel e la u a de los iche os de en ada y salida sepa ados jun o con el sepa ado
usado.
1async unc ion sepa a eCases ( inpu Filename , inpu Spec ,
ou pu Filename , ou pu Spec , sepa a o = unde ined ) {
2checkInpu s ( inpu Filename , inpu Spec , ou pu Filename , ou pu Spec
, sepa a o );
3
4i (! sepa a o ) {
5cons con ig = awai ge Con igu a ion ();
6sepa a o = con ig . de aul _sepa a o ;
7}
8
9cons inpu = awai c ea eCasesFile ( inpu Filename , inpu Spec ,
sepa a o );
10 cons ou pu = awai c ea eCasesFile ( ou pu Filename , ou pu Spec ,
sepa a o );
11 le cu en S a e = new Map ();
12
13 // Sepa amos los casos
14 _sepa a eCases ( inpu , ou pu , cu en S a e );
15 checkFo E o s ( inpu , ou pu , cu en S a e );
16
17 e u n {
18 inpu Sepa a edCasesFilename : inpu . sepa a edCasesFilename ,
19 ou pu Sepa a edCasesFilename : ou pu . sepa a edCasesFilename ,
20 sepa a o
21 };
22 }
Figu a 5.6: Implemen ación de la unción sepa a eCases()
5.2.1.2. Función auxilia : _sepa a eCases()
En es a unción ( éase el código en la igu a 5.7), el TokenS eam jun o con las
especi icaciones se i án consumiendo basándose en unas eglas de p ocesamien-
o en la unción s ep(). Es as eglas son desc i as más adelan e en la sección 5.2.3,
pe o, a modo de in oducción, debemos menciona que dichas eglas con olan no
solo cómo se deben consumi una especi icación y el TokenS eam al que desc ibe,
sino ambién la inse ción de sepa ado es.
Así pues, comenzamos con el g ueso de la sepa ación de los casos de p ueba,
que se a a de un bucle que e mina cuando an o la especi icación de en ada
como la de salida se consuman o si ha ocu ido un e o inespe ado. Mien as no se
cumplan las condiciones p e ias, p ocesamos p ime o la en ada paso a paso con
llamadas a s ep() has a que:
Se encuen e un sepa ado . Es o indica el in del caso de p ueba ac ual y el
comienzo del siguien e.
5.2. SEPARACIÓN DE LOS CASOS DE PRUEBA 57
Se encuen e que la especi icación no es álida y, po an o, no se puede
aplica al iche o de en ada ep esen ado po su espec i o TokenS eam.
Se consuma comple amen e la especi icación, es deci , se quede acía.
Después p ocesa íamos la salida has a que se die a cualquie a de las condiciones
an e io es. Es deci , has a que no se e mina de sepa a el p ime caso de p ueba
de salida, no se comienza con el segundo caso de p ueba de en ada, y lo mismo
ocu e con los siguien es casos de p ueba. Las llamadas a s ep() se enca gan de:
De ol e el nue o es ado de las a iables en caso de se modi icado.
De ol e la especi icación ac ualizada as aplica le las eglas de p ocesa-
mien o.
Ac ualiza el TokenS eam, consumiendo okens según indiquen las eglas de
p ocesamien o.
De ol e si sigue siendo álido aplica la especi icación al TokenS eam.
Y, inalmen e, de ol e si se ha encon ado el sepa ado que indica el inal
del caso ac ual.
Después de p ocesa la en ada, el nue o es ado ac ual σes usado pa a p ocesa
la salida. No obs an e, es e segundo p ocesamien o c ea un nue o es ado σ′que
hemos decidido igno a y, po an o, pa a el siguien e caso de en ada usamos el
es ado σ. Es e de alle es undamen al pa a el uso de a iables comunes en e la
especi icación de en ada y la de salida. Implica que cualquie a iable de inida
en la especi icación de en ada puede usa se an o en la especi icación de en ada
como en la de salida, pe o las a iables de inidas en la especi icación de salida solo
pueden usa se en dicha especi icación.
Po ejemplo, eamos la siguien e especi icación de en ada:
<n:in > --- (<s ing> <in > ---)∧n
En es a especi icación hemos de inido una a iable npa a de ini el núme o de
casos de p ueba de en ada. Podemos ol e a u iliza la en una especi icación de
salida como la siguien e:
--- (<in > ---)∧n
Nó ese que en es a especi icación no hemos de inido la a iable nen ningún si io.
De hecho, podemos in en a ede ini una a iable en la especi icación de salida
p e iamen e de inida en la de en ada, pe o es o o igina á un compo amien o a
p ime a is a inespe ado. Lo que ocu i á es que cualquie ede inición de dicha
a iable solo a ec a á al caso de p ueba ac ual, y ue a de es e ol e á a ene
el alo an e io . De hecho, a con inuación se mues an a ias especi icaciones de
salida que in en an ede ini ny a qué especi icación equi ale cada una eniendo
en cuen a el compo amien o que hemos desc i o an e io men e:
64 CAPÍTULO 5. ANALIZADOR DE CASOS DE PRUEBA
7. Si la especi icación es una disyunción S1∥S2, no podemos da un paso de
p ocesamien o solo con S1(es deci , S1,In, σ −→) y se puede da un pa-
so de p ocesamien o S2,In, σ −→ S′
2,In′, σ′, desca amos S1y seguimos el
p ocesamien o con S′
2,In′yσ′.
S2,In, σ −→ S′
2,In′, σ′S1,In, σ −→
S1∥S2,In, σ −→ S′
2,In′, σ′
8. Si la especi icación es una secuencia S1S2, la especi icación S1no acep a la
cadena acía y se puede da el paso de p ocesamien o S1,In, σ −→ S′
1,In′, σ′,
en onces seguimos el p ocesamien o con S′
1S2,In′yσ′.
¬nilP(S1, σ)S1,In, σ −→ S′
1,In′, σ′
S1S2,In, σ −→ S′
1S2,In′, σ′
9. Si la especi icación es una secuencia S1S2, la especi icación S1acep a la ca-
dena acía y se puede da el paso de p ocesamien o S2,In, σ −→ S′
2,In′, σ′,
en onces desca amos la especi icación S1y seguimos el p ocesamien o con
S′
2,In′yσ′. Puede ocu i que se hubie a podido da el paso de p ocesamien-
o S1,In, σ −→ S′
1,In′′, σ′′, y que po no habe lo hecho la especi icación S1S2
deje de se aplicable a In as habe dado a ios pasos con la especi icación
S′
2. No obs an e, es o complica ía sus ancialmen e el p ocesamien o, po lo
que hemos decidido man ene es a limi ación. Véase la sección 5.1.3.4 pa a
e ejemplos de es e ipo de especi icaciones.
nilP(S1, σ)S2,In, σ −→ S′
2,In′, σ′
S1S2,In, σ −→ S′
2,In′, σ′
10. Si la especi icación es una secuencia S1S2, la especi icación S1acep a la ca-
dena acía, y no se puede da el paso de p ocesamien o solo con S2(es deci ,
S2,In, σ −→), pe o sí se puede da el paso S1,In, σ −→ S′
1,In′, σ′, en onces
seguimos el p ocesamien o con S′
1S2,In′yσ′.
nilP(S1, σ)S1,In, σ −→ S′
1,In′, σ′S2,In, σ −→
S1S2,In, σ −→ S′
1S2,In′, σ′
11. Si la especi icación es S∧∗(es deci , la especi icación Sapa ece ce o o más e-
ces seguidas), p obamos si se puede da el paso de p ocesamien o SS∧∗,In, σ −→
S′,In′, σ′. Si es así, en onces seguimos el p ocesamien o con S′,In′yσ′. Usa-
mos la especi icación SS∧∗po que así comp obamos si se puede aplica S
al TokenS eam In, y es e p oceso se epe i á odas las eces que podamos
segui aplicando S.
SS∧∗,In, σ −→ S′,In′, σ′
S∧∗,In, σ −→ S′,In′, σ′
5.3. VERIFICACIÓN DEL CORRECTO FUNCIONAMIENTO DEL ANALIZADOR65
12. Si la especi icación es S∧exp, el alo de exp dado el es ado σes nynes es-
ic amen e mayo que 0, p obamos si se puede da el paso de p ocesamien o
SS∧(n−1),In, σ −→ S′,In′, σ′. Si es así, en onces seguimos el p ocesamien o
con S′,In′yσ′. Usamos la especi icación SS∧(n−1) po que así comp obamos
si se puede aplica una ez Sal TokenS eam In y es e p oceso se epe i á
o as n−1 eces, cuando engamos la especi icación S∧0( e siguien e egla).
n=e alua e(exp, σ)n > 0SS∧(n−1),In, σ −→ S′,In′, σ′
S∧exp, In, σ −→ S′,In′, σ′
13. Si la especi icación es S∧exp y el alo de exp dado el es ado σes 0, se
consume la especi icación sin al e a ni el TokenS eam In ni el es ado σ.
e alua e(exp, σ)=0
S∧exp, In, σ −→ ε, In, σ
14. Si la especi icación es --- (un sepa ado ), en onces consumimos la especi-
icación y esc ibimos un sepa ado en el TokenS eam In′. No al e amos el
es ado σ.
In′=w i eSepa a o (In)
–––,In, σ −→ ε, In′, σ
5.3. Ve i icación del co ec o uncionamien o del
analizado
Po úl imo, as la implemen ación de la sepa ación de casos y del lenguaje
de especi icaciones gene ado, decidimos inclui la biblio eca Jes [9] pa a gene a
conjun os de es s. De es a o ma podemos asegu a que ambas uncionalidades
se ejecu an sin e o es. En la igu a 5.8 podemos obse a que enemos 11 sui es
incluyendo un o al de 129 es s que se han pasado con éxi o. La mayo pa e de
es as p uebas se cen an en el p ocesamien o de okens, más en conc e o, en la clase
TokenS eam, debido a su complejidad. En meno medida, se han comp obado
an o las eglas u ilizadas pa a el p ocesamien o de los iche os como la g amá ica
u ilizada pa a especi ica los.
66 CAPÍTULO 5. ANALIZADOR DE CASOS DE PRUEBA
Figu a 5.8: Resul ado de ejecu a los es s del analizado de casos de p ueba
Capí ulo 6
Se ido p incipal: on end y
backend
En es e capí ulo p esen a emos el uncionamien o del on end. Explica emos
una a una odas las páginas de las que se compone la aplicación y cómo se usan,
sepa ándolas en páginas del adminis ado y páginas del usua io. Ve emos que
algunas de las is as son comunes pa a ambos, eliminando cie as es icciones
pa a los adminis ado es. Al inal de la sección explica emos el on end, donde se
explica án algunos aspec os del código que puedan se de in e és.
También e emos de enidamen e la pa e del backend. Explica emos cómo
es á desa ollado, los algo i mos u ilizados, las llamadas a la API de DOMjudge,
cómo se ans o man y se a an los da os de las di e en es llamadas y cómo se es á
haciendo el sc aping necesa io. De la misma mane a, ambién se explica á nues a
API a la que se accede desde el on end y los equisi os o pe misos necesa ios
pa a la ob ención de los di e en es da os.
La explicación de las di e en es páginas jun o con su código se á de una mane a
p og esi a y con inua, es deci , i emos siguiendo los di e en es pasos que un usua io
debe ía i haciendo desde el p ime momen o en que accede a la aplicación has a
que se desconec a de ella.
6.1. F on end
Como ya explicamos en la sección 4.2), el on end es la pa e isual de DOM-
eed con la que el usua io in e ac úa. Se compone de dos pa es: la pa e del
adminis ado , o ien ada a la ges ión y con ol, y la pa e del usua io, o ien ada a
la consul a de las en egas de los p oblemas con esul ado e óneo.
Como se explicó an e io men e, el on end es á p og amado con Reac como
amewo k de Ja aSc ip , Reac -Boo s ap pa a encapsula Boo s ap en compo-
nen es na i os de Reac pa a op imiza y simpli ica el código, y pos e io men e
biblio ecas como Axios pa a hace las co espondien es llamadas a la API de DOM-
eed.
67
68 CAPÍTULO 6. SERVIDOR PRINCIPAL: FRONTEND YBACKEND
6.1.1. Inicio de sesión
La página del inicio de sesión es la p ime a que apa ece á al accede a DOM eed,
a no se que haya iniciado sesión p e iamen e en la aplicación. Es una página común
an o pa a el adminis ado como pa a el usua io, y cuya única unción es pe mi i
que un usua io pueda accede DOM eed.
La página es á compues a de un o mula io sencillo con dos campos: el p ime o
pa a in oduci un usua io y el segundo una con aseña. Se puede obse a que
no exis e ninguna opción de egis o, pues odo usua io que iene una cuen a
en DOMjudge, ambién la iene en DOM eed au omá icamen e. Es el p o eso
co espondien e quién debe da de al a al usua io en DOMjudge. Si ocu e algún
e o ealizando el inicio de sesión, apa ece á una no i icación con el mensaje de
e o co espondien e. En la igu a 6.1 se mues a un ejemplo. La pa e de la
izquie da ep esen a la página de inicio de sesión y la pa e de echa se mues a el
mensaje de e o al in oduci inco ec amen e las c edenciales.
Figu a 6.1: Página de inicio de sesión
6.1.2. Cabece a
Al inicia la sesión, el usua io accede á a la página p incipal. Pa a los usua ios
adminis ado es se á la página de p oblemas ( e sección 6.1.3.1), mien as que
pa a el es o de usua ios se á la página de en egas (sección 6.1.3.3), y es a á
seleccionado el p ime concu so al que pe enezca el usua io.
De es a mane a, el usua io pod á accede a la cabece a de la aplicación, la
cual es común a odos los usua ios y a odas las páginas. Median e la cabece a, el
usua io pod á ealiza 3 acciones:
I a la página p incipal, la cual depende del ipo de usua io, como se ha
explicado an e io men e.
Ce a la sesión, y ol e a la página de inicio de sesión (sección 6.1.1).
6.1. FRONTEND 69
Selecciona un concu so, pa a así pode accede a oda su in o mación
ele an e (p oblemas, en egas, co ecciones). Toda esa in o mación a ligada
al concu so en el que se encuen e el usua io. Un mismo p oblema puede
es a en a ios concu sos, y un mismo equipo puede es a ambién en a ios
concu sos, po lo que pa a un mismo p oblema se an a mos a en egas
di e en es pa a un mismo equipo, dependiendo del concu so p e iamen e
seleccionado.
Pa a i a la página p incipal se dispone de un bo ón Home a la izquie da del
odo, pa a ce a la sesión se dispone de o o bo ón más a la de echa con el ex o
Ce a sesión, y inalmen e, pa a selecciona el concu so, a la de echa del odo
exis e un menú desplegable que con iene odos los concu sos donde el usua io que
ha iniciado sesión iene pe misos pa a accede .
Pa a selecciona un concu so simplemen e hay que desplega el con ol de los
concu sos y hace clic sob e el concu so deseado. En la igu a 6.2 se mues a una
cap u a de la cabece a de DOM eed.
Figu a 6.2: Cabece a con el concu so demo seleccionado
6.1.3. Páginas del adminis ado
Las di e en es páginas del adminis ado es án o ien adas a la ges ión de DOM-
eed. Desde ellas, el adminis ado pod á con igu a los p oblemas, añadiendo las
especi icaciones co espondien es y el núme o de co ecciones de la solución que el
usua io end á disponibles pa a dicho p oblema. El adminis ado ambién pod á
e odas las en egas de odos los g upos pe enecien es al concu so p e iamen e
seleccionado, así como sus co ecciones o casos allidos.
6.1.3.1. Vis a de p oblemas
Es a página es exclusi a de los adminis ado es y se accede a ella as seleccio-
na el concu so deseado en el desplegable des inado a ello. T as elegi el concu so se
mos a án odos los p oblemas co espondien es. Es una página an o in o ma i a
como de ges ión, pues es el luga donde el adminis ado especi ica el núme o de
co ecciones máximas pa a un p oblema y donde ambién se accede a la página de
especi icación.
La página es á compues a de una abla donde se mues an odos los p oblemas
ela i os al concu so seleccionado. Es a abla con iene una b e e in o mación de
cada p oblema que explicamos a con inuación:
id, es el iden i icado del p oblema. Es único pa a cada p oblema. Se c ea
au omá icamen e en DOMjudge al egis a se un p oblema nue o.
70 CAPÍTULO 6. SERVIDOR PRINCIPAL: FRONTEND YBACKEND
P oblema, co esponde al nomb e del p oblema. Suele se un nomb e des-
c ip i o que indique la emá ica del p oblema.
Abb , una ab e iación pa a el nomb e del p oblema.
Especi icación, al hace clic en la celda co espondien e al p oblema, se
accede á a la página de de inición de las especi icaciones. Se explica de eni-
damen e en la siguien e sección (6.1.3.2).
Núme o de co ecciones, co esponde al núme o de co ecciones disponi-
bles que iene el usua io o equipo pa a dicho p oblema.
Apa e de la abla de los p oblemas, en la pa e supe io de la página se puede
e o o campo con el ex o Núme o de co ecciones disponibles pa a es e concu so,
que indica el núme o de co ecciones máximas que un usua io o equipo iene pa a
ese concu so. Como ya se ha comen ado en la sección 4.2.3, es e lími e si e pa a
impedi que el usua io solici e in ini as co ecciones.
Como ya se ha mencionado an e io men e, en es a página el adminis ado pue-
de modi ica el núme o máximo de co ecciones disponibles que end á un usua io
pa a cie o p oblema o concu so. Pa a ello, el adminis ado iene que hace clic
sob e el icono co espondien e, en o ma de lápiz, jun o al núme o de co eccio-
nes de dicho p oblema. De es a o ma, se habili a á la edición en la celda de las
co ecciones del p oblema en cues ión. Cuando el adminis ado desee gua da el
alo nue o, debe hace clic al icono de check que ha apa ecido donde an es es aba
el lápiz de edición. Si desea cancela la edición del campo, simplemen e end á
que hace clic sob e el icono de c uz ubicado a la izquie da del check. De mane a
análoga, pa a edi a el núme o máximo de co ecciones en el concu so, hay que
hace clic en el icono si uado a la de echa del alo ac ual.
En el caso que un p oblema o concu so no enga lími e de co ecciones pa a
el usua io, apa ece á indicado con el símbolo del in ini o como alo ac ual. Pa a
indica que un p oblema o concu so no iene lími e de co ecciones, simplemen e
hay que deja el campo acío a la ho a de edi a .
También se puede accede a la página de las especi icaciones que se explica en la
sección 6.1.3.2 pa a c ea la especi icación del p oblema seleccionado. La o ma de
accede es median e el icono co espondien e si uado en la columna ‘especi icación’
de la abla de los p oblemas.
También al hace clic en una ila de la abla de los p oblemas, el p o eso
puede accede a una nue a página donde se mos a án odas las en egas que han
ealizado odos los g upos del concu so. Es a nue a página se explica en de alle en
la sección 6.1.3.3.
Además, al hace una edición, ya sea del núme o de co ecciones de un p oble-
ma o del núme o de co ecciones pa a el concu so, se mos a á una no i icación
indicando si dicha ope ación ha enido éxi o o si, de lo con a io, ha ocu ido algún
e o . Todas es as uncionalidades se pueden e e lejadas en la igu a 6.3.
6.1. FRONTEND 71
Figu a 6.3: Página de p oblemas
6.1.3.2. Vis a de especi icaciones
Pa a cada p oblema exis e una página de especi icaciones, cuya unción es aña-
di las dos especi icaciones de los casos de p ueba, una pa a el iche o de en ada
y o a pa a el iche o de salida. Es as especi icaciones son necesa ias pa a pode
sepa a los casos de p ueba y así pode ob ene una co ección pa a las en egas
de ese mismo p oblema.
Al esc ibi una especi icación, es a se analiza con inuamen e, ob eniéndose así
una salida en iempo eal de la compilación de la especi icación in oducida.
En el caso de que la especi icación in oducida sea inco ec a, la compilación
mues a si exis e un e o en la sin axis de la especi icación in oducida o si, en su
de ec o, la sin axis es co ec a, pe o ocu ió un e o a la ho a de usa la especi i-
cación pa a gene a el iche o de salida as di idi los casos de p ueba.
Po o a pa e, en el caso de que la especi icación in oducida sea co ec a,
se mos a á un ejemplo de cómo queda un iche o de en ada o salida sepa ado
u ilizando la especi icación in oducida.
Es a página dispone de 4 componen es p incipales: dos campos de ex o edi a-
bles pa a esc ibi las especi icaciones de los p oblemas y dos campos de ex o no
edi ables donde se mues a la salida de la compilación de los mismos.
Cada ez que se edi a una de las especi icaciones se mues a el esul ado de la
compilación de dicha especi icación en el campo de ex o co espondien e a dicha
especi icación. Es e campo se colo ea á de e de o de ojo en unción de si la
especi icación in oducida es co ec a o no. Es o se puede e cla amen e en la
igu a 6.4.
Además, al inal de la página se dispone de dos bo ones:
Uno pa a ol e a la página de p oblemas.
72 CAPÍTULO 6. SERVIDOR PRINCIPAL: FRONTEND YBACKEND
O o pa a gua da y aplica la especi icación, el cual solo end á e ec o
si ambas especi icaciones son co ec as.
Finalmen e, al gua da las especi icaciones, apa ece á en la pa e supe io de
la página una no i icación que indica si la ope ación se ha ealizado con éxi o.
Figu a 6.4: Página de especi icaciones
6.1.3.3. Vis a de en egas
En es a página el adminis ado puede isualiza las en egas que han ealizado
odos los g upos pa a un p oblema y concu so conc e o. Es una is a me amen e
in o ma i a donde la única in e acción que exis e en la página es hace clic en una
en ega pa a accede a la siguien e página de co ecciones.
La página cons a de una abla cen al, simila a la abla de los p oblemas,
que con iene odas las en egas de odos los g upos o usua ios pa a el p oblema
seleccionado. La in o mación de la abla es la siguien e:
id, iden i icado de la en ega. Es único pa a cada en ega. Se c ea au omá-
icamen e en DOMjudge en el momen o que un usua io ealiza una en ega
a un p oblema.
Ho a, mues a a qué ho a el usua io ha ealizado la en ega del p oblema
en DOMjudge.
P oblema, co esponde al nomb e del p oblema.
Equipo, indica qué equipo ha ealizado la en ega. Un equipo puede ene
muchos usua ios.
Lenguaje, en qué lenguaje de p og amación se ha p og amado el código.
6.1. FRONTEND 73
Resul ado, mues a el es ado de e o esul ado de ejecu a el p oblema en
DOMjudge con los casos de p ueba co espondien es.
En es e p oyec o, solo es amos con emplando las en egas que DOMjudge haya
alo ado con WRONG-ANSWER. El es o de alo aciones se es án igno ando, pues
no en an den o del alcance de DOM eed, ya que en esos casos no se pod á gene a
una e oalimen ación de allada del caso de p ueba que ha allado. Es o signi ica
que solamen e se es á mos ando las en egas donde la salida de DOMjudge sea
WA, es deci , WRONG-ANSWER. En la igu a 6.5 podemos e un ejemplo.
La o ma en la que se accede a la co ección de la en ega es la que explicamos
a con inuación. El adminis ado debe hace clic sob e la ila de la abla co es-
pondien e a la en ega que desee e . Au omá icamen e se mos a á la siguien e
página, que explicamos en la sección 6.1.5
Figu a 6.5: Página de en egas pa a adminis ado es
6.1.4. Páginas del usua io
Las páginas del usua io es án des inadas a mos a in o mación sob e las en-
egas ealizadas con esul ado WRONG-ANSWER. Es po ello que el usua io no
iene acceso a la página de p oblemas como iene el adminis ado , ya que es a es
una página dedicada a la ges ión. Las únicas uncionalidades que iene el usua io
en DOM eed es e el lis ado de en egas ealizado y solici a las co ecciones sob e
dichas en egas, siemp e que se puedan solici a .
6.1.4.1. Vis a de en egas
La is a de en egas del usua io es p ác icamen e igual a la explicada an e-
io men e en la sección del adminis ado . Las di e encias que encon amos son
desc ip i as, al y como explicamos a con inuación.
La página es á compues a de una abla cen al donde se mues an odas las
en egas que ha ealizado el alumno o g upo pa a cualquie p oblema. Es o ya es
80 CAPÍTULO 6. SERVIDOR PRINCIPAL: FRONTEND YBACKEND
1impo Con aine om ’ eac - boo s ap / Con aine ’
2impo Vis aP o egida om ’@/ componen s / Vis aP o egida ’
3
4expo de aul unc ion Layou () {
5
6 e u n (
7<Vis aP o egida >
8<Con aine luid>
9...
10 </ Con aine >
11 </ Vis aP o egida >
12 )
13 }
Figu a 6.12: Componen e Layou gene al
1impo { Na iga e , useLoca ion } om ’ eac - ou e - dom ’
2impo { useAu h } om ’@/ hooks / useAu h ’
3
4cons Vis aP o egida = ({ child en }) => {
5cons au h = useAu h ()
6cons loca ion = useLoca ion ()
7cons milliseconds = new Da e () . ge Time ()
8
9// Si el usua io no ha iniciado sesion o si es a ha caducado
10 i (! au h . use || au h .use . has a < milliseconds ) {
11 e u n <Na iga e o=’/ login ’ s a e ={{ om: loca ion }} />
12 }
13
14 e u n child en
15 }
16
17 expo de aul Vis aP o egida
Figu a 6.13: Componen e is a p o egida
el usua io inicie sesión co ec amen e, se le ol e á de edi igi au omá icamen e
a la página a la que que ía accede inicialmen e.
Pa a implemen a páginas de acceso es ingido, hemos c eado el componen-
e Vis aP o egida. Es e componen e en uel e odas las u as de la aplicación,
ealizando una comp obación de au en icación cada ez que un usua io cambia de
u a en DOM eed. Pa a ello, el componen e Vis aP o egida hace uso del hook
useAu h que hemos explicado en la sección an e io . El componen e es muy senci-
llo, simplemen e ecupe a el obje o au h del con ex o de la aplicación median e el
hook useAu h. Ese obje o con iene los da os e e en es al usua io que ha iniciado
sesión. En el caso de que no exis a el obje o del usua io o si el iempo que el usua io
lle a logueado ha excedido el iempo máximo pe mi ido, en onces se le edi ige a
la is a de inicio de sesión. Se puede e el código e e en e a es e apa ado en las
igu as 6.12 y 6.13.
6.1. FRONTEND 81
1<Rou e pa h=’/ p oblems ’ elemen ={< Layou />}>
2<Rou e index elemen ={< P oblems />} />
3<Rou e pa h=’: con es Id / ’ elemen ={ < P oblems / >} />
4...
5</Rou e>
Figu a 6.14: Ejemplo de en u ado
6.1.6.3. No i icaciones
En DOM eed hay algunas páginas en las cuales se mues an no i icaciones as
ealiza una acción. Son algunas de las pan allas de ges ión del adminis ado :
pan alla de p oblemas y pan alla de especi icaciones. Con la idea de que las no-
i icaciones sean un componen e gene al y único pa a oda la aplicación con el
obje i o de que el código no se epi a en cada pan alla donde se necesi e una
no i icación, hemos c eado un hook pa a mos a las no i icaciones de una o ma
sencilla en odas las páginas en las que se necesi e.
La o ma que decidimos pa a ealiza los componen es de no i icación es c ea
un con ex o a ni el de en u ado. En la igu a 6.14 podemos e una pa e del
en u ado de DOM eed. Como se puede obse a , exis e una u a pad e /p oblems
que ende iza del componen e <Layou />. Den o de dicha u a enemos las u as
hijas, que se ían, po ejemplo de la siguien e o ma /p oblems/:con es Id/ donde
con es Id co esponde a un núme o en e o posi i o. Es a u a conc e a ende iza
el componen e <P oblems/>.
El en u ado desc i o unciona de la siguien e mane a. Cuando un usua io accede
a la u a /p oblems/3 pa a con inua con el ejemplo, se ende iza el componen e
<Layou />. Dicho componen e ende iza a su ez o o componen e que se llama
<Ou le />. En esencia el componen e <Ou le /> se ía sus i uido po el compo-
nen e que ende ice la u a hija del pad e, en es e caso <P oblems/>.
El componen e <Ou le /> acep a un pa áme o con ex el cual se u iliza pa a
c ea un con ex o a ni el de Ou le al y como habíamos mencionado an e io men e.
La c eación de un con ex o es lo que pe mi e, al y como imos en la sección
an e io , pode u iliza un obje o en cualquie a de los componen es hijos. En es e
caso, al se un con ex o que p opo ciona el p opio componen e <Ou le /> no hay
que c ea lo manualmen e como hicimos con el con ex o del usua io ( e sección
6.1.6.1). Simplemen e se debe pasa el obje o a compa i como alo del pa áme o
con ex en el componen e <Ou le /> y pos e io men e u iliza lo en el componen e
que ende ice Ou le independien emen e de cual sea. En la igu a 6.15 se mues a
un ejemplo de uso, donde se c ea un es ado que si e mos a las no i icaciones de
la aplicación. A noso os lo que nos in e esa es que se pueda modi ica el alo a
mos a en la no i icación en cualquie componen e que se ende ice. Es po eso
que pasamos el mé odo se No i ica ion como alo con con ex o.
La o ma de u iliza las no i icaciones en un componen e que las necesi e se ía
la mos ada en la igu a 6.16. Pa a ello es necesa io impo a el cus om hook
useNo i ica ion. El código de dicho hook es a mos ado en la igu a 6.17. Es
un hook muy simple, el cual de uel e el obje o useOu le Con ex que de uel e el
82 CAPÍTULO 6. SERVIDOR PRINCIPAL: FRONTEND YBACKEND
1impo { useS a e } om ’ eac ’
2impo Con aine om ’ eac - boo s ap / Con aine ’
3impo Heade om ’@/ componen s / heade / Heade ’
4impo No i icacion om ’@/ componen s / No i icacion ’
5impo {Ou le } om ’ eac - ou e - dom ’
6impo Vis aP o egida om ’@/ componen s / Vis aP o egida ’
7
8expo de aul unc ion Layou () {
9cons [ale ,se Ale ] = useS a e ({ ype : ’’, message: ’’ })
10
11 cons se No i ica ion = no i ica ion => {
12 se Ale (no i ica ion)
13 se Timeou (() => {
14 se Ale ({ ype: ’’, message: ’’ })
15 }, 3000)
16 }
17
18 e u n (
19 <Vis aP o egida >
20 <Con aine luid>
21 <Heade />
22 <No i icacion ale ={ ale } />
23 <Ou le con ex ={{ se No i ica ion }} />
24 </ Con aine >
25 </ Vis aP o egida >
26 )
27 }
Figu a 6.15: Con ex o de las no i icaciones
6.2. BACKEND 83
1
2
3expo de aul unc ion P oblem ({ con es Id , id , newValue }) {
4cons { se No i ica ion } = useNo i ica ion ()
5
6p oblemSe ices . se P oblemMaxA emp s ( con es Id , id , newValue )
7. hen (() => {
8se No i ica ion ({ ype: ’success’, message: ’Se ha
ac ualizado el nume o de co ecciones ’ })
9})
10 .ca ch ( e => {
11 console . e o ( e . esponse . da a )
12 se No i ica ion ({ ype: ’dange ’, message: ’No se ha
podido ac ualiza el nume o de co ecciones ’ })
13 })
14 }
15
16 e u n (
17 < ole=’bu on’ className = ’ able - ow ’ {... p ops }>
18 < d className =’ w - no mal ’ onClick ={() => onClick (id) }>{ id } </
d >
19 ...
20 </ >
21 )
22 }
Figu a 6.16: Ejemplo de uso de las no i icaciones
1impo { useOu le Con ex } om ’ eac - ou e - dom ’
2
3expo unc ion useNo i ica ion () {
4 e u n useOu le Con ex ()
5}
Figu a 6.17: Hook useNo i ica ion
con ex o del Ou le , en es e caso el mé odo se No i ica ion pa a pode edi a la
no i icación.
6.2. Backend
El se ido o backend es la pa e de DOM eed que se enca ga de p ocesa las
pe iciones y los da os ob enidos de DOMjudge, al y como explicamos an e io -
men e en la sección 4.3. En es a sección explica emos las pa es más impo an es
del backend y mos a emos ejemplos de cómo se han p og amado las pa es más
ele an es en caso que ue a necesa io. Además, explica emos odas las unciones
que o ece la API de DOM eed indicando los pa áme os que espe a y los da os
que de uel e al clien e. En caso de que ue a necesa io, se explica á cómo se ha
desa ollado el código pa a el cálculo de los da os solici ados. Es impo an e men-
84 CAPÍTULO 6. SERVIDOR PRINCIPAL: FRONTEND YBACKEND
ciona que odas las pe iciones a la API de DOMjudge se ealizan con un usua io
y con aseña adminis ado codi icado en base64 y pasado en la pe ición median e
la cabece a Au ho iza ion.
Reco demos que el se ido es á desa ollado en su o alidad en Node.js [12],
u ilizando Exp ess [7] pa a c ea la API necesa ia pa a la solici ud de da os al
se ido po pa e del on end, y mysql2 como biblio eca necesa ia pa a conec a
e in e ac ua con la base de da os.
6.2.1. Base de da os
Como ya se ha mencionado en apa ados an e io es, DOM eed iene una base de
da os p opia, donde se almacena la in o mación que no se puede ob ene median e
la API de DOMjudge, pe o es necesa ia pa a las uncionalidades de la aplicación.
Dado que la mayo pa e de la in o mación se encuen a en DOMjudge, la base
de da os po sí sola posee muy poca in o mación, y las elaciones en e las ablas
es án limi adas.
La in o mación almacenada es la siguien e:
El núme o de co ecciones disponibles pa a un concu so.
El núme o de co ecciones disponibles pa a un p oblema.
Las especi icaciones de los p oblemas.
Las en egas cuya e oalimen ación se ha solici ado.
6.2.1.1. Es uc u a de la base de da os
La base de da os es á compues a po cua o ablas, las cuales se explican de-
alladamen e a con inuación. En la igu a 6.18 se ep esen a un esquema de cómo
es án elacionadas las di e en es ablas.
enabled_submissions
En es a abla se almacenan odas aquellas en egas que han sido habili adas
po un usua io pa a se isualizadas median e el canje de una co ección. Todas
las en egas que se encuen an en es a abla se conside an habili adas y pod án
se isualizadas po el usua io que la haya canjeado. Po o a pa e, aquellas en-
egas que no se encuen en en es a abla solo pod án se isibles po usua ios
adminis ado es.
con es _id: Un núme o en e o que simboliza el iden i icado del concu so
al cual pe enece la en ega que se habili a. Es e alo se co esponde con el
iden i icado que iene el concu so en DOMjudge.
submission_id: Un núme o en e o que simboliza el iden i icado de la en-
ega que se habili a. Es e alo se co esponde con el iden i icado que iene
la en ega en DOMjudge.
6.2. BACKEND 85
Figu a 6.18: Esquema de la base de da os
p oblem_id: Un núme o en e o que simboliza el iden i icado del p oblema
al cual pe enece la en ega que se habili a. Es e alo se co esponde con el
iden i icado que iene el p oblema en DOMjudge. Además, iene una elación
con el campo p oblem_id de la abla p oblem_speci ica ions, dado que cada
p oblema habili ado debe es a asociado a una especi icación.
eam_id: Un núme o en e o que simboliza el iden i icado del equipo que
ha habili ado la en ega. Es e alo se co esponde con el iden i icado que
iene el equipo en DOMjudge.
da e: Fecha que indica el momen o en que se habili ó la en ega.
Es impo an e señala que solo con los campos p oblem_id ysubmission_id
ya se puede iden i ica la en ega, pe o se añade a la cla e el con es _id, dado que
un mismo p oblema puede es a p esen e en a ios concu sos, pe o una co ección
pod ía es a habili ada pa a únicamen e uno de ellos.
p oblem_speci ica ions
En es a abla se almacenan las especi icaciones de los p oblemas in oducidas
po los p o eso es median e los siguien es campos:
p oblem_id: Un núme o en e o que simboliza el iden i icado del p oblema
cuya especi icación se almacena. Es e alo se co esponde con el iden i icado
que iene el p oblema en DOMjudge.
inpu : Una cadena a iable de 500 ca ac e es que simboliza la especi icación
pa a los iche os de en ada co espondien es al p oblem_id
86 CAPÍTULO 6. SERVIDOR PRINCIPAL: FRONTEND YBACKEND
ou pu : Una cadena a iable de 500 ca ac e es que simboliza la especi ica-
ción pa a los iche os de salida co espondien es al p oblem_id
max_con es _a emp s
En es a abla se almacena el núme o de co ecciones disponibles pa a cada
concu so. Se conside a que cualquie concu so que no se encuen e en es a abla
no iene un núme o de inido de co ecciones, po lo que se conside a á que es e
núme o es in ini o.
con es _id: Un núme o en e o que simboliza el concu so. Es e alo se
co esponde con el iden i icado que iene el concu so en DOMjudge.
max_a emp s: Un núme o en e o que se co esponde con el núme o de
co ecciones asignado al concu so. Es e alo puede oma el alo NULL, en
caso de que el concu so enga una can idad in ini a de in en os.
max_p oblem_a emp s
En es a abla se almacena el núme o de co ecciones disponibles pa a cada
p oblema. Se conside a que cualquie p oblema que no se encuen e en es a abla
no iene un núme o de inido de co ecciones, po lo que se conside a á que es e
núme o es in ini o.
con es _id: Un núme o en e o que simboliza el concu so al que pe enece el
p oblema. Es e alo se co esponde con el iden i icado que iene el concu so
en DOMjudge.
p oblem_id: Un núme o en e o que simboliza el el p oblema. Es e alo se
co esponde con el iden i icado que iene el p oblema en DOMjudge.
max_a emp s: Un núme o en e o que se co esponde con el núme o de
co ecciones asignado al p oblema. Es e alo puede oma el alo NULL,
en caso de que el p oblema enga una can idad in ini a de in en os.
Al igual que con los iden i icado es de en egas, el campo p oblem_id ya es
su icien e pa a iden i ica a un p oblema, pe o se añade a la cla e el campo con-
es _id, debido a que un mismo p oblema puede es a p esen e en a ios concu sos,
y se puede llega a especi ica un núme o de in en os pa a un p oblema en unción
del concu so en el que se encuen e.
6.2.1.2. Acceso a la base de da os
Pa a el acceso a la base de da os se ha u ilizado la lib e ía mysql2 de No-
de.js. Median e es a lib e ía se c ea un pool de conexiones, el cual se enca ga de
suminis a conexiones a la base de da os pa a las pe iciones de los usua ios. En la
igu a 6.19 se mues a un ejemplo de c eación de un pool de conexiones u ilizando
la lib e ía an es mencionada.
6.2. BACKEND 87
1impo mysql om ’mysql2’
2
3cons pool = mysql . c ea ePool ({
4hos : ’localhos ’,
5use : ’ oo ’,
6passwo d: ’’,
7da abase: ’dom eed’
8})
9
10 cons p omisePool = pool . p omise ()
11
12 expo { p omisePool }
Figu a 6.19: C eación del pool de conexiones
Pa a hace las pe iciones a la base de da os se esc ibe una consul a SQL pa-
ame izada, donde cada uno de los pa áme os co espondien es se á analizado
in e namen e y pos e io men e sus i uido en el luga que co esponda pa a así sa-
nea y e i a a aques de inyección SQL. Cada una de las consul as a la base de
da os es á sepa ada en un mé odo indi idual que sigue el esquema mos ado en la
igu a 6.20.
1impo { p omisePool } om ’ ../../ u ils / db_connec ion . js ’
2
3cons se Con es MaxA emp s = ( con es Id , a emp s ) => {
4 e u n p omisePool . que y (‘
5INSERT INTO max_con es _a emp s ( con es _id , max_a emp s )
6VALUES ( ? , ? )
7ON DUPLICATE KEY UPDATE max_a emp s = ?‘, [ con es Id , a emp s
, a emp s ])
8}
Figu a 6.20: Ejemplo de consul a SQL u ilizando el pool de conexiones
6.2.2. API de DOM eed
Como ya mencionamos en la sección 4.3.2, DOM eed dispone de una API ea-
lizada median e la biblio eca Exp ess.js [7]. La API es la base de DOM eed pues
odas las pe iciones del usua io, an o pa a solici a da os como pa a modi ica los
se ealizan a a és de es a API. Todos los endpoin s de la API siguen la es uc u a
que podemos e en la igu a 6.21.
6.2.2.1. Midlewa es
Una pa e muy impo an e de las pe iciones al se ido son los middlewa es. Los
middlewa es son unciones in e medias que in e cep an las pe iciones del usua io
an es de llega a su endpoin des ino pa a ealiza algún abajo. Pos e io men e
88 CAPÍTULO 6. SERVIDOR PRINCIPAL: FRONTEND YBACKEND
1 ou e . pos (’/: con es Id / maxA emp s ’, exp ess . json () , ( eq , es ,
nex ) => {
2cons { con es Id } = eq . pa ams
3cons { maxA emp s } = eq . body
4
5con es Helpe . se MaxA emp s ( con es Id , maxA emp s )
6. hen (() => es . s a us (200) .end ())
7.ca ch ( e => nex (e ))
8})
Figu a 6.21: Es uc u a de los endpoin s de la API de DOM eed
pueden hace que la pe ición siga su cu so o de ol e una espues a al usua io.
Median e es as unciones se pueden modi ica los pa áme os de la pe ición, añadi
o bo a da os del cue po, e c.
En DOM eed es amos u ilizando un middlewa e que se ejecu a en cada una de
las solici udes del usua io pa a ex ae la in o mación de un oken de JWT que se
en ía en la cabece a de las pe iciones en el campo Au ho iza ion. Ese oken se
c ea y se en ía al on end en el momen o en el que inicia sesión un usua io. Una
ez ex aído el oken se gua da como obje o en el eques de la pe ición. El código
se puede e en la siguien e igu a 6.22.
1cons ex ac Token = ( eques , esponse , nex ) => {
2cons oken = eques . ge (’au ho iza ion ’)
3cons ex ac Token = ! oken || ! oken . oLowe Case () . s a sWi h ( ’
bea e ’) ? null : oken . subs ing (7)
4 eques . oken = ex ac Token
5
6nex ()
7}
Figu a 6.22: Middlewa e pa a ex ae el oken
El oken JWT con iene in o mación ace ca del usua io que ha ealizado la pe-
ición: los oles de los que o ma pa e, iden i icado , use name y expi ación del
oken. Al en ia se de uel a ese oken as cada llamada a la API de DOM eed, se
comp ueba que los pa áme os de la pe ición co espondan a los pe misos que iene
el usua io que ienen in oducidos en dicho oken. Imaginemos que un usua io soli-
ci a las en egas ealizadas pa a el concu so con iden i icado 5, pe o ese usua io en
la in o mación ecibida del oken dice que pe enece al concu so 3. En onces se p o-
duci á un e o de pe misos bloqueando la solici ud. Es a uncionalidad, es á ea-
lizada median e o o middlewa e llamado e i yTokenAndReques Pe missions
que se ejecu a en odas las pe iciones.
6.2.2.2. Ob ención de da os de DOMjudge
Pa a ob ene los da os de DOMjudge se ha u ilizado la lib e ía Axios [1] la cual
nos ayuda a ealiza pe iciones a se ido es de una mane a sencilla.
6.2. BACKEND 89
Concu sos po equipos
La llamada a GET /api/ eam/: eamId/con es s si e pa a ob ene odos los
concu sos a los que pe enece un equipo. Sin emba go, la API de DOMjudge no
con empla es a pe ición, si no que, po el con a io, solamen e se pueden ob ene
los equipos a los que pe enece un concu so. Es po ello que a pa i de los da os
que ob enemos de DOMjudge, ob enemos los da os que necesi a DOM eed.
P oblemas po concu so
Median e la llamada GET /api/p oblems/:con es Id se ob ienen los p oble-
mas pe enecien es al concu so con es Id. En es e caso, la API de DOMjudge sí
que dispone de un endpoin especí ico, po lo que no hay que hace a amien o
especial pa a de ol e dichos da os.
En egas po equipos
Al in oca al endpoin GET /api/submissions/:con es Id/: eamId de DOM-
eed, se ob ienen las en egas que ha ealizado el equipo con iden i icado eamId
pa a el concu so con es Id jun o con el esul ado ob enido po DOMjudge. Ob e-
ne es os alo es de DOMjudge no es i ial pues no exis e una llamada que los
p opo cione di ec amen e. Pa a ob ene los hemos enido que hace uso de a ias
llamadas a la API de DOMjudge. P ime o debemos ealiza una llamada pa a ob-
ene odos las en egas pa a el concu so con iden i icado con es Id. DOMjudge
no p opo ciona las en egas il adas po equipos, po lo que hemos enido que
hace lo noso os una ez ecibimos los da os. Además, se ha enido que hace pa a
cada en ega ya il ada o a llamada a DOMjudge pa a ob ene el esul ado de su
ejecución. Apa e, se de uel e ambién si esa en ega ya ha sido solici ada po el
equipo, po lo que hay que hace o a llamada a nues a base de da os.
En egas po p oblemas
La llamada GET /api/submissions/:con es Id/p oblem/:p oblemId de uel-
e las en egas pe enecien es al p oblema con iden i icado p oblemId pa a el
concu so con es Id. Los p oblemas y soluciones p esen adas en el cálculo de es e
endpoin son los mismos que los explicados en el caso an e io . El código ambién
es p ác icamen e idén ico.
6.2.2.3. Ges ión del núme o de co ecciones de p oblemas y concu sos
Núme o de co ecciones máximo de un concu so
Cómo se ha explicado p e iamen e, los concu sos pueden ene asignados un
núme o máximo de co ecciones, el cual se almacena en la base de da os.
Median e la llamada GET /api/con es s/:con es Id/maxA emp s se puede
ob ene el núme o máximo de co ecciones del concu so con iden i icado con es Id.
96 CAPÍTULO 7. CONCLUSIONES Y TRABAJO FUTURO
usua io que di ie e de la solución espe ada. Al in oduci la especi icación de un
p oblema, se lle a a cabo en iempo eal la comp obación de la sin axis en la is a
del adminis ado , así como la gene ación de un caso de p ueba con sepa ado es
pa a e i ica su co ec o uncionamien o.
7.2. Di icul ades encon adas
Du an e el desa ollo del p oyec o nos su gie on a ias di icul ades, a eces
de i adas del uso de ecnologías que no conocíamos p e iamen e, y o as eces po
p oblemas que no uimos capaces de p e e . O o incon enien e que a ec ó a odo
el equipo ue que casi odos u imos menos iempo el p ime cua imes e que el
segundo, po lo que el desa ollo del p oyec o ue más len o al p incipio. Además,
a con inuación se exponen las di icul ades y p oblemas que a ec a on a cada g upo
du an e el desa ollo del p oyec o.
7.2.1. G upo 1
El g upo 1 u o que ap ende a maneja el lenguaje de g amá icas de PEG.js.
Po an o, an es de c ea el lenguaje de especi icación de DOM eed, sus
miemb os es u ie on expe imen ando con g amá icas más sencillas y leyendo
la documen ación [15].
Al p incipio la unción sepa ado a de casos de p ueba uncionaba de o ma
sínc ona, pues el g upo 1 enía un conocimien o limi ado de Ja aSc ip , y
además nunca había abajado con Node.js. Po an o, no ue has a el se-
gundo cua imes e que consiguie on un sepa ado de casos asínc ono. Las
di icul ades su gie on p incipalmen e po no es a amilia izados con la p o-
g amación di igida po e en os ca ac e ís ica de Node.js.
7.2.2. G upo 2
Al inicia el p oyec o, el g upo 2 enía muy poca expe iencia abajando con
Reac y Node.js, po lo que se u o que amilia iza y ap ende a u iliza
dichas he amien as pa a la elabo ación de la aplicación web.
Du an e el mes de diciemb e, cuando el p oyec o ya enía una base sólida,
DOMjudge lanzó una nue a e sión de su API. Sin emba go, es a nue a ac-
ualización eliminaba el da o eam_id en la espues a de la llamada a la API
con los da os del usua io. Sin es e da o no se podía ob ene la in o mación
de concu sos y p oblemas del usua io, po lo que la aplicación no uncionaba
co ec amen e. Pa a soluciona es e p oblema se con ac ó con los desa olla-
do es de DOMjudge, quienes con i ma on que, e ec i amen e, se a aba de
un e o y lo soluciona on.
7.3. TRABAJO FUTURO 97
Las limi aciones de la API de DOMjudge, al no o ece los casos de p ueba
así como la salida de un usua io a un p oblema de e minado, nos p o oca-
on la búsqueda de al e na i as. Llegamos a la conclusión de que la única
o ma de pode ob ene los iche os de una mane a au oma izada e a median-
e sc aping. Hubo que ap ende algunos concep os del sc aping pa a pode
u iliza lo co ec amen e.
La API de DOMjudge no siemp e p opo ciona los da os de la o ma en la que
los necesi amos, po lo que hemos enido que p ocesa muchos de los da os
ob enidos. En algunos casos se han enido que hace has a es llamadas a
la API de DOMjudge pa a ob ene odos los da os necesa ios pa a cons ui
el obje o que necesi amos.
7.3. T abajo u u o
Los obje i os iniciales han sido alcanzados. No obs an e, c eemos que el p o-
yec o iene capacidad de mejo a, po lo que a con inuación se exponen algunas
ideas pa a ello:
7.3.1. Lenguaje de especi icación
In oduci un oken de in de línea: En el enunciado de muchos p o-
blemas de p og amación se indica, po ejemplo, que un caso de p ueba iene
dos líneas, donde la p ime a iene un en e o y la segunda iene a ios. Aho-
a mismo, nues o lenguaje de especi icación iene dos o mas de desc ibi
casos de p ueba como el an e io : usando okens <in > o okens <line>.
Sin emba go, no hay ninguna mane a de especi ica que una línea iene un
solo en e o. Es po ello que conside amos ú il que se pueda especi ica dónde
acaba y, po an o, empieza la siguien e línea usando un nue o oken.
In oduci un oken pa a núme os eales: Conside amos que po com-
ple i ud debe ía añadi se un oken pa a núme os eales, pues ya hay uno
pa a núme os en e os. Aho a mismo una especi icación end ía que usa un
oken s ing pa a econoce un núme o eal.
7.3.2. Implemen ación de la sepa ación de casos de p ueba
Reduci el consumo de memo ia del TokenS eam: Pa a c ea un To-
kenS eam, es necesa io habe leído odo el iche o con los casos de p ueba y
pasa le un s ing a la cons uc o a. Es o puede llega a incu i en un g an
consumo de memo ia pa a iche os inusualmen e g andes, y además supone
que no podemos okeniza el iche o has a habe lo leído comple amen e. Se
sugie e busca una mane a sencilla de i leyendo el iche o po pa es sin com-
plica excesi amen e la lógica de las unciones que in e ac úan di ec amen e
con la implemen ación de un TokenS eam.
98 CAPÍTULO 7. CONCLUSIONES Y TRABAJO FUTURO
Esc ibi más p uebas o es s:Al ene una especi icación que no se pueda
aplica a un iche o de casos de p ueba, se imp ime un mensaje de e o . Es e
mensaje debe ía imp imi la ila y la columna co ec a del iche o donde
se encon ó el e o , pe o no se es á e i icando que es e compo amien o
uncione oda ía. Además, con end ía ealiza más p uebas que cub an las
eglas de p ocesamien o y la sepa ación de casos, pues la cobe u a de las
p uebas exis en es no supe a más del 60 % del código en ambos casos.
7.3.3. F on end
Se pod ía alo a la posibilidad de p opo ciona el código del usua io que
ha p opiciado la salida e ónea. Exis e un endpoin en la API de DOMjudge
que de uel e el código en egado como solución a un p oblema pa a cie a
en ega.
Las ablas de la aplicación ac ualmen e no ienen ningún ipo de paginación,
po lo que en el momen o en el que un concu so enga muchos p oblemas o
un p oblema enga muchas en egas, hab á un p oblema g a e de endimien-
o. Se ía in e esan e añadi una paginación a las ablas de ein e ilas, po
ejemplo.
Ac ualmen e, el on end no con iene ningún es pa a comp oba unciona-
lidades y e i a que es as se ompan al añadi nue as o modi ica exis en es.
Se pod ía u iliza la biblio eca Cyp ess [4] pa a ealiza es e abajo.
Exis en cie as páginas en DOM eed que ienen una apa iencia demasiado
simple como es la página 404. Pod ía de ini se una hoja de es ilos pa a es as
páginas.
Se pod ía c ea un icono pa a la aplicación, el cual se pueda coloca en la
página de inicio de sesión, en la cabece a y en el a icon de la página web.
Se pod ía añadi el manual de las especi icaciones a la aplicación web, pa a
que así los p o eso es engan un ácil y ápido acceso a la ho a de edac a
especi icaciones.
7.3.4. Backend
Implemen a un log de e o es pa a la aplicación, donde se lle e egis o de
odos los imp e is os ocu idos en el se ido . Ac ualmen e, solo se de uel en
los e o es al clien e y se mues an o po consola o como no i icación.
Se pod ía mejo a la ges ión del sis ema de iche os. Ac ualmen e, se desca -
gan las salidas ob enidas po las ejecuciones de los usua ios cada ez que se
pide una co ección y nunca se bo an. Solo se sus i uyen cuando se uel e
a pedi la co ección. Se pod ía e i a ol e a desca ga un iche o ya exis-
en e, o bo a pe iódicamen e aquellos iche os que ya no sean necesa ios o
que no se u ilicen.
Capí ulo 8
Conclusions and Fu u e Wo k
In his sec ion we explain o wha ex en he main objec i es ha e been me ,
he di icul ies encoun e ed du ing he de elopmen o he p ojec and wha im-
p o emen s can be added in he u u e.
8.1. Objec i es achie ed
The main objec i es o his p ojec we e:
The de ini ion o a es case speci ica ion language and he implemen a ion
o a mechanism o sepa a e he es cases o a p oblem wi h a speci ica ion.
The de elopmen o a web applica ion ha allows he s uden o see in which
es case he s uden ’s submission has ailed and he adminis a o o eco d
he necessa y speci ica ions so ha he es cases can be sepa a ed om he
p oblem.
We can say ha bo h goals ha e been me .
Fi s , he speci ica ion language de eloped is in ui i e, and we ha e no ound
any p oblem o which he e is no speci ica ion o desc ibe he inpu and ou pu .
In addi ion, we ha e w i en a use ’s guide o eache s o amilia ize hemsel es
wi h his language, which, howe e , we ha e no been able o add o he websi e in
he end. On he o he hand, we ha e de eloped mo e han 100 es s o ensu e he
co ec unc ioning o bo h he g amma ha ecognizes he speci ica ion language
and he sepa a ion o es cases, and he pa se has passed all o hem (see sec ion
5.3).
Rega ding he second objec i e, he web applica ion is qui e simila o DOM-
judge, as his way we manage o main ain ex e nal consis ency and make i easie
o new use s o amilia ize hemsel es wi h he en i onmen . The access c eden-
ials o he applica ion a e he same as o DOMjudge, so he e is no egis a ion
p ocess. Fo each p oblem, he use will ha e a numbe o co ec ions se by he
con es adminis a o , bo h o he con es and he p oblem. In he co ec ion iew,
he i s es case o he use ’s solu ion ha di e s om he expec ed solu ion is
displayed. When en e ing a p oblem speci ica ion, syn ax checking is pe o med in
99
100 CAPÍTULO 8. CONCLUSIONS AND FUTURE WORK
eal ime in he adminis a o ’s iew, as well as he gene a ion o a es case wi h
sepa a o s o e i y co ec ope a ion.
8.2. Di icul ies encoun e ed
Du ing he de elopmen o he p ojec we encoun e ed se e al di icul ies, so-
me imes de i ed om he use o echnologies ha we we e no p e iously amilia
wi h, and o he imes due o p oblems ha we we e no able o o esee. Ano he
incon enience ha a ec ed he whole eam was ha almos all o us had less ime
in he i s qua e han in he second, so he de elopmen o he p ojec was slowe
a he beginning. In addi ion, he ollowing a e he di icul ies and p oblems ha
a ec ed each g oup du ing he de elopmen o he p ojec .
8.2.1. G oup 1
G oup 1 had o lea n how o handle he PEG.js g amma language. The e-
o e, be o e c ea ing he DOM eed speci ica ion language, i s membe s we e
expe imen ing wi h simple g amma s and eading he documen a ion. [15].
A i s he es case sepa a o unc ion wo ked synch onously, as g oup 1 had
limi ed knowledge o Ja aSc ip , and also had ne e wo ked wi h Node.js.
The e o e, i was no un il he second qua e ha hey go an asynch onous
case sepa a o . The di icul ies a ose mainly because hey we e no amilia
wi h he e en -d i en p og amming cha ac e is ic o Node.js.
8.2.2. G oup 2
A he beginning o he p ojec , g oup 2 had e y li le expe ience wo king
wi h Reac and Node.js, so hey had o amilia ize hemsel es wi h and lea n
how o use hese ools o he de elopmen o he web applica ion.
Du ing he mon h o Decembe , when he p ojec al eady had a solid base,
DOMjudge eleased a new e sion o i s API. Howe e , his new upda e
elimina ed he eam_id da a in he API call esponse wi h he use ’s da a.
Wi hou his da a, i was no possible o ob ain he in o ma ion o con es s
and p oblems om he use , so he applica ion did no wo k co ec ly. To
sol e his p oblem, we con ac ed DOMjudge de elope s, who con i med ha
i was indeed a bug and ixed i .
The limi a ions o he DOMjudge API, by no o e ing he es cases as well as
he ou pu o a use o a gi en p oblem, caused us o sea ch o al e na i es.
We came o he conclusion ha he only way we could ge he iles in an
au oma ed way was by sc aping. We had o lea n some concep s o sc aping
o be able o use i co ec ly.
8.3. FUTURE WORK 101
The DOMjudge API does no always p o ide he da a he way we need i ,
so we ha e had o p ocess a lo o he da a ob ained. In some cases, we ha e
had o make up o h ee DOMjudge API calls o ge all he da a needed o
build he objec we need.
8.3. Fu u e wo k
The ini ial objec i es ha e been achie ed. Howe e , we belie e ha he p ojec
has oom o imp o emen , so he e a e some ideas o i :
8.3.1. Speci ica ion language
C ea ing an end-o -line oken: In he s a emen o many p og amming
p oblems i is s a ed, o example, ha a es case has wo lines, whe e he
i s has one in ege and he second has se e al. Righ now, ou speci ica ion
language has wo ways o desc ibe es cases like he abo e: using okens
<in > o okens <line>. Howe e , he e is no way o speci y ha a line has
a single in ege . This is why we ind i use ul o be able o speci y whe e he
nex line ends and hus begins using a new oken.
C ea ing a oken o eal numbe s: We belie e ha o comple eness a
oken o eal numbe s should be added, as he e is al eady one o in ege s.
Righ now, a speci ica ion would ha e o use a s ing oken o ecognize a
eal numbe .
8.3.2. Implemen a ion o es case sepa a ion
Reducing TokenS eam memo y consump ion: In o de o c ea e a
TokenS eam, i is necessa y o ha e ead he whole ile wi h he es cases
and pass a s ing o he cons uc o . This can be e y memo y in ensi e o
unusually la ge iles, and also means ha we canno okenize he ile un il
i has been ead comple ely. I is sugges ed o ind a simple way o ead he
ile in pa s wi hou o e complica ing he logic o he unc ions ha in e ac
di ec ly wi h he implemen a ion o a TokenS eam.
W i ing mo e es s: When a speci ica ion canno be applied o a es case
ile, an e o message is p in ed. This message should p in he co ec ow
and column o he ile whe e he e o was encoun e ed, bu his beha io
is no being e i ied o wo k ye . In addi ion, mo e es s co e ing p ocessing
ules and case sepa a ion would be desi able, as he exis ing es co e age
does no exceed mo e han 60 % o he code in bo h cases.
8.3.3. F on end
I could be conside ed o p o ide he use code ha caused he e oneous
ou pu . The e is an endpoin in he DOMjudge API ha e u ns he code
102 CAPÍTULO 8. CONCLUSIONS AND FUTURE WORK
deli e ed as a solu ion o a p oblem o a ce ain submission.
The applica ion ables cu en ly do no ha e any pagina ion, so he momen
a con es has many p oblems o a p oblem has many submissions, he e will
be a se ious pe o mance p oblem. I would be in e es ing o add pagina ion
o ables o wen y ows, o example.
Cu en ly, he on end does no con ain any es s o check unc ionali y and
p e en i om b eaking when adding new o modi ying exis ing unc iona-
li y. The Cyp ess [4] lib a y could be used o do his job.
The e a e ce ain pages in DOM eed ha ha e a oo simple appea ance, such
as he 404 page. A s yleshee could be de ined o hese pages.
An icon could be c ea ed o he applica ion, which can be placed on he
login page, in he heade and in he a icon o he web page.
The speci ica ions manual could be added o he web applica ion, so eache s
can ha e an easy and quick access when w i ing speci ica ions.
8.3.4. Backend
Implemen an e o log o he applica ion, whe e all un o eseen e en s oc-
cu ing on he se e a e logged. Cu en ly, only e o s a e e u ned o he
clien and a e displayed ei he by console o as a no i ica ion.
The managemen o he ile sys em could be imp o ed. Cu en ly, he ou -
pu s ob ained by use uns a e downloaded each ime a co ec ion is eques ed
and a e ne e dele ed. They a e only eplaced when he co ec ion is eques-
ed again. I would be possible o a oid e-downloading an exis ing ile, o
pe iodically dele ing iles ha a e no longe needed o used.
Capí ulo 9
Con ibuciones pe sonales
En es a sección se desc iben las con ibuciones de cada componen e del g upo.
Es impo an e eco da que el equipo se di idió en dos subg upos, de modo que
el g upo con o mado po E ik Ka lg en Dome cq y Ad ián González Cabanillas se
enca gó de la sepa ación de los casos de p ueba, mien as que el g upo o mado
po Félix Redondo Manzana es y Rica do En ique F ei e Sacco se enca gó de la
aplicación web.
9.1. Félix Redondo Manzana es
Félix ya enía conocimien os iniciales an o en Ja asc ip como en Node.js
y Reac , po lo que u o un inicio más ápido en el desa ollo de DOM eed. Los
p ime os días es u o amilia izándose con DOMjudge y odo lo ela i o a su API.
Du an e el p ime cua imes e, Félix asumió odo el abajo e e en e a la pa e
co espondien e al on end ybackend ya que Rica do no enía disponibilidad. En
el segundo cua imes e ue Rica do quien ealizó casi odo el abajo es an e.
9.1.1. Sc aping
Una de las p ime as a eas ue pode desca ga la salida p oducida po el
alumno pa a cie o p oblema. Félix se dio cuen a de que no se podía ob ene
dicha salida po medio de la API, así que u o que busca una al e na i a. La
única o ma que encon ó ue median e una llamada a DOM eed desde una de las
pan allas de ges ión del adminis ado , po lo que e a necesa io pode inicia sesión
como adminis ado y desca ga el a chi o. Pa a ello u o que ecu i al sc aping,
po el cual consiguió inicia sesión en DOMjudge y ex ae el oken de inicio de
sesión necesa io pa a pode desca ga la salida del usua io. En la sección 6.2.3 se
explica de alladamen e el p oceso seguido.
9.1.2. Algo i mo de búsqueda de caso e óneo
Una ez ob enido la salida del alumno había que compa a la con la salida
espe ada. Inicialmen e, los casos de p ueba del p oblema (casos de en ada y salida
103
104 CAPÍTULO 9. CONTRIBUCIONES PERSONALES
espe ada pa a dichos casos), es aban almacenados en su local. Félix ealizó una
p ime a i e ación del algo i mo que pos e io men e u o que modi ica lo dos eces
más a lo la go del desa ollo a causa de a iaciones en los eque imien os.
9.1.3. API de DOM eed
Félix desa olló los siguien es endpoin s de la API:
POST /api/login: pa a el inicio de sesión del usua io.
GET /api/ eam/: eamId/con es s: pa a ob ene los concu sos de un usua-
io o equipo.
GET /api/p oblems/:con es Id: que de uel e odos los p oblemas de un
concu so.
GET /api/submissions/:con es Id/: eamId: e o na las en egas de un
usua io o equipo pa a un concu so.
GET /api/submissions/:con es Id/p oblem/:p oblemId: en ega odas
las en egas de odos los equipos pa a un p oblema de un concu so.
GET /api/submissions/:con es Id/:submissionId/ esul ados: de uel-
e los casos de p ueba e óneos.
9.1.4. Páginas de la in e az web
La mayo pa e de la in e az web ue desa ollada po Félix, pues enía más
expe iencia. Las páginas jun o con la lógica de es as que desa olló son las siguien-
es:
Inicio de sesión: is a pa a el inicio de sesión del usua io.
P oblemas: página que mues a los p oblemas po concu sos.
En egas: is a que mues a las en egas de un equipo pa a un concu so.
Co ecciones: página donde se mues an el caso e óneo de la en ega.
9.1.5. Sis ema de no i icaciones
Félix desa olló un componen e de Reac pa a mos a no i icaciones al usua io
como eedback as ealiza cie as acciones. El componen e se puede u iliza desde
cualquie página de la web, pues es á colocado en un ni el inicial del á bol de com-
ponen es que componen la aplicación, y cuya unción o mecanismo pa a mos a
y cambia el ex o de la no i icación es á gua dado en el con ex o de Reac , po lo
que cualquie componen e hijo puede accede a él.
9.2. RICARDO ENRIQUE FREIRE SACCO 105
9.1.6. Páginas p i adas
La única página de DOM eed donde un usua io puede accede sin inicia sesión
es la is a de login. El es o de páginas equie en de una au en icación p e ia del
usua io. Pa a ello, Félix desa olló un hook que comp ueba en cada pan alla que
el usua io es á logueado. El hook se almacena a ni el de con ex o de aplicación,
po lo que se puede accede desde cualquie is a de la web.
9.1.7. Man enimien o de la sesión del usua io
Pa a e i a que el usua io pe die a la sesión as e esca el na egado y que
u ie a que ol e a inicia sesión en DOM eed, Félix desa olló un mé odo donde
se gua daba un oken de sesión en el localS o age del na egado . En esencia, cada
ez que se e esca el na egado , se comp ueba que exis e ese oken y se ag ega al
con ex o de la aplicación pa a indica la exis encia de un usua io logueado.
9.1.8. Segu ización de la API
Pa a asegu a que odas las pe iciones a la API de DOM eed ue an de usua ios
au en icados, Félix u o que desa olla un sis ema de segu idad. Es e, en esencia,
consis e en un oken con in o mación ela i a al usua io que ha iniciado sesión que
manda al on end al inicio de es a, y pos e io men e se de uel e en cada llamada
a la API. Básicamen e, la segu idad se consigue comp obando la exis encia del
oken en cada llamada a la API po medio de un middlewa e y, en el caso de
que exis a y no es é al e ado ni co up o, hace o a se ie de comp obaciones pa a
alida que el usua io que ealiza la pe ición iene pe misos pa a ob ene los da os
solici ados.
9.1.9. Llamada a la API de DOMjudge
Tan o las llamadas a la API como el pos e io a amien o de los da os ob e-
nidos ue on desa olladas po Félix, pues o que es a pa e ue abajo del p ime
cua imes e. T as cada llamada co esponde un a amien o de los da os pa a
adap a los a lo solici ado po el usua io a a és de nues a API de DOM eed. En
algunas ocasiones u o que hace a ias llamadas a DOMjudge y c uza los da os
ob enidos pa a pode consegui los da os necesa ios.
9.2. Rica do En ique F ei e Sacco
Al inicia el p oyec o, Rica do no enía ninguna expe iencia abajando con
ecnologías como Reac o Node.js, po lo que los p ime os meses se cen ó p in-
cipalmen e en ap ende los concep os básicos de dichas ecnologías. Además, po
emas de disponibilidad no pudo apo a al p oyec o du an e el p ime cua i-
mes e, po lo que el segundo cua imes e asumió la mayo pa e de la ca ga de
abajo.
Apéndice A
Ejemplos de especi icaciones
En es e apéndice se p esen an ejemplos de especi icaciones de en ada y de sali-
da pa a p oblemas de p og amación eales y se mues a cómo queda ían sepa ados
los iche os de casos de p ueba. Es os p oblemas han sido usados en exámenes o
p ác icas del g ado de Ingenie ía In o má ica de la Uni e sidad Complu ense de
Mad id.
A.1. Ob ene el mínimo de un ec o
Es e p oblema apa eció en el examen inal de sep iemb e de 2014 de la asigna-
u a de Fundamen os de Algo i mia.
A.1.1. Enunciado
Conside amos un ec o V[N]de núme os en e os, cuyos alo es se han ob-
enido aplicando una o ación sob e un ec o o denado en o den es ic amen e
dec ecien e. Implemen a un algo i mo que calcule el mínimo del ec o con una
complejidad O(log(n)). El núme o de elemen os sob e los que se aplica la o ación
pa a ob ene el ec o de en ada es un alo en e 0 y Ny no se conoce.
Po ejemplo, un posible ec o de en ada se ía el ec o 70 55 13 4 100 80,
ob enido desplazando los dos p ime os elemen os del ec o 100 80 70 55 13 4
al inal del mismo.
Requisi os de implemen ación.
Se debe implemen a una unción ecu si a ( esol e ) que dado el ec o , con
los da os de en ada ya leídos, ob enga el mínimo en iempo loga í mico espec o al
núme o de elemen os del ec o . Se pueden u iliza más pa áme os si se conside a
necesa io.
En ada
La en ada cons a de una se ie de casos de p ueba. Cada caso de p ueba cons a
de dos líneas. En la p ime a se indica el núme o de elemen os del ec o y en la
i
ii APÉNDICE A. EJEMPLOS DE ESPECIFICACIONES
1En ada Salida
2
34 2
48 6 4 2 2
54 2
62 8 6 4 2
74 1
84 2 8 6 1
94 4
10 6 4 2 8
11 5
12 8 5 3 1 10
13 5
14 5 3 1 10 8
15 6
16 70 55 13 4 100 80
Figu a A.1: Mínimo de un ec o : casos de p ueba sin sepa a
segunda los alo es del ec o .
Salida
Pa a cada caso de p ueba se esc ibe en una línea di e en e el mínimo del ec o .
Véase la igu a A.1 pa a e el ejemplo de en ada y de salida del enunciado
de es e p oblema.
A.1.2. Especi icaciones
Pa a de ini las especi icaciones solo necesi amos p es a a ención a las secciones
de En ada y de Salida. Como bien dice el enunciado, pa a cada caso de p ueba
de en ada enemos dos líneas, eniendo la p ime a un en e o con el núme o de
elemen os de la siguien e línea, que a su ez son ambién en e os. No se menciona
en ningún si io que haya algo de in o mación p e ia a odos los casos de p ueba,
como la can idad de los mismos, ni de que se ma que el in de la en ada de alguna
o ma. Po an o, enemos dos posibles especi icaciones pa a la en ada:
--- (<n:in > <in >^n ---)^*
--- (<line>^2 ---)^*
No obs an e, hay que ene en cuen a que en la p ime a especi icación no im-
po a que cada caso de p ueba es é en dos líneas, en una, o si odos los casos de
p ueba se encuen an en la misma línea. Po o o lado, la segunda especi icación
no nos se i ía en el caso de que los da os de cada caso de p ueba de la en ada
no siguie an de mane a es ic a las condiciones del enunciado y los da os de un
mismo caso es u ie an en una o más de dos líneas.
Po úl imo, hay ambién dos posibles especi icaciones pa a la salida:
A.2. EL GRANDE iii
1En ada Salida
2
3--- ---
44 2
58 6 4 2 ---
6--- 2
74 ---
82 8 6 4 2
9--- ---
10 4 2
11 4 2 8 6 ---
12 --- 1
13 4 ---
14 6 4 2 8 1
15 --- ---
16 5 4
17 8 5 3 1 10 ---
18 ---
19 5
20 5 3 1 10 8
21 ---
22 6
23 70 55 13 4 100 80
24 ---
Figu a A.2: Mínimo de un ec o : casos de p ueba sepa ados
--- (<in > ---)^*
--- (<line> ---)^*
Ambas especi icaciones ienen las mismas peculia idades que sus espec i as
especi icaciones pa a la en ada, pe o al igual que es as, si las condiciones sob e
la en ada y la salida se siguen de mane a es ic a, se i ían pa a sepa a los
casos de p ueba ap opiadamen e. De hecho, los casos de p ueba que apa ecen
en el enunciado ( igu a A.1) se sepa an co ec amen e usando cualquie a de las
especi icaciones de en ada y de salida an e io es, como puede obse a se en la
igu a A.2.
A.2. El G ande
Es e p oblema apa eció en una p ác ica de la asigna u a de Es uc u as de
Da os. Fue c eado po Manuel Mon eneg o, uno de los u o es del TFG.
En es e p oblema se menciona que hay que implemen a un TAD, que son las
siglas de Tipo Abs ac o de Da os.
i APÉNDICE A. EJEMPLOS DE ESPECIFICACIONES
A.2.1. Enunciado
El G ande es un juego de mesa ambien ado en la España medie al. En es-
e juego, los jugado es ienen que coloca es a égicamen e a sus caballe os po
las dis in as egiones del país. Decimos que un jugado p edomina en una egión
cuando iene es ic amen e más caballe os en dicha egión que cualquie a de los
es an es jugado es. Po o o lado, decimos que una egión es á en dispu a si es á
ocupada po al menos un caballe o, pe o ningún jugado p edomina en la misma.
En pa icula , las egiones acías (es o es, sin caballe os) no es án en dispu a.
En es e eje cicio a a emos de implemen a un TAD que almacene la in o ma-
ción co espondien e a una pa ida de es e juego. Las ope aciones a implemen a
son:
anyadi _jugado (jugado ). Añade un jugado a la pa ida. Si el juga-
do (de ipo s ing) ya es aba insc i o en ella, se lanza una excepción
domain_e o con el mensaje Jugado exis en e.
coloca _caballe o(jugado , egion). Indica que el jugado (que es de
ipo s ing) coloca un caballe o en la egion (de ipo s ing) indicada.
Si el jugado no se encuen a insc i o en la pa ida, se lanza la excepción
domain_e o con el mensaje Jugado no exis en e. Si la egion no exis-
e, se da á de al a.
pun uacion(jugado ). De uel e el núme o de egiones en las que p edomina
el jugado pasado como pa áme o. Si el jugado no se encuen a insc i o
en la pa ida, se lanza la excepción domain_e o con el mensaje Jugado
no exis en e.
egiones_en_dispu a(). De uel e un ec o <s ing> con la lis a de e-
giones que es án en dispu a. La lis a ha de es a o denada ascenden emen e,
en o den al abé ico según el nomb e de la egión.
expulsa _caballe os( egion). Elimina a odos los caballe os de la egion
pasada como pa áme o. Si la egión no exis e o no iene ningún caballe o,
se lanza la excepción domain_e o con el mensaje Region acia.
En es e eje cicio se pide:
1. Implemen a las ope aciones desc i as en el TAD. Ninguna de ellas debe
ealiza ope aciones de E/S. El manejo de E/S debe hace se en la unción
a a _caso().
2. Indica el cos e de cada ope ación. Las ope aciones deben implemen a se
de la mane a más e icien e desde el pun o de is a del cos e asin ó ico en
iempo.
A.2. EL GRANDE
En ada
La en ada cons a de una se ie de casos de p ueba. Cada caso es á o mado po
una se ie de líneas en las que se mues an las ope aciones a lle a a cabo, una po
cada línea: el nomb e de la ope ación seguido de sus a gumen os. La palab a FIN
en una línea indica el inal de cada caso.
Los nomb es de jugado es y egiones son cadenas de ca ac e es sin espacios en
blanco.
Salida
Las ope aciones que gene an salida son:
pun uacion J, que debe esc ibi una línea con el mensaje Pun uacion de
J: X, donde Jes el jugado del cual quie e ob ene se la pun uación, y Xes
la pun uación del mismo.
egiones_en_dispu a, que debe esc ibi una línea con el mensaje Regiones
en dispu a:, seguida de los nomb es de las egiones que es án en dispu a,
uno po línea.
Si una ope ación p oduce un e o , en onces se esc ibi á una línea con el men-
saje ERROR:, seguido del mensaje de la excepción que lanza la ope ación, y no se
esc ibi á nada más pa a esa ope ación.
Cada caso e mina con una línea con es guiones (---)
Véase la igu a A.3 pa a e el ejemplo de en ada y de salida del enunciado
de es e p oblema.
A.2.2. Especi icaciones
La salida y la en ada de es e p oblema es signi ica i amen e más compleja que
la del p oblema an e io . Aun así, podemos usa especi icaciones bas an e sencillas
pa a desc ibi las. Veamos las siguien es:
En ada: --- (<line>^* "FIN" ---)^*
Salida: --- (<line>^* "---" ---)^*
Aquí es amos ap o echando que el analizado de casos de p ueba, dada una
especi icación S^* T y una cadena x, in en a á p ime o comp oba si la cadena x
es acep ada po la especi icación T, y solo si no es el caso, comp oba á si es acep ada
po la especi icación S. Po eso, en el caso de la especi icación de en ada, si se lee
una cadena ‘FIN’ no se a a como un oken de línea, sino como el li e al “FIN”.
Nó ese además que ‘‘---’’ no se a a como un sepa ado en la especi icación
al a a se de un li e al. Véase la igu a A.4 pa a e cómo quedan los casos de
p ueba sepa ados.
i APÉNDICE A. EJEMPLOS DE ESPECIFICACIONES
1En ada Salida
2
3anyadi _jugado jug1 Pun uacion de jug1: 1
4anyadi _jugado jug2 Pun uacion de jug2: 0
5coloca _caballe o jug1 G anada Pun uacion de jug1: 0
6coloca _caballe o jug2 G anada Pun uacion de jug2: 0
7coloca _caballe o jug1 G anada Regiones en dispu a :
8pun uacion jug1 A agon
9pun uacion jug2 G anada
10 coloca _caballe o jug2 G anada ---
11 pun uacion jug1 ERROR : Jugado no exis en e
12 pun uacion jug2 Pun uacion de jug1: 2
13 coloca _caballe o jug2 A agon Pun uacion de jug1: 1
14 coloca _caballe o jug1 A agon ERROR : Region acia
15 egiones_en_dispu a ---
16 FIN
17 coloca _caballe o jug1 Se illa
18 anyadi _jugado jug1
19 coloca _caballe o jug1 Valencia
20 coloca _caballe o jug1 Galicia
21 pun uacion jug1
22 expulsa _caballe os Valencia
23 pun uacion jug1
24 expulsa _caballe os Valencia
25 FIN
Figu a A.3: El G ande: casos de p ueba sin sepa a
A.2. EL GRANDE ii
1En ada Salida
2
3<====================> <====================>
4anyadi _jugado jug1 Pun uacion de jug1: 1
5anyadi _jugado jug2 Pun uacion de jug2: 0
6coloca _caballe o jug1 G anada Pun uacion de jug1: 0
7coloca _caballe o jug2 G anada Pun uacion de jug2: 0
8coloca _caballe o jug1 G anada Regiones en dispu a :
9pun uacion jug1 A agon
10 pun uacion jug2 G anada
11 coloca _caballe o jug2 G anada ---
12 pun uacion jug1 <==================== >
13 pun uacion jug2 ERROR : Jugado no exis en e
14 coloca _caballe o jug2 A agon Pun uacion de jug1: 2
15 coloca _caballe o jug1 A agon Pun uacion de jug1: 1
16 egiones_en_dispu a ERROR : Region acia
17 FIN ---
18 <====================> <====================>
19 coloca _caballe o jug1 Se illa
20 anyadi _jugado jug1
21 coloca _caballe o jug1 Valencia
22 coloca _caballe o jug1 Galicia
23 pun uacion jug1
24 expulsa _caballe os Valencia
25 pun uacion jug1
26 expulsa _caballe os Valencia
27 FIN
28 <====================>
Figu a A.4: El G ande: casos de p ueba sepa ados
iii APÉNDICE A. EJEMPLOS DE ESPECIFICACIONES
Bibliog a ía
[1] Axios, P omise based HTTP clien .u l:h ps://axios-h p.com/.
[2] Boo s ap, he wo ld’s mos popula amewo k o building esponsi e si es.
u l:h ps://ge boo s ap.com/.
[3] Classical Logic.u l:h ps://pla o.s an o d.edu/a chi es/win2009/
en ies/logic-classical/.
[4] Cyp ess, on end es ing.u l:h ps://www.cyp ess.io/.
[5] DOMjudge API.u l:h ps://www.domjudge.o g/demoweb/api/doc.
[6] DOMjudge documen a ion.u l:h ps : / / www . domjudge . o g / docs /
manual/8.0/index.h ml.
[7] Exp ess.js, A API amewo k o Node.js.u l:h ps://exp essjs.com/
es/.
[8] Russ Fe guson. Beginning Ja asc ip : The Ul ima e Guide o Mode n Ja aS-
c ip De elopmen . Ap ess, 2019. isbn: 1484243943.
[9] Jes - Deligh ul Ja aSc ip Tes ing.u l:h ps://jes js.io/.
[10] Ju ge, The Vi ual Lea ning En i onmen o Compu e P og amming.u l:
h ps://ju ge.o g/.
[11] Mooshak, au oma ic judge.u l:h ps://mooshak.dcc. c.up.p /.
[12] Node.js, A Ja aSc ip un ime buil .u l:h ps://nodejs.o g/es/.
[13] npm, The wo ld’s la ges so wa e egis y.u l:h ps://www.npmjs.com/.
[14] Package.json, Node and npm con ig ile.u l:h ps://docs.npmjs.com/
cli/ 7/con igu ing-npm/package-json.
[15] PEG.js - Documen a ion.u l:h ps://pegjs.o g/documen a ion.
[16] PEG.js - Pa se Gene a o o Ja aSc ip .u l:h ps://pegjs.o g/.
[17] J. Pe i y col. «Ju ge.o g: Cha ac e is ics and Expe iences». En: IEEE T ansac-
ions on Lea ning Technologies 11.3 (2017), págs. 321-333. doi:h ps://
doi.o g/10.1109/TLT.2017.2723389.
[18] Reac Boo s ap, he wo ld’s mos popula amewo k ebuil o Reac .u l:
h ps:// eac -boo s ap.gi hub.io/.
[19] Reac Rou e , A ou ing lib a y o Reac .u l:h ps:// eac ou e .
com/.
ix
xBIBLIOGRAFÍA
[20] Reac , A Ja aSc ip lib a y o building use in e aces.u l:h ps://es.
eac js.o g/.
[21] s eam.W i able | Node.js 18.2.0 Documen a ion.u l:h ps://nodejs.
o g/api/s eam.h ml#class-s eamw i able.
[22] Basa a Ali Syed. Beginning Node.js. Ap ess, 2014. isbn: 9781484201886.