Kategorie
Nejnovější článek
- Building a shared library in Haskell
- Real World Haskell se šíří Brnem
- Benchmarky pro quad-core na shootoutu
- fotopaste.cz: webová služba psaná v Haskellu
- Haskell a Ruby on Rails II: sessions
- Google summer of code 2008
- Haskell a Ruby on Rails I.
Archiv
Odkazy
Hledání
Haskell a Ruby on Rails II: sessions
Jak jsem psal, k tomuhle obskurnímu spojení jazyků mě vede nutnost konečně zjednat pořádek v jednom projektu. Novinkou je, že jsem od hostingu dostal informaci, že by nám kromě railsů mohli další fastcgi klidně rozjet, takže mé odvážné představy se začínají pohybovat směrem k realitě ;) To je důvod, proč malinko přeskočím. Minule jsem popsal nejzákladnější hello world. Existuje několik dalších věcí, které jsou vyřešeny a o kterých bych mohl psát, ovšem teď začíná být potřeba řešit věci zbývající. V podstatě jde jen o sessions. V tomto příspěvku bych se pokusil shrnout, v čem je problém, nastínit pár řešení a hlavně nechat prostor pro diskusi a případné nápady.
O co tedy jde?
Sessions (aneb familierně "sešny") uchovávají např. informace o přihlášeném uživateli. Jde mi zejména o nutnost kontroly práv ve službách, které budou psané v Haskellu.
Prohlížeč poskytuje přes cookies tzv. session id, což je unikátní klíč, ke kterému je přiřazen obsah sešny (asi bych mohl říkat sezení, ale hlavně, že si rozumíme). Defaultně si RoR ukládá obsah sešen do souborů s názvem tvořeným klíčem. Není problém je ukládat do SQL databáze nebo do memcached a není problém z haskellem vytvořeného fastcgi se k sešnám dostat (osobně používám jako úložiště SQL databázi, memcached je ale z uvedených úložišť nejefektivnější, mluvíme-li o rychlosti).
Ok, tak v čem je problém?
Data uložená v sešně jsou v ruby reprezentována hashem plným objektů (ostatně v ruby se nic jiného než objekt ani nevyskytuje ;). Data samotná se ukládají v binární podobě. Používá se standardní rubovské (odporné slovo to "rubovské", ale nemůžu si pomoct..) marshalování. A dekódování uložených dat sezení je právě problém, o kterém mluvím. Samozřejmě není to problém neřešitelný, spíše přemýšlím o tom, jak to udělat s co nejmenší námahou ;)
Možnosti řešení...
- První, co člověka asi napadne, je prostě napsat (nebo v lepším případě najít) v haskellu parser na marshalovaná data. Je to asi nejlepší řešení, ovšem, pokud ho nenajdu (což se zatím nezdařilo), tak to řadím také do nejpracnějších řešení. Stačil by asi částečný parser na základní datové typy, anebo využít původní rubovký marshal.c a napsat pro něj bindingy do haskellu, ale prozatím si tento způsob nechávám na konec.
- Pak se nabízí možnost změnit způsob serializace dat na nějaký snadno parsovatelný formát. Ovšem kromě toho, že bych se psaní parseru, ač mnohem jednoduššího, nevyhnul, musel bych napsat v ruby serializér a deserialiér, což by jednak zabralo čas mně a druhak (a to je podstatnější) práce se sešnami a tím i celá aplikace by se výrazně zpomalila (marshalování v ruby je implementované v C).
- Potom bych se mohl na sešny vykašlat a to, co bych potřeboval, bych si mohl prostě ukládat do databáze po svém. To zní slibně, ovšem tady jsem zase omezen tím, že celý systém je napsaný a pokud bych např. musel přepisovat řízení přístupu, tak by to nebylo uplně triviální...
- A poslední řešení, které zmíním, je takové hybridní. Funguje dokonce bez problémů, mám ho vyzkoušené. Ale je to za cenu jistých ústupků. Pominu-li osobní averzi (je to proste prasárna), pak zde hraje roli zbytečná režie RoR. Ale abych nenapínal. Ajaxové volání nasměruju na metodu v kontroleru aplikace v RoR, která udělá pouze to, že mi ze sešny vytáhne pořebné informace a přesměruje dotaz na mé fastcgi v haskellu s parametry obohacenými o data ze sešny. Dalo by se to udělat obecně, abych pro každé takové volání nemusel psát novou metodu v kontrolleru, ale v principu by to vypadalo nějak takto:
def foobar
redirect_to
:controller => "/services.fcgi",
:command => "foo",
:user_id => session[:user_id]
end
A otázka pro zkušené čtenáře zní: máte lepší nápad? Případně, které z řešení byste doporučili? A má to vůbec celé cenu? ;) Ale jo, věřím, že má. Kombinace s ruby je trochu těžkopádná, ale zkouším vytvářet reálné weby kompletně v haskellu (nějaký proof-of-concept snad někdy brzo rozjedu a něco k tomu napíšu).
Autor: jh
Červen 2008
Dva komentáře k článku „Haskell a Ruby on Rails II: sessions“
KdoViKdoJsem Says:
19. 6. 2008, 0:48
No, nebudu se zapojovat do hlubsi debaty ohledne mozneho vlastniho reseni. Jen poznamenam, ze muzes serializovat objekty do YAML (patri mezi Standard Library)
require “yaml”
my_object = Array.new(3) # priklad pouze :)
puts my_object.to_yaml
Implementace v Haskellu bude nekde k nalezeni :).
*Implementace YAML
Vida, to zni docela dobre. Pro YAML implementace v Haskellu jsou, to vypada jako docela schudne reseni.
Přidání komentáře