pondělí 23. března 2015

Jak rychle se rozšíří informace do celého světa?

Náš informační svět funguje decentralizovaně, už jenom ze své podstaty. Každý si ve svém mozku neseme část nějaké databáze informací, která je pro nás jedinečná. Pokud bychom všechny tyto informace spojili, tak bychom mluvili o "globálních znalostech lidstva", tedy o znalostech, které přímo my nevíme, ale víme, že na ně existuje odpověď a můžeme se na to někoho zeptat.

Podstatou tohoto článku má být ale rychlost šíření nových informací. Věříte vůbec, že existuje nějaká informace, kterou ví úplně každý žijící člověk na Zemi? Podle všeho ne. Všichni nevíme, že existuje Měsíc, všichni nevíme, že sami existujeme, všichni nevíme, jak vypadá Slunce.

Co když ale vznikne nějaká nová informace, která bude natolik důležitá, že bude chtěným cílem, aby se jí dozvěděl naprosto každý a bude klíčové, aby se to stalo co nejrychleji? Za jaký nejkratší čas je možné informovat celé lidstvo?

Představte si situaci, že jste úplně nevýznamný Afričan, zrovna si takhle trádujete pouští a najednou zahlídnete nájezd mimozemské civilizace. Získáte nějaký důkaz, který nebude možné popřít a budete chtít informovat svět o tom, že mimozemšťané skutečně existují a že se s nimi lze spojit. Jak to uděláte?

Můžete informovat média, ta by to mohla rozšířit již v rámci jednotek hodin na poměrně velkou masu lidí a za několik desítek hodin by to věděli téměř všichni, kteří disponují nějakým informačním prostředkem (tisk, televize, rádio, internet, známost dalších lidí, ...). Za jak dlouho se však tato "extrémně důležitá" informace dostane k úplně každému člověku? Pochopí takovou informaci vůbec každý?

Myslím, že na tuto otázku neexistuje jasná odpověď. Možná by to mohlo trvat i celé roky, popřípadě celou generaci, než vymřou všichni neinformovaní (za předpokladu, že nově narození mají vysoké šance na získání a pochopení takové informace).

A vůbec - pokud bych já sám v našich končinách (myšleno kdekoli v ČR) spatřil nějakou událost nebo udělal nějaký čin a vytvořil bych natolik důležitou informaci, kterou by bylo vhodné co nejrychleji rozšířit, za jak dlouho bychom to věděli "všichni"?

neděle 8. března 2015

Hraní šachu s nevidomým

Hraní šachu "poslepu" je něco, co se dá jen těžko popsat, pokud jste to ještě nezkoušeli, tak přicházíte o hodně. Nedávno jsem byl s mým nevidomým známým v Praze na tzv. neviditelné výstavě. Celá akce proběhla za naprosté tmy a procházeli jsme řadu místností, které navštěvujete i v běžném životě. Několikrát jsem se uhodil do hlavy a naboural do stěny - zkrátka jsem rád, že mohu tyto řádky napsat s vědomím, že je vidím.

Technická odbočka: Ve skutečnosti tyto řádky nikdy vidět skutečně nemohu, mé oči pouze snímají proud fotonů z monitoru a obraz se mi skládá až v hlavě, ale o tom někdy příště.

Po výstavě mě ale napadla otázka, jak jsou na tom nevidomí a hry - lze vůbec hrát i bez dívání? Ano, jde! Stačí jen speciálně upravená šachovnice s řadou otvorů, za které se figurky kvalitně připevní na základě hrotu vespod a může se vesele hrát.

Nejprve jsem si zkusil zahrát bez dívání - to mi moc nešlo. Nebylo výjimkou, když se na můj tah čekalo i 5 minut, než jsem si sekvenčně prošel šachovnici a pokusil se jí složitě představit. No, prohrál jsem asi na 10 tahů, vlastní blbostí, spletl jsem si řadu.

S díváním to bylo lepší. Nemyslím si, že jsem byl v tu chvíli v nevýhodě, protože můj spoluhráč je na absolutní temnotu zvyklý, takže mu jde "hmatová" představivost nesrovnatelně lépe, než vidícím lidem.

V batohu jsem s sebou také měl notebook, takže jsem mohl kolegovi poskytnout něco, co ještě nezažil - hru šachu s počítačem. Na notebooku jsem otevřel šachovou aplikaci (http://lichess.org), zahájil partii a tahy jsem z digitální podoby (z obrazovky) převáděl do analogové (tahal jsem s figurkami na fyzické šachovnici). Samozřejmě počítač pokaždé vyhrál, ale to se dalo čekat, když porazí i samotné šachové mistry.

Nevizuální komunikace se světem

Když už jsme byli u toho, tak jsem kolegu využil k tomu, aby prošmejdil můj web s jeho hlasovou čtečkou, takže jsem měl unikátní příležitost při pozorování toho, jak se na webu chová a co musím opravit.

V chvíli mě ale napadlo, že nevidomí to mají s hledáním informací opravdu složité. Při použití Googlu se dostanou jen k textovému obsahu, a to ještě jenom někdy.

Napadlo mne, že by mohl v budoucnu například využívat chytré hodinky od Googlu s jeho hlasovou asistentkou Now, tu lze totiž kompletně ovládat jen za pomoci hlasu a odpovídá zpět také hlasově, takže se s trochou nadsázky dá říct, že tam vlastně ani není display potřeba (stejně ukazuje jenom hodiny, a čas lze vyvolat hlasovým příkazem: "What's the time?").

Do svého telefonu jsem si nainstaloval nejnovější verzi Google Now a při příští návštěvě to vyzkouším, jestli s ní bude umět komunikovat. Všeobecně si ale myslím, že by to neměl být problém, protože nový příkaz se vyvolá hláškou: "Okay, Google" a na většinu výsledků odpovídá zpět. Jediný problém vidím s mapami, pokud totiž položíte dotaz týkající se adresy, mé polohy nebo nějaké místa, tak vždy ukáže mapu vizuálně, přečíst název ulice ještě neumí (nebo minimálně nevím, jak na to).

A co si o tom myslíte vy?

sobota 7. března 2015

Jak levně realizovat livestream z ulice

Přemýšleli jste někdy nad tím, že byste si udělali vlastní živý přenos na internet, ale nemáte k dispozici drahou výbavu, ani satelit? V současné době to už moc nevadí a budou stačit jen běžně dostupné komponenty.

Základem je kamera

Pro snímání živého videa se přímo nabízí webkamera, nicméně běžné webkamery mají malé rozlišení, nízký počet FPS (počet snímků za sekundu) a špatně se kamkoli v terénu upevňují.

Já osobně pro živý záznam používám vylepšenou webkameru s vysokým rozlišením, v obchodech se s nimi lze setkat jako s "LIVE" kamerami. V zásadě se takové zařízení tváří jako webkamera, připojuje se klasicky přes USB, ale proti běžné webkameře nabízí lepší kvalitu (běžně 1080p video při 30 FPS). Cena takové kamery se pohybuje v řádu stokorun, relativně slušnou kameru lze takto zakoupit pod 1000 Kč. Pokud vás zajímá výstupní kvalita videa, tak se podívejte na web http://mathematicator.com, většina videí je točena právě na LIVE kameru.

Při živém přenosu se někdy může hodit více kamer a možnost s nimi pohybovat, přičemž počet USB slotů většinou bývá omezen (v notebooku), takže se hodí i jiné řešení. V praxi se mi osvědčilo použití telefonu s Androidem a s aplikací Hangout. Takto lze mít kameru prakticky "v ruce" a být bezdrátově relativně nekonečně daleko, protože se obraz posílá nezávisle přes internet. Takové řešení však vyžaduje kvalitní připojení mobilu k internetu a trochu lepší telefon, který zvládá v reálném čase komprimovat obraz.

Zpracovatelská stanice

Při živém přenosu je potřeba také nějak pracovat s obrazem, který se odesílá k divákům. Na takový úkol postačí prakticky jakýkoli notebook, který má aspoň 3 USB porty a kde baterka vydrží aspoň hodinu při větší zátěži. V terénu totiž obvykle elektrika není k dispozici, takže se vše musí napájet z baterií. Při výdrže baterie je třeba započítat také zátěž procesoru, vysílací jednotky (internet) a napájení kamery (popřípadě externího mikrofonu). Můj notebook Acer TravelMate takto vydrží streamovat přibližně 90 minut, což často stačí.

Pro vysílání je dobré použít nějaký webový software třetí strany. Mě se osvědčil nástroj od Googlu a to tzv. "vysílaný Hangout". Jeho hlavní výhoda je v tom, že řeší většinu výpočetních operací, takže mu jen odesílám předzpracované video. Dále je možné do Hangoutu přizvat další účastníky (třeba mobilní telefon) a takto snadno zapojit více kamer, mezi kterými lze přepínat. Pokud má každá kamera vlastní datový tok, tak případný výpadek jedné z kamer neohrozí celkové vysílání (což se už mnohokrát hodilo).

Konektivita

Protože chceme vysílat na internet, tak musíme mít kvalitní přípojku do internetu, to je jasné. A také co nejlevněji.

Pokud máme k dispozici trochu lepší mobil, který umí LTE (v horší situaci 3G), tak jej lze použít jako prostředníka ke komunikaci. Z mobilu se udělá wifi hotspot, na který se připojí notebook a může se vysílat. V takovém případě je ale potřeba řešit datový FUP, pokrytí signálem, rušení ostatních vysílačů a hlavně výdrž baterie v telefonu.

Já osobně používám USB model od Vodafonu. Podporuje technologii LTE, přes kterou lze v Praze dosáhnout až 720p videa při 30 FPS, takže pro mé potřeby to je naprosto ideální řešení. FUP je sice 20 GB, ale není problém případně za pár korun přikoupit další balíček - což stejně není často potřeba, protože hodinový přenos zabere zhruba 2.5 GB dat.

V některých případech lze využít okolní wifi sítě, ale na to se nelze obvykle spolehnout. Pokud je to aspoň trochu možné, tak byste měli vždy použít ethernetový kabel, protože nic nenabídne kvalitnější přenos a vyšší spolehlivost.



A jak vysíláte na internet vy? Máte nějaký lepší nápad, jak lze živý přenos realizovat ještě levněji? Na váš názor se budu těšit v komentářích.

pátek 6. března 2015

Jak naprogramovat umělou inteligenci při výpočtu matematických příkladů

Již od 6. třídy základní školy hledám odpověď na to, jak správně udělat program, který zvládne vyřešit (téměř) libovolný matematický problém, podobně jako by to dělal člověk, podá kompletní postup a nakonec ještě výsledek v mnoha formátech. Řešení jsem již nalezl a tento článek má sloužit jako teoretický nádech toho, jak to zhruba funguje.

Nebojte se rekurze

Znáte lepší příklad rekurze, než samotnou matematiku? Již paní učitelka na Základní škole říkávala: "Matematika je královna všech věd, protože všechno vychází ze všeho a vše je vzájemně propojeno."

Sice jsem tomu tehdy moc nerozuměl, ale jak plynul čas, tak jsem pochopil samotnou podstatu toho všeho. Pro vyřešení libovolného matematického problému v zásadě nepotřebuji mít pokročilé znalosti dané problematiky, stačí jen znát obecná pravidla a naprosto vše lze odvodit na základě předchozích znalostí.

Asi vás napadá, že takto nemůžeme pokračovat do nekonečna a nějaké základní znalosti mít musíme, takže si nejprve definujeme seznam základních pravidel, o kterých prohlásíme, že platí za jakýchkoli okolností a nebudeme je hlouběji zkoumat (aspoň tedy ne po programové části). Tyto základní (primitivní) entity budou tvořit jádro našeho systému, takže jakýkoli složitější problém půjde postupně rozdělit na kombinaci těchto pravidel.

V rámci úspory zde nebudu vypisovat všechna pravidla, která moje jádro využívá, takže bude muset stačit jen několik příkladů. Veškeré "vzorečky" jsou pouze symbolické:

  1. Znaky 0, 1, 2, 3, 4, 5, 6, 7, 8 a 9 jsou čísla.
  2. Mezi čísly lze použít tyto operace: + (sčítání), - (odčítání), * (násobení, opakované sčítání), / (dělení, opakované odečítání), ^ (mocnění, opakované násobení), ...
  3. Mocnění má přednost před násobením a dělením, násobení a dělení má přednost před sčítáním a odčítáním.
  4. sin, cos, tg, tan, log, ... jsou funkce (definovány se samostatným algoritmem, využívám zabudovaných funkcí přímo v PHP).
  5. samovolně ležící znak (rozmezí a-z) je proměnná, skupina znaků je buď funkce (zjišťuje se podle tabulky, nebo skupina proměnných, které se mezi sebou násobí).
  6. znak "=" znázorňuje rovnost, obě strany si musí být rovny.

Takto můžeme pokračovat dál a definovat si veškeré matematické poučky, až vytvoříme obrovskou znalostní bázi toho, co vše se může v zápisu vyskytovat. V zásadě pouze popisujeme chování jednotlivých entit, nikoli postupy, jak s nimi pracovat.

Těžkou práci nechme strojům

Představme si, že máme k dispozici počítač, který zná veškeré matematické poučky pouze na teoretické bázi a ještě nikdy neřešil nějaký konkrétní příklad, vůbec nezná žádné chytré metody, zkrátka se neučil jako člověk, ale jako stroj.

Jak si tedy poradí s následujícím příkladem?

5 + 3 * x = 20

Na tuto otázku neexistuje jednoznačná odpověď, protože jsme ještě nezačali počítat a nemáme k dispozici žádný vyhodnocovací algoritmus, pouze seznam základních pravidel. Pojďme si tedy nejprve teoreticky říct, jak by program měl postupovat a čeho by si měl všímat.

Už jenom podle syntaxe příkladu je jasné, že si jej musí podle naučených pravidel rozdělit na několik oblastí, které bude řešit samostatně a opět použije stejná pravidla. Protože jsou matematické zápisy strukturované a záleží na pořadí jednotlivých entit a platí nejrůznější pravidla ohledně přednosti, tak se dělení na jednotlivé elementy musí provést rekurzivně. Ideálně tedy tak, že se nalezne první rozdělující pravidlo, zavolá se znovu dělící funkce s rozdělenými objekty a takto se pokračuje dále, než je vše rozděleno na triviální elementy, které lze řešit přímo.

  1. Nejprve tedy program zjistí, že zápis obsahuje znak "=", který celý příklad dělí na 2 nezávislé části. Provede tedy hrubé rozdělení řetězce se vstupem na 2 nezávislé a zavolá je jako argument vyhodnocovací funkce, která provedla toto rozdělení (zkrátka spustí rekurzi).
  2. Rozhodovací funkce se spouští znovu a tentokrát má za úkol zpracovat 2 různé vstupy. Neví jak, jediné co ví je fakt, že její výstup musí vyhovět podmínce rovnosti obou vstupů. Začne tedy znovu aplikovat další vhodný vzorec ze své znalostní báze.
  3. Dále si všimne, že násobení má přednost před sčítáním, takže nejprve musí násobit a poté výsledek přičíst. Není nic lehčího, než proces násobení převést rovnou na výsledek - ale na jaký, když je v předpisu neznámá proměnná? To ještě nevíme, ale můžeme si na to napsat opět rekurzi a poznamenat si podmínku toho, jaký očekáváme výstup.

    V kódu by to mohlo vypadat třeba takto:
    5 + rekurze("3*x")
  4. Dobrá, máme k dispozici už jen sčítání dvou entit, to je triviální, takže ukončujeme rekurzi, náš "strom" pravidel je hotový a můžeme jít vyhodnocovat.
Vyhodnocení pravidel

V této fázi máme k dispozici seznam pravidel, která musíme splnit, abychom našli řešení. Pravidla jsme si vytvořili na základě rekurze, která podle naučených vzorců prošla zadání.

Protože program ví, že se obě strany musí rovnat a že znak "x" představuje proměnnou (nějaké číslo), tak může začít zkusmo dosazovat, než se trefí. V tomto není žádná logika, program to bude zkrátka jenom zkoušet a za nějaký čas se dostane k výsledku.

Při každém pokusu o nějaké řešení provede analýzu všech podmínek a pokud se všechny splní, tak je program ukončen a vypíše se výsledek. Pokud by bylo vstupních podmínek mnoho, tak můžeme nasadit nějaký algoritmus, který bude hlídat postupné "blížení" k výsledku a bude omezovat kroky, které nemají smysl a akorát plýtvají čas.

Expení znalostí

Pokud takový program vypočítá mnoho různých příkladů, tak si může postupně ukládat, jak postupoval a jaké metody vedly často k dobrému výsledku. Pokud se nějaká metoda dobře osvědčí, tak jí může zařadit jako nové pravidlo a příště ji nebude muset znovu odvozovat a bude "chytřejší" a hlavně rychlejší.

Na podobném principu funguje i lidský mozek a jeho schopnost provádět nové objevy při zkoumání světa. Efektivitu zatím neřešme, takto jsme totiž sestrojili plně funkční univerzální "mozek", který se popere s téměř libovolně složitým úkolem. Bude jen vyžadovat definici toho, co může udělat a další definice si postupně vytvoří (spíše odvodí na základě pozorování) sám.

Pokud bychom měli opravdu hodně výpočetního výkonu, tak můžeme takto prakticky sestrojit umělou inteligenci, ale to je v současné době spíše nereálné, protože tato metoda neřeší mnoho problémů, které reálně nastanou. Cílem článku bylo spíše vysvětlení toho, jaké myšlenkové metody jsem při návrhu umělé inteligence ve svém vyhledávači použil.

čtvrtek 5. března 2015

Miluji datově nenáročné aplikace a mnozí to nechápou. :(

To víte, pamatuji si ještě na doby, když se pro komunikaci dvou počítačů používal tzv. "kabelový přenos". To se data zkrátka nahrála na diskety, ty se vložily do kabely a k druhému počítači se zajelo autem. Byly to krásné časy - už jenom z toho důvodu, jak špatně se zálohovalo a hlavně protože nebyl internet (aspoň tedy pro mě běžně přístupný).

V té době jsem začínal s programováním a někdy v 6. třídě základní školy jsem sestavil svoje první webové stránky, které se však nikdy nedostaly do internetu a do dnes leží někde na tom porouchaném harddisku. A víte proč? Protože internet ještě nebyl takovou samozřejmostí a můj tehdejší počítač dokonce ani neměl síťovou kartu. No, byly to těžké časy, za dnešní světosíť jsem rád.

Největší zlom ale nastal ve chvíli, když jsem si pořídil svojí první pořádnou kalkulačku s monochromatickým pixelovým displayem (rozlišení je tuším 128 x 64 pixelů) a s možností programování. Tehdy jsem byl typický nenažraný uživatel, který chtěl mít stovky GB na disku. Objevil se ale problém, ta kalkulačka měla "jen" 4 KB paměti - tehdy jsem na to hleděl, jako na úplnou katastrofu (vždyť se mi tam nic nevejde), ale opak byl pravdou.

Postupně jsem při psaní kódu začal přemýšlet nad jeho technickou podstatou a více jsem se zanořil do problémů algoritmizace. Při každé nové funkcionalitě jsem se zamýšlel zhruba v tomto stylu: "Je tam vážně potřeba další globální proměnná? Nešlo by nějaká data zahodit?". Takový přístup byl sice za začátku opravdu namáhavý, ale brzy se ukázalo, že i relativně slušně vybavený program, lze vměstnat na méně než kilobajt a generátor (vykreslovač) grafů včetně jednoduché kalkulačky (pro výpočty) se vejde pod 500 bajtů.

S rostoucím výkonem počítačů a s čím dál většími disky jsem se rozhodl investovat a pořídil jsem si 1 TB disk se slovy, že to stejně nikdy nezaplácnu; a vskutku, po 3 letech denního používání jsem dohromady zapsal asi 3 GB dat, víc jsem toho vyprodukovat nezvládl (vždyť texty zabírají úplné minimum a snadno se komprimují).

Štve mě plýtvání s daty

Co mě ale štve je fakt, že většina dnešních vývojářů plýtvá jak s daty, tak s výkonem. To, že se napíše zaprasený algoritmus si většina moderních "programátorů" akorát kompenzuje tím, že přidá více hardware. To ale není správná cesta. Sice takový přístup může být dočasně výhodnější (protože špatně napsaný program je hotový mnohem dříve, než ten dobrý), ale z dlouhodobého hlediska to je katastrofa. Stačí jen založit špatně tabulku v databázi. Ze začátku to je sranda, ale jakmile se nahromadí pár stovek tisíc záznamů (nebo i milionů), tak není problém, čekat na výsledky hledání i 2 sekundy.

Já jako poučený programátor ale v tomto případě hledím dopředu a přijde mi to jako samozřejmé. Prohledat 1 milion záznamů by se mělo stihnout pod 1.5 ms, nebo snad ne?

jQuery

Nejvíc mě deptá právě jQuery. Chápu, že za tuto část článku mi akorát vynadáte v komentářích, ale což, stejně to sem chci napsat.

Mnoho lidí argumentuje, že jQuery usnadňuje práci a že je úspornější, než čistý JavaScript. Myslíte si to také? Já rozhodně ne, nebo aspoň často ne.

Často vidím situaci, kdy někdo na stránce potřebuje udělat nějakou blbost, třeba vysouvací menu, nebo tahací okénko. V jQuery se toto řeší jediným řádkem, v čistém JS jich je potřeba asi 20. Odsud asi táhnou všechny ty srovnávání velikosti.

Když si to ale vezmete z technického hlediska. Programátor v tu chvíli sice ušetřil 20 řádků v jeho kódu, nicméně každý uživatel musel načíst nějaký externí script (takže musel navázat další request, na který se muselo čekat), poté musel přenést asi 500 KB a následně celý velký script zpracovat u sebe v prohlížeči, což v případě pomalejšího telefonu může způsobit například padání prohlížeče. A to se bavíme jenom o vysouvacím menu a jezdícím okénku.

Vážně, nemám takový přístup rád. Často jsem odbíjen slovy: "data neřeš, dneska má každý rychlý internet a těch pár KB navíc FUPko nevyžere.". No, co na to říct. FUP sice nějaký čas vydrží, ale umíte si představit tu krásu, kdyby všichni psali scripty skutečně na míru konkrétnímu problému? Pak by se přenášelo jen to nejnutnější a FUPko 500 MB by bylo naprosto optimální i pro náročného uživatele.

Já osobně se občas připojuji s vyčerpaným FUP limitem (takže mám rychlost kolem 8 kb/s) a je vážně cítit, který web je udělaný správně (třeba mnoho služeb Googlu), a který špatně (typicky české zpravodajské servery). Jako uživatel se pak skutečně rád vracím na stránky, které se i tak načítají rychle a vejdou se na tu pomyslnou disketu ještě s velkou rezervou.

A co vy? Taky píšete jako prasata, jak se vám to zrovna hodí, nebo přemýšlíte nad kódem tak, abyste z něj vyčerpali maximální rychlost (a přitom nevyžrali baterku) a zároveň minimální datovou velikost?

Dohadování s učitelem na programování je peklo

Měli jste někdy ve škole hodinu programování? Dohadovali jste se s vaším učitelem? Většinou to radši nezkoušejte, nedopadá to dobře.

Moje řešení je nejlepší!

Liší se to kus od kusu, ale většinou si učitelé myslí, že právě jejich řešení je nejlepší. A proč? Protože nelze objektivně zhodnotit, který kód je pro studijní účely lépe pochopitelný.

To mi tak připomíná jednu starší hodinu, když jsme psali 2 zanořené cykly, generující tabulku v podobě šachovnice. Určitě vás taky napadá mnoho špatných řešení a vězte nebo ne, je vysoce pravděpodobné, že právě to špatné řešení (a hlavně složité) vám bude jako studentovi předkládáno.

Elegance kódu

Mám rád krásný a elegantní kód, který je krátký a výstižný. Rád používám méně známé konstrukty, které jsou ale přímo šité na míru určitému typu problému. Nechci si připadat zajímavý, ale přijde mi takový přístup jako samozřejmost každého dobrého programátora. Tento postoj jsem si vybudoval během studia matematiky, kde je také dobré, když se najde krásné a elegantní řešení.

Jeden příklad za všechny:
Jak jednoduše v PHP zjistit, jestli je vyplněný formulář správně a všechny položky obsahují to, co mají?

Řešení učitele:

if ($jmeno == "") $error = 1;
elseif ($prijmeni == "") $error = 1;
elseif (strlen($heslo) > 4) $error = 1;
elseif ($pohlavi == "") $error = 1;
else { /* zpracování */ }

Mé řešení:

S ohledem na výkonnost a eleganci by se to celé dalo zapsat jako jedna podmínka na jednom řádku:

if ($jmeno && $prijmeni && $heslo[4] && $pohlavi) { ... }

Všimněte se použití funkce strlen() a mého načítání znaku jako pole. Pokud je řetězec delší, než 4 znaky, tak určitě musí existovat 5. znak, tedy index [4]. Takové volání je mnohem rychlejší, než jakákoli funkce, nebo jiná metoda.

Při pokusu o "reklamaci" a návrhu na lepší řešení jsem byl odbyt se slovy: "Pane Barášek, vaše řešení je sice správné, ale zkuste ho studentům vysvětlit. Mé řešení je více polopatické, protože je přesně vidět, co se kdy stane.".

A jak na toto lze reagovat? Jedině snad: "Fajn, stanu se učitelem a za pár let vám předvedu, jak snadné to bylo!".

To nezvládneš! Ale já vím, jak na to.

V prváku jsem se setkal s učitelem programování, který na to nahlížel úplně jiným způsobem. Jako učitele jsem ho měl rád (než odešel na jinou školu), protože na něm bylo vidět, že programování opravdu rozumí (nebo aspoň tak vypadal) a dokázal zodpovědět většinu mých dotazů (a to jsem si dával vážně záležet, aby otázka byla těžká a musel se zamyslet).

Při výkladu hovořil stylem, kterému většina třídy nerozuměla, ale mě se to líbilo. Poprvé v životě jsem se totiž na nucených hodinách programování také něco nového dozvěděl.

Horší to ale bylo v případě, když jsem po hodině přišel s nějakým teoretickým problémem, který bych rád vyřešil a žádal o případnou teoretickou radu, jak to udělat správně. Onehdy jsem přemýšlel nad tím, jak udělat matematický parser, který zvládne vyřešit základní matematické předpisy, využívající čísla, sčítání, odčítání, násobení a dělení.

Bylo mi oznámeno, že jako prvák (v té době) to nemohu absolutně zvládnout napsat a že na to jsou potřeba hluboké znalosti problematiky. Ale také jsem se dozvěděl, že se prý celý problém dá řešit za pomoci jednoho průběhu cyklu řetězcem (s tím zadaným příkladem) a pak jen vypsat řešení i přesto, že se mohou zanořovat závorky. Tehdy mi to přišlo nepochopitelné - ale později jsem si uvědomil, že měl vlastně pravdu - šlo to udělat taky pomocí rekurze.

Ve finále to dopadlo tak, že jsem si nakonec parser vymyslel a napsal sám. Dalo mi to sice hodně práce, ale dostal jsem se do stavu, kdy jsem pouze nekopíroval hotové řešení, ale vytvořil vlastní. Nebylo sice úplně ideální, ale zato jsem se na problém díval úplně jinou optikou a tak jsem nalezl způsob, kterým by to on (učitel) prý nikdy neřešil - ale fungovalo to.

Později (někdy na konci druháku) jsem za toto tomu učiteli poděkoval. Že mi poskytl možnost problém řešit samostatně a později konzultovat možnosti řešení. Škoda, že takových není víc.

středa 4. března 2015

Jak jsem neuměl matematiku a dnes s ní podnikám

Pamatuji si na to, jako by to bylo včera. Tehdy jsem byl v 9. třídě Základní školy a zrovna ten den se psaly přijímačky z matematiky na Střední. Před testem jsem si v celku věřil, protože mi matematika relativně šla (aspoň tedy to byl můj osobní pocit), takže test dopadl relativně v pohodě (na školu jsem se dostal), ale následný střet s realitou byl mnohem horší.

Jak to tak ale bývá, tak realita byla trochu někde jinde. Já jsem přišel z vesnické školy, takže jsem uměl jen to, kam jsme se dostali a většina informací pro mě byla naprosto nová, a to tempo ... no, při vzpomínce na to, se mi otvírá nůž v kapse.

Hlavní myšlenkou tohoto příspěvku ale měla být ještě informace, že mě baví programování (a doufám, že to je vidět), takže jsem tento předmět poctivě studoval a doma si psal své vlastní programy. Vůbec mě ale nebavilo psát programy, které měly něco konkrétního vyřešit, ale postupně jsem se začal spíše zabývat teorií, zejména vymýšlením a psaním algoritmů. Tím jsem narazil na skutečnou matematiku, kdy jsem řešil nové typy problémů, ke kterým jsem v té době ještě neměl znalosti.

A co ta matematika?

No, prošel jsem. V prváku za čtyři, ve druháku za tři a dál se chlubit radši nebudu. Musíte ale pochopit podstatu.

Vymýšlení algoritmů mi úplně změnilo nastavení mozku (nebo mám aspoň takový pocit), dokonce se domnívám, že v Booleově algebře a dvojkové soustavě zvládám přemýšlet mnohem efektivněji, než v jakémkoli "lidském" jazyce. Totiž, když dostanu nějaký nový a neznámý úkol, tak jej nejprve řeším algoritmicky a až později "klasickou tradiční metodou".

Poznámka: Díky tomuto přístupu jsem se mnohokrát setkal s názorem, že jsem bezcitný, že si o sobě myslím, že jsem stroj (robot), že svět funguje jinak, bla, bla, bla, ... No, ale jaký jazyk je k popisu světa lepší, než právě matematika a z toho odvozené algoritmy a programovací jazyky?

Co jsem tedy programoval?

Vždycky jsem chtěl napsat nějaký program, který pomůže mnoha lidem (a hlavně mě) a za který získám to nejcennější - uznání.

Začal jsem tedy přemýšlet o tom, jak spojit něco, co mě baví - přemýšlení o logických problémech, vymýšlení algoritmů, psaní kódů; s tím, co potřebuji - naučit se rychle počítat na papíru. Začal jsem tedy pracovat na matematické kalkulačce, která měla toto všechno spojovat.

Při vývoji jsem byl dlouhá léta kritizován, že něco takového vůbec nemohu zvládnout a že to je akorát ztráta času (vždyť existuje Wolfram, ne?), ale já jsem to vydržel a po mnoha nezdarech jsem vydal první verzi svého programu v podobě webového vyhledávače VikiTron (možná jste o něm jeden čas slyšeli na Google+, byl jsem s ním na Junior Internetu, prezentoval jsem ho v Googlu a tak dále).

Poznámka: Vůbec nezastírám skutečnost, že jeden z důvodů, proč můj program byl tvořen formou vyhledávače byl fakt, že jsem chtěl "trumfnout" pana Petra Hejla s jeho Hlodačem. Mistr Hejl nakonec svůj výtvor nikdy nedokončil, za získané investice si koupil vinný sklípek a pokud neumřel, tak tam spokojeně žije dodnes. Můj program neměl žádného investora, byl psán doma na koleně, celkové náklady se vešly pod 10 000 Kč a za první rok provozu získal stálých 80 uživatelů denně! Co víc, jako nadšený (v té době středoškolák) chtít.

Co dělám dnes

V současné době vyvíjím komerčně zaměřený web Mathematicator.com (který je ale jinak zdarma), běží na něm můj původní algoritmus (divím se, že jsem ještě neměl čas ho přepsat) a matematika mě opravdu začala bavit. Ale ne ta matematika, která se vyučuje ve školách (ta je opruz), ale ta, kterou umím já v takové podobě, jak ji chápu.

Stejně mám ale z něčeho strašně krásný pocit, s kterým se s vámi všemi chci podělit. Když jsem po dlouhých letech našel ve svém pokoji kopii toho přijímacího testu, tak jsem se zadíval do zadání a řekl si: "Jak jsem toto mohl nechápat?". Zkusil jsem to zadání přepsat do mé aplikace a světe div se - program našel správné řešení. V tu chvíli mi okamžitě vyletěly slzy do očí a zamyslel jsem se, co je životním cílem všech dobrých programátorů, inženýrů, vědců, Kolesologů a dalších technických profesí; je to radost z toho, že po letech zvládnete vyřešit své staré problémy tak, že je stroj bude příště eliminovat za vás bez dalšího přemýšlení. Kdybych v té době měl takovou aplikaci k dispozici (kdyby existovala), tak bych se třeba vůbec počítat neučil, protože by mi to přišlo zbytečné a opsal bych jednoduše řešení.

Jsem rád za to, že jsem si na všechno musel přijít sám. Jsem rád za to, že mě pan učitel v prváku naprosto arogantně odrazil slovy: "to stejně v životě nemůžeš dokázat, to stejně nebude nikdy fungovat", protože přesně tato slova byla tou největší motivací k tomu, abych začal.

Příště

Přemýšlím o tom, že bych tento blog znovu obnovil (jestli to udělám se zjistí až podle komentářů a počtu zhlédnutí této stránky s příspěvkem). Pokud by se tak ale nakonec stalo, tak bych rád probral hromadu věcí, které mi jako programátorovi leží na srdci a to, o čem něco vím a také vím, že se o tom každý jen mluví, ale nic neví - třeba heuristika, sémantické prohledávání textů, evoluční algoritmizace, numerické metody, hledání na základě statistiky, optimalizace pro pomalá připojení a další.

A ještě takové moudro na závěr:

Doporučuji vám dávat pozor, protože ti, co tuto školu dokončí, se tím potom budou živit, a ti, co ji neudělají, se tím budou živit hned.