Hlavní navigace

Seaside (2)

7. 3. 2005
Doba čtení: 7 minut

Sdílet

V dalším pokračování seriálu o webovém aplikačním frameworku Seaside si řekneme pár slov o tom, jak ji nainstalovat a spustit. Popíšeme si, jakým způsobem spolu s ní zpřístupňovat statický obsah a jak spravovat server běžící na pozadí. Rovněž se zmíníme o některých bezpečnostních aspektech.

Nejjednodušší cesta, jak získat funkční Seaside, je stáhnout si hotovou smalltalkovskou image, kde je již nainstalována, a to např. zde nebo zde. Další možností je nainstalovat si ji do vlastní image ručně prostřednictvím SqueakMap. V takovém případě budete krom samotné Seaside potřebovat závislé balíky, kterými jsou DynamicBindings, KomServices a KomHttpServer.

Vývojové prostředí Squeak Smalltalk

Squeak se Seaside lze provozovat na prakticky každé alespoň trochu rozumné platformě. Pravda, možnost vyvíjet a testovat webové aplikace na PDA (v naprosto stejném grafickém vývojovém prostředí jako na pracovní stanici) asi využije málokdo, ale bez problémů to možné je.

Seaside je modul pro webový server Comanche (nicméně není na něm závislá a lze ji provozovat i nad jinými servery). Oba dva najednou lze spustit příkazem

WAKom startOn: 80

kde 80 je číslo portu, na kterém bude Comanche pracovat. Jak Comanche tak Seaside jsou revitalizovány při otevření uložené image. To znamená, že pokud je jednou spustíte na patřičném portu a image si uložíte, při dalším restartu budou stále pracovat bez nutnosti je explicitně spouštět. Samozřejmě totéž platí pro přenos na jiný počítač či platformu.

Protože Seaside nepoužívá systém šablon, HTML kód jednotlivých komponent a tím pádem i celých stránek je generován programově a totéž platí ve většině případů i pro kaskádové styly a Javascript. Jak si podrobně popíšeme později, stránka se vytváří pomocí posílání příkazů renderovacímu objektu. Ty vypadají např. tako:

html heading: 'Nadpis'.

Ve výsledku tedy není vůbec potřeba, aby se společně s image distribuovaly další desítky či stovky souborů. Velmi často jsou vznášeny dotazy, jakým způsobem se při tomto přístupu zobrazují obrázky či libovolný jiný statický obsah. Ten teké může být uložen přímo v image. K tomuto účelu si lze např. vytvořit globální slovník

Smalltalk at: #WebImages put: Dictionary new

a do něj ukládat obsah těch souborů, které nás zajímají.

WebImages at: #mouse put: ((FileStream readOnlyFileNamed: 'mouse.jpg') contentsOfEntireFile)

Jeho použití, v našem případě zobrazení obrázku, pak může vypadat následovně:

html image: (html urlForDocument: (WebImages at: #mouse))

Seaside takto pro virtuální soubor vytvoří a zaregistruje unikátní URL, kterou vloží do stránky, aby klient byl schopen na něj vznést samostatný HTTP požadavek. Přirozeně lze pracovat přímo se souborem na disku:

html image: (html urlForDocument: (FileStream readOnlyFileNamed: 'mouse.jpg')).

Pokud se rozhodnete pro výše popsaný způsob poskytování statických souborů, bylo by samozřejmě vhodné si tuto konstrukci zjednodušit například doplněním vlastností rendereru. Je dobré mít na paměti, že Seaside je svým způsobem minimalizovaný framework, takže rozhodně není na škodu si některé jeho vlastnosti a konstrukce ohnout podle svých potřeb. I zásahy přímo do zdrojových kódů frameworku nejsou vzhledem k architektuře Smalltalku ničím závadným.

Jinou možností pro zpřístupnění dodatečného statického obsahu je spouštět Seaside jiným způsobem tak, aby Comanche měl aktivovaný příslušný modul. Bohužel v tom případě se již nejedná o úkol na jeden řádek.

| ma seaside |

seaside := WAKom default.
ma := ModuleAssembly core.
ma serverRoot:  (FileDirectory default fullNameFor: 'pub').
ma alias: '/seaside' to: [ma addPlug: [:request | seaside process:
request]].
ma documentRoot:  (FileDirectory default fullNameFor: 'pub').
ma directoryIndex: 'index.html index.htm'.
ma serveFiles.
(HttpService startOn: 80 named: 'httpd') plug: ma rootModule.

Statický obsah bude uložen v podadresáři hlavního adresáře (většinou adresář s image), který se jmenuje pub. Ten samozřejmě musí být pro VM viditelný, což je třeba vzít v potaz, pokud Smalltalk pouštíme v omezeném bezpečnostním režimu. Seaside zpracovává požadavky, jejichž URL začíná na ‚/seaside‘.

V neposlední řadě je možné zpřístupňovat statický obsah pomocí jiného webového serveru, např. Apache. Ten však samozřejmě musí běžet alespoň z pohledu serveru na jiném portu.

V ideálním případě je tedy aplikace napsaná pomocí Seaside a používající statické dokumenty všeho druhu distribuovaná jako jeden jediný soubor (image). Jeho velikost samozřejmě závisí na tom, co všechno jste si do image vložili. Velikost standardní image Squeaku se Seaside by neměla přesáhnout 11 MB. K dispozici jsou však i verze, se kterými se vejdete bez problémů pod 5 MB. Paměťová náročnost jedné běžící instance Squeaku se v tom případě pohybuje pod 10 MB.

Pokud se vám to zdá být moc, je třeba si uvědomit, že se nejedná pouze o jádro, webový server a Seaside, ale o celé plnohodnotné vývojové a ladící prostředí s grafickým rozhraním včetně vlastních fontů umožňující stávající aplikaci libovolně modifikovat za chodu a poskytující k tomuto účelu veškeré potřebné zázemí. Zarytí minimalisté si mohou image dále ořezat dle libosti, nahradit grafické rozhraní Morphic úspornějším MVC, odstranit vývojové nástroje úplně apod. Zatím však nenajdou žádné prostředky, které by jim tento úkol usnadnily.

K tomu, aby měla image k dispozici formátování zdrojových kódů včetně komentářů, je třeba jí dodat ještě zdrojový soubor nejvyšší nižší celočíselné verze Squeaku (společný pro všechny image) a také rozdílový soubor náležející vždy ke konkrétní image. Při přechodu do bezpečnostního režimu pomocí služeb třídy SecurityManager je pak nutné mít tyto soubory umístěné v tzv. untrusted adresáři, kde k nim bude mít image přístup. Pro reálné nasazení je žádoucí rozšířit bezpečnostní nastavení Squeaku i na zákaz zápisů image na disk. Potom již samozřejmě ztrácí význam snažit se provádět v běžící aplikaci změny, protože nemohou být zachovány do dalšího restartu serveru. Proto se k tomuto opatření přistupuje až u hotových a odladěných aplikací. Nemá ani valný smysl k image dodávat zdrojové soubory, protože pak mohou pomoci jen v případě zjišťování příčin případných problémů, kde by měla dekompilovaná forma zdrojových kódů dostačovat.

V kombinaci s vhodným nastavením práv na úrovni hostitelského systému lze u squeakovských aplikací bezpečnost vyladit na velmi slušnou úroveň i bez nutnosti chrootování apod. Jiná kapitola je samozřejmě nastavení bezpečnosti na úrovni image. Pokud útočník dostane do rukou možnost nějakým způsobem vyhodnocovat smalltalkovské výrazy, je např. DoS útok otázkou pár znaků. Je potřeba si také dávat velmi dobrý pozor na výpisy popisů objektů (printOn:). V případě, že v hotové aplikaci dojde k nějaké chybě a uživatel je o tom informován výpisem stránky s chybovým hlášením, může se snadno stát, že mu aplikace zobrazí některá citlivá data. Riziko představují především výpisy obsahu kolekcí apod.

Pokud webovou aplikaci aktivně nevyvíjíme a běží v produkčním módu, pouští se samozřejmě jako démon či služba. Pak je ovšem třeba často řešit problém, jak ji upravovat, když nemáme k dispozici přístup ke grafickému rozhraní. V tomto případě máme nejméně dvě možnosti.

První nejjednodušší možností je využít nástrojů, které k tomuto účelu nabízí samotná Seaside. Jedná se především o browser, s jehož pomocí můžete libovolně měnit veškeré zdrojové kódy v image. Nenabízí sice mnoho komfortu, ale pro základní úpravy aplikací jsou dostačující. Později se o nich zmíníme podrobněji.

Druhou možností je použití VNC protokolu. Pro Squeak existuje projektimplemen­tující jak klienta, tak server pro remote framebuffer. Díky němu je možné se ze stejného či jiného počítače připojit ke Squeaku běžícímu na pozadí a ovládat jej s celým grafickým rozhraním. Protože VNC server je implementován přímo na úrovni image bez speciálních pluginů virtuálního stroje, není třeba na hostitelskou platformu instalovat další komponenty a např. daný linuxový stroj nemusí mít nainstalováno žádné grafické rozhraní. Za tuto výhodu se ovšem platí pomalejší odezvou a je třeba počítat s tím, že VNC server běží jako každý jiný smalltalkovský proces a například v případě, že se splaší některý proces s vyšší prioritou, může být připojení přes VNC nepoužitelné.

Existují samozřejmě i další varianty, jak spravovat na pozadí běžící squeakovský webový server. Krom některých implementací vzdálených volání procedur a dalších hrátek s VNC a X Window Systémem můžete třeba využít poměrně novou Seaside aplikaci LiveWeb, která se s podporou Javascriptu snaží vytvořit z webových stránek jednoduché grafické smalltalkovské rozhraní včetně takových roztomilých vlastností, jako jsou okna přilétající a odlétající po vzoru selfovských outlinerů.

skoleni

Při nasazování více aplikací na jednom stroji je třeba si velmi dobře rozmyslet, které aplikace budou sdílet jednu image, a tedy i jednu rozjetou instanci Squeaku. Mohou pak sice sdílet jeden port, stejnou programovou základnu, jedno konfigurační prostředí apod., nicméně z bezpečnostního a funkčního hlediska to představuje problém. Poměrně lehce se může stát, že jedna aplikace si pod sebou podřeže větev i s celým stromem, díky čemuž havarují i všechny další aplikace běžící nad stejnou image. Na druhou stranu by běžné chyby neměly mít fatální důsledky. Smalltalk implementuje na úrovni image vlastní plánovač procesů, takže havárie jednoho procesu se nijak nemusí dotknout ostatních.

Když už máme Seaside nainstalovanou a spuštěnou, stačí navštívit adresu http://localhos­t/seaside/con­fig, kde se nachází konfigurační aplikace. Je chráněna přihlašovacími údaji, které se zadávají při instalaci Seaside. Vypadá na první pohled velmi stroze, nicméně nabízí vše potřebné. První, čemu by měl začínající uživatel věnovat pozornost, jsou ukázkové aplikace. Ty sice ve většině případů rovněž neoplývají nijak ohromujícím vzhledem, ale byly zvoleny tak, aby jednoduše a účelně demonstrovaly možnosti, které Seaside programátorům nabízí. Najít mezi nimi lze i implementaci jednoduchého webového obchůdku. Standardně má každá aplikace přiřazenu adresu ve tvaru http://localhos­t/seaside/sto­re, kde store je její jméno. Tento způsob adresace však nemusí vždy vyhovovat. To, jak toto nastavení modifikovat, si ale popíšeme zase až někdy příště.