<?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: Modularyzacja RoR - komponenty</title>
    <link>http://blog.zabiello.com/articles/2006/04/19/modularyzacja-ror-komponenty</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Modularyzacja RoR - komponenty</title>
      <description>&lt;p&gt;&lt;a href="http://rubyonrails.com"&gt;RoR&lt;/a&gt; pozwala na modularyzacj&#281; projektu za pomoc&#261; &lt;a href="http://wiki.rubyonrails.com/rails/pages/HowTosPlugins"&gt;wtyczek&lt;/a&gt;, &lt;a href="http://wiki.rubyonrails.com/rails/pages/Rails+Engines"&gt;zagnie&#380;d&#380;onych miniaplikacji&lt;/a&gt; (rails engines) oraz &lt;a href="http://wiki.rubyonrails.com/rails/pages/Components"&gt;komponent&#243;w&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;U&#380;ywany tutaj blog jest oparty na &lt;a href="http://www.typosphere.org/"&gt;Typo&lt;/a&gt;,  aplikacji napisanej w RoR. Nie znalaz&#322;em w niej jednak gotowego, wbudowanego mechanizmu aby doda&#263; galeri&#281; fotek. S&#261; co prawda linki do zewn&#281;trznego serwisu &lt;a href="http://www.flickr.com"&gt;flickr.com&lt;/a&gt;, ale w wersji darmowej mo&#380;na umie&#347;ci&#263; stosunkowo niewiele fotek.&lt;/p&gt;


	&lt;p&gt;Aplikacja bloga chodzi na lighttpd i fastcgi. Wszelkie modyfikacje kodu wymagaj&#261; restartu serwera. Ma&#322;o to raczej wygodne. Postanowi&#322;em wi&#281;c stworzy&#263; sobie oddzielny projekt RoR. A zatem standardowo: rails fotki; cd fotki. Potem modyfikacja config/database.yml (ustawilem polaczenie do dowolnej bazy, i tak nie bede uzywal). Do pracy roboczej wystarczy mi webrick. A zatem ruby scripts/serwer i pod adresem http://localhost:3000 dziala nowy projekt.&lt;/p&gt;


	&lt;p&gt;Staraj&#261;c si&#281; trzyma&#263; zasady &lt;span class="caps"&gt;DRY&lt;/span&gt; (czyli unika&#263; powtarzania kodu). Dzia&#322;aj&#261;cy kod zamieni&#322;em nast&#281;pnie na komponent. Czyli procedura by&#322;a taka: wpierw tworz&#281; sobie aplikacj&#281; w izolowanym projekcie RoR. Na st&#281;pnie przenosz&#281; j&#261; do komponentu (nadal w tym samym projekcie). Testuj&#281;.  Jak dzia&#322;a, to &#322;&#261;cz&#281; komponent z aplikacj&#261; docelow&#261;. Dzi&#281;ki u&#380;yciu komponentu, unikam za&#347;miecania kodu aplikacji docelowej, ograniczaj&#261;c do minimum ilo&#347;&#263; zmian jakie musz&#281; doda&#263;.&lt;/p&gt;


	&lt;h2&gt;Komponenty&lt;/h2&gt;


	&lt;p&gt;Komponenty w RoR tworzy si&#281; (podobnie jak inne rzeczy) stosunkowo &#322;atwo i przyjemnie. Kazda &#347;wie&#380;a instalacja RoR tworzy domy&#347;lnie pusty folder components. Nale&#380;y tam przej&#347;&#263; i stworzy&#263; sw&#243;j podfolder, np. fotki.&lt;/p&gt;


	&lt;p&gt;Nast&#281;pnie przenosimy tam plik z kontrolerem. W tym wypadku by&#322;o to plik miniaturki_controlle.rb. Wiadomo gdzie by&#322;: apps/controllers/. Przenosimy go zatem do components/fotki/. Musimy tak&#380;e dokona&#263; w nim paru zmian. Przede wszystkim klasa kontrolera nie mo&#380;e dziedziczy&#263; bezpo&#347;rednio po ApplicationController. Musimy uwzgl&#281;dni&#263; to, &#380;e kontroler le&#380;y w innym miejscu.&lt;/p&gt;


	&lt;p&gt;Trzeba tak&#380;e zmieni&#263; definicje klasy i doda&#263; informacj&#281;, &#380;e szablony b&#281;d&#261; le&#380;e&#263; w innym miejscu ni&#380; domy&#347;lnie app/views/. Kontroler wi&#281;c wygl&#261;da&#263; mo&#380;e tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Fotki::MiniaturkiController&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="ident"&gt;uses_component_template_root&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;mysio_lista&lt;/span&gt;
    &lt;span class="ident"&gt;filenames&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dirname&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;__FILE__&lt;/span&gt;&lt;span class="punct"&gt;)+'&lt;/span&gt;&lt;span class="string"&gt;/../../public/fotki/mysio&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;*.jpg&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="attribute"&gt;@subfolder&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysio/&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
    &lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:template&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;fotki/miniaturki/lista&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;def &lt;/span&gt;&lt;span class="method"&gt;mysio_fotka&lt;/span&gt;
    &lt;span class="ident"&gt;filenames&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dirname&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;__FILE__&lt;/span&gt;&lt;span class="punct"&gt;)+'&lt;/span&gt;&lt;span class="string"&gt;/../../public/fotki/mysio&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;*.jpg&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="attribute"&gt;@subfolder&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysio/&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
    &lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:template&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;fotki/miniaturki/fotka&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;protected&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;filenames&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;filter&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@filenames&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[]&lt;/span&gt;
    &lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;glob&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;+&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;SEPARATOR&lt;/span&gt;&lt;span class="punct"&gt;+&lt;/span&gt;&lt;span class="ident"&gt;filter&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;each&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;f&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="attribute"&gt;@filenames&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;basename&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;sub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;.*^&lt;span class="escape"&gt;\D&lt;/span&gt;+(&lt;span class="escape"&gt;\d&lt;/span&gt;+).+$&lt;/span&gt;&lt;span class="punct"&gt;/,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;\1&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="attribute"&gt;@filenames&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sort!&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;Metoda filenames wciaga liste plik&#243;w i przypisuje do zmiennej instancji @filenames (zmienne tego typu s&#261; widziane w szablonach).&lt;/p&gt;


	&lt;p&gt;Przenie&#347;li&#347;my kontroler, pora na szablony. Tworzymy zatem kolejny podfolder components/fotki/miniaturki/ i przenosimy tam wszystkie nasze szablony z app/views/miniaturki/. Szablon lista.rhtml s&#322;u&#380;y do wyrzucenia na ekran miniaturek z obrazkami:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_rhtml "&gt;&amp;lt;% for f in @filenames %&amp;gt;
  &amp;lt;% if @subfolder%&amp;gt;
    &amp;lt;%= link_to(image_tag(&amp;quot;/fotki/#{@subfolder}thumbnails/prev_pict#{f}.jpg&amp;quot;,:border =&amp;gt; &amp;quot;1&amp;quot;), &amp;quot;/#{@subfolder}#{f}&amp;quot;) %&amp;gt;
  &amp;lt;% else %&amp;gt;
    &amp;lt;%= link_to(image_tag(&amp;quot;/fotki/#{@subfolder}thumbnails/prev_pict#{f}.jpg&amp;quot;,:border =&amp;gt; &amp;quot;1&amp;quot;), &amp;quot;/fotka/#{f}&amp;quot;) %&amp;gt;
  &amp;lt;% end %&amp;gt;
&amp;lt;% end %&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Natomiast szablon fotka.rhtml wy&#347;wietla jedno zdj&#281;cie w pe&#322;nym formacie:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_rhtml "&gt;&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;
  &amp;lt;div&amp;gt; 
    &amp;lt;%= render :partial =&amp;gt; 'menu' %&amp;gt;
    &amp;lt;%= image_tag &amp;quot;/fotki/#{@subfolder}pict#{params[:id]}.jpg&amp;quot; %&amp;gt;
    &amp;lt;%= render :partial =&amp;gt; 'menu' %&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Dobrze by&#322;oby tak&#380;e, aby mo&#380;na by&#322;o nawigowa&#263; mi&#281;dzy obrazkami. Doda&#322;em wi&#281;c proste menu u g&#243;ry i na dole. Aby si&#281; nie powtarza&#263;, szablon z tre&#347;ci&#261; menu wynios&#322;em do szablonu cz&#261;stkowego (partial). Plik z takim szablonem musi mie&#263; obowi&#261;zkowo znak podkre&#347;lnika na pocz&#261;tku nazywy. Szablon _menu.rhtml wygl&#261;da tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_rhtml "&gt;  &amp;lt;div style=&amp;quot;margin-top:10px; margin-bottom: 10px&amp;quot;&amp;gt; 
    [ 
      &amp;lt;% if @filenames.first != params[:id] %&amp;gt;
        &amp;lt;% if @subfolder %&amp;gt;
          &amp;lt;a href=&amp;quot;/&amp;lt;%= @subfolder %&amp;gt;&amp;lt;%= @filenames[@filenames.index(@params[:id]) - 1] %&amp;gt;&amp;quot;&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;lt;/a&amp;gt;
        &amp;lt;% else %&amp;gt;
          &amp;lt;a href=&amp;quot;/fotka/&amp;lt;%= @filenames[@filenames.index(@params[:id]) - 1] %&amp;gt;&amp;quot;&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;lt;/a&amp;gt;
        &amp;lt;% end %&amp;gt;
        |
      &amp;lt;% end %&amp;gt;
      &amp;lt;% if @subfolder %&amp;gt;
        &amp;lt;a href=&amp;quot;/&amp;lt;%= @subfolder %&amp;gt;&amp;quot;&amp;gt;miniaturki&amp;lt;/a&amp;gt; 
      &amp;lt;% else %&amp;gt;
        &amp;lt;a href=&amp;quot;/fotki&amp;quot;&amp;gt;miniaturki&amp;lt;/a&amp;gt; 
      &amp;lt;% end %&amp;gt;
      &amp;lt;% if @filenames.last != params[:id] %&amp;gt;
        |
        &amp;lt;% if @subfolder %&amp;gt;
          &amp;lt;a href=&amp;quot;/&amp;lt;%= @subfolder %&amp;gt;&amp;lt;%= @filenames[@filenames.index(@params[:id]) + 1] %&amp;gt;&amp;quot;&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;% else %&amp;gt;
          &amp;lt;a href=&amp;quot;/fotka/&amp;lt;%= @filenames[@filenames.index(@params[:id]) + 1] %&amp;gt;&amp;quot;&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;% end %&amp;gt;
      &amp;lt;% end %&amp;gt;
    ]
  &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Jest troszk&#281; rozbudowany z dw&#243;ch powod&#243;w. Chcia&#322;em aby przej&#347;cia do nast&#281;pnej lub wcze&#347;niejszej fotki by&#322;y dost&#281;pne tylko wtedy kiedy to ma sens. Poza tym, kod uwzgl&#281;dnia tworzenie podfolder&#243;w ze zdj&#281;ciami. St&#261;d we wszystkich szablonach dodatkowa zmienna @subfolder.&lt;/p&gt;


	&lt;p&gt;Gdybym chcia&#322; umie&#347;ci&#263; wywo&#322;anie komponentu w szablonie aplikacji, to musia&#322;bym u&#380;y&#263; funkcji &lt;a href="http://api.rubyonrails.org/classes/ActionController/Components.html#M000063"&gt;render_component&lt;/a&gt;. Jednak, w tym wypadku nie chcia&#322;em grzeba&#263; w szablonach Typo. Zatem ostatni&#261; rzecz&#261; jaka zosta&#322;a, to zdefiniwanie odpowiedniej regu&#322;y dla resolvera adres&#243;w. Chc&#281; aby lista pokaza&#322;a si&#281; pod adresem /mysio a konkretne fotki pod adresem /mysio/nrfotki. Regu&#322;y rozwi&#261;zywania adres&#243;w &lt;span class="caps"&gt;URL&lt;/span&gt; znajduj&#261; si&#281; w pliku config/routes.rb:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;ActionController&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Routing&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Routes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;draw&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;map&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="comment"&gt;# reszta kodu&lt;/span&gt;
  &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysio&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;'&lt;/span&gt;&lt;span class="string"&gt;fotki/miniaturki&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="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysio_lista&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;              
  &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysio/:id&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;'&lt;/span&gt;&lt;span class="string"&gt;fotki/miniaturki&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="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysio_fotka&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
              &lt;span class="symbol"&gt;:id&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;&lt;span class="escape"&gt;\d&lt;/span&gt;+&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;
  &lt;span class="comment"&gt;# blok ko&#324;czy domy&#347;lna regu&#322;a:&lt;/span&gt;
  &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;:controller/:action/:id&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;To prawie wszystko. Prawie, bo musia&#322;em tak&#380;e napisa&#263; kod do przeskalowania obrazk&#243;w (domy&#347;lnie by&#322;y w rozdzielczo&#347;ci 1280&amp;#215;1024) oraz wygenerowania miniaturek. W zwi&#261;zku z tym, &#380;e chcia&#322;em wszystko ju&#380; napisac w Ruby, zabra&#322;em si&#281; za pisanie skryptu w tym j&#281;zyku. Przeskalowanie fotek do rozdzielczo&#347;ci 1024&amp;#215;768:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/ruby&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;RMagick&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;default_path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/home/rubyonrails/typo/public/fotki&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="global"&gt;$1&lt;/span&gt; &lt;span class="punct"&gt;||&lt;/span&gt; &lt;span class="ident"&gt;default_path&lt;/span&gt;
&lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;chdir&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;glob&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;*.jpg&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;each&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;f&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;    
  &lt;span class="ident"&gt;img&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Magick&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Image&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;first&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;columns&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1024&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;f&lt;/span&gt;
    &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;change_geometry&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;1024x768&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;cols&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;rows&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;im&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;im&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;resize!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;cols&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;rows&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;write&lt;/span&gt; &lt;span class="ident"&gt;f&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; przeskalowane&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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;Oraz generowanie miniaturek:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/ruby&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;RMagick&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;default_path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/home/rubyonrails/typo/public/fotki&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="global"&gt;$1&lt;/span&gt; &lt;span class="punct"&gt;||&lt;/span&gt; &lt;span class="ident"&gt;default_path&lt;/span&gt;
&lt;span class="ident"&gt;outpath&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;SEPARATOR&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;thumbnails&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;mkdir&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;outpath&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="keyword"&gt;not&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;exists?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;outpath&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;chdir&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;glob&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;*.JPG&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;each&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;f&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;f&lt;/span&gt; &lt;span class="punct"&gt;!=&lt;/span&gt; &lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;downcase&lt;/span&gt;
    &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rename&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;downcase&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;downcase!&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="ident"&gt;img&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Magick&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Image&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;first&lt;/span&gt;
  &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;change_geometry&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;128x128&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;cols&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;rows&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;im&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;im&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;resize!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;cols&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;rows&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
  &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;write&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{outpath}#{File::SEPARATOR}&lt;/span&gt;prev_&lt;span class="expr"&gt;#{f}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="ident"&gt;f&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Niestety, tu spotka&#322;a mnie przykra niespodzianka. Biblioteka RMagic wywala&#322;a si&#281; z komunikatem o braku pami&#281;ci. Kod jest poprawny. To jest b&#322;&#261;d w tej bibliotece. Chc&#261;c, nie chc&#261;c, przepisa&#322;em kod do Pythona:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/env python2.4&lt;/span&gt;
&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;''&lt;/span&gt;&lt;span class="string"&gt;
Skaluje obrazki do 1020x768 oraz generuje miniatiurki
Operuje na plikach JPEG.
&lt;/span&gt;&lt;span class="punct"&gt;''&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;glob&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Image&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;os&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;sys&lt;/span&gt;
&lt;span class="ident"&gt;scale&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1024&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="number"&gt;768&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="ident"&gt;try&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
    &lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;pattern&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;prefix&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;argv&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="ident"&gt;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;argv&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="ident"&gt;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;argv&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
&lt;span class="ident"&gt;except&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Skladnia: sciezka wzorzec prefix&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;exit&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="ident"&gt;os&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;chdir&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="ident"&gt;thumbnails_path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;os&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sep&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;thumbnails&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="keyword"&gt;not&lt;/span&gt; &lt;span class="ident"&gt;os&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;exists&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;thumbnails_path&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
    &lt;span class="ident"&gt;os&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;makedirs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;thumbnails_path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;f&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;glob&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;glob&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;pattern&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
  &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
  &lt;span class="ident"&gt;img&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Image&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;size&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;max&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1024&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;%s (%sx%s)&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;size&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="ident"&gt;size&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;]),&lt;/span&gt;
    &lt;span class="ident"&gt;img&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;resize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;scale&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Image&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ANTIALIAS&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;save&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;JPEG&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="ident"&gt;size&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt; przeskalowane do %sx%s&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="ident"&gt;size&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;]),&lt;/span&gt;
  &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt; przeskalowywanie do 128x128&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
  &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;thumbnail&lt;/span&gt;&lt;span class="punct"&gt;((&lt;/span&gt;&lt;span class="number"&gt;128&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;128&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="constant"&gt;Image&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ANTIALIAS&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;save&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;thumbnails/%s_%s&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;prefix&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;JPEG&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
  &lt;span class="ident"&gt;print&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Tym razem wszystko przesz&#322;o g&#322;adko i szybko. Kod Pythona wykorzystuj&#261;cy biblioteke &lt;a href="http://www.pythonware.com/products/pil/"&gt;&lt;span class="caps"&gt;PIL&lt;/span&gt;&lt;/a&gt; by&#322; poza tym jakie&#347; 2x szybszy. Sprawdza si&#281; zatem to, &#380;e wsp&#243;&#322;cze&#347;ni programi&#347;ci nie mog&#261; ogranicza&#263; si&#281; tylko do jednego j&#281;zyka. Czasami warto mie&#263; w zapasie drugi. Python jest doskona&#322;ym uzupe&#322;nieniem dla Rubiego. Ruby ma lepszy framework, ale Python ma dojrzalsz&#261; bibliotek&#281; graficzna.&lt;/p&gt;


	&lt;p&gt;Jedyn&#261; rzecz&#261; kt&#243;r&#261; nie uda&#322;o mi si&#281; rozwi&#261;za&#263;, to umieszczenie tre&#347;ci komponentu w ramach aplikacji Typo (tak jak wida&#263; np,. ten artyku&#322;). Typo jest dosy&#263; skomplikowan&#261; aplikacj&#261; i nie mog&#322;em si&#281; po&#322;apac w jego plikach z layoutem. Niekt&#243;rzy &#380;artuj&#261; &#380;e Typo to przyk&#322;ad kodowania sztucznej inteligencji. :) Przyk&#322;ad dzia&#322;aj&#261;cych fotek z moim ulubionym futrzakiem mo&#380;na zobaczy&#263;: &lt;a href="http://blog.zabiello.com/mysio"&gt;tutaj&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Wed, 19 Apr 2006 23:11:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:846f41f5-c362-4989-ae2c-6233edadca97</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/04/19/modularyzacja-ror-komponenty</link>
      <category>Ruby on Rails</category>
      <category>rails</category>
    </item>
    <item>
      <title>"Modularyzacja RoR - komponenty" by kml</title>
      <description>&lt;p&gt;ImageScience te&#380; wydaje si&#281; fajny &lt;a href="http://seattlerb.rubyforge.org/ImageScience.html" rel="nofollow"&gt;http://seattlerb.rubyforge.org/ImageScience.html&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 21 Jun 2008 15:49:19 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:e0ffcd57-bc4e-4f79-851e-7d4e95e812b5</guid>
      <link>http://blog.zabiello.com/articles/2006/04/19/modularyzacja-ror-komponenty#comment-1705</link>
    </item>
    <item>
      <title>"Modularyzacja RoR - komponenty" by rofro</title>
      <description>&lt;p&gt;a moze uzyc minimagick?
&lt;a href="http://journal.gleepglop.com/articles/2005/12/04/imagemagick-the-ruby-way" rel="nofollow"&gt;http://journal.gleepglop.com/articles/2005/12/04/imagemagick-the-ruby-way&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 25 Apr 2006 10:58:41 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:6d1c41de-90a4-43b2-9f0c-8b81296ff10e</guid>
      <link>http://blog.zabiello.com/articles/2006/04/19/modularyzacja-ror-komponenty#comment-82</link>
    </item>
    <item>
      <title>"Modularyzacja RoR - komponenty" by http://blog.temp.rsc.pl</title>
      <description>&lt;p&gt;Jestes pewien ze blad o braku pamieci dotyczyl RMagicka a nie ImageMagicka ? Ja w swojej instalacji uzylem RMagicka+GraphicsMagick i nie mialem takich problem&#243;w.&lt;/p&gt;</description>
      <pubDate>Thu, 20 Apr 2006 07:29:41 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:e067f16b-c21a-4b5d-aea1-11913eef25b0</guid>
      <link>http://blog.zabiello.com/articles/2006/04/19/modularyzacja-ror-komponenty#comment-80</link>
    </item>
  </channel>
</rss>
