V tomto postu bych chtěl sdělit pár aktualit o mně. Vysvětlit,
proč zde nic nepřibývá atd.
Tento blog je hlavně o programování a k tomuto tématu už
nemám dlouho co nového napsat. Poslední 2 roky věnuju většinu svého
volného času svým firmám Maternia a ItPlace. Už se nepovažuju za
programátora, ale současně nenalézám dost přesný výraz pro to, co
právě dělám.
Kde mě můžete sledovat:
Celý článek 18. Leden 2010
V únoru 2008 jsem psal o tom jak jsme
rozjeli VašeČočky.cz. Rok nato jsme spustili internetový obchod
i na Slovensku.
Dnes jsme spustili nový eshop Čočkovník.cz. První internetový obchod
věnovaný výhradně prodeji barevných kontaktních čoček.

Chtěli jsme zvolit zcela netradiční způsob prodeje barevných
čoček. Podřídili jsme strukturu katalogu barevným čočkám.
Zobrazujeme na jedné stránce produkty ze stejné „rodiny“.
Například Soflens
natural colors, které se na tradičních eshopech nalézají na
4 různých stránkách pro 4 existující varianty produktu.
Problém při nákupu barevných čoček přes internet
Je to podobné jako s parfémy. Nemůžete si k nim přes internet
přivonět. U barevných kontaktních čoček zase výsledný efekt
závisí velmi na původní barvě oka. Tento problém se snažíme
eliminovat. Čočkovník.cz obsahuje katalog fotek, které jsou nahrané
samotnými nositeli barevných čoček, a obsahují jedno oko
s nasazenou čočkou a druhé bez čočky.
Fotky lze prohledávat. Můžete zadat požadovanou barvu
oka a nepovinně přirozenou barvu oka. Chcete změnit barvu oka
například hnědé na modrou? Zadejte požadovanou modrou barvu a přirozenou
hnědou barvu do oka a dostanete výsledky.
Co říkáte na tuto proměnu?
Na obrázku vidíte čočku FreshLook
Colors / Sapphire blue
Hodnotu galerie fotku bude do budoucna tvořit množství a kvalita
obsažených fotografií. Nahrávání fotek se snažíme motivovat slevou,
kterou nahrávající dostane na přístí nákup a také propojením
s Facebookem. Umožňujeme se pomocí něj přihlásit, a tak odpadá
potřeba pamatovat si nové přihlašovací údaje.
Další integrace s Facebookem má formu automatického exportu
schválených fotek do galerie.
Podobně automaticky funguje export na Flickr.
Za realizací Čočkovník.cz stojí
moje firma ITPlace, pro kterou to byla jedna
z prvních zakázek pro českého zákazníka. Velký dík patří mému
společníku Janu Šmukovi, který svými znalostmi API Facebooku a Flickru
velmi přispěl k rychlému dokončení projektu a bezvadné
funkčnosti.
Závěr
Až čas ukáže, zda bude Čočkovník.cz úspěšný. Byl to nápad,
který jsme nosili v hlavě skoro rok a celý náš tým je velmi rád, že
jsme jej dotáhli do konce.
Celý článek 13. Srpen 2009
Význam zbožových vyhledavačů narůstá. Pro některé eshopy znamenají
až 30% návštěv.
Tak tuhle větu jsem nedávno četl v tiskové
zprávě vydané u příležitosti vstupu investiční společnosti
Centralway do zbožového vyhledavače HledejCeny.cz.
Prohlášení nevěřím. Uvedených 30% může mít eshop, pro který je
registrace feedu na HledejCeny.cz jedinou marketingovou aktivitou.
Já se jako majitel eshopu
o zbožové vyhledavače aktivně zajímám více než rok a půl. Hodně
času jsme např. věnovali optimalizaci feedu pro některé z nich.
V tomto článku bych chtěl napsat, co se mi na zbožových
vyhledavačích nelíbí. A HledejCeny.cz jsou jejich krásným
příkladem:
- všechny stránky včetně titulní obsahují obrovské množství reklamy
(strip v hlavičče, hlavní menu – letenky affil, celý pravý
sloupec je jedna velká reklama)
- nesrozumitelné výrazy (dokáže někdo vysvětlit větu:
„V katalogu je zařazených 110 654 produktů v 1 305
kategoriích. Celkem prohledáváme 4 452 319 výrobků.“)
- v URL, nadpisech, titulcích, v textu stránky kralují slova
„levně“, „nejlevnější“. Čím víc, tím líp.
- řazení eshopů ve vyhledávání je zásadně podle ceny –
nejlevnější nahoře. Nebo si lze přední pozice koupit. Lepším příkladem
je Heureka.cz – dává obchody zapojené do služby Ověřeno zákazníky na přední pozice.
Ovšem už nezáleží na tom, jakých výsledků obchod dosahuje. Takže
i obchod, který 80% výrobků nedodá do 10 dnů, bude ve
výsledcích vyhledávání před obchodem, který do služby zapojen není, ale
je mnohem kvalitnější
- nepřehledné výsledky vyhledávání (zkuste si na HledejCeny.cz vyhledat
Nokia
6500
- mohl bych pokračovat ještě dlouho
Abych to shrnul – zdá se mi, že tyhle zbožové vyhledavače je jeden
velký stroj na generování příjmů z reklamy. Nevidím tady skoro
žádnou přidanou hodnotu pro zákazníka. Princip fungování je
triviální:
- zpracuje se XML export zboží (aby se to nepletlo, tak každý zbožový
vyhledavač má svůj unikátní formát)
- spáruje se zboží z jednotlivých eshopů (aby se mohla porovnávat
ceny)
- zboží se zařadí do kategorie
Proč se mi nelíbí řazení podle ceny?
- opravdu znamená levnější = lepší? Dnes má spousta internetových
„obchodníků“ jedinou strategii – být za každou cenu
levnější než konkurence. Velmi často má takové podnikání krátké
trvání. Je zřejmé, že jedinou konkurenční výhodou cena být
nemůže.
- mají tyto nejlevnější eshopy zboží skladem?
- komunikuje se zákazníkem někdo? (nebo se jedná o garážovou
firmičku)
- jak je to při vyřizování reklamací?
- často je detektivka zjistit provozovatele těchto eshopů. Pokud už se na
webu nachází stránka „Kontakt“, obsahuje pouze formulář.
- opět bych mohl pokračovat…
Co se mi líbí?
Zboží.cz je největší zbožový
vyhledavač v ČR. Líbí se mi, že je to web opravdu jednoduchý.
Žádné kategorie, stránka eshopu propojena s Firmy.cz. Řazení podle
relevance. A nikoliv defaultně podle ceny.
Heureka.cz má velmi přehledné
stránky. Služba „Ověřeno zákazníky“ může být pro eshopy
velmi užitečná – využívá názory skutečných zákazníků.
Přidanou hodnotou jsou též články, které radí návštěvníkům podle
čeho vybírat. V tomto se Heureka liší od Zboží.cz, kam chodí lidé,
kteří již přesně vědí, jaký výrobek chtějí koupit. Heureka pomáhá
lidem i ve výběru zboží.
Řazení eshopů podle kvality
Jako zákazníkovi (i jako majiteli eshopu) by se mi líbilo, kdyby
existoval zbožový vyhledavač, který by řadil eshopy podle
kvality. No jo…ale jak objektivně hodnotit kvalitu eshopu?
Záleží přece na všem:
- cena
- přehlednost stránek
- informace o zboží
- služby (možnosti platby, kamenná výdejní místa, zelená linka,
kvalifikovaný poradce, skladovost zboží…)
Dlouho jsem nad tím přemýšlel a došel jsem k názoru, že
skvělým parametrem, který vypovídá o kvalitě eshopu, je jeho
konverzní poměr. Mluvím o konverzním poměru návštěvníků,
kteří přišli přes daný zbožový vyhlevač. Tím by nebyly zvýhodněny
již zavedené eshopy. Také bychom krásně smetli pod koberec tu zatracenou
cenu :). Protože když je eshop kvalitní, zákazníkovi nevadí si připlatit
(za jistotu, za služby…).
Technicky je toto řešení celkem snadné. Postačí, když si eshop vloží
do zdrojového kódu stránek javascriptový kód na měření návštěv a
konverzí pro zbožový vyhledavač. Takto funguje oblíbený Google
Analytics.
Závěr
Moc by mě zajímalo, co si o mém názoru myslíte. Zajímá mě názor
jak provozovatelů eshopů, tak ostatních jako nakupujících. Vyjádřete se
v diskusi pod článkem.
Celý článek 2. Srpen 2009
Ve středu 3. června 2009 jsem se zúčastnil akce s názvem asp.net
MVC Best practices. Akce se konala na půdě Microsoftu v BB centru a
bylo na ní pozváno dost známých jmen z oboru. To slibovalo kvalitní
diskusi.
Několik účastníků už napsalo svoje shrnutí na blog:
Trošku obdivuju jakou mají paměť. Moje shrnutí bude o hodně
stručnější.
Na začátku organizátor Jarda Jirava promluvil o důvodech pro
konání setkání a vytvořil hello world aplikaci v asp.Net MVC.
Následovalo představení reallife aplikace od Aleše Roubíčka.
Dá se říct, že mě na asp.Net MVC nic nepřekvapilo. Použité standardy
v názvosloví například jsou téměř totožné se Zend Frameworkem a
dalšími rozšířenými MVC frameworky. Pěkná je podpora asp.Net MVC ve
Visual Studiu.
Pak následovala diskuse, kde jsme se pokusili vysvětlit pojem MVC jeho
chápání. Mluvilo se o odpovědnostech jednotlivých částí MVC
architektury. Padla řeč na Open
Session In View Pattern.
Zajímavé bylo porovnání nejrůznějších programátorských světů
– pokud si dobře pamatuju bylo zastoupeno asp.Net, PHP, Java, Ruby a
Django.
O Djangu mluvil Honza Král.
Mluvil o MVT patternu frameworku a jeho výhodách. Bavil se konkrétním
CMS postaveným nad Djangem a jeho použití. Prozradil, že mají
1 jádro, na kterém běží 9 různých webů. Liší se pouze
konfigurace. Tady podle mého Honza trochu zaměnil téma diskuse. Nelze
porovnávat obecný MVC pattern s určitým CMS postaveným na djangu.
Cenné komentáře měl „Karel Minařík“. Mluvil o MVC
patternu v Ruby on Rails. Zejména o častých chybách
začátečníků, kdy dávají byznys logiku do controlleru.
David Grudl poznamenal, že v MVC
frameworku má to C (controller) spíše roli presenteru – objektu, který
předává data view. Další pěkná myšlenka od něj – Kód je
pěkný, když je toho na všech vrstvách tak akorát. Nic nejde vyhodit.
A když další refaktoring už nevede k zlepšení čitelnosti
kódu.
Já bych dodal, že žádný MVC framework si vlastně s pouhým MVC
patternem nevystačí. Když se nějaký framework ohání zkratkou MVC znamená
to vlastně jenom ten fakt, že je tento návrhových vzor, jako jeden
z mnoha, při návrhu použit. Když vezmeme takový Zend Framework, tak
tam se to návrhovými vzory hemží na každém kroku. Velmi stručně –
při vyřizování requestu zafunguje Front controller design pattern, který
vybere správný action controller (v Davidově terminologii presenter)
– a tam najdeme onen MVC pattern. Na lifecycle requestu máme navázány
další akce, na které je možno přidat vlastní listenery (další desing
pattern) – jedná se o routing a dispatching. Ve view vrstvě jsou to
pak View Helpery.
Omlouvám se za sklouznutí jinam – jenom jsem chtěl ukázat, že
osamocený MVC není v reálném světě jediný bojovník v poli a
vždy součástí celé rodiny použitých patternů.
Líbily se mi obchodnické dotazy Michala Bláhy.
Například položil dotaz – Mám firmu s 10ti špičkovými .Net
Forms programátory. Proč bych měl migrovat na asp.Net. Moje odpověď
byla – nemigrovat. Pokud mám práci pro mých 10 zaběhutých
programátorů nic neměnit.
Také padla otázka Typ webových projektů, pro které se MVC hodí a
pro které nikoliv. Moje odpověď byla, že se MVC frameworky hodí pro
implementaci naprosto každého typu webové aplikace. Z mého pohledu
neexistují důvody pro to proč nedělat např. v MVC frameworku
sociální sít a naopak firemní stránky ano.
Hodně se také mluvilo o testování (domluvilo se, že se někdy
v budoucnu uskuteční setkání, jehož předmětem bude testování).
Závěr
Pro mě bylo setkání určitě přínosné. A neváhal bych jít na
podobné setkání znovu.
Celý článek 5. Červen 2009
Ve čtvrtek 21. května 2009 jsem se zúčastnil Konference Web 2.0.
V tomto články bych chtěl zhodnotit svoje dojmy.
Je několik typů odborných akcí, kterých se účastním. Setkáním CZJUG počínaje a Open monday H1 konče. Poslední rok se
snad více než programováním zabývám věcmi okolo e-commerce,
internetového marketingu – všech oblastí, které s vedením internetového obchodu souvisí. Proto jsem
po přečtení programu konference ihned využil nabídky Jiřího Kodery na VIP vstupenku na tuto
akci.
Tolik k úvodu a nyní bych chtěl popsat dojem z jednotlivých
přednášek, při kterých jsem si dělal poznámky.
Dojem z přednášek
Adama Zbiejczuk – Web 2.0 – Evoluce nebo chiméra
Úvod vlažný (také díky problémům s projektorem), ale pak se to
rozjelo. Přednáška byla skvěle připravená. Nabitá argumenty. Skvěle
zpracovanými modely…souvislostmi. Přednášející mluvil
o webu, procesech, které se tam odehrávají v souvislostech, které
mě do té chvíle nenapadly. Asi to bude tím, že v této oblasti nejsem
žádný profesionál. Zde je několik bodů, které jsem si z přednášky
odnesl:
- Web 2.0 je buzzword, ale současně i odraz skutečných změn na
webu
- Web 2.0 lze srovnat s neuchopitelností tagcloudu, kde jsou
myšlenky, vlastnosti, produkty atd.
- Procento připojených domácností v ČR bylo v roce 2001 6 % a
v roce 2008 42 % (v tom není započten internet na pracovišti)
- Web 2.0 potřebuje ke svému provozu kritickou masu uživatelů,
rychlé připojení
- celosvětově má internet více jak 1 miliardu uživatelů
- změna komunikačních modelů (komunikace mezi uživateli, service
providerem a uživatelem oběma směry)
- setření hranice mezi producentem a konzumentem obsahu (samo surfování po
internetu vlastně tvoří internet)
- individualizace (každý má svůj internet upravený na míru,
zanecháváme digitální stopu)
- lidé rádi sdílejí, bojovat proti sdílení je jako rozbíjet stroje
v 18. století
- long tail (např. prodej indických filmů v USA, nové možnosti
inzerce)
- reputační systémy (kombinace individualizace a crowssourcingu)
- mash up/remix (kdo zpřístupní mase snadné nástroje na další úpravy
produktu, pro toho bude masa zadarmo pracovat, pokud to neuděláme, bude to
masa dělat stejně, akorát z toho nic mít nebudeme)
- internet jako platforma (software bude spíš SaaS, poplatky budou reálně
reflektovat míru používání – např podle času)
- proces automatizace zdrojů (synergie zdrojů a vyhodnocování) je centrem
moci budoucnosti
Michal Berg, eSports.cz – Business modely na webu 2.0
Dobrá přednáška. Bavila mě. Opět tam byly uvedeny některé
skutečnosti pěkně v kontextu. Přednášející látce rozuměl. Opět
několik bodů:
- většina e-commerce řešení modelů na internetu jenom kopíruje modely
z reálného světa
- budoucnost e-commerce je pokrývání potřeb z nižších pater
Maslowovy pyramidy
- obsah spodních pater Maslowovy pyramidy se mění (např. mobilní telefon
je nyní ve spodních patrech)
- vydělávat lze na internetu pomocí:
- eshop
- reklamní systémy
- transakce a zprostředkování (aukce, inzeráty, platby)
- prodej digitálního obsahu
- prodej digitálních služeb
- byznys model webových služeb
- mobilní služby budoucnosti:
- jott.com – převod hlasu na text
- ubisafe.com – virtuální vodítko hlídající pohyb osob, webové
rozhraní
- serviceguy.org – kontakt na lokálního řemeslníka (propojení
virtuálního a reálného světa)
- zocdoc.com – smluvená návštěvy zubaře, lékaře (lékař platí
za umístění)
Tomáš Vávra, IBM – Využijte trendů „Web 2.0“ ve prospěch
vašeho businessu!
Tato přednáška mě nebavila. Pan Vávra je spíše obchodník. Mluvil
obchodní řečí. Ač jsem hodně chtěl, nebyl jsem schopen najít cokoliv, co
by mě zaujalo. Nemám z této přednášky žádné výpisky. Uvedu tedy
jenom oficiální popis k přednášce:
Dostat stávající aplikace na web a vše jednoduše propojit je nový
trend, který se souhrnně zjednodušeně označujeme jako „Web 2.0“.
Ukážeme Vám, jak pomocí stávajících aplikací získáte jednoduše novou
přidanou hodnotu pro Váš business a jak získat nové zákazníky!
Jiří Karpeta, Microsoft – Web 2.0 realita a budoucnost
Stejně jako v případě IBM mě i přednáška dalšího sponzora
akce Microsoftu příliš nebavila. Zde se ale nedá upřít přednášejícímu
živější a zajímavější prezentaci než v předchozím případě.
Pár poznámek:
- v případě Web 2.0 není technologie zcela hybatelem (příklad
– Outlook Web Access nebyla bomba)
- Web 2.0 funguje protože:
- rychlé připojení
- multimediální obsah
- našel se byznys model
- integrace (Yahoo pipes, MS Popfly)
- jednoduchost (FB, Windows Live, YouTube)
- komunikace (ICQ, Messenger)
- používání technologií ve firmě je věcí její kultury
Daniel Kostan, Czech & Slovak Professional Community – Business
& Social Networking v regione Ceskej a Slovenskej Republiky
Slovensky vedená přednáška, která měla obsah, který mě nějak
nedokázal zaujmout. Možná to bylo zaviněno mojí nedostatečnou odborností.
Vypsal jsem si jenom adreasu Czech & Slovak Professional Community –
www.cspc.cz.
Oficiální popis k přednášce:
Existujuce business a socialne siete u nas Pozicia LinkedIn a Xing a ich
vyuzivanie komunitou profesionalov CZ/SK regionu Paralelne aktivity a sprievodne
programy = vitalita a rast komunity Nahlad do buducnosti.
Tomáš Horák, Cisco – Cisco in Cisco
Opět přednáška, ze které jsem si mnoho neodnesl. Byly představovány
produkty firmy Cisco. Bohužel na stránkách konference nebyl k dispozici
ani oficiální popis přednášky.
Jiří Kodera, Abakowiki – Správa znalostí ve firmě pomocí webu
2.0
Velmi dobře připravená přednáška. Autor dobře rozumí dané
problematice. Zde je oficiální popis přednášky:
- rozlišení „webu 1.0“ a webu 2.0 z pohledu firmy
- způsob práce lidí s informacemi v době 2.0
- působení long-tailu ve firmě při práci se znalostmi
- působení filtrů při práci se znalostmi
- vliv změny paradigmatu od on-premise k on-demand řešení
- business přínosy webu 2.0 ve firmách
- dozrávání web 2.0 firemních aplikací a jejich budoucnost
Jan Horna, HorMart – Sociální sítě aneb jak je využít pro vaši
značku
Krásná přednáška. Pan Horna mluvil jasnou řečí. Mluvil
o sociálních sítích – způsoby používání, příklady
z praxe. V prezentaci bylo spousta příkladů, grafů. Celé krásně
srozumitelné.
Jan Kubr, Livispace – Hlasové aplikace jako nástroj spolutvorby
Přednáška pana Kubra se mi líbila z několika důvodů. Jednak
hodně dobře věděl, o čem mluví. Bylo na něm přímo znát, že dané
problematice rozumí. Dále se mi líbilo, že mluvil o vlastním produktu
– hlasových službách, které nabízí pod značkou TELFA. S panem Kubrem jsem mluvil
i během jedné přestávky a bylo vidět jeho zapálení pro věc a
znalosti. Myslím, že o jeho firmě zanedloho ještě hodně
uslyšíme.
Zde je oficiální popis přednášky:
Záznamy hlasu jsou osobnější než pouhý text a snadněji zaznamenatelné
než video. Cílem přednášky je ukázat, jak lze využít hlasových
aplikací pro crowdsourcing obsahu pro komunitní weby, především pak
politicky zaměřené democracy 2.0 projekty.
Petr Ocasek, BENETA.cz – Využití online videa a jeho přínosy pro
firmy
Velmi pěkná přednáška doplněná příklady ze života a pěknou
komunikací s publikem. Beneta se zabývá online videem. Pan Ocásek
např. zmínil, že přišlo několik firem z ČR a chtělo udělat
„stejný portál jako YouTube“. Všem se jim to prý podařilo
rozmluvit :). Líbilo se mi, že pan Ocásek nemluvil o online videu jako
o samospáse, ale jako o médiu, které se nehodí pro všechny a je
vždy velmi důležité posoudit jeho přínos pro naše podnikání.
Zde je oficiální popis přednášky:
- OV jako prostředek virální kampaně
- OV jako nástroj pro vzdělávání zaměstnanců
- OV jako nástroj pro zvyšování konverzního poměru na eshopu
- OV jako prostředek zvyšování návštěvnosti webu (SEO)
- OV jako nástroj pro snížení marketingových nákladů
- OV a jak na něm vydělat
- příklady a případové studie
Co mě nejvíc zaujalo
Byly to 2 přednášky. První hned ta úvodní od Adama Zbiejczuka
– Web 2.0 – Evoluce nebo chiméra. Druhá od Jana Kubra –
Hlasové aplikace jako nástroj spolutvorby.
Závěr
Akce měla hladký průběh. Mně osobně vůbec nevadilo cca 20ti minutové
zpoždění promotéra. Potkal jsem tam několik známých – Václava
Stoupu, Michaelu Vorlovou z H1. Organizačně výborně připraveno (sál,
technika, občerstvení, oběd). Ocenil bych jedinou změnu – více
odborně na úkor obchodně zaměřených přednášek, které mě osobně
vůbec nebavily. Mluvím o přednáškách sponzorů…bez kterých to
asi nejde.
Celý článek 25. Květen 2009
Připadá mi, že se svět kolem mě mění poslední dobou hrozně rychle.
Rok a půl po založení Maternie
(mimochodem, hledáme obchodního ředitele – více informací u mě na vyžádání) zakládám
další firmu – ITPlace.
Proč vznikl ITPlace?
Na začátku roku 2008 jsem nastoupil do Avedye. Pracoval jsem
opravdu na moc zajímavých projektech. Potkal jsem tam dost šikovných lidí.
Ale, jak jistě tušíte, každá pohádka má svůj konec. Avedya se dostala
(také přičiněním finanční krize) do problémů a nastalo propouštění
v několika vlnách. Skončí to pravděpodobně úplným zrušením celé
firmy v několika měsících. Česká pobočka končí za dva
měsíce.
V IT oboru došlo k propouštění ve spoustě pražských firem.
V tuto chvíli se na trhu dobré místo hledá hůře. Ale od kolegů,
kteří z Avedye odešli před několika měsíci, vím, že se nové
místo shání prostě hůř. Naproti tomu pozic pro kontraktory je stále dost
(možná dokonce víc).
Všechny tyto okolnosti vyústily v nápad založit si vlastní firmu
– ITPlace. A poskytovat java outsourcing. Firmu jsem
založil společně s Honzou
Šmukem. Honza je vynikající odborník na JEE, zkušený architekt a
scrummaster.
Proč by mohl ITPlace uspět?
- s vývojem JEE aplikací máme velké zkušenosti a dokážeme zvolit
přiměřeně komplexní řešení, které není zbytečně složité (a
časově náročné) a zároveň vyhovuje požadavkům
- kromě serverside Javy máme letité zkušenosti i s vývojem view
vrstvy (HTML, CSS)
- dokážeme klientovi poradit i s business stránkou věci –
poznáme usecasy s největší přidanou hodnotou
- máme zkušenosti s provozem vlastní firmy, která se pohybuje na poli
e-commerce
Závěr
ITPlace v současnosti intenzivně hledá klienty. Já věřím tomu,
že teď je ta nejlepší doba pro rozjetí vlastního podnikání v IT.
Hodně velkých (neefektivně fungujících) molochů krachuje nebo omezuje
svoji činnost. Malá firma s malými režijními náklady by mohlo být to
pravé.
Od této chvíle budu na tomto blogu zvěřejňovat jenom osobní články
(jako je tento) a odborné na našem firemním blogu – Blog ITPlace.
Celý článek 27. Duben 2009
Update – Michal změnil názor a nepřeje si, aby
o jeho startupu vycházely další články.
Dívám se na poslední článek blogu a vidím datum 21. října 2008.
Brrr…je to strasně dlouho. Přiznám se, že jsem kolem Vánoc rozepsal
článek „Jaký byl rok 2008“. V prvé řadě se mi narodila krásná dcera. Dál by
se nechalo říct, že celý rok probíhal ve znamení našeho eshopu. Kdo to sám neokusil neví,
kolik je práce rozjíždět od nuly lokomotivu (rozuměj novou firmu). Byla pro
mě velká škola okusit co to znamená konkurenční boj. Některé praktiky
jsou tvrdé, ale nevadí mi. Jiní konkurenti zase předvádějí věci, které
jsou doslova na zvracení.
Co se Maternii povedlo?
- vyrostly jsme z nuly mezi největší internetové obchody
s kontaktními čočkami
- máme skvělý tým, který se neustále rozrůstá (například pouze na
klientském servisu jsou 3 dívky)
- vybudovat kvalitní servis (výdejní místa, zelená linka, poradna)
- vyexpandovali jsme na Slovensko
To všechno díky tvrdé práci celého našeho týmu.
Michalův startup
Ve firmě, pro kterou pracuju jako kontraktor, došlo k velké mele.
Propustili skoro všechny programátory (zůstali jsme 4). Jeden z mých
(dnes už bývalých) kolegů se rozhodl, že si chce rozjet vlastní eshop.
Když mi tohle řekl, velmi jsem zbystřil. On se teď bude nacházet ve stejné
situaci jako já před rokem.
Ono víc kluků, kteří odešli z firmy chtějí mít něco vlastního.
I já s jedním kolegou něco plánuju :).
Takže Michal je rozhodnut rozjet eshop. Ještě nemá nic rozhodnuté:
- co vlastně bude prodávat
- zda použije hotový eshop nebo si naprogramuje vlastní
Napadlo mě (a Michal souhlasil), že bych vývoj mapoval v seriálu.
Myslím, že by mohlo být zajímavé sledovat jeho eshop od prvního
nápadu…až po první protočený milion.
Závěr
Toto je nultý článek našeho seriálu. Další články budou následovat
ve 14ti denních intervalech.
Celý článek 20. Březen 2009
Možná jsem někde zaspal, ale knihovnu EasyMock jsem začal používat teprve
nedávno u nás ve firmě. Jeho schopnosti a snadnost použití jsou tak
výrazné, že rozhodně stojí za představení.
K čemu je to vlastně dobré
EasyMock je pomocník pro psaní unit testů. Unit testy slouží
k otestování jedné třídy. Nezajímají nás objekty, se kterými
testovaná třída spolupracuje. Buď věříme tomu, že fungují
správně…a nebo tyto závislosti namockujeme.
Namocková je nahrazení skutečných spolupracujících tříd tzv mocky.
Mock je proxy implementující určitý interface. U této proxy máme
možnost nadefinovat její chování programově pomocí API.
Jak to funguje
- Vytvoříte mock objekt (1. řádek kódu)
- Nadefinujete jeho chování (včetně návratových typů a výjímek)
- Nadefinujete požadované volání metod (EasyMock kontroluje i jejich
pořadí)
- Přepnete se do přehrávací fáze
- Spustíte vlastní unit test
- EasyMock za vás ověří, že byly splněny všechny podmínky
nadefinované v bodě 2 a 3
EasyMock se velmi hodí tam, kde používáte návrhový vzor IoC a
potřebujete otestovat beanu, která potřebuje mít nasetované reference na
ostatní beany. Ideálně, když referencované beany jsou interfacy (EasyMock
umí mockovat pomocí rozšížení i classy). Pomocí EasyMocku si tedy
vytvoříte přislušné mocky, nahrajete jejich chování. Zavoláte testovanou
metodu a Easymock zkontroluje, zda všechno proběhlo podle vašich
požadavků.
Malá ukázka testu z příkladu (EasyMockDemo.zip, ZIP
260 KB): .
public class TestServiceImplTest extends TestCase {
private TestServiceImpl testServiceImpl;
private TestDao testDao;
public void test_getBeanById_ok() throws Exception {
Bean bean1 = new Bean();
bean1.setId(1);
EasyMock.expect(testDao.getBeanById(1)).andReturn(bean1);
replay();
Bean bean = testServiceImpl.getBeanById(1);
assertEquals(1, bean.getId());
verify();
}
public void test_getBeanById_null_returned() throws Exception {
EasyMock.expect(testDao.getBeanById(1)).andReturn(null);
replay();
Bean bean = testServiceImpl.getBeanById(1);
assertNull(bean);
verify();
}
public void test_getBeanById_exception_thrown() throws Exception {
Bean bean1 = new Bean();
bean1.setId(1);
EasyMock.expect(testDao.getBeanById(1)).andThrow(new DaoException("Some DAO exception"));
replay();
try {
testServiceImpl.getBeanById(1);
fail();
} catch (ServiceException e) {
}
verify();
}
protected void replay() {
EasyMock.replay(testDao);
}
protected void verify() {
EasyMock.verify(testDao);
}
@Override
protected void setUp() throws Exception {
super.setUp();
testServiceImpl = new TestServiceImpl();
testDao = EasyMock.createMock(TestDao.class);
testServiceImpl.setTestDao(testDao);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
testServiceImpl = null;
testDao = null;
}
}
Závěr
Bez mock testů si dnes unit testy už nedovedu představit.
Odkazy
Celý článek 21. Říjen 2008
„Ten blog Ti ňák chcípá“, řekl minulý týden kamarád Abe.
Tak…veselý začátek by byl a teď ke Google Chrome :)
Google mě zase překvapil. Vypustil do světa skvělý prohlížeč. Bez
chyb samozřejmě není, ale výčet kladů a věcí, které mě příjemně
překvapily přebývá. Google Chrome používám necelý týden od středy 3.
září 2008 kdy byl uvolněn. Zde je seznam věcí, kterých jsem si
všiml (klady, zápory, poznámky):
- Začnu záporem – chtěl jsem v Chrome napsat tento článek, ale
měl jsem smůlu. Používám Wordpress (verze 2.0.2) a
v administrátorské části pro psaní příspěvku jsem měl
v pravé části všechny boxy zavřené. Nešla tak vybrat například
rubrika a další věci.
- Na druhou stranu – V jedné diskusi o Chrome jsem četl, že
v něm nefungují Mapy.cz. Hned jsem to zkusil a fungovalo to. Vývojáři
z Googlu zřejmě dostaly nahlášený bug a během několika hodin ho
fixli. Takže myslím, že můj problém s Wordpressem bude během
několika hodiny také vyřešen (bug jsem zareportoval).
- Jako primárná prohlížeč jsem používal Operu. Chrome si od ní hodně
vypůjčil – klávesové zkratky, náhledy
s nejnavštěvovanějšími stránkami, chytrá adresová
řádka.
- Je to pekelně rychlý. Před několika týdny jsem si s fanfárou
stáhnul Firefox 3. Ten je ve srovnání s Chrome kulhající dědeček.
Rozdíl v rychlosti je asi dvojnásobný. Ne jenom v načítání
stránek, ale mám pocit, ze i flash má mnohem rychlejší odezvu na pohyb
myší například.
- Přechod na Chrome je bezbolestný. Nevím jak to přesně popsat. Ale
člověk v něm nic nemusí hledat všechno funguje. Stánky jako by se
zobrazoly už po naťukání prvních písmen do adresního řádku. Jediné co
mi trošilinku chybí jsou mouse gestures, na které jsem zvyklý
z Opery.
- Chrome není paměťžrout jako Firefox. Nebudete mi věřit – kolega
z práce, který má počítač puštěný v kuse 3 týdny (nerad
restartuje) má spotřebu paměti Firefoxem cca 800 MB (čtete správně).
Po upgradu a používání v tom samém stylu práce spotřeba
„klesla“ na 500 MB. A to má otevřeno pár záložek (max
10). Chrome běží sice ve více procesech, ale hospodaření s pamětí
je efektivnější. Zavřená záložka = ukončení procesu a komplentí
uvolnění paměti.
- Ovládací prvká zabírají (stejně jako u Opery) minimální místo.
Nahore najdete pruh záložek a pod ním pruh s adresovým řádkem. To je
vše. Žádná menu nebo lišta bookmarků.
- Chytnete záložku, vytáhnete kousek stranou a máte ji v samostatném
okně.
- Zavřené záložky jdou znovu zobrazit (stejně jako v Opeře)
klávesovou zkratkou CRTL+SHIFT+T.
Vytahnutí záložky
A nové okno z vytažené záložky
Závěr
Určitě se podívete na komiks.
Odkazy
Celý článek 9. Září 2008
Před nějakým časem se v Avedyi rozjížděl nový projekt. Jednalo
se o klasický webový chat. Vytvořil jsem tehdy jednoduchý prototyp.
Použil jsem DWR a technologii reverse ajax.
Pro tento článek jsem původní prototyp trochu rozšířil a zapojil jsem
Spring Framework a jako DAO vrstvu jsem vybral iBatis.
Krátce o iBatisu
I když iBatis není plnotučné ORM s klidem bych ho nasadil na
většinu projektů, na které jsem v minulosti použil Hibernate.
Stručný přehled vlastností a featur iBatisu:
- Konfigurace v XML podobně jako Hibernate.
- Veškeré SQL příkazy (insert, update, select) jsou nadefinovány přímo
v XML konfigurácích. V nich definujete placeholdery, které jsou
při vykonávání nahrazeny skutečnými hodnotami.
- Umí relace (1:1, 1:n, m:n)
- má vlastní kešování (kongurace opět v xml)
iBatis mě nadchnul a původně jsem o něm chtěl napsat krátký
článek. Ale když jsem viděl kolik zdrojů na (i českém) internetu je
rozmyslel jsem si to. Seznam zdrojů o iBatisu uvádím na konci
článku.
Krátce o DWR
O DWR jsem z na blogu již psal.
V tomto článku bych se blížeji podíval pouze na typy reverse ajaxu,
které nabízí.
Full Streaming Mode
Nejrychlejší způsob reverse ajaxu. Spojení zůstává otevřeno po dobu
60 sekund. Poté je vytvořeno nové (což se nemusí podařit pokud
browser již není otevřený např). Má dvě nevýhody:
- velká zátěž serveru (při velkém počtu klientů)
- proxy, antivirové program a různé moduly webserveru mohou držet data do
doby než se spojení ukončí (k zobrazování dat by pak docházelo pouze
jednou za 60 sekund)
Early Closing Mode (Long Polling)
Funguje tak, že server zavře spojení s klientem a vyžádá si
spojení nové v případě, že klientovi posíláme nějaká data.
Jestliže data neposíláme je chování stejné jako u Full Streaming
modu. Spojení s klientem není uzavřeno ihned, ale lze jej konfigurovat
pomocí parametru maxWaitAfterWrite. Typicky napstaveno na
500 ms. Server v tomto případě pošle klientovi zprávu, počtu
500 ms a poté ukončí a znovu otevře spojení s klientem.
Výhodou je odolnost vůči držení dat na straně proxy atd. Nevýhodou je
opět velká zátěž serveru.
Polling Mode
Polling Mode bych pravým reverse ajaxem ani nenazýval. Spočívá
v periodickém dotazování serveru klientem. Směr volání je klient
→ server, což je opakem předchozích dvou možností.
Full Streaming Mode je představitelem technologie
Comet – tzv. spojení mezi serverem a klientem
s dlouhou délkou života.
Příklad
Příkladem je jednochuchý chat. Základní usecasy jsou:
- nalogování uživatele
- zjištění aktuálního uživatele ze session
- odlogování
- poslání nového vzkazu (buď všem v chatu nebo jednomu
adresátovi)
Klient
Klientem je statická html stránka (index.html), která dělá dotazy na
server pomocí js souboru. V něm je volán DWR servlet. Pro komfort při
práci se stránou je použita i knihovna jQuery.
Server
Serverovou částí je javovská webové aplikace běžící
v libovolném servlet kontajneru. Jediným endpointem je DWR servlet. Jako
IOC kontajner je použit Spring Framework. Obsahuje jednu remotnutou servisní
beanu – chatService. Jsou zde dva doménové objekty
– User a Message.
Soubor dwr.xml obsahující konfiguraci remotnuté servisy a
bean convertor pro doménové objekty:
<dwr>
<allow>
<!-- configure service -->
<create creator="spring" javascript="ChatService" scope="application">
<param name="beanName" value="chatService"/>
</create>
<!-- configuje bean converter -->
<convert converter="bean" match="cz.vavru.test.dwr.domain.*"/>
</allow>
</dwr>
Soubor Message.xml s iBatis mapováním:
<sqlMap namespace="Message">
<typeAlias alias="message" type="cz.vavru.test.dwr.domain.Message"/>
<resultMap id="result" class="message">
<result property="messageId" column="messageId"/>
<result property="date" column="date" />
<result property="message" column="message"/>
<result property="sender.userId" column="senderId"/>
<result property="sender.nick" column="senderNick"/>
<result property="recipient.userId" column="recipientId"/>
<result property="recipient.nick" column="recipientNick"/>
</resultMap>
<select id="getMessages" resultMap="result">
select * from Message where recipientId is null or senderId = #userId# or recipientId = #userId#
</select>
<insert id="insertMessage">
insert into Message set date = #date#, senderId = #sender.userId#, senderNick = #sender.nick#, recipientId = #recipient.userId#, recipientNick = #recipient.nick#, message = #message#
<selectKey resultClass="int" keyProperty="messageId">
select last_insert_id() as messageId
</selectKey>
</insert>
</sqlMap>
Metoda getScriptSessionsToNotifyAboutNewMessage
z třídy
cz.vavru.test.dwr.util.DwrWebContextUtil. Úkolem
metody je vrátit kolekci objektů ScriptSession, které mají být
notifikovány o nově příchozí zprávě. Jak je z kódu vidět
v případě, že je vybraný adresář je notifikace poslána jenom
odesílateli nebo adresátovi. Proměnná webCtx je interface
org.directwebremoting.WebContext obsahují např odkaz
na aktuální ScriptSession (obdoba HttpSession). Na rozdíl od
HttpSession vzniká nová ScriptSession
s každým obnovením stránky (F5 v prohlížeči). Ohromnou výhodou
tohoto objektu je možnost uložit si do něj libovolný atribut. Já do něj
při zalogování ukládám informace o uživateli. A tak později
přesně vím, které scriptsešný mám zavolat:
@SuppressWarnings("unchecked")
public Collection<ScriptSession> getScriptSessionsToNotifyAboutNewMessage(Message message) {
Collection<ScriptSession> pageScriptSessions = (Collection<ScriptSession>) webCtx
.getScriptSessionsByPage(currentPage);
Collection<ScriptSession> scriptSessions = new ArrayList<ScriptSession>();
if (message.getRecipient() != null) {
for (Iterator<ScriptSession> it = pageScriptSessions.iterator(); it.hasNext();) {
ScriptSession scriptSession = it.next();
User user = (User) scriptSession.getAttribute(ChatServiceImpl.SCRIPT_CHAT_USER_SES_ATTR);
if(user == null) continue;
if (message.getSender().getUserId() == user.getUserId()
|| message.getRecipient().getUserId() == user.getUserId()) {
scriptSessions.add(scriptSession);
}
}
} else {
scriptSessions = pageScriptSessions;
}
return scriptSessions;
}
Posledním fragmentem kódu je metoda addMessage z třídy
cz.vavru.test.dwr.service.ChatServiceImpl.
@Transactional
public void addMessage(Message message) throws ChatServiceException {
WebContext webCtx = WebContextFactory.get();
User currentUser = (User) webCtx.getHttpServletRequest().getSession(true).getAttribute(
CHAT_USER_SES_ATTR);
message.setSender(currentUser);
message.setDate(new Date());
messageDao.insertMessage(message);
DwrWebContextUtil dwrUtil = new DwrWebContextUtil(WebContextFactory.get());
Collection<ScriptSession> scriptSessions = dwrUtil
.getScriptSessionsToNotifyAboutNewMessage(message);
logger.info("Sending info about new message to " + scriptSessions.size() + " users");
Util util = new Util(scriptSessions);
util.addFunctionCall("addMessage", message);
}
Celý příklad lze stáhnout zde – dwr-ajax.zip (zip, 9.9 MB). Archiv
obsahuje:
- zdrojové soubory (celý Eclipse projekt)
- dwr-ajax.sql s DDL
- war archiv
Závěr
Věřím, že se mi povedlo ukázat jak je spojení všech použitých
knihoven naprosto bezbolestné a jednoduché. Při testech na mém notebooku,
kdy jsem si v každém prohlížeči (IE, Opera, Mozilla) otevřel chat a
vstoupil pod jiným uživatelem, byl celý chat pekelně rychlý. Zpráva byla
zobrazena takřka okamžitě.
Odkazy
Celý článek 6. Červenec 2008
Starší články