Co teď dělám

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 Přidat komentář 18. Leden 2010

Čočkovník.cz - nový eshop na barevné kontaktní čočky

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.

Čočkovník.cz

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 5 komentářů 13. Srpen 2009

Co se mi nelíbí na zbožových vyhledavačích

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 7 komentářů 2. Srpen 2009

Jaká byla diskuse o MVC?

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 4 komentářů 5. Červen 2009

Jaká byla Konference Web 2.0?

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…souvis­lostmi. 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 1 komentář 25. Květen 2009

ITPlace - specialista na java outsourcing - startuje

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 1 komentář 27. Duben 2009

Eshop startup - Úvod

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 4 komentářů 20. Březen 2009

Unit testy s knihovnou EasyMock

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

  1. Vytvoříte mock objekt (1. řádek kódu)
  2. Nadefinujete jeho chování (včetně návratových typů a výjímek)
  3. Nadefinujete požadované volání metod (EasyMock kontroluje i jejich pořadí)
  4. Přepnete se do přehrávací fáze
  5. Spustíte vlastní unit test
  6. 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 3 komentářů 21. Říjen 2008

Google Chrome

„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ěvo­vaně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 6 komentářů 9. Září 2008

Reverse Ajax s DWR, Spring, iBatis

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 maxWaitAfterWri­te. 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 getScriptSessi­onsToNotifyAbou­tNewMessage z třídy cz.vavru.test­.dwr.util.DwrWeb­ContextUtil. Ú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.directwebre­moting.WebCon­text 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.Chat­ServiceImpl.

@Transactional
public void addMessage(Message message) throws ChatServiceException {
        WebContext webCtx = WebContextFactory.get();
        // zjisteni aktualniho usera ze session
        User currentUser = (User) webCtx.getHttpServletRequest().getSession(true).getAttribute(
                        CHAT_USER_SES_ATTR);

        // nastaveni odesilatele a data
        message.setSender(currentUser);
        message.setDate(new Date());

        // vlozeni message do databaze
        messageDao.insertMessage(message);

        DwrWebContextUtil dwrUtil = new DwrWebContextUtil(WebContextFactory.get());
        // zjisteni vsech scriptsession, ktere mame notifikovat o nove zprave
        Collection<ScriptSession> scriptSessions = dwrUtil
                        .getScriptSessionsToNotifyAboutNewMessage(message);

        logger.info("Sending info about new message to " + scriptSessions.size() + " users");

        Util util = new Util(scriptSessions);
        // timto zpusobem se vola primo kod na strane klienta
        // nasledujici radek tedy zavola javascriptovou funkci addMessage (viz soubor js/chat.js) s parametrem message
        // objekt message, ze samozrejme preveden do javascriptoveho sveta
        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 Přidat komentář 6. Červenec 2008

Starší články


Kategorie

Odkazy

Zdroje

Locations of visitors to this page