Uložená hesla v prohlížeči rozhodně nejsou v bezpečí

Na Lupě vyšel článek Hesla uložená v prohlížeči Chrome lze získat „až překvapivě snadno“. Hned mě napadlo, o čem to bude. Je tomu nedávno, co jsem si všiml, jak snadno si lze hesla v nastavení prohlížeče přečíst. Tím jsem si ještě více potvrdil, že je dobré k mému prohlížeči nepouštět nikoho bez plné důvěry.

Zamýšlel jsem, proč je vůbec něco takového možné. Je mi jasné, že heslo je stejně někde v podobě, která lze rozšifrovat. Musí, jinak by celá funkcionalita byla k ničemu. V horším případě je někde v plain textu (což v případě Chrome neplatí; data jsou šifrována). Přeci ale není důvod to nechat přečíst kde komu na vyžádání bez jakékoliv crackovací utilitky. Nebo by to alespoň mohlo být skryto za nějaké master password…

Pak mi to ale došlo. Je úplně jedno, jestli jsou uložená hesla v prohlížeči nějak šifrována, jestli jdou či nejdou zobrazit nebo jestli jsou chráněny s master password. Vše je irelevantní díky konzoli. Stačí otevřít stránku, nechat si heslo předvyplnit, otevřít vývojářskou konzoli a napsat document.getElementById("somepasswordinput").value a voilà! Existuje i varianta pro nefanoušky JavaScriptu: otevře se konzole, klikne se na tlačítko přihlásit a podívá se, jaká data v POST požadavku odešla.

Pro jistotu znovu: jakkoliv šifrovaná a zaheslovaná uložená hesla v prohlížeči lze zjistit snadno. Stačí mít na chvilku přístup k prohlížeči.

Proto si myslím, že Google dělá dobrou věc. Možnost zadat master password ve Firefoxu akorát vyvolává falešný pocit bezpečí. Opravdu jsem si kdysi dávno myslel, že s master password je vše v pořádku. Až s Chromem jsem zjistil, jak moc jsem se mýlil.

P.S.: Jestli má vůbec smysl řešit hesla, když se mi někdo dostane k počítači, kde jsem všude přihlášen. ;)

Skutečné nebo falešné 3D?

Filmy, které za to stojí, rád podpořím návštěvou kina. Pokud jsou ve 3D, chci využít dnešní doby a zajít rovnou na daný film ve 3D (i když se třeba nejedná o IMAX). Co mě však vytáčí je, že ne všechny filmy jsou skutečně natáčené s třetím rozměrem, nýbrž pouze použita počítačová technika na zpětnou konverzi.

Posledně si vybavuji Star Trek Into Darkness na který jsem šel dokonce do IMAXu. Zažil jsem úchvatný trailerový a reklamový úvod, který v obyčejném kině prostě nezažiji (myslím propracovanost třetího rozměru). Pak ale začal film… a celé nadšení, že sedím po dlouhé době opět v IMAXu, vyprchal. Film se mi líbil, počítačové scény i s konverzí nevypadaly zle, ale normální scény s lidmi byly prostě placka. Přesto, že jsem si podívanou užil, lituji za drahou vstupenku, když jsem mohl navštívit klasické 2D promítání a být stejně spokojen. Od filmových studií to beru jako podvod a nezaslouží si na tom vydělávat.

A taky že už nebudou. Nedávno jsem totiž narazil na bezvadnou webovou stránku, kde jsou dva seznamy – jeden seznam s filmy se skutečným 3D a druhý s falešným. Během vteřiny se mi stránka dostala do záložek: http://realorfake3d.com

Například díky tohoto seznamu nyní vím, že na Wolverine stačí zajít na klasické 2D promítání, kdežto od dalšího Hobbita opravdu dostanu 3D. :)

Co mi vadí na Pythonu

Občas mě kamarád poprosí o pomoc se zapeklitým problémem, většinou v PHP. Přijdu, pomůžu vypátrat a nezapomenu zmínit, jak je PHP nelogické, nekonzistentní, plné WTF momentů a jak jsem rád, že jsem tento svět opustil. Dokonce jsem kamaráda nahlodal natolik, že si začal o Pythonu číst. Zajímalo ho ale taky, když mám tolik výtek k PHP, kolik a jaké výtky mám k Pythonu? To mě trochu zarazilo, nikdy jsem o tom nepřemýšlel. A na nic se mi nedařilo přijít. Nevzdal jsem se, vytvořil si prázdný texťák a postupem si zapisoval co se naskytlo. Výsledkem je následující seznam…
  • Výchozí parametr ve funkci/metodě se vyhodnotí jednou při kompilaci, nikoliv při volání. Tedy pak vzniká tento problém:
>>> def foo(l=[]):
...     l.append(42)
...     print l
... 
>>> foo()
[42]
>>> foo()
[42, 42]
  • Datový typ bool je ve skutečnosti také int. Při podmínkování na datový typ se nesmí zapomenout nejprve zjišťovat, zda se nejedná o bool a teprve potom o int. Tím to nekončí, jsou tu další zajímavé vedlejší účinky:
>>> isinstance(True, int)
True
>>> True + True
2
>>> {1: 'one', True: 'true'}
{1: 'true'}
  • Líbí se mi, že si lze pomoct závorkami zalomit text bez nutnosti použití ošklivých zpětných lomítek. Bohužel to s sebou přináší možnost vznik chyb, které se velmi těžko hledají…
>>> t = ('a', 'b' 'c')
>>> len(t)
2
>>> # Tohle je ale fajn.
>>> (
...     'some very long '
...     'sentence...'
... )
'some very long sentence...'
  • Také se mi líbí, že tuple lze zapsat bez nutnosti závorek (tím pak lze zapsat například for k, v in d.items()). Jen když se někde nechtěně objeví čárka nebo se naopak na ni zapomene…
>>> 2,
(2,)
>>> (2)
2
  • Je fajn, že se mohu vybrat svobodně mezi tabulátory a mezerami. Co už ale fajn není je, že mix je povolen. Když se pak otevře soubor na chvíli v jiném editoru a nevšimnu si špatného nastavení, Python mi nezahlásí SyntaxError.
  • Chápu důvod, proč se musí explicitně k metodám psát self. Ale, opravdu by to nešlo bez toho? Nejednou jsem zapomněl self napsat.
  • Relativní importy jsou skvělá věc, ale limituje to v použití názvů. Aneb naštve když mě konečně napadne skvělý název pro soubor s mojí super třídou a o chvilku později zjistím, že mi to koliduje s nějakou knihovnou, kterou používám. To lze tedy potlačit direktivou from __future__ import absolute_import nebo použitím Pythonu 3, takže už to není takový problém.
  • str a unicode. Kolik chyb tohoto problému jsem viděl! Kéž by všichni psali tak, aby byl všude unicode a převode na str jen naprosto v nutném případě. Naštěstí tohle řeší Python 3.
  • Naneštěstí použití Pythonu 3 není tak jednoduché. Nekompatibilita je nekompatibilita a tak ne všechny používané knihovny zmigrovaly. Což je u větších projektů dost limitující (vždycky se najde knihovna, kvůli které přejít nelze).

A to je vše, víc mě nenapadá. Celkově mám Python velmi rád. Možná proto, že je to rebel; kamarád mi řekl, že Python mění jeho svět programování. Jinde jsou totiž podobné zápisy vyhodnoceny jako syntax error. Aneb díky Pythonu se mohu soustředit více na problém, který řeším, a nepřemýšlet, jak něco napsat.

Základ webové analytiky

Vždy jsem žil s vědomím, že webová analytika není nic složitého. Jednoduše se u Google Analytics zaregistruje účet, vygeneruje se JavaScrtiptový kód a… a hotovo. Měří se. Co víc je potřeba? Předgenerované grafy už ukáží vše potřebné. Návštěvnost. Kdo na moji stránku odkazoval. Jaký operační systém a browser byl použit. Dokonce ještě víc.

Jenže to jsem se ještě nikdy nestaral o web, který má vydělat. Vše se změnilo s BOObook.cz, kde jsem začínal mít otázky typu „proč vidím v administraci tolik opuštěných košíků?“ Navštívil jsem administraci Google Analytics a přemýšlel, jestli se tam něco dozvím. Samozřejmě jsem se dozvěděl velké kulové, protože jsem nevěděl kde a co hledat. V tento okamžik jsem si řekl, že je na čase si přečíst něco o analytice.

Ještě než ze mě stihlo vyprchat nadšení pro čtení, okamžitě se mi do ruky dostala kniha Webová Analytika 2.0: Kompletní průvodce analýzami návštěvnosti. Ve stručnosti bych tuto knihu popsal asi takto: chyba, že jsem ji nechal jen tak válet u spolubydlících v knihovničce a nepřečetl jsem si ji už dřív. (Možná to nebude knihou, spíš že jsem nechal toto téma tak dlouho bez bližšího prozkoumání.)

Jen letmý náhled do problematiky mi rychle otevřel oči a po nijak náročném nastavení analytického nástroje jsem začal mít ty správné otázky. Pravděpodobně ne ty správné, ale minimálně správnější než dříve. Původní otázka se mi přetransformovala do podoby: „proč tento uživatel přišel na toto klíčové slovo, dostal se na tu správnou stránku, vložil knihu do košíku a nedokončil nákup? Kolik dní průměrně trvá od první návštěvy po konverzi? Byl tu už tento návštěvník znovu?“ To jen díky pár stránkám knihy a sledováním správných reportů správným způsobem.

A o tom zde chci mluvit. Předat základní tipy někomu dalšímu jako já – někomu, kdo se o webovou analytiku nemusí zajímat naplno, ale přesto potřebuje znát základní věci a nemá chuť číst jakoukoliv knihu o tématu.


Bounce rate (nebo také míra opuštění). Velmi důležité číslo. Je dobré toto číslo držet nízko, protože se jedná o procento návštěvníků, kteří přišli a hned zase odešli. Proč se tak stalo může být spoustou okolností:
  • Návštěvník mohl přijít na špatné klíčové slovo. Pak je potřeba zvolit vhodnější texty, aby nelákali na něco, co není pravda.
  • Pokud zdroj návštěvnosti vedl z reklamy – co reklamní text, koresponduje s webem?
  • Na kterou stránku se návštěvník dostal – není web náhodou blbě strukturován a vyhledávač ho poslal na špatnou stránku? Neposíláte lidi na homepage místo na konkrétní stránku (lidé hledat nebudou)?
  • Nepřišel návštěvník z mobilu? Co třeba datová velikost, nedošel návštěvníkovi po čase načítání FUP?
  • Je také pravděpodobné, že si návštěvník jen otevřel záložku ráno a dostal se k ní až večer.

Je tu spoustu otázek, které vedou na zajímavé reporty. Inspirujte se a naklikejte, co se hodí. Minimálně je však dobré bounce rate hlídat, občas se proklikat do střev analytického nástroje, najít odpovědi a případně problémy rychle vyřešit.

Slyšel jsem však, že v případě e-shopu je bounce rate 30 % velmi dobré číslo, pod které je těžké se dostat. Hodně taky záleží na typu aplikace; v případě LunchtimeAnděl.cz mám bounce rate kolem 90 % (vůbec se divím, že číslo není ještě vyšší). Tedy jinými slovy chci říct – před stanovením závěru dosadit čísla do kontextu. Někde to může být dobře, jinde nikoliv. (Dosadit čísla do kontextu by se měly dělat pro celou webovou analytiku, nejenom bounce rate.)

Už jsem se tedy zmínil o landing page (vstupní stránka). Pokud návštěvník neprovedl žádnou konverzi, či dokonce ihned zavřel okno prohlížeče, landing page může prozradit, které stránky jsou problematické a je potřeba je upravit. Snad všichni dobře víme, že každá stránka musí jasně říct, o jakou webovou aplikace se jedná, kde se v rámci aplikaci nacházím a co tam mohu dělat, resp. k čemu daná stránka slouží. Najděte ty problematické!

Z jedné strany je landing page, ze strany druhé je exit page (výstupní stránka). Osobně nevím co mi může říct skvělého, takže exit pages nesleduju. Exit page lze však například v případě e-shopu využít na sledování opuštěných košíků. Mám report, kde vidím všechny návštěvy, které zavřeli okno prohlížeče na stránce s košíkem. Tyto návštěvy dále mohu zkoumat – z jakého zdroje přišly, na jaké klíčové slovo, jaká reklamní kampaň, … a mohu se dozvědět, co jsme udělali špatně.

Když už jsem to nakousl, budu pokračovat s traffic source. Oblíbil jsem si v této skupině takovéto grafy a tabulky:

  • Graf se zdrojem, kde vidím, zda se jedná o přímí přístup, z vyhledávání, z placené reklamy nebo z přátelených webů či sociálních sítí.
  • Přes jaká klíčová slova se návštěvník na web dostal (občas se člověk dobře pobaví, například „erotické povídky ve formátu .prc“).
  • Na kterou stránku byl odkázán (viz výše, jen si odfiltrovávám přímé přístupy).
  • A z jakých oblastí návštěvníci jsou.

K tomu přímému přístupu bych chtěl přidat, že takové návštěvy jsou důležité. Jedná se totiž o takové lidi, kteří mají web v záložce, zapamatovali si ho nebo dostali doporučení od známého a podobně. Tedy samé pozitivní přístupy.

Další zajímavá metrika je jak dlouhé návštěvy jsou – engangement. Sice nejsou moc přesné (stačí si uvědomit, že uživatel mohl při brouzdání webem dělat ještě něco jiného – třeba pracovat :)), ale stejně mě toto číslo zajímá. Mám alespoň představu jestli jsem uživatele zaujal natolik, aby na mé stránce zůstal déle.

Pokud porovnám LunchtimeAnděl.cz a BOObook.cz – více strávíme výběrem knih než výběrem jídla. Musím ale upozornit, že pokud uživatel navštíví pouze jednu stránku, délka návštěvy je nula. Nic. Což v případě jídelníčku dosti zkresluje čísla.

Conversions (konverze). Vlastně to nejdůležitější. V ideálním světě by conversion rate byl 100 % a byli by šťastní všichni návštěvníci i autoři webové aplikace. Konverze znamená, že návštěvník našel, co hledal. Ať to bylo už cokoliv. S konverzemi se pojí cíle (goals). Určitě doporučuji si sednou, zamyslet se co je vlastně smyslem webu (to by tedy mělo být jasné než se začne web vyvíjet!), sepsat to, zadat do analytického nástroje a začít měřit, že web opravdu splňuje, co má.

Pro elektronický obchod je jeden cíl jasný – provedení nákupu. Tím to však nekončí, cílů může mít každý web spoustu. Pro inspiraci popíšu cíle pro BOObook.cz:

Jeden cíl jsem zmínil, dalším je proklik na stránku s informacemi o obchodě. Kontakt, o nás, nebo jakákoliv podobná stránka sdělující informace. Proč něco takového může být jako cíl? Nu protože zákazník mohl přijít jen omrknout kde máme pobočky (to tedy není náš případ) nebo sehnat e-mailovou adresu či telefonní číslo, kde se může optat na další informace. Může se to brát i tak, že se zákazník o nás zajímá.

Jelikož newsletter je stále nejlepší lákadlo pro provedení dalšího nákupu, máme další užitečný cíl. Třeba zákazník neprovede ihned nákup, nebo si nepřečte nic o nás, ale zato se přihlásil k odběru novinek a máme tak ještě lepší příležitost mu nabídnout něco, co neodmítne. Proto pouhé přihlášení k newsletteru má velkou hodnotu a zasloužený cíl.

U některých e-shopů může být zajímavé nastavit si jako cíl založení účtu. Pokud si uvědomíme, že sami si jen tak nikde účet nezakládáme, pravděpodobně založení účtu je dobrá věc, která by měla být započtena jako konverze.

Myslím si, že pokud bude zákazník na našem e-shopu déle než několik minut, jedná se také o konverzi. Protože web pravděpodobně zákazníka nevyděsil a je šance, že si za strávenou dobu na webu zapamatoval i náš název nebo si nás stihl poznamenat. Je to ale trochu ošemetné – co když návštěvník jen něco hledal, nemohl to najít a nakonec odešel rozhněván a už se nevrátí? To pak výhra rozhodně není. S tím se musí počítat, brát číslo s rezervou a aktivně v haldě dat hledat nespokojené tváře.

Jelikož BOObook.cz obsahuje knihy zdarma volně ke stažení, pro nás cíl je i když si návštěvník knížku stáhne. Přeci jen to byl jeden z důvodů, proč web máme. Pro sledování takového cíle je potřeba nová metoda – events. O tom později.

To jsou všechny cíle. Nyní mi stačí otevřít cíle a hned vidím, kde máme nedostatky a na co se zaměřit. Inspirujte se, ale nekopírujte. Každá aplikace (i e-shopy) se potřebují zaměřit na něco jiného. Záleží o co se jedná, co je smyslem aplikace a co přinese peníze. Například pro LunchtimeAndel.cz nemám žádné cíle. Resp. zajímá mě pouze návštěvnost a že aspoň někdo využívá funkci náhodného jídla. :)

Jako třešnička se hodí sledovat použité technologie pro dosažení webové aplikace. Tím se dají zodpovědět otázky typu „má smysl dělat další optimalizace pro mobilní telefony?“ případně „pro jaké mobilní rozlišení je potřeba to nejvíce vyladit?“ nebo „mohu použít featury, které jsou až v IE10?“ apod.

Events (události). Díky událostem nabízí webová analytika spoustu dalších zajímavých možností. Integrace je velice jednoduchá, v případě Google Analytics stačí jen přidávat do pole _gaq další položky. Nejlepší bude asi příklad:

Pokud má web vyhledávání, je velmi užitečné sledovat co návštěvníci hledali a nebyly nalezeny žádné výsledky. Autor webu může zjistit, že mu například vyhledávání nefunguje nejlépe, nebo zjistí, jaký obsah návštěvníci chtějí a snažit se ho sehnat. Jak s daty naložit pak záleží případ od případu. A jak něco takového dostat do Google Analytics? Jednoduše přidáním řádku JS kódu:

gaq.push(['_trackEvent', 'Search', 'ZeroResults', 'there is nothing for this query']);

Více o zaznamenávání událostí v Google Analytics přesměrovávám do dokumentace.

Tím se mohou sledovat různé věci, třeba stažení knih, které nepřesměruje na žádnou děkovnou stránku, přes kterou by se stažení zaznamenávalo.


Toť vše.

Ve skutečnosti se nejedná zdaleka o vše. Jen o naprostý základ. Dál ale nemá smysl, abych něco psal, protože o webové analytice moc ještě nevím. Raději si běžte přečíst nějakou knížku od někoho zkušenějšího, třeba tu Webovou Analitiku 2.0.

Výběr přednášek z Google I/O 2013

Sice trochu pozdě, ale přeci jen. Aneb když se zapomene blogpost v „draftu“ a zapomene se publikovat.

Na Google I/O 2013 mě zajímaly hlavně novinky z webových technologií, takže jsem pobýval převážně v sále 10, ve kterém právě takové přednášky probíhaly. Byl jsem se podívat i jinde, na Google Glass (přednášku Developing For Glass nedoporučuji  moc nového se z ní člověk nedozví a ten přednášející mě iritoval s jeho humorem), na Android, YouTube, Google+ a další. Žádné přednášky z těchto sekcí mě však nezaujaly tak, jako ty z webových technologií. Možná mě už jen unavuje poslouchat u každé Android přednášky kolik lidí si aktivuje nový Android telefon právě teď a tak podobně.

Trochu mě překvapilo, co se na webu vše děje. Sice toto téma aktivně sleduji, ale stejně jsem byl překvapen, co se to všechno doslýchám.  Což je tedy dobře! Přeci jsem nejel takovou dálku jen abych si poslechl, co už dávno vím. Nu a tady níže je seznam videí, které podle mne stojí za zhlédnutí! Tak hezký víkend.

Nejprve dvě přednášky o Web Components…

…poté jedna odlehčující přednáška na téma dotykového webu…

…a nesmí se zapomenout na nějaké optimalizace. Všichni přece chceme rychlý web.

Tak nám zrušili Posterous

Co se dá dělat, musím o dům dál. Na jednu stranu mě to štve, protože se nechci starat o nějaké převody dat. Na stranu druhou naopak převedu svoje texty konečně (snad) na něco použitelnějšího. Totiž, nevím zda to bylo pouze u mne, ale Posterous se mi načítal neúnosně dlouho a ve webovém rozhraní se mi nepracovalo zrovna nejlépe.

Hledal jsem tedy službu, kam se přesunu. Podíval jsem se na ty profláklé – Blogger a Wordpress. Říkal jsem si, že Blogger by to mohl vyhrát. Přeci jen to je Google, od kterého používám spokojeně spoustu služeb. Ale nevyhrál. A ani Wordpress. Služby se mi nelíbí, nemluvě o složitosti převodu.

Není tedy asi divu, že jsem si založil účet na Posthaven. Líbí se mi to mnohem více, než Posterous. Vychází to z něj. Slibuje věčnost. Import Posterousu je na jedno kliknutí úplně se vším. Paráda. Doporučuju zkusit, pokud jste na Posterous a ještě nemáte převod zařízen. Ale rychle, zbývají už jen dva dny.

A jelikož jsem tvorem líným a nemám nakonfigurovanou vlastní URL, musíte si sami upravit adresu ve své záložce a RSS čtečce na http://horejsek.posthaven.com. :)

Windows 8 ani omylem

Vědět dřív to co vím teď, všechny známé bych varoval před upgradem na Windows 8. Přínáší to totiž poměrně závažný problém – kompatibilita.

Celé to vzniklo tak, že děda dostal k licenci sedmiček slevu na Windows 8. A ne zrovna malou, aneb nekupte nový operační systém od Microsoftu za čtyři stovky. Tak se taky stalo a krásně fungující sedmičky nahrazovaly kostičky.

Ještě než budu pokračovat, menší problém jsou i samotné kostičky. Nad tímto krokem jsem se pozastavoval už u prvních informací o Windows 8. Proč je sakra metro na desktopu? Vždyť to je nepoužitelné… To jsem však ještě nezkoušel a tak jsem si říkal, že třeba to je jen o zvyku. Gnome 3 je také jiné a musím říct, že to je lepší než klasické prostředí.

Ne, není to o zvyku. Je to postavené na hlavu. Kdo si v Microsoftu sakra myslí, že je dobré vypínat počítač najetím do jednoho rohu, poté se držet u strany (protože jakmile se vzdálíte, meníčko zmízí), najet až na nastavení (protože to je přece logické, že v nastavení je vypnutí počítače) a tam kliknout na vypnout? A pak ještě jednou. A pak čekat až se nainstaluje bambilion aktualizací; to už je však známý příběh.

Celé metro není na desktopu vhodné. Posouvat se do strany, plýtvat místem, přepínat se mezi dvěma rozhraními, atd. To není to pravé ořechové. Takže v tom legu se využívá pouze jedna věc – proklik na klasický desktop. Nejeden člověk se mě ptal, jak tuhle otravnou obrazovku odebrat. Netuším. Hrál jsem si s tím přes hodinu bez výsledku. [Pokud to lze, dejte mi prosím vědět a já to hned pošlu všem, kteří to po mně chtěli.]

No ale zpět k tomu hlavnímu problému. Fungující sedmičky teda nahradilo metro, které oznámilo, že trasa kompatibilita končí ve stanici běžný hardware a dál nejede. A nejede tam ani další spoj. Ani ten další. Žádný.

Popravdě moc typů hardwaru jsem nezkoušel; co vím, tak klasické klávesnice, myši, reproduktory, mikrofon, externí a flash disky pracují v pohodě. Prostě ta klasika, do které nepatří tiskárny. Zřejmě tisk je luxus pro firmy, které se do upgradu nepohrnou, a tak nevadí, že z Windows 8 lze tisknout jen na dobré slovo. Jen když se tomu zrovna chce.

Tiskáren jsme zkoušeli víc. Ani jedna se nechytala. Windows sám žádné základní ovladače nenabídl (no tak kde to žijeme?) a výrobce na nějakou podporu z vysoka kašle. Jelikož byla stejně potřeba nová tiskárna, začalo se pátrat po tiskárně s podporou nových Windows. Tohle by však nedal ani Holmes! Takovou tiskárnu jsem ještě neviděl.

Zkusili jsme si prostě vybrat nějakou tiskárnu a podívat se na stránky výrobce, zda náhodou už ovladače nejsou dostupné a jen se zapomnělo na úpravu specifikace. Naštěstí jsme takovou našli a koupili. S radostí jsme ji zapojili a šli instalovat ovladač. Ale ejhle, pokaždé to spadlo s chybou.

Sice to pak psalo, že tiskárna je nainstalovaná, ale tisk stejně nešel. Opravdu už netuším, co jsem s tím dělal, každopádně po třetím restartu se rozjela. Možná pomohla nějaká aktualizace, která mě otravovala při jednom restartu. A která se nepovedla nainstalovat.

Nyní tiskárna tak nějak tiskne, ale nemám vůbec jistotu, že to není na dobré slovo, jako ta předtím. Uvidíme.

Celý Windows 8 na mne působí jako Windows Vista. Nedodělek, které raději nepoužívat. Windows 7 je vlastně doladěná Vista. S Windows 9 to vidím podobně a proto doporučuju počkat a vykašlat se na jakékoliv slevy. Nervy jsou cennější.


Moc se mi líbí, když v Linuxu (to je ten hrozný operační systém zadarmo) připojím tiskárnu a po chvilce se mi ukáže, že mohu tisknout. A pokud potřebuju lepší ovladač, zajdu na stránky výrobce a tam je jen jedna položka s Linuxem, takže se nespletu, který mám stáhnout (aneb bambilion verzí Windows a Mac OS).

Stále mi nejde na rozum, jak něco zadarmo může fungovat mnohem lépe než něco placeného.

Konzolové Easter Eggs

Po těch letech, kdy jsem vyhledával v konzolovém manuálu man, jsem našel několik easter eggů. Při posledním nálezu v nápovědě utility ack-grep jsem na chvíli zapomněl, cože jsem to vlastně hledal a s kolegou dali dohromady seznam, co vlastně všechno už za shellové easter eggs známe.

apt-get help vypisuje větičku „This APT has Super Cow Powers“. A má pravdu:

$ apt-get moo
         (__) 
         (oo) 
   /------\/ 
  / |    ||   
 *  /\---/\ 
    ~~   ~~   
...."Have you mooed today?"...

Samo to nabádá vyzkoušet i ten druhý oblíbený balíčkovací manažer, aptitude. V nápovědě (aptitude help) sice říká přesný opak, „This aptitude does not have Super Cow Powers.“, ale ve skutečnosti easter egg má. A propracovanější:

$ aptitude moo
There are no Easter Eggs in this program.
$ aptitude moo -v
There really are no Easter Eggs in this program.
$ aptitude moo -vv
Didn't I already tell you that there are no Easter Eggs in this program?
$ aptitude moo -vvv
Stop it!
$ aptitude moo -vvvv
Okay, okay, if I give you an Easter Egg, will you go away?
$ aptitude moo -vvvvv
All right, you win.

                               /----\
                       -------/      \
                      /               \
                     /                |
   -----------------/                  --------\
   ----------------------------------------------
$ aptitude moo -vvvvvv
What is it?  It's an elephant being eaten by a snake, of course.

Pokud by náhodou někdo zapomněl otázku nebo odpověď, tu, no, však víte, tamtu. Stačí otevřít editor vim a zadat :help 42:

What is the meaning of life, the universe and everything?  *42*
Douglas Adams, the only person who knew what this question really was about is
now dead, unfortunately.  So now you might wonder what the meaning of death
is..

Milovníci kočiček mohou v manu ack-grepu jednu takovouo nalézt. Spouští se příkazem ack-grep --thpppt:

_   /|
\'o.O'
=(___)=
   U    ack-grep --thpppt!

Pokud máte nainstalován prográmek cowsay, můžete napsat, aby vám něco kravička pověděla:

$ cowsay hello
 _______
< hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

A nebo taky můžete…

$ cowsay -f head-in ouch
 ______
< ouch >
 ------
    \
     \
    ^__^         /
    (oo)\_______/  _________
    (__)\       )=(  ____|_ \_____
        ||----w |  \ \     \_____ |
        ||     ||   ||           ||

V případě častého pletení příkazu ls doporučuju nainstalovat sl. Sice to nepomůže odstranit překlepy, zato ale můžete sledovat mašinku.

====        ________                ___________
  _D _|  |_______/        \__I_I_____===__|_________|
   |(_)---  |   H\________/ |   |        =|___ ___|      _________________ 
   /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
  |      |  |   H  |__--------------------| [___] |   =|                        |
  | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
  |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_
 |/-=|___||    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
  \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

Zkuste ji předat nějaké parametry. Bude se měnit.

A to je vše, co jsme dali dohromady. Není toho moc, proto udělám výjimku a přidám ještě jeden grafický easter egg z prostředí Gnome – Alt+F2 a zadat „free the fish“. Tento easter egg vypustí rybičku a půjde se ji zbavit jen killnutím celého gnome panelu.

Bohužel rybička už v novém Gnome Shell není a tak jsem ji převedl do HTML světa. Třeba se bude někomu hodit nebo bude chtít jen zavzpomínat. Je k nalezení třeba taky na intru BOObook.cz (po zadání magického „free the fish“).

Devel.cz 2013

Je tomu týden, kdy proběhla druhá konference Devel.cz. Chtěl jsem se k ní vyjádřit co nejdříve, ale bohužel mi to psaní dříve nevyšlo. Pozdě, ale přeci jen... Možná jen proto, že první se mi opravdu líbila a těšil jsem se na pokračování, které mě však zklamalo. I když jsem si vstup neplatil sám, lituji těch peněz, které jsem mohl použít na něco lepšího. Ještě více lituji drahoceného času.

První co na celé konferenci nechápu je čas oznámení. Tím nemyslím, že by mě newsletter v poledne vzbudil, ale že oznámení přišlo jen pár dní před konferencí. Skoro si říkám, že nejenom pozvánka nepřišla na poslední chvíli, ale že celá konference byla připravena na poslední chvíli.

Díky tomu, že jsem na termín konference nic jiného naplánovaného neměl, mohl jsem na Dejvice dorazit, abych zjistil, že web s konferencí je otřesný. Optimalizace pro telefon žádná a informace kde se přesně koná taky nikde. Přitom tam je místa klidně i na podrobnou mapu. Informace, že se jedná o budovu FIT ČVUT je fain, ale ne každý ví, kde je. Případně vyvěšené cedule by byly taky nebyly k zahození.

Organizátoři nezklamali a uvnitř se na cedule taky vykašlali. Aneb myslel jsem, že pití tentokrát nebude. Dokud na úvodu nebylo řečeno, v jakém skrytém koutku ho lze nalézt. Naštěstí aspoň u vchodu někdo stál a říkal, kde je šatna.

Teď k samotnému obsahu. Zkráceně bych řekl „stálo to za prd“. Přínosná a zábavná přednáška byla snad jen ta, která se nezabývala žádným programovacím jazykem atp., od Patricka Zandla. Ostatní mi přišlo, no, vezmu to postupně.

Dan Steigerwald mluví stále o tom samém. Este.js. Hodnotím ji jako lepší přednášku, protože dokázal uznat a říct, jaké chyby se dopustil na začátku, opravil ji a podělil se o nástroje, které mu s tím pomohly. Škoda jen, že za celou přednášku jsem se dozvěděl jen o existenci pár libek.

Vojtěch Semecký… Ufff. Na jeho místě bych se moc nechlubil jak web, který lze udělat za pár večerů, dělal celých čtrnáct dní. A už vůbec ne řešením – XML převádět na JSON, aby ho Nette celé převedlo do HTML a jQuery skrylo prvky, které na dané URL nemají být vidět. Databáze nebyla použita, protože by do ní byla data pouze zapisována a zase čtena (wtf?) a nebylo generováno z XML rovnou HTML, protože co kdyby se později hodilo data nějak filtrovat (proto asi ten JSON; wtf?). Tohle nepatří na takovouhle konferenci.

Předchozí přednášku jsem musel rozdýchat a tak jsem na přednášku od Davida Majdy a Josefa Reidingera dorazil se zpožděním. Nevypadala špatně, ale byla taková... nebylo řečeno nic neznámého.

U další přednášky jsem přemýšlel zda už jít na oběd nebo počkat, zda se od Michala Illicha dozvím něco zajímavého. Měl jsem jít na oběd. Co to je strojové učení ví snad každý, případně kdo a kde ho používá by šlo říct během chvilky, nemusí to trvat půl hodiny. Druhá půlhodina (okecávka pár odkazů na knihovny) šla taky zkrátit na dvě minuty.

Jelikož organizátoři nezařídili oběd a ani nedali vědět restauracím kolem, aby se připravili na nával, stihl jsem pouze konec přednášky Davida Grudla. Konec byl však dobrý, škoda že jsem ji nestihl.

Michal Špaček měl dobrou přednášku. Škoda ale, že se o tomto tématu neustále mluví, a tím nepřinese na takové konferenci nic nového. Aspoň mě se to tak zdá.

Během půl hodiny vysvětlit efektivní vývoj na iOS od Michala Vašíčka, který začal povídání o tom, jak první rok vyvíjel jen ve virtuálu a neměl vůbec tušení jak to má vlastně dělat… Rovnou jsem vypnul. Za půl hodiny se víc než základní Hello World nestihne a ten je k vidění snad na každé konferenci.

Martin Malý mě velice zklamal. Od něj jsem čekal něco víc, ale pokračoval v duchu předchozí přednášky – tedy od něj jsem se dozvěděl to, co se dočtu na hlavní stránce CoffeeScriptu. Obohacené jen o to, na co si dát pozor.

Potom jsem už odešel raději domů a netrápil se.

Problém vidím hlavně v tom, že přednášky byly teoretické a chudé. Teorie se dá načíst z tutoriálů a dokumentace během pár minut. Nemusím kvůli tomu sedět celý den na nějaké konferenci. Mě hlavně zajímá praxe. Zkušenost s nasazením. Jaké jsou problémy. Co je dobré. Kdy je dobré danou technologii použít. A podobné věci.

Příště si rozmyslím, zda se přijdu zase podívat.

Tipy na testování webových aplikací

Testováním webových aplikací se zabývám už poměrně dlouho a přijde mi, že integrační testy v podobě Selenia jsou mnohem důležitější, než jednotkové testy JavaScriptu nebo backendu. V různých knihách a článcích se píše o tom, že pokud není praxe, ať se testuje dle toho, co danému programátorovi přijde vhodné. Tím se získá praxe a najde se ten cit pro rozhodování jaké napsat testy přednostně a čím se nemá smysl zabývat.

Také jsem tak začínal a cit si vybudoval. I když, stále se mám co učit. Dnes už ale vím, že to není zrovna nejlepší poučka. Minimálně co se týče webových aplikací. Tam už vím, že nejlepší je sáhnout prvně po Seleniu. Důved je velmi prostý – jednotkové testy, jak JavaScriptu, tak backendu (ať už je to jakýkoliv jazyk), otestují jen nějakou tu jednotku. Řekne to programátorovi „hele, tenhle kus kódu je správný. Jestli ale náhodou šablona očekává něco jiného a nezobrazí tlačítko, na kterém to je závislé… to už nevím. Ověř si sám.“ nebo tak nějak.

Tohle však testy bohužel neřeknou. Odpoví jen stručné „OK“. Jakmile tuto odpověď uvidí programátor, jde radostně nasadit na betu, oznámí uživatelům že mohou testovat a ejhle. Ona tam je chyba v šabloně (nebo v čemkoliv jiném, co už jednotkové testy nepodchytí) a programátor musí po víkendu zjišťovat, cože to v pátek dělal a cože to musí opravit.

Neříkám však, že ostatní testy nejsou dobré. Taky mi odhalili spoustu chyb, Selenium však jednoznačně vede.

To je tedy tip číslo jedna – u webovek se zaměřit více na Selenium.

V naší aplikaci v práci mi hodně vadilo, že tam máme spoustu chyb v JavaScriptu. Webmasteři se u nás ještě do nedávna střídali jeden za druhým, každý si to dělal po svém a nikoho nezajímalo, co tam je a co tam bude. Dnešní situace je už dobrá a neustále se zlepšuje, bylo mi to ale málo a napadlo mě do našich Selenium testů přidat kontrolu JavaScriptových chyb. Do stránky jsem přidal kus JS:

<script type="text/javascript">
window.jsErrors = [];
window. function(errorMessage) {
  window.jsErrors[window.jsErrors.length] = errorMessage;
}
</script>

a v Selenium (po každém testu, v tearDown) přečetl obsah proměnné jsErrors. Spustil to a… nalézalo to jednu chybu za druhou. Tady className neexistuje, tajhle null nemá atribut getElementsByTagName apod. Vlastně ještě dnes to nalézá takové chyby díky tipu číslo tři, o tom ale až za chvíli.

Úprava mě stála asi hodinku se vším všudy a dostal jsem mocnou zbraň proti bugům v JavaScriptu. Stačí aby se na něco opomnělo a testy zařvou. Druhý tip je myslím jasný – přidat do Selenia podporu na hledání JavaScriptových chyb.

Je tedy pravda, že takhle selžou testy, které ve skutečnosti prošly. „Jen“ nastala nějaká drobnost v JavaScriptu. Já na to odpovím: nezájem. Je tam chyba? Je. Opravit.

Říkal jsem, že nám tu testy stále oznamují různé chyby v JavaScriptu díky třetímu tipu. Tento tip zní: fuzzy testování.

Zmíněná aplikace je velmi obrovská a testy se začaly psát teprve někdy před rokem a půl. Stále máme spoustu nepokrytého místa, které se zpětně těžce vyplňuje (nelze se vybodnout na všechny známé bugy a feature requesty, na měsíc se zavřít ve sklepě a dopsat všechny testy). To mě pochopitelně trápilo a vyřešil jsem tento problém alespoň fuzzy testováním. Během chvilky jsem napsal primitivní algoritmus na náhodné proklíkání webové aplikace.

Neočekával jsem, že to něco pořádně najde, ale světe div se… ono to našlo hned chybu na dvacátý náhodný klik. Klik, který by neudělal žádný programátor (protože ví, kam klikat nemá), ale ani tester či uživatel. Tedy, věřím, že to někdo už udělal, jen se nenamáhal s reportem. Fuzzy testování jsem zatím nechal v primitivní podobě jak jsem to poprvé napsal a stále to nachází různé fatální chyby, které měly skončit jen chybovou hláškou. Někdo by mohl konstatovat, že to je drobnost, nic kritického. Uživatel má však opačný názor.

Minimálně v našem případě to hodně pomáhá s najitím chyb v JavaScriptu různě v aplikaci, kam se Selenium testy sami od sebe jen tak nepodívají.

Zbývá poslední tip. Selenium je takové neohrabané. Hodně mi vadil styl použití. Sice používám webdriver (Selenium 2), což je lepší, než předchozí verze, ale stále to není ono. Takže jsem napsal wrapper, který práci se Seleniem ulehčí. Kód jsem vystavil volně na GitHubu a ještě mám nějaké plány na zlepšení než to převedu do stable verze. Každopádně už nyní to používají dvě aplikace. Více zde: https://github.com/horejsek/python-webdriverwrapper. (Jedná se o Python.)

Pokud bych dnes začínal nový projekt, s těmito testy bych začal.