Předtermín 26. 5.

Seznámení se základními principy operačního systému UNIX, převážně z uživatelského hlediska. Absolvent kurzu by měl být schopen napsat netriviální program v shellu.
peci1
Matfyz(ák|ačka) level II
Příspěvky: 86
Registrován: 21. 1. 2009 20:08
Typ studia: Informatika Bc.

Předtermín 26. 5.

Příspěvek od peci1 »

Ahoj, tak k dnesni zkousce:

Resili jsme ulohu addRFC :

Mate promennou DIR (klidne environmentovou), ve ktere je ulozena cesta ke slozce s RFC. (RFC je cosi jako specifikace)
V te slozce slozce jsou soubory rfc-index.txt, my-index.txt, rfc*.txt

rfc-index.txt: kompletni listing vsech RFC

Kód: Vybrat vše

0001 prvni RFC s cislem 1, muze byt i
     na vic radku, kazdy dalsi zacina peti mezerami
     a pokud existuje novejsi RFC, ktere tohle prepisuje, bude popis tohoto RFC obsahovat slova (Obsoleted by RFCn, RFCm...)

0002 dalsi RFC je oddeleno prazdnou radkou

0003 toto RFC je dalsi z rady
my-index.txt - seznam RFC, ktera mam u sebe stazena, je roztrideny podle uzivatelem definovanych sekci

Kód: Vybrat vše

----- NAZEV_SEKCE:

0001 prvni RFC s cislem 1, muze byt i
     na vic radku, kazdy dalsi zacina peti mezerami
     a pokud existuje novejsi RFC, ktere tohle prepisuje, bude popis tohoto RFC obsahovat slova (Obsoleted by RFCn, RFCm...)

---- NAZEV_DRUHE_SEKCE:

0002 dalsi RFC je oddeleno prazdnou radkou
Obsah souboru rfc*.txt nas nezajima

Jde o to, ze soubor my-index.txt by mel tak nejak korespondovat s pritomnymi rfc*.txt soubory. Chovat se to ma asi nasledovne:

Uzivatel si stahne nove rfc*.txt soubory z netu do $DIR a spusti skript s prislusnou optionou. Skript se podiva na zadane soubory, pro kazde RFC, pro ktere nema zaznam v my-index.txt se usera zepta, do ktere sekce zaradit (a pokud zadana neexistuje, pta se dokola, dokud se netrefi na existujici; zadanou sekci si pro pristi dotazy zapamatuje jako default), najde odpovidajici zaznam v rfc-index.txt a prekopiruje ho na prislusne misto v my-index.txt. RFCcka v jednotlivych sekcich musi byt serazena vzestupne podle cisla RFC. Pokud zaznam v my-index.txt existoval, jen ho updatuje.

Nebo muze uzivatel nejake rfc*.txt smazat a pak pustit skript s optionou, aby zkontroloval obsah dane sekce. Skript projde sekci, zkusi pro kazde RFC v ni najit prislusny soubor. Pokud ho najde, jen updatuje zaznam oproti rfc-index.txt, pokud soubor nenajde, zepta se, zda zaznam smazat.

Pozadovane optiony byly:
* -s sekce -> zkontroluje obsah jedne sekce
* -f file1 file2 ... -> zkontroluje, zda pro zadane soubory existuji zaznamy
* -r rfc1,rfc2-rfc6,rfc7... -> zkontroluje, zda pro zadana RFC existuji zaznamy (a prislusne soubory, pokud soubor neexistuje, jen vypise hlasku) (tady pozor, user muze zadat i rozsah RFC - to je to s pomlckou)
* -n file -> zkontroluje, zda pro vsechny RFC soubory v $DIR novejsi nez file existuji zaznamy
* bez optionu -> nejdriv koukne, zda pro vsechny soubory v $DIR najde zaznamy a pak projde vsechny sekce a zkusi najit ke vsem RFC soubory

Kdykoli si skript sahne na RFC, ktere ve svem textu obsahuje, ze je obsoleted (viz vyse), skript ho zpracuje, ale vypise hlasku.

Nektere postrehy:
* cisla v rfc*.txt byla bez uvodnich nul (tj. napr. rfc33.txt), kdezto v indexech jsou s nima (0033)
* rfc-index.txt a asi i my-index.txt se pry nadherne parsoval pres awk, kde nastavite RS="", coz zpusobi, ze vam bude hazet jako jeden record cely blok oddeleny prazdnou radkou, coz je presne format tech souboru
* kdyz uz mam v ruce cely blok, nemuzu obsoletnost zjistit jednoduse sedem, ten se z viceradkovych vyrazu podela... ovsem kdyz sedu blok predzpracuju tr "
" " ", hned se na me smeje
* na zpracovani rozsahu u optiony -r se asi da pouzit seq, i kdyz na prednasce bylo receno, ze je nestandardni

Casu bylo presne vysvetleni zadani + 2 hodiny cistyho na psani. Pak 2 hodinky pauza a pak zacal byt zlej. Mel min. 15 minut prednasku na tema, jak se to nepovedlo, jaky tam lidi psali prasarny a tak... Docela to pozabijel, byly 4 jednicky, asi 2 dvojky, o trojce nevim, 4 lidi si vzal ustne a zbylych asi 8 - 10 vyhodil.

Muj osobni postreh - awk me nenapadlo, tak jsem to vsechno edoval. To bylo celkem smrtacky, ale dalo se to. Jen jsem zjistil nasledujici chovani edu, kdyz jsem si chtel oznacit jeden blok v rfc-index.txt: (v $1 mam cislo RFC s uvodnimi nulami)

Kód: Vybrat vše

echo '/^'"$1"'/,/^[0-9]\{4\}/ p' |ed "rfc-index.txt" 2>/dev/null
tenhle kousek ma tri zasadni nevyhody a vubec nefunguje, ptz.:
* v adresni casti oba regexpy matchnou ten samy radek (jo, holt by clovek chtel moc, kdyby mel po zpracovani prvni casti adresy hned zmenit aktualni radek)
* matchne o dva radky vic (coz by nevadilo, ale treba v pripade mazani uz to byl problem)
* musi se if-ama zkoumat, zda nejsme na konci souboru :( (a kdyz tohle zkusim do my-index.txt, tak i musim zkoumat, jestli neni za blokem nova sekce)

spravnejsi bude neco takovyho (a melo by se to obejit bez if-u, pokud si na konec rfc-index.txt hodite prazdnou radku)

Kód: Vybrat vše

echo '/^'"$1"'/;.,/^\s*$/^ p' |ed "rfc-index.txt" 2>/dev/null
vypada to hodne prapodivne, je tam par veci, ktere me na edu prekvapily a tak:
* /^'"$1"'/; -> tenhle prikaz nastavi pro nasledujici adresni prikaz aktualni radek (dulezity je ten strednik)
* .,/^\s*$/^ -> tecka je za aktualni radek, ten uz mame nastaveny, pak si najdu prazdny radek a popojedu o jeden nahoru (to je ta ^ za adresou, nevedel jsem, ze to takhle jde kombinovat, ale jde... dokonce muze byt vic ^ za sebou)

Hodne stesti vsem ostatnim ;)
lamisil
Matfyz(ák|ačka) level I
Příspěvky: 4
Registrován: 19. 1. 2009 20:00
Typ studia: Informatika Bc.

Re: Předtermín 26. 5.

Příspěvek od lamisil »

Tak dneska byl za ukol napsat skript, ktery aktualizuje RFC index.

RFC soubory popisuji internetove protokoly, ale to neni pro ulohu tak podstatne. Dulezite je, ze mame v nejakem direktorari spoustu RFC souboru, ktere maji nazev tohoto tvaru: rfcXXXX.txt, kde XXXX je jedno az ctyrciferne cislo (to znamena nema vedouci nuly na zacatku). Krome techto souboru se v direktorari nachazi soubor rfc-index.txt, kde je seznam vsech existujicich RFC s jejich popisem. Vypada napriklad takto: http://www.ietf.org/iesg/1rfc_index.txt. Jednotlive zaznamy jsou oddelene prazdnou radkou a v souboru jsou serazeny podle RFC cisla. Kazdy zaznam obsahuje na zacatku prvni radky ctyrciferne RFC cislo (tentokrat s vedoucimi nulami na zacatku), pak mezeru a popis. Pokud popis pokracuje na dalsich radkach, je odsazen peti mezerami. No a do tretice je v direktorari posledni soubor, ktery se jmenuje my-index.txt. Ten ma podobny format jako predchozi soubor, neobsahuje vsak popisy vsech RFC souboru, ale pouze tech co mame stazene v pocitaci. Krome toho je soubor rozdelen na sekce. Napriklad radka

Kód: Vybrat vše

---- FTP
oznacuje sekci souboru tykajicich se FTP. Uvnitr sekce jsou zaznamy opet setrideny podle RFC cisla a zaznamy by mely odpovidat zaznamum v souboru rfc-index.txt.

No a ted co ma delat nas skript. Motivace je tato: Souboru RFC je hrozne moc, takze mame stazenou v pocitaci pouze nejakou podmnozinu. No a aby v tom byl poradek, tak chceme mit v my-index.txt zaznamy ulozenych souboru. Pokud tedy stahneme nejake nove soubory, tak chceme soubor my-index.txt zaktualizovat. A to prave bude delat nas skript, ktery bude mit tyto volby:

-f files
Vezme RFC cisla techto souboru a prida je do my-index.txt i s popisem ze souboru rfc-index.txt. Skript se pred pridanim kazdeho souboru zepta do jake sekce se ma zaznam pridat a pokud uzivatel nic nezada, pouzije sekci zadanou naposled. Zaznam se musi pridat na spravne misto, aby byl soubor porad setrideny.

-r 123,55-66,46
Prida zaznamy podle zadanych RFC cisel, cisla jsou uddelena carkami a muze se jednat i o intervaly.

-n file
Prohleda direktorar s RFC soubory a prida vsechny, ktere jsou novejsi nez zadany soubor.

-s section
Prozkouma vsechny zaznamy v zadane sekci. Zkontroluje, zda soubor existuje, pokud ne, zepta se uzivatele, zda ma odebrat prislusny zaznam. Zkontroluje take, zda se zaznam v souboru rfc-index.txt nelisi a pokud ano, tak ho aktualizuje/

Bez parametru ma skript zkontrolovat vsechny sekce a vsechny soubory v adresari.

Jo a jeste jedna vec: v popisu souboru se muze objevit (Obsoleted) a pri kontrole zaznamu bychom meli uzivatele na to upozornit.

Snad jsem na nic nezapomnel. Zkousku delalo asi 22 lidi. Forst rikal, ze jsme ho moc nepotesili. 4 jednicky, 2 dvojky, 4 sli na ustni a ostatni to neudelali.
lamisil
Matfyz(ák|ačka) level I
Příspěvky: 4
Registrován: 19. 1. 2009 20:00
Typ studia: Informatika Bc.

Re: Předtermín 26. 5.

Příspěvek od lamisil »

Tak nez jsem to sesmolil, tak uz to sem napsal nekdo jinej :)
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“