<?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: Dlaczego Ruby on Rails jest wyj&#261;tkowy?</title>
    <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Dlaczego Ruby on Rails jest wyj&#261;tkowy?</title>
      <description>&lt;p&gt;Niekt&#243;rym osobom stykaj&#261;cym si&#281; z po raz pierwszy z &lt;a href="http://rubyonrails.com"&gt;Railsami&lt;/a&gt; wydaje si&#281;, &#380;e jest to tylko jakie&#347; kolejne, tradycyjne &#347;rodowisko developerskie pracuj&#261;ce wg wzorca projektowego &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;&lt;span class="caps"&gt;MVC&lt;/span&gt;&lt;/a&gt; (model-widok-kontroler). Przywi&#261;zani do swoich j&#281;zyk&#243;w i framework&#243;w czasami si&#281; dziwi&#261;, dlaczego temat Rails&#243;w wywo&#322;uje od jakiego&#347; czasu tyle emocji i  komentarzy. 
Na pewno po cz&#281;sci jest tak pewnie dlatego, &#380;e RoR jest bardzo &lt;em&gt;dobrze wypromowany&lt;/em&gt;. Dobra &lt;a href="http://rubyonrails.com"&gt;strona g&#322;&#243;wna&lt;/a&gt;, dobra dokumentacja, ksi&#261;&#380;ki, filmy, bardzo aktywna spo&#322;eczno&#347;&#263; &amp;#8211; nic tylko na&#347;ladowa&#263;. Z drugiej strony, trzeba te&#380; przyzna&#263;, &#380;e jest to &#347;rodowisko &#347;wietnie zaprojektowane &amp;#8211; w Railsach sie pracuje po prostu &lt;em&gt;komfortowo&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;Nie dziwi&#261; wi&#281;c ci&#261;g&#322;e pr&#243;by na&#347;ladowania Rails&#243;w w innych j&#281;zykach (PHP, Python, Java, C# itp) Jednak&#380;e mi&#281;dzy nimi a Railsami b&#281;dzie ci&#261;gle pewna, trudna do osi&#261;gni&#281;cia, je&#347;li nie w og&#243;le niemo&#380;liwa &amp;#8211; bariera. Railsy posiadaj&#261; nie tylko wszystko, co potrzeba do bardzo produktywnego tworzenia aplikacji internetowych, ale s&#261; przy tym r&#243;wnocze&#347;nie bardzo &lt;strong&gt;eleganckie i czytelne&lt;/strong&gt;. Eleganckie i czytelne czyli &#322;atwe do nauki. Tak, nauka Rubiego nie jest przeszkod&#261;. Przekona si&#281; o tym ka&#380;dy, kto troch&#281; bli&#380;ej przyjrzy si&#281; jak dzia&#322;a RoR.&lt;/p&gt;


	&lt;p&gt;Mia&#322;em okazj&#281; por&#243;wnywa&#263; ze sob&#261; kilka r&#243;&#380;nych framework&#243;w. Gdy chcia&#322;em przekona&#263; si&#281; do kt&#243;rego&#347; z nich, zawsze ostatecznie wraca&#322;em z powrotem do RoR. Po prostu &#380;aden z nich nie jest jak elegancki i prosty w u&#380;yciu&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;. Co jest  g&#322;&#243;wn&#261; przyczyn&#261; takiego wra&#380;enia?   Tw&#243;rca Rails&#243;w, David Heinemeier Hansson powiedzia&#322; kiedy&#347;, &#380;e gdyby nie &lt;a href="http://ruby-lang.org"&gt;Ruby&lt;/a&gt; to nie powsta&#322;by &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;. Powiedzia&#322; tak&#380;e, &#380;e uwa&#380;a i&#380; w &#380;adnym innym j&#281;zyku nie da si&#281; napisa&#263; tak eleganckiego i pi&#281;knego kodu. Zatem mo&#380;na powiedzie&#263;, &#380;e prawdziw&#261; &lt;strong&gt;si&#322;&#261; Rails&#243;w jest Ruby&lt;/strong&gt;. Razem tworz&#261; nieroz&#322;&#261;czn&#261; par&#281; i ta &#322;&#261;czno&#347;&#263; nie dotyczy bynajmniej tylko nazwy. ;) Ruby posiada bowiem pewne unikalne cechy, kt&#243;re pozwoli&#322;y stworzy&#263; RoR w postaci, kt&#243;ra jest raczej ma&#322;o nieosi&#261;galna dla innych j&#281;zyk&#243;w. Ju&#380; to wyja&#347;niam.&lt;/p&gt;


	&lt;p&gt;Panuje powszechnie mniemanie, &#380;e Ruby to po&#322;&#261;czenie cech &lt;a href="http://python.org"&gt;Pythona&lt;/a&gt; i &lt;a href="http://www.perl.org/"&gt;Perla&lt;/a&gt;. Ruby (podobnie jak Perl) posiada np. wbudowan&#261; w sk&#322;adni&#281; obs&#322;uge wyra&#380;e&#324; regularnych. Posiada tak&#380;e (podobnie jak Python) pe&#322;n&#261; obiektowo&#347;&#263; i bardzo eleganck&#261;, czyteln&#261; (cho&#263; nie tak&#261; sam&#261;) sk&#322;adni&#281;. Pewnym odkryciem by&#322;o dla mnie to, &#380;e j&#281;zykie, do kt&#243;rego Ruby ma najwi&#281;cej podobie&#324;stw to innego j&#281;zyka &amp;#8211;  &lt;strong&gt;&lt;a href="http://pl.wikipedia.org/wiki/Smalltalk"&gt;Smalltalk&lt;/a&gt;&lt;/strong&gt;. Lektura cech, filozofii (i nawet do pewnego stopnia sk&#322;adni) Smalltalka pokazuje zdumiewaj&#261;ce podobie&#324;stwo do Rubiego. Mo&#380;na wr&#281;cz odnie&#347;&#263; wra&#380;enie, &#380;e Ruby to swego rodzaju przer&#243;bka Smalltalka&lt;sup&gt;&lt;a href="#fn2"&gt;2&lt;/a&gt;&lt;/sup&gt;. Podobie&#324;stw jest bardzo wiele. Od s&#322;&#243;w kluczowych po symbole, spos&#243;b tworzenia instancji klas, bloki kodu (ang. &lt;em&gt;closures&lt;/em&gt;), kontynuacje&lt;sup&gt;&lt;a href="#fn3"&gt;3&lt;/a&gt;&lt;/sup&gt; itp. Jak kto&#347; jeszcze nie rozumie filozofii Rubiego, jego modelu obiektowego i powodu istnienia otwartych klas, powinien poczyta&#263; sobie troch&#281; o Smalltalku.&lt;/p&gt;


	&lt;p&gt;Ruby jak i Smalltalk posiadaj&#261; bardzo podobny model obiektowy. Wszystkie obiekty (na drodze dziedziczenia) wywodz&#261; si&#281; z jednej, ostateczniej klasy Object. Oba j&#281;zyki maj&#261; zaimplementowan&#261; pe&#322;n&#261; obiektowo&#347;&#263;. Nie ma (tak ja w Javie) podzia&#322;u na prymitywy i typy referencyjne. Wszystko jest obiektem i wszystko posiada metody. Dotyczy to nie tylko liczb i napis&#243;w ale tak&#380;e obiektu nil, true czy false. Ka&#380;dy obiekt mo&#380;na przeci&#261;&#380;y&#263; i/lub zmodyfikowa&#263; wewnetrznie (dynamicznie dodaj&#261;c lub usuwaj&#261;c jego metody w trakcie pracy programu)&lt;/p&gt;


	&lt;p&gt;Z tego wynika, &#380;e w&#322;a&#347;ciwie to mo&#380;na modyfikowa&#263; sam j&#281;zyk. Daje to mo&#380;liwo&#347;ci zupe&#322;nie nieosi&#261;galne nawet dla tak dobrego i obiektowego j&#281;zyka jakim jest &lt;a href="http://python.org"&gt;Python&lt;/a&gt;. Ruby pozwala na &#322;atwe dodawanie nowych metod do liczb czy napis&#243;w. Pozwala na tak&#261; modyfikacj&#281; samego siebie, aby optymalnie nadawa&#322; si&#281; do realizacji pewnych, specyficznych zada&#324;. Ruby umo&#380;liwia zatem tworzenie tego, co si&#281; okre&#347;la mianem &lt;a href="http://en.wikipedia.org/wiki/Domain_Specific_Language"&gt;j&#281;zyk&#243;w domenowych&lt;/a&gt; (Domain-specific Programming Languages). S&#261; to j&#281;zyki, kt&#243;re w przeciwie&#324;stwie do j&#281;zyk&#243;w og&#243;lnego zastostosowania, zosta&#322;y zaprojektowane do wykonywania specyficznego zadania/zada&#324;. Zar&#243;wno Smalltalk jak i Ruby pozwalaj&#261; na tworzenie j&#281;zyk&#243;w domenowych.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt; to nic innego jak framework napisany za pomoc&#261; Rubiego zmodyfikowanego w celu uzyskania wysoce produktywnego  &#347;rodowiska do tworzenia nowoczesnych aplikacji internetowych.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Przyk&#322;adowe helpery dost&#281;pne w Rails, kt&#243;re korzystaj&#261; z nowych metod nie b&#281;d&#261;cych standardow&#261; cz&#281;&#347;ci&#261; Rubiego. Poni&#380;sze przyk&#322;ady pochodz&#261; z 1-g wydania ksi&#261;&#380;ki &lt;a href="http://www.pragmaticprogrammer.com/titles/rails/"&gt;Agile Web Development in Rails&lt;/a&gt;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;bytes&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; 20&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;kilobytes&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; 20480&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;megabytes&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; 20971520&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gigabytes&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; 21474836480&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;terabytes&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; 21990232555520&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;minutes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ago&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue May 10 16:43:43 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;hours&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;from_now&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Wed May 11 13:03:43 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;weeks&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;from_now&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue Sep 27 17:03:43 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;months&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ago&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Thu Sep 18 17:03:43 CDT 2003&lt;/span&gt;
&lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue May 10 17:15:59 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ago&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3600&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue May 10 16:15:59 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;at_beginning_of_day&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue May 10 00:00:00 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;at_beginning_of_month&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Sun May 01 00:00:00 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;at_beginning_of_week&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Mon May 09 00:00:00 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;at_beginning_of_year&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Sat Jan 01 00:00:00 CST 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;at_midnight&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue May 10 00:00:00 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;change&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:hour&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;13&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue May 10 13:00:00 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;last_month&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Sun Apr 10 17:15:59 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;last_year&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Mon May 10 17:15:59 CDT 2004&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;midnight&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue May 10 00:00:00 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;monday&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Mon May 09 00:00:00 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;months_ago&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Thu Mar 10 17:15:59 CST 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;months_since&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Sun Jul 10 17:15:59 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;next_week&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Mon May 16 00:00:00 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;next_year&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Wed May 10 17:15:59 CDT 2006&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;seconds_since_midnight&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; 62159.215938&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;since&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;7200&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Tue May 10 19:15:59 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;tomorrow&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Wed May 11 17:15:59 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;years_ago&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Sat May 10 17:15:59 CDT 2003&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;years_since&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Thu May 10 17:15:59 CDT 2007&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;yesterday&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; Mon May 09 17:15:59 CDT 2005&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;cat&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;.&lt;/span&gt;&lt;span class="ident"&gt;pluralize&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; cats&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;cats&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;.&lt;/span&gt;&lt;span class="ident"&gt;pluralize&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; cats&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;erratum&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;.&lt;/span&gt;&lt;span class="ident"&gt;pluralize&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; errata&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;cats&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;.&lt;/span&gt;&lt;span class="ident"&gt;singularize&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; cat&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;errata&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;.&lt;/span&gt;&lt;span class="ident"&gt;singularize&lt;/span&gt; &lt;span class="comment"&gt;#=&amp;gt; erratum&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Z racji tego, &#380;e Railsy zmodyfikowa&#322;y Rubiego do realizacji swoich zada&#324;, uwa&#380;am, &#380;e pr&#243;ba sklonowania tego &#347;rodowiska w jakim&#347; innym j&#281;zyku (poza Smalltalkiem), jest z g&#243;ry skazana na niepowodzenie. Po prostu nigdy to nie b&#281;dzie tak pi&#281;kny kod jak Ruby dla Rails&#243;w. Na otarcie &#322;ez dla pythonistas, mog&#281; powiedzie&#263;, &#380;e przy wszystkich zaletach Rubiego, nadal uwa&#380;am &#380;e Python (jako j&#281;zyk) jest nie tylko &#322;atwiejszy do opanowania ale tak&#380;e bardziej produktywny. Ale je&#347;li chodzi o frameworki, to Rails jest nie do pobicia je&#347;li chodzi o komfort, mo&#380;liwo&#347;ci i &lt;span class="caps"&gt;DRY&lt;/span&gt;[4].&lt;/p&gt;


	&lt;p&gt;&lt;del&gt;&amp;#8212;&lt;/del&gt;&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Zupe&#322;nie identyczne wra&#380;enia prostoty jak z Railsami mia&#322;em w przypadku szukania dobrego systemu &lt;a href="http://pl.wikipedia.org/wiki/Content_Management_System"&gt;&lt;span class="caps"&gt;CMS&lt;/span&gt;&amp;#8217;a&lt;/a&gt;.  Taki np. pythonowy &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt; w por&#243;wnaniu do &lt;a href="http://ez.no"&gt;ezPublish&lt;/a&gt; i ca&#322;ej masy innych, pehapowych rozwi&#261;za&#324; jest nie tylko pote&#380;niejszy ale tak&#380;e niezr&#243;wnanie prostszy i wygodny (po 5 minutach od instalacji, praktycznie bez czytania dokumentacji i bez znajomo&#347;ci Pythona, mo&#380;na stworzy&#263; prosty serwis o ca&#322;kiem przyzwoitej, podstawowej funkcjonalno&#347;ci)&lt;/p&gt;


	&lt;p id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; Smalltalk posiada tylko 5 s&#322;&#243;w kluczowych i proste zasady: wszystko jest obiektem, wszystkie operacje polegaj&#261; na przesy&#322;aniu metod (nazywanych tu: wiadomo&#347;ciami) mi&#281;dzy obiektami. Moim zdaniem Smalltalk troch&#281; przesadzi&#322; z t&#261; zasad&#261;, bo nawet bo zamiast do sterowania  kontrol&#261; kodu u&#380;ywane s&#261; tak&#380;e wiadomo&#347;ci. Mo&#380;e jest jest sp&#243;jne, ale troch&#281; dziwnie wygl&#261;da. Osobi&#347;cie bardziej podobaj&#261; mi si&#281; mo&#380;liwo&#347;ci Smalltalka ale wyra&#380;one w sk&#322;adni &amp;#8230;Rubiego. :) Zobacz te&#380; &lt;a href="http://c2.com/cgi/wiki?RubyInsteadOfSmalltalk"&gt;Ruby Instead of Smalltalk&lt;/a&gt;&lt;/p&gt;


	&lt;p id="fn3"&gt;&lt;sup&gt;3&lt;/sup&gt; Kontynuacje s&#261; jedn&#261; z wbudowanych cech Rubiego o kt&#243;rej mo&#380;e by&#263; za jaki&#347; czas g&#322;o&#347;no. Umo&#380;liwiaj&#261; bowiem budowanie tzw. internetowych &lt;em&gt;serwer&#243;w kontynuacyjnych&lt;/em&gt;,  kt&#243;re w pe&#322;ni zachowuj&#261; stan pomi&#281;dzy requestami i ogromnie upraszczaj&#261; prace programist&#243;w. W tej chwili najlepiej opracowanym frameworkiem tego typu jest smalltalkowy &lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt;.&lt;/p&gt;


	&lt;p id="fn4"&gt;&lt;sup&gt;4&lt;/sup&gt; DRY to skr&#243;t od ang. &lt;em&gt;Dont&amp;#8217;t Repeat Yourself&lt;/em&gt;. Railsy zosta&#322;y napisane z wr&#281;cz obsesyjn&#261; ;) cech&#261; unikania powtarzania kodu. Mniej powt&#243;rze&#324; to nie tylko mniej niepotrzebnej, dodatkowej pracy ale tak&#380;e mniejsze ryzyko pope&#322;niania b&#322;&#281;du.&lt;/p&gt;</description>
      <pubDate>Sun, 14 May 2006 06:22:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:beeaaf91-c2da-4a15-94f2-b8ddab63d9d5</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>SmallTalk</category>
      <category>ruby</category>
      <category>rails</category>
      <category>smalltalk</category>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by rsz</title>
      <description>&lt;p&gt;Na jakiej podstawie twierdzisz, &#380;e Django jest &amp;#8220;znacznie szybszy&amp;#8221; od PHP?&lt;/p&gt;</description>
      <pubDate>Fri, 22 Sep 2006 08:53:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:10061bf9-8e87-4fd3-b0d2-63ba2da27fab</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-232</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;CakePHP wygl&#261;da na bardziej niedopracowany w por&#243;wnaniu z Symphony. Ale by&#263; mo&#380;e to i tak nie ma znaczenia i by&#322;oby podobnie z wynikami wydajno&#347;ci.&lt;/p&gt;


	&lt;p&gt;Co do Onetu, to by&#263; mo&#380;e baliby si&#281; RoR, ale ju&#380; Django na pewno by zadowoli&#322;o ich wymagania wydajno&#347;ciowe, bo jest nie tylko znacznie lepszy od rozwi&#261;za&#324; PHP ale tak&#380;e znacznie od nich szybszy i zdolny do obs&#322;ugi bardzo z&#322;o&#380;onych witryn (co wida&#263; na przyk&#322;adach portali jakie u&#380;ywaj&#261; Django).&lt;/p&gt;


	&lt;p&gt;RoR dopiero wchodzi w faz&#281; optymalizacji wydajno&#347;ciowej. Django od pocz&#261;tku to bra&#322; pod uwag&#281;.&lt;/p&gt;


	&lt;p&gt;Du&#380;o jednak mo&#380;e zmieni&#263; uko&#324;czenie YARP&amp;#8217;a czyli wirtualnej maszyny Rubiego (tak jak dla Javy) z natywn&#261; obs&#322;ug&#261; w&#261;tk&#243;w. Z tego, co czyta&#322;em, to ju&#380; teraz daje przy&#347;pieszenie kodu Rubiego nawet 10x.&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 06:33:42 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:3236d834-4582-474b-a1ca-e253f455aec2</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-178</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Toszcze</title>
      <description>&lt;p&gt;Przyznam szczerze, &#380;e nie znam zbyt dobrze Symphony (czytaj: nigdy nic nie zrobi&#322;em przy u&#380;yciu tego frameworka), ale bardziej mi tutaj by pasowa&#322; CakePHP. ;) Ale mog&#281; si&#281; myli&#263;.&lt;/p&gt;


	&lt;p&gt;Z drug&#261; cz&#281;&#347;ci&#261; wypowiedzi zgadzam si&#281; w prawie 100%. :) Prawie, bo nie jeste&#347; w stanie nam&#243;wi&#263; np. Onetu (to tylko przyk&#322;ad &amp;#8211; chodzi o skal&#281;) do korzystania z RoR czy jakiegokolwiek innego tego typu frameworka &amp;#8211; oni stawiaj&#261; g&#322;&#243;wnie na wydajno&#347;&#263; i taka przesiadka spowodowa&#322;aby konieczno&#347;&#263; dostawienia nie jednej czy dw&#243;ch, ale (jak mniemam) kilkunastu nowych maszyn. ;)&lt;/p&gt;</description>
      <pubDate>Mon, 07 Aug 2006 03:27:01 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a73046f7-4d56-4f09-b6f9-70fa5cb4937c</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-175</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Dlatego Symphony, bo to dosy&#263; zaawansowany framework na&#347;laduj&#261;cy Rails. Chodzi o por&#243;wnanie mniej wi&#281;cej podobnych aplikacji.&lt;/p&gt;


	&lt;p&gt;Co do szybko&#347;ci, to jeszcze par&#281; lat temu nikt nie bra&#322;by na powa&#380;nie j&#281;zyk&#243;w interpretowanych jako alternatywy dla kompilowanych. Popularno&#347;&#263; interpreter&#243;w ro&#347;nie bo zosta&#322;&#261; przekroczona masa krytyczna wydajno&#347;ci sprz&#281;tu. To, &#380;e Rails jest wolniejszy nie ma a&#380; takiego znaczenia  (1) dla firm, kt&#243;re moga &#322;atwo dostawi&#263; kolejny serwer, oraz (2) dla tych, gdzie liczy si&#281; bardziej produktywno&#347;&#263; ni&#380; czasowo wi&#281;ksza wydajno&#347;&#263; aplikacji. T&#261; mo&#380;na przy&#347;pieszy&#263; za pomoc&#261; hardware&amp;#8217;u. Produktywno&#347;ci za&#347; nie da si&#281; tak &#322;atwo przy&#347;piesza&#263;.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Aug 2006 18:17:36 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:13f57e0e-0f08-47bb-b0eb-0ff59095cbd6</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-172</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Toszcze</title>
      <description>&lt;p&gt;Ciekawy tekst, ale nie porusza on kwestii wydajno&#347;ci RoR, a jedynie przedstawia mo&#380;liwo&#347;ci skalowania aplikacji napisanych z jego u&#380;yciem. Nie m&#243;wi&#281;, &#380;e to nie ma znaczenia &amp;#8211; ma, i to spore. Natomiast ja mia&#322;em na my&#347;li co innego. ;)&lt;/p&gt;


	&lt;p&gt;&#346;rednio trafione (moim zdaniem) jest r&#243;wnie&#380; por&#243;wnanie RoR i Symphony. Dlaczego akurat Symphony? ;)&lt;/p&gt;


	&lt;p&gt;Na koniec (&#380;eby nie by&#322;o niejasno&#347;ci) &amp;#8211; nie jestem jakim&#347; przeciwnikiem RoR. Wr&#281;cz przeciwnie &amp;#8211; uwa&#380;am, &#380;e to &#347;wietny framework. Przez sw&#243;j pierwszy komentarz chcia&#322;em jedynie zaznaczy&#263;, &#380;e wydajno&#347;&#263; jest spraw&#261; istotn&#261;, a RoR (podobnie zreszt&#261; jak wi&#281;kszo&#347;&#263; framework&#243;w opartych o model MVC) nie jest demonem pr&#281;dko&#347;ci. ;) Zreszt&#261; prawda jest taka, &#380;e ka&#380;dy &amp;#8220;pude&#322;kowy&amp;#8221; (czy raczej &amp;#8220;uniwersalny&amp;#8221;) framework spowalnia aplikacj&#281; (w por&#243;wnaniu z aplikacj&#261; napisan&#261; w &amp;#8220;czystym j&#281;zyku&amp;#8221;). Ale to ju&#380; temat na d&#322;u&#380;sz&#261; dyskusj&#281;. ;)&lt;/p&gt;</description>
      <pubDate>Sun, 06 Aug 2006 15:21:45 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:d6b4bbf6-d3d9-42d0-8def-c595f1da9069</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-169</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Z t&#261; nisk&#261; wydajno&#347;ci&#261; Rails&#243;w to ja bym nie przesadza&#322;. Zobacz m&#243;j artyku&#322;: &amp;#8220;&lt;a href="http://blog.zabiello.com/articles/2006/08/06/skalowanie-ror" rel="nofollow"&gt;Skalowanie RoR&lt;/a&gt;&amp;#8221; kt&#243;ry przed chwil&#261; napisa&#322;em (zainspirowa&#322;a mnie do tego Twoja wypowied&#378; :)&lt;/p&gt;</description>
      <pubDate>Sun, 06 Aug 2006 15:01:52 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:8aa9751f-e1cd-4064-9263-f22eadc18bee</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-168</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Toszcze</title>
      <description>&lt;p&gt;A ja nie znalaz&#322;em w tym tek&#347;cie jednej istotnej (moim zdaniem) kwestii &amp;#8211; kwestii wydajno&#347;ci RoR. A mo&#380;e to przys&#322;owiowa &amp;#8220;pi&#281;ta achillesowa&amp;#8221;, o kt&#243;rej nikt nie chce m&#243;wi&#263;/pisa&#263;? ;)&lt;/p&gt;</description>
      <pubDate>Sat, 05 Aug 2006 17:15:28 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:13fff8a9-2bd6-4beb-92bc-660122b96377</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-167</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Tomek, nie zgodz&#281; si&#281;. Pythonowy &lt;a href="http://zope.org" rel="nofollow"&gt;Zope&lt;/a&gt; to ju&#380; jest zdecydowanie klasa enterprise. U&#380;ywaj&#261; tego rz&#261;dy, du&#380;e firmy, organizacje pozarz&#261;dowe. Poza tym, &lt;a href="http://zope.com" rel="nofollow"&gt;Zope Corporation&lt;/a&gt; oferuje tak&#380;e p&#322;atne rozwi&#261;zania oparte na Zope dla firm i przedsi&#281;biorstw. Zobacz ich &lt;a href="http://www.zope.com/products/zope_enterprise_cms.html" rel="nofollow"&gt;Zope Enterprise CMS&lt;/a&gt; czy &lt;a href="http://www.zope.com/products/zope4intranets.html" rel="nofollow"&gt;Zope4Intranets&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Tue, 23 May 2006 19:00:43 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a17f969a-96ff-4fa8-b389-70205da2221f</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-109</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Adamh</title>
      <description>&lt;p&gt;Tomku&amp;#8230; Ruby i Rails czy Python (choc tu nie do konca sie zgodze) i Django to jeszcze nie rozwiazania klasy &amp;#8220;enterprise&amp;#8221; ale tak jak PHP trafilo do tej klasy tak duzo szybciej i one trafia. Jak wiadomo na poczatku ery tej &lt;em&gt;nobilitacji&lt;/em&gt; jest duze zapotrzebowanie na &lt;em&gt;nowe technologie i rozwiazania&lt;/em&gt; poniewaz wiekszosc firm chcialaby byc uznawana za rewolucyjne lub chociaz podazajace za najnowszymi trendami. 
Pomijajac przyczyny takich zmian&amp;#8230; uwazam je za dobre (nie wierze w zasade: lepsze wrogiem dobrego).&lt;/p&gt;


	&lt;p&gt;Co do Lispa&amp;#8230; nie twierdze, ze to zly jezyk &amp;#8211; nawet go nie znam &amp;#8211; nie spotkalem sie jednak z dobrym fameworkiem do tworzenia aplikacji WWW a tym sie zajmuje (chodzi o konkretne zastosowania).&lt;/p&gt;</description>
      <pubDate>Tue, 23 May 2006 18:44:21 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a70d522e-8faf-4048-b9cc-3074705bb23c</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-108</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Adamh</title>
      <description>&lt;p&gt;Frameworki tworzone sa od samego poczatku (zbiory funkcji, zbiory klas itp &amp;#8211; klarujace sie w polaczone wieksze twory).&lt;/p&gt;


	&lt;p&gt;PHP nie ma zadyszki a duze problemy poniewaz pojawiaja sie rozwiazania, ktore wrecz deklasuja uzywanie PHP (bez rozsadnego frameworka), CMSy byly od bardzo dawna &amp;#8211; zarzadzanie trescia jest zazwyczaj konsekwencja powstania tresci.
Potrzeba bylo tylko naglosnienia tego tematu i wielu projektow darmowych i komercyjnych by management poczul, ze temat musi byc traktowany powaznie.&lt;/p&gt;


	&lt;p&gt;Co do wynajdywania kola to chyba nie do konca tak&amp;#8230; powiedzialbym raczej, ze zmienia sie forma i wszystko idzie w strone postepu.
Kazdy web-framework sluzy do tego samego&amp;#8230; wazne jak pozwala cel zrealizowac.&lt;/p&gt;


	&lt;p&gt;Aby przekonac sie o trafnosci kazdego wyboru potrzebny jest czas&amp;#8230; wczesniej mozna stawiac na przeczucie to dokladnie tak jak z graniem na gieldzie (poniekad to jest piekne w zyciu, prawda?:)).&lt;/p&gt;</description>
      <pubDate>Tue, 23 May 2006 18:27:29 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:e125307a-f822-403a-9d89-a61910e65ad3</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-107</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Piotr (pirat) M&#261;sior</title>
      <description>&lt;p&gt;Czy nie wydaje wam si&#281; &#380;e rozpocz&#281;&#322;a si&#281; pewna nowa epoka? Wszyscy pisz&#261; nagle frameworki, Cms-y. Powracaj&#261; do starych j&#281;zyk&#243;w i odkrywaj&#261; kolejn&#261; ameryk&#281;. Php ma zadyszk&#281;, Ror &#347;wietny start. Java rozros&#322;a si&#281; do tego poziomu, &#380;e zaczyna wypluwa&#263; jak karabiny maszynowy z siebie coraz to nowsze &amp;#8220;wynalazki ko&#322;a&amp;#8221;. A to wszystko pod szyldem &amp;#8220;Dont Repeat YOURSELF!!!&amp;#8221; &amp;#8211; brakuje ju&#380; tylko do tego Magbeta. Kiedy&#347; sprawa by&#322;a prosta&amp;#8230; teraz trudno jest zaplanowa&#263; sobie czego i w jakim stopniu nale&#380;y si&#281; uczy&#263;, aby nie zosta&#263; w tyle&amp;#8230; jedno rozwi&#261;zanie lepsze od drugiego&amp;#8230; szkoda tylko, &#380;e aby si&#281; o tym przekona&#263; &amp;#8211; potrzebny jest czas&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Tue, 23 May 2006 14:11:11 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:5a364e89-efc0-4828-bf93-9f8ed8ef02f5</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-106</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Tomek</title>
      <description>&lt;p&gt;Adamh &amp;#8211; programuje w Lispie kiedy tylko moge&amp;#8230; Ale pisze programy dla duzych klientow, gdzie technologia musi byc &amp;#8220;enterprise&amp;#8221; (nie wnikam co to dokladnie oznacza) i Ruby, Lisp czy Python nie maja szans na akceptacje.&lt;/p&gt;


	&lt;p&gt;Co do formy, to masz oczywiscie racje, bo wszystko sprawadza sie do kodu maszynowego. Ale roznica pomiedzy Lispem a innymi jezykami jest taka ze Lisp ma forme odpowiednia do wszystkiego &amp;#8211; po prostu bardzo latwo mozesz ja stworzyc &amp;#8211; jesz ciastko (dostajesz odpowiednia forme) i nadal masz ciastko (elastycznosc Lispa).&lt;/p&gt;


	&lt;p&gt;Ja nie mowie ze Ruby jest be, pewnie (nie programuje w Ruby chociaz planuje sie nauczyc &amp;#8211; przynajmniej dla praktyki i poszerzenia horyzontow) jest super :) Ale zauwazam tylko ze ludzie przesiadaja sie na jezyki coraz blizsze do Lispa i Ruby wydaje mi sie kolejnym przystankiem.&lt;/p&gt;</description>
      <pubDate>Sun, 21 May 2006 15:40:33 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a07b5b39-cc6f-4d34-841c-9ec02364ca82</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-105</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Adamh</title>
      <description>&lt;p&gt;PHPowy Mambo jak mniemam:)&lt;/p&gt;


	&lt;p&gt;Znam te projekty CMSow w Railsach i poki co nie ma o czym mowic (szansa w Eribium ale potrzeba duzo wiecej rozmachu). Railfrog obserwuje od czasu zalozenia projektu i poki co widze rozmowy i nie sadze by kiedykolwiek powstal z tego projektu gotowy system.
Django w porownaniu z Railsami ma dwa wielkie plusy &amp;#8211; wydajnosc i tworzenie &amp;#8220;admin area&amp;#8221; (swoja droga dzialajaca genialnie funkcjonalnosc).
Dlatego do wydajnego Enterprise CMSa Django wychodzi na prowadzenie.
Wiem, ze istnieje Ellington i na tym wiedza o tym systemie sie konczy (do tego zniechecily mnie ceny: miedzy $10k a $15k).&lt;/p&gt;


	&lt;p&gt;Sam preferuje eZpublisha niz Plone&amp;#8217;a &amp;#8211; w sumie sama idea jest bardzo podobna: umieszczanie w odpowiednich miejscach odpowiednich obiektow. eZ jesli chodzi o interfejs jest moim zdaniem duzo bardziej przejrzysty &amp;#8211; fakt, ze w Plone&amp;#8217;a nie wgryzalem sie tak bardzo jak w eZ.&lt;/p&gt;


	&lt;p&gt;Jesli chodzi o Zope to moim zdaniem nigdy nie zyska takiej popularnosci jaka &lt;strong&gt;zyska&lt;/strong&gt; Rails czy Django &amp;#8211; glownie dlatego, ze do nauczenia sie tego frameworka potrzeba ogromna ilosc czasu i stopien jego skomplikowania jest o wiele wiekszy (zgadzam sie oczywiscie, ze tworzony byl dla zupelnie innej &amp;#8220;publiki&amp;#8221;)&lt;/p&gt;


	&lt;p&gt;Zawsze pozostaje stworzenie tego czego brakuje&amp;#8230; mysle, ze rozsadnie zaprojektowany Rails/Django CMS moglby byc w pewien sposob przelomowy.&lt;/p&gt;</description>
      <pubDate>Sat, 20 May 2006 20:41:48 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:f3a73f95-7b74-4c04-a531-d20afadea5d1</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-104</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Jaroslaw Zabiello</title>
      <description>&lt;p&gt;Tw&#243;rcy Django stworzyli sw&#243;j CMS. Nazywa si&#281; &lt;a href="http://www.ellingtoncms.com" rel="nofollow"&gt;Ellington&lt;/a&gt;. Niestety, ta aplikacja jest p&#322;atna. I co gorsze, nie ma &#380;adnej wersji demo ani nawet filmu aby zobaczy&#263; jak to dzia&#322;a i wygl&#261;da. :(&lt;/p&gt;


	&lt;p&gt;W RoR ju&#380; napisano kilka CMS: &lt;a href="http://www.eribium.org/" rel="nofollow"&gt;Eribium&lt;/a&gt;, &lt;a href="http://railfrog.com/" rel="nofollow"&gt;RailFrog&lt;/a&gt;, &lt;a href="http://rcms.oopen.de/" rel="nofollow"&gt;RCMS&lt;/a&gt; czy &lt;a href="http://trivialcms.rubyforge.org/wiki/wiki.pl?HomePage" rel="nofollow"&gt;TrivialCMS&lt;/a&gt;. Niestety s&#261; cienkie gdy si&#281; por&#243;wna z przyk&#322;adowo pehapowymi: &lt;a href="http://ez.no" rel="nofollow"&gt;ezPublish&lt;/a&gt; czy &lt;a href="http://www.drupal.org/" rel="nofollow"&gt;Drupalem&lt;/a&gt;. Tw&#243;rca RailFroga to wr&#281;cz si&#281; reklamuje &#380;e nie jest programist&#261;&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Mo&#380;e powstanie co&#347; mocniejszego, jednak w&#261;tpi&#281; aby komukolwiek uda&#322;o zbli&#380;y&#263; si&#281; do &lt;a href="http://plone.org" rel="nofollow"&gt;Plone&lt;/a&gt;. Sama idea, na kt&#243;rej oparty jest Plone jest doskona&#322;a: system jest w pe&#322;ni obiektowy i zbudowany z obiektowych klock&#243;w. Za pomoc&#261; archetyp&#243;w mo&#380;na b&#322;yskawicznie doda&#263; kolejny obiekt/komponent i w&#322;&#261;czy&#263; go do systemu. 
Oczywi&#347;cie, Plone to tak naprawd&#281; &amp;#8220;produkt&amp;#8221; (czy modu&#322;) do &lt;a href="http://zope.org" rel="nofollow"&gt;Zope&lt;/a&gt;. Aktualna wersja jest oparta na starym, Zope2. Ale jak wyjdzie Plone oparty Zope3 to mo&#380;e by&#263; to rzeczywisty pythonowy &amp;#8220;killer application&amp;#8221;. Zope3 jest szybszy i znacznie lepiej zaprojektowany ni&#380; Zope2. 
Jest oczywi&#347;cie trudniejszy ni&#380; RoR czy Django, ale je&#347;li chodzi o CMS, to mo&#380;e by&#263; nie do pobicia. Nie s&#261;dz&#281; te&#380; aby w &lt;a href="http://rubyonrails.com" rel="nofollow"&gt;RoR&lt;/a&gt; szybko uda&#322;o si&#281; stworzy&#263; serwer aplikacyjny kt&#243;ry m&#243;g&#322;by nawi&#261;za&#263; walk&#281; z Zope3. To inna klasa aplikacji.&lt;/p&gt;


	&lt;p&gt;(BTW, aktualna wersja Plone po&#380;era tyle samo pami&#281;ci co pythonowy &lt;a href="http://www.mamboserver.com/" rel="nofollow"&gt;Mambo&lt;/a&gt;, jest wi&#281;c du&#380;o lepiej ni&#380; kiedy&#347;)&lt;/p&gt;</description>
      <pubDate>Sat, 20 May 2006 05:03:31 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:0a4ece4a-208c-412e-bc24-eb8adf8aa923</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-103</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Adamh</title>
      <description>&lt;p&gt;Jesli chodzi o Plone to troche o nim czytalem ale studiowac Zope tylko dla tego systemu &amp;#8211; nie wierze w to, ze kiedykolwiek mialbym mozliwosc uzycia tej wiedzy w innym kontekscie.
Poki co czekam na Rails/Django-based CMS.&lt;/p&gt;</description>
      <pubDate>Fri, 19 May 2006 16:15:05 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:fc1b4342-83fd-49f2-b430-5dd1349e716b</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-102</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Adamh</title>
      <description>&lt;p&gt;Tomku.. dlaczego zatem nie programujesz w Lispie (chyba, ze programujesz:))?
Wszystko co potrafi Ruby mozna osiagnac za pomoca prawie kazdego obiektowego jezyka zaryzykuje nawet, ze da sie tego dokonac za pomoca prawie kazdego jezyka programowania &amp;#8211; wszystko rozbija sie o forme. Dlaczego ludzie przesiadaja sie z jednych jezykow na inne? Oczywiscie powodow jest wiele ale zazwyczaj chodzi o to, ze forma danego bardziej pasuje do tego co akurat chca w nim zrobic.&lt;/p&gt;</description>
      <pubDate>Fri, 19 May 2006 16:12:01 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:0bc1149a-43b4-4d89-a244-5662718e4387</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-101</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by lopex</title>
      <description>&lt;p&gt;lisp od grubo ponad 40u ;)&lt;/p&gt;</description>
      <pubDate>Wed, 17 May 2006 09:49:21 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a2faf09e-2a6c-4670-9ba8-6a9b6d16bb4f</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-99</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by elo</title>
      <description>&lt;p&gt;Lisp sux i hoi&lt;/p&gt;</description>
      <pubDate>Wed, 17 May 2006 08:43:35 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:7793c371-f64b-4177-ae17-2fd6c1fd4d78</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-98</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Tomek</title>
      <description>&lt;p&gt;Zgodnie z tym co pisal Paul Graham wiele lat temu, jezyki programowania staja sie coraz bardziej podobne do Lispa i Ruby jest po prostu kolejnym stadium ewolucji :)&lt;/p&gt;


	&lt;p&gt;Wiec podniecanie sie tym co Lisp potrafi od jakichs 20 lat dla mnie wyglada dosc smiesznie :&amp;gt;&lt;/p&gt;</description>
      <pubDate>Tue, 16 May 2006 16:22:56 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:993392d5-9a90-4b3b-b139-de0ba385f4a6</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-97</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by hirman</title>
      <description>&lt;p&gt;Istotnie Plone posiada imponuj&#261;c&#261; funkcjonalno&#347;&#263; prosto z pude&#322;ka.&lt;/p&gt;


	&lt;p&gt;Do jego  wad mo&#380;na zaliczy&#263; zasobo&#380;erno&#347;&#263;, spor&#261; liczb&#281; dodatk&#243;w (products) w wersjach 0.x alpha &amp;#8211; czyli praktycznie bezu&#380;ytecznych, k&#322;opoty z interfejsem, cho&#263;by z menu po dodaniu do niego nowych element&#243;w.&lt;/p&gt;</description>
      <pubDate>Mon, 15 May 2006 13:16:06 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:f1e29d63-5608-48ae-b4fd-0369e8674c5b</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-96</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Je&#347;li chodzi o CMS, to nie spotka&#322;em na razie nic lepszego od &lt;a href="http://plone.org" rel="nofollow"&gt;Plone&lt;/a&gt;. Bardzo prosty aby zacz&#261;&#263; i ma bardzo pot&#281;&#380;ne mo&#380;liwo&#347;ci jak kto&#347; chce zaszale&#263;.&lt;/p&gt;</description>
      <pubDate>Mon, 15 May 2006 08:27:56 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:69172887-161b-4a46-bd9b-5d1e957cbc36</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-95</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Adamh</title>
      <description>&lt;p&gt;Musze przyznac, ze to bardzo ciekawy artykul.
Mialem przyjemnosc poznac SmallTalka i faktycznie ma mnostwo wspolnego z Rubym &amp;#8211; najwazniejsza wspolna cecha: Wszystko jest obiektem.&lt;/p&gt;


	&lt;p&gt;Swoja droga marzy mi sie CMS o mozliwosciach eZpublish/Plone napisany w Railsach (chocby w Django:))&lt;/p&gt;</description>
      <pubDate>Mon, 15 May 2006 07:58:48 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:83317f0f-77c4-49af-acf6-447496949e75</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-94</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Celem artyku&#322;u nie by&#322;o drobiazgowe por&#243;wnywanie Rails&#243;w z reszt&#261; &#347;wiata, ale zwr&#243;cenie uwagi na niezwykle silne powi&#261;zania Rubiego ze Smalltalkiem i mo&#380;liwo&#347;ci przekszta&#322;cania j&#281;zyka,  co t&#322;umaczy dlaczego Rails nie mo&#380;e &#380;y&#263; bez Rubiego. I to t&#322;umaczy dlaczego pr&#243;by sklonowania Rails&#243;w w innych j&#281;zykach to pora&#380;ka.&lt;/p&gt;


	&lt;p&gt;W &lt;em&gt;terminologii&lt;/em&gt; Smalltalka nie m&#243;wi si&#281; o wywo&#322;ywaniu metod, ale raczej o &lt;a href="http://www.objectspace.net/faq.html#wiadomosci" rel="nofollow"&gt;wysy&#322;aniu wiadomo&#347;ci do obiektu&lt;/a&gt;:&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Wiadomo&#347;ci s&#261; to instrukcje rozumiane przez obiekty, zaimplementowane w tych obiektach w postaci metod. Na przyk&#322;ad wiadomo&#347;&#263; sin jest rozumiana przez instancje klasy Number i oznacza &#380;&#261;danie obliczenia sinusa z warto&#347;ci b&#281;d&#261;cej odbiorc&#261; tej wiadomo&#347;ci.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Wiadomo&#347;&#263; sk&#322;ada si&#281; z nazwy metody i argument&#243;w i jest wysy&#322;ana do odbiorcy wiadomo&#347;ci. W wyra&#380;eniu 9 raisedTo: 2 odbiorc&#261; wiadomo&#347;ci jest liczba 9, nazw&#261; metody jest raisedTo:, a argumentem jest liczba 2.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Ka&#380;da wiadomo&#347;&#263; zwraca jako rezultat swojego wykonania jaki&#347; obiekt do obiektu wysy&#322;aj&#261;cego dan&#261; wiadomo&#347;&#263;. W powy&#380;szym przyk&#322;adzie metoda raisedTo: zwraca instancj&#281; klasy SmallInteger, czyli liczb&#281; 81.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Spring to nie j&#281;zyk, wi&#281;c nie ma sensu por&#243;wnywa&#263; go z Rubym (je&#347;li ju&#380;, to raczej z Railsami). Zalet Rails&#243;w jest sporo. M.in. znacznie szybsza p&#281;tla sprz&#281;&#380;enia zwrotnego, mniej kodu bez szkody dla czytelno&#347;ci (jak w Perlu), mniej plik&#243;w konfiguracyjnych, DRY i konwencje ponad konfiguracjami daj&#261;ce razem znacznie wi&#281;ksz&#261; produktywno&#347;&#263; w tym &#347;rodowisku. Railsy realizuj&#261; (znacznie lepiej ni&#380; inne frameworki) prosty cel: stworzenie frontona wsp&#243;&#322;pracuj&#261;cego z relacyjn&#261; baz&#261; danych. Nic wi&#281;cej, nic mniej. Naginianie Javy do zastosowa&#324; do kt&#243;rych nie zosta&#322;a dobrze zaprojektowana jest &#347;lep&#261; uliczk&#261;. Zach&#281;cam do przeczytania ksi&#261;&#380;ki &lt;a href="http://helion.pl/ksiazki/moreja.htm" rel="nofollow"&gt;Wi&#281;cej ni&#380; Java&lt;/a&gt;. Jest bardzo interesuj&#261;ca. Zobacz te&#380; &lt;a href="http://rewrite.rickbradley.com/pages/moving_to_rails/" rel="nofollow"&gt;Evaluation: moving from Java to Ruby on Rails for the CenterNet rewrite&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;A je&#347;li chcesz por&#243;wna&#263; hybrydow&#261; Jav&#281; z rzeczywi&#347;cie w pe&#322;ni obiektowym j&#281;zykiem  to zajrzyj np. do tych &lt;a href="http://www.whysmalltalk.com/smalltalkcomparisons/" rel="nofollow"&gt;por&#243;wna&#324; Smalltalka z Jav&#261;&lt;/a&gt;.    zobacz te&#380; &lt;a href="http://www.objectspace.net/stshort.html" rel="nofollow"&gt;Smalltalk w pigu&#322;ce&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Je&#347;li chodzi o samego Rubiego, to przejrzyj &lt;strong&gt;&lt;a href="http://onestepback.org/articles/10things/index.html" rel="nofollow"&gt;10 Things Every Java Programmer Should Know About Ruby&lt;/a&gt;&lt;/strong&gt;. Polecam te&#380; &lt;a href="http://www.martinfowler.com/" rel="nofollow"&gt;blog Martina Fowlera&lt;/a&gt; (tego od wzorc&#243;w projektowych i metodyk adaptacyjnych (agile))&lt;/p&gt;


	&lt;p&gt;Zobacz te&#380; artyku&#322; &lt;a href="http://www.onjava.com/pub/a/onjava/2005/10/19/challenging-java-dominance.html" rel="nofollow"&gt;Technologies to Watch: A Look at Four That May Challenge Java&#8217;s Development Dominance&lt;/a&gt; na onjava.com.&lt;/p&gt;</description>
      <pubDate>Sun, 14 May 2006 19:30:15 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:2b313266-345f-43ff-967f-4c0d162bb398</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-93</link>
    </item>
    <item>
      <title>"Dlaczego Ruby on Rails jest wyj&#261;tkowy?" by michuk</title>
      <description>&lt;p&gt;&amp;#8220;wszystkie operacje polegaj&#261; na przesy&#322;aniu metod (nazywanych tu: wiadomo&#347;ciami) mi&#281;dzy obiektami.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;Bo&#380;e, jakim &amp;#8220;przesy&#322;aniu metod&amp;#8221;??
Jak ju&#380; to &amp;#8220;wo&#322;anie metod&amp;#8221; chyba. Nigdzie ich przecie&#380; nie przesy&#322;asz :P&lt;/p&gt;


	&lt;p&gt;I tak dla informacji: wiadomo&#347;&#263; to standardowa nazwa na wywo&#322;anie metody w UML. Mo&#380;na wi&#281;c m&#243;wi&#263; o wiadomo&#347;ciach zar&#243;wno w Smalltalku, Javie czy Ruby.&lt;/p&gt;


	&lt;p&gt;Co do artyku&#322;u &amp;#8211; strasznie du&#380;o gadania, strasznie ma&#322;o konkret&#243;w. Nie dowiedzia&#322;em si&#281; na przyk&#322;ad jakie s&#261; zalety Ruby&amp;#8217;ego w por&#243;wnaniu do javowego SpringFramework&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Sun, 14 May 2006 17:15:59 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:6963cbbe-1f13-49db-a3e0-b30574e5f106</guid>
      <link>http://blog.zabiello.com/articles/2006/05/14/dlaczego-ruby-on-rails-jest-wyj%C4%85tkowy#comment-92</link>
    </item>
  </channel>
</rss>
