Nedávný update GitLabu přinesl několik přejmenování. Nejvýraznější změnou pro nás je zobecnění Issues na Work items. Úpravy materiálů reflektující tyto změny se pokusíme provést co nejdříve.

Tato stránka popisuje, jak budou vypadat testy na cvičeních a časem bude obsahovat i popis (velké) domácí úlohy.

Podívejte se, prosím, na stránku průvodce předmětem, kde najdete podrobnosti o tom, jak funguje hodnocení jako takové.

Testy na cvičení

Toto je rozpis testů na cvičení. Test proběhne na začátku cvičení (doba trvání testu je 45 minut).

Týden (datum) Téma
09 (13. dubna - 17. dubna) T01: Verzovací systém Git
12 (4. května - 7. května + 15. května) T02: Skriptování v shellu
14 (18. května - 22. května) T03: Sestavovací nástroj make

Očekává se, že se dostavíte na cvičení, na které jste zapsáni.

Protože 8. května je státní svátek, písemka T2 bude pro páteční cvičení odložena o týden. Víme, že to není nejlepší řešení, ale rozvrh pro tenhle semestr v podstatě nemá žádný celý týden (tj. kdy probíhá výuka ve všech dnech) v druhé polovině semestru.

Test se bude psát na školních počítačích. Ujistěte se, že se tam můžete přihlásit.

Můžete používat naše webové stránky, off-line manuálové stránky a můžete nahlížet do svých poznámek a řešení příkladů, které jsou součástí našich materiálů.

Nesmíte používat žádná jiná zařízení (mobilní telefony, vlastní notebooky atd.), nahlížet do jiných on-line zdrojů (stroje budou mít stejně omezený přístup k internetu) ani sdělovat své řešení ostatním studentům (a naopak).

Pokud používáte správce hesel pro váš účet u CASu/SISu, prosím, napište si heslo na papír nebo ho dočasně změňte na nějaké, které si můžete zapamatovat po dobu trvání zkoušky.

(Povolit použití telefonů/notebooků/… jen na začátku zkoušky přináší příliš mnoho problémů pro celkovou organizaci. Za komplikace se omlouváme.)

Jinými slovy, testy na cvičení vyžadují, abyste dokázali řešit úkoly samostatně pouze s pomocí technické dokumentace.

Prosím, nechte svoje zařízení ve vašich batůžkách během zkoušky a odložte batohy vpředu u tabule nebo na jiném viditelném (ale nedosažitelném) místě, abychom mohli zajistit rovné podmínky pro všechny. Moc děkujeme!

Jakýkoli pokus o obejití výše uvedených pravidel (např. pokus o použití AI asistenta na mobilním telefonu) znamená okamžité neúspěšné ukončení předmětu.

Pokud zadání nerozumíte, můžete samozřejmě požádat učitele o dovysvětlení. Pokud je zřejmé, že se ubíráte správným směrem a potřebujete jen trochu postrčit, můžeme vám i lehce poradit.

Prosím, podívejte se též na obecné zásady v průvodci předmětem.

Průběh zkoušky

Vaše řešení bude odevzdáno prostřednictvím Gitového repozitáře: ujistěte se, že umíte provést klonování prostřednictvím příkazové řádky.

Písemka proběhne na školních počítačích. Během zkoušky budete používat dočasný účet: nebudete mít přístup k žádným vašim souborům z domovského adresáře na AFS. Na začátku zkoušky si vygenerujete nový SSH klíč, nahrajete ho na náš keyserver a potom si naklonujete Gitový repozitář s vlastní písemkou.

Extra tip: nechte váš dočasný SSH klíč bez passphrase. Bude stejně funkční jen během 45 minut zkoušky a bez passphrase budou síťová akce přeci jen rychlejší.

Dočasný účet na školních strojích bude připraven na zkoušku. Budou k dispozici určité zkratky (vizte, prosím, níže) pro snazší přístup k repozitářům, které budete potřebovat. Pro vlastní nastavení budete muset provést nějaké akce navíc.

Protože budete nahrávat vaše řešení do Gitového repozitáře v Gitolite (s ním jsme pracovali během cvičení 05), budete mít k dispozici alias exam. Takže budete moci klonovat repozitáře jen pomocí volání

git clone exam:REPO

namísto

git clone gitolite3@linux.ms.mff.cuni.cz:REPO

Podobně, pro nahrávání vašeho SSH klíče (který si vygenerujete na začátku zkoušky) budete moci použít zkratku

ssh-copy-id keyserver

namísto

ssh-copy-id -p 2222 LOGIN@linux.ms.mff.cuni.cz

Budete mít též k dispozici přístup k repozitáři config-LOGIN (ale jen pro čtení), kde si budete moci uložit vaše úpravy shellu a Gitu (např. aliasy, vlastní prompt apod.).

Do config-LOGIN si můžete též uložit vaše poznámky, takže si je nemusíte tisknout. Neukládejte tam nic, co by mohlo porušovat pravidla předmětu (to například zahrnuje AI agenta nebo řešení zkoušky od kolegy). Prosím, udržte velikost tohoto repozitáře v rozumných mezích (pod 5MB). Děkujeme.

Detailní informace o repozitáři config-LOGIN je na samostatné stránce.

Můžete zkusit spustit ssh-copy-id -p 2222 LOGIN@linux.ms.mff.cuni.cz klidně před zkouškou pro vyzkoušení, ale stejně si budete muset během zkoušky vygenerovat nový klíč.

Poznámky k úloze na Git CLI

Informace pro zapsané na speciální páteční cvičení 25bNSWI177x13.

Pokud váš SIS/GitLab-ový login začíná na [a-j], přijďte, prosím, v 8.50; pokud váš login začíná na [k-z], prosím, přijďte v 9.40.

Pokyny ke zkoušce budou vytištěné. Budou obsahovat i nápovědu k vygenerování SSH klíče a jak ho nahrát na náš keyserver.

Očekáváme, že zvládnete následující úlohy pomocí Gitu na příkazové řádce.

  • Nastavit si prostředí Gitu (autor a e-mail)
  • Naklonovat repozitář (z gitolite3@linux.ms.mff.cuni.cz nebo obecně přes HTTPS)
  • Vytvořit commit
  • Vytvořit větev
  • Přepínat mezi větvemi
  • Zmergovat větev (a vyřešit případné konflikty)
  • Nahrát změny (větve) na server

Nebudete muset napsat žádný skript tzv. od nuly, ale budete pracovat s repozitářem obsahujícím následující skript pro tisk jednoduchých sloupcových grafů do konzole. Budete v něm ale dělat drobné změny (třeba opravy překlepů), na správné místo v kódu vás ale vždy navedeme.

Zaměření zkoušky je na práci s Gitem, ale musíte být schopni provádět výše uvedené změny korektně. Jinými slovy, skript v Pythonu musí pořád fungovat (tj., pokud sice vytvoříte správně větev, ale skript skončí se syntaktickou chybou, je to zásadní nedostatek).
import argparse
import sys

def parse_config():
    args = argparse.ArgumentParser(description='Console bar plot')
    args.add_argument('--columns', default=60, type=int, metavar='N')
    return args.parse_args()

def load_input(inp):
    values = []
    for line_raw in inp:
        line = line_raw.strip()
        if line.startswith('#') or not line:
            continue
        try:
            val = float(line)
        except ValueError:
            print(f"WARNING: ignoring invalid line '{line}'.", file=sys.stderr)
            continue
        values.append(val)
    return values

def print_barplot(values, scale, symbol):
    for val in values:
        print(symbol * round(val / scale))

def main():
    config = parse_config()
    values = load_input(sys.stdin)
    if not values:
        sys.exit(0)
    coef = max(values) / config.columns
    print_barplot(values, coef, '#')

if __name__ == '__main__':
    main()

Poznámky k úloze na Shellové skriptování

Informace pro zapsané na speciální páteční cvičení 25bNSWI177x13.

Pokud váš SIS/GitLab-ový login začíná na [a-j], přijďte, prosím, v 8.50; pokud váš login začíná na [k-z], prosím, přijďte v 9.40.

Následující seznam zachycuje témata (konstrukty, příkazy, …) které byste měli znát ke zkoušce. Seznam není vyčerpávající (například neuvádíme všechny příkazy z našeho mini manuálu ale pokrývá všechny hlavní části.

  • Vytvoření krátké pipeline se základními nástroji jako cut, uniq, paste, bc nebo sort.
  • Používat přesměrování vstupu/výstupu.
  • Iterace skrz řádky souboru pomocí while read ...; do ...; done < input.txt.
  • Použití konstrukce if, for a while.
  • Použití test nebo [ pro ovládání smyček a podmínek v shellu.
  • Zachycení standardního výstupu skrze $( cmd ).
  • Vkládat externí skripty pomocí source or . (tečka).
  • Použít proměnné a funkce v shellu, abyste lépe zachytili tok dat.
  • Chápat zpracování argumentů pomocí getopts.
  • Využití základních regulárních výrazů pro vyhledávání (grep) nebo triviální nahrazování (pomocí sed)
Své řešení budete opět odesílat přes Gitový repozitář (jako při T01). Ujistěte se tedy, že si pamatujete základy Gitu (nebudete potřebovat větve, ale bez znalosti alespoň clone, commit a push řešení neodevzdáte).
Pokud to nebude výslovně povoleno, nemůžete během implementace přejít do jiného jazyka (například Python, AWK nebo PERL). Jinými slovy, není dovoleno odevzdat řešení jako python3 -c 'import sys; for line in sys.stdin ....

Formát zkoušky se bude řídit tímto vzorem. Obdržíte téměř kompletní řešení určitého úkolu. Vaším úkolem bude implementovat chybějící funkce k dokončení úkolu.

Zadání bude rozděleno do různých funkcí shellu, které budete implementovat. Poskytneme vám několik základních (automatizovaných) testů, které budou kontrolovat správnost jednotlivých funkcí (tj. i když se doporučuje přečíst si celý skript, abyste pochopili jeho účel, bude možné některé funkce implementovat izolovaně).

Kód se kterým budeme pracovat, včetně ukázkových úloh a automatických testů, je dostupný na gitolite3@linux.ms.mff.cuni.cz:t02-example v podadresáři 2026.

Během písemky budeme pracovat se stejným základem, ale pro každé cvičení v něm budou drobné modifikace pro jednotlivé úlohy.

Prosím, využijte tuto příležitost se s kódem seznámit (základ bude vždy stejný) nebo se podívat, jak fungují testy. Může vám to ušetřit nějaký čas při písemce a dovolit vám se ihned zaměřit na to důležité místo luštění, kde jsou které soubory.

V témže repozitáři je také podadresář archive s písemkami z loňska na procvičování. Staví na jiném kódu, ale plánujeme mít zhruba stejnou složitost.

Poznámky k úloze na sestavovací nástroj make

Informace pro zapsané na speciální páteční cvičení 25bNSWI177x13.

Pokud váš SIS/GitLab-ový login začíná na [a-j], přijďte, prosím, v 8.50; pokud váš login začíná na [k-z], prosím, přijďte v 9.40.

Očekáváme, že zvládnete následující úlohy s Makefile (některé budete muset provádět na vzdáleném stroji linux.ms.mff.cuni.cz).

  • Sestavit projekt (nebo jeho část) pomocí programu make
  • Pochopit dodaný Makefile
  • Provádět úpravy v Makefile
    • Opravit seznam závislostí
    • Opravit příkaz použitý pro daný cíl (target)
    • Sjednotit více pravidel do tzv. vzorových pravidel (pattern rule)
    • Přidat nový cíl do Makefile se správně odvozenými závislostmi
  • Vytvořit jednoduchý Makefile „z ničeho“ se závislostmi odvozenými z dodaných příkazů
  • Nebude potřeba používat nestandardní rozšíření jako je třeba $(addsuffix ...)
Své řešení budete opět odesílat přes Gitový repozitář (jako při T01). Ujistěte se tedy, že si pamatujete základy Gitu (nebudete potřebovat větve, ale bez znalosti alespoň clone, commit a push řešení neodevzdáte).

Příklady na vyzkoušení jsou v materiálech ke cvičení 10.


Navíc si ještě můžete naklonovat gitolite3@linux.ms.mff.cuni.cz:lab10-hp a vyzkoušet si převést na make projekt, který je zatím řízen jen shellovým skriptem.

Tento projekt využívá Translate Toolkit pro správu překladů a váš Makefile by se měl postarat o to, že soubory s překlady jsou správně aktualizovány. Další detaily jsou přímo v repozitáři.

Kvízy

Kvízy budou na cvičeních 02, 03, 04, 05, 06 a 07 (a 08 pro páteční paralelky).

Malé domácí úkoly

Velký domácí úkol: nastavení projektu

Nastavte CI pro Pythoní projekt a připravte ho na další distribuci. To zahrnuje následující úkoly (detaily vizte níže).

  • Převeďte zdroják na řádný Pythoní balíček.
  • Vytvořte GitLabový CI job pro pytest (po přimergování implementace a oprav).
  • Vytvořte GitLabový CI job pro BATS testy (po několika opravách a dalším Git merge).

Očekáváme, že k odstartování své implementace použijete externí nástroje, ale před odevzdáním musíte rozumět celému skriptu a musíte označit všechny části, které jste osobně nenapsali (a pokud používáte nástroje, jako je ChatGPT, musíte odeslat celý protokol komunikace s tímto nástrojem).

Kontext

V této úloze budete pracovat na jednoduchém Pythoním projektu, který je schopen vykreslovat Jinja šablony (instalujte balíček Jinja2, ne Jinja).

Jako jednoduchý příklad (který také najdete ve složce examples ve vašem repozitáři s projektem) může posloužit následující transformace.

Mějme následující pole (seznam) v JSONu:

[
  {
     "name": "Introduction to Linux",
     "code": "NSWI177",
     "homepage": "https://d3s.mff.cuni.cz/teaching/nswi177/"
  },
  {
     "name": "Linux Administration",
     "code": "NSWI106",
     "homepage": "https://d3s.mff.cuni.cz/teaching/nswi106/"
  }
]

Mějme následující vstupní soubor:

Our courses
===========

Below is a list of (almost) all of our courses.

A budeme mít tuto šablonu. Všimněte si, že řídící struktury šablony používají {% (nebo {%- pokud chceme odstranit okolní prázdné znaky) a {{ pro nahrazování proměnných.

{{ content }}

{%- for course in data -%}
 * [{{ course.name }} ({{ course.code }})]({{ course.homepage }}) {{ NL }}
{%- endfor %}

Očekáváme, že náš šablonovač (konkrétní příkaz je v README) po spuštění vypíše následující.

Our courses
===========

Below is a list of (almost) all of our courses.

* [Introduction to Linux (NSWI177)](https://d3s.mff.cuni.cz/teaching/nswi177/)
* [Linux Administration (NSWI106)](https://d3s.mff.cuni.cz/teaching/nswi106/)

Zdrojový kód

Zdrojáky výše uvedené implementace jsou pro vás již připravené a brzy budete mít přístup k novému projektu v podstromu teaching/nswi177/2026 na GitLabu, kde budete pracovat.

Nekopírujte tento kód do vašeho obvyklého repozitáře a pracujete jen s repozitářem project-LOGIN (s výjimkou ai.log jak je zmíněno níže).

Repozitář též obsahuje několik testů. Jsou tam unit testy v Pythonu (používající pytest) a také testy na vyšší úrovni (budeme jim říkat integrační ač je to trochu přehnané) napsané v BATSu.

Spuštění je popsáno v README projektu.

Commitujte pouze soubory, které jsou potřeba. Určitě nemá smysl commitovat adresáře virtual environmentu, podadresáře __pycache__ nebo Pythoní .egg a .whl soubory.

Zadání

Váš hlavní úkol je nastavit tomuto projektu základní CI na GitLabu a připravit ho pro distribuci.

CI musí spustit Pythoní unit testy a skončit chybou při jakémkoliv problému. Přípravou na distribuci míníme to, že po vašich změnách půjde šablonovač nainstalovat pomocí pipu a mít ho dostupný příkazem nswi177-jinja-templater.

Vaším úkolem není projekt dostat na PyPI ale pouze nastavit repozitář na GitLabu.

Jinými slovy, následující příkazy nainstalují šablonovač do nového virtuálního prostředí a spuštění posledního příkazu vypíše krátkou nápovědu k našemu programu (předpokládáme, že jsme v prázdném adresáři, který nijak nesouvisí s klonem projektu).

python3 -m venv templater-venv
. ./templater-venv/bin/activate
pip install git+ssh://git@gitlab.mff.cuni.cz/teaching/nswi177/2026/project-LOGIN
nswi177-jinja-templater --help

A pro CI očekáváme, že váš projekt bude mít úlohu unittests, která spouští Pythoní testy.

Prosím, dbejte na to, aby se CI job skutečně jmenoval unittests a umístěte veškerou konfiguraci do jediného .gitlab-ci.yml souboru.

CI by mělo používat obraz python:3.13-alpine a měli byste instalovat verze z requirements.txt souboru. Očekáváme, že pytest (a možná další knihovny potřebné pro testy) nebudou v requirements.txt, ale raději uvnitř souboru requirements-dev.txt.

Určitě si všimnete, že testy neprocházejí, protože některé z Jinja filtrů nejsou naimplementovány.

Ale nestrachujte se. Vaše kolegyně Alice je už naimplementovala ve své větvi v repozitáři gitolite3@linux.ms.mff.cuni.cz:templater-alice.

Zaintegrujte (merge) její implementaci do vašeho repozitáře, abyste měli implementaci kompletní.

Mergování je povinnou částí úlohy a očekáváme, že provedete normální merge (možná jen fast-forward) a nikdy neprovedete tzv. rebase.

Pokud jste vše udělali správně, váš CI log bude vypadat zhruba takto (ze zřejmých důvodů jsou použité příkazy rozmazané).

Poté rozšíříte CI tak, aby též spouštělo BATS testy.

Očekáváme, že přidáte nový job nazvaný integrationtests, který nainstaluje daný balíček (takže bude fungovat příkaz nswi177-jinja-templater) a spustí všechny BATS testy z podadresáře tests (jak si asi vzpomínáte, tak pouhé pip install . by mělo zafungovat úplně skvěle).

Pro unittests byste měli instalovat závislosti z requirements.txt pro co nejlepší reprodukovatelnost, zatímco pro integrationtests instalujeme celý balíček, čili typicky z volnějšími požadavky na přesné verze závislostí.

Budete muset nejdřív doinstalovat bats pomocí apk add (je v pořádku instalovat tento balíček při každém spuštění CI).

Všimněte si, že současná implementace v common.bash volá program pomocí env PYTHONPATH=src python3 -m nswi177.templater – zmeňte volání jen na nswi177-jinja-templater. Také budete muset nahradit volbu --kill-after za -k v příkazu timeout, protože dlouhá varianta není na Alpine podporována.

Množství BATS testů není příliš velké, takže byste také měli přimergovat práce od kolegů Boba a Charlieho do vašeho repozitáře. Jako obvykle, proveďte normální merge a nikoliv rebase při slučování jejich práce.

Bob má repozitář na gitolite3@linux.ms.mff.cuni.cz:templater-bob zatímco Charlie dal svojí kopii na náš web na https://d3s.mff.cuni.cz/f/teaching/nswi177/202526/templater-charlie.git.

V případě konfliktů se ujistěte, že jste je vyřešili rozumně – rozhodně nechcete žádný z testů mazat, pokud nejsou úplně stejné.

Abychom shrnuli podčásti k řešení, možná vám pomůže tento seznam.

  • Přimergujte implementaci od Alice.
  • Nastavte pyproject.toml, setup.cfg a requirements.txt (a requirements-dev.txt) pro projekt project-login na GitLabu.
  • Nastavit CI na GitLabu tak, aby spouštělo Pythoní testy v úloze (job) unittests.
  • Přimergujte testy od Boba a Charlieho.
  • Opravte spuštění příkazu v BATS testech.
  • Opravte volání timeout, aby bylo timeout -k 30 "${timeout}" "$@".
  • Přidejte CI job integrationtests, který spustí všechny BATS testy.

Odevzdání a hodnocení

Odevzdejte svá řešení do repozitáře project-LOGIN na GitLabu.

Budeme kontrolovat, že projekt jde nainstalovat pomocí pip install git+https://gitlab.../project-LOGIN/ a že vaše konfigurace CI je v pořádku (po všech mergech by se mělo vše zelenat). Zkontrolujeme, že Pythoní kód může být spuštěn pomocí python3 -m src.nswi177.templater po instalaci závislostí skrz pip install -r requirements.txt (nebo pomocí python -m nswi177.templater pokud je přímo samotný balík také nainstalovaný) a že Pytesty mohou být spuštěny po instalaci z requirements-dev.txt.

Při kopírování fragmentů ze stránek, jako je StackOverflow, očekáváme, že je okomentujete přímo v příslušných zdrojácích. Komunikaci se stránkami řízenými umělou inteligencí uložte do souboru exam/project/ai.log ve vašem obvyklém repozitáři (student-LOGIN), opět jako textový soubor s jasně označenými částmi s vašimi vstupy a s odpověďmi.

K dispozici budou též automatické testy (nad vašimi automatickými testy). Tyto testy budeme spouštět jednou za dne a jejich výsledek se objeví ve vašich $HOME na linux.ms.mff.cuni.cz.

(Počítáme s tím, že tyto testy budou připraveny do konce dubna.)

Výsledky těchto nočních testů jsou dávány „jen tak“: věříme, že jejich formát je dostatečně popisný na to, aby vás nasměrovaly na případná problematická místa vašeho řešení.

Termín odevzdání je 2026-05-31.

Úlohy ohodnotíme po termínu odevzdání. Prosím, nechtějte po nás ruční kontrolu: věříme, že zadání i testy jsou dostatečně přesné na to, aby vás vedly ke správnému řešení i bez naší pomoci.

Pokud potřebujete předmět uzavřít dříve (např. kvůli státnicím), prosím, obratem se nám ozvěte.

Prosím, ujistěte se tedy (třeba pomocí seznamu výše), že jste na žádnou část nezapomněli. V zadání nejsou žádné skryté pasti nebo triková řešení, jen je potřeba splnit všechny části zadání.