V prvním zářijovém týdnu jsem se zúčastnil konference RailsConf Europe 2008 v Berlíně. Chtěl bych vám zprostředkovat své dojmy a okomentovat přednášky, které se mi líbily.
Konference se konala od 2. září do 4. září, přičemž první den byl den tutoriálů. Hlavní nevýhodou konference byla cena – 795€ (a to jen při včasné rezervaci). Připočtěte cenu hotelu a dopravy a máte cenu, kterou si za 3 dny může dovolit málokdo. Já jsem měl to štěstí, že mě vyslala firma. S cenou konference EURUKO 2008 (20€), která se letos konala v Praze se to nedá srovnat.
Hezká přednáška o přístupnosti webových aplikací, přičemž přístupností se myslí maximální počet zařízení/prohlížečů, ve kterých lze aplikaci provozovat. Přístupnosti je dosaženo separací zájmů – oddělením dat (HTML), pravidel pro zobrazení (CSS) a funkcionality (JavaScript). Separace dat a zobrazení je už celkem běžná a oblíbená věc, ale se separace funkcionality je poměrně novou věcí (tedy alespoň pro mě). Hlavní myšlenkou je jednak vyčištění HTML, ale také funkčnost aplikace i bez zapnutého/nepodporovaného JavaScriptu.
V podstatě se používá technika provázání kódu a dat pomocí atributů/typů tagů po načtení stránky. K tomu autor používá knihovnu LowPro. Líbí se mi na ní možnost navázat obsluhy událostí na elementy vybrané pomocí CSS selektorů (v tomto případě nebude po JavaScriptu v HTML ani památky):
Event.addBehavior({
//klik na všech buňkách všech tabulek dokumentu
'td:click' : function(e) {
alert('do something');
},
//klik na obrázky vnořené v <div class='menu'></div>
'div.menu img:click' : function(e) {
alert('do something2');
}
});
Jednou z hezkých myšlenek bylo, že v obsluhách událostí se často vyskytuje kód, který se liší jen v konstantách – identifikátorech. Kupříkladu v aplikaci, na které pracují v práci, je obrovský strom znázorňující hierarchii objektů. Napsal jsem si helper pro generování jednotlivých položek, takže kód v Ruby je poměrně hezký. Ovšem dokážete si představit zmatek v HTML výstupu pokud má každá položka kontextové menu, větve jde skrývat,… Navíc strom už začal být pomalý a tím, že se obsluha událostí přesune na jedno místo, se ušetří pořádný díl paměti. Ani RoR nejsou v tomto ohledu dokonalé. Například při použití link_to_remote se do výstupu vloží kus JavaScriptu s voláním příslušné metody knihovny Prototype. Pro každý odkaz je tento kód stejný, liší se jen jménem kontroleru, akce a id.
Další rychlost se dá získat pomocí probublávání událostí (Event bubbling). Pokud se má například provést nějaká akce v reakci na kliknutí na buňku tabulky, není nutné mít na každou buňku napojenu obsluhu události, protože událost probublá až k elementu tabulky. V tomto místě stačí zachytit událost a z parametru dodaného obsluze (parametr e typu Event v předchozí ukázce) vyčíst pomocí metody element na kterém elementu ke kliku došlo. Takže místo M*N obsluh stačí jedna. V mém stromě, zmíněném v předchozím odstavci, by stačilo mít jedinou obsluhu navázanou na jeho kořen, protože strom je vytvořen zanořenými elementy.
Dále bylo v přednášce zmíněno několik technik, zachovávajících funkcionalitu aplikace i při vyplém JavaScriptu. V podstatě jde o to, že se vytvoří klasická aplikace, která funguje bez JavaScriptu, AJAXu a podobných technologií. V prohlížečích, kde tyto technologie nejsou, bude tedy aplikace fungovat. Pokud je JavaScript dostupný, tak se na potřebné elementy navěsí obsluhy událostí, případně celé chování (behavior) z aplikace je web aplikace 2.0 (tady je ukázka změny normálního HTML formuláře a odkazu na AJAXové volání):
Event.addBehavior({ 'a#remote_link' : Remote.Link({ update:'element_id', onComplete : doSomething2 }), 'form#remote_form' : Remote.Form({update: 'element_id', onComplete : doSomething2 }) });
Techniky byly předváděny na ukázkové aplikaci typu TO-DO list. Ta byla velmi jednoduchá. Problém nastává, pokud je aplikace komplexnější. Obecně mám z RoR komunity a konference pocit, že se dosud tvořily pouze jednoduché aplikace typu blog, PIM, … A teprve nyní technologie uzrála na to, aby se začaly vytvářet skutečně komplexní aplikace. Na konferenci bylo možné tento trend vysledovat – více se rozepíšu v pokračováních.
Tato přednáška mě oslovila proto, že jsem si při ní zavzpomínal na mladá léta a začátky s webem a všechny ty příšerné stránky, které jsem spáchal. Prošel jsem ukázkovým vývojem (jako celé lidstvo :-) ):
Přednáška se skládala ze dvou částí – první byla o metaprogramování v Ruby a druhá o vnitřnostech Ruby umožňujících metaprogramování. Samotné slajdy byly plné obrázků z Matrixu a Hvězdných válek. Slajdy nejsou na stránkých konference, najdete je na stránkách Neala Forda.
Z první části mám následující postřehy:
Druhé přednášce jsem moc nerozuměl. Autor ukazoval grafy znázorňující vnitřní struktury Ruby na objektu, který má per-object metody (eigen class), má inkludováno několik modulů a je zděděn. Většinou se v takových grafech ztratím. Každopádně jsou slajdy prokládány dívkou (z nějakého seriálu) brečící krev, kdykoliv se objeví nějaký drsný kus kódu ze zdrojáků Ruby :-)
Ale jednu informaci jsem přece jen zachytil. Možná někomu přijde povědomá hláška: „Called id for nil, which would mistakenly be 4 — if you really wanted the id of nil, use object_id,“ případně dumá nad tím, proč je v ní pořád konstanta 4. Třeba 42 by bylo víc symbolické. Každopádně vysvětlení je prosté. Jedná se o interní object id konstanty nil v Ruby. Podobné id mají i ostaní jazykové konstanty – true a false.
Dofám, že se vám moje blogová prvotina líbíla a pozitivní motivací v komentářích mě donutíte pokračovat :-)
A na závěr ještě perličku. Na konferenci se vyskytovali zejména majitelé MacBooků, viděl jsem však i několik strojů s Windows XP/Vista a Ubuntu. Já jsem měl na konferenci firemní notebook IBM s Windows XP, který má ovšem menší vadu: pokud se uspí se zapnutou Wi-Fi a VPN tak se po probuzení objeví BSOD. Představte si ten smích lidí sedících za mnou… :-)
Jaroslav Kuboš vystudoval informatiku na FIT VUT v Brně, pracuje v IT a ve volném čase tvoří inovativní server s nabídkami IT práce – nalezen.cz