Orientační běh 6.6.2017

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.
Speedding
Matfyz(ák|ačka) level I
Příspěvky: 35
Registrován: 10. 1. 2017 19:32
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Orientační běh 6.6.2017

Příspěvek od Speedding »

Dostali jsme zadání získat a následně vypsat výsledky orientačního běhu, no někde už jsem to zadání viděl.

Na začátku nás pan doktor Forst uklidnil, že žádný běh absolvovat nemusíme :D

Toto zadání se nachází v řešených úlohách
Zadani
getob a showob
getob ma za ukol nasledujici:
z webu stahnout dva soubory ob_d.htm a ob_h.htm (divky a hosi)
ktere jsou na serveru http://www.ob.cz v adresari behy
a kazdy z techto souboru obsahuje asi neco takovedleho:
...
...
<PRE>
<A HREF="nnn.htm">nnn</A>
<A HREF="nnn.htm">nnn</A>
<A HREF="nnn.htm">nnn</A>
...
</PRE>
...
kde nnn je vzdy trojmistne cislo skupiny.
(jsou tu tedy vypsany vsechny existujici skupiny o.b.)
Dale jsou na vebu soubory "skupina_nnn.htm" pro kazdy nnn (viz vyse)
ktera obsahuje neco jako:
...
<PRE>
<B>Jmeno Prijmeni</B> neco neco <B>id(viz nize)</B>
datum1 body1 datum2 body2 datum3 body3 datum4 body4
datum5 body5 datum6 body6 datum7 body7 datum8 body8
...
<B>Jmeno Prijmeni</B> neco neco <B>id(viz nize)</B>
datum1 body1 datum2 body2 datum3 body3 datum4 body4
datum5 body5 datum6 body6 datum7 body7 datum8 body8
...
...
</PRE>
tedy jsou zde vyjmenovani vsichni clenove dane skupiny.
id je ve tvaru AArrcckk (nebo neco podobneho),
AA jsou nejaka pismena, rr - rok narozeni, cc poradove cislo
(u zen +50) a kk jeste nejaka pismena.
Pod jmenem se vzdy vyskytuji 4 zaznamy datum - body na jedne radce,
radek je jen nekolik a posledni radka nemusi byt cela.
Ukolem prvniho souboru je tedy ulozit si pro kazdeho clena kazde skupiny
jmeno,rok narozeni a body za kazdy zavod (do nejakeho souboru)
showob
si precte soubor, ktery jsme si vytvorili a syntaxi ma nasledujici
showob <D|H> <n> [from to]
tzn:
D|H - vypise bud divky, nebo hochy.
n - secte body z prvnich n bezenych zavodu (podle nich urci poradi)
from to - roky (vypise poze lidi, kteri se narodili v danem obdobi)
ma za ukol tedy vypsat poradi lidi podle specifikace.
pozn: ve druztvech hochu se mohou vyskytovat zeny a naopak.
Puvodni zadani bylo trochu jine, ale jelikoz si ho presne nepamatuju
tak je to alespon priblizne.
Webovske stranky se maji stahovat nasledovne (ve skutecnosti to tak nejde):
do standartniho vstupu prikazu telnet <wwwserver> poslat
"get adresar/soubor" a dve odradkovani. Obsah bude na stand. vystupu.


U nás byl ten vstup vesměs stejný. Soubory jsme měli získat dělat netcatem (vysvětlil, jak funguje).

Na výstupu také parametry [n] a [[from] - [to]], ovšem po nás nechtěl rozlišovat pohlaví. To n-ko bylo u nás n nejlepších výsledků daného závodníka.

Bylo tam ještě pár drobných odchylek, ale myšlenka zůstává stejná. Rozepisovat to nebudu, to byste se pak na tu zkoušku ani netěšili, kdybyste věděli, co přesně vás čeká :D


Já téměř celou úlohu řešil sedem, výstup jsem vypsal awk-čkem. Upřímně, po odevzdání písemky jsem z toho nebyl vůbec nadšený a už jsem plánoval, jak si UNIX zopáknu někdy v září. Nakonec jsem ale dostal jedničku, což jednoznačně svědčí o tom, že Forsta zajímá hlavně myšlenka, uspořádání dat a tak a moc nebazíruje na tom, jestli máte někde nějakou syntaktickou chybu, nebo když nevíte, jak si vzít výstup z netcatu a tak ...


Své řešení rozepisovat nebudu, protože na něj nejsem vůbec pyšný. Forst to chtěl řešit asi takhle:

Stáhnu první soubor, někam uložím. Na konec tohoto souboru stáhnu druhý soubor (pomocí >>). Setřídím sortem, prý má nějaký přepínač unique a tím se vyloučí duplikáty. Samozřejmě tomu musí předcházet nějaká úprava, respektive vyházení těch odkazů. Já debil to dělal sedem, Forst nám pak řekl, že to šlo úplně jednoduše cutem.
Pak přes nějaký while read oddil; do ... done zpracuji všechny soubory s oddíly. Říkal, že na tomto příkladu je asi nejdůležitější si rozmyslet uspořádání dat. Když zkombinuji můj způsob uspořádání dat (protože si myslím, že to jediné se mi na tom povedlo) a to, co říkal Forst, udělal bych to asi následovně: Pro každého závodníka si vytvořím spešl soubor, do něj nacpu veškeré body co kdy získal, oddělení
. Setřídím pomocí sortu. Pak budu mít ještě jeden soubor, jakousi databázi, kde si budu pamatovat jméno závodníka;kód;věk (Forst říkal, že nejlepší je spočítat věk hned takhle na začátku, pak se nemusí řešit žádný intervaly a tak). To je asi vše k prvnímu skriptu.

Skript na zobrazování ranku je možná jednodušší. Zpracování parametrů komentovat nebudu, to je ez. Stačí procházet tu "databázi" a pokaždé, když je věk v daném intervalu, nějak toho závodníka zpracuji. Počet závodů, které se mají počítat, sečtu úplně jednoduše pomocí headu. Já to dělal pomocí testu a cyklu, ale ten head je opravdu elegantní. Respektive tím headem to samozřejmě nesečtu, na to musím použít expr, ale to jste si, doufám, domysleli. Výsledek hodím do nějakého jiného souboru. Na konci whilu setřídím opět sortem -n podle počtu získaných bodů. Pak ten soubor projdu awk-čkem, respektive forem, naformátuju a před závodníka ještě vypíšu pořadí.

Když to teď píšu, zní to jednoduše. U zkoušky mi to tak jednoduchý nepřišlo :D



Dojmy ze zkoušky:

Forst po vás chce to nejjednodušší možné řešení. Takže u zkoušky se vždycky zamyslete nad tím, jestli by daná věc nešla udělat ještě jednodušeji. Nejdřív zkusit použít základní utility (cut, head, tail, sort ...), pokud to nejde, až pak nasadit něco složitějšího (sed, awk, cykly...)

Forst nehodnotí správnost syntaxe, ale správnost myšlenky. Řekl bych, že v hodnocení je opravdu shovívavý. Ale asi také záleží na kvalitě písemek vašich kolegů. (Proto doporučuji, pokud vás je víc, kdo nemáte rádi UNIX, domluvte se a jděte na jeden termín, máte pak větší šanci :D :D )

Já třeba UNIX moc nemusím, mimo cvičení a přečtení Forstovo knihy jsem se jinak na zkoušku nepřipravoval. Už jak Forst říkal to zadání, měl jsem tušení, že je to v (doplňte si sami), protože práce s textem opravdu není nic pro mě... Nakonec za jedna, no.

Ještě dodám výsledky ostatních, z (tuším) 12 lidí to nedali jen 2. Zbytek prošel.
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“