HazifeladatEllenorzoTeacher
(→Mit csináljunk) |
|||
53. sor: | 53. sor: | ||
* Egy kurzus neve csak latin alfanumerikus karakterekből állhat (szóköz, vessző, ékezetes karakter nem lehet benne) vagy alulvonásból (azaz regex <tt>\w+</tt>). | * Egy kurzus neve csak latin alfanumerikus karakterekből állhat (szóköz, vessző, ékezetes karakter nem lehet benne) vagy alulvonásból (azaz regex <tt>\w+</tt>). | ||
** A példában meg van adva egy <tt>lecturer</tt> csoport is a tanároknak. | ** A példában meg van adva egy <tt>lecturer</tt> csoport is a tanároknak. | ||
− | * Ha több | + | * 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. | * 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. | * Régi hallgatókat nem érdemes kitörölni, ha a kurzusa évszámmal is meg van jelölve. | ||
** például a kurzus <tt>info2_2019</tt> nem fog összeakadni az <tt>info2_2020</tt> kurzussal | ** például a kurzus <tt>info2_2019</tt> nem fog összeakadni az <tt>info2_2020</tt> kurzussal | ||
+ | ** de ha valaki másodszorra hallgatja az info2-t, akkor lehet két kurzusa: <tt>info2_2019,info2_2020</tt> | ||
Ha a <tt>userinfo.tsv</tt> fájlt változtatjuk, akkor a módosítások csak akkor jutnak érvényre, ha '''újra <tt>build</tt>-eljük a <tt>docker image</tt>-et''' | Ha a <tt>userinfo.tsv</tt> fájlt változtatjuk, akkor a módosítások csak akkor jutnak érvényre, ha '''újra <tt>build</tt>-eljük a <tt>docker image</tt>-et''' | ||
68. sor: | 69. sor: | ||
* almappákat nem vesz figyelembe a rendszer, ezen belül nem lehet más almappa | * almappákat nem vesz figyelembe a rendszer, ezen belül nem lehet más almappa | ||
* kell legyen egy <tt>manifest.json</tt> fájl a feladat mappájában | * kell legyen egy <tt>manifest.json</tt> fájl a feladat mappájában | ||
− | * kellenek tesztek a mappában | + | * kellenek tesztek a mappában |
− | ** minden teszt neve | + | ** minden teszt neve '''<tt>i</tt>''' betűvel kell kezdődjön |
** a tesztek formátuma feladattípustól függ. [[HazifeladatEllenorzoTeacher#feladattipus| lásd lentebb]] | ** a tesztek formátuma feladattípustól függ. [[HazifeladatEllenorzoTeacher#feladattipus| lásd lentebb]] | ||
81. sor: | 82. sor: | ||
└───i3.json | └───i3.json | ||
− | === manifest === | + | === 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 <tt>HW</tt> 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"''' <tt>true</tt> vagy <tt>false</tt> | ||
+ | ** ha <tt>false</tt> akkor ez a feladat nem fogad el beküldéseket | ||
+ | * '''"deadline"''' egy sztring, ami a határidőt írja le | ||
+ | ** például <tt>"2020-02-14 01:00:00 UTC+1"</tt> | ||
+ | ** '''Muszáj időzónát megadni''' (UTC+1 a budapesti) | ||
+ | ** a python [https://dateutil.readthedocs.io/en/stable/parser.html 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 == | == feladattipus == |
A lap 2020. február 14., 17:50-kori változata
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.