Cviceni ze zakladu UNIXu

V akademickem roce 2011/2012 vedu cviceni z predmetu Uvod do UNIXu (NSWI095), najdete nas v laboratori SU2 kazdy ctvrtek od 14:00. 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 efektivniho pouzivani UNIXu a jeho prikazove radky resp. 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.

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.

16. 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.)
22. 3. 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 pipe do bc(1)).
l10u1Vypiste uzivatelska jmena poslednich deseti (ruznych!) prihlasenych uzivatelu (serazena podle casu prihlaseni). Seznam nedavnych prihlaseni na danem pocitaci ziskate prikazem last. Muze se Vam hodit prikaz nl.
mllg1Logovani prichozich mailu: vzdy, kdyz Vam prijde mail, ulozte na konec souboru mail.log ve Vasem domovskem adresari radku ve formatu "datum subject" (subject je anglicky predmet a v mailu ho najdete jako hlavicku Subject), a to tak, aby Vam samozrejme mail take dosel a ulozil se, krom toho, ze ho zpracuje skript.
Tato uloha je zejmena o samostatnem hledani v ruznych materialech a dokumentaci a experimentovani (v labu by to melo fungovat). Muze se Vam hodit zjistit neco o souboru ~/.forward (take se mu rika "dot forward") Na vytahnuti subjectu se vam muze hodit program formail(1) (ale pozor, neni to standardni nastroj, takze u zkousky s nim pravdepodobne neuspejete - zatim vsak nemate jine nacini).
12. 4. urlr1Napiste regexp matchujici co nejpresneji a nejspolehliveji internetovou adresu neboli URL (tedy aby postihl co nejvice spravnych URL a zaroven co nejmene stringu, ktere URL nejsou). Muzete uvazovat pouze rozsirene a bezne uzivane formaty URL. K reseni pripojte nejaky netrivialni slovni popis, treba na jake vsechny formaty regexp (ne)funguje apod. K cemu by se takovy regularni vyraz napriklad pouzil v praxi?
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.
htoc1Napiste skript, ktery vezme HTML stranku, vyparsuje z ni vsechny nadpisy (Tela elementu h1 az h6 - tzn. bez tagu samotnych! Nadpis 2. urovne "Jean-luc Picard" tedy bude v dokumentu vypadat treba jako <h2>Jean-luc Picard</h2>. Muzete predpokladat, ze cely nadpis vcetne tagu zabere prave jeden radek.) a nadpisy (pokud mozno zabalene do odpovidajiciho HTML; vygooglete si "seznamy v HTML" apod.) ulozi korektne hierarchicky usporadane zpatky do HTML stranky misto radku obsahujiciho "@TOC@". Testovat skript muzete na homepage naseho cviceni (musi byt schopny zvladnout vsechny nadpisy na teto strance).
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.
3. 5. 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).
Deadline tohoto ukolu je az posledni cviceni.
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.
Deadline tohoto ukolu je az posledni cviceni.
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).
Deadline tohoto ukolu je az posledni cviceni.
wifi1Napiste interaktivni skript pro sledovani WiFi siti. Mejme dva prikazy:

  • iwlist eth1 scan - vypise seznam dostupnych siti; muzete emulovat pomoci souboru 12-veletrzni.txt a 12-stross.txt.
  • iwconfig eth1 essid id_site - nastavi danou sit jako aktivni; staci, kdyz budete spusteni tohoto prikazu predstirat

Vas skript ma za ukol prehledne vypsat site, ktere jsou k dispozici (treba s nejakou semi-grafickou indikaci sily signalu a indikaci, zda je sit nejak chranena (viz polozka Encryption key); kazda sit by nemela zabrat vice nez 1-2 radky). Site skript ocisluje. Pak pocka na vstup uzivatele, ktery muze:

  • Proste zmacknout enter - skript provede refresh seznamu
  • Zadat cislo site - skript nastavi jako aktivni sit s danym cislem
  • Zadat 'q' - skript skonci
  • Zadat ESSID (jmeno site) - skript nastavi jako aktivni danou sit

Deadline tohoto ukolu je az posledni cviceni.

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

Novinky ze cviceni

  1. Motivace a jemny uvod do systemu a prikazove radky. Editace prikazoveho radku, souborovy system, dokumentace, zakladni presmerovani a pajpy, zakladni prikazy (cd, ls, cat, echo). mail, ssh (zminka).
  2. Opakovani pajp (rev, tac, less, head, tail, wc; plna uzivatelska databaze v ulabu: getent passwd). Umazavani prvniho radku. Jak editovat soubory (vim+vimtutor / emacs, mcedit / joe / nano, gedit / kate) a jak vypada skript. wget. SMS ulozka. Aritmeticka expanze $((...)), specialni promenna $RANDOM.
  3. Opakovani, bc. Prikazova substituce $(...) resp. `...`. Velmi jemny uvod do promennych x=...; echo $x, parametry ($1, ...). Prumerna delka radku, znaky a kodovani a konce radku. Rozsireni SMS ulohy (ruska ruleta, logovani). date. Docasne soubory ($$, mktemp). Escaping (\ ) + quoting ('', "").
  4. Pokrocile SSH (vzdalene spousteni prikazu, kopirovani souboru). Kompendium ulozek na cut, sort, uniq, tr. Idiom sort | uniq -c | sort -n.
  5. Opakovani tr, sort + uniq. diff + comm. Globy (*, ?, []). Prvni regularni vyrazy a spetka sedu.
  6. Regularni vyrazy (zkousejte dalsi na tutor.fi.muni.cz), grep a sed.
  7. Opakovani procesu z prednasky, ps axu. Vice sedariny (zpracovani mailu). find, xargs.
  8. Procesy, signaly, ps, idiom awk '{print$1}'. Navratove kody, podminky a cykly. Vlastni implementace seq. while read. Hadani cisel.
  9. trap. Kompendium ulozek. Zamysleni nad nahodnymi cisly. cc, clear, reset (IOCCC). 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. eval a hledani bezpecnostni diry. Vseobecny mix ulozek.
  11. Mixovani uloh z minule.
  12. Pisemka nanecisto - sledovani adresaroveho stromu (priklad reseni).
  13. Plan: Pisemka nacisto.

Vysledky (17. 05. 2012)

(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
Samuel Bartosjpnm(1) htoc(1)2
Anton Khodosl10u(1) ccom(1)2
Tereza Klimosova0
A748lwcfq(1) l10u(1) jpnm(1) mllg(1) htoc(1) poke(1) shrk(1)3
Ondrej Papikjpnm(1) ccom(1)2
Tomas Pokornywcfq(1) urlr(1)2
Jan Skrleurlr(1)1
Jiri Svancarajpnm(1) ccom(1)2
Duc Trung Hamllg(1) l10u(1) jpnm(1.5) wcfq(1) ccom(1) htoc(1) urlr(1) poke(1)2.5
Natalia Tyrpakovajpnm(1) ccom(1) rtab(1)3
Daniel Viktorinjpnm(1) l10u(1.5) wcfq(1) ccom(1) htoc(1)2.5
--- 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. 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.