Lisp IV: Tečkové páry, seznamy, kvótování

Základní struktura v Lispu je tvořena tzv. tečkovými páry. O co jde? Jedná se o dvojici hodnot, která se navenek tváří jako jakási jednolitá struktura, je to tedy další výraz a jakožto takový ho můžeme například vrátit ve funkci. Jak vytvoříme tečkový pár? Obvykle se tvoří pomocí funkce cons, která bere dva argumenty: levou část tečkového páru a pravou část tečkového páru. Tečkový pár běžně zapisujeme takto: 1 . 2. Takovýto tečkový pár bychom vytvořili touto konstrukcí:

> (cons 1 2)
(1 . 2)

Samozřejmě jednotlivé složky můžeme také číst. K tomu slouží funkce car [kar] a cdr [kudr]. Funkce car vrací první složku tečkového páru, kdežto cdr vrací druhou část. Předvedeme si to na příkladech:

> (car (cons 1 2))
1

> (cdr (cons 1 2))
2

Argument předaný funkci cons se samozřejmě vyhodnocuje, takže když předáme (cons (+ 1 2) 3), tak dostaneme tečkový pár (3 . 3). Základy práce s tečkovými páry máme za sebou, takže už můžeme naprogramovat výpočet kořenů kvadratické funkce:

(defun na2(a)
  (* a a))

(defun deter(a b c)
  (- (na2 b) (* 4 a c)))

(defun x12(a b c)
  (cons
   (/ (+ (- b) (sqrt (deter a b c))) (* 2 a))
   (/ (- (- b) (sqrt (deter a b c))) (* 2 a))))

> (x12 1 5 6)
(-2.0 . -3.0)

Jak to celé funguje? První dvě funkce by měly být jasné – první počítá druhou mocninu a druhá funkce vrací determinant. Třetí funkce vrací tečkový pár, na jehož první pozici se nachází jeden kořen a na druhé pozici druhý kořen. Počítá se to podle klasického vzorečku, akorát převedeného do Lispových pravidel. Funkce sqrt vrací druhou odmocninu. Po zavolání funkce proběhnou výpočty a objeví se tečkový pár. Vzhledem k tomu, že tam dělíme a odmocňujeme, tak bude výsledek reálné číslo (proto ta nulová desetinná část).

Složené tečkové páry

Už se mílovými kroky blížíme k základnímu stavebnímu kameni všech Lispových programů – k seznamům. Jak už jsme si řekli, tečkový pár obsahuje dvě části – levou a pravou. Do těchto částí můžeme uložit prakticky cokoliv. Záleží jen na nás, co necháme na daná místa vyhodnotit. Takže se může stát, že třeba v pravé části tečkového páru bude další tečkový pár. Příklad:

> (cons 1 (cons 2 3))
(1 2 . 3)

Vidíme, že už to skoro vypadá jako seznam :-). Lisp používá takovou trochu zkrácenou verzi značení tečkových párů. Existuje více modelů, ten nejpřímější a nejsložitější vypadá takto: (1 . (2 . 3)). Ale značení není zase tak důležité, navíc bývá v případě potřeby intuitivní.

I na tento složený tečkový pár můžeme aplikovat naše staré známé funkce car a cdr. Jaké budou dávat výsledky? car vrátí jedničku, kdežto cdr vrátí zase tečkový pár:

> (car (cons 1 (cons 2 3)))
1

> (cdr (cons 1 (cons 2 3)))
(2 . 3)

Výsledky jsou očekávatelné. Na prvním místě tečkového páru je číslo jedna, na druhém místě je tečkový pár. Nejhezčí na těchto funkcích je, že je můžeme skládat. Takže pokud bychom z toho tečkového páru chtěli vytáhnout třeba dvojku, použijeme tento seznam:

> (car (cdr (cons 1 (cons 2 3))))
2

Jak bude probíhat vyhodnocování? Nejprve vznikne tečkový pár (1 . (2 . 3)). Z tohoto tečkového páru vememe cdr, což nám vrátí (2 . 3) a odtud pomocí car vytáhneme dvojku. A abychom nemuseli takto složitě skládat car a cdr, můžete používat zkráceniny ve tvaru CAAR, CADR, CDAR atd. Výraz (cadr x) je ekvivalentní složenině (car (cdr x)). Výraz (cdar x) je ekvivalent pro (cdr (car x)). Předchozí výraz bychom zkráceně zapsali jako:

> (cadr (cons 1 (cons 2 3)))
2

Seznamy

Poslední poznámka před tím, než si nadefinujeme seznam. V Lispu existuje false hodnota, které se říká NIL. Je to lispový ekvivalent pro nepravdu. Pravda se mimochodem značí pouhým t. Obdobnou hodnotu jako NIL může plnit prázdný seznam. Prázdný seznam vypadá docela intitivně takto: (). Jsou to ekvivalenty.

Jak tedy vypadá seznam? Seznam je vnitřně konstruován jako posloupnost do sebe vnořených tečkových párů, na jehož poslední místě je prázdný seznam / NIL. Příkladem jednoduchého seznamu může být výraz (cons 1 nil). Toto se vyhodnotí na jednoprvkový seznam (1). Víceprvkové seznamy bychom zapsali takto:

> (cons 10 (cons 15 (cons 20 nil)))
(10 15 20)

> (cons -5 (cons 5 nil))
(-5 5)

V minulých článcích jsme si říkali, že seznamy se do sebe mohou zanořovat. Jak to provedeme, by již mělo být jasné – zkrátka namísto přímé hodnoty vložíme další tečkový pár. Seznam ((1 2) (3 4)) bychom mohli zapsat takto:

> (cons (cons 1 (cons 2 nil)) (cons (cons 3 (cons 4 nil)) nil))
((1 2) (3 4))

Pozor na to, že i vnitřní seznamy musí být vždy ukončeny prázdným seznamem (NIL).

Protože seznamy jsou zakuklené tečkové páry, můžeme na ně používat klasické konstruktory car a cdr. Je si musíte uvědomit, co která funkce vrací. V případě jednoduchého seznamu (ve kterém není zanoření) vrací car vždy konkrétní číslo a cdr vrací seznam, tzv. ocas seznamu. Proto nemůžete u jednoduchého seznamu udělat dvakrát car za sebou, protože car z čísla udělat nejde. Příklady:

; pro jednoduchost uložíme seznam do proměnné
> (setf seznam (cons 1 (cons 2 (cons 3 nil))))
(1 2 3)

> (car seznam)
1

> (cdr seznam)
(2 3)

> (cadr seznam)
2

> (caddr seznam)
3

> (cddr seznam)
(3)

> (cdddr seznam)
NIL

Vidíme, že pokud jsme naposledy volali funkci car, bylo výsledkem číslo, kdežto když jsme volali pouze cdr, vrátil se nám seznam. Pouze v případě, kdy jsme provedli třikrát cdr, vrátilo se nám NIL (což je ale vlastně také seznam – prázdný). NIL se vrátilo proto, že výsledkem cdr u posledního tečkového páru v seznamu je zkrátka NIL.

Kvótování

Vytvářet seznamy pokaždé pomocí funkce cons může být velice kontraproduktivní, protože je to jednoduše zdlouhavé a nepřehledné. Proto existuje speciální operátor quote. Tento operátor ruší klasický vyhodnovací proces, což má mimojiné za následek to, že můžeme konečně vytvořit seznam jednoduchým a pohodlným způsobem. Operátor quote zkrátka převeme argument a vrátí ho v nevyhodnocené podobě. Příklady s jednoduchými výrazy:

> (quote a)
A

> (quote abrakadarba)
ABRAKADARBA

Abychom si to ještě více zjednodušili, můžeme namísto operátoru quote používat zkratku v podobě apostrofu:

> 'a
A

> 'abrakadabra
ABRAKADABRA

Jak to využijeme na tvorbu seznamů? Zkrátka předáme operátoru seznam a on ho nevyhodnotí a vrátí nám ho v nezměněné podobě:

> (quote (a 1 2 3))
(A 1 2 3)

> '(a 1 2 3)
(A 1 2 3)

Jak vidíme, seznam se skutečně nevyhodnotil. Kdyby se vyhodnocoval, Lisp by zařval, protože na symbolu a nemáme navázanou žádnou funkci.

Funkce list

Dnes si ještě představíme ještě jednu funkci na tvorbu seznamů. Tou je funkce list. Funkce list je trošičku podobná operátoru quote, akorát bere libovolný počet argumentů a jednotlivé argumenty před naházením do listu vyhodnocuje. Takže nejprve jednoduché příklady:

> (list 1 2 3)
(1 2 3)

> (list 5)
(5)

> (list)
NIL

A teď ten rozdíl oproti quote. Pokud zkusíte zakvótovat tento seznam: (+ 2 5), tak nedojde k jeho vyhodnocení a výsledný seznam bude vrácen v této nezměněné podobě.

> (quote (+ 2 5))
(+ 2 5)

> '(+ 2 5)
(+ 2 5)

Kdežto funkce list své argumenty vyhodnocuje, takže když listu předáme stejný argument, bude v seznamu pouze sedmička:

> (list (+ 2 5))
(7)

Proto taky nemůžeme pouze pomocí list vytvořit seznam tvořený ze symbolů. Pokud chceme vytvořit seznam (a b c), musíme jednotlivé symboly kvótovat:

> (list a b c)
Error: The variable A is unbound.

> (list 'a 'b 'c)
(A B C)

Quote zkrátka veme svůj argument a vůbec se nepárá s vyhodnocováním, na rozdíl od list, což není speciální operátor, ale obyčejná funkce, a proto tam probíhá klasický vyhodnocovací proces.

Lisp III: Funkce, vyhodnocování funkcí

Jednoduchou funkci můžeme vytvořit pomocí makra lambda. Proč je lambda makro se dovíte později. Syntaxe je vcelku jednoduchá: (lambda (args) tělo-funkce). Argumenty funkce dáváme do seznamu, tělo v seznamu být nemusí, pokud to není žádané (tj. pokud se má vrátit pouze symbol nebo číslo). Argumenty se vyhodnotí při volání funkce. Pokud tedy zavoláme nějakou funcki (fun (+ 5 2)), funkci fun bude předána sedmička. Teď si musíme trochu osvěžit funkcionálního ducha. Protože je tento seriál o funkcionálním programování v Lispu, musíte si uvědomit, co ta funkce bude dělat. Nesmíte používat vedlejší efekt (pak by to nebylo funkcionální), takže jediné co můžete udělat je, že vemete nějaké argumenty, cosi s nimi provedete a vrátíte nějakou hodnotu. Naše funkce tedy budou vždy takto konstruované. Nebudou nic měnit, budou pouze vracet hodnoty.

Řekli jsme si, že funkce můžeme vytvořit pomocí lambdy. Pojďme teď na to – funkce vracející dvojnásobek předané hodnoty:

(lambda (x)
  (* 2 x))

Tento seznam se vyhodnotí na funkci. Konkrétně na anonymní funkci – ano, to je to, nad čím teď jásají PHPkáři :-). Tato anonymní funkce byla sice moc hezká, ale jaksi jsme ji zapomněli použít. Abyste rozuměli – když ten předešlý kód strčíte do posluchače, on vyhodnotí seznam a vrátí vám funkci. Jenže ta funkce není na nic navázaná, takže ji nemůžete nijak použít a je vám takhle sama o sobě na nic. To lze jednoduše spravit a bystří čtenáři ví jak. Minule jsme si řekli, že na prvním místě seznamu musí být funkce. Takže když náš lambda výraz dáme na první místo seznamu a za něj vložíme argument funkce, mělo by to fungovat. zkusíme:

((lambda (x)
  (* 2 x)) 10)

Funguje, že jo? Lisp by měl vrátit dvacítku. Co se tedy všechno stalo? Z našeho lambda výrazu se po vyhodnocení stala funkce – můžete si to obrazně představit, jako by se to přepsalo na (funkce 10). Lisp dále pokračoval ve vyhodnocování tohoto seznamu a protože se funkce nacházela na prvním místě seznamu, spustil ji (aplikoval na ni desítku). Desítka proběhla automatem a ten z ní udělal dvacítku.

Teď už vám můžu taky prozdradit, proč je lambda makro a ne standardní (vestavěná) funkce. Je to vcelku jednoduché – podívejte se znova na ten lambda výraz. Říkali jsme si, že v Lispu by měla být na začátku seznamu funkce, jinak systém neví s tím a vyhodí chybu. Proč tedy Lisp nevyhodil chybu na seznam (x) v lambda výrazu? Měl by, na x přece žádnou funkci navázanou nemáme. A přesně proto je lambda makro – aby se dělo to, co se má dít a ne aby nám to vyhazovalo standardní chyby; makra tedy mají odlišný způsob zpracování.

Vazby na funkce

OK, už tedy umíme vytvořit funkci, umíme ji aplikovat, ale neumíme ji uložit. K tomu se používá makro defun. Je to makro ze stejného důvodu, jako u lambdy. Makro defun má následující syntax: (defun název (args) tělo-funkce). Makro defun definuje novou uživatelskou funkci a ukládá vazbu do globálního prostředí. O prostředích bude řeč ke konci, prozatím není třeba se jimi znepokojovat. Vytvořenou funkci zavoláme takto: (název arg1 arg2 ...). Předchozí funkci si teď přepíšeme a uložíme:

(defun 2x (x)
  (* x 2))

Na symbol 2x máme nyní navázanou funkci, která nám zdvojnásobí předaný argument. Po zkompilování (v LispWorks je to jedno z těch žlutých tlačítek nad editorem) můžeme v posluchači tuto funkci používat:

> (2x 10)
20

> (2x -50)
-100

 > 2x
Error: The variable |2X| is unbound.

Poslední volání byla jen ukázka toho, že smybol má opravdu dvě vazby – do funkční jsme sice funkci umístili, ale jinak symbol 2x žádnou hodnotu nemá, proto když se ji snažíme použít jako hodnotu, dojde k chybě.

Cvičně si napíšeme funkci pro výpočet determinantu:

(defun deter (a b c)
  (- (* b b) ( * 4 a c)))

Funkci pro výpočet kořenů kvadratické rovnice ještě napsat nedokážeme, protože neumíme vracet více než jeden výsledek. I to se časem změní. Můžeme ale zkusit něco jiného: nejprve si napíšeme funkci pro druhou mocninu a tu poté aplikujeme ve funkci pro výpočet determinantu:

(defun na2 (x)
  (* x x))

(defun deter-2 (a b c)
  (- (na2 b) (* 4 a c)))

Proč je tento druhý postup lepší? Má to v zásadě dvě výhody – kód bývá přehlednější. Čím více smysluplných částí kódu rozdělíte do samostatných funkcí, tím se vám v tom bude lépe orientovat. Když to správně rozdělíte, můžete kód číst jako pohádku :-). Například část (* 4 a c) smysluplná jako samostatná část moc není, takže přepisovat to do vlastní funkce význam nemá. Druhý důvod je, že nikdy nevíte, kdy tu funkci budete znova potřebovat. A jak známo – programátor nikdy nepíše stejnou část kódu dvakrát :-). I z toho důvodu se nevyplatí přepisovat (* 4 a c) – není pravděpodobné, že byste takovou funkci potřebovali jinde než ve výpočtu determinantu.

Prostředí

Docela klíčový pojem. Naštěstí je poměrně intuitivní. V Lispu pracujeme v různých prostředích. Primárně máme globální prostředí, to si můžeme představit jako jakýsi root. V tomto globálním prostředí se odehrává velká část kódu. Každý symbol může mít v různém prostředí jinou vazbu. Například symbol sym může mít v globálním prostředí hodnotu dvacet a v jiném prostředí hodnotu třicet. Na tom není nic zvláštního.

Všechny funkce vytvořené pomocí marka defun mají nastavenou vazbu v globálním prostředí. Jak se vytváří další prostředí? Většinou pomocí nějakých speciálních forem, ale stačí nám k tomu bohatě makro lambda. Pokud vytvoříte anonymní funkci pomocí lambdy, tak při vytvoření funkce dojde zároveň k vytvoření nového prostředí. V tomto prostředí mohou mít symboly jinou vazbu než stejné symboly v globálním prostředí. Zároveň se nastavuje vazba na prostředí předka. Klíčové je, kdo je ten předek. V Lispu existuje lexikální rozsah platnosti, takže platí, že předek je vždy prostředí vzniku dané funkce. Pokud funkce vznikla v globálním prostředí, má za předka globální prostředí. Pokud funkce vznikla například v jiné funkci, má za předka tuto funkci. Pozor! Neplést vznik funkce s aplikací funkce. Pokud se nacházíme v jednom prostředí a chceme znát hodnotu nějakého symbolu, jako vždy se první musíme podívat do téhož prostředí. Pokud v tomto prostředí vazbu nenajdeme, jdeme zpět za předkem. Pokud není ani v předkovi, jdeme dále, dokud nedojdeme do globálního prostředí. Pokud ani zde není žádná vazba, vyhodíme chybu. Ilustrační příklady:

(defvar a 10)

(defun x+a+10 (x)
  (+ 10 a x))

(defun a*b+a+10 (a b)
  (x+a+10 (* a b)))

Nejprve deklarujeme globální proměnnou a a nastavíme ji jako hodnotu desítku. Symbol a má tedy v globáním prostředí hodnotu deset. Poté vytvoříme funkci x+a+10, která bere jeden argument, ke kterému přičte desítku a symbol a. Poslední funkce bere dva argumenty, ty vynásobí a předá je předchozí funkci. Hmm, dosti nesmyslné funkce :-). Ale přichází otázka: Když v těle druhé funkce zavoláme funkci x+a+10, jakou hodnotu bude mít symbol a v těle první funkce? (V části (+ 10 a x)) Bude mít hodnotu argumentu a nebo bude mít hodnotu globální proměnné a?

No, je to jednoduché. Funkce vznikla v globálním prostředí, funkce x+a+10 nevidí do těla funkce a*b+a+10, která má své vlastní prostředí, takže hledá vazbu v globálním prostředí. Tam najde desítku. Další příklad:

(defun prostredi (a b c)
  ((lambda (a b)
     (+ a b c)) (* a 2) b))

; Jak se vyhodnotí následující výraz?
> (prostredi 1 2 3)

V těle funkce prostredi jsme vytvořili další, tentokrát anonymní, funkci, která si ovšem také vytváří vlastní prostředí. Symboly a a b tedy budou rovny předaným argumentům anonymní funkce. Zato symbol c nemá v prostředí anonymní funkce žádnou vazbu, takže se jde o úroveň výš. Předchozí prostředí je prostředí funkce prostredi, kde se již symbol c nachází a má hodnotu 3. Takže jak to celé bude vypadat? V těle funkce prostredi vznikne nová anonymní funkce, kterou okamžitě aplikujeme. Jako argumenty jí předáme dvojnásobek původního argumentu a a původní argument b. V těle anonymní funkce pak všechno sečteme (vychází tam tento výpočet: (+ 2 2 3)) a výsledek je sedm.

Jak probíhá vyhodnocování

Ještě trošku detailněji k systému vyhodnocování. Pokud zavoláte nějakou funkci, dojde v vyhodnocení seznamu. Lisp zjistí, jestli mají všechny symboly seznamu (tj. funkce a její argumenty) vazby. Pokud nemají, Lisp vrátí chybu. Pokud mají, Lisp je vyhodnotí. Do těla funkce už tak jdou pouze hodnoty. Ty se vždy ukládají do hodnotového chlívku.

Poté dojde k zavolání funkce, vytvoří se nějaká nová prostředí a začne se vyhodnocovat tělo funkce. Funkce jako taková vždy vrátí poslední vyhodnocený seznam. Je logické, že funkce nemůže vrátit dva výsledky, takže vždy vrátí výsledek posledního seznamu, předchozí výsledky zahazuje. Z tohoto principu je jasné, že pokud se chceme držet funkcionálního paradigma, budou mít naše funkce v těle vždy jen jeden seznam. Pokud by jich měly víc, tak by to buď nemělo smysl:

(defun nesmysl(a)
  (+ a 5)
  (* a 10)
  (- a 1))

> (nesmysl 10)
9

(V těle funkce proběhly dvě operace sčítání a násobení, ale jejich výsledek nic neovlivnil.) Nebo bychom museli použít vedlejší efekt:

(defun vedle(a)
  (format t "~%Predali jste ~s" a)
  (* 2 a))

> (vedle 5)

Predali jste 5
10

(Funkce nejprve vypíše na obrazovku předaný argument a poté vrátí dvojnásobek argumentu.)

Funkce jako argument jiné funkce

Představme si, že chceme napsat funkci, která bude brát jako jeden argument jinou funkci, kterou poté ve svém těle někde a nějak aplikuje. Například takto:

(defun normalize (fun num)
  (fun (abs num)))

Tato funkce bere jako první argument funkci a jako druhý argument číslo. Ve svém tělě pak nejdříve vezme absolutní hodnotu čísla a (funkce abs) a na to teprve aplikuje předanou funkci. Dále si napíšeme vlastní funkci, která vrátí třetí mocninu:

(defun na3 (x)
  (* x x x))

Zkusíme nyní zavolat první funkci normalize s druhou funkcí na3 a číslem –3:

> (normalize na3 -3)
Error: The variable NA3 is unbound.

Kde se stala chyba? Pamatujete si na to, kdy se bere ze symbolu funkce a kdy hodnota? Pokud stojí symbol na prvním místě seznamu, vyhodnotí se na funkci. V opačném případě se vyhodnotí na hodnotu. Symbom na3 má pouze funkční vazbu, nemá navázanou žádnou hodnotu. Proto nám Lisp vyhodil chybu. Jak to opravit? Potřebujeme nějaký prostředek, jak dostat ze symbolu funkci, přestože se nachází na místě, které je obvyklé pro symbol. K tomu slouží funkce function. Volání zapíšeme takto: (normalize (function na3) -3). Tímto jsme zajistili, že hrábneme do funkčního chlívku symbolu na3. Můžeme využívat i zkrácené verze pomocí #': (normalize #'na3 -3). Vyzkoušíme:

> (normalize #'na3 -3)
Error: Undefined function FUN called with arguments (3).

Kde se stala chyba teď? Pokud předáme nějaký argument, tak se vždy v těle funkce uloží jako hodnota. Funkci normalize jsme sice předali jako argument funkci, ale ona se – mrcha – uložila jako hodnota. Takže v těle funkce nemá symbol fun navázanou žádnou funkci, ale má v hodnotovém chlívku navázanou funkci. Jenže to Lisp neví a snaží se vyhodnotit funkční chlívek, který je prázdný. Proto ještě v těle funkce potřebujeme Lispu říci, že má sice brát tento symbol jako funkci, ale že má tu funkci hledat v hodnotové vazbě. K tomu slouží funcall:

(defun normalize (fun num)
  (funcall fun (abs num)))

funcall způsobí přesně to, co chceme. Spustí funkcí, která je uložená v hodnotě. Nyní už vše poběží jak má:

> (normalize #'na3 -3)
27
> (normalize #'na3 8)
512

Lisp II: Úvod do jazyka

To je první věc, kterou si musíte uvědomit, pokud chcete programovat v Lispu.

Systém vyhodnocování

Lisp pracuje se symbolickými výrazy. Nejjednodušší symbolický výraz Lispu je atom. Atom může být buď číslo, nebo symbol. Pomocí symbolů a čísel můžeme poté skládat složitější výrazy, například seznamy. Seznam se skládá z dalších symbolických výrazů, takže může klidně obsahovat další seznamy. Pro tuto chvíli nám bude stačit vědět, že seznam se skládá ze symbolických výrazů a je ohraničem závorkami. Příklad seznamu: (1 2 a (b c)). Toto je čtyřprvkový seznam (obsahuje dvě čísla, jeden symobl a jeden dvouprvkový seznam).

Čísla se vyhodnocují sama na sebe. Tedy když do posluchače napíšete číslo, Lisp vám vrátí totéž číslo. Zkuste si to. Docela exoticky působí možnost zapisovat zlomky přímo ve tvaru zlomku. Pokud chcete napsat jednu polovinu, napíšete zkrátka 1/2. Systém to pochopí jako zlomek a bude s ním tak pracovat. Například pokud k tomuto zlomku přičtete jedničku, Lisp vám nevrátí 1,5, ale vrátí vám skutečně 3/2.

Symboly představují proměnné, jak je známe z ostatních jazyků. Lisp nerozlišuje symboly pro funkce a symboly pro proměnné, takže symbol karkulka může být stejně tak „proměnná“ jako funkce. S vyhodnocováním symbolů je už to krapet složitější, protože jejich vyhodnocení závisí na tom, kde zrovna ten symbol použijeme. Obecně mohou nastat dva případy: na symbol není navázaná žádná hodnota, potom Lisp při pokusu o vyhodnocení vrátí chybu. V opačném případě se snaží symbol vyhodnotit na jeho vazbu.

CL-USER 23 > a
Error: The variable A is unbound.

Proměnnou a jsme zkrátka nenavázali, tak ji nemůžeme vyhodnocovat. Něco jiného je, když ji navážeme na nějakou hodnotu. To můžeme udělat nehezky pomocí makra setf:

CL-USER 24 : 1 > (setf a 10)
10

CL-USER 25 : 1 > a
10

Vidíme, že po navázání čísla deset na symbol a a následném vyhodnocení symbolu a již Lisp neháže chybu. Teď ale nastává drobný problém, protože v Lispu má každý symbol dva chlívečky, kam můžete něco uložit. Jeden chlíveček je „hodnotový“ a druhý „funkční“. Hodnotový slouží k ukládání hodnot, zato funkční pro ukládání funkcí. Před chvílí jsme uložili desítku do hodnotového chlívečku, proto můžete vzápětí provést toto:

CL-USER 26 : 1 > (defun a()5)
A

Tímto jsme do funkční části uložili primitivní funkci, která pouze vrátí číslo pět. Symbol a zavoláme prostým napsáním a, funkci a zavoláme takto: (a).

CL-USER 27 : 1 > a
10

CL-USER 28 : 1 > (a)
5

K čemu to je dobré? Je to primárně proto, abyste si mohli pojmenovat třeba argumenty funkcí jak chcete. V Lispu existuje vestavěná funkce list, kterou nelze přepsat. Pokud by nebyly k dispozici dva chlívečky, již byste symbol list nemohli použít jinak než jako funkci. Takhle si můžete klidně zvolit list jako název argumentu nějaké funkce. Systém, kdy se veme funkce a kdy hodnota, je trochu složitější a budeme se jím zabývat později.

Prefixová notace

První věc, která vás zaskočí, je, že Lisp používá prefixovou notaci, namísto klasické infixové. Co to znamená? Že veškeré operátory se umisťují před samotné operandy. Například součet trojky a sedmičky byste v klasickém jazyce zapsali jako 3 + 7. V Lispu by to bylo + 3 7, přesněji (+ 3 7). V Lispu pracujeme se seznamy a pokud chceme vyhodnotit složitější výraz, musí být v seznamu. Prefixová notace má mnoho výhod:

  • Jednodušeji se píše parser, protože ten hned na začátku ví, co se s čím bude dělat. Stejně tak to vždy víte vy. Stačí se kouknout na první prvek seznamu a přesně víte, jaká operace bude probíhat.
  • Díky prefixové notaci musíte také správně uzávorkovávat, protože jinak by vznikl neplatný výraz: výraz (+ 3 * 5 2) se pravděpodobně nevyhodnotí tak, jak byste očekávali; musíte ho zapsat správně do seznamů: (+ 3 (* 5 2)).
  • Jednotnost jak u funkcí, tak u operátorů. Stejně jako je na začátku seznamu operátor, je vždy na začátku seznamu i funkce.
  • Možnost použití více operandů zároveň. Konkrétně u sčítání můžete sčítat více čísel zároveň, ne pouze dvě: (+ 1 2 3 4). V jiném jazyce by se tohle zapsalo jako 1 + 2 + 3 + 4.

Nevýhoda prefixového zápisu je zřejmá – je to nezvyk a v počátcích to může programátora docela mást. Obzvláště blbě vypadají porovnávací operátory: (< 5 10). V běžném jazyku by se napsalo čitelnější 5 < 10.

Ještě se trochu blíže podíváme na základní operátory. Použití by již mělo být vcelku jasné. Například (- 10 5) odečte pětku od desítky (ekvivalentní matematický zápis: 10 - 5). Stejně jako plus, i minus bere více argumentů: (- 15 10 2 3) ⇒ vrátí nulu (ekvivalentní matematický zápis: 15 - 10 - 2 - 3). Podobně u násobení a dělení:

CL-USER 2 > (* 10 3)
30

CL-USER 3 > (* 3 6 7)
126

CL-USER 4 > (/ 80 5)
16

CL-USER 5 > (/ 80 5 4)
4

Kombinace více operátorů by měla být také zřejmá. Zkrátka místo čísla vložíme seznam s dalším výrazem. (3 + 5) * (9 - 1) * 2 by se zapsalo: (* (+ 3 5) (- 9 1) 2).

Pozor na to, že operátory plus a krát mohou být použity bez argumentu. Lisp poté vrátí nulový prvek, u sčítání nulu a u násobení jedničku. U dělení a odečítání je vždy třeba alespoň jeden argument. V případě, že je právě jeden, vrací Lisp opačnou hodnotu.

CL-USER 13 > (+)
0

CL-USER 14 > (*)
1

CL-USER 15 > (/ 5)
1/5

CL-USER 16 > (- 5)
-5

Na prvním místě seznamu musí být vždy nějaký operátor nebo funkce. Pokud není, Lisp vyhodí chybu, protože neví, co má s takovým seznamem dělat:

CL-USER 29 : 1 > (1 2 3)
Error: Illegal argument in functor position: 1 in (1 2 3).

Zpět k vyhodnocování výrazů

Teď se již můžeme vrátit k vyhodnocování výrazů. Říkali jsme, že v každém symbolu může být uložena funkce a hodnota. Z výše řečeného poměrně jasně plyne, jak se bude Lisp chovat a kdy který chlív zvolí. Pokud se bude symbol vyskytovat na prvním místě seznamu, zvolí funkční chlív, pokud se bude vyskytovat jinde, zvolí se hodnota. Ukázkový příklad:

CL-USER 30 : 2 > (setf fun 10)
10

CL-USER 31 : 2 > (defun fun (cislo)
                   (* cislo 2))
FUN

CL-USER 32 : 2 > (fun fun)
20

Nejprve na symbol fun navážeme hodnotu deset. Potom na symbol fun navážeme funkci, která vrátí dvojnásobek předaného čísla. A následně zavoláme (fun fun). První fun se vyhodnotí jako funkce (je na prvním místě seznamu) a druhý fun se vyhodnotí jako desítka (není na prvním místě).

To by mohlo pro dnešek stačit, příště se podíváme blíže na funkce.

O posouvání významů slov

Hacker. Co si představíte pod pojmem “hacker”? Dost pravděpodobně člověka, který do noci sedí u počítače a láme jeden program za druhým, aby socky nemusely platit za programy. Možná už jste se setkali s názorem, že tohle vlastně hacker není, že toto je cracker. Hacker skutečně není ten, který by lámal programy a vyráběl k nim cracky. A vadí to někomu? Ne, rozumíme si. Ale abyste mohli dělat ještě chytřejšího - původní významu slova hacker je machr na počítač, někdo, kdo ví o systému tolik, že si ho umí sám upravovat, někdo, kdo z hlavy napíše tisíciřádkový program bez jediné chyby. To je hacker v prapůvodním významu. Vadí někomu, že se teď slovo “hacker” používá v (diametrálně) odlišných případech? Kromě pravých hackerů a lidí, kteří akorát chtějí házet machry, to nikomu nevadí.

Zřejmě se nic nestane, když se posune význam nějakého slova. Schválně, jak předchozí větu chápete? Chápete ji ve smyslu “Je jisté, že se nic nestane…”, nebo ji chápete spíš jako “Asi se nic nestane…”? A) je správně. Původní význam slova zřejmě je “jistě” nebo “určitě”. Stačí to slovo trochu pozměnit a máme to: “Je zřejmé, že desítka je sudá.” Zde už je jasné, že slovo “zřejmé” znamená “jisté” nebo “jasné”. Když si ovšem prohlédnete noviny, nenajdete v nich snad žádný případ, kdy by slovo “zřejmě” znamenalo “jasně”, ale vždy se jedná o synonymum pro “asi” nebo “pravděpodobně”. Na původní význam narazíte už jen v matematických definicích.

Opravdu tedy vadí ono posouvání významu slov? Změna významu slov zde probíhala vždy a vždy také probíhat bude. K čemu je dobré upozoroňovat na původní význam slov, když 95 % obyvatelstva stejně bude znát jen ten nesprávný význam? Není lepší se smířit s tím, že čeština je (naštěstí) dynamický jazyk, a že zkrátka občasné změny významu slov budou dít? Jak někdo řekl - pokud jsme zvyklí používat pro něco nějaký termín, který není ve výkladovém slovníku, je chyba ve slovníku, ne v nás. Obzvláště to platí v případech, kdy takto termín používá drtivá většina obyvatelstva. Stejně jako musí informatici přežít, že hacker už není guru ve svém oboru, stejně jako musí matematici přežít, že zřejmě už není jistě, tak skinheadi musí přežít, že pod skinheady si člověk představí všechny holohlavce.

Radši bojujme proti zvratkům jako “Jsem s pozdravem” nebo “Vezměte si místo”, to opravdu v některých lidech vyvolává epileptické záchvaty.

Lisp I: Funkcionální programování a Lispworks

Název Lisp vznikl z „List processing“ (zpracování seznamů), protože v Lispu máte jednu hlavní datovou strukturu, a tou je právě seznam. Lisp nepatří mezi příliš používané programovací jazyky, přesto se s ním občas můžeme setkat i v praxi. Stále se používá v oboru umělé inteligence nebo se s ním píší části AutoCADu. Lisp je ale přesto jeden z nejstarších stále se používajících programovacích jazyků. Nejčastěji se s ním ale přeci jen setkáte na akademické půdě.

Základní rysy funkcionálního programování

Funkcionální programování je nejvíce podobné matematickým funkcím a vzorečkům. Tedy postupné aplikování různých funkcí a operátorů, až se nakonec dopídíme ke konečnému výsledku. Funkcionální programování se vyznačuje také tím, že v něm nenajdete vedlejší efekt. Vedlejší efekt je jakýkoliv postup, který mění vnitřní stav programu; typicky třeba efekt uložení do proměnné, efekt přiřazení. Z jiných programovacích jazyků jistě znáte klasické prom = 10, případně prom := 50. To ve funkcionálním programování nenajdete. Ono to tam obecně ani není třeba, když máte program, kde na sebe postupně nabalujete jednotlivé funkce.

Tím, že ve funcionálním programování neexistuje vedlejší efekt, stávají se programy jednoduššími. Ve funkcích nevstupují do hry žádné další vlivy (například různé globální proměnné), a díky neexistenci cyklů se ani při zpracování seznamu (Lispový ekvivalent pole – o tom potom) nemusí čekat na zpracování předcházejícího prvku, ale mohou se zpracovávat všechny běhy cyklu zároveň (hodí se u vícejádrových procesorů). Jednoduše řečeno ;-).

Dalším hlavním rysem je, že takové jazyky neobsahují cykly. On takový cyklus nemá moc smysl – co chcete v těle cyklu provádět, když vedlejší efekt použít nemůžete? Nemůžete nic do ničeho uložit, nemůžete nic vypsat na obrazovku (to je taky vedlejší efekt) apod. Cykly ztrácejí ve funkcionálním programování význam. Namísto cyklů se tudíž používá rekurze. Rekurze je ve funkcionálním programování dost zásadní pojem, protože veškeré složitější operace se dělají pomocí nich. Stejně jako máte polovinu imperativního programu v nějakých cyklech, tak polovinu funkcionálního kódu zase máte v rekurzi. Jestliže se vám z duše protiví rekurzivní funkce, radši se do funkcionálního programování nepouštějte.

Nutno podotknout, že Lisp jako takový není čistě funkcionální (což už plyne z toho, že je multiparadigmový).

Další informace o funcionálním programování můžete nalézt na wikipedii.

Vývojové prostředí Lispu – Lispworks

Docela zásadní pro vývoj věcí v Lispu je prostředí. Za sebe mohu doporučit LispWorks nebo CLISP. Oba programy jsou multiplatformí, ale minimálně LispWorks za to platí krutou daň v podobě brutálního množství různých nespecifikovaných bugů. S CLIPSem jsem moc nepracoval, takže nemohu soudit. Popíši zde alespoň práci s LispWorks.

Na instalaci Lispworks není nic těžkého, takže rovnou přejdu k prostředí samotnému. Po otevření editoru máte před sebou okno Posluchače (Listener). Posluchač slouží k jednorázovém testování a volání programů. Můžete si snadno vyzkoušet, jak vlastně Lisp funguje, a to bez toho, aniž byste museli psát nějaké hlavičky programu nebo abyste museli program kompilovat. Můžete si vyzkoušet něco jednoduchého, například:

(+ 1 2 3)

Tento příkaz vám vrátí číslo šest. Syntaxi Lispu a příkazy Lispu budeme ale rozebírat později v dalších dílech.

K napsání programu budete potřebovat editor. Tento editor vyvoláte buď požadovanou ikonkou (hned první, ten zohlý list) nebo ho spustíte v Tools → editor. Toto okénko slouží jako editor pro psaní Lispových progamů. Lispworks také obsahují debugger, který se nejsnáze spouští přímo v Posluchači. Zobrazte si okno Posluchače (je to ta modročervená ikonka) a napište nějaký nesmysl. Program vám vyhodí chybu a aktivují se některé ikonky. Mezi nimi je i beruška, což je GUI debugger. Klikněte na ni a uvidíte seznam volaných funkcí s hodnotami parametrů. Trochu blbé je, že vám tam systém předhazuje i různé systémové funkce a systémové proměnné, které vás vůbec nezajímají. Při programování složitějších programů ale debugger užitečný nepochybně je.

Teď si trochu zaprogramujeme, abychom si ukázali další vymoženost, a tou je inspektor. Ten slouží k procházení obsahu proměnných. Inspektor se spíše hodí u OOP, kdy jeden objekt má mnoho různých vlastností apod. Občas se ale hodí i jindy. Vepište do Listeneru tento kód:

(setf prom 10)

Tento kód uloží do proměnné prom desítku. Následním napsáním prom vám LispWorks opravdu desítku vrátí. Zkuste si to. Hned také vyzkoušejte inspektor. Najděte na liště ikonku s mikroskopem a zelenou tečkou a klikněte na ni. Otevře se inspektor, který vám ukáže vše o proměnné prom. Ve funckionálním programování to ale moc nevyužijete, tam přeci vedlejší efekt přiřazení nepoužíváme ;-).

Hello World!

Co by to bylo za úvod do programovacího jazyku, kdyby tady nepadla zmíňka o tom, jak v něm vypsat slavnou větu „Hello World!“. Tak tedy zde je kód, který po vložení do Posluchače vrátí naši větu:

(format t "Hello World!")

Užijte si to, je to na dlouhou dobu poslední příkaz, který vypíše na obrazovku nějaký normální text.

Drobná poznámka na konec

Již jsem se zmínil o chybách v LispWorks. Ale on kromě chyb obsahuje i jiné záludnosti. Pokud budete ladit nějaký program a furt vám to bude vyhazovat nesmyslné chyby, zkuste práci uložit a LispWorks restartovat, ono to někdy pomůže. Nejčastější příčiny takových chyb je, že Lisp jako takový je dynamický jazyk. Když spouštíte nějaký program, systém si zkompiluje celý kód a uloží si všechny funkce. To má výhodu v tom, že nemusíte pokaždé kompilovat celý program, ale stačí klidně zkompilovat jen jednu funkci. Horší je to ale v případě, kdy vymažete z kódu nějakou funkci, ale ona vlastně zůstane v paměti a furt vám tam něco kazí. Pak se můžete furt rozčilovat, proč to háže tutéž chybu, když jste tu funkci odstranili, ale vy jste ji vlastně neodstranili ;-). Můžete buď funkci oddefinovat ručně nebo zrestarovat celé LispWorks. V různých případech bývají oba způsoby různě efektivní.

Zajímavost na konec: Online interpret Lispu ve Flashi.

Vypalujete ještě někdo?

Používáte ještě někdo vypalovačku? Používáte vůbec ještě CDéčka či DVDéčka?


Marně vzpomínám, kdy jsem naposledy něco vypaloval. Co mám nový počítač, tak určitě ne. Takže někdy ještě u starého počítače, kdy jsem měl “jen” 160GB disk, na který se mi už přestávaly vlézt přibývající série Star Treku. Tehdy jsem si vypálil pár sérií na DVD. To jsou poslední vypálená DVD, na které si vzpomínám. Kdy jsem si vysoustružil vlastní CD už si opravdu ani nepamatuji.

Když to tak vemu, já ani nevím, kdy jsem naposledy nějaké optické médium použil. Občas se ke mně dostane filmové DVD, ale většinou si to sám stáhnu z netu. Když reinstaluji počítač, nahrávám ovladače z přiloženého CD. Na další použití těchto disků si už opět nevzpomínám.

Ono se není čemu divit. V dnešní době není problém stáhnout z internetu desítky gigabajtů dat týdně. Skladovat to na CD je nemyslitelné, to byste pro ně museli vyčlenit celý sklep. DVD už jsou o trochu lepší. Ale kdybych měl všechna svá současná data na disku vypálit na DVD, musel bych si jich pořídit skoro sto. A nemám vůbec žádnou představu, kam bych je dal. Nový formát Blu-ray má kapacitu 25 GB. Respektive 50 GB u dvouvrstvého média. No, těch padesát giga je ještě použitelných, ale s dvaceti pěti už tohle médium jednoduše zaspalo dobu. Než se Blu-ray dostane do oběhu stejně jako DVD nebo CD, tak i Flash disk za stovku bude mít větší kapacitu než Blu-ray placka. Pro ilustraci se koukněte na ceny Flash disků: 16GB Flash disk za tisícovku. DVD ještě nastoupilo včas a ujalo se, u Blu-ray toto neočekávám.

Data zkrátka patří na pevný disk. Přestože cena DVD koleček se už drží pod deseti korunami, vyplatí se spíše pořízení nového pevného disku. Například 640GB disk dnes můžete pořídit za dva tisíce. Pokud si pořídíte externí disk, můžete ho i různě připojovat. Náš DVD přehrávač má i USB výstup, takže klidně k němu můžu připojit externí USB disk a kochat se 640 GB seriálů. Tedy kdybych ho měl, prozatím se jenom chystám nějaký disk koupit.

Takže na co se CD/DVD hodí? Na dlouhodobé uchování dat ne; na to je pevný disk (ten má větší pravděpodobnost, že se nějak nepokazí, ale zase když už se pokazí, tak přijdete o hafo víc dat :-)). Na přechodné přenášení dat ne; na to se hodí 16GB Flashka za tisícovku (nějaké menší seženete za tři stovky, možná i méně). Na přehrávání v DVD přehrávači - pokud nemáte USB výstup, tak ano, jinak ne. Na filmy DVD formátu v časopisech - je pravda, že stahovat z internetu film v DVD formátu je trochu opruz, protože takový film má třeba čtyři giga a to už se stahuje blbě a dlouho, a hlavně byste místo toho mohli mít tak šest filmů v avi kvalitě :-). Takový film se vyplatí koupit v nějakém časopisu, když tam zrovna je. Tam se DVD hodí. Ještě to má smysl pálit/koupit kvůli nějaké hifi věže nebo do auta. I když i tam už by se snad mohlo dát USB (nevím, nemám představu, jak to je; náš CD přehrávač v autě bohužel ani nezvládá MP3). Jinak opravdu nevím, kde by se tato média ještě mohla uplatnit. Pokud bych pořádal nějakou konferenci a chtěl dát účastníkům nějaká data, tak samozřejmě zvolím CD/DVD. Ale kromě akcí tohoto typu mě už vážně nenapadá smysluplné využití CD/DVD. Pevné disky a Flash disky jsou v 99 % daleko výhodnější.

Zase jeden úspěch

Zase tak ohromný ne, ale přeci se musím pochlubit :-). Matematika Polopatě se umístila na celkovém desátém místě ve “specializované soutěži pro webdesignéry z České a Slovenské republiky” - Interzen. Zajímavější je ovšem čtvrté místo v kategorii uživatelský přínos. Akorát je škoda, že zrovna letošní ročník dopadl z hlediska organizace tak katastrofálně, výsledky byly zveřejněny snad o dva měsíce později a slavnostní vyhlášení všech webů včetně vítězů kategorií se odbylo asi za půl minuty :-(.

No co, nenecháme si tím kazit radost a jdeme oslavovat. Jablečný džus poteče proudem a skriptum z algoritmiky budiž otevřeno celý den!

Nejvíc nejlepšejší věc

Před nedávnem mi domů dorazila úplně ta nejvíc nejlepšejší věc, jakou vůbec může člověk mít. Není to dvoumetrový živý had ani kapela ze samejch punkáčů. Je to něco ještě víc božího. Éla hop, je to tohle.

Ano! Magnetická tabule! Není to skvělé? Je to skvělé! Zatím ještě nevisí na stěně, to přijde na řadu někdy o víkendu, ale i tak je to luxusní. Učím se zrovna na algoritmiku binární vyhledávací stromy a na tu tabuli se úplně krásně píše a prohazuje. Prostě papír je pro loosery, machři mají doma magnetickou tabuli, to je jasné ;-). Velikost je 120 x 90 a stála mě asi 1800. Původně to tedy bylo na efektivní návrhy programů, jejichž nákres se již nevejde na papír, ale k tomu jsem se ještě nedostal.

Jen se mi to docela nechce dávat na tu stěnu, protože když je to jenom opřené na zemi, tak si k tomu můžu sednout a psát v sedě, což je hafo dobré. A taky se na tom dají promítat filmy. Ne že bych měl promítačku, ale stejně!

Zahrajte si moji hru!

Timy vytvořil svou první snad-skoro-úplně-funkční hru!


Radujte se, otevírejte šampaňské, nekuřte cigarety! Tak a teď krátce ke hře. Jedná se o hru, která už se asi nějak jmenuje, zahlédl jsem ji kdysi v Ubuntu. Teď v nové verzi Ubuntu je taky, ale má už jiná pravidla. Já jsem tu hru pojmenoval Reverse!. Hra se hraje na jakési šachovnici. Každé kolo můžete položit jeden kámen, ovšem tento kámen musí ležet poblíž vašeho jiného kamene, konkrétně maximálně dvě políčka od jakéhokoliv vašeho kamene. Z tohoto důvodu máte na startu hry jeden kámen již položený.

Druhé pravidlo je také poměrně jednoduché - pokud svůj kámen umístíte přímo vedle soupeřova kamene, tento soupeřův kámen bude zkonvertován na váš kámen. Hra končí poměrně intuitivně když nějakému hráči dojdou kameny nebo když je hrací deska zaplněna (kdo má víc kamenů vyhrál) nebo když už se některý z hráčů nemůže hýbat.

Hra je napsána v C#, za použití Visual Studia. Snad jsem odladil všechno, co odlazeno být má. Grafika je samozřejmě pouze systémová, takže trochu hnusná, ale to snad u této hry nijak nevadí. Inteligenci počítače jsem nijak extra nehrotil - pokud nemůže zajmout žádný váš kámen, jede náhodně. Pokud může zajmout váš kámen, hraje tak, ať jich zajme co nejvíc. Známá “chyba” je, že není zvýrazněn tah počítače, pouze dole ve stavovém řádku se napíší souřadnice jeho tahu.

K dispozici je exe soubor, který není třeba instalovat, ale kdyby vás to moc zaujalo, můžete si tu hru i nainstalovat (není aktualizovaný, stahujte spíš jen obyčejný exe soubor). Program pak bude k nalezení mezi ostatními programy, nebude to jen kus plivance někde na disku :-). Jen pozor, vytvářel jsem to na Vistě ve Visual Studiu 2008, takže si asi budete muset nainstalovat .NET 3.5 framework, nejste-li na Vistě. Což se vám asi kvůli téhle pidihře nebude chtít dělat, ale co už. Jestli chcete hrát pořádné hry, musíte mít pořádný systém :-P.

O legálních programech


Podle nějakých statistik, které jsem viděl, je u nás skoro třetina Windows nainstalována a používána nelegálně. To je u nás každý třetí uživatel počítače zloděj? Doufám, že ne a že alespoň velká část z těchto lidí používá nelegální Windows nevědomky.

Když nedávno běžela na Nově reportáž o tom, jak Microsoft chystá štvanici proti takovýmto uživatelům (mimochodem mimořádně hloupá a amatérská reportáž), byl na konci nějaký studentík, který říkal něco v tomto duchu: “Já jsem chudý studentík a tak si legální Windows nemohu dovolit.” Zní to logicky, že jo? Chudý studentík, který nepoužívá svůj počítač ke komerčním účelům, používá ho jen ke studiu a stahování porna, přece nebude platit za operační systém.

Teď ale vyvstává zajímavá otázka: Kde vzal chudý studentík dvacet tisíc na počítač, když si nemůže dovolit zaplatit necelé dva tisíce za operační systém? Dvacet tisíc za počítač je pro chudého studenta pakatel, ale dva tisíce jsou velké peníze, které si nemůže dovolit? Možná jsem nedával pozor v matematice, ale u nás v Opavě je dvacet tisíc více než dva tisíce. Ale je možné, že ten studentík studoval nějakou školu v jiném časoprostoru…

Takže opravdu jsou Windows tak drahé? Cena základních verzí se pohybuje pod dvěma tisíci, to opravdu není v dnešní době nějaká převratná suma, kterou by člověk nemohl zaplatit. Obzvláště, když si uvědomíte, že počítač dost lidí používá každý den, někteří blázni i několik hodin denně. Nový operační systém se obvykle pořizuje až s novým počítačem, takže dokud nevyměníte počítač, budete používat ten OS, který jste si koupili. Za dva tisíce si tedy koupíte věc, kterou budete možná používat denně o dobu několik let. To není špatná koupě, ne?

Nejsměšnější je poslouchat výmluvy, které ti piráti používají. Docela oblíbená je ta storka o tom, že nebudou podporovat ten hnusný a škaredý monopolní Microsoft. Hmm. Jestli někdo nechce podporovat Microsoft, tak ať prosím nepoužívá jejich programy. Pokud někdo háže silácké řeči, že nebude platit molochovi jako je Microsoft a zároveň používá jejich programy, je to velice ješitné. Kdyby se těch řekněme 15 % uživatelů, kteří nechtějí podporovat Microsoft, spojilo a přestalo používat jejich operační systém, byla by teprve pro Microsoft rána. Takhle to není nic jiného než výmluva, která má zastřešit normální pirátění.

A co ostatní programy? Od jednoho človíčka jsem slyšel, že je přece nehoráznost chtít za Photoshop třicet tisíc korun. To že on přece nikdy platit nebude. Když jsem se ho zeptal, na co on potřebuje tento grafický nástroj, vypadlo z něj, že občas ořeže obrázek a přidá tomu nějaký rám nebo okraj… Otázka za tři body: Opravdu tento člověk potřebuje prakticky nejlepší grafický program určený pro profesionální grafiky? Ne, samozřejmě, že nepotřebuje. Existuje plno grafických editorů, které jsou zdarma, a které zvládnou to, co amatér běžně potřebuje. Proč si tito lidé nepořídí tyto grafické editory a místo toho stahují a crackují profesionální Photoshop za třicet tisíc? Asi by jinak nebyli dostatečně “in” a “cool”. Photoshop je určen opravdovým grafikům, kteří se grafikou živí. A pro ně tento nástroj vážně není drahý - pořádný grafik si na Photoshop vydělá třeba za měsíc :-).

A podobně se dá pokračovat pro prakticky jakýkoliv program. Samozřejmě něco jiného je u programů, které používáte ke komerčním účelům. Jestli někdo používá program k výdělečným účelům a používá ho nelegálně, tak to už je dosti sockoidní, že jo… Chápu, že někdy je situace trochu krkolomná, některé programy se u nás prodávají o polovinu dráž, než za jakou cenu byste je koupili v zahraničí. V některých případech lze tento program zakoupit přímo u výrobce, ale u některých prostě musíte zvolit českého distributora. Občas jsou také problémy s licencí - pokud si koupím nějaký program, očekávám, že si ho můžu nahrát jak na počítač tak i na notebook. Některé programy to ale nedovolují. Naštěstí (kromě OEM licence Windows) žádný takový program nemám. Všechny programy, které jsem si koupil, jsem si mohl nainstalovat na oba počítače. Některé licence jsou zase natolik výhodné, že máte doživotní přístup ke všem novým verzím programů. Takovouto licenci má například Total Commnander, oblíbený správce souborů. Takže když si zakoupíte TC, kdykoliv vyjde nová verze, můžete si ji legálně stáhnout a nainstalovat.

Zkrátka mít na počítači všechno legální není vůbec žádný problém. Buď můžete na internetu najít nějakou free alternativu nebo zkrátka zaplatíte těch pár stovek/tisícovek. V zásadě lze říci, že kromě Windows můžete mít všechno na počítači zdarma a legálně, bez nutností crackování programů či přepisování sériových čísel. A pokud nechcete platit ani za Windows, můžete si nainstalovat Linux. Možnosti vždy existují.

Copak je to za hudba?

Je na tom nadpisu něco divného?


To jsme tuhle seděli s informatikama v hospodě, pili jsme borovičky na účet podniku a já pronesl větu “Copak je to za hudba?”. Všichni se na mě koukali jako Paroubek na kozy Kováčové a pak se mi hafo vysmáli. A já teď nevím, jestli jsem blb nebo jestli je to prostě naše nářečí.

Správně je samozDDDřejmě “Copak je to za hudbu?”. Jeden informatik dokonce ke mně pronesl “Co jsi to za člověk?”. Takže pro všechny češtináře ze Slezska a blízkého okolí - je to vlivem nářečí nebo jsem blb?

A protože jste beztak všichni čekali, že tady bude nějaký hudební klip, tak sem něco hodím.

Proč bych si nikdy nekoupil DVD


Nejprve uvedu důvody, proč bych si já osobně nekoupil filmové DVD:

V prvé řadě jde samozřejmě o peníze, o co jiného. Ukážu to na velmi podobném příkladu. Jsem zastáncem legálního software, tedy veškeré programy, které používám, jsou buď free (zdarma), nebo legálně zakoupené za mé vlastní peníze. Nečiní mi problém koupit si za své peníze program, který často používám a vím, že ho zkrátka využiji. Kupříkladu Windows stojí dva a půl tisíce, což je ekvivalentní částka vzhledem k tomu, že tento program používám řekněme pět, šest hodin denně po dobu zhruba tří, čtyř let. Za dva tisíce dostanu něco, co budu užívat každý den a co mi bude čtyři roky usnadňovat práci.

Teď se vraťme k DVD. Většina těch lepších či novějších filmů na DVD stojí kolem tří, čtyř stovek. Za čtyři stovky dostanu DVD, které si pustím a… To je všechno. Koupím si to, zhlédnu to, hodím někam na poličku a další tři roky mi tam to DVD bude hnít. Nevím jak ostatní, ale já většinou nemám potřebu vidět nějaký film v brzké době více než jednou. Po zhlédnutí filmu už pro mě zkrátka to DVD má minimální hodnotu. Navíc vzhledem k tomu, že mám malý pokojík, mělo by brzy zápornou hodnotu, protože by mi v pokojíku zavazelo.

Pokud srovnám využitelnost Windows, které používám tisíce hodin, a využitelnost DVD, které “využívám” dvě hodiny, je cena za DVD extrémně nevýhodná.

Teď si srovnáme cenu za DVD a cenu za kino. Běžný lístek za návštěvu kina stojí přibližně stovku. Za sto korun si tedy můžu prohlédnout nějakou žhavou novinku v daleko luxusnějším prostředí než je můj obývák. Zvuk bývá v kině zpravidla lepší (pokud nejdete do nějakého vesnického kina…) , atmosféra také. Obzvláště u komedií je dobré, když se spolu s vámi směje celé kino. Navíc v kině nehrozí, že vás někdo vyruší. Když se na film koukám doma a někdo mi zavolá, pauznu film a vykecávám se. Z filmu tak mám velký kulový. V kině bych na nějaký mobil kašlal. Samozřejmě lze nezvednout mobil ani doma, ale to se asi běžně nedělá. Zkrátka kino je pro mě mnohem lepší - větší plátno, lepší atmosféra, nic mě neruší (akorát nesmíte narazit na partu blbečků, kteří mají potřebu si zrovna v kině sdělovat nové zážitky). Kdybych si měl vybrat, jestli dát sto korun za kino nebo sto korun za DVD, tak si vyberu kino. Pohodlí obýváku obětuji.

Další věcí je prostor, jak už jsem říkal. Mám malý pokojík a filmová DVD se obvykle prodávají v takových těch velkých zbytečných obalech. Nechápal jsem to kdysi a nechápu to doteď. Mám plný pokojík CD a DVD v tenkých “slim” obalech. Představa, že bych tam měl ještě skladovat třeba dvacet těch velkých DVD obalů je děsivá. Nemám představu, kam bych to dával.

Dále mě štve už samotný formát DVD. Jsou tam samé kraviny o tom, že to nesmíte kopírovat, občas tam je dokonce i reklama na jiný film (bylo to DVD z nějakého časopisu) a snad na každém je takové to minutové stupidní video, které musíte přetrpět, než se dostanete k menu. U těch blbějších DVD si ještě musíte nastavit český jazyk nebo alespoň titulky. Taky se mi několikrát stalo, že jsem dal hned “play” a hrálo mi to jenom anglicky, bez titulků. Skvělé.

Nejsem si také jistý, jak je to s pořizováním kopií legálních DVD. Poškrábat DVD není zase takový problém a pokud nemáte zálohu, tak jste přišli o čtyři stovky.

Jaká je tedy výhoda DVD? Já vidím jediné dvě výhody - můžu se na ten film kouknout vícekrát, třeba další návštěva kina stojí další peníze. Ale opravdu nevím, kdy jsem se na nějaký film koukal více než jednou, pokud mezitím neuběhly třeba dva roky. A to už to většinou bývá v televizi, netřeba ani DVD. Jediná skutečná výhoda pro mě tedy je, že se na to za jedny peníze může dívat více lidí. Takže pokud se na nějaký film nechce koukat celá rodina, alespoň pět lidí, tak je pro mě obchod s DVD naprosté tabu. A pokud se tak podívám na svou rodinu, nenapadá mě žádný film, který by chtěli vidět všichni tak moc, že by nechtěli počkat, než to bude v televizi.

A jak to řešit? Je několik možností. Kupovat DVD s časopisy. Ale co se na ně občas kouknu, tak to většinou bývá nějaký starší film. Další možnost je samozřejmě televize. Stačí počkat tak dva roky a v sobotu v osm hodin tam ten film najdete. Nejjednodušší možnost je stáhnout film z internetu. Což je ovšem takové všelijaké. Samotné stahování hudby a filmů nelegální není, to už se řešilo hodněkrát. Nesmíte je pouze šířit. Výhody jsou zcela zřejmé: cena je minimální, většinou to stojí jen standardní připojení za internet. Větší stahovači už si pořizují premium účty na servery, kde se filmy sdílí apod. Filmy si můžete stáhnout i v jiném formátu než DVD. Rozhodně bych dal přednost třeba avi formátu, který je asi šestkrát menší a navíc tam není nic jiného než film. Prostě si to pustíte a film vám hraje. Žádné čekání na menu a podobné blbosti. Kvalita není o moc horší (samozřejmě kvalita DVD je lepší, ale mně osobně se nezdá, že by ten rozdíl byl markantní), zvukové stopy jdou přepínat taky, i když složitěji. Titulky si můžete zapnout či vypnout také. Doma máme DVD, které tyto formáty umí v pohodě přehrát. A vzhledem k tomu, že ten přehrávač má i USB výstup, nepotřebuji ani film na CD/DVD, stačí ho přenést na Flash disku.

Opravdu mi nečiní problém platit za věci, které potřebuji či využiji. Nedělá mi problém platit za “fiktivní” věci, jako jsou právě programy - tam obvykle nedostane nic, než sériové číslo, nic hmotného většinou nedostane (samozřejmě si ale můžete instalační CD programu poslat, ale v době internetu je to zbytečné), což je pro někoho takové “divné”. Ale film na DVD má pro mě zkrátka hodnotu tak padesáti korun… Ideálněji tak třicet korun, když si to můžu stáhnout z internetu bez DVD nosiče. Do té doby budu radši chodit do kina nebo se koukat na televizi.

Tak, to jsou mé důvody, proč bych si já osobně film na DVD nekoupil.

OOP teoreticky: Třídy a objekty

Zůstaneme u Bodu. Představte si, že máte objekt Bod. Otázka zní – kolik bodů můžeme v programu mít? V zásadě můžeme otázku redukovat na: Potřebujeme více instancí různých Bodů nebo si vystačíme vždy s jedním? Samozřejmě jich potřebujeme více, třeba takový čtverec je tvořen čtyřmi vrcholy, které bychom jistě rádi reprezentovali Body. Takže potřebujeme nějaký mechanismus, který by nám umožnil nadefinovat si, jak má Bod vypadat a následně vytvářet mnoho různých instancí Bodů. Přesně k tomu slouží Třídy a Objekty.

Třída je pouze abstraktní předpis pro to, jak by měl vypadat vzniklý objekt. Ve třídě definujeme, jak má objekt vypadat a objekt samotný je už pak konkrétní instance dané třídy. Zůstaneme u bodu. Pokud řekneme, že Bod je obecně dvojice hodnot X a Y, pak mluvíme o třídě. Pokud teď zrovna budeme chtít pracovat s konkrétním Bodem [1, 5], mluvíme o objektu. Objekt je tedy živá struktura, která byla vytvořena podle vzoru z dané třídy. Asi jako když máte v kuchařce návod na houbovou omáčku (to je třída) a vy pak podle ni uděláte oběd (to je objekt). Chce to kód. Ukázka bude v C#:

1
2
3
4
5
class Bod
{
public int X;
public int Y;
}

Probereme si, co výše uvedeným kódem vytvoříme. Pomocí klíčového slova class jsme si nadefinovali novou třídu. Tuto třídu jsme pojmenovali Bod a přiřadili jsme k ní dvě proměnné, které reprezentují souřadnice. Tak jak jsme si říkali nahoře. Klíčové slovo int by mělo být jasné, klíčového slova public si prozatím nevšímejte. Předpis pro bod bychom měli, ale potřebovali bychom ještě ten Bod nějak vytvořit. To provedeme za pomoci klíčového slova new. V jiných programovacích jazycích to možná bude jiné, ale ve většině se toto klíčové slovo používá. Vyzkoušíme:

1
2
3
4
5
public static void Main()
{
Bod bod1 = new Bod();
Bod bod2 = new Bod();
}

Všimněte si, že jsme vytvořili dvě instance třídy Bod. Každá z těchto instancí, bod1 i bod2, ukazují na jiný paměťový blok, nejedná se o stejné proměnné, jsou pouze stejného typu. Asi jako když deklarujete dva Stringy. My víme, že třída Bod má předpis pro hodnoty X a Y. Pomocí tečkové notace (v C#, jinde může být syntaxe jiná, PHP třeba používá operátor –>) se pokusíme těmto proměnným přiřadit hodnotu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void Main()
{
Bod bod1 = new Bod();
Bod bod2 = new Bod();
bod1.X = 10;
bod1.Y = 25;
bod2.X = 50;
bod2.Y = -10;

Console.WriteLine("Bod1: [{0}, {1}]", bod1.X, bod1.Y);
Console.WriteLine("Bod2: [{0}, {1}]", bod2.X, bod2.Y);
Console.Read();

/*
* Program vypíše:
* Bod1: [10, 25]
* Bod2: [50, -10]
*/
}

Jak vidíte, skutečně jsme vytvořili dvě různé instance třídy Bod, do kterých můžeme ukládat různé hodnoty. To je docela hezké, ne? Takže třída představuje jakýsi předpis pro datový typ proměnné, objekt představuje konkrétní proměnnou, která vznikne z třídy.

Spamování České spořitelny


Na hodně webech jsem četl názor, ať už si ta Česká spořitelna strčí ty svoje dementní emaily do zadnice. Jenže on je problém v tom, že Česká spořitelna žádné emaily nerozesílá, a tudíž si je nemá kam strkat. Pro neznalé věci - před nedávnem se u nás začala šířit vlna emailů, ve kterých naleznete nějaký přiblbý text a následně odkaz na cizí stránky, kde máte zadat své platební údaje. Tyto údaje jsou pak odeslány vychcánkům a ti vám hned vybrakují účet. Trochu odborněji se tomu říká phishing, česky snad rhybaření.

Samozřejmě, že se ti zmetci snaží vše zamaskovat tak, aby to vypadalo, že se jedná o skutečný email a skutečný web od České spořitelny. Proto je v těle emailu odkaz na http://www.csas.cz/neco, který ovšem nevede na adresu, kterou vidíte, ale vede někam úplně jinam. Text odkazu a cíl odkazu zkrátka nemusí být totožný. Další věc je pak tamější web, který obvykle vypadá na chlup stejně jako originál. Pokud se spamer snaží, tak dokonce zaregistruje i podobnou doménu. Nabízí se třeba doména www.csas.cc. Zkuste si pak včimnout toho jednoho rozdílného písmenka…

Důležitý je ale samotný email, ve kterém donutíte čtenáře kliknout na tento odkaz. Text emailu musí být laděn do nějaké oficiální zprávy České spořitelny. Třeba, že mají problém s daty, že měli nějaké výpadky proudu a všichni uživatelé musí pro jistotu projít ověřením účtu. Musí to vypadat alespoň trochu důvěryhodně (samozřejmě důvěryhodně pro laika, který tomu vůbec nerozumí). Tady měla Česká pojišťovna štěstí, protože ti, kdo ty emaily rozesílali, nechali strojově do češtiny přeložit nějaký cizí text, takže z toho vznikla slátanina, které nikdo nemohl uvěřit - třeba začátek těch emailů byl: “drahoušek zákazník”.

Poslední problém je adresa schránky, odkud byl email odeslán. Pokud by byl email odeslán z franta@seznam.cz, asi by to moc úspěšné nebylo. Ideální by bylo, kdyby byla adresa emailu shodná s oficiální adresou České spořitelny. Jenže to asi nebude tak jednoduché, že? Právě že je… Email je co se týče bezpečnosti naprosto katastrofální. Pro člověka, který má i naprosto minimální znalosti nějakého webové programovacího jazyka, není problém napsat program, který bude rozesílat emaily s libovolným odesílatelem. Zvládl by to můj patnáctiletý bratranec (bez nadsázky).

Zkrátka pokud si usmyslím, že chci někomu “poslat email od Paroubka”, není to žádný problém. Napíšu si na to jednoduchý (opravdu jednoduchý) program, do kolonky “odesílatel” vepíšu “jirka@paroubek.cz“ a mému kamarádovi zkrátka dojde email od Paroubka (v kolonce odesílatel prostě bude “jirka@paroubek.cz“). Jakožto laik prakticky nemá šanci zjistit, jestli to poslal Paroubek nebo ne. Z toho tedy vyplývá, že ačkoliv je v hlavičce emailu uveden odesílatel csas.cz, Česká spořitelna to opravdu neposílala.

Nejhorší je, že tihleti zmrdi ani nepotřebují vlastní servery, ze kterých by ty emaily rozesílali. Stačí jim hacknout nějaký web, umístit na něj svůj program na rozesílání emailů a než na to majitel serveru stačí přijít, rozešle třeba několik tisíc emailů. Klidně i víc. Docela dobrý job. Pokud se to udělá pořádně (“správná” emailová adresa, důvěryhodný text emailu, vhodně napodobená doména, identický design, …), věřím, že se může úspěšnost pohybovat již v řádu procentech, což v konečném počtu udělá slušný balík.

Třeba pokud bych rozeslal email jednomu milionu lidí, z toho by účet u mé banky mělo sto tisíc lidí a jen jedno procento se nechalo nachytat, mám údaje od tisíců lidí. Slušný, ne?

Teď ještě krátce k internetovému bankovnictví. Musíme totiž rozlišovat v zásadě dva druhy plateb (asi, v tomhle se nevyznám). Jedna je klasické internetové bankovnictví, ve kterém si vyřizujete příkazy k úhradě, inkasa a podobně. Potom můžete přes internet platit kreditkou (ze stejného účtu). V případě internetového bankovnictví obvykle problém není, protože ten je jištěn více způsoby než jen heslem. Já ho mám třeba jištěného ještě přes SMS. Zkrátky kdyby někdo znal mé heslo, stejně si nepomůže, protože jakoukoliv transakci musím schválit přes mobil. Musel by mi tedy ještě ukrást mobil nebo alespoň změnit číslo, na které se bude SMS odesílat. To se přiznám, že nevím, jak je jištěno - buď to zase musím potvrdit na svém mobilu nebo se to musí vyřídit přímo v bance.

Jenže horší jsou ty kreditky. Pokud platíte přes internet formou kreditní karty, žádné hrubší ověření vás nečeká. Potřebujete znát akorát číslo kreditky, CVC kód a datum expirace, přičemž CVC kód není někdy nezbytný a datum expirace se přinejhorší dá uhádnout, možností je málo. Žádné další ověření formou SMS není, takže pokud z vás ten prevít vytáhne číslo kreditky, máte po účtě a zbývá vám už jen možnost vytáhnout ty peníze zpátky od banky. S tím zkušenosti nemám a zajímalo by mě, jak by ta banka postupovala.

Rozhodně tedy platí, že žádná normální banka po vás nebude chtít ověření hesla a už vůbec vás o to nebude žádat emailem a pravděpodobně by to ani nedělala přes internet.

Těžký život typografa aneb typografické minimum


Když jsem začal více psát na internet, rozhodl jsem se, že by nebylo od věci zjistit si něco o tom našem rodném jazyku, a také že by bylo vhodné se seznámit s pravidly publikování – s typografií. O češtině teď moc psát nechci; naučit se česky není nijak jednoduché, takže se budu zabývat jen typografií.

Myslím si, že každý kdo publikuje nějaké texty by měl znát alespoň základní typografická pravidla. Víte třeba o tom, že na standardní (ne standartní – standarta je vlajka) klávesnici nemáte pomlčku? Dokonce ani minus tam nenajdete. Nadiktuje-li vám někdo internetou adresu ve tvaru vé vé vé tečka moje pomlčka stránka tečka cé zet, řekl vám ve skutečnosti nesmyslnou, ba dokonce neplatnou adresu. Naštěstí (v tomto případě) na klávesnici žádnou pomlčku nemáte, takže adresu přepíšete správně. A v čem že je ten problém?

Na běžné klávesnici není pomlčka, nýbrž spojovník. To co většina lidí považuje za pomlčku je prostě zcela jiný znak se zcela jiným významem. Spojovník se používá na spojování slov. Neboli (opravdu je to neboli, žádné nebo-li) když napíšete “zeleno-žlutý”, tak ten znak mezi dvěma slovy je spojovník. Nikoli pomlčka. Spojovník se ještě používá například na dělení slov, o což se uživatel obvykle nestará.

Naproti tomu pomlčka se používá jako pauza v přímé řeči nebo ji můžeme občas použít místo čárek – poté vyjdařuje vsuvku. V těchto případech je kolem pomlčky mezera. Pomlčku dále používáme, píšeme-li nějaký rozsah; zde již bez mezery. Například 9–17, 17.00–18.30, 955–990 Kč a podobně. Mimochodem výraz 9–17 znamená “od devíti do sedmnácti”. Pokud napíšeme “máme otevřeno od 9–17”, napsali jsme kravinu, protože tam máme dvakrát “od” (máme otevřeno od od devíti do sedmnácti).

Znak, který (pravděpodobně) máte vedle pravého shiftu, je spojovník. Stejně tak klávesa minus vedle klávesy plus je spojovník. Pro minus také existuje specifický symbol, který na běžné klávesnici není. Pomlčku od spojovníku poznáte obvykle jednoduše – spojovník je kratší a hrubší, pomlčka je delší a tenčí. Oni typografové ještě rozdělují pomlčku na kratší a delší; přesněji čtverčíkovou a půlčtverčíkovou, přičemž čtverčík má přibližně délku šířky písmene m. Není to tedy absolutní velikost, nýbrž relativní (záleží na velikosti písma). Ale běžným smrtelníkům bohatě stačí jedna pomlčka.

Co třeba uvozovky? Na klasické klávesnici české uvozovky nejsou, jsou tam pouze tzv. “programátorské uvozovky” (používají se při programování). Oni to ale uvozovky nejsou vůbec, je to znak pro palec. České uvozovky jsou zkrátka další znaky, které na běžné klávesnici nenapíšete. Aplikace typu Microsoft Word sice automaticky přepisují programátorské uvozovky na české, nicméně ne vždy člověk píše texty ve Wordu.

A mezery? Víme, kde se píší mezery a kde ne? Většina – zdá se – ano, ale najdou se i tady v diskusi (nebo v diskuzi? Obojí je přípustné. Stejně jako fyzika a fysika nebo filosofie a filozofie) tací, kteří to neví. Takže platí tato pravidla: před interpunkčním znaménkem se mezera nedělá nikdy (žádné mezery před otazníky, vykřičníky nebo čárkami), zato za těmito znaménky vždy. Výjimky existují (také častá chyba – píše se výjimka, nikoli vyjímka), ale je jich málo. Třeba v případě, že máte dvě znaménka za sebou, což se může stát, že?! Jen prosím, dvě tečky na konci věty opravdu nepatří, za zkratkami – jsou-li na konci věty – se již další tečka nedělá. Atd.

20 % sleva nebo 20% sleva? S mezerou nebo bez? Kdo s koho (ne kdo z koho, jedná se o postarší čtvrtý pád; podobně jako být s to)? Je to jedno, nebo to není jedno? Není to jedno, samozřejmě (probůh nikdy samozdřejmě). Každá varianta znamená něco jiného. 20 % je dvacet procent, ale 20% je dvacetiprocentní. S mezerou to funguje jak by člověk čekal, bez mezery je z toho přídavné jméno. V našem případě je tudíž správně 20% sleva (ale obráceně je sleva 20 %). Podobně to platí u i jiných jednotek: 10 m je deset metrů a 10m je desetimetrový.

S těmi čísly je vůbec sranda. Pokud jste někde byli s deseti lidmi, byli jste tam s 10-ti lidmi nebo s 10ti lidmi? Ani jedno, byli jste tam s 10 lidmi. Jestli jste v závodě skončili pátí, skončili jste 5. Nikoli 5-tí nebo jiné hrůzy. A vůbec, pokud jste někde skončili 5., skončili jste pátí. Malá čísla se obvykle vypisují slovně.

Teď si představte, že všechna tato základní typografická pravidla znáte a jdete se projít po městě. No řeknu vám – hrůza. Málokdy narazím na ceduli, kde by nebyla nějaká typografická chyba. Stejně tak je nesmírně zábavné číst komentáře, kde jsou mezery vyloženě cik cak. Ještě, že se o typografii zajímám opravdu jen okrajově, jinak bych se z toho zbláznil.

Co mě ovšem dokáže naštvat je, když nějaké typografické hrůzy vidím v místech, kde by je opravdu vidět neměl. Ve výloze se to dá přežít, ale když něco z výše jmenovaného najdu u nějakého seriózního deníku… Třeba aktualne.cz ze zásady nepoužívá české uvozovky. Důvod neznám. Patrně to nebude v neznalosti editorů a reportérů, ale v systému. Třeba tento skvělý blogovací systém mi také do článku neumožňuje napsat pomlčku nebo české uvozovky. Všechny pomlčky po publikování přepíše na spojovníky a všechny české uvozovky na palce. Skvělé. Naštěstí v komentářích již tyto znaky fungují. Opět tomu nerozumím.

Ona ale nastává ještě jedna otázka. Pokud na klávesnici tyto znaky nemáme, tak jak je vlastně můžeme psát? No… Blbě. Znám tak dva rozumné způsoby. Naučit se klávesové zkratky s levým altem (třeba čtverčíkovou pomlčku napíšete jako alt+0151) nebo si přemapovat klávesnici. To používám já. Jiná rozumná cesta nejspíš neexistuje.

Poznámka: Toto není žádný extra rýpavý článek a neříkám, že jsem češtinářský bůh. Takže jestli máte nějaké poznámky k mé češtině, tak mi je klidně sdělte, ale prosím bez řečí typu “píšeš o češtině a sám tam máš x chyb”.

Poznámka #2: Protože tento systém mi nedovolí vecpat do článku pomlčku, zapsal jsem všechny pomlčky pomocí dvou spojovníků.

Další informace:

Matematická hádanka 3: Karetní triky


Představte si, že máte čtyři karty, na kterých je vždy na jedné straně písmeno a na straně druhé číslici. Před sebou na stole vidíte tyto karty:

A D 3 7

Nyní vám oznámím pravidlo – “Pokud má karta na jedné straně písmeno A, má na druhé straně číslici 3.” A otázka zní: které karty musíte** obrátit, abyste zjistili, jestli toto pravidlo platí nebo neplatí?

… a opět – kdo zná, nechť prosím mlčí, kdo nezná, může přemýšlet a řešit :-). V odpovědích prosím kromě svého tipu také vyřkněte odůvodnění.

Matematická hádanka 2: Statistika nuda je


Když jsem tuto hádanku dával kámošům v hospodě, vznikla z toho docela vtipná mela; snad se to tady nebude opakovat. Takže zadání:

Na zemi vypukla zákeřná nemoc. Tato nemoc je velice krutá, zabíjí každého, který tuto nemoc dostane; bez výjimky. Žádné účinné léky pro tuto nemoc neexistují. Nicméně tato nemoc zasáhne pouze jednoho člověka z desetitisíce. Martin si dělá starosti o své zdraví, a proto se rozhodne, že zajde k lékaři, aby mu stanovil diagnózu.

Lékař mu vysvětlí, že vyšetření na tuto chorobu je úspěšné v 99 % případů. A je už jedno, zda tuto nemoc máte, nebo nemáte. Vyšetření má vždy pouze 99% úspěšnost, v 1 % případů lékař určí špatnou diagnózu. Martin podstoupí vyšetření a za chvíli se dozví výsledek.

Výsledek je pozitivní, podle vyšetření Martin tuto zákeřnou nemoc skutečná má. Martinovi se zatmělo před očima a už si šel vybírat rakev. Opravdu je to tak nutné?

Nyní otázka, na kterou máte odpovědět (předchozí otázka byla pouze řečnická) - jaká je pravděpodobnost, že Martin tuto nemoc má?

Dovolená


Loni jsme s přítelkní byli v Jeseníkách; bylo tam fajn, i když zrovna moc nevyšlo počasí. Znáte to - měsíc je hezky, ale ve chvíli, kdy jedete na dovolenou, klesnou teploty o deset stupňů. Naštěstí při finálním výšlapu na Praděd a sešlapu kolem Bílé Opavy se udělalo hezky. Náš problém je, že nevíme, kam jet letos. A protože zdejší diskutéři jsou jistě zcestovalí, obracím se na vás!

Máte nějaké oblíbené místo, kde je hezky? Ale prosím ať to místo splňuje několik parametrů - asi nebudeme mít auto, takže by v krátké vzdálenosti mělo být dosti zajímavých míst na návštěvu. Žádné stokilometrové výlety opravdu podnikat nehodláme :-). Nechce se nám zároveň cestovat na místo určení deset hodin, tudíž ideální by bylo něco na Moravě (jsme z Opavy).

Zatím jsem neměl moc času se na něco podívat, ale už jsme vyloučili Moravský Kras (to jsou ty punkevní jeskyně, Macocha apod.). Jinak je to ale celkem jedno, kam nás nasměřujete. Jde jen o to, ať se tam nenudíme. Být týden zavřený na pokoji sice může být… vzrušující… ale přeci jenom bych preferoval nějaké další dění :-).

TO = IT = Ajťák

Něco málo k překladům názvů filmů.


Mám rád Stephena Kinga. To je emerický spisovatel, kdybyste nevěděli. Píše především horory a říká se, že je to v současnosti komerčně nejúspěšnější spisovatel. Možná ho už předběhla ta čarodějka z Anglie, to netuším; a je mi to vlastně jedno.

Mám rád i filmy natočené na motivy jeho knih. Teda většinou, zatím jsem viděl snad jen jedno děsivě špatné zpracování. Ale zase bylo fakt strašidelné - něco jako když emeričani natočili Mušketýry; prostě trapárna a chujovina.

Ale teď zpět k těm překladům. Stephen King napsal román “It”. Když se do češtiny přeložila kniha, jmenovala se “To”. A teď hádejte, jak se jmenuje film natočený podle této předlohy? Správně - “Nepředstavitelná hrůza“. Skvělý název! Nicméně zrovna tenhle film lze najít i pod originálním názvem “To”. Buď jsou to dva různé filmy, nebo to nakonec přejmenovali, nemám zdání.

Další kniha od Stephena Kinga - Needful things. Kniha v češtině se jmenovala “Nezbytné věci”. A pod jakým názvem šel film do kin? Přece “Obchodník s hrůzou“! Bravisimo! Hned jak jsem se koukal na ten název, tak jsem věděl, že se jedná o Nezbytné věci, nic jiného mě vůbec nenapadlo.

Pak už tady máme trochu rozumnější překlady. Z “Pet Sematary” udělali knihu “Řbitov zvířátek”, v kině pak “Hřbitov domácích zvířátek”. Z “Secret Window Secret Garden” → “Skryté okno do skryté zahrady” → filmově: “Tajemné okno”. To je taky dost demence. Nicméně zde se již původní film jmenoval “Secret Window”, taky nešel přesně z předlohy.

Tohle mě prostě prudí. Když hledám filmové zpracování Nezbytných věcí, očekávám, že se to bude jmenovat stejně. Nechápu, co vede překladatele k tomu, aby si vymýšleli zcela jiné názvy než jaké jsou již zažité. Když se originální kniha jmenuje “Needful Things”, původní film “Needful Things”, česká kniha “Nezbytné věci” tak nechápu, jaký je důvod k tomu, měnit název u filmu.

OMG WTF.

Jak se zabavit v nudných hodinách

Dva až tři tipy pro ty, kteří se nudí v hodinách a neví, co dělat.


Znáte to… Sedíte v lavici, učitel něco vykládá o teorii uzlů a vás to hafec zajímá. Když už vás začne nudit vyrývání sprosťáren do lavic a když vás přestane vzrušovat nahá Pamela, vyzkoušejte tohle:

Představujte si, že škola byla přepadena krvelačným gangem, jemuž šéfuje Johny Sekáč Magor. Ten náhle rozrazí dveře a dvěma přesnými zásahy z Beretty odstřelí tomu blbovi u tabule hlavu. Všichni ve třídě začnou křičet. Teď máte na výběr dvě možnosti. Pokud jste hodně naštvaní, zvolte tuto brutálnější metodu:

Do třídy za Johny Sekáč Magorem přiběhne další kumpán s Kalašnikovem a začne řežba. Prdele létají na všechny strany, ve vás by se krve nedořezal. Johny Sekáč Magor nakonec postřílí úplně všechny a vymočí se na mrtvolu té pitky Sýkorové, která má xicht jako dekl vod kanálu. S pocitem dobře vykonané práce odchází pryč. Naneštěstí se ale přehlédl – nezabil všechny, vy jste přežil! Schoval jsem se pod mrtvolu Hanči Truhlíkové; to je ta pitka, která váží sto kilo a nosí bikiny a úplá krátká trička. Takže kdyby to bylo třeba, vlezl byste se do ní pod ní třikrát.

Opatrně vstanete, kopnete si do pitky Sýkorové a jdete pryč ze třídy. Pomalu se rozhlížíte, jestli tam někde není Johny Sekáč Magor. Z povzdálí se zase začíná ozývat střelba a křik. Moment, moment – joo, tenhle křik znáte. To je ten kretén z třetího, jak vždycky ráčkuje a žertuje s ředitelem školy. Hahaha, dobře mu tak. No nic, jdete dál. Už scházíte ze schodů, když tu hle – Johny Sekáč Magor nad vámi a na mušce má vaší prdel. Okamžitě uskočíte a sklouznete po schodech jako když James Bond sáňkuje. Pak pár kotoulů, proběhnete kolem kabinetu toho starýho dědka Skořápky a okamžitě zamíříte do sklepení, kde jsou šatny.

Skočíte do šatny třetí Á a koukáte se, jestli je vám Johny Sekáč Magor v patách. Není. Ani střelba není slyšet. “To seš ty?” uslyšíte náhle za svými zády. Ano! V šatnách někdo je – a co čert nechtěl, je to Andrea. Největší kočka z celé školy; s největšíma tentononc. “Lukáši, musíš mě zachránit.” – “Ale samozřejmě, povídej.” – “Víš… Nahoře je Johny Sekáč Magor a já… Nechci umřít jako panna… Prosím, odpaň mě!” – “Samozřejmě, je to má povinnost!” Pak začnete hafo souložit. Zepředu, pro sichr i zezadu. Najednou ale slyšíte dupot Johnyho Sekáč Magora. Teď zase záleží na vás – jestli bude Andrea dobrá, utečete spolu. Jestli stála za starou bačkoru, Johny Sekáč Magor prostě přiběhne dřív, než stačíte utéct a Andrea bude o prso kratší. Pochopitelně za rohem potkáte Sandru, nadrženou maturantku…

Teď se vrátíme zpět do doby, kdy Johny Sekáč Magor přiběhl do třídy. Nyní nezastřelí všechny, ale jen toho hovňouse u tabule. A teď začne vyjednávání. Johny Sekáč Magor vás všechny přesune na konec třídy, přijede policie, elitní jednotka. Kolem školy se sejde pět tisíc lidí a všichni čumí jak tága. Sice už to nebude tak akční, ale zase se to hodí pro studenty psychologie. Můžete si představovat, že Johny Sekáč Magor si bude chtít vzít rukojmí jako živý štít, když vykoukne z okna a vybere si Drahomíru. A vy se hrdinně nabídnete namísto ní! Dají se vymyslet mnohé kombinace, kdy se vaše hrdinství stupňuje. Holky ve třídě třeba vždycky dojme, když si necháte postřelit nohu namísto někoho jiného. Samozřejmostí je, že Johny Sekáč Magor bude zneškodněn a vy budete brán za největšího hrdinu. Pokud jste romantik, začnete okamžitě chodit s největší kočkou ze třídy. Jestliže nejste romantik, můžete v klidu osouložit všechny holky, ne jen tu jednu.

A teď ten druhý tip – představujte si, že na budovu školy útočí Klingoni! Lidská říše je již dlouho ve válečném stavu s Klingony a poslední léta to vůbec nevypadá dobře. Nyní se Klingoni stále častěji dostávají až na povrch země a útočí na okolní budovy. Štíty na školní budově již slábnou a vypadá to, že budete zničeni. Náhle zvrat – podaří se vám přesměrovat deflektor z animačního jádra na polarizovanou frekvenci, čímž do štítů převedete 30 % energie. To stačí na odražení nečekaného útoku! Za chvíli se již v provozu iontové dělo na protějším komínu, které začne po klingonských stíhačích pálit jednu salvu za druhou. Během chvíle jsou nepřátelské jednotky zlikvidovány. Ale co to! Jedna zničená loď nebyla rozprášena úplně a nekontrolovatelně se blíží na jeden rodinný dům. Tohle domovní štít nemůže vydržet. Rychle přeskočíte k transportní jednotce a aktivujete vlečný paprsek, pomocí kterého odkloníte trajektorii jinak nekormidlovaného letounu. Vše dopadne dobře a vy se opět můžete v klidu věnovat učení. Ovšem pouze do dalšího útoku!

A která je má nejoblíbenější metoda? Noo… jako ty soulože dobrý, ale Klingoni jsou Klingoni ;o).

Mým anarchistům…

…v reakci na část nedávného anarchistického projevu Jana Cempera, kterou naleznete zde:

“My jsme Borgové. Váš obranný perimetr byl prolomen. Budete asimilováni. Deaktivujte své zbraně a sklopte své štíty. Vaše biologická a technologická rázovitost se stane Naší součástí. Vaše charakteristiky budou přidány k Našim. Vaše kultura Nám bude sloužit. Váš život, jakýkoliv jen byl doposud, skončil. Od teď - navždy, budete sloužit Nám! Odpor je marný.”

Jéžiš, pardon, to nebyl anarchistický projev, to byli Borgové. Správný projev se nachází na iDNES:

“Jsme anarchisté, náš rozum a naše morálka nám bohatě stačí k tomu, abychom poplatky u lékaře odsoudili jako zcela zvrácené, kontraproduktivní a asociální.”

PS: Tento článek není žádným způsobem zaměřen na poplatky a v žádném řádku (ani v žádném meziřádku) nevyjadřuji svůj postoj k tomuto tématu. Toliko pro ty, kteří by byli schopni z tohoto pamfletu nějaký můj názor na poplatky vyždímat.