Před lety jsem pracoval na hře Fish Fillets 2. Během této doby se jiné místní firmě, po letech úporného přežívání, podařilo nalézt investora, který zaplatí vývoj jejich hry.
Sláva to pro ně byla veliká a tak uspořádali okázalou akci, kam sezvali všechny místní vývojáře a hromadu novinářů. Na pódiu probíhaly proslovy majitelů i investorů o všemožných synergiích a velkolepých plánech. Na stolech bylo možné nalézt letáčky s dlouhou nabídkou pracovních příležitostí a ve vedlejší místnosti se konal velkolepý raut s hromadou chlastu i jiných pochutin. K tomu všemu pak hrála kapela a okolo se motaly krásné hostesky.
Za dva týdny čtu na nějakém webu, že si to investor rozmyslel a firma ukončila svůj provoz.
V posledních pár dnech jsem si začal hrát s jazykem Go a tak jsem si vytvořil syntax highlighter pro editor PSPad. Soubor je možný stáhnout zde a stačí nakopírovat do adresáře “syntax”.
Dělení je následující: keywords1 jsou všechny standartní keywordy jazyka, keywords2 pak datové typy a keywords3 jsou hodnoty true, false a nil.
Před rokem a půl jsem se tady rozplýval nad parádním tutorialem k Ruby, který člověka během několika málo minut provede základy jazyka. Každý tak má možnost ozkoušet si jazyk na nečisto a poznat jak na něj působí, což je, až příliš, opomíjená vlastnost.
Dneska jsem nalezl stejný typ tutorialu pro jazyk Haskell. Tento jazyk je opředen spoustou různých legend a programátoři z něj mají, vcelku opodstatněný, respekt. Tento respekt je navíc znásoben výukou funkcionálního programování v prvních ročnících studia informatiky na vysokých školách.
Právě lidi s tímto handikapem ocení tutorial nejvíce a snad jim to pomůže poznat, že tento jazyk je vlastně strašně krásný a dá se používat i bez všech těch functorů a dalších šileností, které vyžadují PhD vzdělání. Kromě letitých programátorů je Haskell vhodný i pro nováčky, kteří navíc mají obrovskou výhodu v neznalosti imperativního programování.
Tutorial naleznete naleznete na tryhaskell.org.
Jedním z nejtypičtějších přístupů jak zvýšit “inteligenci” systému strojového učení, či umělé inteligence obecně, představuje dodání větší sofistikaci modelu, například přidáním expertních znalostí či nalezením lepšího algoritmu.
Naprosto opačným a opomíjeným způsobem je naopak zapomenout na jakoukoliv sofistikaci a vyjít pouze z velkého množství nezpracovaných dat, které nám ve vysledku dají lepší výsledky samy od sebe. Jedním z hlavních představitelů tohoto směru je Peter Norvig, šéf výzkumu ve společnosti Google a autor nejklasičtější knihy o umělé inteligenci. Před nějakým časem měl přednášku s názvem Models and Theories na kterou navazuje novější “Innovation in search and artificial intelligence”. Tato přednáška nepřináší zase tolik nového, takže pokud jste Models and Theories viděli a nejste velcí fandové tak ji můžete s klidným srdcem vynechat.
Všem ostatním vřele doporučuju. Navíc není příliš odborná (relativně) a můžete se dozvědět jakým kouzlem fungují některé produkty od Google: překladač, Google sets, vyhledávání obrázků či korekce překlepů. To šílené praskání mikrofonu na začátku videa přestane jakmile začne mluvit sám Norvig.
Pár měsíců zpátky jsem v Laboratoři dobývání znalostí na FI MUNI hovořil o méně známých metodách rozhodovacích stromů. Po delší době jsem se konečně dostal k upravení těchto slajdů a jejich zveřejnění.
Berte to jako takový přehled toho co existuje + náhled na datové proudy a Very fast decission trees. Právě poslední zmíněná metoda zaslouží vaši pozornost, pokud potřebujete škálovat učící algoritmy v rozsahu desítek miliónů příkladů. Nevím o žádné jiné metodě, která by tohle uměla sama od sebe.
Slidy z ostatních přednášek najdete na mém slideshare, případně přes odkaz v horní části blogu.
Poslední rok se vcelku intenzivně věnuju vývoji inteligentního softwaru na zpracovávání životopisů. Vývoj takového systému se od klasického vývoje velmi liší v několika aspektech a důraz na revoluční změny je asi nejmarkantnějsí. V klasickém vývoji napíšete jednoduchý modul, který v průběhu života různě rozšiřujete a optimalizujete. Největší zásah do existujících modulů spočívá maximálně v rozdělení na několik menších tříd. Modul se tedy v průběhu života mění evolučně.
U inteligentních systému probíhá vývoj jinak. Na začátku máte ucelenou představu o jeho funkčnosti. Napsaný modul pak slouží po určitý, většinou velmi krátký, čas a na konci jeho životního cyklu je celý kód zahozen a nahrazen jinou verzí, která funguje na naprosto jiných základech. Jednou napsaný modul se už většinou příliš nemění.
Jako takový příklad bych mohl uvést detekci duplicitních životopisů v mém systému. V první verzi jsem za duplicitní považoval pouze ty životopisy, které mají stejné URL. Jednoduchá myšlenka, která vystačila na prvních pár týdnů provozu. Naivní řešení nevydrželo dlouho a tak jsem ho jednoduše zahodil. K detekci jsem pak začal používat MD5 hashe obsahu životopisů, což odstranilo naprosto stejné kusy. V součastné době i tahle varianta přestává stačit a tak experimentuju s pokročilejší metodou na bázi podobnosti n-gramů dokumentu.
Poučení je následující: vývoj je dobré vést tak, že vytvoříte základní workflow samostatných modulů, přičemž nezáleží na tom jak dobře jednotlivé moduly fungují. Během vývoje se pak zaměřujete na jednotlivé části, kdy nevyhovující modul zahodíte a nahradíte novým, fungujícím na jiném principu. Nesnažte se tvořit chytrá řešení hned od rýsovacího prkna, protože reálný provoz vám překazí všechny počáteční doměnky. Já jsem takhle skoro dva měsíce tvořil modul fungující na bázi konečných automatů s vlastním skriptovacím jazykem, s vidinou, že se to přece bude muset hodit. Nehodilo.
Během několika dní se stěhuju a tak jsem se rozhodl trochu probrat svou knihovnu a zbavit se knih, které zrovna dvakrát nepotřebuju. Jednotná cena 100 kč za kus, preferuju osobní převzetí v Brně.
A ještě trochu scifi:
Pak tady mám pár kravin: úvod do CSS, tak 10 let stará knížečka, alchymie internetového úspěchu, nějaký krátký životopis Freuda a spisek o Číně a snad ještě něco. Přihodím, když si o to řeknete. Pište na davidfilip@gmail.com
Update: červeně označené knihy jsou už pryč.
Touto triviální otázkou začíná spousta nových setkávání, ale pokud ji pronese člověk mimo náš průmysl, tak vlastně pořádně nevím co odpovědět.
Rád bych použil slovo programátor, ale dotyčná osoba hned začne říkat, že její bratr/přítel/křeček taky umí HTML. Dále jsem zkoušel používat označení informatik, ale to si zase lidi asociují s opravováním počítačů, takže opět vedle a navíc vám budou volat při sebemenším problému s jejich počítačem.
A tak teď všem říkám, že jsem matematik a zabývám se aplikovanou matematikou na pomezí statistiky a umělé inteligence. Ne že by jim to něco řeklo, ale alespoň mají hrubou představu o tom, že jde o něco složitého a nechtějí vědět více. Jediná nevýhoda je pak automatické zaškatulkování mezi možné blázny.
Zdrojové kódy mohou být studnicí znalostí předávaných z jedné generace programátorů na další. Častěji však jde o pouze o nevyčerpatelné studnice WTF momentů. O jednom typu komentářů jsem už psal, ale protože můj předchůdce byl po všech stránkách kreativní tak se můžu dělit o další perly dál.
Tak například komentář uprostřed definice funkce:
1 | procedure foo(parametr: string {20. 1. 1998}); |
Správně: datum přidání, či snad změny, parametru, navíc uprostřed definice je vždy fajn a budoucím generacím pak přinese spoustu užitku. Podobnou kreaci lze pak vykouzlit v pokročilých obměnách, kdy je těch parametrů třeba 10 a každý druhý obsahuje jiné datum.
Druhý oblíbený typ komentáře využijete pokud chcete šetřit klávesnici:
1 2 3 4 5 | procedure foo; var p{arametr}, pa{rametr2}, d{an}, s{uma}: double; begin ... |
Hned po definici pak následovalo asi 800 řádků kódu, který zhusta prováděl různé, nepříliš průhledné, výpočty s těmito proměnými.
Občas přemýšlím o tom, jaký typ komentáře mě dokáže spolehlivě naštvat, a po dnešní práci na 15 let vyvíjeném prodkut jsem našel vítěze:
// Warning: see line 7851 !!!
Probůh, co k tomu ty lidi neustále vede?