HazifeladatEllenorzoTeacher
Tartalomjegyzék |
Tájékoztató
Ez az oldal a Házifeladat Ellenőrző rendszer használatát írja le, hogy hogyan lehet feladatokat feladni, felhasználókat és kurzusokat kezelni.
Belépés
A rendszer maga egy leibniz-es felhasználón keresztül érhető el:
hazi@leibniz.math.bme.hu
Ide be lehet ssh-zni, scp-zni vagy a webmail-jébe belépni.
Mappaszerkezet
Ennek a felhasználónak a home mappájában a következőket találjuk:
~ ├───hazijavitorendszer │ ├───HW │ │ ├───feladat │ │ . │ │ . (többi feladat) │ │ . │ │ ├───main │ │ ├───validate │ │ ├───userinfo.tsv │ │ ├───auxiliary.py │ │ ├───off │ │ ├───feladattipus1 │ │ ├───feladattipus2 │ │ ├───... │ │ └───getsenderinfo │ └───mailsend-go_1.0.6_linux-64bit.deb ├───solution ├───logs ├───archive ├───test │ └───(itt lényegében a felette lévőnek egy másolata van) ├───digest_logs.sh ├───archive.sh ├───Dockerfile └───run.sh
Mit csináljunk
Hallgatók kezelése
Ezt lényegében a userinfo.tsv (tab-separated-values) fájl szerkesztésével tehetjük meg.
Formátuma:
email name course borbely@math.bme.hu Gábor Borbély info2,lecturer
- Minden sora egy felhasználó
- A felhasználók az email-címükkel vannak azonosítva, a nevük csak tájékoztató jellegű.
- Egy felhasználóhoz megadhatunk course-t, ami az általa látogatott kurzusok listája: egy vesszővel elválasztott lista.
- Egy kurzus neve csak latin alfanumerikus karakterekből állhat (szóköz, vessző, ékezetes karakter nem lehet benne) vagy alulvonásból (azaz regex \w+).
- A példában meg van adva egy lecturer csoport is a tanároknak.
- Ha több kurzusra is jár egy hallgató, akkor a kurzust egy vesszővel vagy szóközzel elválasztott listával adjuk meg.
- Ha egy hallgató többször szerepel a listában, akkor csak a legelső előfordulását vesszük figyelembe.
- Régi hallgatókat nem érdemes kitörölni, ha a kurzusa évszámmal is meg van jelölve.
- például a kurzus info2_2019 nem fog összeakadni az info2_2020 kurzussal
- de ha valaki másodszorra hallgatja az info2-t, akkor lehet két kurzusa: info2_2019,info2_2020
Ha a userinfo.tsv fájlt változtatjuk, akkor a módosítások csak akkor jutnak érvényre, ha újra build-eljük a docker image-et
cd ~ && docker build -f Dockerfile -t hazicp hazijavitorendszer
Feladatok felvétele
Egy feladatot a hazijavitorendszer/HW/ mappában lévő mappa definiál.
- a mappa neve a feladat neve
- almappákat nem vesz figyelembe a rendszer, ezen belül nem lehet más almappa
- kell legyen egy manifest.json fájl a feladat mappájában
- kellenek tesztek a mappában
- minden teszt neve i betűvel kell kezdődjön
- a tesztek formátuma feladattípustól függ. lásd lentebb
Például a fahrenheit nevű feladat felvételéhez hozzuk létre az alábbiakat:
HW └───fahrenheit ├───manifest.json ├───i1.json ├───i2.json └───i3.json
manifest.json
A feladatot egy json dictionary írja le, az alábbi kulcsokkal:
- "type" a feladat típusa, kell legyen egy, a típussal egyező nevű, futtatható fájl a HW mappában
- "description" HTML source, json escaped, opcionális
- "course" mely csoportok küldhetnek be (lecturer-t mindig érdemes belevenni)
- ez lehet egy sztring, amiben vesszővel elválasztva vannak a kurzusok
- vagy lehet egy json lista:
"course": ["info2", "lecturer"]
ha nem adunk meg kurzust, akkor senkitől nem fogad el beküldéseket
- "visible" true vagy false
- ha false akkor ez a feladat nem fogad el beküldéseket
- "deadline" egy sztring, ami a határidőt írja le
- például "2020-02-14 01:00:00 UTC+1"
- Muszáj időzónát megadni (UTC+1 a budapesti)
- a python dateutils.parser.parse függvénye számára értelmezhető formátumban kell legyen
- "disclaimer"
- Ezzel megkövetelhetünk egy adott formátumú levéltörzset a beküldőtől.
- Használható arra, hogy muszáj legyen beírni a hallgatónak azt, hogy ő készítette a feladatot és nem másolt.
- Az értéke egy sztring kell legyen, amiben az alábbi behelyettesítéseket is megkövetelhetjük:
- {name}
- {email}
- {course}
- Például:
"disclaimer": "Én, {name}, felelősségem teljes tudatában kijelentem, hogy a mellékelt kód az én szellemi termékem, azt mással meg nem osztottam."
- A disclaimer többnyelvű is lehet, ha egy json listában több ilyen sztringet is megadunk.
- Ekkor az számít helyes beküldésnek, ha a levél törzse a megadott disclaimer-ek legalább egyikével megegyezik.
- De egyszerűen megadhatunk üres disclaimer-t is, aminek a következménye, hogy csak üres levelet fogad el feladat.
"disclaimer": ""
- Ha nincsen disclaimer kulcs a szótárban, akkor a levél törzse irreleváns.
feladattipus
Ahhoz hogy új feladattípust
Mit NE csináljunk
Az egész rendszer működésének lényege, hogy egy levél megérkezésekor lefuttatja a run.sh-t. Ez a script meg kell hogy kapja a beérkezett levél tartalmát. Lehet egy mappa neve, amiben benne van a levél és a csatolmányai, vagy fájlok egy listája.