Beadandó feladatok - UNIX

Olvassa el figyelmesen a feladatok előtt levő (itt következő) tudnivalókat! (Hosszú, mert igyekszem mindent szabályozni, és mindent leírni, amit meg szoktak kérdezni.)

A kiadott feladatok közül legalább kettőnek a megoldását kell majd beadni.

Legalább egyet legkésőbb április 29-én, összesen legalább kettőt, legkésőbb május 6-án. Más szavakkal (félreértések ellen): május 6-án éjfélig legalább kettőt, ebből legalább egyet április 29-én éjfélig (és ennek akkorra működni is kell!).

Minden feladatra érvényes követelmények:

Ha a feladat nem ír elő mást, akkor sikeres normál végrehajtás vagy "--help" esetén 0, hibaesetekben pedig 1 legyen a parancsfájl státusz kimenete, az esetleges hibaüzenetek a standard error-ra kerüljenek, és minden hibaüzenet sor végén felkiáltójel (!) legyen!

Ha a parancsfájlt a "--help" opcióval hívják meg, akkor nem a feladatát kell ellátnia, hanem a standard outputra ki kell írnia minden fontos, a scriptre vonatkozó információt, de legalább az alábbiakat:

Primitív, silány help a legrosszabb minősítésű (de ha hibátlan, akkor elfogadott) beadandót eredményezi.

Ha egy parancsfájl ideiglenes fájlokat (más szóval munkafájlokat) vagy directorykat hoz létre, akkor:

Itt olvashat részletesebb leírást az ideiglenes fájlok jó és rossz használatáról.

Tesztfájl vagy eredményfájl neve ne legyen "beégetve" a scriptbe.

A script csak azt írja ki, amit a feladat kér! Tehát ne legyen benne (ha nem kéri a feladat) képernyő törlés ("clear" parancs), a script ne írjon kéretlen kommentárokat (pl. a script saját magának vagy a készítőjének a "reklámozása", kommentárok, üres sorok, ...). A Unix parancsok sem tesznek ilyet.

Ha a feladat nem kéri, ne jelenjenek meg semmilyen esetben Unix parancsok hibaüzenetei a képernyőn!

A saját hibaüzenetei és a --help szövege lehetnek ékezetesek vagy anélküliek. Az ékezetes betűk kezelésével kapcsolatos leírást itt talál. Olvassa el, ha ezzel kapcsolatos gondja akad.

A tananyagban nem szereplő, Unix alatt (is) használható programozási eszközökkel (pl. c, perl, Pascal) megvalósított megoldásokat nem fogadok el.

Shell scriptet kell írni, vagyis a "/bin/bash script_neve" paranccsal végrehajtható parancsfájlt. Tehát ha pl. awk programot ír, akkor az awk-t direkt meg kell hívnia a shell scriptnek, a tesztelő program nem fogja jól futtatni a "#!/bin/awk" kezdetű awk scripteket. A script elején felesleges (sőt elírási hibalehetőség) a #!/bin/bash tartalmú sor.

A feladatokat mindenkinek egyedül kell megoldania, semmiféle "csapatmunka" nem megengedett ! A puskázás gyanúját is kerülje ! (Puskázásból több baja származhat a beadottakkal kapcsolatban, mint akármi másból.) A beadási határidők után olyan scripteket futtatok, amik nem csak beadandó azonosságot vesznek észre, hanem "hasonlóság"-ot is számolnak.
Megjegyzések:

Nem működő beadott annyival rosszabb a be se adottnál, hogy az azt kiértékelőt feleslegesen dolgoztatja. A nem tesztelt beadott nem számít beadottnak, az utólagos javítására nincs lehetőség! (Annyit sem ér, mint ha be se küldte volna.)

Bizonyos méret fölötti scripteket nem fogadok el. Erre nem lehet - feladattól független - értelmes merev határt szabni, félévenként csak pár ilyen böhömnagy scriptet kapok, mindegyikben az okozza az irdatlan méretet, hogy a készítője nem tud, vagy nem akar ciklust szervezni. A méret megállapításánál elhagyom a --help szöveget, a kommentárokat és a tagoló jeleket (pl. helyköz, sorvége jel), tehát ezeken felesleges spórolni. Elfogadható méretű scriptek kisebb vagy nagyobb mérete nem eredményez "+-"-t az értékelésben. (Tájékoztató bruttó adatok: korábbi 7 félév átlagos script mérete 157 sor ill. 3560 byte, az átlagba nem számítottam be 3 db 2000 sor feletti scriptet.)

A beadás szabályai:

A megoldásokat tartalmazó fájlokat levél mellékleteként ("pine" Attchment) küldje el az alul is megadott progkor@fi.inf.elte.hu címre. (Vigyázat, a "fi" gépről van szó! Erre a címre a megoldásokat küldje, olyan levelet, amire "választ" vár, "csa@inf.elte.hu"-nak küldjön.)
Csak a panda-ról (vagy pandora-ról), pine-al küldött levelekben fogadok el Unix beadandókat!
Ugyanazon feladat többszöri küldése esetén az utolsó küldés felülírja a korábbit. A levél SUBJECT-je legyen "Unix-beadando".

A fájlok neve kezdődjön a unix szóval (csupa kis betűkkel!). Ezt minden feladat esetén a feladat sorszáma (1, 2, ...) kövesse. Ha egy feladat megoldása további fájlokból áll, azok neve kezdődjön ugyanúgy, mint a megoldás "fő"-fájljáé, és kapjon valami "kiterjesztést"-t. Pl. a 3. feladat megoldása a unix3 fájlba kerüljön, s ha további két fájl tartozik a megoldáshoz, akkor ezek neve lehet pl. unix3.awkpar ill. unix3.sedpar. A szabálytalan nevűeket (pl. UNIX1, Unix1, unix01, unix1.sh, bead1 (unix1 helyett), unix1teszt) át kell neveznem az értékelés előtt (ha nem veszem észre, értékelve sem lesznek).) Minden szabálytalan fájlnév -1 pontot ad a zh eredményéhez!

Nem szabad tesztadatokat és teszt eredményeket beküldeni! A scripteket külön-külön Attachment-ként, a megfelelő néven küldje be, egy levélben akárhány fájlt. (Vagyis ne küldjön csomagolt (tar, zip, gzip, stb) fájlt!)

Csak igen indokolt esetben álljon egyetlen feladat megoldása több fájlból. Írjon "alscript" helyett inkább function-t! Mindenképp tesztelje és biztosítsa (alscript esetén), hogy akkor is működik a megoldása, ha az egy feladat megoldására szolgáló scriptek azonos directoryban vannak, de az nem programkönyvtár, nem a HOME könyvtár és (a script futtatásakor) nem az a munkadirectory. (Ha nem boldogul ezzel, keresse a "readlink"-et az előadás emlékeztetőben.)

Tehát a levél maga soha ne tartalmazza a megoldást! (Kommentárokat se, a levelet el sem fogom olvasni, tehát legyen teljesen üres! Ennek megfelelően, minden, a megoldásra vonatkozó kommentárt a megoldást tartalmazó fájlokba tegyen, ill. a --help-be írja - ld. alább.)

Az elküldéskor a pine-ba "Cc:"-ként írja be a saját címét, így hamar ellenőrizheti, hogy mit küldött.

Megjegyzések:

Csak az itt leírtaknak megfelelő megoldást fogadom el. (Ezt tudom Unix scripttel feldolgozni.)

Tesztadatok, tesztelés:

Töltse le a teszt.tgz fájlt, és csomagolja ki:
    tar -xvzf teszt.tgz
A pand(or)a-n egyszerűbb így megszerezni:
    tar -xvzf /h/public/c/csa/public_html/200708.2/teszt.tgz

A kapott TESZT directory teszt1, teszt2, ... aldirectoryjaiban a következők vannak:

Amelyik script nem jut túl sikerrel ezeken a tesztadatokon és a "--help" teszten, azt "teszteletlennek" minősítem, ami a beadott megoldás "diszkvalifikálása". ("Teszteletlennek" minősítem még az olyan megoldást, amibe a kiadott tesztadatokra történő helyes működés be van drótozva. Más szóval: ami szemmel láthatóan csak azokra működik.)

Próbálja ki a panda-n és a pandora-n a beadott feladatokat akkor is, ha nem azokon készíti. Azokon kell működni a scripteknek.

Scriptenként megadok a README fájlban olyan idő limitet, aminél hosszabb ideig futó scriptet leállítok és teszteletlennek minősítek. Ez a limit elég tág, de minden nem fér bele. Az ezen belül lefutó scripteket osztályozom aztán - feladatonként változó, a beadandók ismeretében megállapított limitekkel - lassú, átlagos, gyors scriptekre, ami "-" ill. "+" pontokkal járhat. A legkönnyebb két scriptre nem adok "+" pontot. (Az a kettő lesz a legkönnyebb, amit a legtöbben választanak!) Minden leállítás -1, a zh. eredményét csökkentő pontot ér. (Többségében nem lassú, hanem végtelen ciklust tartalmazó, és főleg billentyűzetre váró teszteletlen programokat kell leállítanom. Az egész tesztelést - a többieket - akadályozza, aki ilyen selejtet küld be.) Megjegyzések:

Minden hibásan beküldött script -0,5, a zh. eredményét csökkentő pontot ér. Felesleges munkát ad, és a többieket akadályozza az, aki készít egy szerinte (talán) jó scriptet, de nem tudja vagy nem akarja a tesztprogrammal kitesztelni, hanem beküldi, hogy teszteljem én.

Segítség kérés:

A határidők napjait kivéve mód van arra, hogy aki valamilyen hibával nem boldogul, az a gyakorlatvezetőjétől vagy tőlem - órán vagy levélben - segítséget kérjen. (Levélben akkor lehet segíteni, ha az illető mellékeli a scriptet és a problémája leírását.) A segítség mértéke a szabad időnktől függ. Nem lehet magántanítvány jellegű "gyorstalpaló" tanfolyam, és nem arra szolgál, hogy "kőleves" módra készítsen valaki beadandót (a mesét nem részletezném). A tantárgyi fórumot sem illik az utóbbi céllal használni.

A beadás visszaigazolása:

A beadást követő egy héten belül (az utolsó két héten egy-két napon belül, utolsó nap órákon belül) felkerül a neve és a beadott feladatainak a directory listája egy másik html-lapra. Ha ez nem történik meg, reklamáljon, és küldje újra a megoldásokat.


A feladatok.

Az első három feladatban tetszőleges hosszúságú (amit a Unix paraméterként megenged), előjeles egész számokat kell összeadni, szorozni, osztani, az erre alkalmas Unix programok (bc, dc) használata nélkül. Egy "előjeles egész szám" a 0-9 számjegyekből állhat, amiket esetleg egy mínusz ("-") előjel előz meg. A számok elején (az értékes jegyek előtt) nem lehetnek értéktelen nullák, kivéve a nulla megadását egyetlen 0-ás számjeggyel.

1. feladat.

Írjon Unix scriptet, ami a paraméterként kapott két tetszőleges hosszúságú egész számot összeadja, és az eredményt a standard outputra írja.

A script nem használhatja a bc és dc parancsokat! (A megoldás a "bc" vagy "dc" stringet sem tartalmazhatja!)

2. feladat. (nehéz)

Írjon Unix scriptet, ami a paraméterként kapott két tetszőleges hosszúságú egész számot összeszorozza, és az eredményt a standard outputra írja.

A script nem használhatja a bc és dc parancsokat! (A megoldás a "bc" vagy "dc" stringet sem tartalmazhatja!)

3. feladat. (nehéz)

Írjon Unix scriptet, ami a paraméterként kapott két tetszőleges hosszúságú egész szám közül az elsőt osztja másodikkal, és az eredmény egész részét a standard outputra írja. (Vagyis nem a hányados egyészre kerekített értékét!) Az osztó nem lehet nulla (ha mégis az, azt paraméter hibának kell tekinteni).

A script nem használhatja a bc és dc parancsokat! (A megoldás a "bc" vagy "dc" stringet sem tartalmazhatja!)

4. feladat.

Írjon szűrőt, aminek az inputja (a paraméterként kapott fájlból vagy a standard inputról) a last parancs eredménye egy teljes napra. A teljes nap azt jelenti, hogy az aznapi bejelentkezésekhez tartozó sorokat tartalmazza, a kijelentkezés történhet másnap is.

Határozzuk meg azt az időpontot (óra-perc, a [00:00-23:59] intervallumban), amikor a legtöbben dolgoztak a gépen, és azt, hogy akkor hányan. Több ilyen időpont esetén az (időben) utolsót kell kiírni. Az eredmény a standard outputra kerüljön, "óó:pp darabszám" alakú sorban. Üres inputra vagy üres sorra üres outputot adjon a script.

A last által előállított sorok szerkezete az alábbi mintából látszik. (Fejlécet nem ír a last, a könnyebb megértés végett tettem az elejére.)

    user_id  /dev         host             Bejelentkezés      Kijel. Időtartam
    tkiss    pts/50       neumann.cs.elte. Fri Feb 20 11:15   still logged in
    arrostia pts/21       82-131-129-237.v Fri Feb 20 10:15 - 10:20  (00:04)
    pifta    pts/8        virus.csoma.elte Wed Feb 11 22:21 - 16:33  (18:12)
    zui      pts/50       csomalin.csoma.e Wed Feb 11 13:29 - 09:24 (2+19:55)
    mmilan   tty1                          Mon Dec 22 11:52 - 14:54 (28+03:02)
    vadito   pts/220      lovi53.lovi.inf. Tue Dec  2 15:29    gone - no logout

Megjegyzések a mintához:

Feltételek:

Megjegyzés:
Mivel éjfél körül kevesen dolgoznak, a 0 óra előtt bejelentkezettek hiánya gyakorlatilag nem nagyon zavarhatja az eredményt.

5. feladat.

Írjon szűrőt, aminek az inputja és a feltételei ugyanazok, mint az előző feladatban. Annak a user-nek a gépen összesen eltöltött idejét és az azonosítóját kell a standard outputra írni ("óó:pp user_id" alakú sorban), aki aznap összesen a legtöbb időt töltötte a gépen.

A kerekítések bizonytalansága miatt annyi percnek tekintsük egy felhasználó eltöltött idejét, ahány kerek perckor (a [00:00-23:59] intervallumban) ott van a gépen. (A be- és kijelentkezés időpontjában "ott van a gépen" a felhasználó.)

Az előző feladat feltételei mellett a következők érvényesek:

6. feladat. (nehéz)

Egy script paramétere egy fájl, ami egy Unix directory (a továbbiakban "fődirectory") belsejéről tartalmaz információkat. Minden sor egy fájlra vagy directoryra vonatkozik. A sorok szerkezete:
    inodeszám/szülő_inodeszám/név/fájlméret_byte

A "név" a fődirectory esetében ".", a többi esetben pedig a (teljesen) relatív ("/"-jel nélküli) fájl- vagy directory-név.

A fájlt olyan sorrendbe kell rendezni, hogy abban "gyerek" sora ne előzze meg a szülőjének a sorát. Az eredmény a standard outputra kerüljön.

Feltételezheti, hogy a paraméterként kapott fájl (amennyiben létezik) helyes inputot tartalmaz. (Ami azt is jelenti, hogy a fődirectoryn kívül nem tartalmaz "árvát".)

A megoldásban nem használhatja a tsort parancsot! (A megoldás a "tsort" stringet sem tartalmazhatja!)

7. feladat.

Írjon szűrőt, ami ellenőrzi, hogy az inputként kapott html lap "párban" tartalmazza-e az első paraméterként kapott "alapszó"-t. (Tehát vagy a standard inputon vagy a 2. paraméterként kapott fájlban van a html lap.)

A "párban" azt jelenti, hogy az "alapszó" nyitó és záró hivatkozásai párban, nyitó-záró sorrendben kell, hogy előforduljanak, a párok nem "egymásba skatulyázhatók".

A hivatkozások között akármi állhat (pl. sorvége jel is).

A nyitó hivatkozás "<alapszó>" vagy "<alapszó " vagy sor végén álló "<alapszó" valamelyike lehet. A záró hivatkozás "</alapszó>" vagy "</alapszó " vagy sor végén álló "</alapszó" valamelyike lehet. Tehát az "<alapszó" ill. "</alapszó" belsejében nem lehet elválasztó jel (pl. helyköz, tabulátor, sorvége).

Az alapszavakban a kisbetű és a megfelelő nagybetű azonos értékű, csak az angol ABC betűi fordulhatnak elő.

A script státusz kimenete legyen 0 ill. 1, aszerint, hogy "párban" szerepel-e az alapszó vagy nem. Utóbbi esetben a standard outputra kell írni annak az input sornak a sorszámát, amiben az első "párja nélküli" alapszó áll. (Tehát ebben a sorban vagy egy nyitó alapszó áll, aminek nincs lezáró párja, vagy egy lezáró alapszó, aminek nem volt nyitó párja.)

8. feladat. (nehéz)

A feladat ugyanaz, mint az előző, azzal a módosítással, hogy a nyitó-záró alapszó párok egymásba is skatulyázhatók.

Csizmazia Albert progkor@fi.inf.elte.hu