Kontr je antický odevzdávací systém, který se v PB071 používá od roku 2011. Autorem je Šimon Tóth, od roku 2017 jej udržuje Roman Lacko.
Pokud chcete kontaktovat správce Kontru, napište do vlákna Kontr v diskusním fóru IS MU nebo na e-mail kontr@fi.muni.cz. |
Jak Kontr kompiluje
Kontr používá pro kompilaci GCC ve verzi 11.4.1. Verzi zjistíte příkazem
kontr@aisa:~$ gcc --version
gcc (GCC) 11.4.1
...
Toto je taky výchozí verze překladače GCC na Aise. Pokud vidíte jinou verzi,
ověřte si, že jste skutečně na stroji Aisa (hostname
) a nemáte načten
nějaký modul:
kontr@aisa:~$ hostname
aisa.fi.muni.cz
kontr@aisa:~$ module list
Currently Loaded Modulefiles:
1) modules
Před kompilací nezapomeňte aktualizovat repozitář nebo nahrát na Aisu novou verzi řešení. |
Překlad pak probíhá takto:
-
Každý
SOUBOR.c
se nejdříve přeloží tímto příkazem:kontr@aisa:~$ gcc [EXTENZE] -std=c99 -pedantic -Wall -Wextra -Werror -c -o SOUBOR.o SOUBOR.c
kde
[EXTENZE]
jsou extenze povolené v zadání; kromě pátého a šestého úkolu nejsou obvykle povolené žádné. -
Program se pak přeloží do spustitelného souboru takto:
kontr@aisa:~$ gcc -o PROGRAM *.o [KNIHOVNY]
kde
[KNIHOVNY]
jsou knihovny povolené zadáním.
Program můžete přeložit stejným způsobem i v jediném příkazu takto:
kontr@aisa:~$ gcc [EXTENZE] -std=c99 -pedantic -Wall -Wextra -Werror -o PROGRAM *.c [KNIHOVNY]
Doporučujeme před odevzdáním vyzkoušet překlad na Aise včetně všech přepínačů. Argument „u mě překlad funguje“ nebude při hodnocení zohledněn.
Valgrind
Při většině testů se řešení spouští s programem valgrind
. Tento nástroj
kontroluje několik aspektů programu, zejména práci s pamětí, neincializovanými
proměnnými atd. Kontr jej obvykle spouští takto:
kontr@aisa:~$ valgrind --leak-check=full --track-fds=yes ./PROGRAM [PARAMETRY]
Valgrind program spustí a při běhu programu vypisuje nalezené chyby
na řádcích tvaru ==ČÍSLO==
. Typické chyby jsou např.
-
Použití neinicializované proměnné ve výpočtu, podmínce nebo cyklu.
==1234== Use of uninitialized value of size NN ==1234== Conditional jump or move depends on uninitialized value(s)
-
Čtení nebo zápis do regionu paměti, který programu nepatří.
==1234== Invalid read of size NN ==1234== Invalid write of size NN
Celkový počet chyb lze zjistit z posledního řádku
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Pokud program neuvolnil všechnu paměť nebo nezavřel všechny soubory,
vypíše Valgrind před koncem odstavec LEAK CHECK
.
Další informace k Valgrindu naleznete v manuálu. |
Chybové hlášky skriptu
Odevzdání není povoleno
Pokud odevzdávací skript
Odevzdávání domácího úkolu hwNN v režimu XYZ není povoleno studentům.
Odevzdávání úkolů se otevírá obvykle několik dnů po zveřejnění zadání. Sledujte vlákno pro daný úkol, o otevření budete informováni tam.
Časový limit
Tento domácí úkol byl v tomto režimu před krátkou dobou vyhodnocen.
Další odevzdání bude možné až po <ČAS>.
Aby se zabránilo vytížení Kontru častým odevzdáváním, odevzdání ve stejném režimu lze opakovat pouze po uplynutí limitu od posledního odevzdání.
Pokud ani po uplynutí lhůty nelze úkol odevzdat, napište správcům Kontru.
Podmínky pro odevzdání
Nesplnili jste podmínky pro odevzdávání úkolů.
Odevzdávání v tomto předmětu vyžaduje splnění nějakých předpokladů.
Podívejte se do pravidel předmětu, co máte dělat.
Pokud jste všechny podmínky splnili včas a dle zadání, a přesto
se při pokusu o odevzdání se objevuje tato zpráva, kontaktujte správce Kontru.
Pro předmět PB071 musíte mít splněný odpovědník z organizačních pokynů a pro odevzdání úkolu naostro musí existovat Merge Request.
Termín vypršel
Termín na odevzdání úkolu vypršel.
Termín odevzdání je kvůli férovosti mezi skupinami striktní. Nebere se ohled na zpoždění, a to ani v řádech sekund. Zkuste na dalším úkolu začít dříve.
Může se stát, že je v zadání uveden jiný čas. V takovém případě napište do vlákna se zadáním úkolu.
Pokud chcete odevzdat opravu úkolu, zkuste to později, úkol se pro opravy otevře cca 24 hodin po skončení odevzdávání. |
Repozitář neobsahuje .gitignore
Repozitář neobsahuje v kořeni soubor .gitignore.
Přečtěte si pravidla pro Git repozitář.
Odevzdání stejné verze řešení
Skript odevzdavam
při odevzdání informuje o posledním commitu v repozitáři
včetně zprávy a času. Navíc požaduje explicitně potvrdit kódem, že jste
srozuměni s tím, co děláte.
Odevzdání stejné verze se proto počítá jako další pokus.
Při commitu používejte smysluplné hlášky. |
Překročený limit velikosti repozitáře
Odevzdání bylo zamítnuto.
Repozitář překračuje povolenou velikost.
I přes všechna naše opatření se vám povedlo překročit velikost repozitáře. Protože Kontr svůj názor nezmění, máte dvě možnosti:
Jednodušší řešení s penalizací
Smazat velké soubory nestačí!
Pokud jste nějaké veliké soubory již nahráli do repozitáře v GitLabu, pak
jejich smazání pomocí |
-
Vytvořte si kopii repozitáře u sebe na disku.
-
Smažte repozitář v GitLab FI a znovu jej vytvořte podle návodu.
-
Naklonujte si nový repozitář.
-
Zkopírujte ze starého repozitáře všechny domácí úkoly.
-
Pečlivě zkontrolujte všechny adresáře (včetne skrytých) a smažte příliš velké nebo nepotřebné soubory. Kontrolujte přitom
git status
. -
Udělejte
git commit
a `git push`. -
Napište e-mail správcům s žádostí o opravu repozitáře.
Na posun termínu není v tomto případě nárok!
Správci Kontru se snaží odpovídat do 24 hodin, ale tuto lhůtu garantovat nelze. Pokud si repozitář rozbijete pár hodin před koncem odevzdávání a správci váš repozitář nestihnou opravit, nevzniká žádný nárok na posun termínu ani na odevzdání navíc. |
Řešení s možností odpuštění penalizace
Tuto možnost lze využít pouze jednou. |
Tento návod vám pomůže odstranit z historie Git repozitáře nechtěné nebo příliš velké soubory. Návod je psaný pouze s využitím UNIXových nástrojů, proto pokud používáte Windows, bude lepší pracovat na Aise nebo ve virtuálním stroji.
Příkazy níže mohou váš repozitář rozbít a můžete přijít o uložená data. Pokračujte na vlastní odpovědnost. |
-
Než vůbec začnete, vytvořte si kopii repozitáře!
-
1 Zrušte z repozitáře všechny vzdálené reference.
for REMOTE in $(git remote); do git remote remove $REMOTE done
-
2 Proveďte čištění repozitáře.
git gc --aggressive
-
3 Najděte packfile, zajímá vás název
pack-HASH
bez přípony, který bude dále označován jako$PACK
. Těchto souborů může existovat více.tree .git/objects/pack/
-
4 Pro každý packfile vypište setřízeně všechny objekty. Vyberte ty, které se jeví největší a u kterých víte, že je z repozitáře chcete odstranit. Jejich hash bude dále označován jako
$BLOB
.git verify-pack -v $PACK | grep -v chain | sort -k3rn
-
5 Zjistěte, které commity obsahují vybrané soubory.
$BLOBS
nechť označuje řetězec($BLOB1|$BLOB2|…)
, kde$BLOBn
jsou hashe z předchozího kroku.git log --format='%H %T' main | while read COMMIT TREE; do if git ls-tree -r $TREE | grep -qE $BLOBS; then echo $COMMIT fi done | sort | uniq
-
6 Z vypsaných commitů vytvořte řetězec
(COMMIT1|COMMIT2|…)
, který bude označen jako$COMMITS
, a nalezněte jejich společného předka. Toho označíme jako$ANCESTOR
.git log --format='%H' | grep -EA1 $COMMITS | tail -1
-
7 Spusťte rebasing.
git rebase -i $ANCESTOR HEAD
-
8 Otevře se editor, ve kterém nahraďte všechny výskyty
pick
na začátku řádku slovemedit
. Změny uložte a ukončete editor. -
9 Teď opakujte následující kroky, dokud rebasing neskončí úspěšně.
-
Zkontrolujte repozitář (např. příkazem
tree -sh
) a všechny nepotřebné soubory odstraňte příkazemgit rm
. -
Zavolejte
git rebase --continue
.
-
-
10 Pokud vše proběhlo v pořádku, nastavte nový konec větve
main
:git branch -f main HEAD git checkout main
-
11 Odstraňte všechny nedosažitelné objekty a vyčistěte repozitář.
git reflog expire --expire=all --all git gc --prune=now --aggressive
-
12 Teď zkontrolujte, že velikost adresáře
.git
je pod limitem:du -sh .git
Pokud tomu tak není, neodstranili jste všechny soubory nebo je něco špatně. Začněte znovu, případně zkuste hledat pomoc na fóru.
-
13 V GitLabu FI v nastavení repozitáře zrušte ochranu větve
main
(hledejte nastavení Protected branches). -
Nahrajte novou historii.
git push --force
-
14 Znovu zapněte ochranu větve
main
. -
Hotovo. Teď napište e-mail správcům Kontru. Změnili jste sice historii, ale pokud jste to udělali správně, penalizaci vám odpustí.