Poslední aktuality jsou v issue #50 (z 20. dubna).
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.
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).
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
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.cznebo 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.
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í
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,bcnebosort. - Používat přesměrování vstupu/výstupu.
- Iterace skrz řádky souboru pomocí
while read ...; do ...; done < input.txt. - Použití konstrukce
if,forawhile. - Použití
testnebo[pro ovládání smyček a podmínek v shellu. - Zachycení standardního výstupu skrze
$( cmd ). - Vkládat externí skripty pomocí
sourceor.(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)
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
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
Makefilese 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 ...)
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
- První (reakce na fóru) (do 2026-03-08)
- Druhý (Git po SSH s klíči) (do 2026-03-22)
- Třetí (regulární výrazy) (do 2026-05-03)
- Čtvrtý (procesové signály) (do 2026-05-10)
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.
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.
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.
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.
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í.
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é.
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.