<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Wzmacnianie ekosystemu Rubiego - Merb</title>
    <link>http://blog.zabiello.com/articles/2008/03/30/rubyconf2008-merb</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Wzmacnianie ekosystemu Rubiego - Merb</title>
      <description>&lt;p&gt;Przedwczoraj, w ramach &lt;a href="http://mtnwestrubyconf.org/"&gt;MountainWest Ruby Conference 2008&lt;/a&gt;, mia&#322;o miejsce ciekawe wyst&#261;pienie Ezry Zygmuntowicza na temat &lt;a href="http://merbivore.com/"&gt;Merba&lt;/a&gt;, webowego frameworka stworzonego w j&#281;zyku Ruby. Wersja strumieniowa, pliki wideo oraz slajdy z wyk&#322;adu, &lt;a href="http://mtnwestrubyconf2008.confreaks.com/02zygmuntowicz.html"&gt;s&#261; do pobrania&lt;/a&gt; w internecie. Ezra w prosty spos&#243;b pokaza&#322; kilka interesuj&#261;cych cech Merba, kt&#243;re odr&#243;&#380;niaj&#261; go od konkurencyjnego Ruby on Rails.&lt;/p&gt;


	&lt;h2&gt;Prostota jest lepsza od magii&lt;/h2&gt;


	&lt;p&gt;Przede wszystkim, Merb zbudowano na za&#322;o&#380;eniu &#380;e &lt;strong&gt;prostota jest lepsza od magii&lt;/strong&gt;. Wiele os&#243;b nie znaj&#261;cych zbytnio Rubiego, kt&#243;re zetkn&#281;&#322;y si&#281; z Railsami, my&#347;l&#261;, &#380;e permanentnie magiczne (implicite) podej&#347;cie do kodowania do jaka&#347; integralna cz&#281;&#347;&#263; samego j&#281;zyka Ruby. Tymczasem to nie jest problem Rubiego, ale filozofii zastosowanej w Rails. Sam Ruby (z za&#322;o&#380;enia) pozwala na rozwi&#261;zanie tego samego problemu na bardzo wiele sposobow. W pe&#322;ni zgadzam si&#281; z Ezr&#261;, &#380;e operowanie na otwartych klasach Rubiego mo&#380;e by&#263; bardzo u&#380;yteczn&#261; technik&#261;, ale z drugiej strony, nie powinna to by&#263;  g&#322;&#243;wna, ani najwa&#380;niejsza, technika w arsenale narz&#281;dzi programisty Rubiego. W ostatecznym rozrachunku, &#322;atwiej wr&#243;ci&#263; do kodu kt&#243;ry jest prosty ni&#380; tylko &#322;adny i magiczny z implementacj&#261; zaszyt&#261; g&#322;&#281;boko w gdzie&#347; includowanej bibliotece.&lt;/p&gt;


	&lt;p&gt;Ale Merb na tym si&#281; nie zatrzymuje. Jego mottem przewodnim jest &lt;strong&gt;nie ma szybszego kodu od braku kodu&lt;/strong&gt;. Ezra nie zgadza si&#281; za bardzo z rozumowaniem prezentowanym przez &lt;span class="caps"&gt;DHH&lt;/span&gt; i Rails, &#380;e skoro czas programisty jest dro&#380;szy od czasu serwera, to kto martwi si&#281; o wydajno&#347;&#263;, niech sobie dostawi&amp;#8230; wi&#281;cej serwer&#243;w. Nawi&#261;zuje to do permanentnie b&#322;&#281;dnej polityki ignorowania optymalizacji wydajno&#347;ciowej w Rails na rzecz koncentrowania si&#281; na ci&#261;gle nowej funkcjonalno&#347;ci, &amp;#8220;a wydajno&#347;&#263; poprawi si&#281; p&#243;&#378;niej, lub dostawi wi&#281;cej sprz&#281;tu&amp;#8221;. To prawda, &#380;e &amp;#8220;przedwczesna optymalizacja jest korzeniem wielu problem&#243;w, komplikacji itp. itd&amp;#8221; Prawd&#261; jest jednak&#380;e i to, &#380;e &amp;#8220;zbyt p&#243;&#378;na optymalizacja jest korzeniem wszystkich dodatkowych faktur do zap&#322;acenia dla centrum hostingowego&amp;#8221;. Merb od pocz&#261;tku jest tworzony z uwzgl&#281;dnieniem wydajno&#347;ci, modularno&#347;ci, wielow&#261;tkowo&#347;ci i elastyczno&#347;ci.&lt;/p&gt;


	&lt;p&gt;Merb (licz&#261;c od wersji 0.9 kt&#243;ra wnosi ogromne zmiany do wcze&#347;niejszej 0.5.x) zosta&#322; podzielony na kilka modu&#322;&#243;w. Rdze&#324; frameworka znajduje si&#281; w &lt;code&gt;merb-core&lt;/code&gt;. Dodatkowe mo&#380;liwo&#347;ci s&#261; dost&#281;pne w &lt;code&gt;merb-more&lt;/code&gt; i &lt;code&gt;merb-plugins&lt;/code&gt;. Nowy Merb jest zbudowany te&#380; na fundamenci&#281; &lt;a href="http://rack.rubyforge.org/"&gt;Rack&amp;#8217;a&lt;/a&gt; (wzorowanego na pythonowym &lt;a href="http://www.python.org/dev/peps/pep-0333/"&gt;&lt;span class="caps"&gt;WSGI&lt;/span&gt;&lt;/a&gt;, interfejsie dla aplikacji korzystaj&#261;cych z protoko&#322;u &lt;span class="caps"&gt;HTTP&lt;/span&gt;). Merb mo&#380;e by&#263; uruchamiany z kilkoma serwerami: Ebb, asynchroniczny Mongrel (Evented Mongrel), FastCGI, wielow&#261;tkowy Mongrel (Merb, w przeciwie&#324;stwie do Rails, jest w pe&#322;ni wielow&#261;tkowy), Thin czy Webrick.&lt;/p&gt;


	&lt;h2&gt;Wielow&#261;tkowo czy asynchronicznie?&lt;/h2&gt;


	&lt;p&gt;Ezra zwr&#243;ci&#322; uwag&#281; na dosy&#263; istotny aspekt wydajno&#347;ci dla adappterami asynchronicznymi (Ebb, Evented Mongrel, Thin) a wielow&#261;tkowym Mongrelem. Ot&#243;&#380; nie zawsze adaptery asynchroniczne s&#261; szybsze. Tak jest tylko w wypadku kr&#243;tko trwaj&#261;cych zapyta&#324;. Jednak&#380;e je&#347;li mamy sytuacj&#281; obs&#322;ugi jakiego&#347; d&#322;ugiego (kilku sekundowego) requestu, to adapter asynchroniczny ma zablokowan&#261; p&#281;tl&#281; i w efekcie, jak to okre&#347;li&#322; Erza, &amp;#8220;pada na pysk&amp;#8221;. Wielow&#261;tkowy Mongrel w takiej sytuacji, nie blokuje swojej pracy, ale odpala kolejny w&#261;tek dla obs&#322;ugi nast&#281;pnych request&#243;w. To, wi&#281;c, co warto u&#380;y&#263; zale&#380;y od charakteru aplikacji i mo&#380;na powiedzie&#263; &#380;e wielow&#261;tkowy Mongrel jest najbardziej uniwersalnym, cho&#263; nie zawsze najszybszym, rozwi&#261;zaniem. Mo&#380;na ewentualnie miesza&#263; podej&#347;cia i oczekiwane jako wolne, requesty kierowa&#263; na Mongrela a reszt&#281; na Ebb, czy Thin.  Osobi&#347;cie tego jeszcze nie testowa&#322;em, ale wydaje si&#281; to rozs&#261;dnym podej&#347;ciem.&lt;/p&gt;


	&lt;h2&gt;Pot&#281;&#380;niejszy router adres&#243;w&lt;/h2&gt;


	&lt;p&gt;Merb ma kompletnie inaczej napisany resolver adres&#243;w &lt;span class="caps"&gt;URL&lt;/span&gt; ni&#380; Rails. Po pierwsze, jest du&#380;o szybszy ze wzgl&#281;duna stosowan&#261; prekompilacj&#281;. Po drugie, jest du&#380;o elastyczniejszy od Rails&#243;w (czy Django, gdzie kt&#243;ry jest r&#243;wnie s&#322;aby). Przyjrzyjmy si&#281; poni&#380;szemu przyk&#322;adowi.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Router&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;prepare&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;match&lt;/span&gt;&lt;span class="punct"&gt;(%r[&lt;/span&gt;&lt;span class="regex"&gt;^/foor(.+)&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="symbol"&gt;:user_agent&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;(MSIE|Gecko)&lt;/span&gt;&lt;span class="punct"&gt;/).&lt;/span&gt;
    &lt;span class="ident"&gt;to&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:controller&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;foo&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;[1]&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;),&lt;/span&gt;
       &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;show&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:agent&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;:user_agent[1]&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;

  &lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;match&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/bar/:baz&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;).&lt;/span&gt;&lt;span class="ident"&gt;defer_to&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;request&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;bar&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Bar&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_baz&lt;/span&gt; &lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:baz&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
      &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:controller&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;bar&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
        &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;bar&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
        &lt;span class="symbol"&gt;:bar&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;bar&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_param&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W regule pierwszej wida&#263;, &#380;e router adres&#243;w zastosowany w Merbie pozwala filtrowa&#263; po dowolnych nag&#322;&#243;wkach. Np. mo&#380;e wiedzie&#263; czy u&#380;yto przegl&#261;darki Internet Explorer czy Firefox i stosownie do tego podejmuje dalsze dzia&#322;ania. Drugi przyk&#322;ad jest jeszcze ciekawszy. Z adresu &lt;span class="caps"&gt;URL&lt;/span&gt; wy&#322;uskiwana jest warto&#347;&#263; kt&#243;r&#261; Merb wykorzystuje aby odpyta&#263; baz&#281; danych i na tej podstawie odpowiednio przekierowa&#263; sterowanie.&lt;/p&gt;


	&lt;h2&gt;Akcje o sk&#322;adni metod Rubiego&lt;/h2&gt;


	&lt;p&gt;Mimo, &#380;e Merb pozwala, w podobny (do Rails) spos&#243;b, korzysta&#263; z hasza &lt;code&gt;params&lt;/code&gt;, dodano tu troch&#281; syntaktycznego lukru pozwalaj&#261;cego na pisanie kodu akcji w kontrolerze tak jak si&#281; pisze zwyk&#322;e metody w Rubim.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_mime_type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:yaml&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:to_yaml&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;%w[&lt;/span&gt;&lt;span class="string"&gt;application/x-yaml text/yaml&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_mime_type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:text&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:to_text&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;%w[&lt;/span&gt;&lt;span class="string"&gt;text/plain&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_mime_type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:html&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:to_html&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;%w[&lt;/span&gt;&lt;span class="string"&gt;text/html application/xhtml+xml application/html&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_mime_type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:xml&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="symbol"&gt;:to_xml&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="punct"&gt;%w[&lt;/span&gt;&lt;span class="string"&gt;application/xml text/xml application/x-xml&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="symbol"&gt;:Encoding&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;UTF-8&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_mime_type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:js&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;   &lt;span class="symbol"&gt;:to_json&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;%w[&lt;/span&gt;&lt;span class="string"&gt;text/javascript application/javascript application/x-javascript&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_mime_type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:json&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:to_json&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;%w[&lt;/span&gt;&lt;span class="string"&gt;application/json text/x-json&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;      
&lt;span class="comment"&gt;#...&lt;/span&gt;
&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Posts&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Application&lt;/span&gt;
  &lt;span class="ident"&gt;provides&lt;/span&gt; &lt;span class="symbol"&gt;:json&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:yaml&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:xml&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;show&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@post&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Post&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt; &lt;span class="ident"&gt;id&lt;/span&gt;
    &lt;span class="ident"&gt;display&lt;/span&gt; &lt;span class="attribute"&gt;@post&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Jarek&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;only_provides&lt;/span&gt; &lt;span class="symbol"&gt;:html&lt;/span&gt;
    &lt;span class="attribute"&gt;@user&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;User&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_name&lt;/span&gt; &lt;span class="ident"&gt;name&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Przekazywanie parametr&#243;w w metodzie zamiast w haszu, moim zdaniem, znacznie zwi&#281;ksza czytelno&#347;&#263; kodu. Umo&#380;liwia te&#380; wygodne stosowanie warto&#347;ci domy&#347;lnych.&lt;/p&gt;


	&lt;p&gt;S&#322;owo wyja&#347;nienia nale&#380;y si&#281; metodzie display(). Merb w inny (od Rails) spos&#243;b rozpoznaje typ &lt;span class="caps"&gt;MIME&lt;/span&gt; przekazany do metody. Zamiast przekazywa&#263; w akcji blok do respond_to, Merb definiuje tylko jakie metody maj&#261; by&#263; wywo&#322;ane dla odpowiedniego &lt;span class="caps"&gt;MIME&lt;/span&gt;.  Np. akcja odpalana dla adresu &lt;code&gt;/posts/user&lt;/code&gt; przekazuje do metody &lt;code&gt;user&lt;/code&gt; hasz params o warto&#347;ci &lt;code&gt;{:name =&amp;gt; "Jarek"}&lt;/code&gt;. Pobiera rekord z bazy i zwraca do klienta kod &lt;span class="caps"&gt;HTML&lt;/span&gt; wywo&#322;any za pomoc&#261; metody &lt;code&gt;to_html&lt;/code&gt; na obiekcie &lt;code&gt;user&lt;/code&gt;. W wypadku metody &lt;code&gt;show&lt;/code&gt; zwracanych jest wiele r&#243;&#380;nych reprezentacji zale&#380;nych od u&#380;ytego &lt;span class="caps"&gt;MIME&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Trzeba te&#380; doda&#263;, &#380;e Merb nie u&#380;ywa &#380;adnych magicznych railsowych metod &lt;code&gt;render&lt;/code&gt; kt&#243;re mog&#261; by&#263; wywo&#322;ane tylko jeden raz (sic!) na request. Merb mo&#380;e kolekcjonowa&#263; output z kilku miejsc. Za&#347; je&#347;li chodzi o sam&#261; akcj&#281; kontrolera, to zwracane jest po prostu ostatnie wyra&#380;enie (tak, jak w zwyk&#322;ych metodach Rubiego). Np. mo&#380;na otworzy&#263;&#160;plik i zwr&#243;ci&#263; stworzony obiekt &lt;code&gt;IO&lt;/code&gt; w metodzie kontrolera, a Merb potraktuje to jako przesy&#322;anie &lt;strong&gt;strumieniowe&lt;/strong&gt;.&lt;/p&gt;


	&lt;h2&gt;Git rz&#261;dzi&lt;/h2&gt;


	&lt;p&gt;Ezra podkre&#347;li&#322; sporo korzy&#347;ci jakie da&#322;o przej&#347;cie na rozproszony system wersjonowania kodu (Git). Znacznie &#322;atwiej mo&#380;na eksperymentowa&#263; z kodem i zg&#322;asza&#263; poprawki ni&#380; w wypadku starego &lt;span class="caps"&gt;SVN&lt;/span&gt;&amp;#8217;a. I co ciekawe, tak&#380;e Ruby on Rails zamierza te&#380; przej&#347;&#263; na Git&amp;#8217;a w przeci&#261;gu jakich&#347; dw&#243;ch miesi&#281;cu.&lt;/p&gt;</description>
      <pubDate>Sun, 30 Mar 2008 20:39:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a9c11a35-7d21-40bf-8df1-207344596196</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/03/30/rubyconf2008-merb</link>
      <category>ruby</category>
      <category>merb</category>
      <category>rails</category>
    </item>
    <item>
      <title>"Wzmacnianie ekosystemu Rubiego - Merb" by Jiima</title>
      <description>&lt;p&gt;Boom na ksi&#261;&#380;ki o Rails. Mo&#380;e. Tylko co co&#347; dorw&#281;, opisuje w najlepszym przypadku Edge -&amp;gt; 2.0. Za szybko to si&#281; rozwija by papierowe wydawnictwa nad&#261;&#380;a&#322;y.&lt;/p&gt;


	&lt;p&gt;Merb rozwija si&#281; jeszcze szybciej. Mo&#380;e wi&#281;c za wcze&#347;nie na knigi? Ale kilka dobrych manuali na stronie by si&#281; przyda&#322;o. &amp;#8220;Beznadziejnie skomplikowane frameworki javove&amp;#8221; takie jak Spring cz&#281;sto s&#261; nie takie beznadziejnie skomplikowane dzi&#281;ki dobrej dokumentacji&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Mo&#380;e Ezra te&#380; zauwa&#380;y, &#380;e obok kosztu dostawiania serwer&#243;w, ca&#322;kiem dobrym i prostym do redukcji jest czas grzebania w kodzie by nauczy&#263; si&#281; &amp;#8220;tego&amp;#8221; u&#380;ywa&#263;, bo framework jest genialny. Niestety, frameworki powstaj&#261; z my&#347;l&#261; o &amp;#8220;programistach u&#380;ytkownikach&amp;#8221; a nie osobach o mentalno&#347;ci hacker&#243;w, kt&#243;rzy (jak ja) znajduj&#261; przyjemno&#347;&#263; w grzebaniu si&#281; w czyim&#347; kodzie :P&lt;/p&gt;


	&lt;p&gt;Sam zacz&#261;&#322;em pisa&#263; co&#347; na temat Merba ale nie wiem czy kiedykolwiek ujrzy to &#347;wiat&#322;o dzienne &amp;#8211; praca, praca magisterska, dziecko, drugie dziecko i jeszcze kiedy&#347; trzeba na piwo wyskoczy&#263;&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Thu, 03 Apr 2008 15:55:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:6457ef5a-9530-4075-aa2a-a7d733929858</guid>
      <link>http://blog.zabiello.com/articles/2008/03/30/rubyconf2008-merb#comment-1545</link>
    </item>
    <item>
      <title>"Wzmacnianie ekosystemu Rubiego - Merb" by Bartosz Radaczy&#324;ski</title>
      <description>&lt;p&gt;Bardzo ciekawy post. Co do GITa to polecam prezentacj&#281; Randalla Schwartza:
&lt;a href="http://video.google.com/videoplay?docid=-3999952944619245780" rel="nofollow"&gt;http://video.google.com/videoplay?docid=-3999952944619245780&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 02 Apr 2008 09:42:31 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:d80de877-cb65-4905-8daf-ac4fc316d984</guid>
      <link>http://blog.zabiello.com/articles/2008/03/30/rubyconf2008-merb#comment-1542</link>
    </item>
    <item>
      <title>"Wzmacnianie ekosystemu Rubiego - Merb" by Seban</title>
      <description>&lt;p&gt;Do Rails&#243;w te&#380; d&#322;ugo by&#322;a tylko jedna ksi&#261;&#380;ka. Teraz mo&#380;na m&#243;wi&#263; o bumie na ksi&#261;&#380;ki o RoR.&lt;/p&gt;</description>
      <pubDate>Mon, 31 Mar 2008 11:03:10 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:f4804b94-967d-4142-af3c-a50796f341a8</guid>
      <link>http://blog.zabiello.com/articles/2008/03/30/rubyconf2008-merb#comment-1534</link>
    </item>
    <item>
      <title>"Wzmacnianie ekosystemu Rubiego - Merb" by dmilith</title>
      <description>&lt;p&gt;no niech tylko wyjdzie potem &#322;adna ksi&#261;&#380;ka do merb&amp;#8217;a tak jak wysz&#322;y do rails&#243;w..&lt;/p&gt;</description>
      <pubDate>Mon, 31 Mar 2008 10:59:42 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:e58740f4-a06e-4ab4-a185-8ddb1d441974</guid>
      <link>http://blog.zabiello.com/articles/2008/03/30/rubyconf2008-merb#comment-1533</link>
    </item>
    <item>
      <title>"Wzmacnianie ekosystemu Rubiego - Merb" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@greno: nie podajesz &#380;adnych szczeg&#243;&#322;&#243;w wi&#281;c nie wiem o co chodzi. Mnie tam dzia&#322;a. Je&#347;li chcesz przedyskutowa&#263; problem, to kieruj to do w&#322;a&#347;ciwego miejsca, czyli na kana&#322; IRC &lt;a href="irc://irc.eu.freenode.net/ruby.pl" rel="nofollow"&gt;#ruby.pl&lt;/a&gt; lub grup&#281; dyskusyjn&#261; &lt;a href="news://pl.comp.lang.ruby" rel="nofollow"&gt;pl.comp.lang.ruby&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 30 Mar 2008 21:43:43 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:fac998f0-241b-48a7-9467-4b13c37c2e7c</guid>
      <link>http://blog.zabiello.com/articles/2008/03/30/rubyconf2008-merb#comment-1530</link>
    </item>
    <item>
      <title>"Wzmacnianie ekosystemu Rubiego - Merb" by greno</title>
      <description>&lt;p&gt;Mo&#380;e to wersja developerska (pobra&#322;em z git&amp;#8217;a 0.9.2), ale code generations nie do ko&#324;ca dzia&#322;a. Zrobienie resource sko&#324;czy&#322;o si&#281; fiaskiem.&lt;/p&gt;</description>
      <pubDate>Sun, 30 Mar 2008 21:37:47 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:55fddda7-4a9c-4f22-8305-a0676a9c8eaa</guid>
      <link>http://blog.zabiello.com/articles/2008/03/30/rubyconf2008-merb#comment-1529</link>
    </item>
  </channel>
</rss>
