Cviceni ze zakladu UNIXu

Ve skolnim roce 2010/2011 vedu cviceni z predmetu Uvod do UNIXu (NSWI095), najdete nas v laboratori SU2 kazde utery od 15:40. Tady najdete podminky pro zapocet, seznam domacich ukolu, a dle moznosti se budu snazit tvorit i nejake kratke zpravodajstvi ze cviceni. Cvicim skupinu c. 33, ovsem i studenti odjinud jsou vrele vitani!

Pokud ke mne chcete chodit na cviceni, musite se zapsat v grupicku _a_ zaroven mi poslat mail. (Evolucne stabilni strategii je psat do subjectu [NSWI095].)

Cilem cviceni je seznamit Vas se zaklady praktickeho a efektniho pouzivani UNIXu a jeho prikazove radky a shelloveho interpreteru. Radu uloh, at uz se tykaji automatizace Vasi prace ci Vaseho systemu, nebo treba zpracovani velkeho mnozstvi dat, ktere byste museli drive zdlouhave delat rucne nebo na ne psat specialni programy, po absolvovani cviceni zvladnete naskriptovat behem nekolika minut prostou kombinaci hrsti UNIXovych prikazu. Podminkou k ziskani zapoctu je bud napsat zapoctovou pisemku a nejaky ten domaci ukol, nebo odevzdat zapoctak.

Cesta ditete: Semestr je rozdelen na tri bloky po cca ctyrech tydnech, na konci kazdeho bloku dostanete ctyri domaci ukoly, na jejich odladeni a finalni odevzdani budete mit 14 dni. Z kazdeho bloku byste pritom meli odevzdat alespon jednu ulohu; pokud nejaky blok propasnete, muzete si ulohu nahradit, ale jen ulozkou z dalsiho bloku. (Ovsem s prubehem semestru se slozitost zadani bude samozrejme zvysovat. ;-) Ukoly poslete co nejdrive, abyste do zacatku dalsiho cviceni stihli jeste proiterovat pripadna opravena reseni, budu-li mit vyhrady (coz se stava dost casto).

Zapoctova pisemka se bude programovat na poslednim cviceni (pokud budete planovat predtermin, dejte mi vcas vedet). Pisemka bude obnaset napsani (na pocitaci) nejakeho jemne netrivialniho programu (v tom spravnem jazyce, pochopitelne. Primarni ucel pisemky je dat Vam moznost si na vetsi uloze vyzkouset, co Vas ceka pri zkousce a jake mate sance si s tim poradit. Pocet opravnych pokusu neni omezen, ovsem obtiznost zadani roste.

Cesta lva: Zapoctovy program by mel byt v rozsahu minimalne dvojnasobku zkouskove pisemky, a to v libovolne kombinaci shellu, sedu a awku. Tato moznost je v zasade urcena pro ty, kteri se jiz s UNIXem dobre kamaradi, neco velkeho uz napsali a ted je nebavi chodit na cviceni a otravovat se s nejakou pisemkou - v posuzovani zapoctaku tedy budu relativne prisny. Na zapoctaku se se mnou pokud mozno domluvte predem a to do nejake trochu rozumne doby (pokud mozno ne 24. zari vecer). Na cvicenich budete samozrejme stale vitani. (Nemate-li zadny napad, co psat, zkuste bych se podivat na stranky cviceni z minulych let a vybrat si nektery z nejtezsich domacich ukolu: napada mne shop, nejaka lehce rozsirena verze jednoho z stur, rall, cprp, seex, shvm, find... Ovsem fantazii se meze nekladou!

Heuristika: Napiste one-liner, ktery jednoduse spocita vzdalenost dvou znaku v abecede. Zvladnete-li to bez potizi behem minuty, s UNIXem si asi celkem dobre rozumite.

Domaci ukoly

Obecna poznamka: Ulohy nejsou dokonale formulovane, s takovymi se obvykle nepotkate ani v realnem zivote programatora; soucasti zadani je tedy aplikace Vaseho zdraveho rozumu. Kreativni (ale chytre) interpretace a reseni vitana.

22. 2. mlrg0Poslete mi mail, ze ke mne budete chodit na cviceni - staci, kdyz napisete sve jmeno. Tahle uloha je povinna pro uplne vsechny!
sshl0Vyzkousejte se zalogovat pres ssh do labu: ssh VASLOGIN@u-pl27.ms.mff.cuni.cz (Na Windows pouzijte program PuTTY.)
15. 3. smsl1Rozsireni SMS ulozky ze cviceni (varianta "ruska ruleta", tedy posila se nahodna SMS, nikoliv prvni). Hodi se nejak evidovat, kdy jste Vasi drahe polovicce poslali jakou SMSku. Rozsirte tedy velkou ulozku tak, aby nejen SMSku poslala, ale take ji zalogovala do souboru; rozdelte logy do zvlastnich souboru podle let. Nezapomente do logu ulozit krome textu i datum a snad i cil zpravy. Bude se Vam hodit prikaz date(1).
jpnm1Predstavte si, ze nase laborator je v Japonsku: soubor passwd (v labu vygenerujete prikazem getent passwd) prepiste tak, jak se casto prepisuji japonska jmena v anglosaskem svete - napr. "Hayao Miyazaki" se prepise na "MIYAZAKI Hayao". Treba radku pasky:x:2089:100:Petr Baudis:/home/pasky:/bin/bash byste tedy meli prepsat na pasky:x:2089:100:BAUDIS Petr:/home/pasky:/bin/bash. Muzete predpokladat, ze kazde jmeno se bude skladat alespon ze dvou slov.
wcfq1Napiste skript, ktery na standardnim vstupu dostane nejaky cesky nebo anglicky text se slovy oddelenymi mezerami a obsahujici interpunkcni znamenka "." a "," (idealni text je napriklad (pravda latinske) Lorem ipsum). Vypiste deset nejcasteji se vyskytujicich slov (hint: tr(1) s \n) a spoctete (celkovy ci jednotlivy) percentualni podil techto slov na celkovem poctu slov v souboru (zkuste si z poctu slov vygenerovat automaticky aritmeticky vyraz a bc(1); procvicime jeste asi na pristim cviceni).
ucol1Vypiste jmena vsech uzivatelu v peti sloupeccich (proste v klasicke sloupcove sazbe, kterou znate treba z novin nebo z ls). Muze se Vam hodit treba prikaz paste(1). Pokud by nejaky uzivatel mel moc dlouhe jmeno, muzete jej oriznout. (Hint: Budete-li chtit ruzne dlouhe radky predelat na fixne dlouhe, muzete se zamyslet treba nad chytrou kombinaci prikazu yes(1), paste(1) a cut(1); zamyslete se nad jejich manualovymi strankami. Ale moznych cest je samozrejme mnohem vice.)
12. 4. poke1Parser Pokedexu: Pokemoni jsou podivne male potvurky, ktere ziji ve vlastnim svete, maji ruzne atributy a specialni utoky a existuje kolem nich spoustu ruznych RPG-like her atd. Seznamu vsech pokemonu se rika Pokedex, jeden takovy najdete na http://kam.mff.cuni.cz/~pasky/pokedex.txt a vasim ukolem je prechroustat jej do skriptove privetivejsi podoby - se souborem v puvodnim formatu se automaticky pracuje velice nesikovne (chceme-li napriklad delat statistiky pokemonu, nebo si napsat vlastni RPG).
Vasim ukolem je navrhnout vhodnou reprezentaci Pokedexu a napsat konvertor z pokedex.txt do teto reprezentace. Reprezentace by mela umoznovat snadny pristup k mnozine pokemonu i lookup konkretniho pokemona. Pro jednoduchost muzete ignorovat informace o special moves, TMs, HMs atd. - staci z pokedexu cist pro kazdeho pokemona atributy jen po prvni prazdnou radku.
emlr1Sestavte regularni vyraz matchujici e-mailovou adresu. (Nemusite osetrovat uplne vsechny zakouti formatu adresy, na druhou stranu by vas regularni vyraz mel matchovat s rozumne vysokou pravdepodobnosti, nemelo by jim tedy projit uplne cokoliv obsahujici zavinac a zaroven by mel zamitnout co nejmene validnich adres. Vyraz byste meli doprovodit nejakym vysvetlujicim komentarem - proc matchuje zrovna tu kterou podmnozinu validnich adres, pripadne kde ma naopak "diry", pokud o nejakych vite, apod...)
Dale opatrete regularni vyraz skriptem, ktery ze vstupu extrahuje vsechny matchujici vyskyty, tedy vsechny e-mailove adresy.
hari1Evidence Haribo medvidku: Za drobne rady, vyresene domaci ukoly, pomocne sluzby v domacnosti atd. odmenujeme sve pratele Haribo medvidky. Navrhnete reprezentaci male "databaze" pratel s jejich e-mailovymi adresami a informacemi o dluznych medvidcich ruznych barev. Napiste tri skripty:
  1. give.sh JMENO BARVA... da danemu kamaradovi medvidky uvedenych barev (alespon jednoho, parametru s medvidky vsak muze byt vice)
  2. info.sh rozesle vsem kamaradum sumarizaci, kolik medvidku kterych barev maji dostat (hint: mate-li vice souboru, pouzijte for-cyklus nebo find -exec a pomocny skript)
  3. sum.sh vypise sumarizaci, kolik medvidku ktere barvy mame dohromady (pro vsechny kamarady) nakoupit
ccom1Napiste skript, ktery spolehlive prekonvertuje v C/C++/C# zdrojaku //-komentare na /*-*/-komentare. Spolehlive rozumi se tak, aby osetril mozny vznik vnorenych komentaru, pokud se uvnitr //-komentare objevi /*-*/-komentar. Zaroven by se mel pokusit vyresit alespon jednu ze dvou moznych situaci - vyskyt // uvnitr retezce (tam by konverze probihat nemela) nebo elegantni konverze viceradkovych //-komentaru na pouze jeden /*-*/ blok.
10. 5. shrk1Kreslime zraloka - Vas skript dostane na vstupu posloupnost radku se souradnicemi ve formatu
[x,y] c
a pro kazdy radek na souradnici x,y virtualniho platna nakresli znak c.
Na konci vstupu program platno vykresli na obrazovku. Skript bere jako dva povinne parametry sirku a vysku platna, a jako dalsi nepovinny parametr -b - v takovem pripade nakresli kolem platna ramecek. (Predpokladejte, ze znaku na platne budou az tisice, kresleni by tedy melo byt rozumne efektivni. Platno bude obvykle velke radove 120x40.)
Testovaci sada (pamatujte, rozbalite prikazem tar xvvfj shrk.tar.bz2).
mcal1Kalendar: Naimplementujte jednoduchou verzi prikazu cal, ktera vypise bud aktualni mesic, nebo mesic podle dvojice parametru MONTH YEAR. Vystupni format by mel byt identicky jako u prikazu cal (nebo lepsi) - nemusite ale zvyraznovat aktualni den. K vypoctu cisla dne v tydnu muzete pouzit bud nektery ze standardnich publikovanych vzorecku (pak byste jej ale meli pochopit), nebo vyuzit prikaz date.
a2rp1Napiste konvertor z absolutnich cest na relativni; bude se spoustet jako a2rp [PATH1] PATH2 a prevede absolutni cestu PATH2, aby byla relativni k PATH1 (defaultne . neboli aktualni adresar). Tedy napr.
a2rp /home/pasky /home/brm
../brm
a2rp /var/lib/postfix /var/spool/mail
../../spool/mail
a2rp /var/lib/postfix /usr/lib/postfix
../../../usr/lib/postfix
Dobre si poradte i s pripady, ze dostanete nejakou divne napsanou cestu (treba a2rp /home//brm/../pasky /home/pasky/./src/////x/), cesta na vystupu by mela vypadat presto normalne (treba src/x nebo ./src/x/). Osetrete chybove pripady. (V pripade, ze ve skriptu vyuzijete prikaz cd, musite si uvedomit potencialni problemy!)
rtab1Napiste tabulacni program. Na vstupu dostanete soubor treba ve formatu CSV a vypiste jej se sloupeckami zarovnanymi tak, aby zacinaly na kazdem radku na te same x-ove souradnici. Ve vychozim rezimu by mel sirky sloupecku nastavit automaticky podle nejdelsi polozky v kazdem sloupecku. Pomoci parametru na prikazove radce by melo jit zmenit mezeru mezi dvema sloupecky a rucne nastavit sirku urciteho sloupecku (klidne i tak, ze nektere radky jeho obsah budou muset mit oriznuty).

Ukoly poslane od nedele 22. 5. 2011 probereme interaktivne spolu s resenim zapoctove pisemky.

Pokud sami v mailu nenapisete opak, souhlasite s pripadnym vystavenim Vaseho dilka na webu.

Novinky ze cviceni

  1. Motivace a jemny uvod do systemu. Editace prikazoveho radku, souborovy system, globy, dokumentace, pajpy; cd, ls, cat, echo, less, wc; ssh, who, write + mesg, talk.
  2. Opakovani pajp (rev, tac, head, tail, wc). mail. Presmerovani, escaping + quoting. Kratky navrat k ssh - spousteni prikazu vzdalene.
  3. Opakovani escapingu + quotingu, kopirovani pres ssh podruhe (scp, rsync). Umazavani prvniho radku. SMS ulozka. Aritmeticka expanze $((...)), prikazova substituce $(...) resp. `...`, velmi jemny uvod do promennych x=...; echo $x. Rozsireni "ruska ruleta" (nahodna SMS misto prvni).
  4. Kompendium ulozek na cut, diff+comm, sort, uniq, tr. Radio Relax (dokoncime priste). Plna uzivatelska databaze v ulabu: getent passwd. Idiom na nejcastejsi radky: sort | uniq -c | sort -n.
  5. Dokonceni radia Relax. Dalsi smrst ulozek; sort | uniq, tr, bc, dirname + basename, spetka sedu.
  6. Ulozky na sed (zpracovani mail-like dat, mazani komentaru), regularni vyrazy, detektivni uloha.
  7. Hromadne editace pomoci sedu, findu, xargs; tail recursion a dalsi drobnosti. Na zaver kratce o ps axu | awk '{print$1}'.
  8. Hadani cisel (podminky a cykly, while read, navratove kody, ...). Vlastni implementace seq.
  9. Signaly a trap. eval a hledani bezpecnostni diry. Parsovani parametru; idiom:
    while [ -n "$1" ]; do
    	case "$1" in
    		-r) rep=1;;
    		-m) shift; max="$1";;
    		*) echo "Bad parameter: $1" >&2; exit 1;;
    	esac
    	shift
    done
  10. Vseobecny mix ulozek.. Vcetne spetky awk.
  11. Domixovavani.
  12. Pisemka nanecisto - generovani fylogenetickych stromu (zadani, reseni).
  13. Pisemka nacisto - botnet client (zadani).

Vysledky (28. 09. 2011)

(Jde pouze o datum posledni aktualizace tabulky. V privalu desitek ukolu muze trvat nekolik dni, nez se dostanu k tomu Vasemu. Nepanikarte, neozvu-li se do 3-4 dni, pripomente se, prosim.)

JmenoPrikladyBoduPisemkaZ
Tibor Balazhari(1) shrk(1) mcal(1)3 + Z
Juraj Citorikjpnm(1) poke(1) mcal(1)3 + Z
Votejch Dziewieckiemlr(1) hari(1) mcal(1)3 + Z
Martin Forstjpnm(1) a2rp(1) shrk(1)3 + Z
Jozef Gandzalahari(1) shrk(1) mcal(1)3 + Z
Jakub Hajicsmsl(1) ucol(1) wcfq(1) poke(1) mcal(1)3 + Z
Jiri Hudecucol(1) hari(1.5) shrk(1)3.5 + Z
Tobias Hudecccom(1) emlr(1) shrk(1)3 + Z
Petr Chudobasmsl(1) ccom(1) shrk(1)3 + Z
David Jiroutucol(1) emlr(1) a2rp(1)3 + Z
Jan Klimovicccom(1) rtab(1) a2rp(1)3 + Z
Honza Kokoskajpnm(1) ucol(1) smsl(1) wcfq(1)1
Jaroslav Kubatjpnm(1) ccom(1) shrk(1)3 + Z
Daniel Lovaskowcfq(1) emlr(1) a2rp(1)3 + Z
Jan Matejka z Z
Oskar Maxajpnm(1) ccom(1) mcal(1)3 + Z
Vendula Michlikovajpnm(1) hari(1) mcal(1)3 + Z
Michal Ondrejasjpnm(1)1 +
Palko Otto0
David Pegrimekjpnm(1) ucol(1) smsl(1) wcfq(1) ccom(1) poke(1) rtab(1)3 + Z
Martin Pilnyjpnm(1) emlr(1) shrk(1)3 + Z
Renata Sevcikovajpnm(1) ucol(1) smsl(1) wcfq(1) poke(1)2
Vita Smid z Z
Jakub Stastaucol(1) emlr(1) shrk(1)3 + Z
Pavel Tauferjpnm(1) poke(1) ccom(1) shrk(1)3 + Z
Michal Vavreksmsl(1) ccom(1) shrk(1)3 + Z
Ondrej Tazlar0
--- Pan Po ---0

Dalsi zdroje

Pomoc!

Potrebujete-li s necim poradit, udelate nejlepe, kdyz mi napisete mail. Konkretni dotazy muzeme vyresit rovnou po mailu.

Pokud budete mit nejake obecnejsi nejasnosti, nezoufejte, domluvime se a nekdy se potkame (na MS byvam temer kazdy den). Cas mivam obvykle po cviceni, jinak se na MS vyskytuji nikoliv uplne pravidelne, lec kazdopadne velmi casto, v kancelari c. 322 (3. patro, naproti S3) nebo v malostranskem Starbucks. ;-)

TOC

@TOC@
Edituje Petr Baudis. No counters, no frames, no syntax errors. Design borrowed from MJ.