Zkouška Forst 23.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.
Uživatelský avatar
Donarus
Matfyz(ák|ačka) level III
Příspěvky: 194
Registrován: 30. 9. 2007 12:40
Typ studia: Informatika Mgr.

Zkouška Forst 23.5

Příspěvek od Donarus »

takže dneska byl další předtermín

Úspěšnost, alespoň co si pamatuji, tak 2 lidi za 1, 3lidi automaticky za dva, dalsich 5 dozkusoval (z toho myslim ze byla 2*2, vcetne me, pak jednou 3 a myslim dalsi dva neprosli) a 2 automaticky priste

no příklad mi teda vážně nesedl... měli jsme naprogramovat MAKE ...
měl umět vyřešit závislosti (soubor je novější než rodič, soubor tam není) .. pozor na zacyklení
dále měl zvládat promenne neco=hodnota (ta byla vzdy samostatne na novem radku hned od kraje)
komentare (# od krizku do konce radku kdekoliv) a pokud na konci radku bzlo lomitko, tak jakobz nasledujici radek pokracoval a yadnz novz radek tam nebyl (na to bacha.. tohle umi read automaticky, takze jakmile date read line na radek kterej konci / tak to udela automaticky....)

tak a co se tyce k prikazum, ktere tam byly... tak pokud bylo pred prikazem (kde jsou prikazy a co s nima - tak to odkazuju na MAN) @ tak se prikaz nevypsal. na vstup, pokud tam bylo "-" tak pri chype pri provadeni prikazu by program nemel spadnout, ale pokracovat dal... a pokud tam bylo -@ nebo @- tak kombinace obojiho a pokud nic, tak se radek vypsal i provedl, popripade spadne program :)

forst v par vetach na zacatku zduraznil, ze bychom si meli dat pozor na tu stromeckovou (at uz to kdokoliv vyresi jakkoliv) strukturu .... vpodsate je dulezite aby clovek vzdy jednoduse zjistil rodice i zavislosti....

no tak vic ze me nevymacknete.... proste to byl klasickej make :) kdyz kouknete do manu, tak je to v podstate to same.... absolutne to same....

abych nezapomel, pokud mu date jako parametr neexistujiciho rodice, tak najde prvniho a od nej zacne provadet.. pokud mu date existujiciho bez zavislosti, provede automaticky jeho kod

popravde by bylo lepsi, kdyby to sem napsal nekdo, kdo rozumi programu make vic nez ja.... nejsem Ceckar, a dneska na zkousce jsem to v idel temer poprve v zivote... ale vysvetlil to docela dobre, takze se to dalo i bez jiti k pocitaci k manpages.... ja jsem toho dukazem....


jinak doporucuju si to na zacatku treba 15 minut rozmyslet nez zacnete psat.... ja sice za tech 15 minut nevymyslel kloudnej algoritmus, ale podarilo se mi najit alespon jaks taks mechanickou cestu k vysledku....
Návštěvník

Re: Zkouška Forst 23.5

Příspěvek od Návštěvník »

Donarus píše:takže dneska byl další předtermín

Úspěšnost, alespoň co si pamatuji, tak 2 lidi za 1, 3lidi automaticky za dva, dalsich 5 dozkusoval (z toho myslim ze byla 2*2, vcetne me, pak jednou 3 a myslim dalsi dva neprosli) a 2 automaticky priste
Dvojku jsme na místě dostali jen dva, pokud si dobře pamatuju.
Donarus píše:a pokud na konci radku bzlo lomitko, tak jakobz nasledujici radek pokracoval a yadnz novz radek tam nebyl (na to bacha.. tohle umi read automaticky, takze jakmile date read line na radek kterej konci / tak to udela automaticky....)
Pozor, řádek musí končit backslashem: "\" ne lomítkem, aby se další bral jako jeho pokračování.

Asi by se hodilo ukázat formát toho Makefile, ale mě se teda to zadání moc popisovat nechce. Jen upozorním, že to nebyla úloha "Maker" jak je řešená v nějakém kolujícím PDFku.
Uživatelský avatar
Donarus
Matfyz(ák|ačka) level III
Příspěvky: 194
Registrován: 30. 9. 2007 12:40
Typ studia: Informatika Mgr.

Re: Zkouška Forst 23.5

Příspěvek od Donarus »

jj za ten backslash se omlouvam to byl preklep..... jinak dvojku jste dostali dva na jednoho byla doplnujici otazka hned na miste, za kterou dostal nakonec hned na miste pri vyhlasovani vitezu taky dvojku.... povazuji to tedy, ze jste dvojku dsotali hned tri... ale to je relativni
R.U.R.

Re: Zkouška Forst 23.5

Příspěvek od R.U.R. »

Tak to omyl, ten s tou doplnující otázkou pak taky dostal jednicku :-) Vim to, koukal jsem pritom Forstovi pod ruku :-) Docela dobry, na to ze se snazil cist parametr pomoci read (na to byla ta doplnujici otazka) - samozrejme to melo byt $1, tak se pak opravil a forst ho poslal domu s vybornou. Forst fakt nebaziruje na nejakych detailech, hlavne mu jde o dve veci: 1. jestli clovek vymysli, jak dany problem resit (a to reseni je rozumne) a 2. jestli clovek umi psat shellovsky kod (nebo awk pokud chce). Nejaky detaily, na to se tak moc nehraje.
Jinak make jsem netusil ze neco takovyho existuje, ale napsal jsem to a sel jsem rovnou domu s jednickou, takze to clovek asi nemusi vedet, forst to proste vysvetlil co presne to ma delat, jen jedno misto jsem pochopil spatne, ale asi proto ze to nerek uplne spravne...
Behem dneska sem napisu vic - jak vypadalo o zadani a jak se to dalo resit (resp. ja jsem to resil ja, nedelal sem zadny stromecky ale proste jsem to rekurzil v subshellu).
Jo a rovnou vyrazil jen jednoho, chtel dva, ale ten druhej na nej "ja myslim ze jsem tam toho mel celkem dost" (prej to celkem dobre rozebral ale nic moc tam neudelal ze prej jen tak kousky neceho a dohromady skoro nic rikal Forst) a forst ho teda este vzal na ustni (tam nevim jak dopad).
Uživatelský avatar
Donarus
Matfyz(ák|ačka) level III
Příspěvky: 194
Registrován: 30. 9. 2007 12:40
Typ studia: Informatika Mgr.

Re: Zkouška Forst 23.5

Příspěvek od Donarus »

tak dostal jednicku no :D tak sem pak napis to zadani, bo ja fakt nejsem dobrej v tom ze mam nekomu neco popisovat.. jaj sme leda tak dobrej v tom, ze umim neco vokecavat :D :D s tim problemy nemam..... a jinak forst ani na tom zvolenem principu reseni nebaziroval... ja to fakt mel uplne nesmyslne slozite... spis baziroval na tom, ze at si vyberes jakejkoliv algoritmus tak kdyz to neni jasny z papiru, tak kdyz se s tebou pak bavi, tak musi byt jasne ze vis o cem jsi psal.... a i kdyz bys podle me treba nepochopil zadani a psal neco jineho, tak kdyz mu to pak vysvetlis zes to nepochopil a myslels to jinak (a neulehcil sis tim teda nejak extreme praci :)) tak to pochopi.... mno a i kdyz delas spravnou vec a delas ji sloziteym algoritmem, tak ti treba neda za jedna, ale kdyz vidi ze vis jak bys ten algoritmus dotahnul aby ti fungoval az do konce... tak te evidentne projit necha ... ale nevim jak to bude na normalnich terminech...... tohle byly predterminy a s nizsi ucasti nez je ocekavana na normalnich terminech .... ja jsem se s nim po zkousce jeste bavil a ptal se ho jak to stiha kdyz mu tam prijde vic jak 12 lidi, bo jich muze dojit az 25 a na zkousce nas bylo 12 a ja jako posledni odchazel az neco kolem seste.... no tak povidal, ze prej puvodne vypisoval terminy pro 20 lidi ale ze pak zacal pro 25, protoze i kdyz to vypsal pro 25, tak vetsinou tech 5 nedorazi, u dalsich 5ti je automaticky jasny ze tu zkousku proste prisli strelit ale vubec nevi ktera bije.... mno a zebejva jich takovejch 15 na opraveni a to je prej takova ta horni hranice co se opravdu da zvladnout :D
Uživatelský avatar
Hans
Matfyz(ák|ačka) level I
Příspěvky: 24
Registrován: 20. 12. 2007 20:07
Typ studia: Informatika Bc.
Bydliště: Jižák
Kontaktovat uživatele:

Re: Zkouška Forst 23.5

Příspěvek od Hans »

Mám takovej dotaz. Jak dlouho jste se připravovali ke zkoušce a co všechno ste se učili? Zkoušeli jste nějaký starý testy nebo tak? Já půjdu v úterý a zatím mám strach abych nebyl jeden z těch co to půjdou střelit :-) Mě totiž připadá, že výsledek stejně závisí na tom, jestli člověk dostane ten správnej nápad na postup řešenía nějaký speciality si stejně najdu na slajdech.
R.U.R.

Re: Zkouška Forst 23.5

Příspěvek od R.U.R. »

Jako já jsem se moc neučil... Ve středu jem psal zápočtovku z unixu a sice jsem dostal od Caldy vynadáno, ale vyřešil jsem to dobře a on měl spíš připomíky k tomu co chtěl ale neřek... To u Forsta neni problém, protože to zadání jsme fakt rozebírali asi třičtvrtě hodiny, a nezačne se pracovat dokud má někdo nějaký dotazy, a na dotazy neni nějaký množstevní omezení, prostě aby všichni věděli co se po nich chce... Večer před písemkou jsem si ěště zkoušel, jak přesně se chovaj některý příkazy - třeba jestli se dá napsat

Kód: Vybrat vše

if echo "$promenna" | grep -E '@'; then ...
(dá, fakt to otestuje jestli $promenna obsahuje zavináč :-) ), taky jsem si vytisknul manuálový stránky od pár důležitejch příkazů abych nemusel běhat k tomu jednomu počítači co byl k dispozici... No a taky jsem si stáhnul ten soubor s těma známejma otázkama který dává, ale má to asi 40 stran, to je k ničemu. Prostě když se v tom člověk trochu vyzná, tak to nějak vymyslí, kdybych to měl všechno číst, tak mi to zabere celej víkend... Nemyslim si o sobě že jsem nějakej velkej unixák, na matfyzu jsem používal unix poprvý, ale vim na co je kterej příkaz dobrej a jak zhruba se používá a dokážu vymyslet jak něco řešit a to stačí.

Který věci jsou podle mě klíčový:
-umět pracovat s proměnnejma (nastavit, použít, vědět na co jsou znaky " ' ` \, echo, read - zejména na čtení std vstupu, ale i souborů, speciální proměnné jako $1, $#, $?, $$)
-umět pracovat s adresářema a souborama (cat, <, >, >>, udělat si dočasný soubory a složky, porovnat různý časy u souborů (vzniku, změny, atp.), nedělat cat "ahoj karle"|příkazy > "ahoj karle" (nejde soubor zároven číst a zapisovat do něj, je potřeba mít druhej soubor a pak to překopírovat), umět touch, rm)
-často se nějaká datová struktura dá vhodně reprezentovat v souborovym systému - třeba jen těma souborama a složkama, ty soubory často můžu bejt prázdný a mě bude stačit znát jejich jména a třeba čas modifikace, pak se s tim často pracuje líp než když si člověk ty informace uchovává v jednom souboru
-je určitě potřeba if, while, možná case (dá se bez něj), test
-ls, find, grep, sed (pokud chcete tak i ed ale já všechno dělám sedem), expr, eval, cut
-je šikovný umět psát funkce, pak si člověk občas ušetří psaní
-může se hodit umět spustit příkaz(y) v subshellu - například uzavřením do kulatých závorek - ten subshell má totiž vlastní proměnné, takže se takle dá třeba rekurzit

mno, možná jsem to trochu přehnal, ale něco jsem třeba vynechal - každopádně je hodně užitečný kamarádit se asi se vším výše uvedeným :-) asi nejdůležitější jsem teda ěště vytučnil

TED ĚŠTĚ K TOMU ZADÁNÍ Z PÁTKU

Napsat make. Pak Forst řek: "co dělá make jsme brali na poslední přednášce, takže víte co máte udělat, tak já jdu :-)". no a pak nám to třičtvrtě hodiny vysvětloval :-D
v aktuálním adresáři máte nějaký hafo souborů a soubor Makefile. Make slouží k překládání prgramů z vícero zdrojovejch souborů a jak t má dělat se dozví v soubou Makefile. Ten má takovýto formát:

Kód: Vybrat vše

program.bin: sdfgwdf.o ttzjnetz.o sdfgbsfdcg.o
\t pikaz prikaz prikaz
\t pikaz prikaz prikaz
sdfgwdf.o: edtzjsd.c hgwera.h adfgadrfecga.c
\t prikaz prikaz
atd....
(tím \t myslím tabulátor)
vždycvky to před tou dvojtečkou je tzv. target neboli to co chci získat; je to taky jediný partametr který dostanu (třeba make program.bin). to za tou dvojtečkou jsou targety, na kterých závisí, a ty mohou mít v tom Makefile taky svůj záznam atd., takže takhle vzniká takový strom závislostí (forst řikal, at si vybudujeme nějakým způsobem ten strom jak to na sobě závisí, ale myslim že to nikdo nedělal, většina z nás to dělala prostě rekurzí)
pravidla jsou:
target se nemusí překládat, pokud platí všechny podmínky:
- žádný z targetů, na kterých závisí, se nemusí překládat (neboli volání rekurzivně sebe sama na všechny závisláky)
- existuje (protože je to název souboru, který má vzniknout překladem) (test -f)
- všechny targety na kterých závisí, byly naposledy modifikovány dříve než on (protože pokud změním zdrojáky, musím znova přeložit program) (prej to taky umí test, takže whilecyklus pro všechny targety; taky to jde přes stat)
(takže není divu, že jsme to řešili rekurzí, ta z toho úplně čiší)

přeložit target znamená prostě provést všechny jeho příkazy - to jsou příkazy co jsopu pod ním, nad následujícím targetem

doplnění zadání:
-target bez závislostí se překládá vždy
-jsou tam commenty - jeden sed a byly pryč :-)
-příkazy můžou mít na začátku [@-]: - znamená nespadnout při chybě (testovat $? a bud spadout nebo ne), @ znamená netisknout prováděný přkaz na obrzovku (jinak vytisknout); jestli tam jsou jsem zjištoval přes cut -c2 | grep, a pak jsem odřínul ze začátku příkazu patřičný počet znaků a pustil na to eval
-existují řádky

Kód: Vybrat vše

nazev = tohle je obsah proměnné která se jmenuje nazev
to je definice proměnné; kdkoliv v Makefile se pak může objevit $nazev a je třeba to nahradit obsaem proměnné - tohle jsem řešil takhle:
ve while cyklu jsem zjištoval, jestli jsou v Makefile nějaké řádky s definicí proměnné (grep), a pokud ano, sedem jsem nahradil všechny výskyty té jedné proměnné tím jejím obsahem, smazal ten řádek s definicí, uložil to, a tak pořád, dokud tam nějaké definice byly

jak říkám, dělal jsem to rekurzí
měl jsem dva skripty - první, kterejmi zopracoavl vstup a zavolal ten druhej, a ten se pak rekurzil do aleluja a nakonec se vyrekurzil a bylo hotovo

zpracování vstupu teda bylo jednak nahrazení těch proměnnejch a tak (viz výše), a pak jsem si to rozsekal po těch jednotlivejch targetech (while read radek; do case - tady '\t') pro příkazy a '*') pro targety), po každej target jsem si udělal složku s názvem=název targetu a do ní jednak soubor prikazy (tam jsem >> nasypal ty příkazy) a jednak zavislosti (tam jsem měl na každym řádku jednu závislost)
no a v tý rekurzi jsem (v subshellu) testoval, jestli se musí target překládat, pokud ano tak se přeložil, a jako návratový kód vracel 1 (pokud bylo potřeba jej překládat) nebo 0 (pokud jej a tedy ani žádný z jehoi závisláků nebylo poptřeba přeložit)
a to je vlastně vše :-)

ěště se mělo testovat, jestli tam není cyklická závislost (pak by se ten make zacyklil) - to jsem nestih napsat, ale v tý rekurzi bych na začátku ve složce toho targetu vytvořil soubor "zamek" a na konci ho zase smazal. no a když bych před vytvořním toho souboru otestoval, jestli už tam náhdou není, tak bych tím zjistil, jestli nejsem v cyklu :-)

přeju dobrou no a jdu spát :-)
Uživatelský avatar
Donarus
Matfyz(ák|ačka) level III
Příspěvky: 194
Registrován: 30. 9. 2007 12:40
Typ studia: Informatika Mgr.

Re: Zkouška Forst 23.5

Příspěvek od Donarus »

to je přesně ono... někdo kdo umí věci nejen řešit, ale i popisovat :D :D ... rozhodně lepší popis než ode mě... jinak můj neefektivní postup řešení

1) odstranění komentářů
2) nasypání všech proměnných do TMP složky a souborů s názvem proměnné pro každý z nich a obsahem stejným jako obsah proměnné .. (tady pozor v tvém předchozím řešení to nevidím, ale pokud nebyl v proměnné text, ale příkaz, bylo nutné to odevalovat... ale to si teď nejsem jistý jestli tam bylo.... říkal něco o tom že to vpodstatě nejsou proměnné ale můžeme předpokládat že to jsou kostanty (a teď fakt neviím jestli myslel konstanty jako řetězce, nebo konstanty, že tam je třeba příkaz, ale to asi záleží na každém jak to pojme)
3) pro každý target jsem si udělal soubor ve speciální tmpsložce a na kazdy radek nasypal jednu zavislost - nakonec nejaky specialni radek, napr #KONECZAVISLOSTI . ted jsem si vyexportoval ls -1 do promenne a jeste si do specialni promenne hodim prvni target z celeho souboru (muzu udelat pozdeji ale to bych zapomel :))... vsechny tyto soubory jsem ted prosel takto... otevru soubor, kouknu na zavislost - vyhledam soubor s touto zavislosti. pokud neexistuje, zalozim a napisu do nej, pokud existuje tak jen napisu do nej .. ted tedy mam soubor ve formatu

zavislost1
zavislost2
zavislost3
#KONECZAVISLOSTI
rodic1
rodic2
rodic3

a ted uz je to jednoduché....
mám funkci, která vyhledá target (jestli tam je, to je jednoduchý dostat z te me promenne, kam jsem si exportoval LS... pokud tam neni, tak pouziju nalezeny prvni target)... pokud tam je, tak se kouknu do toho souboru, ktery mu vyhovuje a zkontroluju vsechny zavislosti [ file1 -nt file2 ] a jestli ten soubor existuje......
pokud je nejaka yavislost porusena, tak musim postavit target a jeho rodice a jejich rodice ... :D az dojdu k vrcholu.. to uz je jednoduche :D



takze pokud je to porusene, tak si do tmpfilu prikazy ulozim prikazy z aktualnihoa targetu.... nasipu vsechny rodice do fajlu rodice1. pro kazdeho rodice ulozim prikazy a nasipu si jejich rodice do fajlu rodice2. jakmile projdu vsechny rodice z fajlu rodice1(a taky si nekam postupne musim ukladat ktereho rodice jsem uz provedl), tak zcheckuju jiz provedene rodice s fajlem 2 a smazu dvojite vyskyty.... prohodim obsahy file1 a file2 a vynuluju file2... a zacinam znovu (je to vpodstate jeden while cyklus, tady se blbe popisuje ale stacilo mi cca 20,25radku...) jakmile projedu ten cyklus a v rodice 2 neni jediny znak, tak koncim cyklus......

ted mam v suoboru prikazy ulozene vse co se ma provest... jednoduse zasubstituuji promenne v tom filu a radek po radku ctu a provadim... kontrola -@ uz je jednoducha... hlavne to -@ nezapomenout odstranit jako ja

=========

jako měl jsem to až moc složité, ale tak zase když člověk takhle pracuje se souborama, tak má o to jednodušší práci v kódu

moje adresářová struktura byla

tmp/TMP
-----/variables
-------------nazevpromenne1
-------------nazevpromenne2
.
.
-----/targets
-------------jmenotargetu1
-------------jmenotargetu2
.
.
-----/other
-------------rodice1
-------------rodice2
-------------prikazy


fakt sila co jsem to dokazal vymyslet za hovadinu ...... mno ale ja bych to ani nedelal.... jsem jsem nevedel jak to psat a uz tlacil cas tak jsem zacal.... no a po hodine jsem uz vedel jak by to slo udelat jednodusejc, ale tak zacit psat znovu uz se mi nechtelo......
Him
Supermatfyz(ák|ačka)
Příspěvky: 400
Registrován: 25. 1. 2008 19:59
Typ studia: Informatika Bc.

Re: Zkouška Forst 23.5

Příspěvek od Him »

Konecne jsem to dal dohromady, pokud by na to chtel nekdo mrknout, je to zde: http://www.martinvseticka.eu/index.php? ... wse&page=2

(Omlouvám se, pokud ta moje řešení budou brána za spam O:-))
Pracoval jsem na poměrně hodně materiálech pro různé předměty. Pokud Ti něco z toho ušetřilo čas, vyjádři svůj dík v podobě pár satoshi: 1H5JPTrsXie7epAQXbXhMjdgwyLbJ5NHBW ;)
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“