e-x-a.org » NSWI095 Úvod do UNIXu

Informace o cvičení k přednášce Úvod do UNIXu na MFF.

  • Pravidelný sraz: MS MFF, SU2, každé úterý v 15:40. 2015/16 LS
  • V případě čehokoliv mi napište mail na exa.exa@gmail.com
  • Ke čtení:
    • Knížka Libora Forsta “Shell v příkladech” jde půjčit v knihovně (dostupné množství se před zkouškovým výrazně ztenčuje)
    • Advanced Bash Scripting Guide
    • StackOverflow (s rezervou!)
    • Po internetu se povaluje hromada materiálu typu ‘Sed by example’, ‘Awk by example’, ‘vimtutor’. Manuálové stránky jsou taky online.

Průběžné výsledky

Tabulka s docházkou a spol.

Požadavky k zápočtu

Zápočet je potřeba k přihlášení na zkoušku, všichni by ho měli dostat ideálně do začátku zkouškového. Předem upozorňuju, že přes zkouškové a v září budu k dispozici tak napůl.

Zásadním účelem zápočtu je zajistit, že až půjdete ke zkoušce, tak odejdete s úspěchem a zkoušející z toho nebude muset mít těžkou hlavu a černé myšlenky. O této schopnosti mě můžete přesvědčit jakýmkoliv dostatečně rigorózním způsobem, doporučené postupy jsou ale tyto:

  • Spolehlivá metoda: kombinace domácích úkolů, zápočťáku a docházky. Zápočet dostanete ihned po splnění podmínek, nejpozději ale cca na začátku září.
    • Domácí úkoly zadané na cvičení jdou odevzdat do začátku dalšího cvičení, řešení mi pošlete v nějaké lidské podobě e-mailem a do předmětu dejte prefix DU-NSWI095 a vaše jméno. Odevzdejte jich aspoň polovinu (s nějakým rozumným rozložením, ideálně aby aspoň polovina odevzdaných úkolů byla ze složitějších případů z druhé poloviny semestru).
    • Zápočťák je jakýkoliv program který implementuje něco zajímavého/užitečného/zábavného v shellu, není k dispozici v miliardě kopií na internetu a má rozumný rozsah. Na tématu je ideální se domluvit začátkem května je potřeba se domluvit cca do konce dubna. Ideální rozsah je něco, co je napsané za odpoledne a testováním a procházením zdrojáku nestrávím víc, než cca 15 minut.
    • Docházky potřebujete aspoň 66.6%. Pokud budete mít míň, doplníme to nějakým mikro testem na hodině.
  • Rychlá a těžká metoda: Pokud se nechcete zdržovat s něčím co už umíte, můžete na jednom z prvních cvičení napsat těžkou písemku spočívající ve vypracování nějakého pitoreskního ale zvládnutelného zadání v shellu/sedu/awku v časovém limitu cvičení. Zápočet za zvládnutí a rozumný kód je okamžitý.

BONUSY: půl “náhradního” bodu k docházce nebo náhradu poloviny domácího úkolu lze získat za aktivitu při hodině nebo splnění bonusů domácích úkolů. Na jednom z posledních cvičení bude možnost napsat menší písemku, která bude ohodnocena 0 až 6 bonusy.

Témata na zápočťáky

Téma zápočťáku je potřeba dohodnout do 22. 4. 2016. Pokud chcete vyloženě lehké téma které nezabere víc času než průměrný domácí úkol, posbírejte bonusy za DÚ a aktivitu, za každý je úleva. Pokud jste už vytvořili něco jiného co s UNIXem souvisí, neváhejte to použít taky jako zápočťák, k účelu ověření že jste schopní produkovat unixový software to většinou stačí.

VHODNÉ:

Rozsah: orientačně cca nad 100 a pod 400 řádků kódu. Víc není problém, ale hrozí, že toho bude zbytečně moc. Míň taky není problém, pokud kód bude dostatečně funkčně nahušťěný (nebo máte dost bonusů).

Témata:

  • zábavné náhrady nějakých shellových příkazů (simple parallel make, tiny almost-git, ...)
  • databázoviny
    • systém na evidenci nějakých věcí (knihovna, fotbalova liga, ...) s “konzolovým” “user” “interfacem”
    • mailing list management daemon
  • časoviny a kalendářoviny
    • ToDo manager
    • miniaturní cron daemon
    • kreslítko kalendáře, v něčem lepší než standardní cal
  • hry
    • textové hry
    • multiplayerové hry (piškvorky, chat, MUD, ...) pomocí netcatu
    • něco co kreslí do termináli skoro grafiku (inspirace viz. rash, 0verkill, nethack)
  • zálohovací nebo verzovací věci (viz. rdiff-backup apod.)
  • programování
    • zvýrazňovače, zarovnávače, zkrášlovače a čističe kódu
    • interpretery, např. interpret Logo (želvičky) nebo něčeho podobného (robot karel?) — vhodné, rychlé a jednoduché řešení je přepsáním zdrojáku do bashového skriptu a spuštěním výsledku
    • build systémy/balíčkovače (např. něco co pro projekt v C++ vygeneruje přenosný Makefile, (anti)inspirace viz. autotools a m4)

NEVHODNÉ:

  • cokoliv co jde vygooglit v několika kopiích
  • zadání které nepochopím do 3 minut
  • řešení které celé nepřečtu do 15 minut

ÚLEVY:

Zápočťák napsat musíte, je potřeba prokázat, že dáte dokupy standartně se chovající program. Dostatkem bodů za aktivitu/bonusy ale požadavky můžete zmenšit na velikost značně podprůměrného domácího úkolu ve skriptu který zvládne správně zpracovat optiony a pak jen spustí něco jiného (třeba neexistujícího). Detaily níže.

Hodnocení zápočťáků

Hodnotí se následující aspekty:

  • (6) rozsah
  • (3) kvalita kódu (odsazování, komentáře, názvy proměnných, jde to přečíst/pochopit bez bolení očí/hlavy)
  • (3) dodržení UNIXové “slušnosti” v interfacu (tj. nahlášení chyby exit kódem, standartní reakce na standartní optiony (--help), chybové hlášky na stderr)
  • (2) absence programovacích chyb (tj. např. program nejde rozbít špatným vstupem)
  • (1) dodržení standartnosti v tom jak se program chová uvnitř (např. kde má uložená pevná data a konfiguraci, dočasná data, jestli správně používá ostatní programy)
  • (1) pokrytí funkcionality demonstrativním kódem a dokumentací (do minuty si to můžu úspěšně celé vyzkoušet)
  • (∞) nejdůležitější součást — odevzdání ve formě podle návodu dole

Zápočťák je OK, když v žádném bodě není velký problém. Číslo v závorce je počet bonusů, které musíte obětovat pokud chcete neúplný nebo nekvalitní (tj. “aspoň něco”) bod prohlásit za bezproblémový.

(Samozřejmě se to netýká případů typu “rozsah je přesně nula” nebo “programovací chyby jsou všude”. :D )

Jak odevzdat zápočťák?

Pošlete mi ho v balíku .tar.gz. Balík by měl obsahovat jediný adresář s názvem popisujícím vaše téma a jméno (např. drticka_virtualniho_odpadu_josef_novak/, v něm pak:

  • demo skript nebo README.demo — soubor který na nějakých mini testovacích datech ukáže co to umí, případně mi vysvětlí jak to spustit aby bylo do 2 minut vidět, že to funguje.
  • testovací data k předchozímu, pokud jsou potřeba
  • program (nebo víc programů), který kromě dohodnuté funkcionality správně reaguje na standartní option --help
  • README — dokumentaci která popisuje co program jak dělá. Součástí dokumentance je “programátorská dokumentace” a.k.a. “internals” a.k.a. “hacking guide”, popis vnitřního rozložení programu do celků, poskytovaných interfaců a držených invariantů mezi nimi, a popis toku dat skrz program. Struktura P.D. se liší program od programu, ale obecné pravidlo je, že programátor s podobnou úrovní jako autor by z ní měl během cca 15 minut a) zjistit co a jak dělá každá součást kódu programu, b) být schopný v programu udělat malou rozumnou úpravu funkcionality a nerozbít to. Komentáře nemusí být (v extrémně přehledných případech) potřeba, ale většinou je vhodné kód pořádně popsat. Dobrý systém komentářů výrazně zjednodušuje a zpřesňuje programátorskou dokumentaci.

Průběh cvičení

2016/02/23

Crash-course pozorování černého terminálu.

  • praktický pohled na unix a spojování programů
  • jak přesouvat soubory a adresáře
  • jak něco editovat ve vi

: Zkuste si vimtutor, hodí se to. Napište skript, který spočítá celkový počet řádek ve všech souborech aktuálního adresáře začínajících na písmeno a. Můžete předpokládat, že tam nejsou žádné adresáře. Návod: cat + * + wc, přečtěte si manuálovou stránku obou příkazů. Pravděpodobně jednořádkový výsledek mi pošlete mailem (zároveň to slouží jako kontrola mailových adres).

2016/03/01
  • Proměnné a expanze proměnných, quoting, parametry, lepší skripty. Bacha na mezery a speciální znaky.
  • Podivejte se na Advanced Bash Scripting Guide (viz hore) na sekci String operations
  • $promenna, `prikaz`, ${prom%.jpg}.gif, $(( aritmetika )), ...

DU: Na cvičení jsme měli skript, který postupně skompiluje soubor se zdrojákem v céčku (.c) na object code (.o) a nakonec na spustitelný soubor. Je to postupně zhruba: gcc -c zdrojak.c -o zdrojak.o ; gcc zdrojak.o -o program ; ./program. Napište skript, který v parametru dostane soubor.c který má skompilovat, a v případě selhání jednoho z volání gcc hezky napíše, že něco selhalo a ukončí se s nenulovým exit statusem (tj. “předá hlášení o chybě dál”).

Tedy např.:

  • Uživatel spustí ./skompiluj program.c
  • Skript udělá sekvenci operací viz. nahoře (pokud se něco rozbije, ohlásí to a nepokračuje)
  • Po zpracování se vedle objeví spustitelný soubor program

Prosím dejte pozor na správný předmět mailu (DU-NSWI095 $jmeno). Skript zkopírujte rovnou do textu, přílohovat netřeba.

Pozn.: Zapomněl jsem udělat docházku. Takže budeme předstírat, že tam byli všichni. Kromě někoho kdo první hodinu chtěl zápočet těžkou cestou, za velkou písemku, a nebyl tam. Což nevím kdo je, ale stejně by bylo super kdyby se ozval. :D

2016/03/08
  • T-kompletní programování v shellu ([test], if, for, while, case, &&, ||, “funkce”, (sub;shell)). Zpracování parametrů z příkazové řádky while a shift-em. Ukázka jak použít bc a grep.

: Napište skript, který vypíše jen dostatečně dlouhé řádky na vstupu. K řešení použijte následující hinty:

  • while read line ; do echo "$line" ; done
  • a=abcde ; echo ${#a}
  • Zpracovat samotný vstup jde poměrně triviálně i grepem nebo sedem pomocí regulárních výrazů, pokud vám nevadí načíst si to z manuálu, můžete to použít.

Skript by měl podporovat commandline optiony: -i <input_file> a -l <min_length> (samozřejmě v libovolném pořadí), pokud není specifikované -i, použijte standartní vstup.

(Pozn.: měl jsem v parametrech napsáno matoucí max_length místo min_length, opraveno.)

2016/03/15
  • Regex.
  • Dávkové zpracování textových dat vol. 1: cut, tr, sort, uniq, grep, sed.

: O tom jak se píšou regulární výrazy si můžete přečíst nějaké detaily v man 7 regex. Zkuste si vygooglit regulární výraz na matchnutí e-mailové adresy, nebo ten problematický číselný na celou IP adresu .

Hodnocený DǓ: Napište sedový příkaz (ideálně oneliner), který všechny (decimální) čísla ve vstupním textu vynásobí desítkou a zvládá obsloužít desetinnou tečku i čárku. Hint: když tam není desetinná tečka (ani čárka), stačí přidat nulu; když tam je, je potřeba to trochu rozkrájet a jedno číslo chytře přesunout.

Zbytek z hodiny 1: Důvod existence dvou rozdílných syntaxí regexu je zhruba ten, že v různých situacích se hodí backslashovat různé věci.

  • match něčeho co vypadá jako součet 2 funkcí:
    • f(.*)+g(.*) — basic syntaxe je kratší
    • f\(.*\)\+g\(.*\) — extended syntaxe má moc backslashů, protože nechceme použít speciální význam (,),+
  • match něčeho co vypadá jako IP adresa s vyparsováním čísel:
    • \([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\) — basic
    • ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) — extended je viditelně vhodnější

Poznámka: druhá “extended” syntaxe regexu (o které se taky dočtete v manuálu a ve které hlavně není potřeba backslashovat závorky apod atd.) se v grepu zapíná pomocí -E a v sedu pomocí -r.

Zbytek z hodiny 2: Sedem samozřejmě jde rozlamovat řádky. Na hodině to nešlo, protože jsem asi něco přehlídnul. Konkrétní syntax: sed 's/něco/\n/g'

2016/03/22
  • Jak použít regex ve vimu.
  • cut|tr|paste|sort|uniq -c|sort -n

: Stáhněte si data — anonymizovaný výpis provozu (txt, 6.2MB) z nějakého routeru, přes který na Vánoce těsně před obědem tekl internet. “Uživatelé” mají IP adresy začínající na “10.”, tj. například 10.1.2.3. Zbytek IP adres je “vnější internet”. Každý řádek prakticky odpovídá jednomu otevřenému spojení.

Napište:

  • skript, který data převede do nějaké rozumné CSV-like podoby, ve formátu unix_timestamp, protokol, zdrojová IP, zdrojový port, cílová IP, cílový port, počet bajtů. Dávejte pozor, že počet bajtů má někde suffix “M” — v tom případě ho vynásobte na bajty. Pořadí sloupců můžete rozumně modifikovat aby vyhovovalo dalším úkolům. (Hint: tr -s, cut, paste, čísla můžete nahradit sedem a bc, unix_timestamp vyrobíte pomocí date +%s -d ....)
  • skript, který z formátu připraveného v minulém kroku připraví seznam IP adres uživatelů, kteří provedli nejvíc kliknutí (tj. měli největší množství komunikací směřujících na ně a od nich, tj. jsou v obou sloupcích nejvíckrát). (Hint: cut, cat, sort|uniq|sort. Pozor, že uživatelská IP adresa typu 10.x.y.z může být jak zdroj, tak cíl komunikace — je vhodné to rozdělit na 2 případy, profiltrovat grepem a slepit catem.)
  • skript, který z připraveného formátu vypíše 5 “nejdivnějších” typů komunikace, tj. 10 nejméně častých portů v internetu, na které se uživatelé připojili alespoň 3krát. (Hint: grepem odfiltrujte uživatele, udělejte statistiku portů, grepem odfiltrujte malé hodnoty)
  • bonus (za extra bod): skript vypíše IP adresy uživatelů, kteří komunikovali s 5 nejdivnějšími porty z minulého skriptu. (Hint: grep v cyklu.)
  • bonus bonus (další extra bod): pomocí paste -s můžete složit regulární výraz, kterým jde předchozí udělat bez cyklu, jen jedním spuštěním grepu.

Připomínka co se může hodit: grep -v vypíše jen řádky, které hledání nevyhovují.

2015/03/29
  • sed vol.2, poznámka o návaznosti ed/ex/vi, find, chmod/basename/dirname +související věci

Užitečné: Víceřádkové matche v sedu nejsou jednoduché

: Skript, který v adresáři a všech podadresářích přejmenuj všechny soubory co jsou ALL_CAPSEM na small_caps, ale MixedCaps nechá stejné. Při kolizi názvů udělá chybu nebo ji vyřeší nějak jinak. Pozor na názvy souborů které v sobě mají mezery a podobné paznaky. Použijte find -exec.

2015/04/05
  • ovladatelnostní zbytky: xargs, comm/join, tee, tar, gzip, bzip2

:

  • (1) Přečtěte si dokumentaci příkazu csplit a napište program, který vezme “patch”, tj. soubor co vypadne z diff -ur adresář1 adresář2, a rozdělí ho do malých patchů které obsahují změny pouze jednotlivých souborů. Např.: ./rozdel-patch soubor.patch vyprodukuje rozdělené patche soubor_01.patch a soubor_02.patch .
  • (2) Přečtěte si dokumentaci příkazu split a napište program, který zabalí zadaný adresář do archivů rozkouskovaných tak, aby se vešly na disketu (1.44MB), a je pak schopný tosamé rozbalit. Např.: ./archivuj adresar/ vyprodukuje soubory adresar_01.part a adresar_02.part, oba menší než 1.44MB.
  • BONUS 1: souborům co vypadnou z (1) dejte nějaký lidský název, např. aby z něj bylo vidět, jaký soubor v jaké cestě se patchuje.
  • BONUS 2: archivační program (2) bude standardním způsobem zpracovávat parametr -s nebo --size, kterým uživatel může zadat “velikost diskety”, tj. cílovou velikost archivů.

2015/04/12
  • jak napsat pěkný bashový program (hra s hádáním čísel a asi getopt) —- přesunuto na příště příště
  • něco o správě procesů (ps, sleep, kill, ctrl+z, bg/fg, trap, wait)

:

  • Napište program jmake (jako jednoduchý make), který na standartním vstupu přijme hromadu příkazů, které vykoná paralelně. Maximálně ale spustí paralelně N úloh podle optionu -j N nebo --jobs N. Pokud jedna úloha skončí, měla by okamžitě nastartovat další (aby se zbytečně nečekalo). Použijte help wait.
  • BONUS 1: Správně zpracujte quoting – tj. program by měl korektně spustit i příkazy, co obsahují uvozovky s mezerami a dolary. Hint: ruční escapování (např. sedem) není řešení.
  • BONUS 2: Pokud jeden program ze seznamu chcípne (exitcode jiný než nula), znamená to, že je všechno špatně — jmake ohlásí co chcíplo, další programy už nespouští a skončí s nenulovým exitcodem.

2015/04/19
  • “TCP/IP je jen pajpa na jinej počítač”
  • mail/sendmail
  • mkfifo, telnet, netcat
  • ssh, scp, rsync

: Napište program který pomocí mail (nebo nějakým libovolným jiným rozumným způsobem) vybere mailbox a pošle sendmailem mail ve tvaru “Sorry odjel jsem na dovolenou do Detroitu” všem lidem co se uživatelovi pokoušeli dopsat. Maily můžete volitelně smazat nebo nechat na místě.

  • BONUS 1: v odpovědi zanechte původní subject s prefixem Re:
  • BONUS 2: Vyřešte ručně diakritiku v subjectu. Vyzkoušejte si, co dělá utilita base64 a zpracujte i subjecty kódované pomocí “base64” kódování podle RFC 2047 — například =?iso8859-2?B?2r5hc27sIL5sdbtvdehr/SBr+fIK?= je po přeložení “Úžasně žluťoučký kůň”. Hint: Podle sekce 2 v RFC aplikujte base64 -d na “data” mezi poslednimi 2ma otazniky, a pomocí iconv si to převeďte na nějaké kódování co vám vyhovuje, ideálně utf-8. Výsledkem by měl být subject s prefixem “Odpověď:” včetně diakritiky.
  • BONUS 3: Bonus 2 + podpora quoted printables. Q.P. se pozná pomocí “Q” mezi otazníky na místě “encoding”, non-ascii znaky jsou v něm prostě přepsány na tvar =XX, kde XX je hexadecimální hodnota onoho netisknutelného ascii znaku. Třeba UTF-8-čkové písmeno č je přepsáno na =c4=8d (viz. echo -n č | xxd , č má v kódování utf-8 2 bajty). Nepoužívejte jiné programovací jazyky než bash (existuje totiž jednoduše vygooglitelné copypastovatelné řešení pomocí perlu, protože perl na to má knihovnu). Hint: sed + echo -e, případně printf.
  • DODATEK: Kvůli problémům s nastavením mailu v labu:
    • přesouvám termín úkolu na příští cvičení (protože jsem nezareagoval zrovna rychle)
    • můžete použít jakýkoliv, i fiktivní způsob získání mailů z mailboxu (např. jsou prostě v adresáři).
    • pokud nemáte po ruce žádné maily, vzor několika RFC822 mailů je zde: 1, 2, a 3 s UTF-8 subjectem pro bonus 2.
    • na bonusy 2 a 3 nepoužívejte mailový command r — jde především o ruční zpracování těch zakódovaných stringů.
2015/04/26
  • AWK

: Napište v awku program, který vypíše každou prvočíselnou řádku.

  • BONUS 1: Prvočísla v DÚ cachujte, ať vám test na prvočíselnost netrvá dlouho.
  • BONUS 2: V jiném skriptu vyberte awkem ze vstupu nějaká slova, ze kterých postavíte pyramidku. Interpunkci nějak libovolně odfiltrujte. Např. z “Jozef a Jano sli do asi lesa.” by program měl vyprodukovat:

a
do
asi
lesa
  • BONUS 3: 2 + maximalizujte velikost pyramidy tím, že budete brát i posloupnost slov, která jsou v textu napřeskáčku.
2015/05/03
  • awk 2, index/substr/getline/...
  • hodne metod jak zkopirovat soubory spravne

: Napište miniaturní terminálový interpret “želvičky”, tj. něco jako programovacího jazyka logo, ideálně v AWKu (ale můžete i v shellu). Něco jako tohle (dále viz wiki), akorát jen na textovém políčku velikosti 10×10. Želva začne vlevo dole a bude se koukat nahoru, v každém kroku políčko pod sebou nabarví nějakou vybranou barvou, může se otočit jen do 4 směrů a popolézt dopředu. V případě nárazu na stěnu s ní udělejte něco rozumného, ať neumře. Interpret musí podporovat příkazy: forward, left, right a color N (kde N je číslo pro barvu, 0 je černá (prázdno) a 1 je bílá (tj. nějaké písmeno)). Program dostane želví instrukce na standartním vstupu a nějak terminálovitě vykreslí finální stav.

Např.: přerušovaná čára se nakreslí: for i in `seq 5`;do echo -e "forward\ncolor 0\nforward\ncolor 1" ; done | ./zelva.awk

  • BONUS 1: Interpret postupně pomocí sleep a clear (z AWKu je volejte třeba pomocí system()) vykreslí postupnou animaci stavů po krocích želvičky.
  • BONUS 2: Víc barev pomocí vt100 terminálových kódů. Hint: echo -e '\e[35mnazdar'.
  • BONUS 3: Podpora příkazu include <filename> — vykoná příkazy uložené v souboru (podobně jako bashové source). Includnuté soubory nemůžou obsahovat další include.
  • BONUS 4: doporučená příprava na písemku — miniaturní tar. Program, který dostane jako parametr nějakou cestu, a všechny soubory (adresáře, podadresáře a soubory uvnitř) v ní spojí do jednoho souboru (formát si nějaký vhodný vymyslete) a vysype to na standartní výstup. Binární věci (obsahy souborů, názvy souborů) zakódujte pomocí base64, ušetříte potíže s quotingem. Samozřejmě pak archiv musí umět rozbalit. Hint: většina tarování jde zařídit findem, rozbalení závisí jen na správném rozsekání souboru na jména a obsahy. Jména souborů je vhodné ukládat s plnou cestou tak, jak vypadla z findu.
  • BONUS 5: Bonus 4 + zachování uživatelských práv a časů souboru.
  • BONUS 6: Bonus 4 + podpora symlinků (hint: readlink).
  • BONUS 7 (ve skutečnosti to je značné zjednodušení): Archiv bude samorozbalovací (uvnitř bude bashový skript který ty soubory vyprodukuje).

Zápočťáky: Prosím všechny co mi domluvu zápočtového programu na cvičení ještě nepotvrdili mailem (a nejspíš to následně nemají dobře zapsané v tabulce), ať mi napíšou, co přesně se dohodlo.

Zápočty: Upozornění: cca 15.6. až 10.7. nebudu v republice. Pokud budete tou dobou potřebovat dostat zápočet, zkuste to stihnout před 10.6. Jinak mi dejte vědět, domluvím to s kolegou.

2015/05/10
  • pokus o rsync (aspoň strukturní, dodělám příště)
  • zámky

: greylisting. Program, co si udržuje databázi dvojic mailových adres From: a To: spolu s časem kdy je viděl poprvé/naposled, a pomáhá filtrování spamu tím, že odpoví “ne” na maily, které viděl poprvé míň než před pěti minutami. Např. A pošle mail B, program odpoví No. A pošle další mail B, program pořád odpovída No. A počká 5 minut a pošle mail, program odpoví Yes. A počká týden a zkusí to znova, to už zase neprojde protože záznam expiroval. Program si musí databázi buď zamykat a chránit před poškozením, nebo musí vymyslet způsob jak data ukládat bez rizika rozbití. Databázi i zámky skladujte ve skrytém podadresáři domácího adresáře uživatele, pod kterým se to spouští.

  • BONUS 1: vylepšení zamykání. Jediná správná možnost jak si udělat lock a zároveň poznamenat PID je použít flock. Ten sice není úplně standartní, ale zamykat věci bashem taky není úplně standartní. Navíc s flockem už pak není potřeba mít adresář, ale stačí obyč soubor.
  • BONUS 2: Uvažujte, že databázi používá najednou víc strojů, například přimountovanou přes NFS (flock funguje i skrz NFS). Hlídat PID už je pak nemožné, ale můžete použít “watchdog” řešení — pokud je aktivní zámek moc starý, prostě ho zrušte.
  • BONUS 3: Při rušení zámku je taky možné způsobit race condition (mazáním až potom, co to nějaký jiný proces smazal a znova vyrobil). Bonus 3 je za to, že ho nezpůsobíte.
  • BONUS 4: finger – program naslouchá pomocí netcatu na nějakém portu a očekává od klienta jednoslovný dotaz se jménem uživatele. Odpoví YES/NO podle toho, jestli je uživatel na systému přihlášen nebo ne. Hint: nc -l -p 12345, who.
  • BONUS 5: Bonus 4 + pokud má odpovídající uživatel ve svém domácím adresáři soubor .finger_message, server obsah tohoto souboru připojí k odpovědi.

Pozn. k bonusu 1-3: v labu je AFS, což je distribuovaný filesystém a zámky na něm nemusí fungovat vůbec dobře. Testujte to v /tmp.

2015/05/17

Trochu mě napadlo, že uděláme něco praktičtějšího, takže ssh-keygen, git. Bash coproc.

užitečné: git primer: https://www.kernel.org/pub/software/scm/git/docs/giteveryday.html

: prodloužen z minula

2015/05/24

“Beta” test na hodině — kdyby náhododou ještě někomu chyběly body na zápočet, dočerpá je timhle. Jinak diskuze zápočťáků, rozdávání zápočtů.

Bonusy

  • Sed je T-kompletní (tzn. “jde v něm naprogramovat všechno”). Důkazů je hodně, ale tenhle rozhodně bude nejohyzdnější. Jen v sedu (přehazováním textu za pomoci regulárních výrazů) jde napsat třeba arkanoid nebo kalkulačka s neomezenou přesností . Jestli to je rozumné se neví.
  • The Art Of UNIX Programming (online verze) od Erica S. Raymonda je výborný materiál nejen o shellu a nejen o UNIXu. Velmi prakticky shrnuje většinu důležitých poznatků o vývoji software za posledních cca 50 let, překvapivě stále více než aktuální. Trochu filozofické. Obsahuje odpovědi na většinu položitelných otázek začínajících na “Proč se v UNIXu proboha ….?” a užitečný náhled do historie a evoluce současného počítačového světa.
  • Smetiště z unix/ adresáře ve kterém jsem předváděl většinu věcí na cvičení je zde