<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/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: Category Ruby on Rails</title>
    <link>http://blog.zabiello.com/articles/category/ruby-on-rails</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Haml - nast&#281;pna generacja szablon&#243;w</title>
      <description>&lt;p&gt;&lt;a href="http://haml.hamptoncatlin.com/"&gt;&lt;img src="/images/articles/haml.png" align="left" hspace="4px" /&gt;&lt;/a&gt; W zwi&#261;zku z przestawieniem si&#281; ca&#322;kowicie na najnowsz&#261; wersj&#281; &lt;a href="http://rubyonrails.org"&gt;Rails&#243;w&lt;/a&gt; (1.2.1), postanowi&#322;em przy zrobi&#263; tak&#380;e upgrade oprogramowania do mego bloga (kt&#243;ry w wersji jak&#261; mia&#322;em nie wsp&#243;&#322;pracowa&#322; z RoR 1.2.1).  Na szcz&#281;&#347;cie, dzi&#281;ki railsowym migracjom proces aktualizacji skrypt&#243;w &lt;em&gt;jak i struktury baz&lt;/em&gt;  przebieg&#322; bez problem&#243;w i niedestrukcyjnie dla danych w bazie. Typo&amp;#8221;:http://trac.typosphere.org/ zawsze by&#322; kodem troch&#281; awangardowym, wprowadzaj&#261;cym zaawansowane mechanizmy Rubiego i najnowsze pomys&#322;y Rails&#243;w. Przekona&#322;em si&#281; o tym podczas pr&#243;by modyfikacji paru szablon&#243;w. Typo zamiast dotychczasowego formatu &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/"&gt;ERb&lt;/a&gt; (*.rhtml) Typo u&#380;ywa ju&#380; szablony nowej generacji &amp;#8211; &lt;a href="http://haml.hamptoncatlin.com/"&gt;Haml&lt;/a&gt;. Chc&#261;c niechc&#261;c, musia&#322;em przej&#347;&#263; szybki kurs pos&#322;ugiwania si&#281; nimi aby zmodyfikowa&#263; szablony w swoim blogu.&lt;/p&gt;


	&lt;p&gt;Moje pierwsze wra&#380;enia s&#261; bardzo pozytywne. Wystarczy&#322;o mi par&#281; minut aby ogarn&#261;&#263; sk&#322;adni&#281;. Szablon bazowy (layout) mojego bloga wygl&#261;da teraz tak (zrzut ekranu z RadRails/Eclipse, kt&#243;ry doczeka&#322; si&#281; ju&#380;  &lt;a href="http://haml.lucky-dip.net/"&gt;pluginu&lt;/a&gt;):&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.zabiello.com/images/articles/haml_example.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Mo&#380;e na pocz&#261;tku to nie wydaje si&#281; czytelne, ale po paru minutach pracy z Haml wida&#263;, &#380;e kod jest znacznie bardziej przejrzysty i kr&#243;tszy. Nie trzeba tak&#380;e zamyka&#263; tag&#243;w. Wida&#263; tu inspiracj&#281; Pythonem, gdy&#380; Haml u&#380;ywa dw&#243;ch spacji jako wyznacznika bloku. Ci, co patrzyli z niech&#281;ci&#261; na pythonowe u&#380;ywanie wci&#281;&#263; do oznaczania blok&#243;w,  b&#281;d&#261; musieli przejrze&#263; na oczy. :)&lt;/p&gt;


	&lt;p&gt;Hamlto skr&#243;t od &amp;#8220;XHTML Abstraction Markup Language&amp;#8221;. Zosta&#322; stworzony aby u&#322;atwi&#263; tworzenie czystego, dobrze zagnie&#380;d&#380;onego kodu &lt;span class="caps"&gt;HTML&lt;/span&gt;. 
 Haml umo&#380;liwia pe&#322;ny dost&#281;p do Rubiego i helper&#243;w Rails. Ale mo&#380;e by&#263; teoretycznie zastosowany jako wymiennik sk&#322;adni dla &lt;span class="caps"&gt;PHP&lt;/span&gt; czy &lt;span class="caps"&gt;JSP&lt;/span&gt;. Aktualnie  Haml to m&#322;ody projekt (powsta&#322; w maju 2006). Jest aktualnie u&#380;ywany tylko we frameworku  &lt;a href="http://rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Haml generuje kod &lt;span class="caps"&gt;XHTML&lt;/span&gt; (czyli zgodny z &lt;span class="caps"&gt;XML&lt;/span&gt;).  Dba o odpowiednie wci&#281;cia i zagnie&#380;d&#380;enia tag&#243;w.  Zwyk&#322;e, r&#281;czne tworzenie kodu &lt;span class="caps"&gt;HTML&lt;/span&gt; jest nie tylko podatne na b&#322;&#281;dy. Jest tak&#380;e ma&#322;o czytelne. Jak do tego dodamy sk&#322;adni&#281; ERb, to si&#281; robi jeszcze mniej czytelniej. Haml jest recept&#261; zapewniaj&#261;c&#261; pe&#322;ny dost&#281;p do wszystkich mechanizm&#243;w Rubiego i Rails&#243;w ale&amp;#8230; bez zagnie&#380;d&#380;ania kodu Rubiego w kodzie &lt;span class="caps"&gt;HTML&lt;/span&gt;. Zamiast mozolnie wklepywa&#263; tagi, Haml proponuje budowanie ich w znacznie przejrzysty spos&#243;b.&lt;/p&gt;


	&lt;h2&gt;Instalacja&lt;/h2&gt;


	&lt;p&gt;Haml jest dost&#281;pny w formie pluginu do Rails&#243;w.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;./&lt;/span&gt;&lt;span class="regex"&gt;script&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;plugin&lt;/span&gt; &lt;span class="ident"&gt;install&lt;/span&gt; &lt;span class="ident"&gt;svn&lt;/span&gt;&lt;span class="punct"&gt;:/&lt;/span&gt;&lt;span class="regex"&gt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;hamptoncatlin&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;com&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;haml&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;tags&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;stable&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Mo&#380;na te&#380; zainstalowa&#263; Haml za pomoc&#261; gems&#243;w:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="ident"&gt;install&lt;/span&gt; &lt;span class="ident"&gt;haml&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Moim zdaniem &lt;a href="http://haml.hamptoncatlin.com/"&gt;Haml&lt;/a&gt; jest pierwszorz&#281;dnym kandydatem na zast&#261;pienie g&#322;&#243;wnych szablon&#243;w Rails&#243;w &amp;#8211; &lt;span class="caps"&gt;RHTML&lt;/span&gt;. Chyba zaczn&#281; ju&#380; przebudowywa&#263; wszystkie swoje szablony. :)&lt;/p&gt;


	&lt;p&gt;Appendix:&lt;/p&gt;


	&lt;p&gt;Haml s&#261; ju&#380; przygotowane dla &lt;a href="http://groups.google.com/group/haml/web/syntax-highlighting"&gt;Jedita, Eclipse/RadRails, Textmate i (G)vim&lt;/a&gt;. Wys&#322;a&#322;em informacj&#281; na list&#281; Komodo aby to te&#380; dodali.&lt;/p&gt;


	&lt;p&gt;Update 2007-01-29:&lt;/p&gt;


	&lt;p&gt;Przepisa&#322;em wszystkie szablony na &lt;a href="http://zabiello.com"&gt;mojej stronie&lt;/a&gt;  do Haml.  S&#261; po prostu &#347;wietne.&lt;/p&gt;</description>
      <pubDate>Sat, 27 Jan 2007 04:33:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:2e98e271-affc-4966-aa86-f1fe4a47ec85</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/01/27/haml-nast%C4%99pna-generacja-szablon%C3%B3w</link>
      <category>Ruby on Rails</category>
      <category>haml</category>
      <category>rails</category>
      <category>erb</category>
      <category>templates</category>
    </item>
    <item>
      <title>Unikanie niebezpiecznych danych w szablonach RHTML</title>
      <description>&lt;p&gt;W wypadku tre&#347;ci wy&#347;wietlanych w  szablonach najlepiej zachowa&#263; zasad&#281; ograniczonego zaufania. Np. je&#347;li wy&#347;wietlamy zawarto&#347;&#263; komentarzy kt&#243;re kto&#347; wys&#322;a&#322; z formularza, to przy odrobinie z&#322;o&#347;liwo&#347;ci i/lub g&#322;upoty taki u&#380;yszkodnik mo&#380;e nam wys&#322;a&#263; kod &lt;span class="caps"&gt;HTML&lt;/span&gt; lub JavaScript, kt&#243;ry popsuje sp&#243;jno&#347;&#263; naszej strony. Generalnie istnieje kilka metod aby si&#281; przed tym zabezpieczy&#263;.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Wszelkie tre&#347;ci podejrzane o mo&#380;liwo&#347;&#263; wys&#322;ania kodu &lt;span class="caps"&gt;HTML&lt;/span&gt; wy&#347;wietlaj przez funkcj&#281; filtruj&#261;c&#261; html_escape() (lub w skr&#243;cie: h) Czyli  zamiast &amp;lt;&lt;span&gt;= jakies_dane %&amp;gt; nale&#380;y u&#380;ywa&#263; &amp;lt;&lt;/span&gt;=h jakies_dane %&amp;gt; i dobrze aby ten zwyczaj wszed&#322; nam w krew. Dzi&#281;ki temu helperowi wszelkie dane zawieraj&#261;ce znaczniki zostan&#261; wymienione na encje &lt;span class="caps"&gt;HTML&lt;/span&gt; (np. zamiast &amp;lt; b&#281;dzie &amp;amp;lt; co w efekcie uniemo&#380;liwi interpretacj&#281; takich znak&#243;w jako tag&#243;w &lt;span class="caps"&gt;HTML&lt;/span&gt;)]&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;W wypadku kiedy potrzebujemy kodu &lt;span class="caps"&gt;HTML&lt;/span&gt;, ale nie chcemy aby zawiera&#322; ukryte wstawki w j&#281;zyku JavaScript, dane filtrujemy przez funkcj&#281; sanitize(). Wszystkie akcje onXXX oraz linki zaczynaj&#261;ce si&#281; od javascript: powinny zosta&#263; usuni&#281;te.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;W wypadku kiedy chcemy udost&#281;pni&#263; u&#380;yszkodnikom  mo&#380;liwo&#347;&#263; wprowadzania tre&#347;ci z mo&#380;liwo&#347;ci&#261; formatowania tekstu, zamiast &lt;span class="caps"&gt;HTML&lt;/span&gt; mo&#380;na udost&#281;pni&#263; im mo&#380;liwo&#347;&#263; wprowadzania tekstu w formacie Markdown (&lt;a href="http://www.deveiate.org/projects/BlueCloth"&gt;BlueCloth&lt;/a&gt;) lub Textile (&lt;a href="http://www.whytheluckystiff.net/ruby/redcloth/"&gt;RedCloth&lt;/a&gt;).  To specjalny, uproszczony spos&#243;b formatowania tekstu, kt&#243;ry jest zamieniany na bezpieczny i dobrze sformu&#322;owany kod &lt;span class="caps"&gt;HTML&lt;/span&gt;. Rails posiada wbudowane helpery do ich obs&#322;ugi (s&#261; zdefiniowane w module ActionView::Helpers::TextHelper)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;Ostatecznie mo&#380;na  wyci&#261;&#263; wszystkie znaczniki &lt;span class="caps"&gt;HTML&lt;/span&gt; za pomoc&#261; helpera strip_tags().&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Aby Rails m&#243;g&#322; u&#380;ywa&#263; helpery textilize() i markdown() trzeba je doinstalowa&#263;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="ident"&gt;install&lt;/span&gt; &lt;span class="constant"&gt;RedCloth&lt;/span&gt;
&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="ident"&gt;install&lt;/span&gt; &lt;span class="constant"&gt;BlueCloth&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Nast&#281;pnie w pliku config/environment.rb doda&#263; kod:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;require_gem&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;RedCloth&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; 
  &lt;span class="ident"&gt;require_gem&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;BlueCloth&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Przyk&#322;ad u&#380;ycia:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_rhtml "&gt;&amp;lt;%= textilize '&amp;quot;Polskie forum&amp;quot;:http://forum.rubyonrails.pl dla RoR.' %&amp;gt;
&amp;lt;%= markdown 'Strona Rubiego [po polsku](http://ruby-lang.org/pl).' %&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Wygenerowany kod &lt;span class="caps"&gt;HTML&lt;/span&gt;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_rhtml "&gt;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;http://forum.rubyonrails.pl&amp;quot;&amp;gt;Polskie forum&amp;lt;/a&amp;gt; dla RoR.&amp;lt;/p&amp;gt; 
&amp;lt;p&amp;gt;Strona Rubiego &amp;lt;a href=&amp;quot;http://ruby-lang.org/pl&amp;quot;&amp;gt;po polsku&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 25 Dec 2006 01:14:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ab598372-bbec-4b6f-98b6-54cd7f04a01e</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/12/25/unikanie-niebezpiecznych-danych-w-szablonach-rhtml</link>
      <category>Ruby on Rails</category>
      <category>rails</category>
    </item>
    <item>
      <title>W&#322;asne konfiguracje w Rails</title>
      <description>&lt;p&gt;W Rails domy&#347;lnym miejscem do ustawienia swoich dodatkowych konfiguracji jest plik conf/environment.rb. Jednak wygodniejszym sposobem jest u&#380;ycie formatu &lt;span class="caps"&gt;YAML&lt;/span&gt;. Np. za&#322;&#243;&#380;my, &#380;e pliku config/defaults.yml mamy nast&#281;puj&#261;ce ustawienia:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;default&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;defaults&lt;/span&gt;
  &lt;span class="ident"&gt;paging&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="number"&gt;10&lt;/span&gt;

&lt;span class="ident"&gt;development&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
  &lt;span class="ident"&gt;show_debugs&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
  &lt;span class="ident"&gt;paging&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="number"&gt;20&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&amp;lt;:&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;defaults&lt;/span&gt;

&lt;span class="ident"&gt;production&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
  &lt;span class="ident"&gt;show_debugs&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&amp;lt;:&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;defaults&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Wykorzysta&#322;em tu zasad&#281; &lt;span class="caps"&gt;DRY&lt;/span&gt; (unikania powtarzania kodu) st&#261;d sekcja &amp;#8216;default&amp;#8217; kt&#243;ra zawiera wsp&#243;lne ustawienia dla Rails&#243;w pracuj&#261;cych zar&#243;wno w trybie roboczym (developerskim) jak i produkcyjnym. Aby ten plik by&#322; wci&#261;gany i to zgodnie z bie&#380;&#261;cym trybem pracy Rails&#243;w, do pliku config/environment.rb nale&#380;y doda&#263;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;ostruct&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;yml&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;YAML&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;load_file&lt;/span&gt; &lt;span class="constant"&gt;RAILS_ROOT&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/config/defaults.yml&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="global"&gt;$defaults&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;OpenStruct&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;yml&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;send&lt;/span&gt; &lt;span class="constant"&gt;RAILS_ENV&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Do naszej aplikacji RoR zostanie dodana zmienna globalna $defaults, W wypadku pracy w trybie produkcyjnym, zmienna $defaults zawiera hasz z warto&#347;ciami:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;{&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;paging&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;=&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;show_debugs&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;=&amp;gt;&lt;/span&gt;&lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Zamiast u&#380;ycia zmiennej globalnej, mo&#380;na u&#380;y&#263;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;AppConfig&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;OpenStruct&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;yml&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;send&lt;/span&gt; &lt;span class="constant"&gt;RAILS_ENV&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;dzi&#281;ki temu mamy dost&#281;p do poszczeg&#243;lnych parametr&#243;w za pomoc&#261;  notacji kropkowej:&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="constant"&gt;AppConfig&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;paging&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 10&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 24 Dec 2006 02:51:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:6fdb5e3d-41da-49d5-8f60-5368f9196fd9</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/12/24/w%C5%82asne-konfiguracje-w-rails</link>
      <category>Ruby on Rails</category>
      <category>rails</category>
    </item>
    <item>
      <title>Skype3 i polski czat dla Rails&#243;w, Django i Pylonsa</title>
      <description>&lt;p&gt;Nowy Skype 3 wprowadza ma&#322;&#261; rewolucj&#281; w stos. do poprzedniej wersji. Mo&#380;na nie tylko rozmawia&#263;, ale pogra&#263; w szachy, k&#243;&#322;ko i krzy&#380;yk i inne gry (s&#261; b. &#322;adnie zrobione we Flashu 9). Mo&#380;na nagrywa&#263; rozmowy na dysk. Mo&#380;na tworzy&#263; publiczne czaty. I w&#322;a&#347;nie w tej sprawie pisz&#281; ten tekst bo 
stworzy&#322;em &lt;a href="http://www.skype.com/go/joinpublicchat?chat&amp;#38;skypename=hipertracker&amp;#38;topic=Rails%2C+Django%2C+Pylons+%28Polish%29&amp;#38;blob=qL-BIeEXX7A-qDj26JrmQcoze6L4kn_YE4016SUPrFY2DUmNoHxxVoeROiE4d1UZFQ4UJUo8-KPFDhFLqFhSVeo"&gt;polski czat dla mi&#322;o&#347;nik&#243;w framework&#243;w Ruby on Rails, Django i Pylons&lt;/a&gt;.
Wygodniej jest czasem skonsultowa&#263; co&#347; w czasie rzeczywistym ni&#380; na grupie czy &lt;a href="http://forum.rubyonrails.pl"&gt;forum dyskusyjnym&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Dec 2006 00:48:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:6232652d-1ffd-4b4e-bcce-a630cc5bc711</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/12/15/skype3-i-polski-czat-dla-rails%C3%B3w-django-i-pylonsa</link>
      <category>Ruby on Rails</category>
      <category>Pylons</category>
      <category>Python</category>
      <category>Django (en)</category>
      <category>Ruby</category>
      <category>Django</category>
      <category>rails</category>
      <category>django</category>
      <category>pylons</category>
    </item>
    <item>
      <title>Ruby on Rails w W-wie</title>
      <description>&lt;p&gt;11 grudnia w Warszawie odb&#281;dzie si&#281; kolejne spotkanie dla os&#243;b zainteresowanych &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;, rozwojem internetu i e-biznesem. Szczeg&#243;&#322;y &lt;a href="http://weblog.rubyonrails.pl/articles/2006/12/01/11-12-2006-kolejne-spotkanie-railsowe-w-warszawie-ch%C5%82odna-25"&gt;tutaj&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Fri, 01 Dec 2006 17:17:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:b6317442-857d-4bd7-897c-b307a6bf7f9a</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/12/01/ruby-on-rails-w-w-wie</link>
      <category>Ruby on Rails</category>
      <category>rails</category>
      <category>meetings</category>
    </item>
    <item>
      <title>Agile Web Development with Rails - w druku</title>
      <description>&lt;p style="float:left"&gt;&lt;img src="http://blog.zabiello.com/images/awdr2.gif" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Drugie wydanie &lt;a href="http://www.pragmaticprogrammer.com/titles/rails/index.html"&gt;kultowej ksi&#261;&#380;ki&lt;/a&gt; na temat Rails&#243;w &lt;a href="http://weblog.rubyonrails.org/2006/11/28/agile-web-development-with-rails-2nd-edition"&gt;jest ju&#380; w druku&lt;/a&gt;. Wersja papierowa powinna by&#263; gotowa na 15 grudnia. Pierwsze wydanie zosta&#322;o uznane za &lt;a href="http://en.wikipedia.org/wiki/Agile_Web_Development_with_Rails"&gt;najlepsz&#261; ksi&#261;&#380;k&#261; techniczn&#261;&lt;/a&gt; na &#347;wiecie. Drugie jest jeszcze ciekawsze, bo opisuje wszystkie nowo&#347;ci jakie maj&#261; si&#281; pojawi&#263; w Railsach 1.2. W&#322;a&#347;ciciele wersji &lt;span class="caps"&gt;PDF&lt;/span&gt; mog&#261; kupi&#263; wersj&#281; papierow&#261; ze zni&#380;k&#261;.&lt;/p&gt;</description>
      <pubDate>Wed, 29 Nov 2006 04:45:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:f9ddaf20-2815-4a04-a22c-1f60d899e54e</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/11/29/agile-web-development-with-rails-w-druku</link>
      <category>Ruby on Rails</category>
      <category>rails</category>
    </item>
    <item>
      <title>Ruby on Rails 1.2 RC1</title>
      <description>&lt;p&gt;Nadchodzi wielkimi krokami &lt;a href="http://weblog.rubyonrails.org/2006/11/23/rails-1-2-release-candidate-1"&gt;Ruby on Rails 1.2&lt;/a&gt;. W&#322;a&#347;nie udost&#281;pniono wersj&#281; &lt;span class="caps"&gt;RC1&lt;/span&gt;. Wersja finalna powinna pojawi&#263; si&#281; w najbli&#380;szych tygodniach. Wprowadzono szereg istotnych usprawnie&#324; w dzia&#322;aniu Rails&#243;w powi&#281;kszaj&#261;c tym samym jeszcze bardziej komfort pracy i dystans w stosunku do pozosta&#322;ych framework&#243;w.&lt;/p&gt;


	&lt;p&gt;Np. dodano dodatkowy &lt;strong&gt;parametr &amp;#8220;format&amp;#8221; do metody respond_to&lt;/strong&gt;. Aby z tego korzysta&#263;, nale&#380;y w routes.rb doda&#263; regu&#322;&#281;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&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.:format&lt;/span&gt;&lt;span class="punct"&gt;'.&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Nie trzeba ju&#380; wi&#281;cej bawi&#263; si&#281; w analiz&#281; nag&#322;&#243;wk&#243;w &lt;span class="caps"&gt;HTTP&lt;/span&gt;.&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;WeblogController&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActionController&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;index&lt;/span&gt;
    &lt;span class="attribute"&gt;@posts&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Post&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt; &lt;span class="symbol"&gt;:all&lt;/span&gt;
    &lt;span class="ident"&gt;respond_to&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt;
      &lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;xml&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;:xml&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@posts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_xml&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
      &lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rss&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;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;feed.rxml&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="constant"&gt;GET&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;weblog&lt;/span&gt;       &lt;span class="comment"&gt;# zwr&#243;ci HTML&lt;/span&gt;
&lt;span class="constant"&gt;GET&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;weblog&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;xml&lt;/span&gt;   &lt;span class="comment"&gt;# zwr&#243;ci XML&lt;/span&gt;
&lt;span class="constant"&gt;GET&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;weblog&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rss&lt;/span&gt;   &lt;span class="comment"&gt;# zwr&#243;ci RSS&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Inn&#261;, istotn&#261; zmian&#261; jest dodanie &lt;strong&gt;Multibyte&lt;/strong&gt;. Nie jest to co prawda tak zaawansowane jak w Pythonie, ale do czasu pojawienie si&#281; Ruby 2 (kt&#243;ry ma mie&#263; pe&#322;ne wsparcie dla Unicode), Multibyte poprawia troch&#281; sytuacj&#281;. programisty. Generalnie Ruby jako&#347; dawa&#322; sobie rad&#281; z &lt;span class="caps"&gt;UTF&lt;/span&gt;-8, ale w niekt&#243;rych sytuacjach pojawia&#322;y si&#281; problemy. Np. metoda size() zwraca ilo&#347;&#263; bajt&#243;w a nie znak&#243;w. Multibyte wprowadza metod&#281; proxy dla napis&#243;w &amp;#8211; chars. Np.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Napisa&#322;e&#347;&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; @post.body.chars.length %&amp;gt; znak&#243;w.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Jedn&#261; z bardziej rewolucyjnych zmian, jest dodanie obs&#322;ugi &lt;strong&gt;&lt;a href="http://www.ryandaigle.com/articles/2006/06/30/whats-new-in-edge-rails-activeresource-is-here"&gt;&lt;span class="caps"&gt;REST&lt;/span&gt;&lt;/a&gt;.&lt;/strong&gt;  (kt&#243;ra zak&#322;ada, &#380;e ka&#380;dy zas&#243;b sieci powinien by&#263; jednoznacznie identyfikowany za pomoc&#261; samego adresu &lt;span class="caps"&gt;URL&lt;/span&gt;). W praktyce oznacza, to znacznie skr&#243;cenie kontroler&#243;w w Railsach po przez wys&#322;anie na ten sam adres r&#243;&#380;nych komend, tzn,. nie tylko &lt;span class="caps"&gt;GET&lt;/span&gt; i &lt;span class="caps"&gt;POST&lt;/span&gt; ale tak&#380;e &lt;span class="caps"&gt;PUT&lt;/span&gt; i &lt;span class="caps"&gt;DELETE&lt;/span&gt;.  Mimo, &#380;e te polecenia s&#261; cze&#347;ci&#261; standardu protoko&#322;u &lt;span class="caps"&gt;HTTP&lt;/span&gt;, wi&#281;kszo&#347;&#263; przegl&#261;darek implementuje tylko &lt;span class="caps"&gt;GET I POST&lt;/span&gt;. W takim wypadku Rails emuluje dzia&#322;anie tych komend poprzez dodawanie do adresu znaku &#347;rednika i polecenia.&lt;/p&gt;


	&lt;p&gt;Plugin &lt;a href="http://weblog.rubyonrails.org/2006/8/1/simply-restful-in-rails-edge"&gt;Simply RESTful&lt;/a&gt; ju&#380; dzia&#322;a i mo&#380;na go u&#380;ywa&#263;. Np. wygeneruj sobie kod nowego, &lt;span class="caps"&gt;REST&lt;/span&gt;&amp;#8217;owego &lt;em&gt;scaffoldingu&lt;/em&gt;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;ruby&lt;/span&gt; &lt;span class="ident"&gt;script&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;generate&lt;/span&gt; &lt;span class="ident"&gt;scaffold_resource&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Oczywi&#347;cie, musisz mie&#263; odpowiedni&#261; najnowsz&#261; wersj&#281; Rails&#243;w, kt&#243;r&#261; najlepiej zainstalowa&#263; za pomoc&#261; gems&#243;w:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="ident"&gt;install&lt;/span&gt; &lt;span class="ident"&gt;rails&lt;/span&gt; &lt;span class="punct"&gt;--&lt;/span&gt;&lt;span class="ident"&gt;source&lt;/span&gt; &lt;span class="ident"&gt;http&lt;/span&gt;&lt;span class="punct"&gt;:/&lt;/span&gt;&lt;span class="regex"&gt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;gems&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rubyonrails&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;org&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Nie przejmuj si&#281; jak wy&#347;wietli ci si&#281; co&#347; w stylu&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Successfully&lt;/span&gt; &lt;span class="ident"&gt;installed&lt;/span&gt; &lt;span class="ident"&gt;rails&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;1.1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;6.5618&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;To jest tymczasowe oznaczenie dla wersji &lt;span class="caps"&gt;RC1&lt;/span&gt;. Jak wyjdzie wersja finalna to b&#281;dzie wy&#347;wietla&#263; si&#281; numer 1.2.&lt;/p&gt;


	&lt;p&gt;Trwaj&#261; jeszcze ko&#324;cowe prace nad &lt;a href="http://www.ryandaigle.com/articles/2006/06/30/whats-new-in-edge-rails-activeresource-is-here"&gt;Active Resource&lt;/a&gt;, modu&#322;em obs&#322;uguj&#261;cym &lt;span class="caps"&gt;REST&lt;/span&gt; i nowy spos&#243;b mapowania.&lt;/p&gt;


	&lt;p&gt;I ostatnia wiadomo&#347;&#263;, nadchodz&#261;ce w grudniu, drugie wydanie ksi&#261;&#380;ki &lt;a href="http://www.pragmaticprogrammer.com/titles/rails/index.html"&gt;Agile Web Development in Rails&lt;/a&gt; powinno wi&#281;kszo&#347;&#263; tych zmian uwzgl&#281;dnia&#263;, bo ksi&#261;&#380;ka jest pisana z za&#322;o&#380;eniem &#380;e u&#380;ywany jest Edge Rails (czyli najnowsza wersja z repozytorium &lt;span class="caps"&gt;SVN&lt;/span&gt;).&lt;/p&gt;</description>
      <pubDate>Sat, 25 Nov 2006 14:52:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:938bedec-dc6b-4d2a-9931-707270079dd5</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/11/25/ruby-on-rails-1-2-rc1</link>
      <category>Ruby on Rails</category>
      <category>rails</category>
    </item>
    <item>
      <title>Nginx - Apache killer</title>
      <description>&lt;p&gt;W ostatnim artykule (&lt;a href="http://blog.zabiello.com/articles/2006/10/29/railsy-lighttpd-czy-apache-2-2-x"&gt;Railsy: Lighttpd czy Apache 2.2.x?&lt;/a&gt;) por&#243;wnywa&#322;em najbardziej popularne serwery &lt;span class="caps"&gt;HTTP&lt;/span&gt; dla &lt;a href="http://rubyonrails.org"&gt;Rails&#243;w&lt;/a&gt;. Zaintrygowany paroma &lt;a href="http://blog.zabiello.com/articles/2006/10/29/railsy-lighttpd-czy-apache-2-2-x#comments"&gt;wpisami w blogu&lt;/a&gt; postanowi&#322;em przyjrze&#263; si&#281; dosy&#263; ma&#322;o znanemu serwerowi &lt;span class="caps"&gt;HTTP&lt;/span&gt; kt&#243;ry zaczyna zdobywa&#263; coraz wi&#281;cej uwagi na Zachodzie. Chodzi o ultraszybki serwer &lt;a href="http://nginx.net"&gt;nginx&lt;/a&gt; napisany przez rosyjskiego programist&#281; Igora Sysojewa.&lt;/p&gt;


	&lt;p&gt;Na pierwszy b&#243;j poszed&#322; prosty test wy&#347;wietlenia &amp;#8220;Hello World!&amp;#8221; Na u&#380;ywanym przeze mnie serwerze dedykowanym (Athlon 64 3000+, 1GB &lt;span class="caps"&gt;RAM&lt;/span&gt;, Linux Ubuntu 64bit) dla 100 tys. zapyta&#324; (musia&#322;em u&#380;y&#263; a&#380; tyle, bo serwer jest za szybki na mniejsz&#261; liczb&#281; zapyta&#324;) uzyska&#322;em nast&#281;puj&#261;ce wyniki (dla polecenia &amp;#8220;ab -n 100000 -c 1 http://localhost&amp;#8221;):&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Apache 2.2.3 = 4439 req/s&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt; Lighttpd 1.4.11 = 7150 req/s&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt; Nginx 0.4.12 = 8700 req/s&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Co prawda Nginx wykazuje mia&#380;dz&#261;c&#261; przewag&#281; wydajno&#347;ci nad Apachem ale, z racji tego, &#380;e u&#380;ywam Lighttpd, kt&#243;ry co prawda odstaje od Nginxa ale nie a&#380; tak, postanowi&#322;em na razie zaczeka&#263; z ewentualn&#261; migracj&#261;.&lt;/p&gt;


	&lt;p&gt;Okaza&#322;o si&#281; jednak, &#380;e b&#281;d&#281; musia&#322; przeprowadzi&#263; tak&#261; migracj&#281; szybciej ni&#380; bym chcia&#322;. Co&#347; z&#322;ego zacz&#281;&#322;o si&#281; dzia&#263; z Ligthttpd. Po paru godzinach pracy, przestawa&#322; odpowiada&#263; na zapytania a nawet w og&#243;le proces znika&#322; z pami&#281;ci. Ki diabe&#322;? Trudno powiedzie&#263;, nie mam czasu aby analizowa&#263; dok&#322;adniej problem. Jedyne co pomaga&#322;o to regularny restart Lighttpd. Troch&#281; g&#322;upie rozwi&#261;zanie.  Postanowi&#322;em zatem zrobi&#263; wcze&#347;niejsz&#261; migracj&#281; do Nginxa. Wg &lt;a href="http://survey.netcraft.com/Reports/0609/byserver/nginx/index.html"&gt;statystyk Netcraftu&lt;/a&gt; z Nginxa korzysta ju&#380; ponad 90 tys. domen. Wydaje si&#281; to wystarczaj&#261;c&#261; ilo&#347;ci&#261; aby mo&#380;na by&#322;o uzna&#263; ten serwer za stabilny.&lt;/p&gt;


	&lt;p&gt;Jednak&#380;e moja migracja ma pewn&#261; trudno&#347;&#263;. U&#380;ywam bowiem r&#243;wnocze&#347;nie &lt;a href="http://php.net"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/a&gt;, &lt;a href="djangoproject.com"&gt;Django&lt;/a&gt;, &lt;a href="http//rubyonrails.org"&gt;Rails&lt;/a&gt; i &lt;a href="http://zope.org"&gt;Zope&lt;/a&gt; (&#347;ci&#347;lej: &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt;). Czyli ca&#322;kiem niez&#322;a mieszanka aplikacji. &lt;span class="caps"&gt;Z PHP&lt;/span&gt; i Railsami by&#322;o najmniej problem&#243;w, bo przyk&#322;ady konfiguracji s&#261; z grubsza podane w &lt;a href="http://wiki.codemongers.com/Nginx"&gt;Wiki&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Z Plone by&#322;o troszk&#281; gorzej. Musia&#322;em bowiem znale&#378;&#263; odpowiednik mniej wi&#281;cej takiego kodu w Apache:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;RewriteRule&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;^/(.*)$&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 
&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://88.198.15.160:6001/VirtualHostBase/http/apologetyka.com:80/app/VirtualHostRoot/$1&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;  &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;P&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="constant"&gt;L&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;To nie jest zwyk&#322;y rewrite, to jest po&#322;&#261;czenie proxy z rewrite.&lt;/p&gt;


	&lt;p&gt;W Lighttpd (te&#380; si&#281; swego czasu nam&#281;czy&#322;em aby to uzyska&#263;) uzyskuje si&#281; to tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rewrite&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;once&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;^/(.*)$&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/VirtualHostBase/http/apologetyka.com:80/plone/VirtualHostRoot/$1&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="ident"&gt;proxy&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;server&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;
   &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/VirtualHostBase/&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;
     &lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;host&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;88.198.15.160&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;port&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;6001&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;

Troch&#281; pr&#243;b i si&#281; uda&#322;o. Nginx potrzebowa&#322; takiego wpisu:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;location&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="ident"&gt;rewrite&lt;/span&gt; ^&lt;span class="punct"&gt;/(.*)&lt;/span&gt;&lt;span class="global"&gt;$ &lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;VirtualHostBase&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;http&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;apologetyka&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;com&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;span class="number"&gt;80&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;plone&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="constant"&gt;VirtualHostRoot&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="punct"&gt;}&lt;/span&gt;
&lt;span class="ident"&gt;location&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="constant"&gt;VirtualHostBase&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;nginx&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;conf&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;proxy&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conf&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
  &lt;span class="ident"&gt;proxy_pass&lt;/span&gt; &lt;span class="ident"&gt;http&lt;/span&gt;&lt;span class="punct"&gt;:/&lt;/span&gt;&lt;span class="regex"&gt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="number"&gt;88.198&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;15.160&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;span class="number"&gt;6001&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Najtrudniej by&#322;o z konfiguracj&#261; &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; bo opisu do Django na Nginx nie ma ani w  dokumentacji do Django, ani w dokumentacji do NGinxa. Zm&#281;czony eksperymentowaniem napisa&#322;em na list&#281; dyskusyjn&#261; Django i dosta&#322;em ca&#322;kiem po&#380;yteczn&#261; wskaz&#243;wk&#281; odno&#347;nie strony &lt;a href="http://www.python.rk.edu.pl/w/p/django-pod-serwerem-nginx/"&gt;http://www.python.rk.edu.pl/w/p/django-pod-serwerem-nginx/&lt;/a&gt;. Niestety mia&#322;em pecha, bo akurat trafi&#322;em na zmian&#281; wpis&#243;w w &lt;span class="caps"&gt;DNS&lt;/span&gt; i artyku&#322; by&#322; niedost&#281;pny. Uda&#322;o mi si&#281; na szcz&#281;&#347;cie wy&#322;uska&#263; jego kopi&#281; z cache Googli. Autor  mi&#281;dzyczasie podes&#322;a&#322; mi te&#380; pliki z artyku&#322;ami. Zauwa&#380;y&#322;em &#380;e napotka&#322; pewne problemy ze zmuszeniem Django do wy&#347;wietlania statycznej tre&#347;ci. Troch&#281; pod&#322;uba&#322;em w kodzie i problem rozwi&#261;za&#322;em. :)&lt;/p&gt;


	&lt;p&gt;Zauwa&#380;y&#322;em &#380;e Django wy&#347;wietla&#322; mi pliki statyczne w trybie debug. Wynika&#322;o to pewnie z tego, &#380;e w urls.py stosuj&#281; zawsze taki wpis:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;...&lt;/span&gt;
&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;DEBUG&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
  &lt;span class="ident"&gt;urlpatterns&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="ident"&gt;patterns&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="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;^images/(?P&amp;lt;path&amp;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;django.views.static.serve&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;document_root&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;MEDIA_ROOT&lt;/span&gt;&lt;span class="punct"&gt;+'&lt;/span&gt;&lt;span class="string"&gt;/images&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;show_indexes&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;}),&lt;/span&gt;
    &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;^stylesheets/(?P&amp;lt;path&amp;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;django.views.static.serve&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;document_root&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;MEDIA_ROOT&lt;/span&gt;&lt;span class="punct"&gt;+'&lt;/span&gt;&lt;span class="string"&gt;/stylesheets&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;show_indexes&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;}),&lt;/span&gt;
    &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;^javascripts/(?P&amp;lt;path&amp;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;django.views.static.serve&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;document_root&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;MEDIA_ROOT&lt;/span&gt;&lt;span class="punct"&gt;+'&lt;/span&gt;&lt;span class="string"&gt;/javascripts&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;show_indexes&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;}),&lt;/span&gt;
    &lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Dla trybu produkcyjnego (settings.DEBUG=False) trzeba zmusi&#263; serwer &lt;span class="caps"&gt;HTTP&lt;/span&gt; aby si&#281; zajmowa&#322; plikami statycznymi. Django ma tylko przetwarza&#263; Pythona. Mozna to zrobi&#263; np. tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;...&lt;/span&gt;
&lt;span class="ident"&gt;location&lt;/span&gt; ~&lt;span class="punct"&gt;*&lt;/span&gt; ^&lt;span class="punct"&gt;.+\.(&lt;/span&gt;&lt;span class="ident"&gt;jpg&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;jpeg&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;gif&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;png&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;ico&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;css&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;zip&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;tgz&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;gz&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;rar&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;bz2&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;doc&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;xls&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;exe&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;pdf&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;ppt&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;txt&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;tar&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;mid&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;midi&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;wav&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;bmp&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;rtf&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;js&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;mov&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="ident"&gt;access_log&lt;/span&gt;   &lt;span class="ident"&gt;off&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="comment"&gt;# po co mi logi obrazk&#243;w :)&lt;/span&gt;
  &lt;span class="ident"&gt;expires&lt;/span&gt;      &lt;span class="number"&gt;30&lt;/span&gt;&lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; 
&lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="ident"&gt;location&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;nginx&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;conf&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;fastcgi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conf&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
  &lt;span class="ident"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="number"&gt;127.0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="number"&gt;0.1&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;span class="number"&gt;6002&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
  &lt;span class="ident"&gt;fastcgi_pass_header&lt;/span&gt; &lt;span class="constant"&gt;Authorization&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
  &lt;span class="ident"&gt;fastcgi_intercept_errors&lt;/span&gt; &lt;span class="ident"&gt;off&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Gdzie plik fastcgi.conf:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;GATEWAY_INTERFACE&lt;/span&gt;  &lt;span class="constant"&gt;CGI&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="number"&gt;1.1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_SOFTWARE&lt;/span&gt;    &lt;span class="ident"&gt;nginx&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;QUERY_STRING&lt;/span&gt;       &lt;span class="global"&gt;$query_string&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;REQUEST_METHOD&lt;/span&gt;     &lt;span class="global"&gt;$request_method&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;CONTENT_TYPE&lt;/span&gt;       &lt;span class="global"&gt;$content_type&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;CONTENT_LENGTH&lt;/span&gt;     &lt;span class="global"&gt;$content_length&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SCRIPT_NAME&lt;/span&gt;        &lt;span class="global"&gt;$fastcgi_script_name&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;REQUEST_URI&lt;/span&gt;        &lt;span class="global"&gt;$request_uri&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;DOCUMENT_URI&lt;/span&gt;       &lt;span class="global"&gt;$document_uri&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;DOCUMENT_ROOT&lt;/span&gt;      &lt;span class="global"&gt;$document_root&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_PROTOCOL&lt;/span&gt;    &lt;span class="global"&gt;$server_protocol&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;REMOTE_ADDR&lt;/span&gt;        &lt;span class="global"&gt;$remote_addr&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;REMOTE_PORT&lt;/span&gt;        &lt;span class="global"&gt;$remote_port&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_ADDR&lt;/span&gt;        &lt;span class="global"&gt;$server_addr&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_PORT&lt;/span&gt;        &lt;span class="global"&gt;$server_port&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;SERVER_NAME&lt;/span&gt;        &lt;span class="global"&gt;$server_name&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;

&lt;span class="ident"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="constant"&gt;PATH_INFO&lt;/span&gt;          &lt;span class="global"&gt;$fastcgi_script_name&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Plik startowy napisa&#322;em sobie ju&#380; w Pythonie:&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 python&lt;/span&gt;

&lt;span class="ident"&gt;import&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="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;time&lt;/span&gt;
&lt;span class="constant"&gt;DEBUG&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;
&lt;span class="comment"&gt;# All Django project are inside /home/app/django/&lt;/span&gt;

&lt;span class="ident"&gt;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/app/django&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="ident"&gt;projects&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="string"&gt;biblia&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="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;searchers&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;port&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;&lt;span class="number"&gt;6002&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;pidfile&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/var/run/django_searchers.pid&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;children&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="number"&gt;4&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="string"&gt;koran&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="string"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;django_project&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;port&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;&lt;span class="number"&gt;6003&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;pidfile&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/var/run/django_koran.pid&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;children&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;
        &lt;span class="punct"&gt;},&lt;/span&gt;
    &lt;span class="punct"&gt;}&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
    &lt;span class="ident"&gt;project&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;project&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="string"&gt;%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;path&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
    &lt;span class="ident"&gt;appl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;./manage.py runfcgi host=127.0.0.1&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
    &lt;span class="ident"&gt;cmd&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;%s port=%s minspare=1 maxspare=%s pidfile=%s --settings=%s.settings&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;appl&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;port&lt;/span&gt;&lt;span class="punct"&gt;'],&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;children&lt;/span&gt;&lt;span class="punct"&gt;'],&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;pidfile&lt;/span&gt;&lt;span class="punct"&gt;'],&lt;/span&gt; &lt;span class="ident"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;DEBUG&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;cmd&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;system&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;cmd&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
    &lt;span class="ident"&gt;pidfile&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]['&lt;/span&gt;&lt;span class="string"&gt;pidfile&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;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;pidfile&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
        &lt;span class="ident"&gt;cmd&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/bin/kill -TERM %s&lt;/span&gt;&lt;span class="punct"&gt;'&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;pidfile&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="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;DEBUG&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;cmd&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;system&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;cmd&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;unlink&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;pidfile&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;restart&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
    &lt;span class="ident"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sleep&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;start&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;__name__&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;__main__&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;action&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;project&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="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;restart&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="ident"&gt;project&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;projects&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;action&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;
                &lt;span class="ident"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
            &lt;span class="ident"&gt;elif&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;
                &lt;span class="ident"&gt;stop&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
            &lt;span class="ident"&gt;elif&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;restart&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;
                &lt;span class="ident"&gt;restart&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;project&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
            &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
                &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;IndexError&lt;/span&gt;
        &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
            &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;IndexError&lt;/span&gt;
    &lt;span class="ident"&gt;except&lt;/span&gt; &lt;span class="constant"&gt;IndexError&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;Usage: %s {start|stop|restart} {%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;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;0&lt;/span&gt;&lt;span class="punct"&gt;],&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;join&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;projects&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;keys&lt;/span&gt;&lt;span class="punct"&gt;()))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Migracja si&#281; uda&#322;a. Plone, &lt;span class="caps"&gt;PHP&lt;/span&gt;, Django i Rails &#347;migaj&#261; mi teraz na ultraszybkim (i zajmuj&#261;cym ma&#322;o pami&#281;ci!) serwerze Nginx.  Acha, zapomnia&#322;em doda&#263;: Nginx to nie tylko du&#380;a wydajno&#347;&#263; i oszcz&#281;dno&#347;&#263; pami&#281;ci. Nginx ma du&#380;o  modu&#322;&#243;w. Mo&#380;e nie tyle, co Apache, ale znacznie lepiej ni&#380; Lighttpd.&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;BTW&lt;/span&gt;, ciekawie wygl&#261;da tak&#380;e serwer &lt;a href="http://www.cherokee-project.com/"&gt;Cherokee&lt;/a&gt;. Nginx dzia&#322;a tylko pod systemami &lt;span class="caps"&gt;POSIX&lt;/span&gt; (Unix, MacOS-X, Linux, FreeBSD). Cherokee natomiast posiada&amp;#8230; binarn&#261; instalacj&#281; pod Windows!  Ale o tym mo&#380;e napisz&#281; co&#347; innym razem. :)&lt;/p&gt;</description>
      <pubDate>Wed, 08 Nov 2006 00:47:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:779dd78c-3248-4818-a9e4-1b2a20f8d7cb</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/11/08/nginx-apache-killer</link>
      <category>Ruby on Rails</category>
      <category>Django</category>
      <category>nginx</category>
      <category>django</category>
      <category>rails</category>
      <category>cherokee</category>
      <category>fastcgi</category>
    </item>
    <item>
      <title>RadRails i snippety TextMate</title>
      <description>&lt;p&gt;&lt;a href="http://www.radrails.org/"&gt;RadRails&lt;/a&gt;, zintegrowany edytor dla Rubiego i Rails&#243;w zaczyna coraz bardziej niwelowa&#263; wcze&#347;niejsze zachwyty nad komercyjnym edytorem &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt;. Nie do&#347;&#263;, &#380;e jest darmowy i dzia&#322;a na Windows, MacOS-X i Linuksie (TextMate tylko na MacOS-X), to na dodatek uzyska&#322; to, co do tej pory by&#322;o g&#322;&#243;wn&#261; atrakcj&#261; TextMate &amp;#8211; &lt;a href="http://radrailstemplates.com/"&gt;makra przy&#347;pieszaj&#261;ce pisanie kodu, czyli tzw. snippety&lt;/a&gt;. RadRaila ma ju&#380; przygotowanych 199 snippet&#243;w do Rubiego i 50 do &lt;span class="caps"&gt;RHTML&lt;/span&gt;!&lt;/p&gt;


	&lt;p&gt;Do tego wystarczy &lt;a href="http://drnicwilliams.com/2006/08/08/textmate-theme-for-radrails/"&gt;dorzuci&#263; kolorowanie&lt;/a&gt; kodu a&amp;#8217;la TextMate i RadRails ma ju&#380; wszystko (no mo&#380;e do pe&#322;ni doskona&#322;o&#347;ci brakuje mu uzupe&#322;niania kodu tak, jak to robi komercyjny &lt;a href="http://activestate.com/Products/Komodo/?tn=1"&gt;edytor Komodo&lt;/a&gt;)&lt;/p&gt;</description>
      <pubDate>Wed, 08 Nov 2006 00:13:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:0e93ec9d-49e8-4a45-aa9e-374055834917</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/11/08/radrails-i-snippety-textmate</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>radrails</category>
      <category>ruby</category>
      <category>rails</category>
      <category>edytory</category>
    </item>
    <item>
      <title>Railsy: Lighttpd czy Apache 2.2.x?</title>
      <description>&lt;p&gt;Odno&#347;nie u&#380;ycia Rails&#243;w w celu produkcyjnym, du&#380;o si&#281; zmieni&#322;o od czasu pojawienia si&#281; &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrela&lt;/a&gt; &amp;#8211; ma&#322;ego, ale dosy&#263; szybkiego serwera napisanego w Ruby i C.  Nast&#281;puje generalne odej&#347;cie od podpinania kilku proces&#243;w FastCGI do Rubiego z r&#243;&#380;nych powod&#243;w.  W drugim wydaniu &lt;a href="http://www.pragmaticprogrammer.com/titles/rails/index.html"&gt;Agile Web Development in Rails&lt;/a&gt; autorzy przyznali, &#380;e pr&#243;bowali r&#243;&#380;nych opcji u&#380;ycia modu&#322;u FastCGI. Zawsze ostatecznie by&#322;y jakie&#347; problemy.&lt;/p&gt;


	&lt;p&gt;Aktualnie zalecanym podej&#347;ciem jest u&#380;ycie szybkiego serwera &lt;span class="caps"&gt;HTTP&lt;/span&gt; (&lt;a href="http://mongrel.rubyforge.org/docs/lighttpd.html"&gt;Lighttpd&lt;/a&gt;, &lt;a href="http://mongrel.rubyforge.org/docs/apache.html"&gt;Apache&lt;/a&gt; lub &lt;a href="http://mongrel.rubyforge.org/docs/litespeed.html"&gt;LiteSpeed&lt;/a&gt;) na froncie do obs&#322;ugi statycznych plik&#243;w (g&#322;&#243;wnie obrazki, style kaskadowe i pliki Javascript).  Aplikacj&#281; RoR  nale&#380;y uruchomi&#263; za pomoc&#261; kilku proces&#243;w Mongrela (nie jak wcze&#347;niej: kilka proces&#243;w FastCGI). A tym, co zepnie je z serwerem &lt;span class="caps"&gt;HTTP&lt;/span&gt; jest modu&#322; rozk&#322;adaj&#261;cy ruch (load balancing).&lt;/p&gt;


	&lt;p&gt;Niestety, okaza&#322;o si&#281; &#380;e w wypadku Lighttpd ten modu&#322; zawiera b&#322;&#281;dy. Z kolei nowy Apache 2.2 posiada dobrze dzia&#322;aj&#261;cy modu&#322; load balancingu. Spowodowa&#322;o to zrezygnowanie przez wielu z Lighttpd na rzecz nowego Apache 2.2.x.&lt;/p&gt;


	&lt;p&gt;Z racji tego, &#380;e mam troch&#281; swobody w doborze technologii w pracy, postawi&#322;em serwer na nowym Apache&amp;#8217;u. Aplikacje Rails&#243;w podpinamy za pomoc&#261; mongrela i wbudowanego w Apache modu&#322;u load_balancer. Dzia&#322;a faktycznie sprawnie.&lt;/p&gt;


	&lt;p&gt;Czy to znaczy, &#380;e Lighttpd nie ma sensu u&#380;ywa&#263;? Sk&#261;d! W wersji 1.5 maj&#261; ju&#380; mie&#263; naprawiony modu&#322; load balancingu. Ale nawet i bez tego, istnieje bardzo dobry, ma&#322;y i szybki load balancer &amp;#8211; &lt;a href="http://mongrel.rubyforge.org/docs/pound.html"&gt;Pound&lt;/a&gt;. Skuszony jednak potrzeb&#261; eksperymentowania oraz nabytym niedawno &lt;a href="http://hetzner.de/rootserver_en.html"&gt;serwerem dedykowanym&lt;/a&gt; (w miejsce wcze&#347;niejszego &lt;a href="http://tektonic.net/unmanaged.html"&gt;&lt;span class="caps"&gt;VPS&lt;/span&gt;&amp;#8217;a&lt;/a&gt;) postanowi&#322;em przenie&#347;&#263; wszystkie swoje prywatne serwisy (a jest tego sporo) z Lighttpd do Apache 2.2.3. Musia&#322;em przenie&#347;&#263; dwie aplikacje Rails, dwie aplikacje Django, dwie aplikacje &lt;span class="caps"&gt;PHP 5&lt;/span&gt;.1 oraz jedn&#261; du&#380;a aplikacj&#281; Zope/Plone. I jak wra&#380;enia?&lt;/p&gt;


	&lt;p&gt;Ot&#243;&#380;, po 2 tygodniach u&#380;ywania, stwierdzi&#322;em, &#380;e to nie ma sensu. Apache po&#380;era za du&#380;o pami&#281;ci. Dzieje si&#281; dok&#322;adnie tak, jak &lt;a href="http://blog.zabiello.com/articles/2006/04/24/lightpd-fastcgi-vs-apache-mod_php-mod_python"&gt;pisa&#322;em wcze&#347;niej&lt;/a&gt;. Nie mog&#322;em u&#380;y&#263; trybu wielow&#261;tkowego, nie tyle ze wzgl&#281;du na &lt;span class="caps"&gt;PHP&lt;/span&gt; ale ze wzgl&#281;dy na Django! Napisali bowiem, &#380;e nie nale&#380;y tego trybu u&#380;ywa&#263; w wypadku ich frameworka. Django nie jest wielow&#261;tkowy. Musia&#322;em wi&#281;c prze&#322;&#261;czy&#263; Apache z trybu worker na prefork. Zgodnie z obawami, ka&#380;dy fork musia&#322; marnowa&#263; pami&#281;&#263; na modu&#322; mod_php i mod_python nawet jak to nie ma sensu (np. podczas obs&#322;ugi obrazk&#243;w). Na dodatek nie mog&#322;em co&#347; uruchomi&#263; jednej aplikacji Django. Kompletnie nie wiem dlaczego. Druga by&#322;a prawie identycznie skonfigurowana i dzia&#322;a&#322;a.&lt;/p&gt;


	&lt;p&gt;Wr&#243;ci&#322;em zatem z powrotem do Lighttpd , Pounda i Mongrela (dla RoR) i FastCGI (dla Django i &lt;span class="caps"&gt;PHP&lt;/span&gt;). Efekty by&#322;y bardzo widoczne: zwolni&#322;o mi si&#281; ponad 200 MB pami&#281;ci. Mo&#380;e to nie ma znaczenia w pracy, gdzie mamy 2GB ale ja mam tylko 1GB i musz&#281; jeszcze uruchomi&#263; zasobo&#380;erny Plone.&lt;/p&gt;


	&lt;p&gt;Dok&#322;adniej wszystkie sprawdzone i dzia&#322;aj&#261;ce konfiguracje opisz&#281; w powstaj&#261;cej ksi&#261;&#380;ce o Railach. Moja ostateczna konlkluzja jest taka: je&#347;li zale&#380;y ci na oszcz&#281;dzeniu pami&#281;ci &amp;#8211; wybieraj Lighttpd. Je&#347;li nie jest to kluczowa sprawa, a potrzebujesz jakie&#347; specjalne, dodatkowe modu&#322;y (kt&#243;rych Apache ma pe&#322;no) nowy Apache 2.2 spe&#322;ni twe oczekiwania.&lt;/p&gt;</description>
      <pubDate>Sun, 29 Oct 2006 15:53:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ae8c5663-3e1f-48fd-b086-a090a1cee206</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/10/29/railsy-lighttpd-czy-apache-2-2-x</link>
      <category>Ruby on Rails</category>
      <category>apache</category>
      <category>lighttpd</category>
      <category>rails</category>
      <category>mod_python</category>
      <category>fastcgi</category>
    </item>
  </channel>
</rss>
