Zde jsou závěrečný úlohy tohoto předmětu.

Deadline pro závěrečné úlohy je 10. července 2022. Posunutí deadline nebude možné.

Na odevzdání řešení využijte obvyklé repozitáře a držte se obvyklého pojmenování jak určuje název úlohy.

Pro většinu úloh je k dispozici částečné řešení od nás, se kterým můžete začít. Není to povinné, ale může vám to dost ulehčit start.

Očekáváme, že budete používat Gitové větve a nástroje jako je ShellCheck nebo Pylint abyste si usnadnili práci. Používání větví nebudeme explicitně kontrolovat, ale je to určitě dobrý návyk.

U některých úloh budeme také přiřazovat body za kvalitu implementace (pojmenování identifikátorů, vrstvy abstrakce nebo kvalit Gitových commit zpráv atd.).

Aktualizace

Tady je několik aktualizací k testům.

Testy jsou dostupné jako GitLabové CI (jak bylo obvyklé pro kvízy a úlohy ze cvičení).

Jako připomenutí: testy je možné pouštět lokálně. Předpokládáme-li, že jste si naklonovali váš repozitář student-LOGIN a repozitář s testy do stejného adresáře (takže máte např. ~/nswi177/student-LOGIN a ~/nswi177/tests), můžete spustit přímo .bats soubory z tests (příklady jsou u každé úlohy).

Nezpomeňte, že BATS umí -f pro filtrování testů, které jsou spuštěny. Což se také může hodit.

Důležitá poznámka: snažili jsme se testy napsat co nejrobustněji a co nejortogonálněji to šlo (takže třeba testy na náhledy nevyžadují funkční podporu pro motivy a naopka). Ale chyby tam pořád mohou být: pokud myslíte, že vaše řešení je ok a testy si myslí něco jiného, dejte nám, prosím, vědět: podíváme se na to.

Pokud si vytvoříte vlastní testy a chcete je dát k dispozici, dejte nám také vědět. S radostí je přidáme k naší sadě.

Naimplementujte jednoduchý generátor HTML galerií v Bashi.

Očekáváme, že uživatel si složky zorganizuje jako ve výpise níže. Po spuštění vašeho skriptu se vygenerovaná galerie objeví v podadresáři public_html.

.
├── albums
│   ├── 2021-09-airport
│   │   ├── dsc00045.jpg
│   │   ├── dsc00097.jpg
│   │   └── dsc00122.jpg
│   ├── 2022-04-bicycles
│   │   ├── img0001.jpg
│   │   └── img0017.jpg
│   └── 2022-05-mountain-trip
│       ├── HEADER.md
│       └── 00001.jpg
├── gallery.rc
└── HEADER.md

Jak lze odhadnout z výpis výše, galerie je organizovaná do složek, která jsou reprezentovány jednotlivými adresáři v albums. Výsledné HTML vytváří samostatný adresář pro každé album, takže i výsledné URL vypadají rozumně.

Generátor navíc čte soubor HEADER.md, kde může být uložen extra obsah na úvodní stránku, který je zobrazen nad seznamem alb.

Uživatel může volitelně určit název celého webu pomocí konfiguračního souboru gallery.rc.

Několik ukázkových galerií je k dispozici v repozitáři s příklady. Fotky jsme ukládali v nízkém rozlišení i kvalitě, takže jsou soubory celkem malé, což by mělo trochu urychlit vývoj.

Můžete začít s naší implementací, která umí zjistit seznam alb a vygenerovat jednoduchou galerii pro každé album s pseudo-náhledy.

Váš úkol je rozdělen do několika podúkolů, kde každý se zaměřuje na jednotlivé aspekty skriptování. Většina podúkolů je zcela nezávislá (slyšíte ozvěnou Git větve?) a není potřeba je naimplementovat všechny pro dokončení předmětu.

Změna výstupní adresáře

Dovolte uživateli změnit adresář, do kterého se ukládají HTML soubory namísto výchozího public_html.

Uživatel bude moci nastavení změnit buď pomocí -d nebo --publish-dir argumentů na příkazové řádce s určením názvu adresáře (pokud adresář existuje, jeho obsah bude přepsán bez potvrzování). Druhou možností je pomocí proměnné publish_dir v souboru gallery.rc.

Určení adresáře na příkazové řádce má přednost před hodnotou v gallery.rc.

Očekáváme, že použijete getopt.

Podpora motivů

Naše řešení používá šablonu a styly uložené společně se skriptem. Přidejte podporu pro -t (nebo --theme-dir) na příkazové řádce nebo theme_dir volbu v konfiguračním souboru, pomocí které skript načte index.tpl.html a album.tpl.html z jiného adresáře.

Naše implementace využívá $data_files_dir k odkazování se na soubory ve stejném adresáři, jako je náš skript.

Řádná tvorba náhledů

Naše verze ve skutečnosti žádné náhledy negeneruje. Místo toho jen vytvoří tag <img>, který míří na původní soubor a přepíše mu atributy width a height.

Váš úkol je rozšířit skript, aby volal ImageMagickový program convert (vizte cvičení 05), který by obrázek doopravdy zmenšil a pak by odkaz mohl mířit na původní obrázek.

V prvních verzích klidně zmenšete obrázek na hodnoty od nás, do rozšířené verze nechte velikost určit uživatelem pomocí volby thumbnail_size v soubory gallery.rc.

ImageMagick umí změnit velikost napevno (tj. ignoruje poměr stran) nebo se s velikostí umí vejít do daného obdelníku (bez deformace). Pomocí file nebo identify (z ImageMagicku) můžete pak přečíst skutečnou velikost náhledu a vytvořit tak nezdeformované náhledy v HTML.

CSS od nás by mělo obrázky docela rozumně zalámat, pokud budou mít stejnou výšku.

Aktualizace: kvůli testům jsme museli podchytit jména souborů s náhledy. Plné obrázky mají být pořád pojmenovány jako 00000001.jpg atd., pro náhledy očekáváme pojmenování thumb.00000001.jpg.

Aktualizace: podívejte se na šablonu k testu pro více informací o tom, jak je velikost náhledu předána do šablony.

Aktualizace: očekáváme, že pro nastavení velikosti náhledu budete používat ImageMagickový formát, tj. 300x200 pro nastavení maximální velikosti (se zachování poměrů stran). Je také možné zadat jen x200 pro určení pouze výšky (opět se zachováním poměru). Je velmi pravděpodobné, že jste takhle už $thumbnail_size použily a váš skript bude i nadále fungovat.

Nastavení alba

Nechte uživatele nastavit každé album. Pokud skript uvidí soubor album.rc v adresáři s albem, načte specifické volby pro album.

Pokud je nastaven title, bude použit místo názvu adresáře pro název alba.

Pokud je určen front_image, měl by obsahovat relativní cestu k obrázku, který má být použit na úvodní stránce (místo první fotky).

Informace z EXIFu

Pokud soubor obsahuje EXIF detaily, měly by se objevit i v galerii. Přesný formát je definován testy, bude nás zajímat jen položka Date/Time Original.

Aktualizace: kvůli testům očekáváme, že tato informace bude uložená jako date_time v JSONu s meta-daty. Detaily jsou v této šabloně.

Aktualizace

Naše implementace potřebuje Pandoc s podporou pro --metadata-file (Pandoc 2.3, vydán v roce 2018). Toto issue na Foru pak obsahuje nápovědu pro aktualizaci na Ubuntu.

Také budete potřebovat, aby bylo nainstalované Tidy.

Následující příkaz může být použit pro otestování vašeho řešení (uvnitř student-LOGIN, předpokládáme klonování jak bylo zmíněno výše).

../tests/final/21/publish_dir.bats

Pro každou novou funkci je samostatný test. Je také možné je spustit všechny najednou pomocí následujícího příkazu.

bats ../tests/final/21/*.bats

22/ (templater) (500 bodů)

V této úloze vytvoříte kompletní Pythoní balíček, který půjde nainstalovat pomocí pip install git+ssh://....?subdir=22 (tj. očekáváme, že budeme mít soubor 22/setup.cfg).

Po instalaci přidá balíček skript nswi177-jinja-templater do $PATH, který umí pracovat s šablonami Jinja.

Opět je částečné řešení k dispozici od nás. Váš úkol bude jej převést na pořádný balíček (to je povinná část) a trochu ho rozšířit.

Jinja je šablonovací nástroj. Viděli jsme šablony v Pandocu: Jinja je mnohem mocnější nástroj na stejné téma. Jinje dáte šablonu a sadu proměnných a Jinja danou šablonu vykreslí: nahradí proměnné, expanduje cykly atd. jak je potřeba.

Hlavní část úkolu – konfigurace šablony – je už hotová. Opět je úloha rozdělena na menší části, které jsou z většiny nezávislé.

Řádné Pythoní balíčkování (povinné)

Podobně jako ve cvičení 11 je potřeba převést kód od nás na řádný Pythoní balíček.

Všimněte si, že pip install může dostat i cestu k podadresáři v rámci Gitového repozitáře a z něj pak instalovat (vizte příkaz výše).

Všechny testy začnou tím, že takto balíček nainstalují.

YAML hlavička (povinné)

Pokud se podíváte na příklad vstupu, uvidíte, že obsahuje hlavičku uzavřenou do ---. V ní jsou proměnné přiřazované ve formátu klíč: hodnota a seznamy jsou tvořené pomocí -.

To je tzv. YAML hlavička a definuje proměnné, které jsou k dispozici v šabloně. YAML je poměrně složitý formát a očekáváme, že použijete knihovnu pro jeho načtení.

Nicméně, extrakci bloku ohraničeného --- zvládnete asi sami, protože je to v podstatě jen jeden for cyklus.

Přidání makra arabic2roman

Skvělou vlastností Jinja je, že můžete snadno přidávat vlastní makra (pipes) a tím rozšířit funkce šablon.

Náš příklad obsahuje l2gal pro převod mezi litry SI soustavy a imperiálními galony.

Váš úkol je přidat makro arabic2roman, které převádí číslo na římské (tj. převede 12 na XII).

Požadujeme, aby tuto funkci řešila knihovna.

Vaše implementace má fungovat jen s kladnými celými čísly. Pro neplatný vstup vytiskněte NaN a vypište varování na standardní chybový výstup.

Přidání volby --use-us-gallons

Rozšiřte program o volbu --use-us-gallons (všimněte si, že používáme argparse), která přepne výpočet z imperiálních na americké galony.

Přidání volby -V pro další proměnné

Přidejte volbu -V pro přidávání dalších (stringových) proměnných. Volba může být zadána několikrát. Vždy bude její hodnota ve formátu klic=hodnota. Například:

nswi177-jinja-templater -V course=NSWI177 -V "name=Introduction to Linux" ...

Pokročilí uživatelé si mohou najít třídu action pro vytvoření chytřejší implementaci, která ukládá hodnoty do slovníku přímo.

Aktualizace

Testy (opět předpokládáme nastavení, jak bylo popsáno na začátku stránky) mohou být spuštěny pomocí:

../tests/final/22/templater.bats

Výše uvedené vytvoří nové virtuální prostředí pro každý test. To je perfektní volba pro CI, pro lokální vývoj je často lepší zůstat v aktuálním virtuálním prostředí (např. protože jste ještě nestačili aktualizovat závislosti v setup.cfg apod.).

Testy tudíž podporují NO_INSTALL, který přeskočí instalaci a jen přímo spouští nswi177-jinja-templater.

env NO_INSTALL=true ../tests/final/22/templater.bats

23/ (disk) (500 bodů)

Vaším úkolem je obnovit tři obrázky z poškozeného disku (obrazu). Některé obrázky jsou snadno přístupné, jiné budou vyžadovat trochu práce.

Můžete si budete chtít zopakovat vaše znalosti o správě disku ze cvičení 10.

Každý budete mít vlastní disk, který můžete stáhnout přes HTTP server na http://localhost:8080/23/ na stroji linux.ms.mff.cuni.cz.

Tip: použijte grafický prohlížeč pro přístup k této stránce.

Až soubory obnovíte, uvidíte, že každý obsahuje jedno slovo (vzdali jsme náhodná slova z českého slovníku).

Uložte toto slova do souboru x.txt kde x je první písmeno daného slova. Takže, pokud byste obnovili takovýhle obrázek, tak byste mohli třeba použít následující příkaz pro vytvoření souboru s řešením.

echo fedora >23/f.txt

Aktualizace

Ve skutečnost jeden z obrázků (měl by to být ten, který najdete jako první tím nejjednodušším způsobem) obsahuje také slova prvni heslo. Prosím, použijte jen to poslední slovo v tomto obrázku.