Merb: nová webová vývojová platforma pro Ruby

Jakub Šťastný 8. 8. 2008

Merb je webový framework silně inspirovaný slavným Ruby on Rails. Je velmi výkonný a vysoce konfigurovatelný, takže není žádný problém použít vaše oblíbené ORM či testovací framework. Ačkoliv je zatím mladý, už jej používají firmy jako je Engine Yard nebo Apple. Co přináší?

O co jde?

Merb je webový framework silně inspirovaný slavným Ruby on Rails. Původně byl Merb pouhým handlerem webového serveru Mongrel, který se používá právě s Rails a měl za cíl zrychlit nahrávání souborů. Postupem času se rozrostl a stal se z něho plnohodnotný webový framework.

Merb je stejně jako většina dnešních moderních frameworků založen na MVC architektuře. To znamená, že práce s daty se děje v modelech, kontroléry obsahují zpracování dat z pohledů a konečně pohledy obsahují zobrazovací logiku.

Zcela zásadní vlastností Merbu je jeho modularita – Merb je pouze webový framework, to umí, a o jiné věci se již nestará. Neobsahuje žádné defaultní ORM, nepřikazuje, jaký se má použít testovací framework, ani s sebou nenese nějaký konkrétní javascriptový framework – to vše za něj dělají ostatní knihovny.

Kdo používá Merb?

Merb je vyvíjen společností Engine Yard, což je poměrně velká a rozhodně dosti dobře prosperující firma zaměřená na Ruby technologie, hosting Ruby aplikací, jejich vývoj, a podobně. Krom Merbu a DataMapperu, ke kterému se dostaneme dále, stojí Engine Yard také za projektem Rubinius, což je velmi slibný smalltalkovský virtuální stroj pro Ruby.

Je pochopitelné, že když Engine Yard Merb vyvíjí, že jej bude také používat. To je pravda, již dnes mají produkčně nasazeny desítky aplikací běžící na Merbu.

Engine Yard ale není jedinou společností, která používá Merb – ten totiž velmi hojně nasazuje i Apple, který jistě není třeba představovat. Abych byl konkrétnější – Merb je obsažen v javascriptovém frameworku SproutCore, ve kterém Apple poslední dobou dělá snad všechny své weby, včetně poměrně známého MobileMe.

Inovace a výhody Merbu

Disclaimer: Merb je hodně inspirován Rails, takže tato část je míněna především jako srovnání, co nového Merb oproti Railsům přináší. Netvrdím, že podobné věci neobsahují jiné webové frameworky.

Hackovatelnost Merbu

Mezi jednu z nejužitečnějších vlastností Merbu patří velmi snadná hackovatelnost. Kdo se někdy blíže seznamoval se zdrojáky Rails, jistě tuto vlastnost ocení.

Ona hackovatelnost je nejlépe vidět na Merbových pluginech. Dobrou ukázkou může být například Merb Slices. Dělá v zásadě přesně to, co Rails Engines, tedy umožňuje tvorbu vysokoúrovňových modulů aplikace jako například přihlašování nebo třeba rovnou blogovací systém či e-shop, ale na rozdíl od Rails Engines je to malý, jednoduše napsaný plugin, který nepoužívá žádné hacky.

Merb má v sobě defaultně zabudovaný Rack, což je nadstavba nad webovými servery. Umožňuje pro ně psát handlery a řešit některé věci, které není nutné řešit přes aplikaci, jako je například nastavení Content-Type souborů v public/downloads a podobně. Velmi užitečná věcička.

Mnohdy potřebujete pouze drobnou aplikaci, která nemusí mít žádný model. V takovém případě vám Merb umožňuje vygenerovat tzv. flat aplikaci, která obsahuje pouze jediný kontrolér, soubory s konfigurací a složku s pohledy (views). Pokud máte opravdu hodně miniaturní aplikaci, můžete použít také tzv. very flat aplikaci, což je jediný soubor se vším potřebným.

Renderování

Zajímavým nápadem jsou part controllers, což je rozvinutá myšlenka part templates. Part templates jsou větší, opakující se části kódu pohledů. Příkladem může být formulář, který je stejný pro akci vytvoření nové entity i pro její editaci. Part controllers obsahují krom šablony i kontrolér, a dají se tak úplně ideálně použít na takové věci, jako je přehled tagů, výpis zpráviček, nejčtenějších článků a podobně, prostě k sobě patřících částí stránky. Musím říct, že to dramaticky zpřehlednilo můj kód, zejména v layoutu a ApplicationController, resp. Application, což je railsová, resp. třída ve vaší aplikaci, od níž jsou zděděny veškeré kontroléry.

Šikovná je také práce Merbu s renderováním. V Rails se renderuje automaticky po provedení dané metody kontroléru, v Merbu musíte pro totéž použít metodu render, případně display @object. To není samoúčelné – pokud žádnou z těchto metod nepoužijete, Merb vrátí klientovi návratovou hodnotu metody. Stačí vrátit stream či soubor a ten je automaticky poslán na klienta.

Oproti Rails, které doslova zamořují kontroléry metodou provides určující, jaké formáty daná metoda podporuje, zvolil Merb elegantější řešení: provides je metoda třídy a definuje se na jednom místě:

class Posts < Application
  provides :yaml, :xml, :html
  def index
    @posts = Post.all
    display @posts
  end

  def show
    @post = Post.get(params[:id])
    raise PostNotFound unless @post
    display @post
  end

  def feed
    only_provides :rss
    @posts = Post.latest
    render
  end
end

Pokud uvnitř metody zavoláme only_provides, budou formáty definované pomocí provides ignorovány a použijí se pouze ty, které zadáme metodě only_provides. Pokud vám vrtá hlavou, jak se to vykreslí, když máme stále pouze jednu šablonu, která je zpravidla dělaná pro HTML, tak napovím – pokud objekt předaný metodě display disponuje metodou to_xml, to_yaml a podobně, vykreslí se výsledek této metody. Teprve pokud taková metoda neexistuje, renderuje se šablona.

Výjimky zděděné od některé z tříd definovaných v modulu Merb::ControllerExceptions zachytává kontrolér Exceptions, přičemž daná akce se jmenuje stejně jako dotyčná třída výjimky, akorát je převedena na podtržítkovanou verzi, tedy místo na výjimku třídy PostNotFound bude směrována na metodu post_not_found.

def show
  @post = Post.get(params[:id])
  raise PostNotFound unless @post
  display @post
end

Rychlost Merbu

Rychlost a značná paměťová náročnost je velkým problémem Rails. Je to způsobeno především zamykáním threadů na nepřiměřeně dlouhou dobu, což Merb nedělá. Merb se také snaží zůstat malý a nepřehánět to s metaprogramo­váním. To je sice dobré, ale časté používání takových věcí, jako je method_missing nebo define_method, nemá dobrý vliv na rychlost a mnohdy ani na čitelnost kódu.

Samozřejmě co se týče paměťové náročnosti, zde záleží především na samotném Ruby a jeho vazbě na webový server, zde nějaký zázračný rozdíl oproti Rails čekat nemůžeme, ale určitý rozdíl tu přeci jenom je. Nejméně paměťově náročná by měla být alternativa s mod_rails  pro Apache, často se používá Nginx nebo mongrelový cluster.

Stadardy dokumentace Merbu

Merb je jedním z nejlépe dokumentovaných projektů v Ruby světě. Programátoři v Ruby se zpravidla s komentováním příliš neobtěžují, protože Ruby je velmi přehledný a samovysvětlující jazyk. Merb je mnohem důslednější a nepopisuje pouze, co daná metoda dělá, jak je zvykem při dokumentování pomocí RDoc, ale také co vrací, jaké bere parametry, jaké výjimky hází a zda patří do veřejného, poloveřejného nebo privátního API. To se liší v tom, zda je určeno pro používání vývojáři pluginů, či zda je to interní záležitost Merbu. Vývojáři slibují maximálně stabilní veřejné API.

DataMapper

Ačkoliv je Merb ORM–agnostický, převážná většina merbových vývojářů používá DataMapper ORM. DataMapper je bratříčkem Merbu, stojí za ním stejná společnost i podobná filosofie. DataMapper je totiž zase agnostický k typu úložiště – můžete si vybrat, zda chcete ukládat do databáze, na disk do souborů nebo kamkoliv jinam. Stejně jako Merb, i DataMapper je modulární a skvěle dokumentovaný.

Co se týče podpory databází, momentálně je podporována MySQL, SQLite, PostgreSQL. Všechny jsem testoval, s DataMapperem fungují bez problémů. Lze doinstalovat také podporu CouchDB z balíčku dm-more, tu jsem zatím netestoval.

Podobně jako Merb, i DataMapper se snaží být co možná nejrychlejší a nejúspornější. Oproti ActiveRecordu umožňuje například volit, zda chceme použít lazy-loading a podobně, nicméně úspornost je vidět především na úrovni jeho implementace.

Osobně DataMapper používám velmi rád, nicméně není to jediná možnost. Lze použít také railsový ActiveRecord nebo Sequel, což je lehké ORM zaměřené na snadné dotazování v Ruby.

Současný stav vývoje Merbu

Merb je momentálně právě ve verzi 0.9.4, přičemž zhruba od verze 0.9 je dokonale stabilní a změny v API jsou pouze občasné. V nejbližších týdnech se chystá vydání stabilní verze 1.0, po které vývojáři slibují, že by veřejné API do verze 2.0 měněno být nemělo.

Poněkud horší situace je ohledně DataMapperu, který je sice také ve verzi 0.9.4, ale změny jsou zatím poměrně časté a sem tam se vyskytne i nějaká ta chybka. Vývoj jde ale dobředu velmi rychle a v nejbližší době se také chystá stabilní 1.0 verze. Kdybyste přesto DataMapperu stále nevěřili, připomínám, že v Merbu můžete použít libovolné ORM – třeba časem ověřený ActiveRecord z Rails.

Shrnutí

Merb je příjemný, jednoduchý a mocný webový framework. Již dnes za ním stojí velmi silná komunita i komerční subjekty, což mu dává skvělou perspektivu do budoucna. Merb je také přínosem pro prosazování lepší dokumentovanosti Ruby knihoven a v neposlední řadě z něj těží samotné Rails, které má konečně konkurenci a inspiraci.

Odkazy

Zdroje v češtině

Zdroje v angličtině

Anketa

Měli byste zájem o krátký seriál o Merbu?

Našli jste v článku chybu?
Vitalia.cz: Očkování je nutné, říká homeopatka

Očkování je nutné, říká homeopatka

Měšec.cz: Investiční pasti. Děláte to, co ostatní, ale proděláváte

Investiční pasti. Děláte to, co ostatní, ale proděláváte

Měšec.cz: Platíme NFC mobilem. Konečně to funguje!

Platíme NFC mobilem. Konečně to funguje!

Vitalia.cz: Za její cukrovkou stojí rodiče

Za její cukrovkou stojí rodiče

Měšec.cz: Do ostravské MHD bez jízdenky. Stačí karta

Do ostravské MHD bez jízdenky. Stačí karta

Měšec.cz: Co když na dovolené přijdete o kartu?

Co když na dovolené přijdete o kartu?

Lupa.cz: Kdo vykrádá LinkedIn? Zjistit to má soud

Kdo vykrádá LinkedIn? Zjistit to má soud

Lupa.cz: Nechcete datacentrum? Jsou na prodej

Nechcete datacentrum? Jsou na prodej

Podnikatel.cz: Pozor na vykuky, imitují služby České pošty

Pozor na vykuky, imitují služby České pošty

Lupa.cz: Hackujete? Můžete mít problém sehnat práci

Hackujete? Můžete mít problém sehnat práci

DigiZone.cz: Hodlá Markíza skončit v DVB-T?

Hodlá Markíza skončit v DVB-T?

Vitalia.cz: 9 potravin, které nesmí chybět v jídelníčku těhotné

9 potravin, které nesmí chybět v jídelníčku těhotné

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

Lupa.cz: Co najdete uvnitř kosmické sondy?

Co najdete uvnitř kosmické sondy?

Vitalia.cz: Ženy, které milují příliš, jsou neštěstí

Ženy, které milují příliš, jsou neštěstí

Měšec.cz: Na návštěvě na exekutorském úřadě

Na návštěvě na exekutorském úřadě

Lupa.cz: Měřičům síly hesla se nedá věřit. Víte proč?

Měřičům síly hesla se nedá věřit. Víte proč?

Měšec.cz: Co s reklamací, když e-shop krachuje?

Co s reklamací, když e-shop krachuje?

DigiZone.cz: AXN u FreeSatu měsíc zdarma

AXN u FreeSatu měsíc zdarma

Lupa.cz: Elektronika tajemství zbavená. Jak s ní začít?

Elektronika tajemství zbavená. Jak s ní začít?