Scheme aneb programujeme funkcionálně

2008-01-01 21:09 napsal Lukáš Havrlant

Tenhle článek se bude zabývat především programovacím jazykem Scheme, jakožto jednoho ze zástupců funkcionálního programování.

Představení imperativního paradigma

Předpokládám, že každý zná alespoň nějaké střípky z imperativního paradigma. Že ne? Ale jo, určitě jste už něco programovali v nějakém procedurálním jazyku (C, PHP, Pascal, …), což je právě imperativní paradigma. Nejprve bych stručně charakterizoval procedurální jazyky a na základě této charakteristiky bych vysvětlil jaký je rozdíl mezi funkcionálním a imperativním paradigmatem.

Klasický procedurální jazyk staví na efektu postupného provádění částí kódu a na efektu přiřazení. Efekt přiřazení je asi nejtypičtější rys procedurálního jazyka, je to ono magické prom=funkce(); (prom:=funkce(); v Pascalu) nebo prostější a=10; b=a; apod. Každou chvíli něco do něčeho ukládáme a následně s tím pracujeme. Dalším typickým rysem je použití cyklů. Chceme-li něco provádět vícekrát, obvykle použijeme nějaký vestavěný cyklus; klasicky for nebo while. Procedurální jazyky mají obvykle složitou syntax a mají také přísnější pojmenování identifikátorů funkcí a proměnných.

Scheme

Teď se vrhneme na funkcionální programování, tedy na Scheme. Scheme není čistě funkcionální jazyk, protože obsahuje procedury vyvolávající vedlejší efekty (například zde existuje příkaz přiřazení, typický rys z imperativního paradigma). Scheme má ve své podstatě strašně jednoduchou syntax, ale o to složitější sémantiku. Zapsat syntakticky správně program je téměř triviální, ovšem zapsat ho tak, aby dával smysl je již horší.

Nyní by se slušelo upozornit na to, že funkcionální programování je naprosto, ale opravdu naprosto, odlišné od „běžného“ programování v jazycích typu C (procedurální jazyky). Je to asi jako byste se pár let učili anglicky a německy a pak přešli na čínštinu. Prostě je to úplně jiná dimenze. Zapomeňte na efekt přiřazení. Zapomeňte na cykly. Zapomeňte na všechno na co jste byli zvyklí…

Prefixová notace

Jak v běžném jazyku zapíšete součet tři plus pět? Asi takhle, že jo? 3+5. Tak se to rychle odnaučte, jestli chcete Schemovat, protože Scheme používá tzv. prefixovou notaci, což znamená, že na prvním místě je operace a na dalších pozicích jsou operandy. Takže tři plus pět byste ve Schemu zapsali jako (+ 3 5). Ze začátku to bude dělat trochu guláš, ale postupem času si na to zvyknete a přijdete na výhody tohoto zápisu. Třeba když chcete sečíst vícero čísel, stačí vám stále jen jedno plus: (+ 1 2 3 4 5 6). Výsledek tohoto výrazu by byl 21. Další výhoda je v jednoznačnosti. V Céčku závorky ve výrazech můžete psát, ale nemusíte, takže z toho místy může vzniknout trochu nepořádek. Ve Schemu prostě ty závorky napsat musíte, jinak se ten výraz vůbec nevyhodnotí. Třeba 2+3*4 ve Schemu s prefixovou notací zapíšeme takto: (+ 2 (* 3 4)).

Trochu blbé je, že prefixové je všechno, takže třeba zápis if(a>b) by ve Schemu vypadal takhle: (if(> a b)), což je dost nepřehledné a pořádně jsem si na to nezvykl doteď.

Symbolický výraz – všechno je vším

Tohle je asi úplně nejšílenější. Všechno může být vším, což částečně plyne z předchozí prefixové notace. Nejen že operátory píšeme na začátek seznamu (seznam je jednoduše řečeno několik symbolů oddělených mezerami a ohraničeny závorkami – třeba předchozí zápis se sčítáním (+ 1 2 3 4 5 6) je seznam.), ale i jakékoliv jiné procedury píšeme na začátek seznamu a další výrazy jsou argumenty procedury. Nové vazby vytváříme pomocí speciální formy define. Třeba tenhle výraz (define cislo 10) vytvoří vazbu ze smybolu cislo na číslo deset. Nic nečekaného. Když si necháme v interpretu vyhodnotit cislo, vrátí nám to 10. Novou proceduru můžeme vytvořit podobně:

(define proc
  (lambda(a b)
    (+ (* a a) (* b b))))

Tahle procedura vrací součet druhých mocnin předaných argumentů. A teď přijde ten hardcore. Tuhle proceduru můžeme předat jako argument úplně jiné procedury. Interpret Schemu totiž postupuje tak, že prochází seznamy a hledá vazby jednotlivých symbolů a následně je provede, přičemž je mu úplně šumafuk, jakou vazbu ten symbol má. Pokud provedeme třeba tohle: (define plus +), můžeme používat symbol plus úplně stejně jako normální symbol sčítání. Interpretu je jedno co se jak jmenuje (téměř) a co se kde aplikuje. Zkrátka jen suše vyhodnotí vazbu a provede co chceme.

Příklad: mějme tuhle proceduru:

(define porovnej
  (lambda(procedura a b c)
    (if(> (* c c) (procedura a b))
    #t
    #f)))

Tahle procedura bere čtyři argumenty – proceduru a tři čísla. Samozřejmě nikde není explicitně definované, jaké typy argumentů musíme předat, ale předáme-li špatné typy argumentů, program prostě dále při aplikaci vyhodí chybu. Procedura porovnej porovnává, jestli je větší druhá mocnina c nebo výsledek aplikace předané procedury na argumenty a a b. Příklad aplikace procedury porovnej:

(porovnej proc 2 3 4)

Proceduru proc jsme sepsali výše. Takže nejprve se provede umocnění čtyřky na druhou a poté se provede součet druhých mocnic 2 a 3. 16>13, výraz nám vrátí #t.

Otázka pro bystřé kluky a holky – jaký bude výsledek posledního řádku?

(define plus +)
(define + -)
(define - plus)
(+ 10 5)

Kdo si tipl pět, má bod; kdo tipl patnáct, nemá pro funkcionální programování vlohy; kdo tipl něco jiného, nemá vůbec pro programování vlohy ;o).

Filtrování prvků

Předchozí příklad s procedou jako argumentem nebyl úplně vhodný, protože byl více méně nesmyslný. Ale co třeba tohle? Představme si proceduru, která bere jako argument predikát (proceduru vracející buď #t nebo #f) a následně odstraní ze seznamu všechny prvky, které neodpovídají danému predikátu. Proceduru napíšeme snadno:

(define filter
  (lambda(pred? sez)
    (foldr (lambda(x y) (if (pred? x)
                            (cons x y)
                            y)) '() sez)))

Nebudeme teď moc rozebírat jak to funguje, na to by bylo třeba pár lekcí Schemu. Jen zdůrazním, že procedura filtr bere jako první argument predikát a jako druhý argument seznam. Možné příklady aplikace:

> (define seznam '(1 2 3 4 5 6 7 8 9 10))
> (filter even? seznam)
(2 4 6 8 10)

Predikát even? (mimochodem si všimněte, že ve Schemu bývá zvykem predikáty, vracející jen pravdivostní hodnoty, zakončovat otazníkem; příjemná konvence.) zjišťuje, zda je číslo sudé. Procedura vyfiltrovala všechna čísla, která nejsou sudá.

Další příklad:

> (filter (lambda(x) (> x 5)) seznam)
(6 7 8 9 10)

Tentokrát jsme si již vytvořili vlastní predikát, který zjišťoval, zda je číslo větší než pět. Čísla menší nebo rovna pěti procedura vyfiltrovala.

> (filter (lambda(x) (and (even? x) (> x 5))) seznam)
(6 8 10)

Teď jsme ponechali jen ta čísla, která jsou sudá a zároveň jsou větší než pět. Podobných příkladů najdeme plno…

Mapujeme…

Další užitečná procedura je map, která provádí mapování seznamu – na každý prvek seznamu aplikuje námi předanou proceduru. Opět si to ukážeme na příkladech:

> (map - seznam)
(-1 -2 -3 -4 -5 -6 -7 -8 -9 -10)

Zde jsme aplikovali operátor odčítání na předchozí seznam, takže všechna čísla nyní mají opačnou hodnotu. Další příklad:

> (map (lambda(x) (* x x)) seznam)
(1 4 9 16 25 36 49 64 81 100)

Zde jsme umocnili všechny prvky seznamu na druhou.

> (map (lambda(x) (>= x 6)) seznam)
(#f #f #f #f #f #t #t #t #t #t)

A nakonec jsme si zjistili, která čísla jsou větší nebo rovna šesti.

Něco takového lze pravděpodobně udělat třeba pomocí pointerů v Céčku, nejsem si tím každý. Každopádně to nebude tak elegantní jako ve Schemu, kde se to prostě používá naprosto běžně.

Cykly? E-e…

Zapomeňte na cykly, to jsem myslel vážně. Ve Schemu nejsou nebo se přinejmenším nepoužívají (tuším, že tam snad i nějaký cyklus je – on by v podstatě měl jít naprogramovat, ale zkrátka se nepoužívá). Všechno se řeší pomocí rekurze a iterace, což je místy docela šílenost. Třeba faktoriál vypadá ve schemu takhle:

(define fak
  (lambda(n)
    (if (<= n 1)
        1
        (* n (fak (- n 1))))))

A Fibonacciho posloupnost takto:

(define fib-iter
  (lambda(n)
    (let fib((a 0)
             (b 1)
             (n n))
      (if(< n 1)
         a
         (fib b (+ a b) (- n 1))))))

A to jsem ještě nepředstavil tzv. y-kombinator. To je hezká věcička. Myslíte si, že je možné provést rekurzi bez toho, aniž bychom tu proceduru nadefinovali? Tedy bez použití define? Do normálního jazyka bych tu otázku převedl takto: Je možné zacyklit funkci, kterou deklarujeme takhle…

function mojeFunkce(a, b, c…)
{
  //tělo funkce
}

…bez toho, aniž bychom v těle této funkce zavolali mojeFunkce()? Ve Schemu to jde docela jednoduše. Ještě předtím si ale musíme uvědomit jednu milou skutečnost. A sice, že tohle (lambda(x) (* x x)) se vyhodnotí na proceduru. Interpret vám po aplikaci toho kódu zobrazí #<procedure>. A na tuto proceduru můžete dále aplikovat argumenty. Takže třeba tohle: ((lambda(x) (* x x)) 5) se již vyhodnotí na 25. Lambda se opět vyhodnotí na proceduru a tahle procedura bere jediný argument – a my jí hned předáme pětku, takže interpret hodí do té procedury pětku a vrátí nám dvacet pětku. A teď ten y-kombinator:

((lambda(y) (y y 5))
 (lambda(fac n) (if(= n 0)
               1
               (* n (fac fac (- n 1))))))

Takže jak to teď proběhne: První lambda se vyhodnotí na proceduru beroucí jeden argument y. Tu okamžitě aplikujeme a jako argument jí předáme další – jinou – proceduru. Teď zpět k první lambdě. Vidíte tam tu magickou formuli y y 5? To znamená jen jediné. Zavolej proceduru, kterou jsme předali v argumentu a jako argument této volané procedury předáme tu samou proceduru. Poté předáme číslo, ze kterého chceme ten faktoriál počítat. Vidíte už trochu tu rekurzi? Vzhledem k tomu, že můžeme směle proceduru předat jako argument, můžete také pomocí argumentů provádět rekurze – stačí, když zavoláme tuto proceduru z argumentu a jako argument jí dáme zase tu proceduru z argumentu. Krása, ne? :-) Ještě bych rád upozornil na to, že to je spíše perlička, tak se hned nelekněte (u nás to málokdo pochopil na přednáškách a cvičeních, takže když jste princip y-kombinatoru nepochopili, neděste se).

Efekt přiřazení? E-e…

Zapomeňte na to, že si budete ve výpočtech ukládat nějaké hodnoty. Takhle to ve funkcionálním programování nefunguje. Ani dost dobře nemůže, protože ve funkcionálním programování jde především o postupném aplikování procedur, kde jako argumenty jsou předávány výsledky aplikace jiných procedur. Žádné zbytečné ukládání. Jedinou výjimku tvoří tzv. let-bloky, pomoci kterých můžeme ukládat hodnoty a poté pouze v těle tohoto let-bloku s nimi můžeme pracovat. V praxi to slouže jen pro ukládání hodnot, které bychom jinak museli počítat vícekrát. Například pokud v některé části kódu potřebujeme znát délku seznamu více než jednou, nebudeme při každém použití délky seznamu tu délku znova počítat, ale navážeme si tu délku na nějaký symbol. Jinak let-bloky prakticky nepoužíváme.

Závěrem…

…bych měl pár slov a odkazů pro ty, kterým se Scheme zalíbil. Ještě bych měl ale upozornit na to, že Scheme je v praxi více méně nepoužitelný jazyk a neznám obor, kde by se Scheme uplatnil. I když jsem slyšel o tom, že se Scheme používá při programování pluginů do Gimpu ;-). Nicméně je to dobrý odrazový můstek třeba pro LISP, který už by měl být použitelnější. Scheme je více méně klasický jazyk na učení, něco jako Pascal.

Jako interpret Schemu používám DrScheme (s jazykem „Pretty Big“, ostatní neznám – Language → Choose language → PLT → Pretty Big) a jestliže se chcete do Schemu ponořit naplno, stáhněte si PDF od dua Vychodil-Konečný. Nic lepšího v češtině nejspíše nenajdete.

Proč se mi Scheme líbí?

Scheme je krásný jazyk, obecně mě to funkcionální programování docela vzalo. Když něco programuju procedurálně, ať dělám co dělám, vždycky z toho vyjde prasárna. Neumím programovat v nějakém normálním jazyku tak, aby to bylo tak hezké, jako bych to napsal ve Schemu. Jako příklad na zkoušku ze Schemu jsem měl naprogramovaný determinant matice a inverzní matice. A když se teď na ten kód kouknu, je mi více méně jasný a na každém řádku vím co dělám.

(define determinant
  (lambda(matice)
    (if (ctvercova? matice)
        (let det((matrix (vynuluj-sloupec matice))
                 (nasobek 1))
          (if matrix
              (if(= (length matrix) 1)
                 (* nasobek (reditel matrix))
                 (det (vynuluj-sloupec (zbytek matrix)) (* nasobek (reditel matrix))))
              0))
        #f)))

I teď po měsící zkrátka vím o co jde. Jo a tohle samozřejmě není celý kód, je to jen ta hlavní procedura. Kdybych to napsal v céčku, vzejde z toho strašná prasárna…

Unreal Tournament 3

2007-12-14 14:31 napsal Lukáš Havrlant

Řežba jak má být.

Už demo UT3 slibovala, že to bude dobré pokračování nejklasičtější střílečky. A taky že jo! UT2004 jsem nehrál, ale vyrůstal jsem na Unreal Tournament (myslím ten nejpůvodnější) a poté UT2003, což se na dlouhou dobu stala ma nejoblíbenější hra ;-). Na UT3 jsem se těšil jako malé dítě a i kvůli tomu jsem si pořizoval Harryho.

První dojmy z Unrealu jsou dobré, hra je dynamická a svižná, jak má být. Akorát mě klasicky prudí kampaň, protože když si dávám nějakou instatní akcičku, jsem zvyklý tam mít tři hordy spolu a protihráčů, kdežto v kampani jsou běžně na tři prdele velkou mapu tři hráči na každé straně. Takže jdete jdete jdete, někoho zabijete a zase půl minutu jdete jdete jdete… Ale to bývalo vždycky.

Další věc je překlad. Ve dne i v noci jsem se děsil toho, že bude UT3 dabovaný. Jen si to představte, jak místo krásného [dabl kyl] vám v bedýnkách zní Pomeje a jeho „Dvojitý zásah!“. Nebo místo „Head Hunter“ vám Vojta Kotek křičí, že jste „Lovec hlav!“. Naštěstí se dabing nekonal, můžu vás zase uklidnit. Žádný Pomeje ani Vojta Kotek. Přeložené jsou jen zbraně a apod. a do videí jsou přidány titulky. Nicméně i tak si budete muset zvyknout, že odteďka bude vaší nejoblíbenější zbraní energopuška (namísto link gun)… :-( (ale už existuje jakýsi modul, který tam vrátí angličtinu – ale nezkoušel jsem to)

Co mě trochu prozatím zklamalo, je výběr postavy. Máte na výběr asi ze čtyř ras a v každé rase jsou cca čtyři (skoro stejné) postavy. Sice si je můžete libovolně ozdobit, ale ani při vší vůli ze žádné postavičky neuděláte ani Brutalise ani Harlequina, známé tváře z Unreal Tournament 2003. Ale je možné, že se další postavy odemknou s dohranou kampaní (i když se mi to nezdá pravděpodobné, kampaň jsem ještě nedohrál, ale mapy mám všechny, takže nevím, proč bych neměl mít postavy). To je trochu blbý, hraju teď za jakéhosi polorobota.

Ve zbraních snad žádná extra zásadní změna není, prostě jsou klasicky Unrealovské. Akorát jistě potěší vrácení legenrádních dvoupistelok – pokud během vraždění seberete někomu enforcer (což je skoro nemožné, protože nějaké zbraně jsou na každém kroku, takže si musíte vyhlídnout nějakého zrovna obživnuvšího), můžete používat dvě pistole zároveň, což je skvělé ;-). Byla to jedna z mých oblíbených zbraní v původním Unreal Tournament.

Teď pár slov k novému módu Warfare. Principem je, že musíme postupně ovládnout všechny stanoviště a poté musíte zničit soupeřovu kouli v jeho základně. Zní to docela jednoduše, ale ono ovládnout postupně pět šest bodů zase taková sranda není. Co je dobré je, že se vždy bojuje prakticky u jednoho stanoviště. Pokud stanoviště očíslujeme 1–2-3–4-5, tak na když ovládáte body 1–2-3 a soupeř 4–5, bojuje se výhradně u bodů 3 a 4, vzdálenější stanoviště (1–2 a 5) jsou kryté a nejdou dobýt. Takže nemůžete jen tak přeběhnout mapu a zabrat nějaké úplně jiné stanoviště. To je fajn. Ze začátku to bylo trochu zmatené, protože – i po přečtení manuálu- jsem to moc nechápal. Ale po pár hrách to člověk prostě pochopí… Nebo prohraje ;-).

Hru jsem objednával u xzone, doručeno to bylo hned další den (resp. v úterý v noci objednáno, ve čtvrtek ráno doručeno, bez problémů). Součástí balení je i bonusové DVD, které jsem ještě neviděl. Balení můžete vidět na fotce:

UT3 small

Jestli si teda chcete užít pořádnou akcičku, cákance krve stříkající r postaviček, do kterých to perete rotačákem nebo raketometem roztrhané kusy těl (pro slabší povahy: krev jde vypnout), rozhodně Unreal Tournament 3 doporučuji ;-).

Komentáře

Chyba v Google Talk

2007-12-10 20:41 napsal Lukáš Havrlant

novým počítačem jsem si konečně nainstaloval nové verze některých programů, které používám. Nicméně můj oblíbený GTalk vykazoval jakousi podivnou chybu. Instalace proběhla hladce, přihlášení taky. Ale ve chvíli, kdy jsem se pokusil někomu napsat (stačilo kliknout na jeho jméno v contact listu), vyskočila na mě otravná hláška. Podotýkám, že se to děje jen ve Windows Vista.

Stačilo sice odkliknout, ale i tak to bylo dost otravné. To samé se stalo, když jsem vlezl do nastavení nebo když někdo napsal mně. Po chvíli hledání jsem nic nenašel a proto jsem se rozhodl napsat na podporu. Svou lámanou angličtinou jsem vysvětlil problém a za dva dny (konkrétně dnes) mi v emailu přistála odpověď.

Takže řešení tohoto problému: Při instalaci vám nejspíše nevyskočilo okýnko UAC, tedy takovéto odkliknutí, že věříte tomuto programu blabla. To způsobilo jakousi katastrofu a proto teď ta chyba. Takže stačí instalační soubor spustit jako správce, tedy najděte instalační soubor, klikněte na něj pravým tlačítkem a dejte „spustit jako správce“. Instalace opět proběhne bez problémů a tentokrát už to žádné otravné hlášky vypisovat nebude.

Odpověď jsem odeslal před chvílí, takže je možné, že to Google v dalších verzích opraví anebo mám natolik originální systém, že se chyba vyskytuje jen u mě.

Komentáře

GeoGebra – geniální program na rýsování

2007-12-09 15:41 napsal Lukáš Havrlant

Když jsem začal psát Matematiku polopatě, „rýsoval“ jsem všechny možné grafy v naprosto (na tuhle věc) nepoužitelných editorech jako je Fireworks, Flash nebo Photoshop. Výsledky si můžete prohlédnout v části goniometrické funkce. Všechny obrázky jsou myslím dělané právě ve Fireworksu a je vidět, že jsou různě kostrbaté a takové prostě nanicovaté. Proto jsem se později rozhodl najít nějaký lepší nástroj na kreslení trojúhelníků, úhlů apod.

Přeptal jsem se lidí, co se vyznají a narazil jsem na geniální program – GeoGebra. Instalace je bezproblémová, akorát budete potřebovat Javu, což může být pro někoho překážka. Co všechno tedy GeoGebra umí:

  • V prvé řadě umí rýsovat přímky, polopřímky, úsečky a to dle určení dvou bodů. Nejdříve si naklikáte dva body a program tyto dva body spojí přímkou. Obrovská výhoda je, že změníte-li později umístění jednoho z klíčových bodů, otočí se za nimi i všechny přímky. Obecně pokud změníte umístění jakéhokoliv bodu, který je součástí nějakého útvaru, útvar se změní taktéž, je-li to možné. Úsečku můžete také narýsovat například zadáním délky, nemusíte určovat oba dva body. GeoGebra si poradí i s vektory.
  • Nějaký polygon můžete narýsovat buď přes x úseček, což je debilní, nebo přímo pomocí nástroje polygon. Každým kliknutím přidáte jeden vrchol, čímž můžete vytvořit libovolný n-úhelník. GeoGebra také podporuje pravidelné n-úhelníky, takže chcete-li narýsovat čtverec, stačí narýsovat úsečku, zadat počet stran – v našem případě 4 – a čtverec je na světě. Čtverec můžete táhnutím za krajní body dále otáčet, dle libosti, všechny body se přizpůsobí.
  • GeoGebra umí rýsovat kolmice, rovnoběžky, osy úhlů, osu mezi dvěma body apod. Všechno jednoduché – nejdříve vyberete bod, který má například rovnoběžka procházet a poté kliknete na osu/přímku, ke které má být rovnoběžka rovnoběžná.
  • Zvládá také kreslení kružnic podle mnoha kritérií. Můžete si klasicky určit střed a poté napíšete poloměr, dále můžete kružnici určit třemi body (můžete tak snadno narýsovat kružnici vepsanou/opsanou trojúhelníku) nebo jednoduše jedním klikem označíte střed a a druhým klikem poloměr. Chcete-li narýsovat jen část kružnice, také to není problém a opět máte více způsobů – tři body z nichž první a poslední jsou okrajové body nebo pomocí určení středu kružnice a dvou bodů, které ohraničí výseč.
  • Můžete snadno kreslit úhly – opět buď pomocí určení třech bodů nebo přímo zápisem velikosti úhlu. Samozřejmostí už jsou různé možnosti zápisu velikosti úhlu (stupně, radiány…).
  • GeoGebra vám také změří vzdálenosti či plochy objektů, které jste narýsovali.
  • Můžete si také vytvořit přepínač (checkbox), pomocí kterého můžete zobrazovat a skrývat části výkresu, které si určítě.
  • A beztak toho umí ještě o fous víc, ale víc jsem nikdy nevyužil.

Jestli chcete vidět, co z toho leze za obrázky, koukněte na článek o úhlech nebo na oficiální stránky, kde také mají screenshoty. Mimochodem pokud chcete zachovat původní zdrojový soubor, samozřejmě můžete, nemusíte to ukládat pouze do obrázku, to je jasné. Kdykoliv se pak k vašemu uloženému dílu můžete vrátit.

Eiffelovku v tom samozřejmě nenarýsujete, ale jinak je to velice pohodlný nástroj.

GeoGebra – oficiální web

Komentáře [3]

Jmenuji se MzK a napíši vám komentář

2007-01-15 23:53 napsal Lukáš Havrlant

Mzk je zvláštní druh komentátora, který jistě brzy vezme pod svá křídla Komentářová služba made in Filip Rožánek jakožto svou hlavní položku. Možná se tak již stalo a Filip jen opomněl aktualizovat výpis služeb.

Nyní bude následovat několik informací pro ty, kteří se ještě s uměním pana MzK nesetkali. Pan Mzk se vyznačuje tím, že musí všude říci něco, klidně jednu větu. Stačí, když ho článek zaujme, potěší vás milým komentářem stručně a jasně hodnotící obsah artiklu. Stejně tak tuhle měl zase velkou radost nad tím, kolik skvělých odkazů mu Jirka naservíroval, neváhal ani vteřinu a komentář byl na světě! S chutí vám také oznámí, že registrace opravdu není těžká, či vás polituje. Jindy nás upozorní na starou dobrou pravdu a dokonce by rád založil vlastní stát.

Pokud jste si neobjednali Filipovy výborné Komentářové služby a přesto vám pan MzK píše podobné komentáře, můžete využít řešení, jenž jsem aplikoval na tomto webu. Myslím, že to zvládnete odkoukat, stačí jen zkusit napsat komentář pod jménem MzK :-).

Aktualizace: Už to nezkoušejte, strašlivá Javascriptová bariéra byla zrušena.

Komentáře [17]

Proč mladí lidé chtějí volit komunisty?

2006-11-13 22:43 napsal Lukáš Havrlant

Dneska jsem si cestou do Olomouce koupil MF Dnes, abych se cestou neunudil xmrti a co se tam nedočtu – redaktoři udělali jakousi statistiku toho, jak se mládež (16, 17) staví k politice, konkrétně ke komunismu. Jeden výrok ve mně vzbudil docela velké obavy:

…demokracie si váží 89 procent vrstevníků, ale 11 procent z nich by bylo raději, kdyby převrat v listopadu před sedmnácti lety nepřišel.

Velice smutný výrok, zajímalo by mě, co se mládeži na tehdejší komunistické tyranii zalíbilo natolik, že by ji brali radši než současný systém. Proč proboha chtějí, aby jim vládli vrazi? Nebo snad chtějí stát frontu na banány?

Chápu, že současná bezvládní situace je poněkud ošemetná, ale přeci jen je to pořád lepší, než mít pod krkem komunistický srp kdykoliv připraven seknout. Komunismus je zlo, které mělo být vymýceno a zakázáno stejně jako nacismus. Jsou to nedemokratické ideologie, oba režimy mají na svědomí tisíce mrtvých, ani jedna ideologie nemůže v praxi fungovat, což jsme se sami mohli přesvědčit. Fašismus i nacismus staví zájmy státu nad jednotlivce – stejně jako komunismus. Fašismus i nacismus likviduje své odpůrce, ať už „otevřeně“ (zavírání lidí v lepším případě do vězení) nebo „skrytě“ (cenzura), komunismus taktéž. Komunismus je sice slabší odvar nacismu, přesto se ani náznakem nepřibližuje demokracii a svobodě.

Proč tedy mladí lidé chtějí volit komunisty? Pochopím nějaké postarší lidi, kterým je to už v zásadě jedno, ale co k tomu vede naši mládež? Možným důvodem může býti nedostatečná informovanost. Schválně – co se učíte v dějepisu? Pravěk, že? Starověk a středověk určitě taky, bezpochyby i novověk. Všechno je to jistě strašně důležité a zajímavé, naše dějepisářka říkala, že kdo nezná minulost, nemůže se poučit z chyb, které už učinili jiní a budou je dělat znova. Jistě pravda. Bohužel nevím jak vy, ale my na osmiletém gymnáziu jsme dějepis končili válkou. Po válce jsme patrně probírali důsledky druhé světové války a tím to hasne. Komunismus v Čechách? Prosím? Co by tady dělal? Nic takového jsme se ve škole neučili. 1968? Důležité datum? Proč, neučili nás to. Sametová revoluce? Prosím? Zbláznili jste se? Ve škole jsme nic takového nebrali. 1526? Jistě, znám, nástup Habsburků na Český trůn. 1212? Zlatá Bula Sicilská, to ví přece každý trouba.

Škoda, že se nejde dějepis učit „od předu“, tedy od toho nejméně vzdáleného. Co je mi do toho, že někdy v pravěku lidé stavěli mohyly, když nevím, že před sedmnácti lety proběhla v naší zemi revoluce, kdy byla z našich luhů a hájí vyplavena komunistická špína? Nevidím jediný důvod, proč bych měl dopodrobna znát dějiny Frankské říše a přitom nevědět, jak a proč se u nás dostali komunisté k moci.

Komentáře [32]

Ještě já o tom rasismu

2006-11-08 15:12 napsal Lukáš Havrlant

Poznámka: Já vím, že dgx byl rychlejší, ale co se dá dělat.

Už jsme odkázal Davidův článek a hned na začátku mu vyjadřuji podporu, souhlasím s ním prakticky ve všech bodech. Zdá se mi, že poslední dobou se rasismus dostává do extrémních rozměrů, například podle tohoto článku je rasistický výrok „Opravdu obdivuji přirozený hudební talent amerických černochů“, což už je dost přitažené za vlasy. Nerad bych se dožil toho, aby mě nějaký rádoby moralista poslal do pekel za to, že jsem prohlásil „Češi jsou dobří v hokeji“ (což je prakticky stejný případ jako předchozí věta).

Je normální nemít rád bílé sousedy, když dělají kravál a nepořádek, když jsou tam ve dne v noci slyšet hádky a kdo ví co ještě. Nikdo vám neřekne ani půl slova, když na ně budete nadávat. Ovšem situace se změní ve chvíli, kdy tito sousedé jsou cikáni, budou dělat stejný nepořádek a vy budete úplně stejně nadávat. Žádný rozdíl? Jak pro koho. Já říkám, že ti sousedi dělají bordel, proto je nemám rád. Rádoby moralista řekne, že jsem zkurvenej rasista a fašista.

Češi obecně nejsou rasisti. Podívejte se třeba na SuperStar. Sledoval jsem jakž takž první dvě řady. V obou z nich se do finálových kol probojoval nějaký cizinec – arab, černoška a i cikánka. To musíme být jako češi strašliví rasisti, když jsme si je tam pustili, co? Proč se tam probojovali? Asi proto, že něco uměli a čeští diváci to dokázali ocenit a nijak extra je nezajímalo, že ta a ta je cikánka. Stačilo něco umět a hned si tito lidé získali davy.

Bohužel se obávám, že většina cikánů je na tom v tomto ohledu hůře, protože si povětšinou vytváří u veřejnosti pouze špatný obraz. Proč nejou cikáni vidět v televizi? Znám víc celebrit – černochů než celebrit – cikánů a to bych řekl, že cikánů tady bude víc. Kolik znáte cikánů v politice? Vůbec – kolik znáte cikánů, kteří pracují na nějakém všeobecně uznávaném místě? Určitě ten poměr nebude pro cikány vyznívat dobře. A teď kde je problém – jsme tak přehnaně rasističtí, že cikánům neumožníme se na tato místa dostat anebo na to cikáni prostě nemají? Dokud si bude veřejnost spojovat cikány hlavně se zničenými domy, křikem na ulicích a krádeži, nemůžeme se divit, že je tito lidé nemají rádi… Cikáni potřebují udělat také dobrý obraz (ideální jsou herci, zpěváci, ale i politici – jsou hodně na očích), špatný už mají za sebou a obávám se, že bez usilovné snahy obou stran to nepůjde. A teď se můžeme začít hádat o tom, která strana se snaží a která ne…

Související:

Komentáře [16]

Zastaralý jakpsatweb?

2006-05-11 00:25 napsal Lukáš Havrlant

Nedávno jsem objevil jedno hodně zajímavé diskusní fórum sídlící někde na adrese newds.cz. Dozvíte se zde skutečně nečekané věci. Věděli jste například, že Jirka Kosek je lhář? Vždyť každé malé dítě přece ví, že XHTML obsahuje tak deset, maximálně patnáct plně sémantických elementů, narozdíl od HTML, které obsahuje všechen ten značkovací póvl. Někde dále tam naleznete i narážky na mou osobu… Nevadí, začínám si zvykat :-).

Ale jedeme dále a sice v tomto vláknu. Úplně dole tam někdo zcela nevinně odkázal Yuhůvou stránku o divech a spanech. Ovšem v tu chvíli se patrně jistému uživateli RATMEX_B rozbušilo srdce a zvedla se mu hladina adrenalinu tak, jako když já vidím článek o přístupnějším XHTML a neodolal a zareagoval. Dokonce dvakrát, podruhé již na požádání. Vynechám-li osboní narážky, napsal zhruba toto:

DIV a SPAN boli uz HTML 3.0 (t.j. niekedy v roku 1996) a teda v dobe, ked nejaky jakpsatweb ani nevedel, ze bude existovat.

Pominu-li vytržení z kontextu, tak element <span> je součástí až specifikace HTML 4.0.

Citace z jakpsatweb:

„tag div před sebou a za sebou udělá konec řádku“

a jeho následná reakce na tuto citaci:

box model asi spanielska dedina a vyznam vlasnosti block content asi tiez.

Schválně jsem si napsal pokusnou stránku a nemohu se zbavit dojmu, že tag <div> před sebou a za sebou udělal konec řádku.

Další citace z JPW:

Internet Explorer 4 neumí spanu (a obecně jakémukoli řádkovému elementu) vykreslit padding, margin, border, height, width a možná ještě něco.

A reakce:

ze by to bolo preto, lebo inline elementy nie su blokove?

Opět jsem neodolal a udělal testovací stránku a světe div se! IE6 natáhne element <span> aniž bych ho změnil na blokový!

Nyní pouze jedna uživatelova nesmyslná reakce:

element center nie je v HTML vobec definovany

Element <center> byl již v HTML 3.2 kde byl postaven prakticky na stejnou úroveň jako <div>.

Další citace z JPW:

„Například budu chtít mít kousek textu, nad kterým se při přejetí myši zobrazí nápověda ve žluté bublině. To se dělá pomocí atributu title, je ale otázka, k jakému tagu ten title přidat. Doporučuji tag span“

Jeho reakce:

prisna semanticka a pristupnostna chyba, miesto pre pouzitie elementu dfn.

Našel někdo na internetu věrohodnou zmínku o tom, že pokud chci udělat text, kterému chci vrazit atribut title, musí být v elementu <dfn>? Samotná specifikace mi pak říká, že Obsahem tohoto elementu je pojem nebo definice. A nejsem si jistý tím, jestli každý text, nad kterým se má objevit popisek, je zrovna definice. Avšak je-li tomu skutečně tak, rád informaci přidám i na semantika.name. Člověk se stále dovídá nové věci.

Jeho ostatní reakce jsou v zásadě také nesmyslné, ale nechci reagovat na všechno.

Chápu, že se jakpsatweb.cz nemusí líbit každému, žádný web se nemůže zalíbit všem, ale jen proboha neposlouchejte kritiku někoho, kdo evidentně neví o čem mluví a staví kritiku celého webu na větě "blokovy element nezmana "riadok pred a za"", která asi nebude přesnou definicí blokového elementu, ale svůj účel naučit čtenáře rozdíl mezi blokovým a řádkovým prvkem splňuje maximálně.

S kritikou na JPW se občas na různých fórech setkám. Většinou ho kritizují přísní zastánci moderních technologií a standardů. Zkrátka se jim nelíbí, že Yuhů nekáže, abychom psali veškeré weby validní a patrně jim vadí, že to bere moc prakticky. Například taková teoretická stať o tom, jak se v XHTML2 budou za dvanáct let zapisovat obrázky by pro ně byla mnohem přínosnější ;-).

Ovšem tato věta už je trochu hodně drsná:

Mozes mat pravdu v tom, ze bez jakpsatweb by nevznikali tie tisicky zmatkov (nazyvanych webmi) a stovky „tvoricov webov“ (nazyvajucich sa webdesignermi)

Tohle mohl napsat jenom idiot. Jaká škoda, že nemohu vidět jeho stránku, smlsnul bych si na ni :-). Neznám lepší web, kde by byla tvorba webu rozebrána tak dopodrobna jako jakpsatweb a přitom by bylo všechno krásně srozumitelné a přívětivé. Upřímně řečeno mi na začátku bylo docela jedno, že ten a ten zápis není tak úplně v pořádku anebo že tenhle tag je nevalidní (no, dobrá, to mi částečně zůstalo do teď :-)), hlavně že jsem tomu rozuměl. Validita přišla potom sama.

Je mi líto, že existují i takové diskuse, kde označují Jirku Koska za lháře a jakpsatweb za absolutní zlo. No nevadí. Třeba z toho vyrostou.

Komentáře [34]

the blogger code

2006-03-05 23:36 napsal Lukáš Havrlant

Při brouzdání po cizojazyčném internetu jsem narazil na zajímavou hříčku a sice the blogger code aneb kód bloggerů. Není to nic jiného, než klasický formulář, kde odpovídáte na otázky a program vám pak z toho vyhodí váš kód. Měli byste tedy zjistit, jestli jste žhaví bloggeři, kteří se bez svého weblogu neobejdou ani vteřinu, či jestli je vám váš weblog úplně šumafuk.

Nuže můj kód vypadá takto: B3 d+ t+ k s+ u f- i o x- e- l+ c

Komentáře [1]