0

Dnešního dne, shodou okolností na moje narozeniny, by se známý bojovník za svobodu a nezávislost Irska, dobrovolník Prozatímní irské republikánské armády Bobby Sands dožil 58 let. Bohužel se ale ve svých 27 letech stal politickým vězněm britské vlády a také její obětí. Byl vězněn bez řádného procesu (!), stejně jako mnoho jiných dobrovolníků v nechvalně proslulé věznici Long Kesh v nelidských podmínkách předepsaných britskou vládou. Na nesnesitelné podmínky vězení reagovali dobrovolníci, vedeni Sandsem, hladovkou. Přestože měl Sands obrovskou podporu veřejnosti a byl dokonce zvolen členem parlamentu (!), britská ministerská předsekyně Margaret Thatcher odmítla s politickými vězni jednat. Po 66 dnech držení hladovky Bobby Sands zemřel, stejně jako množství jeho spoluvězňů. Pohřbu tohoto výjimečného muže, který zemřel pro svobodu své vlasti, se zúčastnilo na 100 000 lidí.

Na místo minuty ticha uctívám Bobbyho touto krátkou zmínkou.
Tiocfaidh ár lá.

.

Pátý semestr na ČVUT FEL STM IS 0

Zde by měl být úvod, ale není tady.

Pravděpodobnost, statistika a teorie informace (C)

V rámci své snahy co nejlépe se připravit na magisterské studium, jsem si zapsal předmět, který pokrývá pro mě a většinu ostatních budoucích inženýrů velice cennou látku – pravděpodobnost a statistiku. Jelikož se v rámci BP zaobírám klasifikací velkého množství dat, statistika je jediná věda, která dokáže nad výsledky provádět relevantní závěry. Předpokládal jsem, že mě předmět bavit nebude, ale hluboce jsem se pletl.

Předmět mě bavil ohromně, a to hlavně díky bezkonkurenčnímu přednášejícímu, doc. Navarovi, který vtipně, přesně, interaktivně a se zájmem přednášel (téměř vyprávěl) látku. I když jsem se občas trochu nechytal (občas zásadně), náš bezkonkurenční cvičící, dr. Kroupa, podal ke každému tématu další vyčerpávající výklad + množství podrobně rozebraných příkladů, takže pokud někdo opravdu chtěl látce rozumět, tak rozuměl.

Věnovali jsme se tématům jako Kolmogorovův pravděpodobnostní model, distribuční a kvantilové funkce, spojitá a diskrétní rozdělení a jejich směsi, statistika, testování hypotéz, markovovy řetězce, teorie informace a kódování (Shannon, Huffman). Bohužel poslední téma (teorie informace) se nestihlo procvičit a já jsem ho z přednášek v takové rychlosti prostě nepochopil, a proto jsem si musel u zkoušky rovnou odečíst jeden příklad ze čtyř.

Ve zkoušce jsme měli jeden příklad na pravděpodobnost, jeden na statistiku, jeden na markovovy řetězce a jeden na teorii informace. Na pravděpodobnost jsem dostal běžný příklad, ve kterém měl student (aniž to dostal zadáno) rozeznat underlying rozdělení a nějak spočítat pravděpodobnost něčeho. Dostal jsem relativně nespočítatelné binomické rozdělení, které jsem aproximoval pomocí CLV. Ve statistice jsem měl příklad na testování hypotézy o tom, že naměřená četnost známek ze zkoušky má binomické rozdělení (s tím a tím parametrem) na hladině přesnosti 5 %. Věděl jsem, že jde o Chi kvadrát test dobré shody, který jsem si nikdy spočítat nezkoušel, ale díky výbornému cvičícímu jsem věděl, jak na to (testování hypotéz je asi nejzajímavější z probíraných témat). V časti týkající se markovských řetězců jsem dostal příklad typu stochastická žabička (mnou tak pojmenovaného podle typického příkladu) a v části teorie informace bylo bohužel úkolem spočítat rychlost entropie markovského zdroje.

Díky malé chybě v prvním příkladu, velké chybě v posledním a průměrnému počtu bodů ze semestrálního testu jsem musel na ústní zkoušce bojovat o C. K mé spokojenosti se mě výborný zkoušející (=cvičící) zeptal na Huffmanův kód a jeho optimalitu. Po krátké seanci jsem vysoce spokojen odešel se známkou C.

Všem budoucím studentům mohu předmět A4B33PSI s duem Navara, Kroupa vysoce doporučit.

Základy zpracování signálů (A)

ZZS byl jeden z povinných oborových předmětů v tomto roce, u kterého jsem předpokládal, že si z něj odnesu hodně. Narozdíl od Statistiky byl tentokrát můj předpoklad správný. Vynikají pan doc. Čmejla dokázal vytvořit předmět, který se mi po jeho absolvování jeví jako jeden z nejlepších a nejhodnotnějších předmětů, jaké jsem kdy na FELu studoval.

Zabývali jsme se základy číslicové techniky, generováním číslicových signálů, harmonickou analýzou, různými druhy syntéz, číslicovými filtry a dalšími. Každá přednáška byla maximálně přínosná, co do teoretické i praktické stránky, a každé cvičení bylo plné nesmírně zajímavých aplikací. Vytvářeli jsme různé efekty (zvony, výstřely, syntetické nástroje), pozměňovali jsme originální zvuky (echa, pásmové propusti/zádrže, …), přičemž každá aplikace byla solidně teoreticky podložená. Skoro by se člověk divil, že má tento předmět na začátku A7 a nikoli A4.

Podmínkou udělení zápočtu bylo zpracování semestrální práce, jejíž cílem bylo vytvořit hudební nástroj nebo sestavit melodii, efekt… jakoukoli zajímavou hudební stopu. Za tu svou částečně vděčím výbornému doc. Čmejlovi, který mě nasměroval tím správným směrem, co se týče syntézy varhan.

Studentům, které popis zaujal, doporučuji, aby si předmět zapsali, protože pohled na třídu plnou studentů, kterým jde pouze o prolezení do dalšího ročníku, vykazujících nulovou aktivitu, je velice smutný. Zvlášť, když jde o tak výborný předmět.

Sběr a přenos dat (B)

Ajajajajaj. Tento (další povinný oborový) předmět mě vůbec nebavil a navíc byl pro mě zbytečný. Probírali jsme systémy přenosu dat, fyzické detaily přenosu dat, koaxiály, kroucené dvojlinky, rádiovou přenosovou cestu, optickou přenosovou cestu, internetworking, ethernet, tcp/ip. Všechna zmiňovaná témata už jsem v životě minimálně jednou studoval, takže mi nedělala problém.

Uvědomil jsem si ale, že nesmím být takový n00b jako moji spolužáci z IS (kapitola sama pro sebe) a předmět podcenit. Dělaly se protokoly, které byly nutnou podmínkou pro zápočet. Nemusely se ale odevzdávat hned, což je vlastně srdečná pozvánka pro prokrastinaci… mí báječní spolužáci se toho ihned chopili a začali na předmět srát. Naměřená data si nezapisovali, protokoly nedělali… a na konci roku se zachovali velice převídatelně… psali mi maily, abych jim protokoly poslal. Abych jim nekřivdil, nechtěli všchny… jenom většinu, protože to „nechali na poslední chvíli“ (rozuměj druhý týden zkouškového) nebo „ztratili hodnoty“ (rozuměj nenaměřili a šli domů) nebo „neví, jak odpovědět na některé otázky“ (rozuměj nechce se jim hledat na internetu). Krátký proces, který nastal byl skutečně velmi krátký.

Ekonomika podnikání (E)

Zde jsem podruhé a snad i naposledy narazil projev slova „management“ v našem studijním programu stM. S viditelnou nechutí jsem na přednášky tohoto předmětu jsem zpočátku docházel, ale nebyl jsem vůbec schopen sousteředění, natož abych vstřebal nějaké „užitečné poznatky“ této „vědy“, a tak jsem ku prospěchu svému i přednášejícího této činnosti zanechal a docházel jsem pouze na cvičení.

Tam to ovšem nebylo o mnoho lepší. Co týden, to 10 nových obtížně memorovatelných (a zcela nevysvětlených) vzorečků typu (Ahi + Bjklm – Co / Dpq * Frstuvwxyz + Gabc) ^ (Hakjf + náhodná posloupnost operátorů základní aritmetiky spojující náhodné řetězce mající triviální nebo nevysvětlený význam). Co týden, to nová snůška kapitalistických keců a hloupých příkladů.

Proč jsou nuceni studenti seriózních věd absolvovat tento příšerný, nesmyslný a nudný předmět?

To teď nechme stranou. Cvičení předmětu jsme zezačátku s Jiřím (který se mnou chodil na cvičení) bojkotovali. Během bojkotu jsme stihli vystavět solidní papírové námořní a letecké síly, které byly tak početné, že zaujaly i samotnou cvičící.

fail boat

Semestrální test jsem pochopitelně zeslonil a zpozorněl jsem, když jsem zjistil, že ze zápočtového testu budu muset získat 40/60 bodů, abych vůbec dostal E. Začal jsem tedy dělat domácí úkoly, které se neobešly bez občasného trollingu a hranici jsem si trochu snížil. Samotné učení se na zkoušku z tohoto předmětu bylo pro mě přímo fyzické utrpení, protože nejsem schopen jako nějaký opičák v kleci sedět a memorovat věci, kterým nevěřím a které mě bytostně nebaví. Nakonec jsem se ale překonal a Ečko dostal.

Kdybych byl začal trochu dřív, byl bych teď v předposlední kategorií propěchových stipendií místo té poslední… nechť je mi to ponaučením pro příště: Abys lépe prošel povinným předmětem, jehož náplní jsou hlouposti, musíš si nalhat, že je vlastně velice zajímavý.

Etika (A)

Jistě každý slyšel o panu Slámečkovi (jistě i každý mimo FEL, například děti ze Sierra Leone nebo správcové parku Yellowstone), čili netřeba dále živiti jeho věhlas.

Musím ale podotknout, že jsem opět zklamán (a Lucka, která se mnou tento předmět navštěvovala, jistě také) z některých svých kolegů na STM. Do doby, než jsem na cvičeních z Etiky slyšel hovořit jistého C. jsem netušil, že existují lidé žijící v bludu tak neuvěřitelně velkém a hlubokém, až pozorovatelně zakřivují prostoročas. Marně se mohl pan Slámečka dovolávat Pána, když dostal tento trouba slovo… mnozí se smáli, mnohým se zhnusením křivila ústa a mnozí raději neslyšeli.

Francozština 1 (záp.)

Francozštinu jsme si z nadšení zapsali s Luckou a nakonec jsme se přemáhali, abychom tam vůbec docházeli. Já, protože jsem FJ už dříve studoval a látka pro mne byla opakováním a Lucka, protože se jí jevila složitá (což taky je). Nakonec jsme ale předmět zdárně ukončili.

Učila nás velice milá a schopná paní Kindlová… pro zájemce o tento jazyk z řad začátečníků určitě jasná volba.

Tělesná výchova 5 (záp.)

Využiji tohoto prostoru pro reklamu a s potěšením vám jako člen ustavující schůze sděluji, že byl na ČVUT založen lukostřelecký oddíl, registrovaný v ČSTV a skoro registrovaný v Českém lukostřeleckém svazu.

Semestrální projekt + BP

Mám takový pocit, že už je čtenář dosti otráven mými chvalozpěvy na katedru kybernetiky a její výborné zaměstnance, takže nebudu toto železo dále kouti (n1) a více se rozepíšu, až budu mít diplom :).

Čtvrtý semestr na ČVUT FEL STM, Inteligentních systémech 2

Když jsem si před půl rokem zapisoval předměty na (tehdy) následující semestr, chrochtal jsem si, jaká to bude pohoda, jak se budu flákat a jak si to dám se stipendiem… leda houby.

Urputná nepozemská trýzeň a hodiny a hodiny neustálé práce s vidinou nespočetných hodin práce, které teprve budou následovat. Tak by se dal s množstvím nadsázky shrnout můj čtvrtý semestr — ve skutečnosti jsem si vždycky našel nemálo času na to, abych si dal pár batlošů nebo dungů, nebo sebou prostě někam kydnul a nedělal nic :).

Počítačové sítě (E)

Co mě nejméně bavilo, byly nepopsatelně nudné Počítačové sítě. Na přednášky jsem přestal chodit někdy ve čtvrtém týdnu — prostě jsem po předcházející vyčerpávající přednášce z Kódů a bezpečnosti nemohl udržet pozornost, i když jsem se hodně snažil. Cvičení z tohoto předmětu byla užitečná jako topol — naprosto neschopný cvičící pan Macejko se neráčil nás podrobněji seznámit jak s adresací, tak se semestrálními úlohami. Jeho výklad byl nesrozumitelný, zmatečný a mám pocit, že ani nebyl česky.

Zkoušku z tohoto předmětu jsem si díky neuvěřitelně a nepopsatelně úžasné iniciativitě pana Kubra zapsal až jako poslední. Pan Kubr je člověk, který oplývá logickým myšlením — vypsal tři termíny zkoušky, přičemž dva z nich šly těsne za sebou, přičemž ten pozdější měl uzávěrku na přihlášení dříve než ten dřívější vůbec proběhl. Výsledkem bylo, že ze dvou termínů se stal jeden, celkem tak byly vypsány dva termíny.

Kódy a bezpečnost (C)

Jste také vybaveni hlubokou znalostí všemožných historických šifer a historických způsobů kryptoanalýzy a o moderních šifrách nevíte téměř nic? Tak to jste pravděpodobně také studovali tento předmět!

V podstatě celý semestr byl o tom, že jsme na cvičeních luštili historické šifry, dostávali bodíky, nebo zapojovali kabely podle toho, co nám řekli. Jako semestrální práci jsme jednu historickou šifru měli dokonce i naprogramovat.

Někdo může podotknout, že moderní šifry se braly na přednáškách… to skutečně braly. Vypadalo to ale podobně, jako kdybyste nechali jazykový syntezátor, aby vám týdně v rychlosti přečetl 4 strany textu. Přednášku z tohoto předmětu jsem vypustil asi po třetím týdnu.

Teoretická informatika (C)

Jak řekl kamarád, teoretická informatika je taková holka pro všechno. Brala se teorie grafů, gramatiky, automaty a složitost. Přednášky byly relativně zajímavé, i cvičení byla relativně zajímavá.

Přednášejícím tohoto předmětu je pan Průša. Pan Průša je jeden z nejvstřícnějších a nejuctivějších lidí, jaké jsem kdy poznal — byl jsem jím velmi příjemně překvapen. S takovým člověkem je vskutku radost jednat a mnozí jiní by si z něj měli vzít příklad.

Cvičení probíhala pohodovou formou s občasným intermezzem ve formě líbající se Slávky s Péťou v první lavici, kteří tímto nebohého pana cvičícího vyváděli z koncentrace.

Každou hodinu jsme psali jednoduché písemky a občas jsme si střihli nějakou tu semestrálku. Předmět mohu všem jen doporučit pro jeho skvělý poměr námaha/kredity.

Systémy s umělou inteligencí (B)

Zde si mohutně zanadávám na radu STM… jak někoho mohlo napadnout sloučit dva předměty takovým způsobem, že se v něm během semestru vystřídají 4 přednášející a 3 cvičící — celkem 5 lidí (!!)? Každý přednášející/cvičící má jiný styl a jiné požadavky na studenty a 4x během semestru se adaptovat na nového člověka vskutku není nijak příjemné.

I přes tuto skutečnost mi tento předmět hodně dal — hlavně ta část, kterou učil pan Kubalík a ve které jsem se dozvěděl o biologicky inspirovaných metodách. Souhrnně — všichni přednášející v tomto předmětu byli skvělí — až člověka udiví, jak je na předmětu znát katedra kterou je zaštícen. Katedra kybernetiky má úroveň výbornou, zatímco katedra počítačů mizernou.

Optimalisace v inteligentních systémech (D)

Předmět vyučovaný skvělou katedrou — katedrou řídící techniky — a skvělými lidmi — panem Šůchou a panem Čapkem –, který byl v tomto semestru mou druhou největší výzvou.

Naučili jsme se zde hodně o grafových algoritmech a metodách optimalisace (lineární programování, rozvrhování atp.). Předmět rozhodně nebyl triviální. Zároveň měl ale do nezvládnutelného daleko a vyučování se neslo interaktivní a soutěživou formou. Pochválil bych hlavně cvičení pana Čapka, kdy jsme každý týden měli zpracovat nějaký optimalisační problém v MATLABu a následně na cvičení interaktivní formou probrat látku.

Největším projektem v tomto předmětu byla semestrální práce, kdy jsme si měli navrhnout nějaký složitější problém a naprogramovat pro něj optimalisační algoritmus. Já jsem si vybral Optimalisaci záchranného systému, která se mi nakonec povedla.

Zkouška byla poměrně těžká! Ale nic, co by se nedalo zvládnout na první pokus (byť mi nesedly otázky). Většina mých spolužáků si to ale asi nemyslí, protože z 11 zapsaných lidí ukončili předmět pouze 2, z nichž jeden jsem já.

Funkcionální a logické programování (C)

O tomto předmětu více v jiném článku. Zde se zmíním pouze o druhé části předmětu a zkoušce.

Druhá část tohoto předmětu se týkala logického programování v jazykce PROLOG, který je, dle mého názoru naprosto příšerný a nepoužitelný. Na přednášky jsem nechodil, cvičení jsem si odseděl. Na rozdíl od Haskellu, PROLOG už nechci nikdy vidět.

Zkouška byla hodně těžká. Programování na papír není moje oblíbená disciplína (zvlášť ve Schemu a Haskellu), takže jsem jen tak tak prošel a s plným počtem bodů ze semestru dohromady získal C.

Ostatní dění ve škole

  • Škola má nové odporné webové stránky.
  • Anketu nemá smysl vyplňovat, pokud chcete něco kritizovat (ZEJMÉNA na katedře počítačů) — předmět DSA stále učí Píše. Po takovém fiasku (statisticky nejhorší předmět z úplně všech dostatečně hodnocených předmětů bylo DSA + nespočetné stížnosti + nucená hospitace + řešeno proděkanem) by čestný člověk odstoupil, nečestný by byl odvolán.
  • Dá-li Bůh, budeme mít z brusu nového blyštivého zahraničního děkana

Co se mnou bude dál

  • S největší pravděpodobností už mám vybraný individuální projekt a několik kandidátů na bakalářskou práci. Individuální projekt se bude týkat Artificial Immune Systems.
  • Přiští semestr mám tři zkoušky.
  • Přespříští semestr je mým jediným povinným předmětem bakalářská práce.

Genetické programování (automatická syntéza kódu) 0

Letos mě na škole zdaleka nejvíce baví předmět A4B33FLP, který, jak jste si již někteří mohli všimnout, jsem si zapsal dobrovolně. Je to předmět primárně určený pro studenty OI (A4), což ve mně opět vzbuzuje přesvědčení, že jsem měl jít raději tam, než na STM, kde mají lidé běžně velký problém s Karlem v Javě.

K věci. Probíráme různé exotické jazyky, jako je Scheme (dialekt Lispu), Haskell nebo Prolog. Právě Schemu jsme věnovali nejvíce času a právě v něm jsme tvořili semestrální projekt sestávající ze tří nezávisle bodovaných navazujících částí, které měly zdůraznit použití funkcionálních jazyků v oblasti umělé inteligence.

V první části (která mi zabrala celkem 9 hodin) jsme tvořili interpret programu pro robota pohybujího se v dvojrozměrném poli plném zdí a značek. Programovací jazyk robota je pro zjednodušení velmi podobný Schemu, ale z větší části nekompatibilní. Jazyk obsahuje několik atomických příkazů:

  • turn-left – robot se otočí doleva,
  • step – robot provede krok pokud před ním není zeď, jinak skončí,
  • get-mark – robot sebere značku ze země a pokud tam není, skončí,
  • put-mark – robot pod sebe položí značku,
  • ([...]) – seznam příkazů,
  • () – nic,

několik složitějších konstrukcí:

  • procedure [jméno] ([tělo]) – definice procedury,
  • if [bool] [tělo-true] [tělo-false] – podmínka,
  • [jméno_procedury] – volání procedury,

a funkce vracející booleovské hodnoty:

  • wall? – je před robotem zeď?
  • mark? – je pod robotem alespoň jedna značka?
  • north? – míří robot na sever?

Robot se pohybuje v bludišti, které je definováno jako seznam seznamů.

((w w w w) (w 0 1 w) (w 2 0 w) (w w w w))

Program robota je seznam seznamů procedur, kde v každém seznamu musí být procedura start, která je vstupní procedurou. Program může vypadat nějak takto:

(((procedure a (step a)) (procedure start (if wall? turn-left a)))(...))

Ve druhé části (která mi zabrala 4 hodiny) jsme vytvářeli ohodnocovací (fitness) funkci pro robotovy programy. Nyní jsme narazili na termín z genetického programování, které raději nejprve povrchně popíšu.

------

Genetický algoritmus je algoritmus, který se, inspirován evoluční teorií, snaží vyšlechtit požadovaného jedince z náhodně generované počáteční populace. Zná přitom pouze hodnotu fitness (tj. jak by měl být dobrý) požadovaného jedince. Jedinec je jedno konkrétní řešení problému a disponuje vlastním genotypem, fenotypem a ohodnocením (fitness). V případě, že řešení problému je program, jedná se o genetické programování. Genotyp je v tomto případě syntaktický strom programu a fenotyp je tento strom zapsán jako vnořené seznamy.

Proces evoluce v genetickém programování sestává z následujích kroků:

  • Generování populace
  • Selekce
  • Rekombinace
  • Mutace

opakovaných v n iteracích (tzv. generacích).

V procesu selekce se jistým chytrým způsobem (uveďme napříkad ruletovou selekci (kterou používám ve svém programu), turnajovou selekci nebo fitness-proporcionální selekci) zvolí dva jedinci (zpravidla jedinci s větší fitness budou mít větší šanci na zvolení) a aplikuje se na ně rekombinace.

V procesu rekombinace (křížení) se vezmou dva vybraní jedinci, určí se náhodný bod křížení ve fenotypu a jeho příslušné části se vymění. V případě genetického programování se vyberou určité uzly syntaktických stromů a odpovídající podstromy se vymění. Pozor! Tento proces musí zajistit, že jeho aplikací vzniká platný jedinec (nemůžeme například místo "procedure" vložit "wall?" a podobně). Následuje mutace.

V procesu mutace se ve fenotypech nově vzniklých jedinců zvolí náhodné listy (tj. atomické příkazy) a ty se náhodně změní.

Dále následuje stěžejní operace - generování nové populace. Pro různé typy problémů se hodí různé způsoby. Můžete například vyměnit dva nejhorší jedince z populace a nahradit je novými (což jsem si osobně pojmenoval jako božská metoda - většina populace žije po mnoho generací). Mně se osvědčila metoda, kdy nechám ze staré populace postupně vygenerovat úplně novou, kterou tu původní nahradím až na dva nejlepší jedince z předchozí populace. Zkoušel jsem i úplně přirozenou metodu - nahrazovat populaci úplně, ale při ní nedochází ke šlechtění - dobří jedinci umírají i se svým dobrým genotypem a nahrazují je jiní.

Metoda selekce zaručuje, že příležitost zachovat svůj genotyp dostanou občas i horší jedinci, čímž se vyhneme uváznutí v lokálním extrému (problémy greedy algoritmů - např. hill climber).

------

Fitness programu je seznam o čtyřech číselných prvcích:

(A B C D)

kde A je manhattanská vzdálenost robota po spuštění programu od kýženého stavu, B rozdíl bludišť co do počtu značek, C je délka programu a D je počet vykonaných atomických příkazů při jednom běhu (nebo naopak). Každému programu lze nastavit i práh maximálních vnořených volání procedur (což bude mít za následek jiné výsledky - například program ((procedure start (step start))) půjde s robotem přesně tolik kroků, kolik je velikost tohoto prahu).

Ve třetí části (která mi zabrala 8 hodin) jsme měli implementovat samotnou automatickou syntézu kódu. Měli jsme napsat proceduru, která přijímá výchozí bludiště a stav robota, cílové bludiště a stav robota (těchto párů může být několik - fitness funkce je navržena tak, že se počítá pro všechny páry), práh fitness (A B C D), který označuje jak špatné programy můžeme ihned zahazovat a práh pro vnořené procedury. Výsledkem měl být program, který má fitness (0 0 x x), tedy takový, který dostal robota do správné pozice a se všemi políčky udělal to, co měl (sebral značku atp...).

Protože jako studenti píšící ve funkcionálním jazyce poprvé, jsme ještě neměli dostatečné zkušenosti na to, abychom psali optimální kód, byly nám přiděleny pro každou evoluci relativně velké časy v automatickém hodnotícím systému, kde byly úlohy rozděleny na level easy, medium a hard. Easy úlohy měly limit 10 vtěřin a hard úlohy 3 minuty. Protože čtenář se pravděpodobně s funkcionálními jazyky nesetkal, povrchně přiblížím Scheme.

------

Scheme je dialekt jazyka Lisp, což je zkratka pro "LISt Processing", tedy zpracování seznamů. V postatě se ve Schemu nedělá nic jiného než zpracovávání seznamů. V čistě funkcionálních jazycích neexistují proměnné ani smyčky. Pouze funkce, parametry a rekurze. Rekurze je základní stavební kámen každého funkcionálního programovacího jazyka. Téměř každá funkce, kterou napíšete, bude rekurzivní. Ve výsledku máte elegantní krátký kód, který je navíc rychlý.

Dvě nejpoužívanější funkce Schemu (a kteréhokoliv FJ) jsou car a cdr. car bere první prvek seznamu, cdr bere celý seznam bez prvního prvku. Pomocí těchto dvou příkazů, rekurze a něco málo aritmetických operátorů a podmínek, lze naprogramovat vše. Dokonce i tyto příkazy se dají zjednodušit na tzv. lambda funkci, se kterou samotnou lze vystavět vpodstatě jakýkoliv program (pokud vás to zajímá, vizte Lambda Kalkulus). Následují nějaké ukázky.

(define (take n list) (if (= n 0) '() (cons (car list) (take (- n 1) (cdr list))) ) )

Tato funkce take bere dva argumenty n a list. n je nějaké číslo a list je nějaký seznam. Následuje ukončovací podmínka (každá pořádná rekurzivní funkce by měla začínat ukončovací podmínkou) - pokud je n rovno 0, vrať prázdný seznam (proč, to se dozvíte dále). Pokud není rovno 0, vrať seznam takový, že vezmi první prvek ze seznamu list a připoj ho k seznamu, který vrátí funkce take, když ji zavoláme s o jedno nižším n a zbytkem seznamu.

Základním datovým typem Schemu je tzv. tečkový pár (A . B). Pokud A bude cokoliv a B bude prázdný seznam '(), potom výsledkem bude seznam s jediným prvkem A. Například toto spojení - '(1 . (2 . ())) - vytvoří seznam (1 2). Tečky si můžete představit jako uzly stromu. Funkce cons v naší funkci take připojí jeden prvek k seznamu, a proto potřebujeme seznam vytvořit, když doejdeme na konec rekurze - připojíme k poslední hodnotě prázdný seznam a máme seznam o jednom (právě n-tém prvku). Při zpětném postupu rekuze potom připojujeme všechna předešlá čísla. Funkce take vezme ze seznamu podseznam o n prvcích.

------

Moje úloha dopadla na 9/10 bodů - u jednoho z level:hard příkladů překročila časový limit.

Ale abych o tom jenom nepsal, mám i praktickou ukázku. Svůj program jsem trochu poupravil a zkompiloval do nativního binárního souboru systému Windows (exe). Tento program bere jako parametr řetězec, který obsahuje libovolný příkaz Schemu, který vykoná nad mým programem. Můžete tedy z něho volat i potřebnou funkce (evolve ...). Připravil jsem pár command skriptů, které za vás obstarají i volání, takže jen můžete sledovat evoluci.

První program má úplně volné bludiště 5x5 a uprostřed něj je značka. Cílem je sebrat značku.

Druhý program má dvě verze. Bludiště je tentokrát jenom čtvercová cestička kolem středu. Úkolem je vydláždit cestu značkami a vrátit se zpět na začátek. Rozdíl mezi verzemi je ten, že první má limit vnoření 20 (program bude vyvíjet spíše povrchní a dlouhé programy a bude mu to trvat relativně dlouho) a druhý má limit 100 (bude rychlejší, vyvine kratší "rekurzivní" program).

Třetí program. Je jenom chodba, na které jsou střídavě vysázeny značky... úkolem robota je značky invertovat (tam kde, jsou, je sebere, a tam, kde nejsou, je položí).

Zde je možné stáhnout program a sadu těchto testovacích bludišť.

Program nejprve zobrazí vygenerovanou počáteční populaci a potom pokaždé, když se v nějaké generaci vyskytne jedinec lepší, než prozatím nejlepší, vypíše ho.

Když pochopíte, jak programu zadávat parametry, můžete vytvářet i vlastní situace.

Jen pro představu: Program má 960 řádků a je v něm nespočet dlouhých neoptimálních zel, hrubě porušujících zásady funkcionálního programování - imperativní kontrukty. Je v něm vidět, jak moc jsem byl při psaní té které části unavený.

Třetí semestr na ČVUT FEL STM IS 5

Když jsem si minulý rok zapisoval předměty na semestr, který právě skončil, bál jsem se o vlastní felácký život, a co je důležitější, o svou feláckou čest (opakovat předmět je jako pít krev jednorožce – „udrží tě při životě, ale za jakou cenu! Od doby, kdy v jeho krvi smočíš své rty, budeš žít jen napůl…“ – Kentaur z Harryho Pottera:)). Rada STM totiž přeřadila dva nejtěžší předměty z celého programu do jednoho semestru a vzhledem k tomu, že 30 – (2 * 6) < 20 = mez smrti, zapsal jsem si pojistný předmět (tj. předmět pro mě zcela triviální).

Má předtucha mě nezklamala - byly to opravdu jatky, a to jak v semestru, tak ve zkouškovém. Musel jsem se učit tak často a tak dlouho, že mi pomalu nezbýval čas na wowko :D, které jsem před začátkem zkouškového začal hrát. Co vám budu povídat, čtěte dál.

Programování vestavěných systémů (Hodnocení: A)

Zde jsem chtěl získat dobrou známku ze cti, jelikož se předmět týkal mikroprocesorů (maturoval jsem z nich za 1 a z podobného (ale více nízkoúrovňového) předmětu (SAP) jsem již A získal). Povedlo se. Navíc mě předmět velmi bavil, protože jsme pracovali na vynikajícím procesoru ATMEL blablabla s jádrem ARM7 (využívaje jazyka C). Pan Špinka (externista) vedl přednášky zábavnou formou a člověk se dozvěděl, mimo jiné, spoustu zajímavých příhod z praxe.

Laboratorní cvičení jsme měli v nejhlubších komnatách karláckých sklepení, kde není vzácné narazit na nemrtvého. Byla tam příjemná zima, měli tam auto s vodou v nádrži, počítače, které centrálně bootovaly linux a spousty cvičných destiček s klávesnicemi, LC displeji, LE diodami, bzučáky, IR, USB a sériovými porty, na kterých jsme programovali 4 laboratorní úlohy – ovladač maticové klávesnice, AD převodník a zbytek si nepamatuji. Na konci semestru jsme měli naprogramovat semestrální práci – doporučovala se jednoduchá hra (moji můžete vidět na videu).

Modelování a simulace systémů (Hodnocení: C)

Předmět, který v podstatě navazuje na Automatizaci ze střední školy, ale jde do hloubky. Protože mi vždycky Automatizace přišla nudná a moc svázaná s praktickou aplikací (taky jsem z ní měl čtyřku), ani MASy mě nebavily. Předmět přednášel pan Hušek… sice hezky, srozumitelně a s výbornými slídami, ale já jsem na přednášky pravidelně nechodil, protože mě jejich náplň zkrátka k smrti nudila. Když už jsem tam byl, sváděl jsem piškvorkové zápasy. Je zajímavé, jak jsem se během tohoto semestru zlepšil v piškvorkách :)).

Součástí tohoto předmětu byla také semestrální práce, jejíž cílem bylo buď odsimulovat složitější systém nebo vytvořit grafickou visualisaci jednoduššího systému. Pochopitelně jsem si vybral variantu druhou. Nejprve jsem se ji snažil naprogramovat v Javě, ale protože Java je naprosto nemožný a pitomý jazyk, rozhodl jsem se reinkarnovat moje první programovací prostředí – Visual Basic 6.0. :). Jelikož už dávno nemá ani aktivní podporu, musel jsem ho stáhnout z isohuntu… a… a… a málem mi ukápla slza nostalgie :’-). Stačilo nakreslit model, rozpohybovat ho (což jsem stačil během jedné jízdy vlakem z Prahy do Budějc) a odevzdat za téměř plný počet bodů (pár bodů jsem dostal strženo za to, že voda měla moc světlou barvu a nebyla vidět na projektoru – ťuk ťuk) :). Pokud ji chcete, můžete se podívat na PDFko a stáhnout si vlastní program.

Cvičení byla naprosto v pohodě, ani se tam nemuselo chodit (pokud se to člověk nechtěl naučit ke zkoušce a získat body ke zkoušce) a samotná zkouška byla velmi příjemná. Dosali jsme papír se systémem a kupu úkolů (Zdiskretisovat deferenciální rovnice, odsimulovat spojitě v simulinku, diskrétně v simulinku a matlabu, sestavit stavové rovnice a vypočítat hodnotu něčeho jedna, aby se něco 2 systému ustálilo na něčem 3). Ústní zkouška byla také velice příjemná (byli jsme na termínu dva). Pan Hušek se mě zeptal na otázku z analýzy :) – jak najít maximum funkce – věděl jsem – nakonec C – spokojenost.

Databáze (hodnocení: D)

Databáze je první předmět, který se oproti minulému roku změnil. Vyčovali ho doktoři Mlýnková a Nečaský z MFF UK a v semestru po nás věru moc nechtěli. Na přednášky jsem nechodil, protože byly ráno. Omlouvám se, ale tohle je opravdu seriózní důvod na přednášku nepřijít, zvláště když je potom 1 a půl hodiny mezera a potom DSAčka. Na cvičení se také nemuselo chodit, protože jediná jejich náplň bylo řešení domácích úkolů a individuální konzultace. Na prosemináři jsem nebyl ani jednou, takže vůbec nevím, kdo ho vedl, ani kde se konal :D. A o zkouškovém se samozřejmě ukázalo, že jsme předmět podcenili. Na předtermínu prý vyházeli valnou většinu lidí. Já jsem předmět považoval za téměř symbolický, takže jsem si zkoušku zapsal jako poslední (dělal jsem ji včera, výsledky ještě neznám, ale učil jsem se na ni poctivě dva dny v kuse a připadala mi jednoduchá, tak uvidíme).

Edit: Tak nakonec mám jenom Dčko :).

Učili jsme se ER model, relační model, SQL, relační algebru, relační kalkuly a potom takové věci jako transakce, zámky, datové struktury používané SŘBD atp.

Programování v jazyku C/C++ (hodnocení: A)

Toto byl můj pojistný předmět :). Jelikož v céčku programuji již dlouho, neznamenal pro mě předmět nejmenší problém, navíc – hodnocení bylo velmi štědré. Jako semestrálku jsem si vybral výrazovou kalkulačku a zároveň převaděčku mezi infixem, postfixem a prefixem, za kterou jsem nakonec dostal plný počet bodů. Výrazovou kalkulačku jsem si naprogramoval (čistě objektově) v Javě jen tak pro zábavu již minulý rok, takže ji stačilo přepsat do C++ a doplnit k tomu parsery a převodníky různých notací. Navzdory očekávání mi to zabralo docela dost času – hodně práce se zpracováním výrazů (vybral jsem si zpracovávání typu fronta/zásobník místo syntaktických stromů).

Co se mi na tomto předmětu nelíbilo, byla skutečnost, že naše referenční prostředí byl zastaralý školní Solaris se zastaralým a standardy nedodržujícím kompilátorem g++. Studenti a učitelé K136 mají k disposici Visual Studio 2010, což je úžasné IDE s úzasným kompilátorem a optimalizátorem. Osobně jsem semestrálku vyvíjel právě v tomto prostředí, a protože garant předmětu, přednášející a zároveň cvičící, pan Strnad, je velmi velmi vstřícný, přijal mi ji v tomto formátu (jinak bych musel pro nespočet svých souborů psát Makefile a pravděpodobně bych u toho zešílel). Release si můžete stáhnout zde a primitivní dokumentaci zde. V módu „-ixc“ slouží jako rychlá a efektivní kalkulačka. Sám ji používám místo té windowsácké… konečně jsem udělal něco, co sám používám :D.

Matematika pro informatiku (Hodnocení: E)

Ačkoli mám z tohoto předmětu Ečko, nijak to neodráží, jaký jsem k němu měl vztah. Předmět mě ohromně bavil, a to hlavně díky panu garantovi a přednášejícímu, p.t. Velebilovi. Napsal skvělá, čtivá a krásně vysázená (až na určité výjimky – ‘a’ na konci řádků atp.) skripta Diskrétní matematika. Opravdu radost na ně pohledět, radost je číst… TeXu sláva na věky věků. Taky mi udělal radost citováním písničky Rock Around the Clock Billa Halleyho :D.

Na cvičení jsme měli výbornou p.t. Natálku Zhukavets, která má dokonalý talent na vysvětlování. Opravdu, všechno, co jsem z přednášky nechápal, mi byla schopna vysvětlit v řádu minut. Udělali jsme stovky různých příkladů a ke kadé písemce jsme spočítali několik typových příkladů. Tuto cvičící rozhodně doporučuji všem, kdo se předmět absolvovat teprve chystají. Koficienti :).

Psaly se dvě semestrální písemky, každá po dvaceti bodech, z toho 10 povinných. První písemku (na rekurentní rovnice) jsem v řádném termínu bohužel nenapsal, protože jsem dostal charaktereistický polynom třetího stupně a v té panice jsem nepřišel na to, že kořeny musí být triviální a že stačí testovat -10 až 10 na kalkulačce a čekat, až vyplivne nulu. Napsal jsem ji v opravném na 15 :). Druhou písemku jsem napsal v řádném termínu na 18 (na počítání modulo číslo).

To zkoušková písemka, to je jiná. Oproti semestrálním testům byla netriviální až těžká, proto jsem si na ni vyhradil plus minus celý týden. Začal jsem protokolem RSA, přes Zn[x]/m(x), abstraktní výpočty, cyklické grupy a permutace, až po běžnou a strukturální matematickou indukci (té jsem ovšem moc nedal, protože jsem známý induktor… indukcí dokazuji kde co, viz můj transkript na DSA).

Nakonec v písmece bylo to, co jsem nechtěl, aby tam bylo, a co jsem se učil nejmín. Vůbec tam nebyly cyklické grupy, permutace ani strukturální indukce :(. Nakonec mi chyběly na Dčko 2 body. Každopádně to byl skvělý předmět a skvěle vedený.

Datové struktury a algoritmy (Hodnocení: E)

Rozhodl jsem se veřejně nevyjadřovat k válečné sitauci, která kolem tohoto předmětu panuje, i když je moje stanovisko relativně neutrální. Místo toho raději popíši, co jsme dělali.

Na začátku předmětu pan Píše řekl, že má v plánu přidělit 3 body lidem, kteří se příhlásí a napíší transkript vybrané přednášky v PDF, který následně vystaví. Vzhledem k tomu, že mělo být zadáno 10 úkolů po jednom bodu a 7 bodů bylo potřebných k zápočtu, okamžitě jsem se o transkript přihlásil (protože jsem předpokládal, že úkoly, které vymyslí pan Píše, rozhodně nebudou jednoduché). Předpokládal jsem správně. Úkoly byly zadávány z knížky (anglické – tj. byly anglicky) a hodně lidí si na nich vylámalo zuby, protože byly těžké. Hodně lidí z mého okolí předmět okamžitě vzdalo už v začátku, což byla podle mě pěkná blbost. Jeden člověk ode mě z oboru (což je hodně úzká specifikace – aktivních je nás tam tam tak 10) to vzdal, když mu nebyly uznány 4 úkoly v řadě, což byla neuvěřitelná blbost (na konci bylo spoustu šancí jak nahnat body – buď za aktivitu nebo ve speciálních úkolech). Já jsem díky transkriptu udělal jenom 3 úkoly z 10 a jednou jsem si prostě sednul do předu, zrovna když se na cvičeních braly relace. Řekl jsem, že relace je podmnožina kartézského součinu a už jsem měl 7 bodů… jako jeden z prvních. Zbytek úkolů už jsem nedělal.

Midterm. Opět vynechám tu část, která by mohla vyvolat plamenné diskuse a zaměřím se na věcnou část. Midterm byl těžký na to, že to byl midterm. Jinak byl imho docela triviální. Napsat primitivní matematický důkaz, spočítat jednu triviální rekurentní rovnici, napsat kód o jednom for-cyklu a jednom ifu, vynásobit a sečíst čtyři čísla. Na tom nebylo nic těžkého, přesto byla úspěšnost menší než 30%. Spousta lidí v této části skončila.

Zkouška. Zkouška byla těžká. Abych pravdu řekl, byla to nějtěžší a nejvíc na-přemýšlení-založená zkouška, jakou jsem kdy na FELu zažil. Dala mi pořádně zabrat! Jestli ji chcete vidět, mám ji schovanou zde. Dělal jsem jenom Ečkové příklady. Na Dčkové se nikdo nestačil ani podívat. Úspěšnost byla opět mizivá. Ale mám to!

37 kreditů z 37

TeX tutorial: III. Základy makrojazyka, vkládání obrázků 3

Pod minulým článkem jistý Jirka psal, že by uvítal článek o vkládání obrázků do textu. Vzhledem k tomu, že toto má být prakticky zaměřený seriál, je to docela dobrý nápad. Dnes se tedy obrázků dočkáte. Ještě než se k nim dostaneme, budeme si muset osvojit základy makrojazyka TeXu.

Jednoduše řečeno, s TeXem komunikujeme pomocí maker. Makra jsou v plainu zleva uvozena znakem ‘\’ (pokud se vám tento znak nelíbí, můžete ho jednoduše vyměnit za jiný, ale tím se zabývat nebudeme, protože to věru praktické není). Následuje popis, jakým způsobem makro přijímá parametry a vlastní tělo makra. Popis vstupu může vypadat například podobně jako v tomto makru:

\def\abc#1#2#3{#1, #2, #3}

V tomto případě makro přijímá tři parametry, které jdou přesně za sebou a ve výsledku se vypíšou oddělené čárkami a mezerami. Můžeme si ale vstup nadefinovat i zábavněji, například takto:

\def\defg[#1]|#2|(#3){#1, #2, #3} \defg[text]|oddělený|(čárkami)

Pokud neposkytnuteme vstup v předepsaném formátu (na druhém řádku), nastane chyba. Skuteční vtipálci pak při definici maker mohou zajít ještě dále.

\def\abc babička #1°°°°#2[#3]{#3#2#1} \abc babička a°°°°dědeček[???]

V naprosté většině případů si ale vystačíme s definicemi podobnými prvnímu příkladu, maximálně použijeme nějaké hranaté závorky, aby naše makra vypadala opravdu krutě, ale do větších extrémů se pouštět nebudeme. V prvním příkladu bych vás ještě měl upozornit na častou začátečnickou chybu.

\def\abc#1#2#3{#1, #2, #3!} \abc Jedna dvě tři.

Pokud si myslíte, že naše volání způsobí vysázení Věty „Jedna, dvě, tři.“, mýlíte se. Pokud nejsou specifikovány oddělovače, jako první parametr se bere první skupina nebo znak, který následuje. V tomto případě není první parametr „Jedna“, ale „J“. Obdobně je to s dalšími parametry. Náprava je velmi jednoduchá.

\abc{Jedna}{dvě}{tři}.

Existuje ještě jeden velmi elegantní a praktický způsob, jak psát některá makra (zejména nadpisy), který jsem okoukal z článků pana Olšáka.

\def\nadpis#1\par{% {\velkympismem\noindent#1}% \vskip8dd\noindent% } \nadpis Velký článek Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, balónky působí jako jakási fata morgána uprostřed pouště.

Tento způsob je dosti v souladu s představou TeXu jako značkovacího jazyka, kde značky mají být pro koncového uživatele (pisatele, spisovatele) přirozené a jednoduché (čili žádné vnořené složené závorky či jiná zvěrstva). Až budete psát svá makra, pište je jednoduše a elegantně.

Dobře. A jak je to tedy s těmi obrázky?

Nejprve bychom měli k našemu zdrojovému souboru přiložit knihovnu, která obsahuje potřebná makra (protože je pochopitelně sami psát nebudeme).

\input graphicx

A potom již pouze využíváme makro \includegraphics, které za nás udělá tu nejšpinavější práci (vloží obrázek do dokumentu). S jeho zarovnáním se už musíme vyrovnat sami.

\vskip6dd \centerline{\includegraphics[scale=0.75]{spojvis2.png}} \centerline{\ita{Obr. 8. -- 9 vteřin po spuštění simulace}} \vskip10dd

Tímto makrem vložíme do dokumentu obrázek spojvis2.png v měřítku 0,75:1 a zarovnáme ho na sřed. Těsně pod něj potom vložíme jeho popis, který bude taktéž zarovnaný na sřed (\ita je nějaké vámi definované makro, které vypíše popis příslušným stylem – například kursivou). Jaké parametry má makro \includegraphics a jaká jiná makra knihovna graphicx obsahuje, si již můžete zjistit sami. My se zaměříme na sazečskou práci.

Makro \centerline expanduje na \line{\hss#1\hss}, přitom už víme, že \line exapnduje na \hbox to\hsize. \hbox to\hsize vytvoří horizontální kontajner o šířce sazebního obrazce \hss vkládá nekonečně roztažitelnou dynamickou horizontální mezeru. Pokud takovou mezeru vložíme po obou stranách nějakého objektu, potom bude takový objekt přesně uprostřed sazebního obrazce. Kdybych vás teď požádal, abyste napsali makro, které zarovná objekt napravo, určitě byste věděli jak (vložili byste onu podivnou mezeru pouze nalevo, tím pádem by objekt „přimáčkla“ napravo).

Teď už určitě rozumíte celému makru, které vkládá obrázek doprostřed stránky. Častý požadavek mnoha lidí bývá takzvané „obtékání“ textu kolem obrázku. Známá ne-moc-častá extravagantní „featura“, kterou znáte z novin či z wordovských dokumentů, které jsou dle jejich autorů až neuvěřitelně kruté. I takové obtékání se dá v TeXu implementovat, ale předem vás upozorňuji na to, že makro, které je jednoduché pro koncového uživatele, je vysoce netriviální a obsahuje řadu výpočtů. My se pokusíme napsat makro, které nám způsobí obtečení jednoho konkrétního obrázku a neměnném odstavci.

V plainu existuje primitiv \parshape, se kterým si kreativní duše jistě vydrží hrát celé dny. Specifikuje tvar následujícího odstavce, čili můžete vytvořit kulaté, trojúhelníkovité, šipkovité či jinak tvarované odstavce. Primitiv má následující tvar:

\parshape n i1 h1 i2 h2 i3 h3 ... in hn

kde n je počet řádků, i je odsazení od levého okraje příslušné řádky a h je šířka příslušné řádky.

Potřebujeme nejdříve změřit obrázek, který chceme vkládat. To uděláme tak, že zkonstruujeme kontajner, do kterého vložíme obrázek a celý kontajner následně uložíme do paměti pod číslem 1.

\setbox1\hbox{\includegraphics[scale=0.5]{impuls.png}}

Vytvoříme si nový délkový registr \a a uložíme do něj šírku boxu 1.

\newdimen\a \a=\wd1

A zamyslíme se, jak bychom mohli takové obtečení udělat. Existuje mnoho způsobů. Mě zrovna napadá tento. Vysázíme odstavec, pod něj vložíme obrázek, který posuneme nahoru dovnitř odstavce. Makrem \parshape potom „uhneme“ s řádky, které zasahují o obrázku.

\newdimen\b \b=\a \advance\b by5dd \newdimen\c \c=\hsize \advance\c by-\b \newdimen\d \d=\ht1 \advance\d by\baselineskip \parshape 21 0dd \hsize 0dd \hsize 0dd \hsize 0dd \hsize \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c 0dd \hsize \noindent Vítr skoro nefouká a tak by se na první pohled mohlo zdát, že se balónky snad vůbec nepohybují. Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, balónky působí jako jakási fata morgána uprostřed pouště. Zkrátka široko daleko nikde nic, jen zelenkavá... ...(zde záměrně chybí text) ...ani ne moc vysoko, ani moc nízko nad zemí. \vskip-254dd \box1 \hbox to \a{\hfil\ita{Obr. 4. -- Odezva systému}% \hfil} \newdimen\e \e=254dd \advance\e by-\d \vskip\e Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, ...

Jak vidíte, vytvořil jsem ještě tucet nových registrů, se kterými jsem občas provedl tajemnou operaci \advance\… by. Bystřejší z vás jistě tuší, že se bude jednat o přičítání, resp. odečítání délek s/od registrů nebo registrů navzájem. \htX je výška (HeighT) uloženého kontajneru číslo X. \boxX vysází kontajner číslo X a zároveň ho vymaže z paměti (proto všechno to ukládání). Je zřejmé, co celý kód dělá, proto neposkytnu žádné rozšiřující vysvětlení :) (pokud by měl někdo problém, budu rád, když se zeptá v komentářích). Zato poskytnu obrázek, jak takový obtečený obrázek bude vypadat.

Obtékání obrázku v TeXu
Obtékání obrázku v TeXu

Pokud přidáte nebo odeberete pár slov z odstavce, celé se vám to rozhaší :(. Je to proto, že jsme kód navrhovali pro jednu jedinou situaci. Náš kód zdaleka není universální a jak již jsem předesílal, universální kód by byl velmi velmi složitý. Obtékání obrázku textem obecně nedoporučuji používat.

To by byly obrázky. V příštím díle bych se rád věnoval praktickým dorbnostem, jako jsou funkce pdfTeXu – obarvování textu, jeho rotace, posuny (nikoli přes matice zobrazení! jsme začátečnický seriál a nevíme, co je to algebra). Dále bych vám chtěl ukázat, jak oživit vaše dokumenty (udělat je „klikací“) a jak například generovat obsah. A to vše pouze s formátem plain! A eplain :). A občas (jako dnes) ukradneme latexu některé z jeho knihoven (které v něm díky Bohu nejsou napsány, a tak některé z nich můžeme používat).

Bitstream Charter alternative 0

Kingova Temná věž (nakladatelství Beta Dobrovský, sazba SF-PRINT) je sága vázaná v sedmi knihách s pevnou vazbou o celkovém počtu stran přesahujícím tři a půl tisíce. Tento magnum opus je tak rozsáhlý, že nároky na hygieničnost četby exponenciálně vzrůstají.

Neznámá a nenalezitelná firma SF-PRINT tyto nároky splnila excelentně. Po estetické stránce je sazba velmi nadprůměrná (jedna ze sedmi knih dokonce dodržuje řádkový rejstřík). Obzvláště jsem byl nadšen použitým písmem. Pokud jsem dříve říkal, že je téměř nemožné vymyslet nové a zároveň použitelné patkové písmo, potom firma Bitstream Inc. dokázala téměř nemožné.

Když se začtete do nějaké beletrie psané tímto písmem, připadá vám čtení téměř fyzicky měkké, příjemné, komfortní. Ještě se mi nestalo, že bych měl ze čtení podobný zážitek, proto jsem se vydal ono písmo hledat. Vskutku není jednoduché najít jedno konkrétní písmo ve statisících. K výsledku mě po měsících dovedla náhoda. Při brouzdání internetem (po stránkách s problematikou TeXu) jsem si v jednom nápisu povšimnul hranatého písmene „r“. Právě nezvyklý a nezvykle hezký tvar písmene „r“ mi při čtení Temné věže utkvěl v paměti… a tak jsem poznal, že jsem po měsících skutečně došel k cíli.

Je to Bitstream Charter.

Protože v roce 1992, jak jsem se dočetl, věnoval Bitstream toto písmo X konsorciu s licencí umožňující volně distribuovat upravená písma, vznikla velice kvalitní alternativa známá jako Charis SIL. Zkušebně jsem si v tomto písmu vysázel jednu kapitolu z poslední knihy Temné věže, na kterou se můžete podívat. Zdůrazňuji, že dokument musíte vytisknout, abyste dostali pravdivý výsledek. Písmo navrhované pro tisk na tiskárnách s vysokým rozlišením nelze korektně zobrazit na LCD dispalyi. Pro ty, kterým se nechce klikat, mám aspoň obrázek:

Charis SIL

TeX tutorial: II. Znakové sady 3

V minulém díle jste se naučili vyjádřit své sbohem krutému světu, ve kterém žijete. Stačila vám na to tři slova. Dnes se pokusíte rozloučit o něco lépe a s o něco větší grácií. Již vám nepostačí pouhá tři slova a budete chtít celou větu, celý odstavec nebo rovnou celou stránku.

Z předchozího odstavce (nebo z titulku) jste si jistě domysleli, že se dnes budeme bavit o znakových sadách (fontech či písmech, chcete-li). Znakové sady existují od doby, co si lidé vyvinuli první písmo, jehož jednotlivé znaky nosili v hlavách a při nejbližší příležitosti je sázeli do nejprve kamenů, potom na papyrus, na papír, na promítací plátno a na obrazovku počítače. Za Guttenberga lidé naučili umění uchovávat a kopírovat znakové sady dřevo. Následně se tímto materiálem stalo železo, poté snadno odlévatelný tiskařský kov, poté na malou chvíli materiál podobný filmu. V posledních letech lidé pokročili a naučili uchovávat znakové sady energii v jejích nejrůznějších nehmotných formách (magnetismus, elektrický náboj, parasitní kapacity).

Jak tedy nyní sedíte u vašeho počítače a třímáte v rukou myš, měli byste si uvědomit, že pokaždé, když stisknutím klávesy zobrazujete nějaký znak, provádíte činnost, která je nepředstavitelně stará a tak nadčasová, že přetrvá i samotné lidstvo. Úctyhodné, že? A proto byste měli i k elektronické sazbě přistupovat s úctou. Pokud vytisknete dokument a objevíte nějakou hrubici… ať už gramatickou, typografickou nebo estetickou, měli byste ji opravit a dokument vytisknout znovu. Když jsem sázel svůj první domácí úkol na DSA v TeXu (se spoustou matematiky), tiskl jsem ho šestkrát. Člověk, který nějaký dokument píše, v něm potom velice obtížně hledá chyby, které by byly pro jiného očividné.

K věci. Původní plain TeX funguje tak, že máte v adresářové struktuře distribuce TeXu rozházeny tisíce souborů se znakovými sadami (ve formátu t1 – Adobe Type1 a metafontovém mf) a k nim na úplně jiných místech soubory s odpovídající metrikou (ve formátu tfm – TeX Font Metric). K tomu, aby TeX nějakou znakovou sadu použil, bezpodmínečně tyto soubory s metrikou potřebuje. Ono jeden by řekl, že by to nemusel být zas až takový problém, ale vezměte v úvahu, že souborů k jedné rodině musíte posbírat v jednom případě hned 10. V jiném připadě třeba přes 40. Vysvětlím.

Každý řez písma (roman, kurzíva, tučný, polotučný) vyžaduje vlastní t1 (popř. mf) a tfm. U precizních písmových rodin má každý řez dobrých 5 různých velikostí – čili to máme 4 soubory pro velikost 5, 4 pro 7, 4 pro 10, 4 pro 11, 4 pro 12. 4 soubory je ale mnohdy číslo značně podhodnocené. Mnoho rodin písma obsahuje vlastní znakové sady pro matematické symboly (opět v různých velikostech) a další vlastní znakové sady pro rozšířenou matematiku. Šílenství, že? Další nepříjemná věc je, že podle názvu souboru začátečník nepozná, o jaký font se vlastně jedná. Například cs-qcsr je znaková sada Century Schoolbook roman :). Tyto názvy potřebujete přesně znát, pokud chcete onen font použít.

Proto je to v XeTeXu uděláno jinak. Fonty se identifikují systémovými názvy a jsou brány (zejména jejich tvar) ze systémové banky fontů (v MS Windows jsou to všechny „nainstalované“ fonty). Obrovskou výhodou je, že to nemusí být pouze Type1 (nebo mf) fonty, ale mohou být i TrueType, OpenType nebo AAT. Ono pokud jste dostatečně šikovní, dokážete TeX donutit spolupracovat se zcela libovolným formátem písma, protože ve skutečnosti TeX znaky jako takové vůbec nezajímají. Zajímá ho pouze metrika (tfm). To je ale první liga, kterou zatím ani nesledujete.

Jak tedy nějaký vámi vybraný font „nahrát“?

\font\a = "Jmeno:mapping=tex-text:+liga" at 10dd

XeTeX se pokusí najít v systému font Jmeno. Pokud ho nenajde, pochopitně vám začne nadávat. Pokud najde, pokusí se u nich aktivovat prvky, které specifikujete za dvojtečkami. „mapping=tex-text“ znamená, že se budou v textu tradičně nahrazovat dva spojovníky za sebou za en-pomlčku a tři spojovníky za em-pomlčku (čtverčíkovou). „+liga“ aktivuje opentypovou featuru (nevím, jak bych to česky nazval) liga (což jsou běžné ligatury – fi, fl, ffl). Slovy „at 10dd“ nebo „at10dd“ říkáte, že chcete kuželku písma o velikosti deseti bodů. Míru si můžete zvolit libovolně (některé známé míry jsou cc (Cicero=12dd), pt, pc (Pica=12pt), mm). XeTeX si následně vygeneruje tfm metriku a tu potom používá.

Písmo si samozřejmě můžete vybrat jaké chcete. Nejlépe byste udělali s Baskervillem nebo Jannonem, ale pravděpodobně je nemáte k disposici. Zde nabízím malý vzorník ucházejících volně dostupných písem a porovnání s Baskervillem (kde je jasně nejhezčí):

Vzorník písem
Vzorník písem

Jsou seřazeny podle jejich kvality (souzeno mnou). Kdybych neměl Baskerville, stále bych používal Century Schoolbook – je výborně čitelný. Následující výpis uvádí celé definice. Stačí si jen vybrat.

\font\schola = "TeX Gyre Schola:mapping=% tex-text:+liga" at 10dd \font\pagella = "TeX Gyre Pagella:mapping=% tex-text:+liga" at 10dd \font\bonum = "TeX Gyre Bonum:mapping=% tex-text:+liga" at 10dd \font\termes = "TeX Gyre Termes:mapping=% tex-text:+liga" at 10dd \font\century = "Century Schoolbook:mapping=% tex-text:+liga" at 10dd

Tyto fonty bohužel neobsahují žádné nadstandardní opentype featury, jako volitelné ligatury (:+dlig), vzácné ligatury (:+rlig), historické ligatury (:+hlig), stylistické alternativy (:+salt), skákavé číslice (:+onum), proporcionální číslice, tabulkové číslice, apod. Baskerville ale všechno toto obsahuje, takže definice by mohly vypadat následovně.

\font\bask = "Baskerville10Pro:mapping=tex-text% :+dlig:+hlig:+liga:+rlig:+clig:+salt:+onum" at 10dd \font\baskk = "Baskerville10Pro:mapping=tex-text:% -liga" at 10dd

Kdybychom použili každou zvlášť, výstup by vypadal následovně.

Ligatury
S a bez OpenType Fetures

Definiční řádky jsou zlomeny komentářem (znak %), aby nepřelezly řádku. Ve vašem kódu procento odmažte a definici napište na jeden řádek. Lámání řádků komentářem je TeXový fenomén a určitě jste se s ním nesetkali naposledy. Dělá se to proto, že TeX bere znak pro nový řádek jako součást textu určeného k sazbě a může se vám stát, že když budete vaše makra lámat „enterem“, objeví se vám v dokumentech nežádoucí mezery, které se posléze těžko hledají. Pokud před enterem napíšete znak pro uvození komentáře (%), je znak pro odřádkování zakomentován a nemůže se tudíž objevit v sazbě.

Jak definované fonty používat? Na to už jste zřejmě přišli během článku (užitím \jmeno). Uvedu ale ještě pár dobrých zvyklostí.

V TeXu se vyskytují skupiny (bloky kódu), které vytvářejí obory názvů (namespaces) a platnosti. Skupina je uvozena znaky „{“ a „}“. Vše, co se mezi těmito znaky stane (s mnoha a mnoha výjimkami :) ) mezi nimi zůstává. Čili změníte-li aktuální font v jednom oboru názvů, který skončí, změna už nebude platit. Je dobré definovat si font v oboru názvů nejvyšší úrovně – čili ihned na začátku – a veškeré změny fontů realizovat ve skupinách. Mohli byste sice napsat

\hlavnifont Ahoj, \jinyfont jak to jde? \hlavnifont Měj se.

,ale lépe je napsat

\hlavnifont Ahoj, {\jinyfont jak to jde?} Měj se.

, což vyprodukuje naprosto stejný výstup.

Existuje věc, kterou musíte udělat okamžitě po nastavení písma s velikostí kuželky n. Pokud to neuděláte, vaše sazba bude ošklivá a zcela nepoužitelná. Musíte nastavit vzálenost účaří jednotlivých řádek (laicky řečeno nastavit řádkový proklad). Pokud použijete kuželku písma 10dd a ponecháte standardní vzdálenost účaří, budou na sobě řádky sedět a v tomto nastavení ještě nepravidelně, takže výsledek bude opravdu ošklivý. Potřebujete nastavit registr \baselineskip. Hodnota tohoto registru by u běžné literatury standardní velikosti písma nikdy neměla být větší než n+3, spíše by měla být n+2. Pokud máte kuželku písma 10dd, musíte nastavit \baselineskip=12dd!

Nyní, když už si umíte vybrat znakovou sadu dle vašich představ, vás to svádí k produkování celých vět… odstavců… stránek, či dokonce kapitol! To ale ještě nemůžete. Váš výstup by neodpovídal normě a v horším případě by ani nebyl hezký. Vzpomínáte, jak jsem v prvním díle psal o dělení slov?

\uselanguage{czech}

Nebylo to úplně všechno, co potřebujete k tomu, abyste dodrželi standardy a tradice. Za tento řádek je bezpodmínečně nutné vložit ještě tyto:

\frenchspacing \lefthyphenmin=2 \righthyphenmin=3

Makro \frenchspacing nastaví evropské „mezerování“ za interpunkčními znaménky. Podle americké typografické normy (kterou TeX pochopitelně rád svým uživatelům vnucuje) se za interpunkčními znaménky nechávají mírně větší mezery než jak je tomu zvyklostí v evropě, kde se naopak používají mezery kratší. Protože my dodržujeme tradice za každou cenu, pochopitelně \frenchspacing zapneme. \righthyphenmin určuje kolikapísmenný zbytek minimálně musí po dělení slova zůstat na vrchní řádce, zatímco \lefthyphenmin určuje, kolikapísmenný zbytek minimálně musí pokračovat na řádce nové. Podle české normy jsou tato čísla 3 a 2.

Dále ještě musíme definovat české uvozovky, protože v XeTeXu nemáme tu možnost používat styl czech.sty, který je výsadou csTeXu (a i kdybychom měli, stejně by nám nefungovaly, protože v unicode jsou namapovány jinde).

\def\uv#1{{}\char8222{}#1{}\char8220{}}

Tímto kódem trochu předbíhám tento díl tutoriálu, ale chci, aby vaše následující pokusy již měly nějakou úroveň. Vždy, když při psaní budete chtít dát nějaký text do uvozovek, vložíte jej jako parametr makru \uv například takto – \uv{Sbohem, krutý světe,} řekl a následně stiskl tlačítko, které spustilo sazbu.

Dnešní díl byl poněkud delší, za to se omlouvám, ale stále mám pocit, že bych mohl psát dál. To, co jsem v dnešním článku popsal, vystihuje danou problematiku jenom nekonečně malým kouskem… jako jedno dx v určitém integrálu nebo podobně :).

Na závěr bych si dovolil uvést úplný dokument složený z toho, co jsme se zatím naučili (a pár… inu… dost věcí, které ještě neumíme, abych vám dal příležitost hrát si a zkoumat). Zdrůrazňuji, že dokument je určen ke zpracování XeTeXem a zdůrazňuji, že musíte použít kvalitní distribuci (například TeXlive), která obsahuje použitý font (TeX Gyre Schola).

Zdrojový soubor lze stáhnout zde: basker.tex.
Výstup by měl (bude) vypadat takto: basker.pdf.

Dejte se do toho :). Experimentujte, nastavujte různé hodnoty, přepisujte podle vaší libosti :).

Intermezzo: Baskerville ze Střešovic 6

Není možné bavit se o kvalitní typografii bez účasti kvalitní znakové sady (písma nebo fontu, chcete-li). Pokud vezmete do ruky kvalitní (nikoli co do obsahu) knihu a otevřete ji, téměř nikdy neuvidíte jeden z fontů, které znáte a které běžně používáte v té variantě, kterou máte v počítači. To pouze ministerstvo školství vydává otřesně vypadající příručky a dokumenty psané dvěma fonty, které jsou nastaveny jako výchozí v každé instalaci MS Office 2007. Ministerstvo školství vůbec nezajímá, že tyto fonty absolutně nejsou navrženy pro tisk, nýbrž pro zobrazování na LCD obrazovkách (zvláště po letošních volbách sedí na ministerstvech amatéři a lidé z ulice (nejvíce mě baví ministr dopravy, co se v tomto oboru začal vzdělávat až poté, co byl do této funkce obsazen)).

Baskerville typeface
Nestandardní ligatura fk

Návrh znakových sad je precizní umělecká práce, která však musí mít určitou formu (písmeno ‘a’ musí velmi blízce připomínat původní podobu minusky z roku 800 A.D.) a musí být optimalisovaná nejen esteticky, ale i hygienicky (je velice jednoduché přijít o dobrý zrak jeho namáháním). Právě proto je vytvořit nové a zároveň prakticky použitelné písmo téměř nemožné a designeři tak stále znovuoživují standardy, které položili géniové svého oboru, jako byli William Caslon, John Baskerville, G. Bodoni a F. Didot. W. Caslon jako zástupce písem, kterým se říká renesanční antikva (dnešní zástupce je např. Palatino), Baskerville jako zástupce barokní antikvy (např. dnešní Times) a poslední jako zástupce moderní antikvy (např. Computer Modern).

Long s in Baskerville typeface
Dlouhé s

Některé dnes zdarma dostupné znakové sady jsou výsledkem přílišného zjednodušování na úkor pohody při čtení (groteska Arial). Jiná písma jsou tak nadužívaná ve všem možném, včetně běžných dokumentů, že nevybuzují estetický prožitek z čtení a naopak vyvolávají pocit amatérismu (Times New Roman). Zvláště v poslední době se ale objevují i písma velmi kvalitní (Adobe Garamond Pro), na které lze získat určitou licenci dohromady se zakoupením nějakého produktu firmy Adobe (například Photoshopu, InDesignu). I když jsou tato písma velmi propracovaná a obsahují české akcenty, nejsou česká, a tedy se v některých důležitých detailech mohou lišit od tradičního českého stylu sazby. Kvalitní zahraniční písma mi nevyhovují ještě v jednom ohledu. Mnohdy totiž postrádají dnes již řídce používané znaky, které by se dle mého názoru měly co nejdříve opět běžně objevovat v tisku (jinými slovy, nejsou až tak ortodoxní, co se týče typografie, jak bych si přál).

Discretionary ligatures in Baskerville typeface
Volitelné ligatury

Písmo, které vidíte na všech obrázcích v tomto článku, je Baskerville 10 Pro od pana Štorma ze Střešovické písmolijny, které jsem si od prvního pohledu zamiloval. Je to nejhezčí a nejobsáhlejší klasické písmo, jaké jsem kdy viděl. Uspokojuje mě po stránce češtiny a zejména po stránce ligatur a zapomenutých znaků. Obsahuje dokonce ligatury pro dlouhé s (viz druhý obrázek)! Kdo a proč by dnes dělal ligatury pro dlouhé s? Když jsem viděl kompletní znakovou sadu, nemohl jsem věřit svým očím.

Toto ladné a detailně propracované písmo samozřejmě není k disposici zdarma. Licenci lze zakoupit na Storm Type Foundry.

Příští díl: TeX tutorial: II. Znakové sady

První týden třetího semestru, aneb jak to vidím 2

Předem se omlouvám za stylistickou kvalitu článku. Už na to únavou nevidím, místy mám divný slovosled a v jedné větě dvakrát opakuji to samé, ale… prostě se mi to chtělo napsat :).

Bude to dřina. Pořádný kus tvrdé práce… a konečně i vzdělání a zábava.

Abych pravdu řekl, už první týden mi dal pořádně zabrat… jsem utahaný jako pes, a to se celý kolotoč teprve rozjíždí.

V pondělí jsme hned z vesela začali přednáškou z Matematiky pro Computer Science, kterou přednáší sám tvůrce skript (ehm…) pro tento předmět – pan Velebil. Osobně jsem ztratil nit někdy v polovině přednášky a potom už jsem jenom zíral na slídy (termín s dovolením vypůjčený od dr. Olšáka) a pokoušel se ji znovu najít. Do smíchu mi moc nebylo.

Hned po MCS následovala přednáška z programování v jazyce C/C++ – předmětu, který jsem si zapsal jako volitelný. Mile mě překvapilo, že se od minulého roku leccos změnilo. Vedení předmětu přebral po obávaném panu Vágnerovi mladý doktorand, který nebude využívat progtest a za semestr zadá pouze 4 domácí úkoly. Je to velmi vstřícný člověk, který se chová tak, jako kdyby byl jeden z nás. Už jsem začal se semestrálkou (protože C++ umím už ode dávna… to jsem ale…) a předpokládám, že hodiny tohoto předmětu pro mne budou oddychovou částí týdne. Dokonce je dovoleno používat kompiler od Microsoftu (čehož jsem se hned chopil, že ano) :). No a to bylo z pondělí vše. Pondělí budu mít velmi rád, protože zbytek týdne je vlivem manipulace s cvičeními v poslední chvíli kvůli spásnému výběru cvičících a pevně daných hodinách relativně rozházený.

V úterý začínám hned od půl sedmé výbornou přednáškou z PSŮ (PES – Programování vestavěných systémů), kterou přednáší výborný týpek externista s řekněmě lidovým slovníkem :). Přednáška mě opravdu bavila. Stejně jako cvičení, které se odehrává ve velké laboratoři v karláckých kobkách (mají tam jeřáb a auto, co má v nádrži vodu). Pracujeme s hand-made vývojovými destičkami s čipem od ATMELu (ARM7), které jsou, co do technologie, o trochu dále než picáky ze SAPu, ale především… programujeme je v C. Žádný zapáchající picácký assembler s desetipísmennými intrukcemi.

Dále potom máme mít buď cvičení neo proseminář z Databází, ale ten ještě, nevím proč, nebyl. Dle přednášky, kterou dnes měla p.t. Irena Mlýnková, to ale asi bude pořádná nuda. Databáze zkrátka nejsou můj kopeté.

Ve středu začínám ráno lukostřelbou s panem doktorem Křížem, což je více než příjemné uvolnění do začátku dne, kdy mám sice jen 3(2) hodiny, ale roztažené po celém dni. První je proseminář z céčka, na který jsem se rozhodl nechodit, protože mi asi (alespoň v první polovině semstru) nedokáže nic dát. Večer potom mám cvičení z MCS, které jsem na poslední chvíli vyšmelil za své původní. Když jsem cvičení tento týden absolvoval, byl jsem moc rád, že jsem neprohloupil. Natálka je jednoznačně nejlepší cvičící z výběru, který letos na diskrétku byl. Je příjemná, přesná, vše vysvětluje podrobně a do hloubky, počítá s námi hromady příkladů (které nám ostatní… alespoň ti svědomitější… závidí) a upozorňuje nás na to, co by mohlo a co bude ve zkoušce. Když to vezmu velice zkrátka, z jejího výkladu jsem pochopil to, v čem jsem o přednášce tonul.

Ve čtvrtek jsem odpoledne začal cvičením z DSAček, které se koná na záchodě. Ano, je to v budově A na karláku v uličce, kam se sotva vejde jeden člověk a jsou tam pouze záchody… a jedny špinavé dveře, které skrývají odpornou učebnu. Učí nás to mladý doktorand, ing. Drchal. Zatím jsem si o něm obrázek moc neudělal, protože mě ten den urputně bolela lebka. Potom následovala přednáška z našeho druhého oborového předmětu (MAS – Modelování a simulace), která se konala v ještě odpornější smradlavé komoře na košťata, kde bylo takové vedro, že se mi lebeční kost rozvibrovala na vlastní frekvenci a nemohl jsem se soustředit, takže dojmy z přednášek asi až později. Pouze jsem postřehl, že je pan Hušek velmi vstřícný člověk.

Cvičení z MASu už probíhají v podstatně lepší učebně. Je to úplně nová a rozlehlá laboratoř automatizační techniky (s příjemným podnebím), kde je pro každého studenta jeden počítač s jedním MATLABem :). Ano, v tomto předmětu si budeme hrát s MATLABem a Simulinkem. Opět jsem z výše uvedeného důvodu moc nemohl vstřebávat atmosféru, takže opět nechám první dojem na jindy.

V pátek jsme začínali DBSky s p. t. Mlýnkovou. Taková nuda… databáze, weby, kapitalismus, jděte s tím někam :).

Následovala poslední přednáška, která mě příjemně překvapila. Pan Píše tradičně na začátku hodiny pouštěl video (tentokrát trailer na Borderlands… mimochodem, skvělá hra) a posléze se věnoval organisačním věcem. Celá přednáška nebyla zas až tak vyjímečná, ale pan Píše mě jednou věcí velmi mile překvapil. Jediná povinná literatura k předmětu je angličtině :).

Vidíte… i vypsat to trvá věky.

Další stránka »