Reportáž: RailsConf Europe 2008, den první

11. 9. 2008 22:42 Jaroslav Kuboš

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.

Accessible Ajax on Rails (Jarkko Laine)

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 :-) ):

  • oslnění HTML psaným v FrontPage
  • oslnění HTML psaným v poznámkovém bloku
  • jééé, mám rotující text a animovanou ikonku „Under construction“
  • jééé, mám na stránkách počítadlo přístupů!
  • miluju rámy(frames), menu napíšu jen jednou!
  • jééé, stránka jde generovat pomocí PHP
  • JavaScript je hnusný a nanic, kromě efektů v UI
  • rámy jsou přežitek, ať žijí tabulky
  • CSS šetří čas, zpřehledňují zdrojový kód a výsledná stránka je čitelnější
  • tabulky jsou přežitek, ať žijí DIVy
  • v PHP jde programovat i jiným způsobem než mixem SQL+HTML+JS+PHP (bakalářská práce)
  • jééé, existují webové frameworky (bakalářka~ActiveRecord)
  • reflexe je super věc (diplomová práce)
  • v práci začínám programovat v Ruby/RoR (hm…PHP mi jde líp)
  • hm…není to zlé
  • co to je ten Prototype?
  • JavaScript je skvělá věc!
  • nic než Ruby! (snad se už nikdy nebudu muset vrátit k C++)
  • nevtíravý JavaScript je skvělá věc!
  • …a tady se aktuálně nacházím…
  • …a jsem zvědav, kdy se budu pomlouvat, že jsem dělal s Ruby/RoR… :-)

Meta-programming Ruby for Fun & Profit (Neal Ford, Patrick Farley)

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:

  • Eskymáci mají 8 výrazů pro sníh. Můžou jej tedy popsat mnohem lépe a snadněji než my. Jazyk ovlivňuje jak myslíme. Znovu jsem slyšel úvahu o románu 1984, kde se Strana snaží zjednodušit jazyk a vymýtit z něj slova jako svoboda – pokud lidé nebudou znát slovo svoboda, pak o ní ani nebudou moci přemýšlet.
  • Vlastnosti výrazově slabších jazyků lze simulovat pomocí výrazově silnějších jazyků (např. interface).
  • Kompilace je předčasná optimalizace :-)
  • Konstanty ve formě Flour, Nutmeg (místo „Flour“ nebo :flour) pomocí constant_missing.
  • Pro některé účely obsahuje třída Object hodně metod. Proto kdosi vytvořil třídu BlankSlate, která nemá skoro žádné metody (BlankState je sice zděděn z Object, ale zděděné metody smaže). Tvůrcům Ruby se to zalíbílo a proto je/má být v Ruby 1.9 Objekt zděděn z BasicObject, který má minimum metod. A použití? Například třída, která každé zavolání (předem nedefinované metody) metody serializuje jako XML pomocí method_missing (parametry jako atributy).
  • „Actually I made up the term object-oriented, and I can tell you I did not have C++ in mind.“ – Alan Kay :-)

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.

Závěr

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… :-)

Sdílet