Kontr

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:

  1. 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é.

  2. 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.

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í git rm nestačí. Tyto soubory zůstanou nadále uložené v historii Gitu a zabírají místo (i když jsou komprimované). Jedinou možností je skutečně smazat repozitář nebo opravit historii.

  • 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 slovem edit. 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říkazem git 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í.