
Nevím jak vám, ale nám se při vývoji často stává, že vývojáři některé věci přehlíží a to se nám negativně odráží na produktivitě a kvalitě výstupu. Člověk je tvor omylný, ale inteligentní a proto se snaží se vybavit takovými nástroji, které jeho nedokonalosti dokáží vyvážit. Na posledním hackathonu kolega
Michal Kolesnáč přišel s nápadem a prototypem rozšíření našeho
existujícího doplňku pro Google Chrome, které pomocí
HTML 5 notifikací upozorní vývojáře na potenciální problémy na prohlížené web stránce. Minulý týden jsme řešení dotáhli do konce a myslím, že stojí za to, abych se s Vámi o tento nápad podělil.
Na úvod se podívejte, jak nám výsledné řešení pomáhá v praxi:
[youtube=https://www.youtube.com/watch?v=dluseSIN3tU]
Princip fungování
Princip je relativně obecný a je určitě přenositelný i do vašeho vývojového ekosystému. O vývoji rozšíření pro Chrome toho už bylo
napsáno i v češtině docela dost a proto zde nepůjdu do úplných podrobností.
Celý princip je zachycen na následujícím sequence diagramu (btw. vytvořený v
http://www.ckwnc.com/ ... což je krásná služba pro generování sequence diagramů - jen nedoplňuje popisky k aktorům):
Jednoduše řečeno - každý požadavek na webovou aplikaci prochází servletovým filtrem, který při každém požadavku vygeneruje unikátní token a zapíše do hlaviček odpovědi cookie obsahující URL, na kterém bude v budoucnu odpovídat na požadavky pro zobrazení zpráv spojených s tímto requestem. Po ukončení zpracování HTTP požadavku filtr zanalyzuje aktuální stav aplikace a případně zapíše zprávy pro vývojáře ohledně věcí, kterým by měl věnovat pozornost.
Chrome plugin monitoruje změny cookies a pokud narazí na změnu v cookie se sledovaným názvem, vybere z ní URL, vytvoří XmlHttpRequest a AJAXem se dotáže serveru na seznam zpráv k zobrazení. Požadavek zachytí opět náš servletový filtr, podle unikátního tokenu si ze session vytáhne dříve vygenerovaný seznam zpráv. Nakonec vytvoří JSON zprávu s odpovědí, která obsahuje buď prázdné pole, nebo seznam notifikací s dodatečnými informacemi (např. důležitostí sdělení). JSON je pluginem rozparsován a uživateli jsou prezentovány zprávy jako HTML 5 notifikace. Je důležité si uvědomit, že najednou mohou být zobrazeny pouze 3 notifikace (omezení prohlížeče) a proto je potřeba ty zprávy koncipovat spíše jako odkazy někam dál. V našem případě otvírám po kliknutí na notifikaci
RamJet Inspektor, kde je k nalezení už konkrétní rozpad problému.
Cílem rozhodně není zahltit vývojáře informacemi - notifikace mají zobrazovat jen informace o důležitých problémech, které vyžadují pozornost a je riziko, že by je vývojář mohl přehlížet. Naopak pokud by je chtěl přehlížet, tak by mu měly notifikace jeho ignoranci alespoň znepříjemnit :).
V našem případě aktuálně monitorujeme tyto problémy:
- pomalá odezva stránky (více jak 1 vteřina na vrácení kompletního výstupu)
- pomalé SQL dotazy při zpracování požadavku (více jak 200ms na zpracování SQL příkazu)
- duplicitní SQL dotazy (špatné použití cachování)
- chyby při zpracování stránky (jak při akci, tak i v rámci renderingu) - obvykle by měly být vidět samy od sebe, ale někdy se skryjí ve <script> blocích nebo na stránce chybí komponenta pro výpis chybových hlášení
- chyby při aplikaci změn v konfiguraci (refresh Spring kontextů selhal) - jelikož se jede z poslední známé funkční konfigurace, vývojář často problém s reloadem nepostřehne a marně pátrá proč se aplikace nechová tak, jak by podle poslední konfigurace měla
- (zvažujeme) použití deprekovaných komponent a funkcí
- (plánujeme) zobrazení informace o nelokalizovaných textových popiscích na stránce
A také tyto významné informace v životním cyklu aplikace:
I had a conversation about IntelliJ Idea shortcut bindings conflicting with default shortcuts of Ubuntu/Unity OS. Well, it's a real problem, your muscle memory can be a tough beast. You can re-lean a shortcut or two but it's hard to change your habits completely after years of coding in IntelliJ Idea. And I want to concentrate on different things than to learn again shortcuts I am used to use. Because I am developer my IDE is more important for me than the OS and that means that shortcuts of the OS must go away or be changed. There is no other way possible.
Ve Forrestu jsme jako verzovací systém používali po velmi dlouhou dobu prastaré CVS. Respektive v době, kdy se s tím ve firmě začínalo (pamětníků už je jen hrstka) to zase až taky zastaralý systém nebyl (mluvíme o roku 2000). Dlouhou dobu jsme zvažovali náhradu za nějaké modernější VCS, ale nikdo se toho nechtěl osobně ujmout a byla tady celá řada překážek, se kterými bychom se museli kvůli přechodu vypořádat. Kromě infrastruktury (háčky do issue trackeru, build a install skripty, zálohování atd.) jsme měli obavu i o to, jak by přechod zvládly ty desítky vývojářů, kteří CVS používají - kritické místo se nám zdál tým webmasterů starající se o drobné úpravy na existujících projektech (v řádu desítek úprav denně). Prostě jsme hledali výmluvy, protože se nám do migrace nechtělo - zvlášť, když jsme neměli uvnitř firmy nikoho, kdo by nějaké nové VCS evangelizoval.
Forrestí výprava opět vyrazila do Polska na Java konferenci GeeCON a nebyl bych to já, kdybych vám nepřinesl detailní reportáž o věcech, které mne tam zaujaly. Letos byl můj výlet sponzorován brněnskou firmou YSoft, která byla platinovým sponzorem celé konference a které bych chtěl prostřednictvím tohoto článku také poděkovat. Na společnou výpravu se s námi vydal i Tomáš Záluský z písecké společnosti Intelis a spolu s ním bychom pro vás měli připravit i krátkou rekapitulaci konference na pražském CZJUG.
Po 3 letech dělám větší refaktoring na našem direct mailingovém modulu a jako první jsem se rozhodl povýšit verze knihoven a zrefaktorovat JUnit testy, které jsou tam ještě psané ve stylu JDK 1.4.
V souvislosti s tím jsem samozřejmě přepracoval formu testů z dědičné hierarchie na anotace, které byly představeny poprvé ve Spring 3.X (pokud se nepletu). A tu jsem zjistil, že mám drobný problém - v původní verzi mého kódu jsem využíval dynamické kompozice Springového kontextu k tomu, abych stejné integrační testy pustil proti různým implementacím úložišť dat (paměť, MySQL databáze, Oracle databáze ...). V aktuální verzi Springu se ale v anotaci @ContextConfiguration uvádí statický výčet konfiguračních XML a to situaci komplikuje.

Tento víkend se v Pardubicích konal historicky první "pardubický" Google DevFest a bylo by hříchem nevydat se na tak zajímavou akci zvlášť, když probíhá jen pár stovek metrů od mého domu. Na programu byli přitom samí zajímaví řečníci - Michal Špaček, Daniel Steigerwald, Pavel Lahoda, googleři Danut Echanoiu a Margarita Manterola a další.
Pokud vás zajímá, jak vše vypadalo okem diváka, připravil jsem pro vás tuto reportáž.
OAuth 2 (Danut Echanoiu)
První přednáška Danuta Echanoiu byla na již trošku ohrané téma OAuth autentizačního a autorizačního protokolu. Ačkoliv jsem již byl asi na dvou přednáškách o OAuth - tato mi přišla mimořádně dobrá a to především kvůli tomu, že veškeré technikálie byly vysvětleny velmi jednoduše a lidsky.
Nedávno jsem jedním svým twítem vyvolal menší diskusi ohledně toho, co nám dovoluje komponentový framework oproti tomu, čeho bychom byli schopni dosáhnout s jednoduchým MVC rámcem. Bohužel twitter mi nedává takovou možnost vyjádřit se a tak jsem chtěl důvody a výhody, které vidím v komponentách na frontendu, popsat trošku obšírněji v tomto článku.
Komponentový model na webové vrstvě přináší oproti MVC se "standardním" šablonovým systémem možnost elegantní znovupoužitelnosti částí, které se znovu použít dají. Pro mě jako vyznavače DRY je toto jedna z VELKÝCH výhod. Namítnete, že znovupoužitelnosti se přeci dá dosáhnout i v běžném šablonovacím systému - co třeba JSP tagy nebo Freemarkerová makra? Touhle cestou jsem si prošel a výsledek byl vždycky kostrbatý - obvykle se vám podaří znovupoužít buď vykreslovací šablonu nebo aplikační logiku, ale nikdy ne rozumně obojí.

Nastala chvíle odbourat další zlozvyk minulosti. Rozhodl jsem se, že na prezentace už PowerPoint a jemu podobné aplikace nepoužiji. Přemýšlel jsem o tom už nějakou dobu a na poslední Google Group v Pardubicích mě Martin Görner nadchl svou prezentací, která byla postavená nad HTML 5 šablonou původně určenou jako základ prezentací na Google IO 2012. Google IO šablona samozřejmě není v tomto směru nijak unikátní - podobných šablon a "frameworků" existuje na webu celá spousta (určitě musím zmínit ještě velmi pěkně navržený ekosystém Deck.js).

Tento článek bude krapet filozofického ražení a nese zvláštní ale snad výstižný název, jak se pokusím vysvětlit dále. Nelehko se popisuje, co myslím tím výrazem „spád“ – v češtině bych mohl použít i podobně zabarvená slova jako třeba bzukot, mravenčení nebo vzruch, z cizích jazyků bych si vypůjčil výrazy jako je trakce nebo momentum. Určitě pochopíte, co mám na mysli, když poukážu na živé a prosperující komunity, které známe z našeho okolí. Spádem myslím stav, kdy se okolo vás děje pořád něco nového, něco co vás obohacuje, nabíjí vás energií a vnitřně vás nutí se do víru také přidat.
Nejsem první, kdo v tuto dobu píše článek bilancující loňský rok. Velmi zajímavé osobní zpovědi najdete na Dagblogu i na Javičce - každý braný z jiného úhlu pohledu. Ani já se letos nevyhnu bilancování a opět vás budu trápit nějakými čísly, která jsou možná zajímavá hlavně pro mě. Dagi psal, že on už nehledá motivaci v číslech odrážejících čtenost článků na blogu, ale mě to ještě pořád drží :)
Musím přiznat, že i mě se v poslední době hledá čas na psaní příspěvků na blog čím dál hůře. Děti rostou a vyžadují víc a víc pozornosti, projekty ve Forrestu jsou čím dál náročnější a okolo mě je pořád tolik věcí, které bych si chtěl vyzkoušet a experimentovat s nimi. Jenže na to všechno potřebuje člověk klid, čas a soustředěnost a toho, zdá se mi, mám pořád méně a méně.
Dnes je možné využít výjimečné slevy, které zveřejnili JetBrains při výročí konce světa. Po následujících 24 hodin je možné pořídit plnou licenci IntelliJ Idea 12 a všech ostatních jejich produktů se slevou 75%. Slevy se vztahují pouze na personální licence, které jsou nepřenositelné a mohou si je koupit pouze jednotlivci (nicméně je možné je využít i ke komerčním účelům).
Po přepočtu na české peníze můžete pořídit:
- IntelliJ Idea 12 za 1200,- Kč
- PhpStorm za 590,- Kč
- WebStorm za 310,- Kč
- RubyMine za 440,- Kč
- PyCharm za 480,- Kč
- AppCode za 590,- Kč
- ReSharper za 960,-Kč
- dotTrace za 1800,- Kč
- dotCover za 590,- Kč
Více informací se dozvíte na speciální stránce ... akce platí jen pro 20. prosinec 2012
O radosti z releasů jsem tady na blogu psal už dříve a teď budu psát znovu, ale z jiného úhlu pohledu. Téměř po roce od začátku analytických prací jde do produkce jeden z mých největších dosavadních projektů - Ok Bonus portál pro slovenskou společnost DOXX. Podstatou projektu je poskytnout technické řešení maloobchodům a jednotlivcům pro tvorbu věrnostních (bonusových) programů, které si dokáží ušít samy sobě na míru.
Řešení je složeno z několika částí: desktopové aplikace postavené nad NetBeans RCP - tzv. terminálu, který bude provozován vedle pokladního systému a bude umožňovat zápis informací o nákupech a také čerpání odměn. Nákupy a bonusy se evidují na libovolnou NFC kartu, kterých v současné době po světě běhá více než dost (samozřejmě bude možné získat u provozovatelů systému i brandované Ok Bonus NFC karty). Druhou část představuje tzv. "platební brána", která zpracovává transakce ze všech desktopových klientů a spravuje zákaznické účty. Třetí část je potom webový portál Ok Bonus, který představuje prostředníka mezi zákazníky, obchodníky a platební branou. Na portále jsou k dispozici výpisy z účtů (tj. evidence nákupů, přidělování bonusů atd.), pro obchodníky potom rozhraní pro tvorbu bonusových programů, správu autorizovaných karet a terminálů, statistiky, e-shop a vyúčtování.
Jestli ano, tak by mne velmi zajímalo, jak to děláte. My jsme totiž ještě donedávna žádnou jistotu neměli - vše záleželo na poctivosti a důslednosti programátorů. Jenže v Javě není tahle záležitost vůbec jednoduchá a tak vám může díky nějaké referenci hluboko ve stromu objektů uniknout, že to, co ukládáte do session, má vazbu na objekt, který serializovatelný není. Výsledkem je ztráta session při restartech aplikačního serveru nebo zamezení možnosti session replikovat mezi nody clusteru.