Kohort Analýza

Empiricky jsem v minulém týdnu ověřil, že náhodný vzorek studentů na VŠ nezná tak super věc, jako jsou reporty s "Cohortama". Takže děcka:

Kohort Analýza není typ reportu ale spíš reportovací technika. Kohorta je skupina objektů, které sdílejí jednu společnou vlastnost. Je to velmi jednoduchá věc s velkým potenciálem, která jde dělat nad jednoduchou tabulkou. Cílem téhle analýzy je rozkrýt trendy právě přes dimenzi těch společných vlastností.

Mějme tabulku předplatného, kde je ID transakce (platba každý měsíc), ID předplatitele, Datum ve kterém předplatné vzniklo, Datum kdy jsme se se zákazníkem prvně potkali a cena kterou předplatné v daný měsíc stálo:

Je-li kohortou moment vzniku předplatného, můžeme si pak veškerý náš měsíční příjem "obarvit" měsícem vzniku předplatného. Tady je to vyjádřené v % - tedy kolik procent našeho obratu tvoří předplatitelé, které jsem získali v daném měsíci:

Vypadá to trochu jako hezká tapeta, ale když se podíváte na červen 2012, můžete vidět, kolik obratu nám dělají lidi, které jsme sehnali (zobchodovali) v březnu 2011.  

Tady je vidět jak to vypadá u služby SEOmoz (dnešní moz.com). Moz.com je služba placená měsíčně. Někdy kolem března 2009 se rozhodli dát novým lidem službu na 3 měsíce zadarmo. Reakcí na to byl ohromný zájem - a služba okamžitě zdvojnásobila svojí uživatelskou základnu. Jakmile akce skončila, polovina uživatelů zase odešla. Vypadalo to takhle:

Kohortou je tady, stejně jako v horním příkladu, měsíc registrace. Y-osa (vlevo) pak ukazuje počet uživatelů. 

Pokud se na to celé podíváme optikou peněz, dostaneme trochu jiný pohled:

Je krásně vidět, že nárůst uživatelů po dobu "akce" nevedl k žádnému zásadnímu zisku. Jakmile ale akce skončila, masivně se zvedl příjem služby - asi o $100k/měsíc. 

Rada na závěr: společný atribut může být téměř cokoliv, datum registrace, "tag" marketingové akce nebo nějaká jasně definovaná incentiva, kterou pro lidi děláme. Díky zobrazeným kohortám pak můžeme poměrně snadno získat povědomí, "co se nám vyplatí pro uživatele dělat". Pokud plocha toho modrého pruhu z posledního obrázku bude v čase větší než náklady na akviziční akci, vyhráli jsme. Známe-li navíc metriku CLV (client lifetime value), můžeme to celé zohlednit v souvislostech. Pak získáme odvahu k (drahým) akcím typu: "hej, pozveme kravaťáky na golf, oni si pak něco koupí".

Howg!


UPDATE 2013-12-10: Pavel Jašek v komentáři na facebooku doplňuje další info k CLV metrikám na své prezentaci na SlideShare

BI kuchyně: Seznam.cz a jejich "data-archeologický" tým - část 1.

Z kraje léta jsem s Michalem Buzkem dělal z Kanady po emailu rozhovor o tom, jaký je jeho pracovní svět. Než jsem to stihl punkově publikovat, vymklo se mi to z rukou. A tak teď představuju českou verzi rozhovoru po úpravě od Martina Brabce, jehož Obsahovou Agenturu jsme najali, aby nám pomohl s naším firemním blogem, kterým brzo začneme otravovat vaše životy :-) 


Investice do Business Intelligence se nám za tři měsíce vrátila desetinásobně, říká Michal Buzek, hlavní analytik Seznamu

Největší český internetový portál Seznam.cz vybudoval kromě vyhledávače konkurujícího Googlu také impérium prosperujících služeb – od vlastního e-mailu po inzertní weby a síť kontextové reklamy Sklik.

Jak využívá kolos o tisícovce zaměstnanců služby GoodData? A jak pomáhá zlepšovat výsledky obchodního týmu? To vše a mnoho dalšího najdete v dvoudílném rozhovoru s vedoucím analytiků Michalem Buzkem.


Jak to celé začalo?

Někdy kolem roku 2009 probíhalo v Seznamu výběrové řízení na Business Intelligence nástroj. Pavel Zima (tehdejší CEO Seznamu, dnes generální ředitel a místopředseda představenstva) tehdy přizval i GoodData. Já jsem byl v týmu, porovnával nabídky a dával doporučení vedení. Několikrát jsme se sešli se Zdeňkem Svobodou (spoluzakladatel GoodData), který nám předvedl, co to umí. Dostal od nás vzorek obchodních dat z Sauto.cz (inzertní web Seznamu zaměřený na prodej aut a motorek) a za pár dní už nám přinesl základní reporty včetně vizualizace.

Oproti licencovaným BI nástrojům to bylo strašně jednoduché a rychlé, pan Svoboda to navíc uměl i velmi přirozeně a nenásilně prodat.

Proč jste vlastně hledali Business Intelligence nástroj?

Potřebovali jsme se dostat z doby excelové, kdy si každý nosil na poradu vlastní report, pochopitelně s nestálou kvalitou dat. Také jsme tehdy měli asi čtyři obchodní systémy, účetní systém a elektronickou peněženku. Zkrátka, hledali jsme jednotný reportingový nástroj, ve kterém budeme mít všechna data s jednotnými metrikami.

A jak jste při tom narazili na Keboolu?

GoodData jsme používali už asi dva roky. Občas jsme požádali o úpravu datového modelu, ale do žádných větších věcí jsme se nepouštěli. Pak ale PR oddělení přišlo s tím, že GoodData umožňuje sledovat statistiky z firemních účtů na sociálních sítích. A protože nejlepší konektory na data z Facebooku a Twitteru dělala pro GoodData právě Keboola, objevili jste se na schůzce vy.

Jaký byl tvůj první dojem?

Konečně přišel někdo oblečený stejně jako lidi, které jsem potkával v Seznamu na chodbě. Žádní kravaťáci.

Začalo to tedy projektem pro vytěžení dat ze sociálních sítí?

Ano. Už předtím jsem chtěl v GoodData zkusit pár nových věcí. Rozšířit datové modely, více si hrát nad pohledy, o kterých jsem nevěděl, jestli pro ně nadchnu ještě někoho dalšího. Chtěl jsem taky zrychlit přidávání nových věcí, aniž bych musel oslovovat konzultanty z GoodData.

A do toho jste přišli vy, ukázali mi pár vychytávek jak vylepšit Dashboard v GoodData a pak i váš vlastní nástroj Keboola Connection. Nebudu kecat, taky se ke mně dostal post Tomáše Čupra (známý český podnikatel, zakladatel nejúspěšnější české variace na Groupon, Slevomat.cz, dnes CEO DámeJídlo.cz) o tom, jak jste mu změnili život :-)

Jak to pokračovalo?

V březnu 2013 jsme začali stavět nový projekt pro obchodní oddělení, kterým jsem chtěl dát obchodníkům zásadní důvod, proč používat GoodData. Už pár let jsme nakupovali data z monitoringu inzerce s útratami firem za velkoformátovou reklamu. Nijak zvlášť jsme ale jejich potenciál nevyužívali.

Nově jsme data z monitoringu v GoodData napojili na náš obchodní systém. Obchodníkům jsme tak dali do rukou jednoduchý nástroj, ve kterém si mohou o svém klientovi zjistit, kde a za co utrácí, v jakém období inzeruje nejvíce, a zda nezapomíná inzerovat i na Seznamu. Tím se posunul pohled na stávající nebo potenciální klienty ne o jeden, ale tak o pět levelů výš.

Bylo pro vás složité naučit se pracovat s Keboola Connection?

Ne, nemuseli jsme se nic extra učit. Datové transformace se  v Keboola Connection píšou v SQL, který náš tým ovládá. Já osobně jsem se do toho po pár týdnech docela dostal. Mojí oblíbenou hračkou je Sandbox, tréninkové prostředí, do kterého si posílám vstupní tabulky, a kde si ladím dotazy tak dlouho, dokud nevypadne odpovídající výsledek.

Co jste už zvládli vytvořit?

Náš obchod je docela velký a členitý, požadavky na přehledy v GoodData se tým od týmu liší. Jiné reporty chtějí lidé z Skliku, jiné tým specializovaný na velké klienty. Proto projekt pořád rozvíjíme, není to tak, že bychom jednou něco nastavili a měli pokoj. Ještě jsem ale nesetkal s požadavkem, který bychom pomocí Keboola Connection s GoodData nevyřešili. A to sbíráme podněty od kohokoliv.


A konkrétně?

V GoodData dnes máme několik projektů od sociálních sítí po sledování nákupního chování klientů. Ty například dělíme podle oborů, sledujeme jejich sezónnost z pohledu návštěvnosti kategorií na Firmy.cz (největší český katalog firem, patří pod Seznam.cz) a snažíme se je podle toho aktivně oslovovat. Obchodník si na svém dashboardu vybere kategorii, dostane se na report klientů, vidí jejich bonitu i útraty mimo Seznam. A přesně ví, koho a kdy oslovit. 

Jaká je na Keboola Connection a GoodData odezva v obchodním týmu?

Od obchodních manažerů, kteří díky tomu mají své lidi pod téměř 100% kontrolou, je zpětná vazba samozřejmě velmi pozitivní. Když od obchodního manažera s osmiletou praxí v Seznamu slyšíte, že si už svou práci neumí bez přehledů a informací z GoodData představit, tak se to poslouchá hezky.

Vyplácí se vám to finančně?

Po třech měsících běhu projektu jsem si prošel evidenci obchodních manažerů a očistil ji jen na peníze, o kterých 100% víme, že jsme je vydělali díky informacím z GoodData. Nemůžu říct přesná čísla, ale náklady na databázi a konzultace v řádu statisíců vyvážil více než pětimilionový výnos.

Takže vyplácí.

Jasně. GoodData navíc pomáhá peníze nejen vydělávat, ale i šetřit. Obchodník dnes může využívat svůj čas i energii jen tam, kde to má smysl. Neřídíme se už jen pocity, ale stále více daty. Vidíme přehledy nákladů do nejmenších detailů. Umíme najít příčiny nárůstů a přesně si zjistíme, co a jak nejvíc ovlivňuje výši zisku.

==========

Jak vypadají konkrétní reporty?  Kolik lidí v Seznamu dnes s daty vlastně pracuje? A už někoho z obchodníků kvůli podrobné analytice propustili? Pokračování rozhovoru s Michalem Buzkem najdete zde.
 

12.480 hodin práce

Zítra mám v GoodData ekosystému 4. narozeniny. 

Za tu dobu jsem stihl odpracovat přes 12.000 hodin práce, naučil se jinak o věcech přemýšlet, probděl nespočet nocí, trpěl komunikací přes mnoho časových pásem, poslal stovky supportních ticketů do GoodData a zpracoval desítky zákaznických projektů. Ale hlavně jsem poznal spoustu skvělých lidí a naučil se obrovské množství zajímavých věcí, který mě posunuly o notný kus dopředu. 

Přeju si, aby se mi dařilo Keboolu udržet stejně svěží, svobodnou a nadšenou. Aby se dál neevidovala docházka, přestala počítat dovolená, vývojáři se nehádali s analytikama, z poza oceánu lítalo míň Zendesk ticketů a klienti stále psali jen spokojené dopisy.


Nic z toho by ale nikdy nevzniklo, nemít doma trpělivou Alenu, nebýt lidí v GoodData, kteří nám nesmírně pomáhají, nebýt našich klientů, kteří nám důvěřují a hlavně nebýt skvělých lidí v Keboole, který mi pomáhají táhnout tuhle káru dál.  

Jsem vám všem za to moc vděčnej,

Díky!

Amazon Kinesis - jak nám cloud opět rozšířil možnosti

Amazon Kinesis je služba v rámci Amazon Web Services (AWS), která umožňuje zpracování jakýchkoliv dat v reálném čase. Aktuálně běží v neveřejném režimu a přístup k ní se schvaluje žádost po žádosti (moje žádost trvala asi 2 dny).


K čemu to je?

Zatím to zkoumám, ale nevypadá to jako něco moc revolučního. V podstatě jde o to, že Kinesis pro nás provozuje frontu na data, do které může padat cokoliv odkudkoliv a jakoukoliv rychlostí. My si musíme napsat aplikaci, která si z fronty data bere, něco s nima dělá a vrací je na výstupu (třeba zase do jiné Kinesis fronty). Kinesis samotný s psaním aplikací na zpracování dat nijak moc nepomáhá. K dispozici je SDK pro Kinesis - tedy obalené funkce typu GetNextRecords


A konkrétní příklady?

  • zpracování logů
  • analýza dat v reálném čase
  • odchycení a zpracování dat ze sociálních sítí
  • analýza finančních transakcí
  • gaming analytika
  • strojové účení


Kolik to stojí?

Kinesis se, stejně jako všechno ostatní v AWS, platí po hodině provozu za provozní jednotku (shard). Jeden shard zvládne přijímat data rychlostí 1MB/sekundu a odesílat rychlostí 2MB/sekundu. Aktuálním limitem na jeden vložený datový objekt je 50kB. Text tohohle blogpostu by jeden "shard" zvládl přijmout zhruba 500x/sekundu. Cena ze tenhle nejmenší "shard" je $0.015 za hodinu. Další a poslední cena je za vkládající operace. Jeden milion vložení (přijetí) datových objektů stojí $0.028. 

Když bych zůstal u objemu tohohle blogpostu a řekl, že má 3.5kB, pak kdyby chodil do Kinesis takovýhle text 300x/sekundu celý měsíc, stálo by to:

  • 1 shard = $11.16 / měsíc
  • vložení textu 500x/sekundu = 803.520.000 vložení za měsíc = $37,49 / měsíc (vložení = příjem jednoho blogpostu)


Suma sumárum

Největší přidanou hodnotou je tedy hlavně držení streamu dat, o který se nemusíme starat. Bude to možná poměrně konkurence pro Pusher. Pro Keboola Connection je to hlavně příležitost - de-facto na podobném principu dávno fungujeme a Kinesis nám může pomoct "zpevnit základy". 

Znovu se tedy potvrzuje to co jsem psal na konci staršího blogpostu - nejenom díky Kinesis si můžeme troufnout na náročnější projekty a cítit se v Cloudu silnější. 

K vidění na Kinesis zatím moc není, tady je promo video a odkazy na dokumentaci. Přikládám screenshoty z aktuální Management Console.

GoodData XAE - BI gamechanger

Z kraje léta spustila GoodData do ostrého provozu svůj nový analytický engine AQE (Algebraic Query Engine), který má oficiální produktové jméno GoodData XAE. XAE je ale určitě čínsky “podviživený kuře”, takže já zůstanu u AQE :-) Od prvního momentu je to pro mě věc s největší přidanou hodnotou - když mi to Miki ukazoval, zamiloval jsem se na první dobrou :-)

Úvod lehce ze široka

Každý systém, který má ambice vizualizovat data, potřebuje nějaký matematický aparát. Pokud jako vstup budu mít prodané položky a jména obchodníků a budu z toho chtít zjistit medián obratu obchodníka, musí nejprve někde na pozadí proběhnout sečtení všech prodaných položek v daném měsíci pro každého obchodníka a nad tímto výsledkem pak můžeme počítat medián. Levá tabulka je surový vstup, pravá je odvozená za pochodu a většinou si ani neuvědomujeme, že takové mezi výstupy vznikají. Nad tou pravou pak můžu počítat věci jako nejlepší obchodník měsíce, průměrný/“mediánový”, aj.:

Pokud nemám robustní analytický backend, nemůžu si dovolit dělat “co mě napadne”, ale musím uživatele svázat do nějakých předpřipravených “vertikálních” analýz (churn analýza zákazníků eshopu, RFM segmentace, kohorty předplatného, aj.). Vrtat se v datech je možné mnoha způsoby. Kromě GoodData, které tady chystám vyvrcholení :), máte na trhu BI nástroje jako Birst, Domo, Klipfolio, RJMetrics, Jaspersoft, Pentaho a mrtě dalších. Vypadají super! O některých z nich jsem se otřel dříve. Osamocený datový analytik pak ještě sáhne po Rku, SPSS, RapidMineru, Weku, aj. - ale to nejsou BI nástroje. 

Většina ze zmíněných BI nástrojů nemá propracovaný matematický aparát, takže vám umožní čísla sečíst, spočítat četnost prvků, zjistit maximum, minimum a průměr. Tady je to krásně vidět na promo videu RJMetrics.

Systémy jako je Domo.com nebo KlipFolio.com pak řeší problém absence matematického aparátu trochu trikem. Lidem nabízejí spoustu matematických funkcní - jak v excelu - které jdou ale aplikovat na jednotlivé tabulky, ale ne na celý datový model. Někdo si řekne, že je to jedno, ale opak je pravdou - tohle je prubířský kámen všeho kolem datové analytiky. Zkusím vysvětlit proč.

Hranice našeho pískoviště stojí na aplikaci zákona o zachování "business energie”: 

"pokud nedokážeme našemu zákazníkovi vydělat větší peníze než ho naše služby (a licence GoodData) stojí, nebude s náma spolupracovat"

Pokud vezmeme výpis faktur ze SAPu a nakreslíme graf “jak to roste”, poženou nás zákazníci jako sedláky u Chlumce. My potřebujeme trochu víc, potřebujeme dávat za pochodu jednotlivé datové dimenze do souvislostí (dimenze = tématický soubor dat, nejčastěji reprezentovaný jako tabulka dat - dimenze mezi sebou nemusí mít žádné jasně definované vazby; tabulku v analytickém projektu nazýváme datasetem). 

V momentě, kdy dáme jednotlivým dimenzím souvislosti, vznikne logický datový model. Logický model popisuje “business” souvislosti a často není shodný s technickým modelem, ve kterém ukládá data nějaký systém. Pokud má například Mironet e-shop, je databáze za tímto eshopem optimalizovaná pro potřeby e-shopu, nikoliv finanční, obchodní a/nebo subscription analytiky. Čím složitější je prostředí, jehož data se analyzují, tím méně podobností mají technické a analytické datové modely. Nízká (strukturální) podobnost zdrojových dat a dat, které potřebujeme k analýze, vyřazuje většinu GoodData konkurence. 

Dám příklad na našem interním projektu. Interní projekt jsem vybral proto, že obsahuje logický model, který potřebujeme používat sami pro sebe. Není to tedy uměle nafouklé “protože to zákazník zaplatí”.

Do GoodData nahráváme různé tabulky, které jsou spojené vazbama. Vazby definují logický model; logický model pak definuje “co jde s daty dělat". Náš interní projekt slouží k měření naší vlastní aktivity a spojuje data z českého účetnictví (Pohoda), kanadského účetnictví (QuickBooks), z vykazovací cloudové aplikace Paymo.biz a několik Google Drive dokumentů. V interním projektu máme 18 datasetů a 4 datumové dimenze.

Obecnější model vypadá takto a detailní model vypadá takto. Červeně jsem označil jméno klienta, černě jméno našeho analytika a modře odpracované hodiny. Chci tím ukázat, že jsou jednotlivé související informace v projektu bohatě rozprostřeny. Díky vazbám GoodData ví, co dohromady dává smysl.

Nad tímhle modelem stavíme dashboardy, ve kterých sledujeme, jak nám jde práce od ruky, srovnáváme mezi sebou měsíce, lidi, druhy práce, koukáme na náklady a výnosy, aj.

Cokoliv v tom našem dashboardu je přesně šité na míru naší potřebě. Nikdo nám nediktoval, jak se to bude chovat. Tahle volnost je pro nás kritická a jen díky ní dokážeme stavět nad GoodData cokoliv si zamaneme = je jen na naší schopnosti, jestli uspějeme a zákazník s náma bude spokojený. 

Trochu pastička na zákazníka je v tom, že podobný dashboard je možné na první pohled sestavit v ledasčem. Mám tady příklady dashboardů z KlipFolio. Jsou super, ale mají jedno podstatné “ale” - všechny vizuální komponenty jsou objekty, které načítají informace z předem připravených dat, které někdo designoval přesně pro účely toho dashboardu. Není možné to překroutit a začít třeba 2 čísla ze dvou podkladových tabulek podělit a sledovat jejich podíl v čase. A month-to-date toho podílu už vůbec ne. O situaci, kdy máte data, ve kterých jsou vazby “many to many”, nemá smysl vůbec mluvit. Velká výhoda těhle BI produktů (řikají si BI, ale BI to není) je v tom, že jsou líbivé a podbízivé. Člověk na startu neodhadne, že si kupuje křáp, který vlastně neumí o moc víc než jeho Excel.

Proč je trh zaplavený produkty, které hrají na maličkém hřišti se stěnama vylepenýma cool vizualizacema? Nevím, ale lidi jedou na vlně “Cool, BigData analytika!” a jsou hladový po čemkoliv co má podobu reportu. Tématická analytika se udělá za pár dní - transformace transakcí a počítání "Customer lifetime value" je snadná, dokud mi každý neřiká jak to chce mít podle sebe. 

"Nikdo na světě kromě GoodData nemá schopnost provozovat analytické projekty, které jsou 100% svobodné svojí podstatou (datovým modelem) a v těchto projektech nechat lidi dělat cokoliv chtějí, aniž by museli být low-level data analytici a/nebo programátoři. Bum!”

Jak to GoodData dělá?

V Excelu je každý zvyklý sečíst sloupeček “A” tím, že dá do libovolné buňky vzoreček “=SUM(A:A)”. V GoodData sečte sloupeček A tím, že napíše vzoreček “SELECT SUM(A)”. Jazyku kterým se v GoodData tyhle vzorečky píšou se říká MAQL - mnohodimenzionální analytický dotazovací jazyk (Multi-Dimension Analytical Query Language). Zní to děsivě, ale zatím to každéj dal, i Pavel Hacker má z Keboola Academy diplom na Report Mastera :-). Pokud se podíváte zpátky na ten můj datový model z našeho interního projektu, můžete si říct, že chcete průměrný počet hodin z jedné strany datového modelu, ale filtrovaný třeba typem úkonu, seskupený podle popisu projektů a jména klienta a to celé jen pro úkony, které proběhly o víkendu odpoledne. Všechny metriky budou vypadat jako “SELECT AVG(hours_entries) WHERE name(task) = úklid”. Multidimenzionalita toho jazyka je v tom, že neřešíte, v jaké dimenzi je jméno úkolu a v jakém je vztahu k počtu vykázaných hodin a nedejbože jménu klienta. GoodData, resp. vztahy v logickém modelu, který pro klienta navrhujeme my, za vás pořeší úplně všechno.

A teď jádro pudla: pokud vám připravím (denormalizovanou) tabulku do Excelu ve které to bude pěkně na zakázku sesypané dohromady, nebude to nikomu kdo tohle čte, dávat problém spočítat. Pokud vám dám data rozdělená podle dimenzí (a dimenze bude často jiný zdroj dat - jako jsou výstupy z našeho českého a kanadského účetnictví), bude to potřeba zpracovat mnohem složitějc (nejspíš začnete v SQL joinovat jako zuřivý). Jelikož se svět nedá popsat jednou tabulkou (teda asi dá - key value pair - ale nepůjde s ní moc pracovat), je pohled přes mnoho dimenzí tím podstatným. Bez něj je všechno jen takové to domácí počítáníčko :)

Kalibrace pozornosti: teď už byste pomalu mohli říct “wow”, protože pokud se vrtáte v datech, mohli byste mít vysokou míru afinity k popsané situaci :)

Jdeme do finále

Výroba dotazovacího jazyka je nejsložitější úkol, který v BI dneska můžete řešit. Není to o uložení velkých dat, není to o jejich zpracování, ani vykreslení grafů nebo příprava API, aby se dalo s váma perfektně spolupracovat. Dotazovací jazyk si nekoupíte ani za měsíc nenaprogramujete. 

Pokud bude jazyk složitej, nebude ho umět zákazník používat. Pokud bude jazyk hloupej, nebude s ním schopný dělat co chce. GoodData má jednoduchý jazyk na vyjádření jakkoliv složitých otázek směřovaných do dat a zároveň má aparát, kterým tento jazyk napasuje na jakkoliv složitý BI projekt (logický datový model). V případě GoodData je to právě MAQL/AQE - z mého pohledu je to tou jedinou věcí, která je na GoodData neopakovatelná. Kluci z Brna a Prahy - Tomáš Janoušek, David Kubečka a Tomáš Jirotka - navíc rozšířili AQE sadou matematických důkazů (složitá algebra), díky kterým je možné rychle testovat, že nové funkce v AQE platí pro jakékoliv druhy logických modelů. GoodData tak má jistotu, že překlady mezi (MAQL) metrikama a nějakým SQL na spodních databázích jsou správně. AQE tak pro běžného člověka překlene propast, která ho dělí od low-level scriptování. 

UPDATE 17.11.2013: MAQL je dotazovací jazyk, který je na základě logického modelu (LDM) překládaný pomocí MAQL interpretru (dříve QT - "Query Tree" engine) do stromu dotazů. Tyhle dotazy jsou vlastně definice "star joinů", ze kterých "Star Join Generator" (SJG) vyrábí podle fyzického datového modelu (PDM - leží pod LDM) vlastní SQL dotazy na DB backend. Celé to na začátku dal dohromady Michal Dovrtěl a Hynek Vychodil. Nová implementace AQE tohle všechno navíc položila na solidní matematický základ ROLAP algebry (podobá se relační algebře).

Po týdnech přemlouvání a úplatcích jsem vydyndal lehce cenzurované vzory dotazů, které AQE vyrábí z metrik, které jsem pro tenhle účel napsal. Tuším, že je to poprvé, kdy to někdo veřejně publikuje!

Pro srovnání jsem vzal datový model z Report Master kurzu v Keboola Academy a nad ním udělal report:

Graf mi na pravé Y ose ukazuje, kolik jsem udělal v Afgánistánu, Albánii, Alžíru a Americké Samoe kontraktů za posledních 13 měsíců. Na levé Y ose mi ukazuje modrou čárou, kolik mi přinesl průměrný obchodník a zelenou čárou mi ukazuje kolik byl medián obratu na obchodníka v daném měsíci (vstupy jsou de-facto shodné s ukázkovou tabulkou úplně na začátku).

Graf tedy obsahuje tři metriky (viz legenda pod grafem):

  • "# IDs” = SELECT COUNT(ID (Orders)) - spočítá počet prvků
  • “prumer na obchodnika” = SELECT AVG(obrat na obchodníka) - spočítá průměr z (pomocné) metriky počítající sumu obratu na obchodníka
  • “median na obchodnika” = SELECT MEDIAN(obrat na obchodníka) - spočítá medián z (pomocné) metriky počítající sumu obratu na obchodníka

a pomocná metrika

  • "obrat na obchodníka” = SELECT SUM(totalPrice (Orders)) BY employeeName (Employees) - spočítá hodnoty položek (nějaké prodeje) na úrovni obchodníka

Všechno je samovysvětlující, snad jedině “BY”, což mi definuje, že se mi peníze “totalPrice (Orders)” spočítají podle obchodníků a ne chaoticky mezi sebou. Troufám si tvrdit, že každý kdo je ochotný a bude se maličko snažit, se to naučí (ostatně to v Keboola Academy učíme jak na běžícím pásu). 

A teď to hlavní. AQE to přeloží na následující SQL:

S trochou nadsázky lze říct, že sestavení mého reportu je vlastně poměrně dost složité, ale mě to díky AQE vůbec netrápí. Platí-li hypotéza, že:

  1. pokud mi GoodData nevydělá balík peněz, tak ji nebudu používat
  2. balík peněz vydělám jen přesným používáním BI projektu, šitým na tělo
  3. BI šité na tělo je komplexní záležitost, kterou je možné obsloužit jen díky AQE

… pak je AQE základem úspěchu GoodData.

UPDATE 17.11.2013: jak to léta používám, vůbec mi nedošlo to zásadní - kontextovost MAQL metrik - úplně se mi to vrylo pod kůži a jinak si to neumím představit. Perfektně to pospal Hynek Vychodil v komentáři dole (nejde tu konkrétní komentář linkovat, tak tady je pro jistotu screenshot

Poznámka pod čarou: výše uvedené MAQL metriky jsou jednoduché příklady. Někdy je potřeba metriku postavit tak složitě, že je až nepředstavitelné, co se s daty musí na pozadí stát. Tady je příklad metriky z jednoho projektu, kde je analytika nad nestrukturovanými texty. Metrika počítá konverzační témata v aktuálním (zvoleném) období podle moderátorů:

Lukáš Křečan před časem blognul, že lidi jsou největší konkurenční výhoda GoodData. 

Lidi jsou základ, bez nich to určitě nejde a jsou to oni, kdo tvoří neopakovatelnou atmosféru ve které vznikají unikátní věci. Jeden za druhým jsou ale nahraditelní. Největší konkurenční výhoda GoodData (a zároveň zásadní duševní vlastnictví) je AQE. Pokud by ho neměla, musel by uživatel reporty klikat v sevřeném UI, které mu vezme tolik potřebnou flexibilitu. Bez AQE bude GoodData někde v partě mezi Tableau, Bime, Birst, aj. Stane se v zásadě nezajímavou a bude zhusta soupeřit s firmama, co si nad “Redshiftama" budou stavět vlastní UI.

AQE je pro GoodData neopakovatelná příležitost jak utéct konkurenci, která bude už jen ztrácet. Nikdo jiný dneska nedokáže implementovat novou funkci do produktu, kde mohou být libovolná data v libovolně rozměrech (dimenzích) a přitom si analyticky dokázat a otestovat správnost implementace. 

Hranice mezi falešnou představou že “ten cool dashboard je pro mě přínosný” a "opravdovým potenciálem vytěžitelným z dat", je velmi tenká... a jmenuje se customizace. Libovolný model pro libovolná data a nad ním libovolné výpočty. Může to kdokoliv nazvat jako extrém, ale bez schopnosti spočítat přes mnoho dimenzí přirozený logaritmus z podílu hodnot dvou období, do světa finanční analytiky díru neuděláte. AQE je gamechanger na poli BI a díky němu GoodData redefinuje pravidla hry. Dneska obecná odmocnina, zítra K-means... :)


Howg!


Trocha čísel z backendu

Kouk jsem se dneska na to, kolik dat držíme a zpracováváme v Keboola Connection. Nejsou to žádný ultra objemy, ale když si uvědomíme, že jsou to primárně čistý obchodní informace našich klientů (transakce a číselníky), je to docela dost. Nepočítám do toho náma vygenerovaný logy a eventy, popisující provozní parametry, ani zálohy a podobné věci. 

Vzal jsem v úvahu období od začátku minulého měsíce do včerejška, čísla jsou vždy agregovaná za jeden konkrétní nejaktivnější den:

  • Počet operací proti Storage API: 37.689
  • Objem přijatých dat: 26.5 GB
  • Objem odeslaných dat: 33.5 GB
  • Čas strávený obohacováním dat: 1.992.890 sec (23 dní!)

A ještě 3 celkové statistiky k dnešnímu dni:

  • Celkový objem držených (živých) dat: 1.3TB 
  • Počet všech řádků : 6 miliard
  • 5 nejčastějších chyb v API: 
    • nesedící struktura dat při importu od klienta
    • validace obsahu tabulky
    • nepovolený přístup
    • překročený počet povolených indexů
    • cílová tabulka nenalezena

A stupínek vítězů pro technologie, které se na tom podílí?

  1. místo určitě stále zastávají Amazon RDS (MySQL) servery
  2. místo nově zabral Amazon Redshift
  3. místo zabírají (měřeno přes palec) Google BigQuery, HP Vertica + R a Amazon CloudSeach

Minulý týden jsme ale měli "IT party" s Karlem Minaříkem a myslím, že Amazon CloudSearch brzo vystřídá ElasticSearch. V kostech cítím, že v tom leží budoucnost. Tlak na co největší rychlost a JSON všude kam se podíváš - trend je jasnej :-)

HR okénko:

Sháním někoho se zkušeností s AWS Data Pipeline a/nebo AWS SWF. Pokud nikdo takový neexistuje :), hledám nadšence, co si s tím pro Keboolu zaexperimentuje. Kontakt nejlépe v komentářích nebo emailem na petr@keboola.com.


Digest novinek v Keboola Connection #5

11.10.2013, 22:17 - UPDATE: Tomáš Trnka a Radovan Jirka mě v komentářích na Facebooku "sepsuli", že to je moc #nerd. Doplnil jsem pro ně komentáře do závorek :)


Po delší době vykopávám další "weekly digest" novinek v Keboola Connection. Docela úspěšně prodlužuju intervaly mezi publikací těhle změn a novinek,  pokorně jsem se odhodlal přestat tomu říkat "weekly digest" :-) Předchozí 4 proběhly v Google Docs, pak v Mailchimpu a teď jsem to celé přesunul sem, na padak.keboola.com blog. Historické digesty jsou tady: 

  • #1 (18.3..2013)
  • #2 (25.3.2013)
  • #3 (1.4.2013)
  • #4 (12.6.2013)

Opět v obraně před "TL;DR" odpověďma přepínám do módu rychlého seznamu s linkama. Dotazy v komentářích, prosím. Čísla bodů nereflektují mnou vnímaný význam.


Obecně Keboola Connection

  1. vyrobili jsme generátor UIček a přepisujeme frontend komponent; dovedeme teď různým lidem ukazovat různé UI + stavba UI je skvěle rychlá
  2. v backend DB máme nově všechny SAPI tokeny šifrované 
  3. servery, které se starají o běh našich komponent, migrujeme do AWS VPC (umožňuje nám to lépe izolovat jednotlivé služby a vynutit si větší bezpečnost na nižší úrovni naší infrastruktury)


TAPI

  1. máme Redshift TAPI backend; jakoukoliv existující transformaci s MySQL backendem je možné odbavit na Amazon Redshift clusteru. Kratičká zkušenost s MySQL / Redshift / Vertica / BigQuery je popsaná tady. (Redshift je sloupcová databáze, kterou Amazon "koupil" od http://www.paraccel.com/. Je to SQL na steroidech, de-facto bez limitů.)


SAPI

  1. plná podpora asynchronních loadů (díky tomu můžeme ještě lépe horizontálně škálovat)
  2. možnost bezpečně emailem doručit nově vyrobený token (kolegovi / klientovi)
  3. mazání sloupců tabulek, přidávání a odebírání indexů je zpracováno asynchronně
  4. je možné snapshotovat tabulky - pak se provede otisk všech dat, metadat a eventů dané tabulky
    1. ze snapshotu je možné vyrobit novou tabulku (rychlá forma "copy")
    2. tabulku je možné ze snapshotu taktéž obnovit (rollback)
  5. máme API na mazání řádků v tabulce
  6. máme API na vyprázdnění tabulky
  7. u každé tabulky je možnost nechat si vykreslit Graf, který ukazuje jak daná tabulka vznikla; graf je de-facto pavouk, který ukazuje, jaké transformace načítají jaké tabulky a jaké tabulky z nich pak vyrábí/zapisují. Jednotlivé objekty v grafu jsou klikací a slouží jako navigace


Extraktory

  1. databázový extraktor podporuje MSSQL
  2. ConstantContact (něco jako Mailchimp, jen trochu víc profi)
  3. YouTube
  4. Mailchimp
  5. Recurly (systém na vyúčtování předplatného)
  6. NetSuite (největší cloud ERP systém)
  7. Konvertor měn (získává kurzy měn z Evropské Centrální Banky a Česká Národní Banky a různě konvertuje měny v datech v Storage API)
  8. všem extraktorům brzo doplníme chybějící UI


Writer

  1. nově nepoužívá pro upload dat do GoodData CL Toolu - děláme přímý REST API load (zahazujeme komponentu, kterou GoodData dál nechce podporovat - díky tomu zároveň získáváme větší kontrolu nad celým procesem zpracování dat)
  2. UI je přepsané do Angular JS
  3. ze SAPI exportuje data komprimovaně (jen prostě zrychlení :-)
  4. umí se vypořádat s problémem GoodData Auth Proxy, která vrací u některých jobů chybu 401 (bud v Q4 od GD opraveno)
  5. report execution provádíme přes REST API a né přes CL Toolu (viz bod 1)
  6. veškeré logy v S3 jsou privátní, UI generuje podepsané odkazy, platné 2 dny
  7. podpora SSO, pokud writer dostane email platného uživatele, umí na něj vrátit SSO link (SSO je Single Sign On - mechanismus, jak do GoodData přihlásit lidi, aniž musí někam zadávat heslo)
  8. podpora Mandatorních Filterů - objekt k filtraci se zadá tečkovou notací dle SAPI, například "out.c-main.orders.product = 7" - writer se postará o všechno ostatní; konfigurace je v SYS stage a je v takovém formátu, aby byla generovatelná z transformace. Je tedy možné pomocí joinu zjistit, který obchodník nově prodává který produkt a připravit mu pro to MUF (mandatorní filter je princip, jak lidem zamezit koukat na část dat v projektu, aniž sami vědí, že koukají na filtrovaná data)


Provisioning

  1. pro více sandboxů jednoho KBC uživatele vyrábí společné SQL credentials - není nutné při přepínání projektů přelogovávat SQL klienta
  2. umí fallback na perzistentní transformační backend v OVH - ochrana před sleháním SPOT instancí (provisioning zajišťuje vyrobení SQL databáze pro konkrétní datovou transformaci; transformace provozujeme na serverech, které kupujeme v aukci. Tyhle typy serverů nejsou úplně stabilní. Pokud něco selže, přehodí se zpracování transformací do jiného datacentra, které máme rezervované na východě Kanady, u firmy OVH)
  3. veškerá data o účtech v SAPI šifruje


Sardine

  1. zrychlená pomocí cachování odpovědí ze SAPI
  2. podporuje GoodData js eventy
    1. Sardine umí ovládat odkazy z dashboardů a dělat s nima volitelné věci (například můžeme přesměrovat odkazy z reportů do modálního okna, místo do nového tabu prohlížeče)
    2. umí k reportům, které uživatel downloaduje, doplnit plné texty z dat v SAPI (do GoodData se dá poslat text (buňka v tabulce) s maximem 255 znaků, někdy je ale potřeba v rámci exportu reportu doplnit osekané texty na původní velikost, tohle umíme udělat bezešvě během pár vteřin, díky těsné integraci dashboardu s originálními daty v Storage API)


MISC

  1. úspěšně jsme provedli PoC s realtime backendem a transformacema, které jsou inicializované stažením dat; klient nahrává data do Storage API a v momentě stažení jsou vrácena modifikovaná - takto upravené data pak fungují jako realtime reporty v GoodData dashboardech (plní Google Charts na dashboardu)
  2. máme frontend k AWS CloudSearch na tagování nestrukturovaných textů (díky tomu se mohou přímo na dashboardu definovat kategorie (např.) konverzací)


BI kuchyně: Jaké trencle nosí analytici ve Vykupto.cz?

Před pár měsícema jsem napsal blogpost "Čím je GoodData výjimečná?". Hodně jsem se od té doby snažil připravit popis něčeho víc reálného. Bohužel jsem často narazil na zákaz publikovat cokoliv, co děláme. Paradoxně nám klienti nezakazují o "jejich" GoodData mluvit kvůli strachu z odhalení reálných čísel, ale kvůli snaze nenavádět konkurenci k podobnému chování ("čím později ostatní na trhu napadne používat GoodData.com, tím víc času budeme mít k upevnění naší pozice"). 

Vykupto.cz naštěstí netrpí nedostatkem sebedůvěry a domluvit s nima nakouknutí pod kalhoty nebyl vůbec problém. Díky za to patří především Jiřímu Musilovi, který ví, že "data rocks", a tak si sehnal Petra Homolu. Petr do Vykupto.cz nastoupil hned po škole (diplomku psal na "Vybrané metody pro aplikace pokročilých analytik v prostředí Cloud"). Petr za svoji práci dostal cenu děkana, i přesto, že to podle všeho bylo psaný v pivnici :)

Petrovou úlohou byla hned od začátku péče o firemní analytiku a vznikající GoodData projekt. Do doby "před Homolou" byla firma řízena na základě reportů, které byly naprogramované in-house a pokrývaly základní metriky. Reporting postrádal složitější pohled na data jako celek a jakékoliv změny vyžadovaly zapojit programátory. Cokoliv měnit bylo drahé a neflexibilní, často i na hranici realizovatelnosti. Od GoodData očekávali platformu, nad kterou si postaví vlastní analytický BI projekt, ve kterém spojí svá fragmentovaná data dohromady. 

Do implementace se pustili s naší pomocí. Myslím, že na nás měli od Slevomatu kladné reference, a tak celkem bez přemýšlení sáhli po našem systému Keboola Connection (KBC). Jediné, co na své straně museli udělat, bylo napojení jejich interní databáze do KBC. Všechno ostatní se pak "nacvakalo" u nás online přes browser. KBC je pro ně dneska datawarehousem a místem, kde se data čistí, obohacují a míchají dohromady. Na konci těchto procesů se odesílají finální struktury do GoodData. 

Zajel jsem za Petrem Homolou, abych z něj vytáhl pár informací a pocitů:

já: Ahoj Petře! Díky za tvůj čas a příležitost s tebou pokecat o tom, co v Keboola Connection kutíš nad datama a co z toho pak je v GoodData. Začněme tímhle: jak se změnily procesy kolem sbírání dat?

Petr Homola: Dat se sbírá a vyhodnocuje daleko více než předtím. Nově sbíraná data (například editační časy, počty revizí) nám dávají dobrý přehled o efektivitě našich procesů. Vše v Keboole Connection se navíc odehrává v mém oblíbeném jazyku SQL, takže stačilo jenom pochopit princip transformační vrstvy a bylo do pár dní hotovo. Úžasný je běh ETL nezávisle na našich serverech. Dnes můžeme měřit jakékoliv komplexnější vazby, například nákupní chování zákazníků odhlášených z emailingu. Měřit můžeme prakticky cokoliv na čemkoliv. Firemní data se zavedením GoodData/Keboola stala velmi cenným zdrojem informací pro všechna oddělení. Efektivnější přístup k informacím a možnost mít vlastní reporty, přizpůsobení dashboardů na míru, apod. jsou nedocenitelné. Rozhodně se poslední dobou nikdo neptá, jestli to umíme zobrazit/naprogramovat, pouze se ptají, jestli ty data už posíláme/taháme do Keboola Connection a jsou nebo nejsou napojena v GoodData.

já: Co dneska v GoodData přesně děláte?

Petr: Sledujeme tam veškerou statistiku a KPI firmy, např. last-day/týdenní/měsíční přehledy. A především dlouhodobý vývoj a výkon. Krásně se tam zobrazují trendy. S tím pak pracuje každý manažer, jenž chce data hned a přehledně zpracovaná. Adopce celého řešení proběhla skvěle. Máme teď  BI platformu, která nám umožňuje dívat se na firemní data komplexně. GoodData prorostla celou firmou a nyní žijeme v naprosté symbióze. Pokud mi něco chybí, do 10 minut to tam díky Keboola Connection mám. Co se lidí týče, používá aktivně GoodData asi 40% - nejvíc obchodníci, management a marketing.

já: Dostáváte z toho odpovědi, které jsou nad rámec běžného reportingu? Myslím tím opravdové vytěžování znalostí.

Petr: Samozřejmě, Data Mining těch opravdových znalostí je strašně důležitý. Běžně se stává, že nacházíme v datech opravdu cenné informace, které bychom jinak nezískali. Někteří si uvědomují, že cokoliv v datech může být použito proti nim :) Nahradili jsme pocity z fungování za realitu z GoodData. GoodData se často rozebírá i na poradách, většinou ve spojení: “Ale na přehledu obchodníků je to jinak...” nebo “Tenhle deal má boží konverze...”. Ve spojení notebook a projektor se dají reporty stavět “on demand”, což dokáže neuvěřitelně rozpohybovat diskuzi. Například se nám povedlo do GD přenést kompletní data z emailingu, což má potenciál pro velkou optimalizaci.

já: Máš nějaký report, který měl svůj aha-moment a který můžeme publikovat?

Petr: Jasně! Potřebuju ho ukázat maličko anonymizovaný, ale myslím, že to nevadí. Povedlo se nám integrovat obrovské množství informací o emailingu a data z prodejů. Graf nám ukazuje metriky kolem prodejů v rámci segmentů z emailingu a pokud si dobře vzpomínám, hravě nám to rozdrtilo jednu hypotézu, kterou jsme delší dobu měli a pevně v ní věřili.

já: A co nějaký wow efekt? Něco jako "Do p*či! Kormidlo do leva!"?

Petr: Takhle bych to asi neřekl, ale jsi blízko :) Ten příklad s emailingem a obchodem se tomu trochu blíží. Obecně se dá říct, že před GoodData jsme neměli tak zjevné informace o prostředí, ve kterém podnikáme. Nyní se cítíme strašně sebejistí, dokážeme téměř všechno a velmi rychle a navíc s vypovídající hodnotou.

já: Co chystáš s Keboola / GoodData do budoucna?

Petr: Tlačím na ještě těsnější integraci do firmy. Akurátní a rychlé informace každému obchodníkovi na stůl. Rád bych tu viděl po ránu vysedávat lidi s kafem, croissantem a GoodData dashboardem v iPadu :-) Technicky ale připravuju hlavně rozšíření našeho ETL o pokročilejší analytiku a forecasting, rád bych dotáhl dynamickou segmentaci a trochu vylepšil existující metriky o GoodData Extensible Analytics Engine (XAE) a o poznatky z Keboola Academy

já: Petře, co bys mi řekl na závěr? Když se ohlídneš, jaký to byl pro tebe rok? Jak se cejtíš po té dlouhé cestě?

Petr: Rozhodně je to výjimečná zkušenost, člověk se naučí nejen dělat statistiku a vytvářet diagramy, ale také ovládat a budovat celé řešení. Jelikož je CLOUD a BI poměrně stoupající trend, určitě se dá říci, že člověk ovládající tyto technologie se rozhodně neztratí. Jsem moc rád, že jsem ve Vykupto.cz a mám příležitost dělat na tomhle projektu. Co myslíš, měl bych si jít říct o větší plat? ;)

já: No tak to rozhodně! Šéf bude mít radost, k čemu tě navádíme :-) 


Abych to nenechal úplně náhodě, zašel jsem ještě ke klukům ze Skrz.cz. Pro ty, kdo je neznají, Skrz.cz je největší agregátor slevových serverů. Díky své ojedinělé pozici se může pasovat do role "auditora" trhu. Oni vědí, kdo podvádí, vědí první, kdo krachuje, vědí prostě všechno. Poprosil jsem je o komentář k pozici Vykupto.cz na trhu, jak je ze svého pohledu vnímají, a zda na nich je něco zajímavého. 

"Vykupto.cz se stabilně drží na 2. pozici mezi slevovými servery. Ačkoliv se pozice nemění, je zejména v roce 2013 znatelný nárůst obratu a získávání většího podílu na trhu. Oceňuji na spolupráci s Vykupto, že se vždy bavíme o kampaních jen v řeči čísel a rozhodnutí nepadají na základě emocí.", Petr Kováčik, ředitel vyhledávače slev Skrz.cz

K tomu jen dodám, že Petr Kováčik trefil hřebíček na hlavičku. "You can't manage what you can't measure"...

Přeju Vykupto.cz, ať se jim nadále daří a ať jim práce s daty přináší co nejvíc ovoce. Jsem rád, že k tomu můžeme svojí troškou přispívat!


GoodData Offsite 2013

Koncem tohoto týdne měla česká část GoodData.com společný program v Hradci Králové. Sjeli se tam z Prahy a Brna aby spolu 2 dny řešili jak se jim daří a co plánují dál. Jako hosty nás tam všechny z Kebooly pozvali a i přes to, že si tam odhodlaně prali spodní prádlo, nezavřeli nám jediné dveře a nechali nás s nima prožít všechno pěkně na 100%. Byl to od nich projev ohromné důvěry a zároveň sebejistoty. Zní to pateticky, ale jsem dojatej a vděčnej. Na jejich místě bych hodně váhal, jestli tam Keboola má bejt. Díky Jardo, ZD, Martine...! 

Celý "offsite" byla kombinace business témat, low-level přednášek, sportu a notné dávky C2H5OH :). Sebou jsme si navrch vzali našeho VP of Propaganda Tomáše Čupra a Petra Bartoše. S Tomášem jsem hned po ránu vyvinul ochranu před příjmem těch nejcitlivějších informací. Uvažujem, že si to patentujem!

Nicméně kafe nás nakonec nakoplo :) Tomáš si tam v podvečer střihnul prezentaci o tom, jak používá v DámeJídlo GoodData. Bylo to plný necenzurovanejch čísel, myšlenek a "lidskýho" pohledu na věc. Posléze jsem na to slyšel hodně pozitivní feedback. 

Já měl v plánu se podělit o to, jak v Keboole používáme GoodData, co nás fascinuje a kde nám to naopak drhne. Moc mi to myslím nevyšlo - ZDho dotazy protáhly Tomášovu prezentaci asi na hodinu a když jsem šel na řadu, bylo po půl osmý večer, všichni měli v očích únavu a hlad + Jarda Gergič takovej zvláštní zoufalej výraz. Vsugeroval jsem si 100% nezájem publika a ve snaze všechno co nejvíc zkrátit, nedávalo podle mě nic moc smysl. 

"AZ Kvíz" o trička... (je blbě, opraveno v komentářích :)

Moje klíčová myšlenka: MAQL, resp. AQE, je vaše rodinný zlato a API je to co nám jeho hodnotu pomáhá dostat lidem do života. Dál hlavně rozvíjejte a dokumentujte API a teprve nad ním kódujte svoje UI, tím nám posunete možnosti jak stavět věci, kterým GoodData tepe v hrudi.

Howg

P.S. Tohle jsem si předem "koupil" od Káči. Za 18,- Kč (zmrzlina) byla ochotná sedět 1/2 hodiny na kuchyňský lince a natočit mi pozdravení. Zbožňuju zneužívání dětí :-)