Menu

Odevzdávání domácích úkolů

Domácí úkoly odevzdávejte výhradně následujícím způsobem: Úkol pošlete na e-mail stinovlas+unix@kam.mff.cuni.cz. E-mail posílejte jako prostý text (nikoliv HTML) a zdrojový kód pište buď přímo do jeho těla, nebo jako přílohu. Předmět musí být ve tvaru DU?? Jméno, tedy jednoznačný identifikátor úkolu (u každého úkolu je uveden) a jméno nebo přezdívka, kterou si zvolíte na začátku semestru (viz první domácí úkol). Jméno prosím uvádějte vždy ve stejném formátu. Neposílejte více úkolů v jednom e-mailu.

Dodržte prosím všechny výše uvedené instrukce, jinak hrozí, že se váš e-mail s úkolem někam zatoulá.

První série (do 8. 3. 12:00)

DU11 (1b, povinný): Vytvořte e-mail podle pravidel výše. Napište mi své jméno, že ke mně budete chodit na cvičení a pokud si přejete použít v tabulce s body za domácí úkoly nějakou přezdívku, tak jakou (měla by být i v předmětu e-mailu).


DU12 (1b): Vypište akutální čas a datum ve formátu DD. MM. YYYY hh:mm. Použijte příkaz date.


DU13 (2b): Vytvořte sérii příkazů, které vypíšou souhrnou velikost (v bajtech) všech souborů s příponou .txt ve vašem domovském adresáři. Nezapomeňte na skryté soubory. Může se hodit příkaz wc, slovo „celkem“ ve výstupu nám zatím vadit nebude. Pozn.: Stačí nám znalosti z prvního cvičení, nepotřebujeme rouru.


DU14 (2b): Zjistěte jakou kombinaci přepínačů musím použít, pokud chci, aby příkaz ls vypsal soubory v pořadí od nejměnšího k největšímu, jeden soubor na jeden řádek a pro každý soubor vypsal jeho velikost v „lidsky čitelných jednotkách“ (K, M, G, …). Příklad výstupu:

7,0K matlab_crash_dump.6491
 92K cz.map
131K mapa-most-zapad.png
1,8M mapa-most-detail-sever.png

Druhá série (do 17. 3. 12:00)

DU21 (2b): Napište příkaz, který zašifruje libovolný text načtený na standardním vstupu caesarovou šifrou (tedy cyklicky posune všechny znaky v abecedě o 2 dál). Šifrujte písmena anglické abecedy (malá i velká) a číslice (přičtěte 2 a modulte deseti). Ostatní znaky ponechte beze změny.


DU22 (3b): Napište sekvenci příkazů, které zjistí, zda se na prvním řádku souboru palin vyskytuje palindrom (tedy řetězec, který se čte stejně zleva jako zprava). Pokud ano, vypište Y, pokud ne, N. Dočasné soubory po sobě smažte. Nepoužívejte shellové podmínky nebo testování rovnosti, vše zvládnete pomocí prostředků z prvního a druhého cvičení.

Třetí série (do 24. 3. 12:00)

DU31 (3b): Napište skript, který vytvoří adresář s názvem zadaným jako parametr skriptu na příkazové řádce ($1) v adresáři /tmp a jeho práva nastaví tak, aby se k obsahu souborů uvnitř mohl dostat kdokoliv, ale vypsat obsah adresáře mohl pouze jeho vlastník. Dále skript v tomto adresáři vytvoří soubor s náhodným názvem (použijte proměnnou $RANDOM) a nastaví mu práva na čtení a zápis vlastníkem (skupina ani ostatní nebudou mít žádná oprávnění) a vypíše jeho jméno (i s cestou, tj. /tmp/nazev_adresare/nazev_souboru. Nakonec skript smaže adresář a všechny soubory v něm.


DU32 (2b): Představte si program wc (bez parametrů a jména souboru) jako zobrazení z řetězců do řetězců (např. a b c\nde\n → 2 4 9\n). Najděte jeho pevný bod (tedy řetězec, který se zobrazí právě sám na sebe) a napište, jak jste to udělali. Rozhodněte též (a zdůvodněte), zda existují nějaké další pevné body.

Čtvrtá série (do 2. 4. 12:00)

DU41 (3b): Napište zálohovací skript. Jeho parametrem bude adresář, jehož obsah chceme zazálohovat. Skript vytvoří jeho kopii v adresáři /tmp. Název kopie musí obsahovat jméno kopírovaného adresáře a aktuální datum. Pozor na to, skript může dostat jako parametr plnou cestu k adresáři (neukončenou lomítkem), do názvu kopie chceme ale jenom název adresáře samotného – ne celou jeho cestu. Např. pokud dostane dne 19. 3. 2016 skript argument /home/stinovlas/Dungeons & Dragons/rulebooks, musí uložit kopii jeho obsahu do adresáře /tmp/rulebooks-2016-03-19. Postarejte se o to, aby byla zachována práva kopírovaných souborů a dejte si pozor na mezery v názvech souborů.


DU42 (3b): Napište skript, který projde všechny soubory v aktuálním adresáři (můžete předpokládat, že se jedná jen o obyčejné soubory, ne adresáře) a vypíše u každého z nich, zda k němu máte nebo nemáte právo na čtení (slovy ANO nebo NE). Použijte jen prostředky probrané do 4. cvičení včetně.

Pátá série (do 5. 4. 12:00)

DU51 (3b): Napište skript, který bude načítat posloupnost čísel na standardním vstupu (jedno číslo na řádek) a po ukončení vstupu vypíše délku nejdelší souvislé rostoucí podposloupnosti. Řešení může být i hloupé, ale určitě by mělo být polynomiální.


DU52 (4b): Napište skript, který vypíše všechna prvočísla mezi 1 a $1. Používejte pouze dosud probrané techniky (obzvláště nezkoušejte používat bashová pole). Smíte použít řídící příkaz break pro vyskočení z cyklu. Počet bodů se bude odvíjet od efektivity a elegance řešení. Za každé funkční řešení dostanete alespoň 1 bod. Hranice 4 bodů dosáhnou obzvlášť efektivní nebo obzvlášť elegantní řešení.

Šestá série (do 16. 4. 12:00)

DU61 (až 9b): Zahrajte si Regex Crossword. Úkolem je vyplnit křížovku (do každého políčka jeden znak) tak, aby řetězce ve sloupcích i v řádcích odpovídaly příslušným regulárním výrazům. Výrazy se vztahují na celý řádek, jako kdyby byly uzavřeny mezi ^ a $. Jedná se o extended regulární výrazy. Pokud někde potkáte \d, znamená to totéž co [0-9]. Stejně tak \s zastupuje bílé znaky (např. mezeru). Jako řešení mi pošlete screenshot, kde bude vidět kolik jste nahráli. Za každý zcela dokončený level dostanete 0.75 bodu, za levely Experienced, Volapük a Hamlet dokonce 1.5 bodu! Nedokončené levely budu hodnotit individuálně.

Sedmá série (do 1. 5. 12:00)

DU71 (3b): Napište v sedu rev (bez přepínačů).


DU72 (3b): Napište příkaz, který bude vypisovat řádky (načtené ze standardního vstupu), na kterých se vyskytuje stejný počet souhlásek jako samohlásek. Na řádku vyskytují pouze malá písmena anglické abecedy a mezery. Počet bodů za tento domácí úkol se bude odvíjet od jeho délky. Čím kratší, tím lepší. Baseline je 70 znaků -- za ty dostanete 3 body. Budete-li mít řešení kratší, získáte bodů více, za delší méně. Cvičící umí řešení na 61 znaků (bez započítání znaku nového řádku na konci, se započítáním volání příkazu sed).

Osmá série (do 9. 5. 12:00)

DU81 (6b): Napište šablonovací systém. Váš skript dostane jako parametry dva názvy souborů -- první obsahuje šablonu a druhý definice proměnných. Soubor se šablonou je obyčejný textový soubor, který v sobě mj. obsahuje řetězce z obou stran obehnané znakem @. Řetězec uvnitř těchto znaků je identifikátor, který chceme nahradit (identifikátor neobsahuje znak nového řádku). Soubor s proměnnými obsahuje identifikátory a jejich hodnoty, oddělené rovnítkem, jednu dvojici na řádek. Váš skript vypíše šablonu, v níž jsou identifikátory (i s ohraničujícími @) nahrazeny za své hodnoty.

Příklad šablony:
Vážený pane @JMENO@, zasíláme vám fakturu vaší 
objednávky č. @C_FAKTURY@ ze dne @DATUM@.

Heslo, pod kterým můžete svou objednávku sledovat
je @HESLO@.
Příklad souboru s proměnnými:
JMENO=Jan Novák
HESLO=^jKleizt$afa!
DATUM=25. 4. 2016
NEVYUZITA_PROMENNA=nic...
C_FAKTURY=123456
Příklad výstupu:
Vážený pane Jan Novák, zasíláme vám fakturu vaší 
objednávky č. 123456 ze dne 25. 4. 2016.

Heslo, pod kterým můžete svou objednávku sledovat
je ^jKleizt$afa!.

Devátá série (do 14. 5. 12:00)

DU91 (4b): Napište v AWK program, který zformátuje odstavce na právě 50 znaků na řádek, mimo posledního řádku (ten se nezarovnává). Odstavec se pozná tak, že je to souvislý text neobsahující prázdné řádky.

Příklad vstupu:
Královna: Zlá novina králi! Hamlet 
se nám zase schoval. 

Král: Škoda, 
chtěl jsem mu zrovna říct: Co ty, Hamlete, synovče a synu? Cože tě pořád obestírá 
chmura? 

Ale jako bych ho slyšel, co na to řekne: 
Naopak, vždyť jsem na výsluní přízně. 

Královna: Ano, je to celý on. 
A víš, co já bych mu na to řekla? 
Řekla bych: Hamlete, odlož konečně 
tu čerň a přátelsky hleď na dánského 
krále! Nepátrej po 
svém urozeném otci. Je to tak běžné: živí musí zemřít. 

Král: Správně. A víš, co by ti na to řek? 
Příklad výstupu:
Královna:   Zlá   novina   králi!  Hamlet  se  nám
zase schoval.

Král:   Škoda,  chtěl  jsem  mu  zrovna  říct:  Co
ty,   Hamlete,  synovče  a  synu?  Cože  tě  pořád
obestírá chmura?

Ale   jako   bych  ho  slyšel,  co  na  to  řekne:
Naopak, vždyť jsem na výsluní přízně.

Královna:   Ano,   je   to   celý on.  A  víš,  co
já  bych  mu  na  to  řekla?  Řekla bych: Hamlete,
odlož   konečně   tu  čerň  a  přátelsky  hleď  na
dánského   krále!   Nepátrej   po   svém  urozeném
otci. Je to tak běžné: živí musí zemřít.

Král: Správně. A víš, co by ti na to řek?

DU 92 (3b): Napište program v AWK na transpozici matice (tedy z řádků udělejte sloupečky, ze sloupčků řádky). Můžete předpokládat, že každý řádek má stejný počet sloupečků (tedy jde o obdélníkovou matici).

Desátá série (do 23. 5. 12:00)

DU 101 (4b): Napište v awk násobení dvou matic. Matice načtěte ze standardního vstupu oddělené prázdným řádkem.

DU41 (1b): Vytvořte si vlastní barevný prompt podle svého vkusu a pošlete mi ho.


DU44 (2b): Napište skript, který vypíše velikosti a jména všech obyčených souborů (ne adresářů), které jsou v adresářové struktuře pod adresáři /tmp a ~/BIG, které vlastní ten kdo spouští skript a které nebyly změněny za poslední dva týdny, kromě souborů s příponou .conf a skrytých souborů (ty nevypisujte).

Pátá série (do 1. 4. 12:00)

DU51 (2b): Napište skript strip, který dostane na příkazové řádce jeden parametr. Tento parametr bude značit počet bajtů, které má přečíst ze standardního vstupu a zahodit. Všechny další informace ze standardního vstupu bude beze změny vypisovat na standardní výstup, podobně jako příkaz cat.


DU52 (až 2b): Napište regulární výrazy (basic nebo extended) pro grep nebo sed, které budou odpovídat právě těm řádkům, které:

  • (a) jsou alespoň 42 znaků dlouhé
  • (b) obsahují přesně 6 dvojteček
  • (c) jsou platnou e-mailovou adresou (musí zvládnout i stinovlas+unix@kam.mff.cuni.cz apod.)
  • (d) obsahují číslo s hodnotou větší než 657
V případech (a) a (d) můžou žádky obsahovat ještě libovolný další text. V případě (b) můžou obsahovat libovolný text, ale musí v něm být přesně šest dvojteček. V případě (c) musí být na řádku pouze a jenom platná e-mailová adresa, nic jiného. E-maily můžou být složité, nemusíte implementovat celé RFC, jen nějakou rozumnou podmnožinu.


DU53 (až 6b): Zahrajte si Regex Crossword. Úkolem je vyplnit křížovku (do každého políčka jeden znak) tak, aby řetězce ve sloupcích i v řádcích odpovídaly příslušným regulárním výrazům. Výrazy se vztahují na celý řádek, jako kdyby byly uzavřeny mezi ^ a $. Jedná se o extended regulární výrazy. Pokud někde potkáte \d, znamená to totéž co [0-9]. Jako řešení mi pošlete screenshot, kde bude vidět kolik jste toho nahráli. Za každý zcela dokončený level dostanete 0.5 bodu, za levely Experienced, Volapük a Hamletdokonce 1 bod! Nedokončené levely budu hodnotit individuálně.

Šestá série (do 8. 4. 12:00)

DU61 (2b): Napište v sedu rev (bez přepínačů).


DU62 (2b): Napište skript v sedu rozpoznávající palindrom na každém řádku. Před každý palindrom připíše (ano), před ostatní řádky (ne). Mezery v palindromu ignorujeme, takže kobyla ma maly bok je platný palindrom.


DU63 (4b): Napište příkaz, který bude vypisovat řádky (načtené ze standardního vstupu), na kterých se vyskytuje stejný počet souhlásek jako samohlásek. Na řádku vyskytují pouze malá písmena anglické abecedy a mezery. Počet bodů za tento domácí úkol se bude odvíjet od jeho délky. Čím kratší, tím lepší – za řešení stejně dlouhé jako autorské dostanete 4 body, za delší méně, za kratší můžete dostat i více.

Autorské řešení je dlouhé 61 znaků (znak nového řádku na konci se nepočítá) a obsahuje jedno přiřazení do proměnné a jedno volání příkazu sed.

Sedmá série (do 15. 4. 12:00)

DU 71 (4b): Napište skript, který zjistí ze stránky http://www.yr.no/place/Czech_Republic/Prague/Prague/, jaké bude následující den počasí a vypíše ho v textové podobě, např.:

Předpověď na den 11. 4. 2014:
00:00-06:00 light snow showers, 2°C, Moderate breeze 7 m/s from west, precipitation 0.4-0.8 mm
06:00-12:00 rain, 2°C, Moderate breeze 7 m/s from west-southwest, precipitation 0.9-1.7 mm
12:00-18:00 rain showers, 5°C, Fresh breeze 10 m/s from west, precipitation 2.0-4.3 mm
18:00-24:00 partly cloudy, 5°C, Moderate breeze 6 m/s from northwest, precipitation 0-0.2 mm
Může se vám hodit použít grep -A a sed. Snažte se o co nejefektivnější řešení (tj. můžete používat různé špinavé triky, aby jste se s kódem co nejméně nadřeli). Hodnotit se bude především kvalita výstupu, ne estetika zdrojového kódu.


DU 72 (4b): Napište skript pro hromadné rozesílání e-mailů. Jako svůj první parametr bude očekávat slovo add, remove, list nebo send, jako druhý parametr (u add a remove) e-mailovou adresu, případně (u send) předmět e-mailu.

  • add ověří, zda se jedná o e-mailovou adresu a přidá ji do seznamu adres, na které se rozesílají e-maily (v externím souboru).
  • remove ověří, zda se jedná e-mailovou adresu a odebere ji ze seznamu příjemců.
  • list vypíše seznam všech aktuálních příjemců.
  • send načte na standardním vstupu text e-mailu, který pak odešle všem aktuálním příjemcům v seznamu a to jednomu po druhém (tj. jeden e-mail na jednu adresu).
V případě zadání chybné adresy, případně adresy která už v seznamu je (u add) nebo není (u remove) vypíše chybovou hlášku a skončí. Počítejte s tím, že v textu e-mailu se může objevovat prakticky cokoliv (kromě null bajtu). Snažte se o co nejpěknější úpravu zdrojového kódu. Odsazujte, používejte funkce na obalení kusů kódu, které spolu souvisí, používejte pochopotelné názvy proměnných. Kromě funkčnosti se bude hodnotit především estetika zdrojového kódu.

Osmá série (do 22. 4. 12:00)

DU81 (8b): Dokončete paralelního webového pavouka zadaného na cvičení (příklad 4).

Devátá série (do 29. 4. 12:00)

DU 91 (5+3b): Napište program v AWK na transpozici matice (tedy z řádků udělejte sloupečky, ze sloupčků řádky). Můžete předpokládat, že každý řádek má stejný počet sloupečků (tedy jde o obdélníkovou matici). RS a FS nechte výchozí, bonusové body budou za návrh kreativního užití šikovného RS a FS.

Desátá série (do 6. 5. 12:00)

DU 101 (8b): Napište v AWK maticovou kalkulačku s postfixovou notací. Vstupem bude text výrazů, oddělených prázdnými řádky. Výraz je buď matice (řádky oddělené znaky nového řádku, sloupce oddělené mezerami), nebo operátor +, - či *. Načtené matice si bude kalkulačka ukládat na zásobník a při načtení operátoru + sečte dvě matice z vrcholu zásobníku a uloží místo nich na vrchol jejich výsledek. Pro další operátory obdobně. Při chybě (operace s pouze jednou maticí na zásobníku, nekompatibilní rozměry matic, ...) vypište chybovou hlášku a ukončete program. Pokud nedojde k chybě, vypište na konci vstupu aktuální obsah zásobníku. Pokud je v něm více než jedna matice, oddělte je na výstupu prázdným řádkem.

Konec

Žádné další domácí úkoly nebudou. Finální počet bodů potřebných k zápočtu je 51 bodů a 7 růžových úkolů. Pokud vám něco z toho chybí, můžete si doplnit až 8 bodů a 1 splněný růžový úkol za vypracování každého z rozsáhlejšího zadání, z posledních třech cvičení semestru. Termín na odevzdání takového řešení je do tří týdnů od cvičení, kde byl zadán.

*/ ?>