<?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: Tag datamapper</title>
    <link>http://blog.zabiello.com/articles/tag/datamapper</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Merb 0.9.6</title>
      <description>&lt;p&gt;Ci, co instalowali sobie &lt;a href="http://merbivore.com/"&gt;Merba&lt;/a&gt; i robi&#261; sobie czasem aktualizacj&#281; gem&#243;w Rubiego, mog&#261; zauwa&#380;y&#263; &#380;e, co dwa tygodnie pojawia si&#281; kolejna jego wersja (w tej chwili jest to 0.9.6). Tak ma by&#263; a&#380; do pa&#378;dziernikowej wersji 1.0. Co ciekawe, synchronicznie z Merbem pojawia si&#281; zbli&#380;ona wersja &lt;a href="http://datamapper.org/"&gt;DataMappera&lt;/a&gt;. Nie jest to przypadek, bo deweloperzy obu projekt&#243;w &#347;ci&#347;le ze sob&#261; wsp&#243;&#322;pracuj&#261; (DataMapper 1.0 ma wyj&#347;&#263; razem z Merbem 1.0).&lt;/p&gt;


	&lt;p&gt;Wydaje si&#281;, te&#380; &#380;e &lt;a href="http://datamapper.org/"&gt;DataMapper&lt;/a&gt; zaczyna stawa&#263; si&#281; preferowanym &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217;em dla Merba, mimo &#380;e Merb nie jest od niego uzale&#380;niony (tak jak Rails od Active Record) i r&#243;wnie dobrze wsp&#243;&#322;pracuje z innymi &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217;ami napisanymi w Ruby, jak (b. dobry) &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt; czy wspomniany &lt;a href="http://ar.rubyonrails.org/"&gt;Active Record&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Merb aktualnie jest intensywnie szlifowany. Publiczne &lt;span class="caps"&gt;API&lt;/span&gt; jeszcze mo&#380;e ulec zmianie, wi&#281;c ci co u&#380;ywaj&#261; wersji bie&#380;&#261;cych musz&#261; &#347;ledzi&#263; to, co si&#281; zmienia. Po wyj&#347;ciu wersji 1.0 publiczne &lt;span class="caps"&gt;API&lt;/span&gt; ma by&#263; zamro&#380;one a&#380; do kolejnej wersji 2.0.&lt;/p&gt;


	&lt;p&gt;Bardzo ciekawie wygl&#261;da dodany niedawno do Merba &lt;a href="http://merbunity.com/tutorials/15"&gt;radykalnie nowy, modularny i 100% wielow&#261;tkowy cache&lt;/a&gt;. Dodano te&#380; inteligentniejsz&#261; regeneracj&#281; cache&amp;#8217;a. Aplikacja nie jest zwalniana procesem regeneracji cache&amp;#8217;a. Je&#347;li czas od&#347;wie&#380;enia przegl&#261;darki zbiegnie si&#281; z czasem od&#347;wie&#380;enia danych, Merb uruchamia taki proces dopiero &lt;em&gt;po&lt;/em&gt; wcze&#347;niejszym odes&#322;aniu starszych danych do klienta. Ulepszono te&#380; &lt;a href="http://merbunity.com/tutorials/17"&gt;spos&#243;b generowania projektu&lt;/a&gt;. Np. stworzenie nowego projektu, gdzie system testowania b&#281;dzie oparty na &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;, silnikiem szablon&#243;w b&#281;dzie &lt;a href="http://haml.hamptoncatlin.com/"&gt;Haml&lt;/a&gt;, a &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217;em &amp;#8211; &lt;a href="http://datamapper.org/"&gt;DataMapper&lt;/a&gt; mo&#380;na odpali&#263; za pomoc&#261; opcji generatora:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_bash "&gt;merb-gen app projekt --testing-framework=rspec \
                     --template-engine=haml \
                     --orm=datamapper&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Jednak to, co stawia Merba wyra&#380;nie wy&#380;ej od Rails to jego modularna budowa. Nie tylko mo&#380;na zamieni&#263; ca&#322;y projekt w gema. Dzi&#281;ki &lt;a href="http://merbivore.com/documentation/merb-more/head/merb-slices/index.html"&gt;slices&lt;/a&gt; mo&#380;na  ca&#322;&#261; aplikacj&#281; dos&#322;ownie posk&#322;ada&#263; z gem&#243;w. Moim zdaniem, jest to nawet lepiej zrobione ni&#380; w &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Thu, 11 Sep 2008 00:22:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:cc0ca0cf-03a3-470d-9804-80e61ed94245</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/09/11/merb-0-9-6</link>
      <category>merb</category>
      <category>ruby</category>
      <category>rails</category>
      <category>datamapper</category>
    </item>
    <item>
      <title>Git rz&#261;dzi</title>
      <description>&lt;p&gt;Je&#347;li mia&#322;em wcze&#347;niej jakie&#347; w&#261;tpliwo&#347;ci czy przej&#347;&#263; na &lt;a href="http://git.or.cz/"&gt;Gita&lt;/a&gt; czy trzyma&#263; si&#281; &lt;span class="caps"&gt;SVN&lt;/span&gt;&amp;#8217;a, to ju&#380; dzi&#347; ich nie mam. Wygoda tworzenia lekkich branchy Gita jest powalaj&#261;ca. Dzisiaj podczas tworzenia aplikacji z u&#380;yciem &lt;a href="http://code.google.com/p/ruby-sequel/"&gt;Sequel&amp;#8217;a&lt;/a&gt; postanowi&#322;em sprawdzi&#263; &lt;a href="http://datamapper.org/"&gt;DataMappera&lt;/a&gt;...&lt;/p&gt;


Wiele os&#243;b s&#261;dzi, &#380;e nast&#281;pc&#261; Active Record b&#281;dzie DataMapper. Wykorzystuje podobne podej&#347;cie odno&#347;nie relacji mi&#281;dzy modelami, lecz dzia&#322;a du&#380;o szybciej. Mia&#322;em jednak ju&#380; troch&#281; kodu w modelach opartych na Sequelu. Pierwsze, co trzeba zrobi&#263; to odpali&#263; w katalogu projektu 
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;init&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Powstanie folder &lt;code&gt;.git&lt;/code&gt;. W przeciwie&#324;stwie do &lt;span class="caps"&gt;SVN&lt;/span&gt;, Git nie &#347;mieci milionem katalog&#243;w &lt;code&gt;.svn&lt;/code&gt; w ka&#380;dym z podkatalog&#243;w. Git tworzy tylko jeden, na najwy&#380;szym poziomie &amp;#8211; nice, isn&amp;#8217;t it? Nast&#281;pny krok to wrzucenie wszystkiego do lokalnego repozytorium (ten folder &lt;code&gt;.git&lt;/code&gt; jest w&#322;a&#347;ciwym repozytorium)

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;add&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;
&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;commit&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Nasz kod zostanie zachowany. Teraz tworzymy sobie lekki branch (w tym wypadku o nazwie &amp;#8220;datamapper&amp;#8221;). Opcj&#281; &lt;code&gt;-b&lt;/code&gt; u&#380;ywa si&#281; podczas tworzenia ga&#322;&#281;zi.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;checkout&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;b&lt;/span&gt; &lt;span class="ident"&gt;datamapper&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Za pomoc&#261; generator&#243;w wywali&#322;em wszystkie modele i stworzy&#322;em nowy kod. W ka&#380;dej chwili mo&#380;liwy jest powr&#243;t do poprzednich plik&#243;w. Wszystko dzieje si&#281; w mgnieniu oka&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;# prze&#322;&#261;czam si&#281; na pierwotny kod:&lt;/span&gt;
&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;checkout&lt;/span&gt; &lt;span class="ident"&gt;master&lt;/span&gt;

&lt;span class="comment"&gt;# teraz jestem znowu w ga&#322;&#281;zi datamapper&lt;/span&gt;
&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;checkout&lt;/span&gt; &lt;span class="ident"&gt;datamapper&lt;/span&gt;

&lt;span class="comment"&gt;# grzebi&#281; w kodzie&lt;/span&gt;
&lt;span class="comment"&gt;# zapisuj&#281; w repozytorum zmiany&lt;/span&gt;
&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;commit&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;

&lt;span class="comment"&gt;# i z powrotem do g&#322;&#243;wnego kodu :)&lt;/span&gt;
&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;checkout&lt;/span&gt; &lt;span class="ident"&gt;master&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I ju&#380; jestem z powrotem. Git pozwala na b&#322;yskawiczne tworzenie nieograniczonej ilo&#347;ci takich odga&#322;ezie&#324; kodu. Bardzo to si&#281; przydaje przy r&#243;&#380;nych eksperymentach z kodem. Mo&#380;na si&#281; prze&#322;&#261;cza&#263;, i je&#347;li chcemy, szybko scala&#263; zmiany z g&#322;own&#261; ga&#322;&#281;zi&#261; (master). Bardzo mi si&#281; to spodoba&#322;o. Oczywi&#347;cie, mo&#380;liwo&#347;&#263; d&#322;ubania w kodzie z zachowanie historii zmian w sytuacji kiedy nie mamy dost&#281;pu do internetu nie jest &#380;adnym problemem dla Gita. To jest cecha wszystkich  &lt;em&gt;rozproszone&lt;/em&gt; system&#243;w wersjonowania. Dlaczego Git a nie Mercurial? Mo&#380;na u&#380;ywa&#263; i Mercurial, ale Git jest najszybszy, mam do tego &#347;wietnego &lt;a href="http://github.com"&gt;githuba&lt;/a&gt; i nie interesuje mnie u&#380;ywanie win32 do tworzenia oprogramowania. Anyway, &amp;#8220;bye, bye Subversion&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Co z DataMapperem? Na dzie&#324; dzisiejszy ma za ma&#322;o dokumentacji aby mo&#380;na by&#322;o szybko go opanowa&#263;. Sequel jest du&#380;o &#322;atwiejszy do opanowania i przydaje si&#281;&#160;bardziej tam gdzie mamy bardziej z&#322;o&#380;one struktury tabel. Z&#322;o&#380;one zapytania &lt;span class="caps"&gt;SQL&lt;/span&gt;  dla Sequela to bu&#322;ka z mas&#322;em. W DataMapper troch&#281; si&#281; pogubi&#322;em. Dam mu ponown&#261; szans&#281; mo&#380;e za 2 miesi&#261;ce, jak b&#281;dzie troch&#281; wi&#281;cej dokumentacji.&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;BTW&lt;/span&gt;, ci, co u&#380;ywaj&#261; najnowszego Merba (wersja edge w chwili pisania tego tekstu nosi numer  0.9.4), nie znajd&#261; w kodzie merb-plugins biblioteki merb_datamapper. Merb ju&#380;&#160;nie zajmuje si&#281; tym modu&#322;em, ch&#322;opaki z DataMapper&amp;#8217;a przej&#281;li nad nim kontrol&#281; i trzeba go &#347;ci&#261;ga&#263; z innego miejsca, zosta&#322; dodany do &lt;a href="http://github.com/sam/dm-more/tree/master"&gt;dm-more&lt;/a&gt;. Sam gem &lt;code&gt;datamapper&lt;/code&gt; mo&#380;na spokojnie wyrzuci&#263; bo stara wersa (0.3.x) zosta&#322;a powa&#380;nie przebudowana i jest dost&#281;pna (aktualnie jako 0.9) pod inn&#261; nazw&#261; jako &lt;a href="http://github.com/sam/dm-core/tree/master"&gt;dm-core&lt;/a&gt; i &lt;a href="http://github.com/sam/dm-more/tree/master"&gt;dm-more&lt;/a&gt; (troch&#281; wzorowali si&#281; tu na &lt;a href="http://merbivore.com/"&gt;Merbie&lt;/a&gt;)&lt;/p&gt;</description>
      <pubDate>Sun, 18 May 2008 18:28:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:9f07f02c-a151-4be8-8cbb-6e9546d25332</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/05/18/git-rulez</link>
      <category>sequel</category>
      <category>datamapper</category>
      <category>git</category>
      <category>subversion</category>
      <category>ruby</category>
    </item>
    <item>
      <title>W&#347;ciek&#322;y Zed i dyskusja wok&#243;&#322; Rubiego i Rails&#243;w</title>
      <description>&lt;p&gt;Ostatnio jest troch&#281; szumie w bran&#380;y po bezpardonowym (i niewybrednym) &lt;a href="http://www.zedshaw.com/rants/rails_is_a_ghetto.html"&gt;ataku Zeda Shaw&lt;/a&gt; uderzaj&#261;cym w kilka znanych postaci z kr&#281;g&#243;w Rubiego i Rails. Pewnie nikt by na to nie zwr&#243;ci&#322; uwagi gdyby nie to, &#380;e Zed jest autorem znanego projektu &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt;. Cho&#263; wpis si&#281; &#378;le czyta (bo jest rozwlek&#322;y i niepotrzebnie przeplatany ci&#261;g&#322;ymi przekle&#324;stwami autora) to zwr&#243;ci&#322; uwag&#281; na kilka istotnych problem&#243;w.&lt;/p&gt;


	&lt;p&gt;Autor zwraca uwag&#281;, &#380;e core team Rails&#243;w dosy&#263; opornie i wolno reaguje na podsy&#322;ane uwagi i poprawki. Fakt, jedn&#261; z poprawek jak&#261; kiedy&#347; podes&#322;a&#322;em odno&#347;nie &#378;le dzia&#322;aj&#261;cej funkcji render_to_string uwzgl&#281;dniono po.. o&#347;miu miesi&#261;cach. Zed si&#281; wkurzy&#322;, &#380;e ignorowano jego uwagi a potem i tak wychodzi&#322;o na jego. Tak z po&#322;owa core teamu to wg niego banda idiot&#243;w z wyp&#322;ukanymi przez &lt;span class="caps"&gt;PHP&lt;/span&gt;  m&#243;zgami. Ze swej strony bym m&#243;g&#322; do tej listy niekompetencji owej &amp;#8220;bandy&amp;#8221; te&#380; co&#347; do&#322;o&#380;y&#263;, ale to nie jest najwa&#380;niejsze. Jest reszta, kt&#243;ra dobrze robi swoj&#261; robot&#281;.  Ale mo&#380;e taka krytyka podzia&#322;a jak kube&#322; zimnej wody i w ko&#324;cu ca&#322;y core team zacznie skupia&#263; si&#281; na jako&#347;ci i optymalizacji ju&#380; istniej&#261;cego kodu. Bo jak nie, to programi&#347;ci Rails zaczn&#261; sukcesywnie przesuwa&#263; si&#281; do konkurencyjnego projektu &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt;. Ezra Zygmuntowicz udowodni&#322;, &#380;e mo&#380;na napisa&#263; &amp;#8220;lepsze Railsy&amp;#8221; (szybsze,  wielow&#261;tkowe i bardziej przejrzyste). Podoba mi si&#281; in&#380;ynieryjne podej&#347;cie Ezry Zygmuntowicza. Jego Merb jest bardzo &#322;adny, przejrzysty i szybki. Co ciekawe, Ezra zatrudni&#322; kilku developer&#243;w &lt;a href="http://rubini.us/"&gt;Rubiniusa&lt;/a&gt;. Zapowiada si&#281; &#380;e Railsy w ko&#324;cu spotka&#322;y bardzo trudn&#261; konkurencj&#281; (i bardzo dobrze). Sytuacj&#281; Rals&#243;w pog&#322;&#281;bia to, &#380;e nowe &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217;y takie jak &lt;a href="http://datamapper.org/why.html"&gt;DataMapper&lt;/a&gt; i &lt;a href="http://code.google.com/p/ruby-sequel/"&gt;Sequel&lt;/a&gt; r&#243;wnie&#380; stanowi&#261; zagro&#380;enie dla dominacji &lt;a href="http://ar.rubyonrails.com/"&gt;Active Record&lt;/a&gt; nawet w kontek&#347;cie Rails&#243;w.&lt;/p&gt;


	&lt;h3&gt;PickAxe i inne ksi&#261;&#380;ki&lt;/h3&gt;


	&lt;p&gt;Zed przeprowadzi&#322; bardzo ciekaw&#261; krytyk&#281; chwalonej &lt;a href="http://helion.pl/ksiazki/prruby.htm"&gt;PickAxe&lt;/a&gt;. Ostro rozjecha&#322; autora za u&#380;ywanie g&#322;upich przyk&#322;ad&#243;w, niezgodnego z konwencjami Rubiego nazewnictwem zmiennych, i co najwa&#380;niejsze, omini&#281;cie szerokim &#322;ukiem najwa&#380;niejszej i najbardziej atrakcyjnej cechy Rubiego &amp;#8211; &#322;atwo&#347;ci metaprogramowania. PickAxe, zdaniem Zeda, odwo&#322;uje si&#281; do starych praktyk projektowania obiektowego z roku 2001. Zed idzie nawet dalej, uwa&#380;a &#380;e ta ksi&#261;&#380;ka promuje z&#322;e nawyki programistyczne i zach&#281;ca do pisania z&#322;ego kodu. Twierdzi nawet, &#380;e ta ksi&#261;&#380;ka zamiast pom&#243;c, zaszkodzi&#322;a Rubiemu aby wcze&#347;niej wyp&#322;yn&#261;&#322; na szerok&#261; scen&#281;.&lt;/p&gt;


	&lt;p&gt;Faktycznie, w latach 2001-2004 o Ruby praktycznie nikt nie s&#322;ysza&#322;. Jakie&#347; nieliczne wyj&#261;tki uczy&#322;y si&#281; Rubiego na &lt;a href="http://www.ruby-doc.org/docs/ProgrammingRuby/"&gt;ksi&#261;&#380;ce Dave&amp;#8217;a Thomasa&lt;/a&gt; ale j&#281;zyk jako taki by&#322; czym&#347; bardzo malo znanym. Sytuacj&#281; zmieni&#322;o dopiero pojawienie &lt;a href="http://rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; w 2005 roku, ktore spowodowa&#322;y &lt;strong&gt;znacz&#261;cy wzrost&lt;/strong&gt; popularno&#347;ci Rubiego (ja sam te&#380; zainteresowa&#322;em si&#281; te&#380; Railsami, a dopiero p&#243;&#378;niej Rubim). &lt;strong&gt;Dopiero Railsy pokaza&#322;y pi&#281;kno i moc metaprogramowania w Ruby&lt;/strong&gt;, co&#347; co zachwyci&#322;o rzesze ludzi, co&#347; czego nie maj&#261; inne j&#281;zyki. I nie wiem jak by si&#281; wysilano, nie da si&#281; uzyska&#263; tak pi&#281;knego i eleganckiego metaproramowania w &lt;span class="caps"&gt;PHP&lt;/span&gt;, Javie, czy nawet Pythonie. Zed bezpardonowo stwierdzi&#322;, &#380;e PickAxe tylko zaszkodzi&#322; Rubiemu zamiast mu pom&#243;c.&lt;/p&gt;


	&lt;p&gt;Wpierw mnie zaskoczy&#322;a ta opinia, ale p&#243;&#378;niej, jak si&#281; zastanowi&#322;em, to musz&#281; przyzna&#263; &#380;e du&#380;o w tym racji. Nigdy do mnie nie przemawia&#322;y u&#380;yte w ksi&#261;&#380;ce przyk&#322;ady. Ceni&#322;em j&#261; g&#322;&#243;wnie za to, &#380;e w og&#243;le jest cokolwiek na temat Rubiego, i &#380;e opisano bibliotek&#281; standardow&#261; Rubiego. Jestem ciekaw, co Zed by powiedzia&#322; na ksi&#261;&#380;k&#281; Hala Fultona &amp;#8220;The Ruby Way&amp;#8221;. Jej drugie wydanie w&#322;a&#347;nie &lt;a href="http://helion.pl/ksiazki/swruby.htm"&gt;zosta&#322;o wydane po polsku&lt;/a&gt;. Szkoda tylko, &#380;e ma w polskim wydaniu myl&#261;cy tytu&#322; sugeruj&#261;cy, &#380;e to tylko jaki&#347; zestaw 400 przyk&#322;ad&#243;w. Ksi&#261;&#380;k&#281; si&#281; dosy&#263; dobrze czyta. Lepiej ni&#380; PickAxe. T&#261; pierwsz&#261; troch&#281; traktuj&#281; jak podr&#281;cznik do bibliotek Rubiego.&lt;/p&gt;


	&lt;p&gt;Co ciekawe, dosta&#322;o si&#281; te&#380; troch&#281; ksi&#261;&#380;ce &lt;a href="http://helion.pl/ksiazki/agilep.htm"&gt;Agile&lt;/a&gt; :) Ale generalnie du&#380;o nie ma co si&#281; przyczepi&#263;. Ksi&#261;&#380;ka jest raczej dobrze napisana, szkoda tylko, &#380;e opisuje starsze Rails 1.2 a nie 2.0. No c&#243;&#380;, nie wiadomo czy wyjdzie trzecie wydanie, bo &lt;a href="http://www.loudthinking.com/about.html"&gt;&lt;span class="caps"&gt;DHH&lt;/span&gt;&lt;/a&gt; jako&#347; si&#281; do niego nie pali.&lt;/p&gt;


	&lt;p&gt;Z ciekawo&#347;ci sprawdzi&#322;em inn&#261; ksi&#261;&#380;k&#281;, polecan&#261; przez Zeda, &lt;a href="http://www.amazon.com/Rails-Way-Addison-Wesley-Professional-Ruby/dp/0321445619/"&gt;The Rails Way&lt;/a&gt;. Faktycznie wygl&#261;da na dobrze napisan&#261; i uwzgl&#281;dnia nowsze cechy Rails&#243;w. Jest dost&#281;pna online (cho&#263; nie za darmo) przez &lt;a href="http://safari.oreilly.com/"&gt;O&amp;#8217;Reilly Safari Books Online&lt;/a&gt; (tak w og&#243;le to &#347;wietny serwis, kt&#243;ry warto sobie zaprenumerowa&#263;).&lt;/p&gt;


	&lt;h3&gt;Rubinius, JRuby i Jubinius&lt;/h3&gt;


	&lt;p&gt;Zed si&#281; wkurzy&#322;, nabluzga&#322;, ale zwr&#243;ci&#322; uwag&#281; na kilka wa&#380;nych kwestii. Tak&#380;e odno&#347;nie samego Rubiego to pochwa&#322;a dosta&#322;a si&#281; &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; i &lt;a href="http://rubini.us/"&gt;Rubiniusowi&lt;/a&gt;. Szczeg&#243;lnie ten drugi mo&#380;e wkr&#243;tce kompletnie zagrozi&#263; dominacji &lt;span class="caps"&gt;MRI&lt;/span&gt; jaki jest u&#380;ywany w dzisiejszej, opartej na C, implemementacji Rubiego. Je&#347;li szybko nie powstanie kompletnie uko&#324;czony &lt;a href="http://www.atdot.net/yarv/"&gt;&lt;span class="caps"&gt;YARV&lt;/span&gt;&lt;/a&gt; (w&#322;&#261;czony do Ruby 1.9), to Rubinius zwyci&#281;&#380;y. Temat Rubiniusa jest on tematem naszych dyskusji na kanale &lt;span class="caps"&gt;IRC&lt;/span&gt; &lt;a href="irc://irc.eu.freenode.net/rubyonrails.pl"&gt;#rubyonrails.pl&lt;/a&gt;. Podej&#347;cie jest tu troch&#281; podobne do pythonowego &lt;a href="http://codespeak.net/pypy/dist/pypy/doc/news.html"&gt;PyPy&lt;/a&gt;, cho&#263; Rubinius nawi&#261;zuje bardziej do 30 lat do&#347;wiadcze&#324; &lt;a href="http://www.smalltalk.org/main/"&gt;Smalltalka&lt;/a&gt;. Celem jest stworzenie najszybszej wirtualnej maszyny Rubiego oraz &#322;atwego i szybkiego rozwoju dla samego Rubiego. Dzi&#281;ki temu, &#380;e mamy tu do czynienia z Ruby kt&#243;rego implementacja napisana jest w Ruby, znacznie &#322;atwiej jest rozwija&#263; j&#281;zyk.&lt;/p&gt;


	&lt;p&gt;Co ciekawe, autorzy JRuby zastanawiaj&#261; si&#281; czy nie zrobi&#263; podobnie. I ju&#380; s&#261; dyskusj&#281; o tym aby stworzy&#263; analogicznie &lt;a href="http://ola-bini.blogspot.com/2007/09/rubinius-is-important.html"&gt;Jubiniusa&lt;/a&gt;. Tak jak Rubinius w &#322;atwy spos&#243;b wci&#261;ga biblioteki napisane w C, Jubinius wci&#261;ga&#322;by te napisane w Javie. Jubinius mia&#322;by dodatkowo o tyle wygodniejsz&#261; sytuacj&#281;, &#380;e implementacja ca&#322;ej biblioteki standardowej Rubiego jest ju&#380; przepisana do Rubiego. Jubinius m&#243;g&#322;by z marszu wykorzysta&#263; ten kod.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Jan 2008 23:49:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:1c2f3888-12a8-42dd-b190-ddd345a03248</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/01/06/zed-ruby-rails</link>
      <category>mongrel</category>
      <category>ruby</category>
      <category>rubinius</category>
      <category>merb</category>
      <category>rails</category>
      <category>datamapper</category>
      <category>sequel</category>
      <category>activerecord</category>
      <category>jruby</category>
      <category>jubinius</category>
    </item>
    <item>
      <title>Sphinx i Merb - silna konkurencja dla Ferreta i Rails&#243;w</title>
      <description>&lt;p&gt;&lt;a href="http://sphinxsearch.com/"&gt;Sphinx&lt;/a&gt; to alternatywny wobec Lucene/Ferreta silnik wyszukiwania pe&#322;notekstowego. Charakteryzuje si&#281; ogromn&#261; szybko&#347;ci&#261; dzia&#322;ania i ma&#322;ym zu&#380;yciem zasob&#243;w komputera. R&#243;&#380;nica jest tak kolosalna, &#380;e jak kto&#347; pierwszy raz s&#322;yszy &#380;e Sphinx indeksuje teksty miliony razy szybciej to nie chce wierzy&#263;. Nazywaj&#261; go odpowiednikiem &lt;a href="http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer"&gt;Nginksa&lt;/a&gt; dla wyszukiwania pe&#322;notekstowego. W obu przypadkach autorami s&#261; rosyjscy programi&#347;ci.&lt;/p&gt;


	&lt;p&gt;Troch&#281; czasu mi zaj&#281;&#322;o zanim si&#281; przekona&#322;em, &#380;e do webowego wyszukiwania tekst&#243;w, u&#380;ywanie mechanizm&#243;w opartych na relacyjnej bazie danych i skryptach Rubiego/Pythona, to raczej kiepski pomys&#322;. W artykule &lt;a href="http://blog.zmok.net/articles/2006/08/14/full-text-search-in-ruby-on-rails"&gt;Full text search in Ruby on Rails&lt;/a&gt; elegancko wypunktowano r&#243;&#380;nice mi&#281;dzy &lt;a href="http://ferret.davebalmain.com/traca"&gt;Ferretem&lt;/a&gt; MySQL. &lt;a href="http://rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; (a w&#322;a&#347;ciwie Active Record) posiada nawet gotowy plugin &lt;a href="http://projects.jkraemer.net/acts_as_ferret/"&gt;acts_as_ferret&lt;/a&gt; kt&#243;ry bardzo upraszcza integracj&#281; Ferreta z baz&#261; MySQL. W sieci mo&#380;na spotka&#263; sporo artyku&#322;&#243;w os&#243;b zachwyconych mo&#380;liwo&#347;ciami Ferreta i &#322;atwo&#347;ci&#261; u&#380;ycia plugina acts_as_ferret. Jest tylko jeden drobny problem. Czas indeksowania tekst&#243;w.&lt;/p&gt;


	&lt;p&gt;Pr&#243;bowa&#322;em zaindeksowa&#263; tabel&#281; (dla MySQL 5) sk&#322;adaj&#261;c&#261; si&#281; z ok. 2.5 mln rekord&#243;w (zebranych z ponad 100 przek&#322;ad&#243;w Biblii w 19 wersjach j&#281;zykowych). Pr&#243;b a post&#261;pienia wg wskaz&#243;wek z pliku &lt;span class="caps"&gt;README&lt;/span&gt; do tego pluginu okaza&#322;a si&#281; strza&#322;em w stop&#281;. M&#243;j dwurdzeniowy MacBook Pro 2.2GHz, 2GB &lt;span class="caps"&gt;RAM&lt;/span&gt; jak rozpocz&#261;&#322; tworzenie indeks&#243;w jednego dnia po po&#322;udniu, to nie sko&#324;czy&#322; go na drugi dzie&#324;. Przerwa&#322;em to szale&#324;stwo. Wygenerowa&#322; jakie&#347; 250 MB indeks&#243;w na 1.2GB do stworzenia. Znacznie szybciej by&#322;o napisa&#263; sobie w&#322;asny skrypt Rubiego do indeksacji. Pomieli&#322; jakie&#347; dwie godziny, ale za to nie 2-3 doby! W sumie indeksowanie wi&#281;kszych plik&#243;w do Ferreta blokuje komputer na d&#322;u&#380;szy czas. Ma&#322;o ciekawie.&lt;/p&gt;


	&lt;p&gt;I wtedy spr&#243;bowa&#322;em &lt;a href="http://sphinxsearch.com"&gt;Sphinksa&lt;/a&gt;. R&#243;&#380;nica byla tak kolosalna, &#380;e wpierw my&#347;la&#322;em, &#380;e jest jaki&#347; b&#322;&#261;d w programie. Sphinx t&#261; sam&#261; tabel&#281; poindeksowa&#322; mi w nieca&#322;a minut&#281;. Wszelkie operacje wyszukiwania r&#243;&#380;nych boolowskich kombonacji s&#322;&#243;w trwa niezmiennie 1-2 ms. Jest po prostu natychmiastowe! Algorytm Sphinksa jest niezr&#243;wnanie lepiej przemy&#347;lany. Co z tego, &#380;e teoretycznie Lucene czy Ferret maj&#261; wi&#281;cej mo&#380;liwo&#347;ci, skoro w praktyce 95% z nich posiada te&#380; Sphinx? Jak kto&#347; chce, to do Active Record jest r&#243;wnie&#380; plugin &lt;a href="http://www.datanoise.com/articles/2007/3/23/acts_as_sphinx-plugin"&gt;acts_as_sphinx&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Jestem ciekaw kiedy b&#281;d&#261; gotowe pluginy acts_as_ferret i acts_as_sphinx do &lt;a href="http://datamapper.org/"&gt;DataMapper&amp;#8217;a&lt;/a&gt;, znacznie szybszego i og&#243;lnie lepiej przemy&#347;lanego &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217; ni&#380; Active Record.&lt;/p&gt;


	&lt;p&gt;Tak w og&#243;le, to  Railsom wyrasta gro&#378;na konkurencja w &#347;wiecie Rubiego. To nie &lt;a href="http://www.nitroproject.org/"&gt;Nitro&lt;/a&gt;, ale &lt;a href="http://merbivore.com/"&gt;&lt;strong&gt;Merb&lt;/strong&gt;&lt;/a&gt; mo&#380;e podci&#261;&#263; dominacj&#281; Rails&#243;w. Korzysta z railsowej filozofii, ale du&#380;o &lt;strong&gt;szybszy&lt;/strong&gt;, w pe&#322;ni &lt;strong&gt;wielow&#261;tkowy&lt;/strong&gt;, &lt;strong&gt;komponentowy&lt;/strong&gt; i w wielu punktach lepiej przemy&#347;lany (ma lepswzy resolver &lt;span class="caps"&gt;URL&lt;/span&gt;, domy&#347;lnie korzysta z &lt;a href="http://www.kuwata-lab.com/erubis/"&gt;Erubis&lt;/a&gt;, najszybszego systemu szablon&#243;w jaki jest do Rubiego). Merb przypomina mi troch&#281; filozofi&#281; le&#380;&#261;c&#261; u podstaw pythonowego &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt;. Jest tak samo z definicji nastawiony na elastyczno&#347;&#263; i &#322;atwo&#347;&#263; wymiany swych komponent&#243;w oraz du&#380;y nacisk po&#322;o&#380;ono na wydajno&#347;&#263;. Czyli to, co nagminnie by&#322;o od zawsze lekcewa&#380;one przez developer&#243;w &lt;a href="http://rubyonrails.org"&gt;Rails&#243;w&lt;/a&gt; skupiaj&#261;cych si&#281; za bardzo na wymy&#347;laniu nowej funkcjonalno&#347;ci. Nie bez znaczenia jest to, &#380;e proces migracji aplikacji z Rails do Merba jest raczej prosty, bo ten drugi potrafi pracowa&#263; z Active Record. Wi&#281;c w zasadzie modele mo&#380;na przerzuca&#263; bez wi&#281;kszego problemu. Mo&#380;e Merb nie zdetronizuje Rails, bo ten tak ca&#322;kiem nie stoi w miejscu i lada dzie&#324; ma wyj&#347;&#263; wersja finalna 2.0 (w momencie pisania tekstu &lt;a href="http://weblog.rubyonrails.org/2007/11/29/rails-2-0-release-candidate-2"&gt;jest ju&#380; &lt;span class="caps"&gt;RC2&lt;/span&gt;&lt;/a&gt;). Ale mo&#380;e zmobilizuje developer&#243;w Rails&#243;w aby troch&#281; popracowali nad jako&#347;ci&#261; ju&#380; stworzonego kodu. A jak nie, to nic straconego. Dobra konkurencja dla Rails&#243;w nie zaszkodzi.&lt;/p&gt;</description>
      <pubDate>Fri, 30 Nov 2007 18:18:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:71f72ef5-0079-4762-97a8-05492850f304</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/11/30/sphinx-merb-vs-ferret-rails</link>
      <category>sphinx</category>
      <category>lucene</category>
      <category>ferret</category>
      <category>merb</category>
      <category>datamapper</category>
    </item>
  </channel>
</rss>
