2. listopadu 2011 ↴

Nehostinný vesmír README.TXT

Nehostinný vesmír je minimalistický prototyp HTML5 3D hry. Zahrát si jej můžete zde. UPDATE: Ke hře si můžete pustit skladbu Angry Universe od Ondřeje Václavíka, která vznikla za tímto účelem.

Naprogramování Nehostinného vesmíru mělo jediný cíl: ukázat, že za 3 večery jde vytvořit prototyp HTML5 hry, který už je aspoň minimálně hratelný. Jak jsem psal na Google Blogu:

HTML5 je právě teď možná jediná platforma, na které lze vysloveně za jeden den vytvořit něco originálního, ale přitom potenciálně masově využívaného. […] Shodou okolností je HTML5 také platforma s obrovskou uživatelskou bází, která bude v nejbližších letech jenom růst.

V současném stavu Nehostinný vesmír skoro nic neumí. Hráč se snaží kometou strefit planetu Zemi. Kometa se chová podle fyzikálních zákonů (setrvačnost, zrychlení, gravitace). Score se navyšuje za zajímavé průlety. Zcela chybí persistence, tím pádem i high scores apod. Grafika (jestli se tomu tak dá říkat) je škaredá a splácaná horkou jehlou. A tak dále.

Jako PC hra by Nehostinný vesmír byl naprosto zoufalý. Vtip je v tom, že jako HTML5 hru si jej můžete zahrát bez instalace, okamžitě, bez přihlašování, a s jakýmkoliv moderním prohlížečem (s podporou WebGL). Už z toho důvodu toho člověk takové aplikaci také hodně odpustí. To jsou v tuto chvíli dvě hlavní výhody HTML5: skoro nulová bariéra vstupu a nízká očekávání.

Jak Nehostinný vesmír vznikl:

  • Nápad trochu vychází z jedné staré edukativní PC hry, kde jste mj. měli za úkol “řídit” raketoplán orbitující Zemi. Název si bohužel nevzpomenu.
  • Při programování WebGL jsem vyšel z tohoto Three.js dema od Mr Dooba.
  • Nejvíce času mi zabralo:
    • dostat se do Three.js (tahle úžasná WebGL knihovna bohužel není úplně svědomitě dokumentovaná)
      • ale tohle se bude hodit … :)
    • vzpomenout si na různá úskalí a specifika JavaScriptu
      • od TMZNS jsem na JS nesáhl — a TMZNS jsem navíc dělal v Closure
    • odladit fyzikální model, aby byl přiměřeně hratelný a přiměřeně realistický
      • nejvíc mi dal zabrat jeden idiotský bug, který jsem si na sebe sám ušil
  • Programování mě hodně bavilo (až na ten bug, teda), což přičítám hlavně extrémně rychlé iteraci
  • Prototyp bych měl hotový o dost dřív, kdybych nebyl tak důsledný a nebral ohled na (možný) budoucí vývoj:
    • Snažil jsem se vyhnout prasárnám jako globální proměnné apod. všude, kde to šlo.
    • Přestože se hra v podstatě odehrává ve 2D (plochá sluneční soustava), kód by fungoval i v plném 3D
      • zkuste při hře dát do adresního řádku toto a stisknout Enter:
        javascript:g_game.match.level.reset();g_game.match.level.shoot();g_game.match.level.playerControlledBody.velocity.set(0,100,0);
    • Není problém jakkoliv změnit sluneční soustavu
      • Orbitujících vesmírných těles může být kolik chcete, a můžou orbitovat kolem sebe navzájem (takže například zemský měsíc by klidně mohl mít svůj vlastní malý měsíc nebo by v prostřed soustavy mohly orbitovat dvě slunce kolem společného těžiště)
      • Přidat další planetu je záležitost nalezení textury a přídání příslušného elementu do JSONu na začátku html souboru
    • V kódu se počítá s levely, s více kometami (které se navzájem ovlivňují gravitačním polem), s různě rychle plynoucím časem
    • Krokový fyzikální model si dává pozor na příliš prudké změny. Pokud je těleso v silném gravitačním poli, na pozadí se až 16x zpomalí čas.
    • A tak dále..

Moc rád bych, kdyby tenhle můj experiment někoho povzbudil k tomu také si něco vytvořit v HTML5. V českém Googlu jsme nedávno spustili soutěž Mám padla, která má podobný cíl: povzbudit lidi k napsání minimalistických HTML5 aplikací. (S tím, že uděláme “galerii” přihlášených aplikací, kterou mediálně podpoříme!) Znáte tu analogii o naskakování na ujíždějící vlak? Mám pocit, že v tuto chvíli HTML5 vlak ještě ani nevystartoval (ale už zazněla píšťalka průvodčího) .. :)

Kód Nehostinného vesmíru je k dispozici open-source zde. Nevylučuji, že se k němu už nevrátím. Budu proto moc rád, pokud kdokoliv z vás kód jakkoliv využije. Buď z toho udělá regulérní hru, nebo třeba pomůcku pro výuku fyziky.

PS: Jestlipak uhádnete, která populární hra mě inspirovala k pracovnímu názvu “Angry Universe”. :)

6. října 2011 ↴

Zájmové aktivity → zajímavější kariéra?

Uvědomil jsem si, že za všechny důležité postupy ve své kariéře (dá-li se to už tak nazvat) vděčím svým zájmům. Tedy ne tomu, co jsem kdy dělal “9-to-5” (anglosaské “od devíti od rána do pěti do večera”), ale tomu, co jsem dělal ve volném čase — po večerech a o víkendech. Přišlo mi to natolik zajímavé a úžasné zjištění, že jsem se o něj rozhodl podělit.

Příklad 1: Zájem o počítače

Můj zájem o počítače začal s knížkou Tak funguje počítač.* Nedlouho po jejím přečtení jsem začal programovat v BASICu na čtverečkovaný papír. (Programy to byly jistě pěkné, ale neměl jsem je jak otestovat.) Pak naše ZŠ koupila počítač a já se přihlásil do nepovinného kroužku. Následně jsem dostal Commodore 64. O několik let později jsem své rodiče donutil koupit neuvěřitelně drahé PC a v jeho přítomnosti strávil většinu volného času svého mládí.

Tenhle koníček mi otevřel dveře do možná nejdynamičtější oblasti dnešního pracovního trhu: informačních technologií. O žádném povinném předmětu, který jsem na ZŠ měl, se tohle říct nedá. (Což samozřejmě neznamená, že byly k ničemu!)

* Aspoň myslím, že se ta knížka takto jmenovala. Byla taková kreslená a hrdinové se v ní zmenšení procházeli po procesorech a vysvětlovali binární kód.

Příklad 2: Japonština

Ke konci gymnázia jsem se přihlásil do kurzů japonštiny. Všichni to brali jako úlet, mnozí se nahlas divili, proč se někdo v ČR učí zrovna japonsky. Sám jsem to nevěděl. Našel jsem tehdy plakátek na chodbě a připadlo mi to zajímavé.

O pár let později jsem právě díky znalosti japonštiny odcestoval na necelý rok do Ósaky. Už jenom samotná zmínka o tom, že jsem byl rok v Japonsku, mi od té doby otevřela mnoho dveří. A to ani nemluvím o všem, co jsem se pobytem v Japonsku naučil.

Příklad 3: Visible.cz

Tady pro stručnost trochu přeskakuji, ale ve své první pracovní pozici, ve firmě FAnn Retail, jsem se často setkával se samozvanými pseudo-experty na internetovou reklamu. Po večerech jsem začal vytvářet (Ruby on Rails) web, kam jsem umisťoval moudra o SEO a SEM. Později jsem tam rozjel i blog. Celý projekt jsem nazval visible.cz.

Tahle volnočasová aktivita mi později vynesla možnost školit internetový marketing pro společnost Nicom — a nepřímo pak i pozici v Googlu. Svoji 9-to-5 práci ve FAnnu jsem odváděl myslím velmi dobře, ale na další stupínek v mém profesním životě mě vyneslo to, co jsem dělal po večerech.

Příklad 4: Google

V Googlu jsem nastoupil na pozici Account Strategist — technologicky a copywritersky jsem pomáhal top klientům s jejich AdWords reklamou. Byly to skvělé 2 roky, ale moje srdce čím dál víc bilo pro něco trochu víc IT/geeky. Po večerech jsem v průběhu těch dvou let dělal na několika málo interních projektech a na několika málo vlastních věcech — vše se točilo kolem programování.

Zhruba před rokem jsem přestoupil na svoji současnou pozici, která je mnohem víc o technologiích. Pochopitelně mi k tomu pomohl i nadprůměrný výkon v “9-to-5” aktivitách, ale moje volnočasové IT projektíky měly nejméně stejný podíl.

Nejde jen o mě

Známý známého se zamiloval do leteckých simulátorů. Po práci doma létal mezi virtuální Ruzyní a Frankfurtem (a tak podobně). Koupil si drahou výbavu, profesionální joystick, atd. Dnes létá jako dopravní pilot v jedné aerolince, s opravdovými letadly a pasažéry a letuškami a Ruzyněmi a Frankfurty.

Michal Kašpárek píše články pro FinMag, Peníze.cz, MF Dnes. Ve volném čase zaregistroval doménu ŽítBrno.cz a začal na ní satiricko-recesistický projekt. Podle čeho dnes většina lidí Michala Kašpárka zná? Kvůli čemu se s ním dělají rozhovory? Kvůli ŽitBrno.

A nyní: ponaučení!

Nepovažujte své zájmy za zbytečné. Nebo dokonce za ztrátu času.

A naopak: nečekejte, že když budete excelentně odvádět svoji 9-to-5 práci, že vás to automaticky někam posune. Podle mých zkušeností dostanete maximálně přidáno, ale budete dělat jen víc toho, co děláte už teď.

Pokud by nebylo mých zájmů, a pokud bych se držel čistě jen “osnov”, osobně bych měl po VŠ problém se vůbec uplatnit na pracovním trhu. Česká republika nepotřebuje zase tolik žurnalistů s přehledem o mezinárodní politice a IT. :)

Pár důležitých poznámek

Strašně nerad bych, aby článek vyzněl jako potvrzení takového toho “vaše kariéra je pouze ve vašich rukou”. To jsou kecy. Potřebujete hodně štěstí a podpory.

  • Ne všechny zájmy jsou stejně užitečné.
    • Pokud bych se na ZŠ místo do počítačů zamiloval do akordeonu (na který jsem hrál), měl bych se dnes asi o dost hůř. I kdybych byl třeba nejlepší akordeonista v republice, můj plat by stěží dosahoval celostátního průměru. Měl jsem tehdy obrovské štěstí, že mě zaujaly zrovna počítače.
  • Kdybych nebyl na gymplu takový chcípák, pravděpodobně bych dal před PC přednost lítání po venku a za holkami. I tady jsem měl (svým způsobem) štěstí.
  • Ne každý má na koníčky peníze. Ne každý má rodiče, které mu zájmovou aktivitu zasponzorují. A v neposlední řadě roli hraje i stát.
    • Kdyby známý známého (pilot) nemohl investovat do profesionálního simulátoru a vybavení, nikdy by neopustil své 9-to-5 zaměstnání.
    • Kdyby mí rodičové neinvestovali velké peníze do rodinného (v reálu spíš mého) počítače, daleko bych to v tom IT nedotáhl.
    • Kdyby nebylo peněz daňových poplatníků za počítač na škole, programování na papír by mě asi brzy začalo nudit. Kdyby stát nedodal internet do mého gymplu, ještě dlouho bych si na World Wide Web nesáhl. Atd.
  • A v neposlední řadě: ne každý má volný čas.
    • Ok, neberu v potaz lidi, kteří nemají volný čas, protože jej vyplňují koukáním na televizi. To je jejich problém.
    • Na druhou stranu beru v potaz lidi, kteří mají například natolik fyzicky vyčerpávající zaměstnání, že po návratu domů fakt nemají na nic než koukání na bednu.
    • A samozřejmě existuje milión dalších, velmi legitimních důvodů, proč člověk nemá čas na své zájmy. Děti, nemoc v rodině, dvojitý úvazek, … atd. atp.

Ale jinak: máte zájmy? Držte se jich.

2. října 2011 ↴

Povídka – kam s ní?

Napsal jsem povídku a uveřejnil jsem ji přímo jako HTML stránku. Pak mi došlo, že jsem něco podobného už dlouho neudělal. Teď nemyslím psaní povídky (byť to jsem taky dlouho neudělal), ale uveřejnění nějakého textu přímo jako HTML stránku.

Došlo mi, že to možná znamená “návrat ke kořenům”.

Mohl jsem uveřejnit povídku jako blogpost, nebo klidně jako G+ post (maximální velikost G+ postu je něco kolem 100KB…). Mohl jsem si taky založit účet na serverech typu “poeta.cz”. Bylo by to asi rychlejší. Ale chtěl jsem mít co největší kontrolu nad prezentací. Chtěl jsem, aby se povídka i na internetu četla jako kniha, ne jako blogpost. Bez distrakcí. Pro všechny stejně. Bez nutnosti zapínat Safari Reader nebo stránku filtrovat přes Instapaper. Bezproblémově i na telefonu nebo tabletu. Chtěl jsem, aby byl text vysázen v určitém typu písma, s určitou výškou řádků, odsazením apod.

A to mi prostě žádná platforma, kterou znám, nenabídla. Přitom nebylo vůbec těžké tu stránku během hodinky napsat. Zdá se mi, že s postupující standardizací CSS a HTML to je čím dál lehčí. Největší problém jsem měl s “optimalizací” pro mobily, ale to nakonec vyřešily dva řádky:

<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, height=device-height, user-scalable=no"/>

Samozřejmě netuším, jestli se k téhle metodě ještě někdy vrátím. Možná je to slepá ulička. Ale jak nad tím teď přemýšlím, říkám si, jestli by web neuvítal publishing platformu pro delší texty, s minimem distrakcí a s maximem kontroly nad typografií. Ne tumblr, ne posterous. To jsou pořád blogy. Něco mnohem “literárnějšího”.

28. července 2011 ↴

Vyplatí se loterie?


Občas mám problémy vysvětlit někomu, jaká nebetyčná blbost je sázení v loterii. Lidé stejně nakonec řeknou něco ve smyslu "ale co kdyby to náhodou vyšlo!" Co na to má po několika minutách vysvětlování člověk říct?

"Loterie je daň za blbost", říkají někteří. Nesouhlasím. Chápu, že matematika není pro každého, a některé věci prostě nejsou intuitivní. Dal jsem si proto takové duševní cvičení: jak hloupost loterie vysvětlit co nejjednodušeji a nejvíce pochopitelně. Tady je výsledek:

Jana a Honza se oba chtějí dobrat sumy 20 miliónů Kč (tedy jackpotu Šťastných 10). Jana šetří každý den 10 Kč. Honza si každý den kupuje loterijní lístek Šťastných 10, také za 10 Kč.

Pro našetření této částky bude Jana potřebovat 2 milióny vkladů, tedy 5479 let.

Nicméně: Ve chvíli, kdy má Jana našetřeno (tedy má 20 melounů v kapse), Honza s velkou pravděpodobností (79.9%) ještě nic nevyhrál. Skóre 20 miliónů ku nule.

Aby měl Honza alespoň 50:50 šanci, že vyhraje, potřeboval by sázet 6,177,782krát, tj. až do roku 18,936 n.l. To znamená, že sázení Šťastných deset je trochu jako čekání 17 tisíc let a pak hod mincí. :)

Kdyby chtěl mít Honza skoro jistotu (99% — protože úplnou jistotu nebude mít nikdy), nezbývá mu než sázet 112 tisíc let.

Pro představu, stejný počet let uplnynul od doby neandrtálců po dnes. Za 100 tisíc let bude mnoho dnešních souhvězdí k nepoznání kvůli pohybu hvězd v Galaxii.

Poznámky pro pozorné:
  1. Jana by měla 20 miliónů samozřejmě mnohem dřív — díky úrokům.
  2. Do úlohy na druhou stranu vůbec nepočítám fakt, že Honza může vyhrát i něco menšího než jackpot.
  3. I tak by byl ale výsledek stále o mnoho příznivější pro Janu.

Příklad jsem napsal co nejprimitivněji v Pythonu, abych měl možnost měnit parametry a případné zájemce provést celou logikou. Pravděpodobnost výhry ve hře Šťastných 10 jsem vzal z bakalářské práce Ondřeje Staňka "Loterie". Samozřejmě uvítám jakékoliv opravy či připomínky.


#!/usr/bin/env python
# encoding: utf-8

import datetime
import math

jackpot = 20000000
cena_listku = 10
pravdepodobnost_vyhry = 1.122e-07 # viz http://is.muni.cz/th/78265/prif_b/Loterie.pdf, str. 14

print(u"Jana a Honza se oba chtějí dobrat sumy {jackpot:n} Kč (tedy jackpotu Šťastných 10). Jana šetří každý den {suma} Kč. Honza si každý den kupuje loterijní lístek Šťastných 10, také za {suma} Kč.\n".format(jackpot=jackpot, suma=cena_listku))

pocet_nutnych_vkladu = jackpot / cena_listku
pocet_let_jana = pocet_nutnych_vkladu / 365.0
rok_jana = int(datetime.datetime.now().year + pocet_let_jana)

print(u"Pro našetření této částky bude Jana potřebovat {pocet:d} vkladů, tedy {pocet_let:n} let.\n".format(pocet = pocet_nutnych_vkladu, pocet_let = pocet_let_jana))

pravdepodobnost_prohry = 1 - pravdepodobnost_vyhry

pocet_sazek = pocet_nutnych_vkladu
kumulativni_pravdepodobnost_prohry = pravdepodobnost_prohry ** pocet_sazek
kumulativni_pravdepodobnost_vyhry = 1 - kumulativni_pravdepodobnost_prohry

print(u"Nicméně: Ve chvíli, kdy má Jana našetřeno (tedy v roce {rok} n.l.), Honza s pravděpodobností {p:.1%} ještě stále nevyhrál!\n".format(rok=rok_jana, p=kumulativni_pravdepodobnost_prohry))

fifty_pravdepodobnost = 0.5
pocet_nutnych_sazek_fifty = math.log(fifty_pravdepodobnost, pravdepodobnost_prohry)
pocet_let_honza_fifty = pocet_nutnych_sazek_fifty / 365.0
rok_honza_fifty = int(datetime.datetime.now().year + pocet_let_honza_fifty)

urcite_pravdepodobnost = 0.01
pocet_nutnych_sazek_urcite = math.log(urcite_pravdepodobnost, pravdepodobnost_prohry)
pocet_let_honza_urcite = pocet_nutnych_sazek_urcite / 365.0
rok_honza_urcite = int(datetime.datetime.now().year + pocet_let_honza_urcite)

print(u"Aby měl Honza alespoň 50:50 šanci, že vyhraje, potřeboval by sázet {pocetf:d}krát, tj. až do roku {rokf} n.l. Kdyby chtěl mít skoro jistotu (tj. 99%, úplnou jistotu nebude mít nikdy), nezbývá mu než sázet {let} let.\n".format(pocetf=int(pocet_nutnych_sazek_fifty), rokf=rok_honza_fifty, let=int(pocet_let_honza_urcite)))


Ještě krátká varianta jako "matematický příklad":

Člověk sází 10 Kč denně na Šťastných 10. Jak dlouho musí sázet, aby měl šanci 50:50 (hod mincí), že vyhraje jackpot? Odpověď: 17 tisíc let.


23. července 2011 ↴

Sociální média ≠ hustopřísná revoluce


Aby bylo jasno: Ano, sociální média rozhodně mění vztah "velkých" (např. firmy) a "malých" (jednotlivci). Už jenom proto, že hodně lidí dnes může velmi lehce a zadarmo publikovat svůj názor tak, aby byl dostupný všem. Mediální pole se trochu srovnalo a zdemokratizovalo. Souhlas. A je to tak dobře a je to přirozený vývoj (který začal někdy s vynálezem knihtisku).

Někteří lidé ale dle mého názoru trochu ztrácí perspektivu a považují sociální média za naprostou bombič hustokrutou revoluci, která mění úplně všechno od základů. Narážím na rétoriku, jakou najdete v infotainment videích, jako je toto:



Určitě jste už viděli několik podobných, nebo to samé slyšeli na konferenci nebo na obchodní schůzce. Co se mi na tom nelíbí? Vždyť ta čísla hovoří jasně! Jo, ale autoři úplně splošťují vliv sociálních médií. To v lepším případě. V horším případě ho cíleně nafukují.

Abych byl konkrétnější, zvolím si jednu obzvlášť oblíbenou ideu. Týká se komunikace mezi firmou a zákazníkem. Zní asi takto: firmy konečně komunikují se spotřebitelem. Poprvé v historii od něj dostávají zpětnou vazbu. Sociální média jsou jejich šancí vyslyšet ty "tam venku". Komunikace many-to-many dnes střídá staré a zkomírající one-to-many.

Vážně? Jsem si celkem jistý, že firmy (aspoň ty úspěšné) vždy naslouchaly zákazníkům.
  • Spotřebitelské výzkumy. Jakkoliv to slovní spojení nezní moc sexy, dobře udělané výzkumy jsou pořád ještě mnohem validnější zpětná vazba než tweety nebo statusy.
    • Dobře udělaný kvantitativní výzkum ukazuje reprezentativní rozložení názorů v cílové skupině. Názory na sociálních sítích reprezentativní nebývají. Zkreslení vychází nejen z omezené skupiny lidí, kteří jsou na dané sociální síti, ale ještě menší skupiny těch, kteří jsou ochotní bavit se o značkách, a ještě menší skupiny témat, které dotyční chtějí na sociální síti řešit. Jak často vidíte někoho na sociální síť napsat: "Dnes jsem si nekoupil Snickers, protože jsem tlustý" nebo "Pohádal jsem se s přítelkyní po telefonu, ale přenos zvuku byl skvělý. Bravo Vodafone!"?
    • Dobře udělaný kvalitativní výzkum jde více do hloubky než feedback ze sociálních médií. Nikdo nemůže čekat, že z jednoho či dvou tweetů vytáhne víc informací než z hodinového interview. Jak říkal Henry Ford: "Kdybych se zeptal lidí, co chtějí, řekli by mi 'rychlejšího koně'." Kdyby se ale zeptal pořádně (a já jsem si jistý, že to udělal), rozhodně by se dozvěděl víc. Jak píše Roger L. Cauvin: "[Consumers] are not experts on the features or solutions; they are experts on their experiences and challenges.".
  • Prodej, tržby, tržní podíl, apod. Vzhledem k tomu, že na těchto číslech závisí budoucnost každé firmy, každý si je hlídá velmi pozorně.
    • Tady postačí příklad: nikdy jsem nikam veřejně nenapsal, že mám rád Margotku. Až do teď nebylo proč. Svoji náklonnost k téhle cihle plné kalorií ale dávám najevo tím, že si ji prostě jednou za čas koupím. Asi nemusím rozvádět, že takový způsob komunikace se zřejmě Orionu dost zamlouvá (zvlášť pokud to nedělám jenom já).
  • Zákaznická podpora. Ze všech těch revolučních řečí o sociálních médiích může člověk dostat pocit, že jediný způsob, jak se firma dozví o tom, že je něco špatně, je z Twitteru. Ve skutečnosti mnohem víc reálných problémů reálných zákazníků lze nalézt v soukolích zákaznické podpory (viz tenhle článek od eMarketeru). Ne každý chce například své technické problémy řešit veřejně.
    • Problém nastává, když zákazník žádnou zákaznickou podporu nedostane, a postěžuje si na to na sociální síti. Pak musí firma problémy jednoho člověka řešit na očích všech ostatních. (A v tomto jsou sociální média hustopřísně revoluční!)

Ještě než kliknu na tlačítko "Publikovat", rád bych zopakoval, že sociální média považuji za zásadní. Věřím například tomu, že umožnily Arabské jaro a že si ještě přičtou spoustu skalpů z řad nedemokratických hlav států. Vím také, že mění každodenní život nás všech, a že přetváří komunikaci mezi zákazníky a značkou.

Ale není to taková revoluce, že bychom měli briskně zapomenout na všechno ostatní.

3. června 2011 ↴

Jak jsem naprogramoval TMZNS

Často přepočítávám časy v různých časových zónách. Někdy je to kvůli plánování dálkových konferencí, telefonátů, apod. — v tom pomáhá Google Calendar, který vše přepočítává automaticky. Častěji jde ale o mnohem primitivnější záležitosti:

  • Když mí kolegové v New Yorku něco vypustí v 9 ráno, kolik bude u nás?
  • Má teď cenu volat (nebo spěchat s emailem) do Indie? Do Japonska?
  • Když bude živý přenos z konference v Austrálii, kolik budou mít tou dobou v San Franciscu? A u nás?

Tady je Google Calendar krátký — nebo lépe řečeno “dlouhý”, protože byť v něm takové věci můžu zjistit, je to poměrně na dlouho. Jaké jsou další možnosti? Když hledáte v Googlu třeba time in tokyo, distanete odpověď, ale pouze o aktuálním času. Nejblíž k tomu, co potřebuji, je timeanddate.com, ale tam mě neskutečně nasírá jejich uživatelské rozhraní. Za drop-down menu s tři sta šedesáti šesti (!!!) položkami bych střílel. (Později jsem našel ještě mnohem použitelnější WorldtimeBuddy a EasyClock, ale i tady bych se dostával k požadované informaci zbytečně složitě a úplně nestandardním rozhraním.)

Osobně věřím, že pro textový vstup je pořád ještě nejlepší volbou — světe div se — klávesnice. Ideálně s auto-complete. Chtěl jsem rozhraní, kde bych mohl zadat: “9” → tab → “h” → enter → tab tab → “new y” → enter — a měl bych hotovo. 10 vteřin max. Místo toho jsem dostával samé klik → scroll scroll scroll scroll → klik → klik → scroll scroll → klik … a teď zadáme čas … klik → klik … oops, vedle … klik … → klik. Hotovo uff! Teď už jen kliknout na Convert time a počkat až se načte stránka. Co když chci změnit zadání? No přece zmáčknout link “Make changes to the current search” a klikat a klikat… Co když nedej bože potřebuji upravit druhý čas a zjistit, jak se to projeví na prvním? Vše znova.

Uznávám, že můj přístup je možná trochu specifický. Spousta lidí raději kliká. Ale napadlo mě, že by snad nebylo tak těžké něco takového naprogramovat a uveřejnit to na internetu. Krom toho jsem měl zrovna absťák z programování a hořel jsem touhou vyzkoušet Traceur. A taky Chrome Web Store.

A tak po večerech vznikl TMZNS. Začal jsem cestou na Google IO (7. květen) a první verzi “uveřejnil” 1. června.

Bylo to (samozřejmě!) víc práce, než jsem čekal. (Klasický příklad uvažování typu “tohle by přece mělo být jednoduché!”) V časových zónách je nicméně bordel: rozhodně nejsou jen po hodinách, nejsou rozloženy lineárně, ani po státech, každý si přehazuje letní čas, kdy chce, někteří víc než dvakrát ročně, atd. atp. Více info na Wikipedii.

Tvorba web aplikace mi trvala déle mj. proto, že jsem si toho chtěl co nejvíc vyzkoušet. Slibný Traceur jsem po chvíli vzdal, ještě v něm totiž není implementována žádná UI knihovna. Programování v Pythonu na AppEnginu jsem začal, ale velmi brzy jsem se vydal cestou “vše u klienta” — tedy JavaScript. AppEngine využívám, ale funguje jako bezplatný, velmi rychlý a nezničitelný webhosting (s tím, že je tam prostor na nějaké jednoduché API nebo aspoň statické URL typu tmzns.com/london/newyork do budoucna).

Následoval výběr JavaScriptové knihovny. Nejprve jsem automaticky sáhnul po jQuery, ale pak jsem se zamiloval do Closure Library. O výhodách i úskalích Closure a kompilovaného JavaScriptu se chci rozepsat na českém Google Blogu, takže si tady nechci vystřílet střelivo.

Po tom, co stránka začala jakž takž fungovat, jsem nasadil stylovací nástroj CSSEdit. Podle mě nejlepší způsob, jak “malovat” stránku v CSS. (CSSEdit jsem použil i při designu tohoto blogu.)

Protože je TMZNS open source projekt (zdrojáky tady), seznámil jsem se také blíže s Google Project Hosting a s Mercurialem (rozhodně doporučuji nad SVN, alespoň pro projekt tohoto typu).

TMZNS je web aplikace (která navíc využívá CSS3 a nejlépe vypadá v moderních prohlížečích), dávalo proto velký smysl ji dát na Chrome Web Store jako “aplikaci”. S nástrojem AppMator od kolegy Paula Kinlana to byla záležitost pár minut — i když to znamená, že v tuto chvíli “aplikace” není nic jiného, než bookmark k www.tmzns.com. Aplikace i s daty má totiž přes 7MB — a takové monstrum s tak jednoduchou funkcionalitou se fakt zdráhám někomu nahrávat na harddisk. Třeba se jednou dostanu k tomu tu velikost radikálně sesekat (“mělo by to být jednoduché”).

Aplikace mi už zdárně slouží a zdá se, že se líbí i ostatním. Na Project Hostingu už jsem (doufám zdárně) uzavřel svůj první, byť kosmetický issue. (Mimochodem, je neuvěřitelné, jak rozdílné je zobrazování barev na různých monitorech — původní “subtle” zvýraznění na některých monitorech vůbec nebylo vidět.).

Mám radost z vlastní tvorby i z naučených technologií. Takové projektíky si budu dávat častěji.

8. května 2011 ↴

Kterak Filip přes velkou louži přeletěl a velká nebezpečenství v San Franciscu postoupil (část 1.)

Toto píši z hotelového pokoje v San Franciscu, v neděli 8. května ráno pacifického času. Je to jeden z těch článků, které slouží spíš jako externí paměť autora-zapomětlivce než jako cokoliv jiného.

Z Paříže do San Francisca je to kolem 9000 km a asi 12 hodin letu, ale protože letíte se sluncem, hodinky se vám posunou jen asi o 2 hodiny. Minulý let s takovou vzdáleností (LA-Praha) měl na můj organismus dost drastické následky, tak jsem se tentokrát chtěl pojistit. V návodech proti jetlagu vždy píší, že si člověk hned po vzletu má nařídit čas destinace a od té chvíle se chovat, jako by byl tam. V mém případě: v 7 ráno v Praze si nařídit 10 hodin večer, po přesednutí v Paříži zalehnout a spát. Ale jak se prý říká mezi boxery: “Každý má plán, dokud nedostane první ránu přes držku”. V mém případě: prostě nešlo usnout, a to jsem měl takový ten nafukovací polštář kolem krku a clonu na oči.

Další obrana proti jetlagu: vypít v letadle ~1 litr vody na hodinu letu. Fakt, že hodně chodíte na záchod se zároveň postará o to, že vám nezdřevění celé tělo. Koupil jsem si tedy 1.5l vody na letišti a plánoval jsem si často říkat o čaj apod. Realita: seděl jsem v prostřední řadě mezi dvěma pány, z nichž ten bližší vypadal, že jestli ho budu moc otravovat, vyhodí celé letadlo do povětří (seděl celou dobu v dlouhém černém plášti), a druhý sice neseděl v dlouhém černém plášti, ale také se na mě netvářil moc nadšeně. Jo, a oba skoro celý let spokojeně spali. Strašně nerad někomu působím nepohodlí, takže jsem vypil akorát těch 1.5 litru a dvakrát za let jsem si odskočil, pokaždé přes jiného pána. :)

Po příletu do San Francisca se zjistilo, že moje check-in zavazadlo zůstalo v Praze (problém s pojízdným pásem, který se nějakým záhadným způsobem dotkl pouze mého zavazadla). Přiletí až dnes (v neděli) odpoledne. To znamená, že mám s sebou jen příruční batoh. Žádné náhradní oblečení, a to jdu dnes odpoledne na BarCamp a na večeři s lidmi z GTUGů. Naštěstí se mnou letěl Pavel Kasík, který se zmínil o tom, že aerolinky musí poskytnout peníze na oblečení v případě, kdy člověk někam dolítne a nemá co na sebe. Forwardnul jsem tu informaci paní za přepážkou. (Abych byl fér, paní z Air France byla příjemná a pravděpodobně by se k tématu dostala i bez mého všetečného dotazu.) Zjistilo se, že člověk má v takové situaci právo na utracení až €100 za oblečení — a částka mu bude proplacena. Navíc mi paní podala tyhle epesní mikro-hřebeny a mikro-kartáčky, mikro-deodoranty a mikro-krémy na obličej. Velká paráda.

Po příjezdu BARTem do centra San Francisca (Market & Powell) jsem s povděkem zjistil, že město je stále stejně živé a šílené, jako když jsem jej v lednu opustil (moje první výprava do US). Prošel jsem kolem slavného člověka s cedulí “Jesus Christ Loves You” a několika hiphoperů s boomboxy, a ubytoval jsem se v hotelu Triton. Zkuste si představit veskrze hippie hotel — s barevnými chodbami, gay recepčním a escherovský schodištěm — vaše představa žije, hned vedle slavné brány do Chinatownu.

Odpoledne jsem na doporučení gay recepčního zašel nakoupit bundu, triko a košili do místního H&M. Tohle je výsledek (nemyslím ten zamračený ksicht, ale to, co mám na sobě). Pak jsem se najedl výborného japonského menu (za velmi příznivou cenu) v nenápadném čínském bistru v Chinatownu. Byl jsem tam už v lednu, takže jsem šel na jisto.

Po návratu na pokoj jsem chtěl ještě pracovat, ale po chvíli jsem to vzdal a lehl. Šel jsem spát někdy kolem osmé, 24,5 hodiny ranním stávání v Praze. Vstal jsem v 5 ráno — a tento text je způsob, jak jsem se vypořádal s časem, kdy je venku zima a všude je zavřeno. Teď už ale hurá do ulic!

Pokračování (možná) příště.