SIO/Feladatok kitűzése
A kitűzött feladat kiértékelés szempontjából kétféle lehet:
- klasszikus SIO: az eredeti SIO-rendszerrel jött kiértékelő értékeli ki
- sziruup: az új, szirup nevű kiértékelő értékeli ki (a sziruupot pts írta 2007-03-14-én)
Mivel a klasszikus SIO-ban nem tudtuk javítani az összesítési bugot, ezért készítettük el a sziruupot, ami ezt a hibát már nem tartalmazza. Az összesítési bug a klasszikus SIO azon viselkedése, hogy egy megoldás kiértékelésekor OK-nak jelzi a beadott megoldást akkor is, amikor bizonyos tesztek sikeresen, mások viszont sikertelenül futnak le. (Az admin felületen a megoldás részletezésében meg lehet nézni, hogy mik sikerültek és mik nem.)
A továbbiakban csak a sziruupos feladatkitűzést részletezzük. Egy feladat attól lesz sziruupos, hogy a szerepel a feltöltött .tgz-ben rövidnév.run és rövidnév.par nevű fájl.
Tartalomjegyzék |
Angol-magyar szótár
- task: feladat
- submit, submission: megoldás
- eval, evaluation: kiértékelés
- reevalution: újraértékelés:
- subcontest: feladatcsoport
- example test case: mintabemenet, mintakimenet
- test: teszteset
- input: bemenet
- output: (elvárt) kimenet
- wrong answer: rossz válasz
A double mintafeladat
Legjobb rögtön egy mintafeladat tanulmányozásával kezdeni a SIO-beli feladatkitűzéssel való ismerkedést. A mintafeladat rövid neve double, és egész számok duplájának kiszámítását kéri. A hozzá tartozó fájlok letölthetők innen: http://www.math.bme.hu/~pts/double.tgz .
Új feladat kiírása
A feladat kiírása némi előkészület után a weben történik. Az előkészület a feltöltendő archívfájl elkészítése.
A feladatnak először adjunk egy rövid nevet (angol ábécé, ékezetes betűk nélkül), a továbbiakban ez rövidnév lesz.
A fájlevek kisbetűsek legyenek, és pontosan úgy adjuk meg őket, ahogy le vannak írva. A fájlokból a könyvtárnév kimaradhat, tehát például doc/rövidnév.html és rövidnév.html egyaránt jó.
El kell készítenünk az alábbi fájlokat:
- doc/rövidnév.html: a feladat szövege HTML formátumban. Mielőtt kiírunk egy feladatot, olvassuk el a már kiért feladatok szövegét és a szöveg HTML-forrását. Nem kell az egész HTML-fájlt megírni, rögtön <h2>-s címmel indítsunk. ISO-8859-2-es kódolású legyen a HTML. Tartalmazzon (<pre> tagek között) egy mintabemenetet és egy mintakimenetet. Adjuk meg a bemeneti adatok értelmezési tartományát (intervallum, kizárt értékek stb.).
- par/rövidnév.par: környezeti paramétereket tartalmaz (például idő- és memórialimitek, a fordítást végző parancs). Első körben másoljuk le a double mintafeladat idevonatkozó fájlját, és esetleg módosítsuk az időlimitet. Az időlimitek nem összesen, hanem tesztesetenként külön-külön vonatkoznak.
- par/rövidnév.run: a futtatást végző shell szkript. Nem kötelező a unixos executable bitet rátenni. Csak érvényesíti a limiteket, és elindítja a lefordított programot. Első körben másoljuk le a double mintafeladat idevonatkozó fájlját. Módosítani nem szükséges.
- in/rövidnév0.in: a mintabemenet (ugyanaz legyen, mint a feladat szövegében)
- out/rövidnév0.out: a mintakimenet (ugyanaz legyen, mint a feladat szövegében). Ügyeljünk a sorvégi szóközökre és a fájlvégi újsorokra, mert a sziruup ezekre is érzékeny.
- par/rövidnév0.par: környezeti beállítások a mintabemenethez. Felül lehet bírálni vele a par/rövidnév.par fájlban beállítottakat. Általában az idő- és memórialimiteket szoktuk felülbírálni. (A fordítási opciók felülbírálása amúgy sem működik, mert már túl késő.)
- in/rövidnév1.in: az első tesztesethez tartozó bemenet. A hallgatók nem látják a teszteseteket. Az első teszteset hasonlítson a mintabemenetre, de ne pont ugyanaz legyen.
- out/rövidnév1.out: az első tesztesethez tartozó elvárt kimenet. A hallgatók nem látják a teszteseteket, és azt sem, hogy a hibás megoldásban pontosan hol (melyik tesztesetben és azon belül hányadik sorban) van a hiba.
- par/rövidnév1.par: környezeti beállítások az első bemenethez. A limitek tesztesetenként külön-külön állíthatók.
- in/rövidnév2.in: A második tesztesethez tartozó bemenet. Csak akkor vegyünk fel második (és esetleg további) teszteseteket, ha szükség van rájuk. Teszteljük le a szélső értékeket is. (Működik-e a program nullára? Működik-e a lehető legnagyobb megengedett értékre?)
Alkalmas időlimit beállításával (lásd később) teszteljük le, hogy elég gyors-e a program. Alkalmas memórialimit beállításával teszteljük le, hogy nem pazarolja-e a memóriát. A memórialimithez adjunk hozzá 2 MB-ot (2000) a statikus linkelés miatt. Minimum 5 MB (5000) legyen, mert különben a bash exitcode=2-es runtime error-ral kilép, még mielőtt futni kezdene a program. Ha 10-nél több teszteset van, használjunk kétjegyű számozást (00-tól). A tesztesetek lexikografikus (10 < 9) sorrendben kerülnek futtatásra.
- stb. (.in, .out és .par fájlok a további tesztesetekhez)
- prog/rövidnév.c: a mintamegoldás, helyesen kell futnia. Elkészítése nem kötelező, de ajánlott.
- prog/rövidnévb1.c: az első számú rossz megoldás, nem szabad sikerülnie. Elkészítése nem kötelező, de ajánlott.
- prog/rövidnévb2.c: a második számú rossz megoldás, nem szabad sikerülnie. Elkészítése nem kötelező, de ajánlott. Olyat érdemes készíteni, ami máshogy hibázik, mint az első számú rossz megoldás.
- stb. (.c fájlok további rossz megoldásokkal).
Próbálgassuk ki, hogy jó fájlokat írtunk-e (pl. a prog/rövidnév.c lefordul, és az in/rövidnév.in bemenetre az out/rövidnév.out kimenetet adja-e). Nem kell mindent kipróbálni, feltöltés után még (némi kényelmetlenség árán) tudunk javítani.
Ha elkészültek a fájlok, csomagoljuk őket össze egy .tgz vagy .zip archív fájlba. Az archívon belüli könyvtárszerkezetre 4 jó megoldás is van:
- könyvtárnév nélkül: rövidnév.html, rövidnév.run, rövidnév.par, rövidnév0.in, rövidnév0.out, rövidnév1.in, rövidnév1.out, rövidnév.c, rövidnévb1.c
- kis könyvtárnevekkel: doc/rövidnév.html, par/rövidnév.run, par/rövidnév.par, in/rövidnév0.in, out/rövidnév0.out, in/rövidnév1.in, out/rövidnév1.out, prog/rövidnév.c, prog/rövidnévb1.c
- főkönyvtárnévvel: rövidnév/rövidnév.html stb.
- főkönyvtárnévvel és kis könyvtárnevekkel: rövidnév/doc/rövidnév.html stb.
A feladat kiírásához fel kell tölteni az archívot az adminisztrációs webfelületen (Admin menü bal oldalt, rákattintva tasks, rákattintva add). Meg kell még adni:
- code: ez a rövid név
- Task title: beszédesebb név, tartalmazhat ékezetes betűket is, kezdődhet nagybetűvel. Az se baj, ha egyezik a rövid névvel.
- Subcontest: első közelítésében ez legyen Teszt, hogy a hallgatók ne lássák.
- Evaluation mode: édesmindegy, úgyis érzékeli a SIO a feltöltött rövidnév.par fájlt, és ennek hatására átírja majd Online contest with sziruup-ra.
- Number of points: szintén édesmindegy, maradhat az alapértelmezés
Feltöltés után a SIO elkezdi tesztelni a mintamegoldást és a rossz megoldásokat (a fájlnév sorrendjében). Nézzük meg, hogy áll (Admin / Submissions) menüpont a weben. Ha sokáig (3 másodperc + időlimit) kérdőjelet látunk, akkor baj van, ezek szerint nem fut a sziruup_evald. Kilövés után újraindítandó rootként a sioweb szerveren a /root/sziruup_evald.pl
paranccsal. Ezután szép lassan elfogynak a kérdőjelek.
A klasszikus SIO-s feladatok összesítő értékelése a Submissions táblázatban nagybetűvel, a sziruuposaké kisbetűvel kezdődik.
Az értékelés részletezéséhez kattintsünk a megoldás sorszámára. Klasszikus SIO esetén itt mindenféle szofisztikált táblázatot és okos kimutatást kapunk. sziruup esetén viszont csak egy naplófájlt látunk, amiből minden kiderül. Például benne van a fordítás eredménye, hogy milyen tesztesetekkel próbálkozott, a sikeres tesztesetek futásideje, az első sikertelen tesztesetnél a sikertelenség oka. Ha rossz a válasz (wrong answer), akkor az első hibás sor számát láthatjuk. (A klasszikus SIO rossz válasz esetén röbb részletet mutat.)
Azon teszteseknél, melyek sok számolást igényelnek, a kiértékelés naplójában nézzük meg, hogy a mintamegoldás milyen gyorsan futott le. Az időeredmény valós időt (real time) mutat milliszekundum pontossággal. Ezután módosítsuk az időlimitet (lásd még A feladatkiírás módosítása szakaszban). Ökölszabály: a mintamegoldás futásidejének háromszorosa legyen a CPU-időlimit (TE_CPU_TIME), és ennek további ötszöröse (TE_REAL_TIME) legyen a valós idejű limit. Ha a mért idő kisebb, mint 1 másodperc, akkor nehezítsünk a teszteseten.
Ha minden stimmel, akkor a webes felületen változtassuk meg a feladathoz tartozó feladatcsoportot (subcontest) Teszt-ről vagy Szorgalmi-ra vagy valamelyik Beadandó-ra. Csak szám szerint tudunk változtatni (:-(), úgyhogy előbb nézzük meg a feadatcsoport számát.
A feladatkiírás módosítása
A legtisztább az, ha töröljük a feladatot, és kitűzzük újra (azonos névvel). Ezt csak a Teszt feladatcsoportba tartozó feladatokkal tegyük meg nyugodt szívvel, mert törléskor minden infó elvész (beleértve a már beküldött megoldások összes adata).
Ha csak apró módosításokat akarunk végezni, akkor az rootként a sioweb szerveren a /vol/sio
könyvtárban tehetjük meg. Keressük meg a feladat rövid nevét tartalmazó fájlneveket. Érdemes a módosításokat az archív fájl alapjául szolgáló fájlokban elvégezni, és csak felmásolni a módosított fájlokat (bárcsak automatikus lenne). A módosítás után semmit nem kell újraindítani. Ha módosítottuk a teszteseteket, akkor a webes felületen kérjük az adott feladat újraértékelését.
Hasznos mappák a sioweben:
-
/vol/sio/data/versenynév/rövidnév
: itt vannak a .par, .run, .in és .out fájlok. Ezek már egységesre át lettek nevezve. -
/vol/sio/files/contests/versenynév
: itt vannak a rövidnév.html fájlok -
/vol/sio/files/contests/versenynév/user_out
: itt vannak a klasszikus SIO által gyűjtött programkimenetek ZIP-elve. A gyűjtés nem alapból történik, az adott feladathoz (?) külön be kell állítani. -
/vol/sio/submits/versenynév/rövidnév
: itt vannak a hallgatók által beküldött megoldásfájlok. A fájl egységesre át van nevezve, nevében benne van a rövid név, a felhasználó azonosítója, és a megoldás azonosítója. Példa:
lcuc_u13_id41.c.
Feladat konvertálása klasszikus SIO-ból sziruupba
Mivel a klasszikus SIO kiértékelése bugos, időszerűvé vált az összes feladat konvertálása sziruupossá.
Azt, hogy egy feladat már sziruupos-e, megnézhetjük az info-jában (Adminra kattintva, tasks-ra kattintva, az adott feladat info-jára kattintva): akkor sziruupos, ha az Evaluation mode attribútum értéke Online contest with sziruup.
A konvertálás első lépéseként a sioweb szerveren rootként a /vol/sio/data/versenynév/rövidnév/
mappában hozzuk létre a szükséges rövidnév.run és rövidnév.par fájlokat. Ezeket másolhatjuk a double mintafeladatból is. Csak a rövidnév.par fájlt módosítsuk: állítsuk be az idő- és memórialimiteket. Ha szükséges (pl. eltérő limitek megadásakor), hozzuk létre a többi .par fájlt is, ugyanitt. A SIO webes felületén beállított limiteket is kézzel kell átvezetnünk.
Ha ez megvan, akkor értékeltessük újra az adott feladat már beadott megoldásait: Admin-ra kattint, new evaluation-re kattint, feladatot (Task) kiválaszt, többi mezőt nem változtat, Send gombra kattint. Várjunk egy kicsit (pl. rootként screenben figyelve), amíg a rendszer újraértékeli a megoldásokat.
Figyelmeztessük a hallgatókat a változásra e-mailben.
Sajnos nincs automatikus eszköz, ami kilistázná azon hallgatókat, akiknek épp a konvertálás miatt romlott el az összes OK-s megoldásuk.
Párhuzamos működés
A klasszikus SIO megoldásértékelője több értékelő szervert kezel párhuzamosan, és ha van értékelésre váró megoldás, akkor elküldi egy éppen ráérő értékelő szervernek. Sajnos néha beragad, ezért született a siowebena a /root/submitcheckd.sh
, ami beragadás esetén minden szerveren újraindítja a SIO-t.
A sziruup megoldásértékelője jóval egyszerűbb: az ütemező egyetlen értékelő szervert kezel. Az ütemező a sioweben fut /root/sziruup_evald.pl
néven. Kulccsal autentikált SSH kapcsolaton .tar fájlt küld a siowebre (benne a megoldással és a tesztesetekkel), ahol a sziruupevaluser felhasználó ~sziruupevaluser/evaluator/doeval1.sh
szkriptje fogadja.
A párhuzamos műkéshez szükséges kölcsönös kizárás sziruup esetén nem biztosított automatikusan (!). A sioweben nincs gond, ott -- a sebességcsökkenésen kívül -- nem okoz galibát több, párhuzamosan futó ütemező, a siotestrunon viszont egyes könyvtárakat (pl. /vol/sio/eval1dir
és /var/sziruup/chroot
) egyszerre akarnak használni, és nem fog működni, ha kettő fut egyszerre. (Ez persze visszahat a siowebre is, hiszen a kiértékeléseket a sioweben futó ütemező indítja.)
Dokumentálandó még
(Ezek megírásával Áron ne foglalkozzon, neki van fontosabb feladata is.)
- TODO: feladatcsoportok definiálása
- TODO: klasszikus SIO miben különbözik, menüs állítgatások, újraértékelés, hiány