<?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: Ruby, Python vs Java,C++</title>
    <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Ruby, Python vs Java,C++</title>
      <description>&lt;p&gt;Od czasu do czasu na grupach dyskusyjnych maj&#261; miejsce przepychanki na temat wy&#380;szo&#347;ci jednych j&#281;zyk&#243;w nad drugimi. Czasami takie dyskusje wywo&#322;uj&#261; sporo emocji. Zm&#281;czony ci&#261;g&#322;ymi og&#243;lnikowymi sloganami o tym jak to w C++ lub Javie pisze si&#281; lepiej i szybciej (dobry dowcip) programy ni&#380; w j&#281;zykach dynamicznych takich jak Python czy Ruby, postanowi&#322;em rzuci&#263; ma&#322;e wyzwanie mi&#322;o&#347;nikom tych j&#281;zyk&#243;w.&lt;/p&gt;


	&lt;p&gt;Zadanie polega&#322;o na napisaniu wyszukiwarki do polskiego tekstu Koranu (w sumie nie widzia&#322;em nic takiego, st&#261;d pomys&#322;). Aby nie by&#322;o za banalnie, trzeba by&#322;o napisa&#263; taki kod kt&#243;ry by automatycznie wyssa&#322; przek&#322;ad Koranu ze strony internetowej &lt;a href="http://www.planetaislam.com/koran.html"&gt;http://www.planetaislam.com/koran.html&lt;/a&gt; nast&#281;pnie przetworzy&#322; go i wstawi&#322; do bazy mysql oraz prze&#322;&#261;czy&#322; si&#281; w tryb wyszukiwania fraz.&lt;/p&gt;


	&lt;p&gt;Wyzwanie zosta&#322;o przyj&#281;te i&amp;#8230; mijaj&#261; tygodnie za tygodniami a moi dyskutanci nie s&#261; w stanie przedstawi&#263; &#380;adnego dzia&#322;aj&#261;cego kodu w Javie ani w C++. Tak to teoria zderza si&#281; z praktyk&#261;. Oto napr&#281;dce stworzona wersja w Ruby:&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;mysql&lt;/span&gt;&lt;span class="punct"&gt;'&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;open-uri&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="attribute"&gt;@przeklad&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;bielawski&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="attribute"&gt;@conn&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mysql&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="string"&gt;localhost&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;login&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;has&#322;o&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="number"&gt;3308&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;download&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;max_chapter&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;15&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;clean_html&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;src&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# nie znam biblioteki czyszczacej html wiec robie to regexem&lt;/span&gt;
    &lt;span class="ident"&gt;src&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gsub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;&amp;amp;nbsp;&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;gsub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;(&amp;lt;[^&amp;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="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;gsub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;[ ]{2,}&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;gsub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;&amp;amp;#&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;gsub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span class="punct"&gt;/,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&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="attribute"&gt;@lines&lt;/span&gt; &lt;span class="punct"&gt;=&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;upto&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;max_chapter&lt;/span&gt;&lt;span class="punct"&gt;)&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;sura&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;url&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;sprintf&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;http://www.planetaislam.com/koran/%s/%03d.htm&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="attribute"&gt;@przeklad&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;src&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;clean_html&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;url&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;rows&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;src&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;scan&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="comment"&gt;# wyluskuj wersety i numery rozdzialow&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;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;row&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="attribute"&gt;@lines&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;sprintf&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;%s:%s %s&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;row&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;row&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;gsub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;[&lt;span class="escape"&gt;\s&lt;/span&gt;]{2,}&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;strip&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;f&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;new&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{@przeklad}&lt;/span&gt;.txt&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;w&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="comment"&gt;# zapisuje sobie do pliku&lt;/span&gt;
    &lt;span class="attribute"&gt;@lines&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;line&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;write&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{line}&lt;/span&gt;&lt;span class="escape"&gt;\n&lt;/span&gt;&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;def &lt;/span&gt;&lt;span class="method"&gt;loaded_db&lt;/span&gt;
  &lt;span class="attribute"&gt;@conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;list_tables&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="attribute"&gt;@przeklad&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# Sprawdzam czy juz istnieje tabela z danymi.&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;load_db&lt;/span&gt;
  &lt;span class="attribute"&gt;@conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;DROP TABLE IF EXISTS &lt;span class="expr"&gt;#{@przeklad}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
  &lt;span class="attribute"&gt;@conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;CREATE TABLE &lt;span class="expr"&gt;#{@przeklad}&lt;/span&gt; (
    id int(10) unsigned NOT NULL auto_increment,
    sura varchar(255) NOT NULL,
    nr int(10) unsigned NOT NULL,
    verse text NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
  &lt;span class="attribute"&gt;@conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SET CHARACTER SET latin2&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
  &lt;span class="attribute"&gt;@lines&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;line&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;nr&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;verse&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;line&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;scan&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="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
    &lt;span class="ident"&gt;verse&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gsub!&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&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="comment"&gt;# uzywam topornego sql bo cos mi metoda prepare nie dziala, moze zla biblioteka?&lt;/span&gt;
    &lt;span class="attribute"&gt;@conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;INSERT INTO &lt;span class="expr"&gt;#{@przeklad}&lt;/span&gt; (sura, nr, verse) VALUES(&lt;span class="expr"&gt;#{sura}&lt;/span&gt;, &lt;span class="expr"&gt;#{nr}&lt;/span&gt;, '&lt;span class="expr"&gt;#{verse}&lt;/span&gt;')&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;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;search_result&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;phrase&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="attribute"&gt;@conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SET CHARACTER SET cp1250&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
  &lt;span class="ident"&gt;sql&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;SELECT * FROM &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="attribute"&gt;@przeklad&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; WHERE verse LIKE '%&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;phrase&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="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="attribute"&gt;@conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;while&lt;/span&gt; &lt;span class="ident"&gt;row&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fetch_row&lt;/span&gt;
    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;sprintf&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Sura %s,%s %s&lt;span class="escape"&gt;\n&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;row&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;row&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;row&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="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="global"&gt;$0&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="constant"&gt;__FILE__&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;loaded_db&lt;/span&gt;          
    &lt;span class="ident"&gt;download&lt;/span&gt;
    &lt;span class="ident"&gt;load_db&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="ident"&gt;search_result&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;kobieta&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;A oto ostateczna wersja w Pythonie:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!python&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;
Wyszukiwarka do Koranu

Przyk&#322;ady uzycia:
    python koran.py --txt zabijajcie
    python koran.py --sura=ix
    python koran.py --sura=9 --nr=4
    python koran.py --sura=IX --nr=4    

Wymagania:
    interpreter Pythona 2.4 + standardowe biblioteki
    pythonowska biblioteka MySQLdb
    serwer MySQL 4.1

Autor:
    Jaros&#322;aw Zabie&#322;&#322;o http://zabiello.com
&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;HTMLParser&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;re&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;urllib2&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;from&lt;/span&gt; &lt;span class="ident"&gt;optparse&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;OptionParser&lt;/span&gt;
&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Koran(object):&lt;/span&gt;
    &lt;span class="ident"&gt;dbname&lt;/span&gt; &lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;koran&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;przeklad&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;bielawski&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
    &lt;span class="ident"&gt;lines&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;__init__&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
        &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conn&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&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="ident"&gt;host&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;localhost&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
            &lt;span class="ident"&gt;port&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;3308&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
            &lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;login&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
            &lt;span class="ident"&gt;passwd&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;has&#322;o&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
            &lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dbname&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;download&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;max_chapter&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;15&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Sciagam dane z internetu i je troszke oczyszczam z nadmiarowego kodu html&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;html_clean&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;src&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
            &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;HtmlStripper&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
            &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;feed&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;src&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
            &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;src&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;get_fed_data&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;            
        &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;lines&lt;/span&gt; &lt;span class="punct"&gt;=&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;i&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;xrange&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;max_chapter&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
            &lt;span class="ident"&gt;url&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;http://www.planetaislam.com/koran/%s/%03d.htm&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="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
            &lt;span class="ident"&gt;src&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt;  &lt;span class="ident"&gt;html_clean&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;urllib2&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;urlopen&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;url&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="comment"&gt;# pobrany caly plik&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;re&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;findall&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;(\d+?)[. ]([^\d]+)&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;src&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# wyluskuj wersety i numery rozdzialow            &lt;/span&gt;
            &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;row&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;rows&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
                &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;lines&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;append&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;%s:%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;i&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;row&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;re&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="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;[\s]{2,}&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;row&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;strip&lt;/span&gt;&lt;span class="punct"&gt;()))&lt;/span&gt;
        &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;lines&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;unicode&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;line&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;iso-8859-2&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;encode&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;utf-8&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;line&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;lines&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;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&lt;/span&gt;&lt;span class="punct"&gt;+'&lt;/span&gt;&lt;span class="string"&gt;.txt&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;w&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;  &lt;span class="comment"&gt;# zapisuje sobie kopie na dysk&lt;/span&gt;
        &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;line&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;lines&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;write&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;%s\n&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="ident"&gt;line&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;close&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;loaded_db&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Sprawdzam czy juz istnieje tabela z danymi.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
        &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SHOW TABLES&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&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;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fetchall&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;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;row&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="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;row&lt;/span&gt; &lt;span class="keyword"&gt;in&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;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SELECT COUNT(*) FROM %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="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt; &lt;span class="ident"&gt;przeklad&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
            &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fetchone&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="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;False&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;load_db&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&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;Zakladam ze stworzono baze o nazwie self.dbname i laduje dane do tabeli self.przeklad&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="ident"&gt;sqls&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;DROP TABLE IF EXISTS %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="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&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="string"&gt;CREATE TABLE %s (
                id int(10) unsigned NOT NULL auto_increment,
                sura varchar(255) NOT NULL,
                nr int(10) unsigned NOT NULL,
                verse text NOT NULL,
                PRIMARY KEY (id)
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci&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="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cursor&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;sql&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;sqls&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="comment"&gt;# odtwarzam baze&lt;/span&gt;
            &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SET CHARACTER SET UTF8&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
        &lt;span class="ident"&gt;sql&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;INSERT INTO &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;+&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&lt;/span&gt;&lt;span class="punct"&gt;+&amp;quot;&lt;/span&gt;&lt;span class="string"&gt; (sura, nr, verse) VALUES (%s,%s,%s)&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;line&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;lines&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
            &lt;span class="ident"&gt;found&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;re&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;match&lt;/span&gt;&lt;span class="punct"&gt;(&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;(\d+?):(\d+?) (.+)&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;line&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;found&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
                &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;found&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;groups&lt;/span&gt;&lt;span class="punct"&gt;())&lt;/span&gt;
        &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;close&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;set_i18n&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;phrase&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;None&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;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;platform&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;win32&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="comment"&gt;# zakladam ze bede wyswietlal wyniki w okienku konsoli, czyli kodowanie dosowe&lt;/span&gt;
            &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;phrase&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
                &lt;span class="ident"&gt;phrase&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;unicode&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;phrase&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;cp1250&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;encode&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;cp852&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
            &lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SET CHARACTER SET cp852&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
        &lt;span class="ident"&gt;elif&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;platform&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;linux&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;
            &lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SET CHARACTER SET latin2&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
        &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;phrase&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;search_result&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;phrase&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Wyszukuje wersetow wg prostej zasady: znadz wszystkie wersety w ktorych gdziekolwiek
        wystepuje fraza phrase. Dla wygody dodalem obsluge polskich znakow spod konsoli dosowej
        i linuksa.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
        &lt;span class="ident"&gt;phrase&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set_i18n&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;phrase&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;sql&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;SELECT * FROM &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;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&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; WHERE verse LIKE '%&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;phrase&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="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;sql&lt;/span&gt;
        &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sql&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;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fetchall&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
        &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;close&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;Znaleziono %d wersetow:&lt;span class="escape"&gt;\n&lt;/span&gt;&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;len&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="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;row&lt;/span&gt; &lt;span class="keyword"&gt;in&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;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Sura %s,%s %s&lt;span class="escape"&gt;\n&lt;/span&gt;&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;int_to_roman&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;int&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;row&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;row&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;row&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="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;show_verse&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;nr&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;context&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;c&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
        &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set_i18n&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;c&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;sura&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;isalpha&lt;/span&gt;&lt;span class="punct"&gt;():&lt;/span&gt;
            &lt;span class="ident"&gt;sura&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;roman_to_int&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sura&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;sura&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="ident"&gt;nr&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="comment"&gt;# wyswietl pojedyncza sure&lt;/span&gt;
            &lt;span class="ident"&gt;sql&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;SELECT verse FROM &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;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&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; WHERE sura=%s AND nr=%s&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;nr&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
            &lt;span class="ident"&gt;verse&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fetchone&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;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Sura %s,%s %s&lt;span class="escape"&gt;\n&lt;/span&gt;&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;int_to_roman&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;int&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;)),&lt;/span&gt; &lt;span class="ident"&gt;nr&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;verse&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="comment"&gt;# wyswietl cala sure&lt;/span&gt;
            &lt;span class="ident"&gt;sql&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;SELECT nr, verse FROM &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;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;przeklad&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; WHERE sura=%s ORDER BY nr&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;sura&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;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fetchall&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;row&lt;/span&gt; &lt;span class="keyword"&gt;in&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;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Sura %s,%s %s&lt;span class="escape"&gt;\n&lt;/span&gt;&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;int_to_roman&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;int&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;)),&lt;/span&gt; &lt;span class="ident"&gt;row&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;row&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;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;close&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;HtmlStripper(HTMLParser.HTMLParser):&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;src: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440481&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;__init__&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
        &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;reset&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
        &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fed&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;handle_data&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
        &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fed&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;append&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;d&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;get_fed_data&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
        &lt;span class="keyword"&gt;return&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="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fed&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;int_to_roman&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;src: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81611&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;!=&lt;/span&gt; &lt;span class="ident"&gt;type&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="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;TypeError&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;expected integer, got %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="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&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="number"&gt;0&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;input&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="number"&gt;4000&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;ValueError&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;Argument must be between 1 and 3999&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;   
    &lt;span class="ident"&gt;ints&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1000&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;900&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="number"&gt;500&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;400&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="number"&gt;90&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;50&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="number"&gt;40&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="number"&gt;9&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;   &lt;span class="number"&gt;5&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="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;nums&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;M&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;  &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;CM&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;D&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;CD&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;XC&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;L&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;XL&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;X&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;IX&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;V&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;IV&lt;/span&gt;&lt;span class="punct"&gt;','&lt;/span&gt;&lt;span class="string"&gt;I&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="ident"&gt;result&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="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;i&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;range&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;len&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;ints&lt;/span&gt;&lt;span class="punct"&gt;)):&lt;/span&gt;
        &lt;span class="ident"&gt;count&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;int&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="ident"&gt;ints&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
        &lt;span class="ident"&gt;result&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="ident"&gt;nums&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="ident"&gt;count&lt;/span&gt;
        &lt;span class="ident"&gt;input&lt;/span&gt; &lt;span class="punct"&gt;-=&lt;/span&gt; &lt;span class="ident"&gt;ints&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="ident"&gt;count&lt;/span&gt;
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;result&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;roman_to_int&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;src: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81611&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;!=&lt;/span&gt; &lt;span class="ident"&gt;type&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="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;TypeError&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;expected string, got %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="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;input&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;upper&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
    &lt;span class="ident"&gt;nums&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;M&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;D&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;L&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;X&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;V&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;I&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;
    &lt;span class="ident"&gt;ints&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1000&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;500&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;50&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="number"&gt;5&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;places&lt;/span&gt; &lt;span class="punct"&gt;=&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;c&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;input&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;c&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;nums&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;ValueError&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;input is not a valid roman numeral: %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="ident"&gt;input&lt;/span&gt;
    &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;i&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;range&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;len&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;)):&lt;/span&gt;
        &lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
        &lt;span class="ident"&gt;value&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;ints&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;nums&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;c&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;nextvalue&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;ints&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;nums&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;i&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="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;nextvalue&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
                &lt;span class="ident"&gt;value&lt;/span&gt; &lt;span class="punct"&gt;*=&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;1&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;pass&lt;/span&gt;
        &lt;span class="ident"&gt;places&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;append&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;sum&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
    &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;n&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;places&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
        &lt;span class="ident"&gt;sum&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="ident"&gt;n&lt;/span&gt;
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;sum&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;appl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Koran&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;appl&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;loaded_db&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;'&lt;/span&gt;&lt;span class="string"&gt;Pobieram dane z internetu....&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;download&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;'&lt;/span&gt;&lt;span class="string"&gt;Wkladam dane do bazy...&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;load_db&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
    &lt;span class="ident"&gt;parser&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;OptionParser&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
    &lt;span class="ident"&gt;parser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_option&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;--txt&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;dest&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;txt&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;help&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;wyszukiwana fraza&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="ident"&gt;parser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_option&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;--sura&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;dest&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;help&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;numer Sury (liczba dziesietna lub rzymska)&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="ident"&gt;parser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add_option&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;--nr&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;dest&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;nr&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;help&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;numer wersetu dla Sury&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;parser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse_args&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;options&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;appl&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;search_result&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;options&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;elif&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sura&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;show_verse&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sura&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nr&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="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Wywolaj z parametrem --help&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W mi&#281;dzyczasie zd&#261;&#380;y&#322;em nawet wykorzysta&#263; sw&#243;j kod Pythona aby doda&#263; go jako &lt;a href="http://apologetyka.com/koran"&gt;modu&#322; do Plone&lt;/a&gt;. :)&lt;/p&gt;</description>
      <pubDate>Mon, 14 Nov 2005 21:41:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:0b3e6f14-57c8-406f-9b2b-5c61abd094b0</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c</link>
      <category>Python</category>
      <category>Ruby</category>
      <category>python</category>
      <category>ruby</category>
      <category>java</category>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by dmilith</title>
      <description>&lt;p&gt;@mario: podejrzewam &#380;e nie masz 64bitowego systemu. wystarczy &#380;e odpalisz np Netbeans&amp;#8217;a 6.1 na 64bit javie. ( u mnie 400MB RAM, po do&#322;adowaniu parunastu plugin&#243;w dochodzi do 800MB ). To np mo&#380;e znaczy&#263; &#380;e Java jest ci&#281;&#380;ka. Nie odpali&#322;bym niczego powa&#380;nego na 64bit javie na serwerze kt&#243;ry nie ma 4GB RAMu..
poza tym wypada wspomnie&#263; o g&#322;upim imho zarz&#261;dzaniu GC w javie, co np dyskwalifikuje ten j&#281;zyk do zastosowa&#324; &amp;#8220;realtime&amp;#8221; i powoduje &amp;#8220;losowe zamulanie si&#281; aplikacji&amp;#8221; od czasu do czasu.&lt;/p&gt;


	&lt;p&gt;co do rozwoju Rubiego. wystarczy spojrze&#263; na r&#243;&#380;nic&#281; w tym, czym by&#322; Ruby w momencie tworzenia tego postu, a czym jest teraz. i przede wszystkim: jakie ma wsparcie du&#380;ych organizacji oraz ile firm nagle przesz&#322;o na j&#281;zyki dynamiczne. my&#347;l&#281; &#380;e wielu fanatykom j&#281;zyk&#243;w programowania typu java/ C++ jest coraz bardziej g&#322;upio ;} i dobrze&lt;/p&gt;</description>
      <pubDate>Fri, 11 Jul 2008 19:19:23 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:3e55ae54-0a32-42dc-a77c-36a5fd08f6ce</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1741</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by moro</title>
      <description>&lt;p&gt;&amp;#8220;mi jezyk w programowaniu nie przeszkadza&amp;#8221; &amp;#8211; trzeba dobrac jezyk do zadania a nie uzywac jednego &amp;#8220;najlepszego&amp;#8221; jezyka do wszystkiego. Do pisania aplikacji serwerowych najlepszy bedzie erlang, do sterownikow i systemow embedded C itp. Nie ma sie co spierac, kazdy jezyk ma swoje zastosowanie.&lt;/p&gt;</description>
      <pubDate>Thu, 10 Jul 2008 20:37:04 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:00e040bf-0c90-4dbd-beac-4030eab8cc62</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1738</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@mario: Przeczytaj ze zrozumieniem poprzedni post.&lt;/p&gt;</description>
      <pubDate>Tue, 08 Jul 2008 13:59:43 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:181718ba-9758-466d-a695-bd2616a3cb21</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1737</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by mario</title>
      <description>&lt;p&gt;&amp;#8220;Z tym JVM to ty co&#347; mieszasz.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;Nie mieszam tylko nie pasuje mi u&#380;ywanie bibliotek Javy w Rubym czy Pythonie.&lt;/p&gt;


	&lt;p&gt;PS. Nadal nie wyja&#347;ni&#322;e&#347; co to znaczy, &#380;e Java jest ci&#281;&#380;ka&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Tue, 08 Jul 2008 12:25:39 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:8fc8b54a-ff4d-4181-b0be-2b530408a67a</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1736</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@mario: Ad.1 Dziwne, &#380;e nic nie wiesz. 
W necie jest pe&#322;no informacji na ten temat. Poczytaj sobie mo&#380;e &lt;a href="http://helion.pl/ksiazki/moreja.htm" rel="nofollow"&gt;Wi&#281;cej ni&#380; Java&lt;/a&gt; (bardzo fajnie si&#281; j&#261; czyta). Zobacz te&#380;: &lt;a href="http://www.onjava.com/pub/a/onjava/2005/11/16/ruby-the-rival.html" rel="nofollow"&gt;Ruby the Rival&lt;/a&gt;, 
&lt;a href="http://andigutmans.blogspot.com/2008/03/java-is-losing-battle-for-modern-web.html" rel="nofollow"&gt;Java is losing the battle for the modern Web. Can the JVM save the vendors?&lt;/a&gt;, 
&lt;a href="http://onestepback.org/articles/10things/index.html" rel="nofollow"&gt;10 Things Every Java Programmer Should Know About Ruby&lt;/a&gt;, 
&lt;a href="http://blog.dave.org.uk/2005/11/java-programmer.html" rel="nofollow"&gt;Java Programmers Embrace Ruby&lt;/a&gt;, 
&lt;a href="http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.html" rel="nofollow"&gt;Ruby for the Java world&lt;/a&gt;, 
&lt;a href="http://weblogs.java.net/blog/boneill42/archive/2008/03/is_j2ee_dead_1.html" rel="nofollow"&gt;Is J2EE Dead?&lt;/a&gt;, 
&lt;a href="http://www.redmonk.com/cote/2007/07/25/javas-fear-of-commitment/" rel="nofollow"&gt;Java&#8217;s Fear of Commitment&lt;/a&gt;, 
&lt;a href="http://www.javalobby.org/java/forums/t92777.html" rel="nofollow"&gt;Why is the Java community so enchanted by Ruby?&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;itp, itd. Jak troch&#281; poszukasz Googlami, to znajdziesz mn&#243;stwo materia&#322;&#243;w na ten temat. Troch&#281; dyskusji (w niekt&#243;rych bra&#322;em udzia&#322;) znajdziesz na javowym forum jdn.pl: &lt;a href="http://jdn.pl/node/520" rel="nofollow"&gt;Java i Agile&lt;/a&gt;, &lt;a href="http://jdn.pl/node/765" rel="nofollow"&gt;Scooby Ruby do (on Rails) kontra Java&lt;/a&gt;, &lt;a href="http://jdn.pl/node/149" rel="nofollow"&gt;Statyczne vs dynamiczne&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;W wielu przypadkach Java si&#281; po prostu nie sprawdza do webu. Nie sprawdzi&#322;a si&#281; w &lt;a href="http://grono.net" rel="nofollow"&gt;grono.net&lt;/a&gt; (zast&#261;piono j&#261; pythonowym Django) Java te&#380; &lt;a href="http://rewrite.rickbradley.com/pages/moving_to_rails/" rel="nofollow"&gt;nie sprawdzi&#322;a si&#281;&lt;/a&gt; w &amp;#8220;large-scale healthcare application&amp;#8221; CenterNet (Jav&#281; zast&#261;pi&#322; tam Rails).&lt;/p&gt;


	&lt;p&gt;Co do tego PDF to albo to by&#322;o dawno temu, albo koledzy nie umieli szuka&#263;. Ruby bardzo szybko si&#281; zmienia. Jeszcze dwa lata temu prawie nie by&#322;o ksi&#261;&#380;ek na jego temat. Teraz jest prawdziwy wysyp. Powstaj&#261; bardzo ciekawe rozwi&#261;zania. JRuby okrzep&#322;, przy&#347;pieszy&#322; (jest ju&#380; miejscami szybszy ju&#380; od Pythona) i nadaje si&#281; do zastosowa&#324; komercyjnych.&lt;/p&gt;


	&lt;p&gt;Z tym JVM to ty co&#347; mieszasz. Przecie&#380; u&#380;ywaj&#261;c JRuby mam dost&#281;p do &lt;strong&gt;wszystkich&lt;/strong&gt; bibliotek standardowych Rubiego. Je&#347;li wi&#281;c nie u&#380;ywasz jakich&#347; specjalnych (dost&#281;pnych tylko dla Javy) bibliotek, to ta sama aplikacja powinna bez problemu ruszy&#263; zar&#243;wno pod Ruby jak i JRuby.&lt;/p&gt;</description>
      <pubDate>Tue, 08 Jul 2008 12:11:11 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:50a4016e-4e39-4d9d-b172-9c7bf7ecc567</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1735</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Ris</title>
      <description>&lt;p&gt;@Jaros&#322;aw Zabie&#322;&#322;o
&amp;#8220;Java z kolei, cho&#263; dobra do wielkich, skomplikowanych system&#243;w, jest za ci&#281;&#380;ka w pozosta&#322;ych przypadkach, tj. tam, gdzie jest potrzebny tylko szybki fronton wsp&#243;&#322;pracuj&#261;cy z relacyjn&#261; baz&#261; danych&amp;#8221; 
Co takiego utrudnia Java w stosunku do Rails?&lt;/p&gt;</description>
      <pubDate>Tue, 08 Jul 2008 12:10:21 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:93f37373-76fd-4ae5-ad39-fcc4f19b0446</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1734</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by mario</title>
      <description>&lt;p&gt;1. Co to znaczy, &#380;e Java jest za ci&#281;&#380;ka? Nie rozumiem w og&#243;le tego argumentu&amp;#8230;&lt;/p&gt;


	&lt;p&gt;2. W przypadku PDF: koledzy z jednej firmy chcieli jaki&#347; czas temu przej&#347;&#263; na Railsy, ale nie znale&#378;li dobrej biblioteki do generowania PDFa, dlatego zrezygnowali z rails&#243;w i przechodz&#261; na grailsy.&lt;/p&gt;


	&lt;p&gt;3. U&#380;ywaj&#261;c bibliotek Javy z Jythona czy JRuby uzale&#380;niasz kod od JVM i nie odpalisz go na innym interpreterze pythona/ruby. Oczywi&#347;cie w konkretnej sytuacji biznesowej mo&#380;e to by&#263; uzasadnione, ale wymaga&#322;o by zar&#243;wno specjalist&#281; od Javy jak i pythona/ruby a takich jeszcze ci&#281;&#380;ej znale&#378;&#263;.&lt;/p&gt;</description>
      <pubDate>Tue, 08 Jul 2008 10:24:58 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:74acfb5e-83a4-4963-a78a-30160f9f161b</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1733</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Problem w tym, &#380;e w pewnych dziedzinach (np. aplikacje webowe) u&#380;ywanie C, czy C++, jest raczej g&#322;upot&#261;. Java z kolei, cho&#263; dobra do wielkich, skomplikowanych system&#243;w, jest &lt;strong&gt;za ci&#281;&#380;ka&lt;/strong&gt; w pozosta&#322;ych przypadkach, tj. tam, gdzie jest potrzebny tylko szybki fronton wsp&#243;&#322;pracuj&#261;cy z relacyjn&#261; baz&#261; danych. To jest dziedzina, gdzie rz&#261;dz&#261; lekkie frameworki takie jak Rails, czy &lt;a href="http://www.djangoproject.com/" rel="nofollow"&gt;Django&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Co do PDF, to przesadzasz, &#380;e nie ma dobrych bibliotek do generowania tego formatu poza Jav&#261;. Np. Python ma bardzo dobr&#261;  bibliotek&#281; &lt;a href="http://www.reportlab.org/rl_toolkit.html" rel="nofollow"&gt;ReportLab&lt;/a&gt;. W Ruby, co prawda, nie mia&#322;em jak dot&#261;d potrzeby generoowania PDF, ale 5 sekund pytania Googli pokazuje &#380;e, jest &lt;a href="http://wiki.rubyonrails.org/rails/pages/HowtoGeneratePDFs" rel="nofollow"&gt;kilka bibliotek do tego celu&lt;/a&gt;. Zreszt&#261;, skoro mog&#281; w Rails u&#380;y&#263; JRuby to gdzie ty jeszcze widzisz problem?&lt;/p&gt;


	&lt;p&gt;Co do bibliotek testuj&#261;cych, to Java dorobi&#322;a si&#281; czegokolwiek tej klasy co RSpec? Automatyczne testowanie behawioralne to przecie&#380; podstawa.&lt;/p&gt;


	&lt;p&gt;Nie rozumiem, co ci si&#281; nie podoba w u&#380;ywaniu JRuby/Jythona zamiast Javy. To si&#281; nie&#378;le sprawdza w praktyce. Wpi&#281;cie si&#281; do dowolnej biblioteki Javy w JRuby jest banalnie proste. G&#322;&#243;wn&#261; warto&#347;ci&#261; Javy to i tak nie j&#281;zyk, ale te biblioteki oraz JVM. Skoro wi&#281;c mog&#281; mi&#281;&#263; i jedno i drugie, ale 10x pro&#347;ciej, to do czego mi (prymitywna i nadmiarowa) sk&#322;adnia Javy?&lt;/p&gt;</description>
      <pubDate>Mon, 07 Jul 2008 23:14:58 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:886b0fb6-9ca8-4d44-99f4-8f15d4c90762</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1731</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by mario</title>
      <description>&lt;p&gt;Twierdzenie, &#380;e w Rubym/Ptyhonie zawsze pisze si&#281;&#160;szybciej jest tak&#261;&#160;sam&#261;&#160;bzdur&#261;, jak twierdzenie, &#380;e w C/C+/Javie pisze si&#281;&#160;szybciej. Mog&#281; znale&#378;&#263; po kilka kr&#243;tkich implementacji wykonuj&#261;cych konkretn&#261; czynno&#347;&#263;, kt&#243;re w C/C+ napisze si&#281;&#160;szybciej ni&#380; w Pythonie czy Rubym. Zreszt&#261; co z tego, czasem szybko&#347;&#263; pisania kodu pewnych rodzaj&#243;w aplikacji w j&#281;zykach dynamicznych nic nie daje jak nie znajdziesz programist&#243;w, a programist&#243;w C/C++/Javy jest o wiele wi&#281;cej. To ile jest programist&#243;w danego j&#281;zyka z punku widzenia projektanta systemu ma du&#380;e znaczenie.&lt;/p&gt;


	&lt;p&gt;Co do bibliotek, to Ruby dorobi&#322; si&#281; w ko&#324;cu czego&#347; do PDF&amp;#8217;a?&lt;/p&gt;


	&lt;p&gt;U&#380;ywanie JRuby czy Jython do wykorzystywania bibliotek Javy uwa&#380;am za bezsens, bo taki kod jest uzale&#380;niony od VM Javy i nie jest kompatybilny ze standardem. Oczywi&#347;cie kompilowanie kodu Pythona czy Rubiego do bytecodu Javy jest jak najbardziej na miejscu i te j&#281;zyki mog&#261; na tym tylko zyska&#263;.&lt;/p&gt;</description>
      <pubDate>Mon, 07 Jul 2008 22:33:43 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:262cc253-654f-4d60-a325-cbb9efe0bf43</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1730</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Chyba si&#281; troch&#281; zagalopowa&#322;e&#347; z wnioskami. Ten artyku&#322; do kt&#243;rego s&#261; te komentarze, by&#322; napisany ponad 2.5 roku i jego celem by&#322;o tylko pokazanie, &#380;e twierdzenie, i&#380; w Jave i C++ &amp;#8220;zawsze si&#281; pisze szybciej i lepiej&amp;#8221; jest wierutn&#261; bzdur&#261;.&lt;/p&gt;


	&lt;p&gt;Nic dziwnego. W ko&#324;cu j&#281;zyki jak Python czy Ruby zosta&#322;y stworzone po to, aby zwi&#281;kszy&#263; produktywno&#347;&#263; programisty, a nie aby tworzy&#263; najszybciej wykonywalny kod. By&#263; mo&#380;e nie ma idealnego j&#281;zyka kt&#243;ry by&#322;by najlepszym wyborem w ka&#380;dej sytuacji, ale ja uwa&#380;am, &#380;e j&#281;zyki wysokopoziomowe s&#261; w wi&#281;kszo&#347;ci przypadk&#243;w wyborem lepszym. Pisze si&#281; w nich przyjemniej, szybciej i wydajno&#347;&#263; za&#322;atwiaj&#261; odpowiednie biblioteki, jak wspomniana przeze mnie SciPy. Dzi&#281;ki &lt;a href="http://www.zenspider.com/ZSS/Products/RubyInline/" rel="nofollow"&gt;RubyInline&lt;/a&gt; czy &lt;a href="http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/" rel="nofollow"&gt;Pyrex&lt;/a&gt; mo&#380;na te&#380; pisa&#263; rozszerzenia bez wi&#281;kszego wg&#322;&#281;biania si&#281; na C.&lt;/p&gt;


	&lt;p&gt;Na pewno nie zgodz&#281; si&#281; z bzdurami, &#380;e nie ma dobrych bibliotek dla j&#281;z. dynamicznych. Wszystko zale&#380;y o jak&#261; funkcjonalno&#347;c chodzi. W ostateczno&#347;ci, JRuby/Jython i IronRuby/IronPython maj&#261; 100% dost&#281;p do Javy i .NET je&#347;li jest taka potrzeba. A jak dowodzi przyk&#322;ad z RSpec, czasem jest odwrotnie, bywa i tak, &#380;e to Javy nie ma tak dobrych bibliotek jak do Rubiego. :P ma&#322;o tego. Nie ma i nie b&#281;dzie, bo tu C++/Java s&#261; zbyt ma&#322;o dynamiczne do takiego &#322;adnego DSL&amp;#8217;a jaki ma RSpec.&lt;/p&gt;


	&lt;p&gt;To, ile jest programist&#243;w w takim czy innym j&#281;zyku, nie ma (przynajmniej dla mnie) a&#380; tak wielkiego znaczenia. To, co ma znaczenie to to, czy jest dobra praca. A prac&#281;, i to dobrze p&#322;atn&#261;, to znajd&#261; nawet programi&#347;ci obumar&#322;ego Cobola. Nie wiem jak w PL, ale w Irlandii ju&#380; s&#322;ysza&#322;em przypadki o zrezygnowaniu z javowca bo nie zna&#322; r&#243;wnie&#380; Rubiego.&lt;/p&gt;</description>
      <pubDate>Mon, 07 Jul 2008 16:58:32 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:34145848-35cb-4667-9717-8b7b2757349f</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1729</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by mario</title>
      <description>&lt;p&gt;Tylko dla pythona kto&#347; te biblioteki naukowe w C++ musia&#322; napisa&#263;! Python bez C++ by nie istnia&#322; &amp;#8211; gdyby wszystkie biblioteki by&#322;y pisane natywnie w pytonie to na wielu polach wydajno&#347;&#263; tego by&#322;a by gorsza ni&#380; koszmarna. Java ma swoje standardowe biblioteki napisane w Javie i skompilowane do bytecode&amp;#8217;u VM Javy i nie przeszkadza to w wydajno&#347;ci. Je&#347;li chcesz m&#243;wi&#263; o przydatno&#347;ci pythona czy rubiego do oblicze&#324; to musisz uzna&#263; jednak pot&#281;g&#281; C/C++, bez kt&#243;rych to j&#281;zyk&#243;w obliczenia w pythonie czy rubym nie mia&#322;y by sensu.&lt;/p&gt;


	&lt;p&gt;Je&#347;li m&#243;wimy ju&#380; o samej sk&#322;adni to jedn&#261; podstawow&#261; zalet&#261; sk&#322;adni Javy jest jej przejrzysto&#347;&#263; i zgodno&#347;&#263; z C/C+, dzi&#281;ki czemu programista C/C+ (a takich w owym czasie by&#322;o najwi&#281;cej i chyba nadal jest) przechodz&#261;c na Jav&#281; nie musi si&#281;&#160;uczy&#263; znaczenia nowych krzaczk&#243;w, tylko czuje si&#281;&#160;&amp;#8221;jak w domu&amp;#8221;. Dzi&#281;ki temu koszt przej&#347;cia na Jav&#281; (a tym samym przeszkolenia i przyzwyczajenia programist&#243;w) zosta&#322; zminimalizowany. Dlatego te&#380; python i ruby nie maj&#261;&#160;takiej popularno&#347;ci jak Java. Oczywi&#347;cie python i ruby to bardzo dobre j&#281;zyki programowania oferuj&#261;ce wspania&#322;e mo&#380;liwo&#347;ci i elastyczno&#347;&#263;, ale jak ka&#380;dy maj&#261; swoje zalety i wady, a wyb&#243;r j&#281;zyka zale&#380;y od sytuacji. Nie mo&#380;esz si&#281; upiera&#263;, &#380;e python i ruby jest zawsze lepszy od C/C++/Javy &amp;#8211; bo to nie prawda! &#321;atwiej znale&#378;&#263; programist&#281; Javy ni&#380; Rubiego i &#322;atwiej te&#380; napisa&#263; z&#322;o&#380;ony system biznesowy w Javie ze wzgl&#281;du na du&#380;y dorobek tego &#347;rodowiska.&lt;/p&gt;


	&lt;p&gt;Nie upieraj si&#281;&#160;na si&#322;&#281; &amp;#8211; wiem, &#380;e Ruby i Python maj&#261;&#160;dobre biblioteki, ale nie do wszystkiego, bo z tymi j&#281;zykami pracuje o wiele mniej programist&#243;w ni&#380; z C/C++/Jav&#261;. Nie m&#243;w o tym jakie biblioteki ma Ruby, ale m&#243;w jakich bibliotek nie ma, kt&#243;re ma Java i jakich bibliotek nie ma Java, kt&#243;re ma Ruby. W biznesie to b&#281;dzie o wiele lepszy wyznacznik przydatno&#347;ci j&#281;zyka dla danego projektu. Je&#347;li dla danego projektu Ruby:
- ma wszystkie wymagane biblioteki
- wydajno&#347;&#263; w projekcie nie ma wi&#281;kszego znaczenia
- znalezienie programist&#243;w nie b&#281;dzie problemem lub system p&#243;&#378;niej nie b&#281;dzie rozwijany
to z powodzeniem mo&#380;na go pisa&#263; w Rubym, ale jak sam widzisz te warunki musz&#261; zosta&#263; spe&#322;nione. Je&#380;eli nie ma jakiej&#347; kluczowej biblioteki, kt&#243;r&#261; ma Java, a system b&#281;dzie rozwijany i ew. wydajno&#347;&#263; te&#380; ma znaczenie (a zu&#380;ycie ramu nie ma) to wyb&#243;r Javy jest jak najbardziej uzasadniony. Wszystko zale&#380;y od potrzeb. Nie wyobra&#380;am sobie np. pisania engineu 3D do gry w Pythonie ani w Javie, lepszy do tego jest C++, bo:
- zu&#380;ywa ma&#322;o ramu
- jest bardzo szybki (r&#243;wnie&#380; start programu)
- ma odpowiednie biblioteki&lt;/p&gt;


	&lt;p&gt;Python za to mo&#380;e si&#281; nadawa&#263; jako j&#281;zyk do oskryptowania logiki i AI gry, bo tam obliczenia nie maj&#261;&#160;znaczenia (zazwyczaj). Cho&#263; s&#261; do tego celu dobre j&#281;zyki dedykowane (LUA, AngelScript itp).&lt;/p&gt;


	&lt;p&gt;PS. Aktualnie ca&#322;kiem sensown&#261; alternatyw&#261; dla Ruby on Rails jest Java + Groovy + Grails. Koncepcja RoR zaadoptowana do Javy, pozwala te&#380; u&#380;ywa&#263; ca&#322;ego dorobku Javy (np. bibliotek do PDF).&lt;/p&gt;


	&lt;p&gt;PS 2. &#379;ycz&#281; troch&#281; wi&#281;cej pozytywnego i konstruktywnego my&#347;lenia a mniej walki i upierania si&#281;&#160;przy swoim ;-). Naprawd&#281; s&#261; rozwi&#261;zania w kt&#243;rych Ruby czy Python jest gorszy do Javy/C/C++. Elastyczno&#347;&#263; sk&#322;adni j&#281;zyka to nie wszystko.&lt;/p&gt;</description>
      <pubDate>Mon, 07 Jul 2008 14:11:45 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:861fda60-c24c-41ee-bbae-d63f6c78b290</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1728</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@mario: To, co piszesz o wydajno&#347;ci mia&#322;oby sens tylko, gdyby rozpatrywa&#263; j&#281;zyki programowania w oderwaniu od dost&#281;pnych dla nich bibliotek. twierdzisz, &#380;e j&#281;zyki dynamiczne maj&#261; s&#322;abe biblioteki? Hehe, no to zmierz si&#281; z pythonow&#261; bibliotek&#261; &lt;a &gt;SciPy&lt;/a rel="nofollow"&gt; &amp;#8211; stworzon&#261; do ci&#281;&#380;kich oblicze&#324; naukowych. My&#347;lisz, &#380;e w C++ zrobisz to szybciej? :)&lt;/p&gt;


	&lt;p&gt;Czasem jest dok&#322;adnie odwrotnie. W j&#281;z. dynamicznym s&#261; biblioteki lepsze od tych co oferuje C++ czy Java. Np. &lt;a href="http://rspec.info/" rel="nofollow"&gt;RSpec&lt;/a&gt;,
 genialna biblioteka do test&#243;w behawioralnych. Takiego &#322;adnego DSL nie da si&#281; po prostu stworzy&#263; w Javie bo jest na to za prymitywna. Vide: car.should have(3).wheels&lt;/p&gt;


	&lt;p&gt;Nie mo&#380;na te&#380; myli&#263; platform&#281; Javy z j&#281;zykiem Java. Moim zdaniem, jako j&#281;zyk, Java nie jest niczym specjalnie atrakcyjnym. Prymitywna sk&#322;adnia, brak przeci&#261;&#380;e&#324; operator&#243;w, konieczno&#347;&#263; definiowania ka&#380;dej zmiennej, a i tak kompilator nie wy&#322;apuje wszystkich b&#322;&#281;d&#243;w (zwi&#261;zanych np. z b&#322;&#281;dnym rzutowaniem typ&#243;w). Co innego platforma Javy, czyli JVM i r&#243;&#380;ne biblioteki. Lecz skoro Rails chodzi na &lt;a href="http://en.wikipedia.org/wiki/JRuby" rel="nofollow"&gt;JRuby&lt;/a&gt;, to upada teza, &#380;e Rails nie ma dost&#281;pu do tego, do czego ma dost&#281;p Java. Wydajno&#347;ciowo JRuby on Rails nie jest mo&#380;e powalaj&#261;cy, ale ju&#380; JRuby on &lt;a href="http://merbivore.com/" rel="nofollow"&gt;Merb&lt;/a&gt; &#347;miga ca&#322;kiem sprawnie.&lt;/p&gt;</description>
      <pubDate>Mon, 07 Jul 2008 12:43:24 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:801df747-1704-45bc-9989-6c4734d37431</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1727</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Ris</title>
      <description>&lt;p&gt;@mario
+1&lt;/p&gt;</description>
      <pubDate>Mon, 07 Jul 2008 10:31:03 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:2cfeee91-f6c9-4a1c-af03-6b382b48d3de</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1726</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by mario</title>
      <description>&lt;p&gt;Kompletnie nie rozumiem o co te k&#322;&#243;tnie? J&#281;zyki dynamiczne s&#322;u&#380;&#261; do pisania czego&#347; czego wydajno&#347;&#263; nie ma znaczenia, bo s&#261; koszmarnie powolne. Rubiego czy Pythona nie zastosujesz do napisania liczenia np. transformaty furiera, tylko do&#322;&#261;czysz bibliotek&#281; napisan&#261; w C/C++, kt&#243;ra to realizuje. ostatnio wykonywa&#322;em testy pr&#281;dko&#347;ci liczenia ci&#261;gu fibonacciego rekurencyjnie w r&#243;&#380;nych j&#281;zykach i Java by&#322;&#261; szybsza od gcc 3.3 i wolniejsza od gcc 4.2, ale te r&#243;&#380;nice by&#322;y nieznaczne. Liczy&#322;em warto&#347;&#263; dla 43-ciego elementu ci&#261;gu i w obu j&#281;zykach trwa&#322;o to ok. kilkunastu sekund. Podczas gdy chcia&#322;em sprawdzi&#263; wydajno&#347;&#263; pythona i rubiego, to niestety musia&#322;em zmniejszy&#263; warto&#347;&#263; na 40, bo nie mog&#322;em si&#281; doczeka&#263;, a w testach i tak python by&#322; 150 razy wolniejszy od Javy, a ruby by&#322; dodatkowo 2 razy wolniejszy od pythona. Ja rozumiem, &#380;e wiele rodzaj&#243;w program&#243;w pisze si&#281;&#160;w j&#281;zykach dynamicznych szybciej, niestety wiele tych technologii aktualnie dyskwalifikuje wydajno&#347;&#263;. Wiele firm nie zdaje sobie sprawy jak mocny sprz&#281;t b&#281;d&#261; musia&#322;y zakupi&#263;, je&#347;li chc&#261; uruchamia&#263; sw&#243;j portal w PHP, pythonie itp, podczas gdy napisanie wersji w Javie rozwi&#261;za&#322;o by te problemy. Jest wiele przypadk&#243;w gdzie zastosowanie j&#281;zyk&#243;w dynamicznych dyskwalifikuje aktualna wydajno&#347;&#263; ich interpreter&#243;w. Je&#347;li wykonywanie ich przejdzie pod kontrol&#281; maszyn wirtualnych JIT to sytuacja mo&#380;e si&#281;&#160;zmieni&#263; &amp;#8211; p&#243;ki co to wykonywanie kodu w nich jest po prostu koszmarnie powolne. Dodatkow&#261; wad&#261; niekt&#243;rych j&#281;zyk&#243;w dynamicznych, s&#261; s&#322;abo rozwini&#281;te biblioteki dodatkowe, np. ruby jaki&#347; czas temu nie mia&#322; (nie wiem czy ju&#380; ma czy nie) biblioteki do generowania PDFa, co dyskwalifikowa&#322;o framework Ruby on Rails w wielu przypadkach komercyjnych, gdzie generowanie PDFa w aplikacji Webowej by&#322;o konieczne (w aplikacjach dla biznesu cz&#281;sto raporty &#347;ci&#261;ga si&#281; w PDF). Java ma biblioteki do wszystkiego.&lt;/p&gt;


	&lt;p&gt;@swr: nie nauczysz nikogo (poza geniuszami) programowania w rubym w 2 lub 3 miesi&#261;ce od zera, podobnie w Javie czy C++. Bo to za du&#380;o poj&#281;&#263; do poznania w kr&#243;tkim okresie czasu. Oczywi&#347;cie do&#347;wiadczony programista pozna rubiego w 2 lub 3 miesi&#261;ce podobnie jak i nauczy si&#281;&#160;Javy w takim czasie. Ja jak poznawa&#322;em Jav&#281; to si&#281; jej uczy&#322;em bardzo kr&#243;tko (chyba miesi&#261;c) nim zacz&#261;&#322;em j&#261; komercyjnie u&#380;ywa&#263;, potem po nast&#281;pnym miesi&#261;cu praktyki ju&#380; sobie nie&#378;le radzi&#322;em. Zreszt&#261; i tak kluczem do poznania aktualnych j&#281;zyk&#243;w programowania nie jest poznanie ich sk&#322;adni itp, tylko poznanie bibliotek standardowych, bo aktualnie one stanowi&#261; najwi&#281;ksz&#261; cz&#281;&#347;&#263; j&#281;zyka i efektywne wykorzystanie jakiego&#347; j&#281;zyka programowania jest mo&#380;liwe tylko po poznaniu jego bibliotek standardowych.&lt;/p&gt;


	&lt;p&gt;PS. Przedstawi&#322;em tylko wady dynamicznych j&#281;zyk&#243;w programowania bo o zaletach tutaj si&#281;&#160;wiele pisze. Oczywi&#347;cie te j&#281;zyki maj&#261; zalety i w wielu przypadkach ich u&#380;ycie jest bardziej uzasadnione ni&#380; C/C+/Javy (zw&#322;aszcza do przetwarzania tekst&#243;w gdzie wydajno&#347;&#263; nie ma znaczenia), ale to jaki j&#281;zyk wybra&#263; zale&#380;y od konkretnego przypadku. Warto pami&#281;ta&#263; te&#380;, &#380;e Javy nie mo&#380;na postawi&#263; obok C/C+, bo Java oferuje o wiele &#322;atwiejsze szukanie b&#322;&#281;d&#243;w ale kosztuje zu&#380;yciem o wiele wi&#281;kszych ilo&#347;ci pami&#281;ci ni&#380; C/C++, wi&#281;c na aplikacje desktopowe si&#281; &#347;rednio nadaje &amp;#8211; tylko w szczeg&#243;lnych przypadkach. Za to Java jest &#347;wietnym j&#281;zykiem do pisania aplikacji dla biznesu, aplikacji serwerowych, gdzie kontrola nad b&#322;&#281;dami jest po&#380;&#261;dana a zu&#380;ycie RAMu nie ma wielkiego znaczenia, bo oferuje du&#380;&#261; wydajno&#347;&#263;.&lt;/p&gt;</description>
      <pubDate>Mon, 07 Jul 2008 09:13:59 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:b72410df-1a2d-4f73-8c35-080152635dcd</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1725</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by swr</title>
      <description>&lt;p&gt;Nie znam &#378;r&#243;d&#322;a, nie pami&#281;tam gdzie to przeczyta&#322;em, ale mo&#380;e kto&#347; to potwierdzi. Mianowicie, &#380;e 70% oprogramowania jako takiego to wewn&#281;trzne oprogramowanie biznesowe. :) Oczywi&#347;cie ja te&#380; si&#281; zgodz&#281;, &#380;e python czy ruby nie s&#322;u&#380;&#261; do pisania sterownik&#243;w. Ale sterowniki, systemy i aplikacje jako takie, gry, to wg. tych szacunk&#243;w, jakie&#347; 30%.&lt;/p&gt;</description>
      <pubDate>Sun, 01 Jun 2008 20:37:06 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:78d2c9b8-a40d-4a8c-bdb9-6681d50c161d</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1645</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Samuel</title>
      <description>&lt;p&gt;A ja sie podpisuje pod tym co napisal Adderek. Oprogramowanie biznesowe to nie wszystko. A prawde mowiac, gdyby nie to wszystko inne, to oprogramowanie biznesowe na nic by sie nie zdalo ;)&lt;/p&gt;</description>
      <pubDate>Wed, 21 May 2008 09:33:29 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:32953b4e-854a-4f28-a320-0e708e988496</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1606</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by swr</title>
      <description>&lt;p&gt;J&#281;zyki takie jak Ruby / Python wygraj&#261; na rynku, i to z powod&#243;w czysto ekonomicznych. Mniej czasu nad kodem, &#322;atwo&#347;&#263; uczenia (wspomniane 2 miesi&#261;ce vs. 2-3 lata), kr&#243;tszy czas rozwoju i wdra&#380;ania aplikacji. To wszystko to s&#261; pieni&#261;dze. Konkretne pieni&#261;dze zaoszcz&#281;dzone i zarobione (czas dostarczenia produktu/us&#322;ugi). Przer&#243;&#380;ne firmy powstaj&#261;ce na rynku b&#281;d&#261; wybiera&#263; w&#322;a&#347;nie takie technologie, bo dzi&#281;ki nim mog&#261; mie&#263; wi&#281;cej tortu. Inne firmy dostrzegaj&#261; ten proces i inwestuj&#261; (b&#281;d&#261; inwestowa&#263;) w narz&#281;dzia, us&#322;ugi i wsparcie dla dynamicznych j&#281;zyk&#243;w.&lt;/p&gt;


	&lt;p&gt;Dlatego z pewno&#347;ci&#261; wi&#281;kszo&#347;&#263; nowego oprogramowania biznesowego b&#281;dzie powstawa&#263; w j&#281;zykach dynamicznych.&lt;/p&gt;


	&lt;p&gt;Co do tradycyjnego oprogramowania, to model
biznesowy oparty na kompilowanym kodzie i sprzeda&#380;y licencji na korzystanie z oprogramowania te&#380; odchodzi do lamusa. Kto w przesz&#322;o&#347;ci ugryz&#322; sw&#243;j kawa&#322;ek, ten go trzyma. Ale nie wydaje mi si&#281; to drog&#261; dla nowych firm. Koszt wytworzenia du&#380;ego programu, wprowadzenia go na rynek, wypromowania marki wydaje mi si&#281; zbyt du&#380;y. Dodajmy do straty spowodowane piractwem. Za ma&#322;y zwrot z takiej inwestycji.&lt;/p&gt;


	&lt;p&gt;Innym symptomem zmian jest cho&#263;by open-source, czyli mo&#380;liwo&#347;&#263; taniego i bezpiecznego oprogramowania. I rzesze ludzi po&#322;&#261;czonych przez internet, kt&#243;rym nikt nie zabroni tworzenia kodu za darmo.&lt;/p&gt;


	&lt;p&gt;Internet jako taki to w og&#243;le czynnik, kt&#243;ry mimo wszystko wydaje si&#281; niedoceniony, a jest odpowiedzialny za chyba najwi&#281;ksze zmiany w bran&#380;y i daleko daleko id&#261;ce konsekwencje. Dzi&#281;ki niemu mo&#380;liwe s&#261; nowe trendy, jak np. mo&#380;liwo&#347;&#263; zabezpieczenia kluczowych technologii przez tworzenie us&#322;ug sieciowych, i sprzeda&#380; us&#322;ug zamiast licencji na korzystanie z oprogramowania.&lt;/p&gt;


	&lt;p&gt;To takie moje 3 grosze do dyskusji.&lt;/p&gt;


	&lt;p&gt;ps.
opieram si&#281; jedynie na w&#322;asnych obserwacjach i przemy&#347;leniach (zbie&#380;no&#347;&#263; do os&#243;b i fakt&#243;w przypadkowa ;)
pps. poza byciem programist&#261; jestem w&#322;a&#347;cicielem firmy software&amp;#8217;owej, st&#261;d zdarza mi si&#281; intensywnie nad tym my&#347;le&#263; :P&lt;/p&gt;</description>
      <pubDate>Tue, 06 May 2008 02:13:58 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:40f3a04c-4b80-43c0-a43c-75e9347aefb6</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1598</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by adderek</title>
      <description>&lt;p&gt;Znam w mniejszym lub wi&#281;kszym stopniu : assemblera, pascala, C, C++, JAVA, C#, ksh, bash, awk, dhtml. Jeszcze mi troch&#281; wiedzy brakuje ale nadal si&#281; rozwijam.
I moja opinia jest nast&#281;puj&#261;ca:&lt;/p&gt;


	&lt;p&gt;1) Nie nale&#380;y por&#243;wnywa&#263; tych j&#281;zyk&#243;w w kategoriach &amp;#8220;lepszy/gorszy&amp;#8221; &amp;#8211; ona maj&#261; po prostu inne zastosowania (tak jak m&#322;otek jest lepszy do wbijania gwo&#378;dzi ni&#380; wiertarka a ta druga do wiercenia jest lepsza od m&#322;otka)&lt;/p&gt;


	&lt;p&gt;2) Du&#380;e firmy albo zazwyczaj inwestuj&#261; w stabilno&#347;&#263; kodu i mo&#380;liwo&#347;&#263; rozszerzania bez utraty stabilno&#347;ci (kolosalne wieloletnie projekty), albo w szybko&#347;&#263; tworzenia aplikacji (przymykaj&#261;c oko na jako&#347;&#263; &amp;#8211; ona nie przynosi bezpo&#347;rednich zysk&#243;w), wi&#281;c nie nale&#380;y uznawa&#263; ich za wyznacznik. Co najwy&#380;ej fakt, &#380;e google odchodzi od perla mo&#380;e &#347;wiadczy&#263; o tym, &#380;e przy z&#322;o&#380;onych projektach ten j&#281;zyk powoduje wi&#281;cej koszt&#243;w i k&#322;opot&#243;w ni&#380; python (albo po prostu chcieli si&#281; pozby&#263; perla &amp;#8220;z tr&#243;jk&#261;ta&amp;#8221;).&lt;/p&gt;


	&lt;p&gt;3) Gry to co&#347;, w czym si&#281; wyciska max. wydajno&#347;ci, wi&#281;c cz&#281;sto si&#281; wybiera C++. Czasem jednak produkuje si&#281; kicz(?) w innym j&#281;zyku &amp;#8211; gdy wydajno&#347;&#263; nie jest najwa&#380;niejsza.&lt;/p&gt;


	&lt;p&gt;4) Sterowniki to co&#347;, co jest wykorzystywane miliony(?) razy na sekund&#281;. Przyspieszenie polecenia &amp;#8220;mov&amp;#8221; o 10% oznacza&#322;oby przyspieszenie systemu o 5%-10%. Dlatego do sterownik&#243;w/j&#261;der wykorzystuje si&#281; asm(wydajno&#347;&#263;:6,stabilno&#347;&#263;:1,czytelno&#347;&#263;:1), C(wydajno&#347;&#263;:4,stabilno&#347;&#263;:3,czytelno&#347;&#263;:3), C+(wydajno&#347;&#263;:3,stabilno&#347;&#263;:4,czytelno&#347;&#263;:4).&lt;/p&gt;


	&lt;p&gt;5) Co&#347; na szybko = skrypt. Mo&#380;na zmodyfikowa&#263; bez potrzeby kompilacji.&lt;/p&gt;


	&lt;p&gt;6) Ka&#380;dy j&#281;zyk posiada zalety i wady. &#346;wiadcz&#261; o tym na przyk&#322;ad jython, jruby, c# &amp;#8211; czerpi&#261;ce zalety java. Jednak nie ma idealnego rozwi&#261;zania.&lt;/p&gt;


	&lt;p&gt;7) W przysz&#322;o&#347;ci powstanie wiele nowych j&#281;zyk&#243;w. To podstawa post&#281;pu. Mie&#263; wi&#281;cej mniejszym kosztem znaczy pisa&#263; szybciej &amp;#8211; ale (zazwyczaj) jest to przeciwie&#324;stwo pisania kodu stabilnego.&lt;/p&gt;


	&lt;p&gt;8) Nie lubi&#281; C#. Nie cierpi&#281; C#. To jest koszmar: powolne oprogramowanie z utrat&#261; kontroli nad alokacj&#261; pami&#281;ci. Ale wszystko wygl&#261;da na to, &#380;e to jest przysz&#322;o&#347;&#263;. Ot &amp;#8211; przyk&#322;ad na to, &#380;e nie zawsze to co jest fajne wygrywa.&lt;/p&gt;


	&lt;p&gt;Obstawiam &#380;e ten w&#261;tek nigdy si&#281; nie sko&#324;czy :)&lt;/p&gt;


	&lt;p&gt;Pozdrawiam i &#380;ycz&#281; wszystkim czytelnikom powodzenia w dalszej nauce&lt;/p&gt;</description>
      <pubDate>Fri, 21 Mar 2008 22:37:37 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:479aa3d3-8ea6-4854-be10-0c299ba78347</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1510</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by progeo</title>
      <description>&lt;p&gt;Apropos dyskusji &amp;#8211; zgadzam sie z opinia, ze decydujace znaczenie ma decyzja firm ktore moga inwestowac tylko w produkty rozwijane i dajace gwarancje, ze beda rozwijane.
Place to ciekawy wyznacznik, cos troche innego ponizej:
&lt;a href="http://www.devtopics.com/most-popular-programming-languages/" rel="nofollow"&gt;http://www.devtopics.com/most-popular-programming-languages/&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://antoniocangiano.com/2007/07/05/23-programming-languages-compared-through-their-amazon-book-sales/" rel="nofollow"&gt;http://antoniocangiano.com/2007/07/05/23-programming-languages-compared-through-their-amazon-book-sales/&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.welton.it/articles/language_popularity.html" rel="nofollow"&gt;http://www.welton.it/articles/language_popularity.html&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;nie jestem profesjonalnym programista &amp;#8211; mam nadzieje, ze warto spojrzec na problem  &amp;#8220;wyzszosci&amp;#8221; bardzo szeroko poniewaz potrzeby ludzi sa roznorodne i bardzo dobrze. Ta narzedzie jest dobre ktore spelnia swoja role dobrze &amp;#8211; dla kogos kto zna dobrze perla uzywanie cgi jest nadal sensowne chociaz jest tyle nowych narzedzi uzywanych dla potrzeb internetu.
Dziekuje.&lt;/p&gt;</description>
      <pubDate>Thu, 13 Mar 2008 22:29:08 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:17dd4461-4cd8-4a5e-82c5-73d595504424</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1495</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by duce74</title>
      <description>&lt;p&gt;Proponuje przejrzec artykul 
oto jego wstep:&lt;/p&gt;


	&lt;p&gt;Lekkie framework&amp;#8217;i jak Hibernate, Spring oraz HiveMind s&#261; przysz&#322;o&#347;ci&#261; Javy&lt;/p&gt;


	&lt;p&gt;Wygl&#261;da na to &#380;e wielu dziennikarzy zacz&#281;&#322;o gorzej pisa&#263; o Javie. Niekt&#243;rzy ludzie zdaj&#261; si&#281; by&#263; przekonani o tym, &#380;e Java uleg&#322;a stagnacji i z tego powodu wielu ludzi od niej odesz&#322;o. C&#243;&#380;, pozostali entuzja&#347;ci po prostu nadal koduj&#261; w tej, daj&#261;cej wi&#281;cej rado&#347;ci ni&#380; jakakolwiek przedtem, platformie. Inne technologie, takie jak Ruby, PHP, .NET czy Ajax jak dot&#261;d nie generuj&#261; tylu innowacji w &#347;wiecie oprogramowania, co Java.&lt;/p&gt;


	&lt;p&gt;Wielu ludzi interesuj&#261;cych si&#281; Jav&#261; podchodzi do niej bardzo krytycznie &amp;#8211; niekt&#243;re z ich uwag s&#261; s&#322;uszne. Jednak nie wszyscy zdaj&#261; sobie spraw&#281;, &#380;e w ostatnim czasie wi&#281;kszo&#347;&#263; problem&#243;w uda&#322;o si&#281; rozwi&#261;za&#263;. W prezentowanym artykule opisano kierunki, w jakie zdaje si&#281; zmierza&#263; obecnie Java&lt;/p&gt;


	&lt;p&gt;reszte mozna znalezc na:
&lt;a href="http://www.javasoft.pl/index.jsp" rel="nofollow"&gt;http://www.javasoft.pl/index.jsp&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 22 Nov 2007 00:23:29 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:fdbd76cc-9841-4c73-8804-3effd0065cdf</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1243</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Leszek</title>
      <description>&lt;p&gt;Oczywi&#347;cie masz racj&#281;, &#380;e j&#281;zyki te si&#281; r&#243;&#380;ni&#261; i nawyki przeszkadzaj&#261; (widz&#281; to cho&#263;by przy pisaniu w Ruby). Ale chodzi&#322;o mi bardziej o to, &#380;e Java zmusza/uczy odpowiedniego podej&#347;cia do projektowania i implementacji, i jest to moim zdaniem bardzo wa&#380;na rzecz, kt&#243;ra procentuje p&#243;&#378;niej przy ka&#380;dym j&#281;zyku i w ka&#380;dym projekcie. A co uczy takie PHP? Ba&#322;aganu.
Zreszt&#261; nie dziwi&#281; si&#281;, &#380;e ludzie, kt&#243;rzy zacz&#281;li programowanie od PHP pisz&#261; bez g&#322;owy, bo od kogo tu si&#281; uczy&#263;. Ludzie z Zenda zamiast przenosi&#263; API na OO i robi&#263; generalne porz&#261;dki przykrywaj&#261; niedoskona&#322;o&#347;ci j&#281;zyka swoim frameworkiem.&lt;/p&gt;


	&lt;p&gt;Oczywi&#347;cie czasami trzeba pogodzi&#263; ze sob&#261; doskona&#322;y projekt i dzia&#322;aj&#261;cy kod. Tak np. jest w przypadku j&#261;dra Linuksa i j&#261;dra HURD. Ten drugi jest zaawansowanym, powiedzia&#322;bym naukowym projektem, a ten pierwszy po prostu dzia&#322;a i jest udoskonalany na bie&#380;&#261;co na ile si&#281; da.&lt;/p&gt;</description>
      <pubDate>Fri, 16 Nov 2007 12:22:16 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:51970254-5b71-4485-b738-30488e59ca39</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1238</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Nie jest prawd&#261;, &#380;e ten, kto nauczy si&#281; C++ i Jav&#281; to od razu automatycznie b&#281;dzie w stanie pisa&#263; dobry kod w dowolnym j&#281;zyku. Nawyki z pisania w tych j&#281;zykach cz&#281;sto &lt;a href="http://dirtsimple.org/2004/12/python-is-not-java.html" rel="nofollow"&gt;bardziej przeszkadzaj&#261; ni&#380; pomagaj&#261;&lt;/a&gt; To co b&#281;dzie poprawnym podej&#347;ciem w Javie w Pythonie cz&#281;sto okazuje si&#281; koszmarkiem. Co do PHP, to masz racj&#281;, chaos z popl&#261;taniem, nic dziwnego &#380;e w tym j&#281;zyku trudno jest napisa&#263; czytelny kod. Osobi&#347;cie te&#380; troch&#281; przychylam si&#281; do duetu Java + JRuby. A z tym Google, to nie chodzi o uciekanie od Javy, ale raczej o to, &#380;e Google najwyra&#378;niej nie ma najmniejszego zamiaru oprze&#263; si&#281; we wszystkim na Javie, ale wybiera zupe&#322;nie inne podej&#347;cie. Python jest tam podstaw&#261; wi&#281;kszo&#347;ci ich projekt&#243;w. Je&#347;li mo&#380;na m&#243;wi&#263; o ucieczce, to na pewno uciekaj&#261; tam od Perla (przepisuj&#261; stare skrypty na Pythona).&lt;/p&gt;</description>
      <pubDate>Fri, 16 Nov 2007 11:02:28 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:6cf26e11-fb06-4c8f-bab4-f98ec240c66c</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1237</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Leszek</title>
      <description>&lt;p&gt;Czy zatem kod napisany w PHP przez tych samym &amp;#8220;kiepsko op&#322;acanych studenciak&#243;w&amp;#8221; b&#281;dzie ju&#380; mniej koszmarny, bo jest napisany w PHP albo innym j&#281;zyku skryptowym? Moim zdaniem dobre opanowanie j&#281;zyka typu Java skutkuje tym, &#380;e p&#243;&#378;niej mo&#380;na pisa&#263; dobry w kod w dowolnym innym j&#281;zyku. Niestety poznanie Javy to d&#322;ugie miesi&#261;ce nauki, a w j&#281;zyku skryptowym szast prast i po tygodniu robimy aplikacj&#281;. Tylko co z tego skoro kto&#347; i tak nie rozumie dlaczego zrobi&#322; co&#347; w taki czy inny spos&#243;b, bo wa&#380;ne jest tylko, &#380;e dzia&#322;a. Ok, zgadzam si&#281;, &#380;e PHP jest prostszy od Javy, w ko&#324;cu nie ma po&#322;owy funkcjonalno&#347;ci OO jaka jest w Javie.
Wystarczy spojrze&#263; w API PHP &amp;#8211; pomieszanie z popl&#261;taniem. W tym to dopiero ludzie potrafi&#261; koszmarki tworzy&#263;. Moim zdaniem sensowny wyb&#243;r to Java+JRuby.&lt;/p&gt;


	&lt;p&gt;Java nie jest wybierana w firmach dlatego, &#380;e ludzie lubi&#261; sie katowa&#263; wymy&#347;lnymi abstrakcjami. To przewidywalna platforma ze silnym wsparciem. Poza tym nie liczy sie tylko j&#281;zyk, ale ca&#322;a otoczka &amp;#8211; narz&#281;dzia!&lt;/p&gt;


	&lt;p&gt;Nie do ko&#324;ca rozumiem twierdzenie, &#380;e Google ucieka od Javy na rzecz Pythona. Jak to si&#281; ma do GWT i Androida ?&lt;/p&gt;</description>
      <pubDate>Fri, 16 Nov 2007 09:41:25 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:7063a19d-aaef-4cf0-8c01-540461ac878d</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1236</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Jacek</title>
      <description>&lt;p&gt;Moje wra&#380;enie jest takie &#380;e Java to co&#347; co b&#281;dzie mia&#322;o swoje miejsce ale generalnie ci&#281;&#380;ar b&#281;dzie sie przesuwa&#322; w stron&#281; wy&#380;szego poziomu abstrakcji i wygody &amp;#8211; czyli Pythona/Ruby/Groovy.&lt;/p&gt;


	&lt;p&gt;Argumenty &#380;e Java jest lepsza bo u&#380;ywaj&#261; jej &amp;#8216;du&#380;e firmy&amp;#8217; no &amp;#8216;wi&#281;cej szukaj&#261; javowc&#243;w&amp;#8217; itd. s&#261; dla mnie po prostu &#347;mieszne i raczej &#347;wiadcz&#261; o kompleksach pisz&#261;cego ni&#380; o przysz&#322;o&#347;ci j&#281;zyk&#243;w.&lt;/p&gt;


	&lt;p&gt;Maj&#261;c okazj&#281; pracowa&#263; przy naprawd&#281; du&#380;ym projekcie J2EE mam opini&#281; &#380;e Java jest nadu&#380;ywana &amp;#8211; w wi&#281;kszo&#347;ci miejsc nale&#380;a&#322;oby j&#261; zast&#261;pi&#263; j&#281;zykiem wy&#380;szego poziomu (skryptowym) co radykalnie przyspieszyloby dewelopment, testowanie i pozniejsza analize kodu.&lt;/p&gt;


	&lt;p&gt;Mo&#380;e Java i daje jakies wi&#281;ksze mo&#380;liwo&#347;ci ale z tego co widz&#281; firmy zatrudniaj&#261; studenciak&#243;w kt&#243;rzy t&#261; jav&#281; ledwo znaj&#261; &amp;#8230; i m&#281;cz&#261; sie z nia produkuj&#261;c koszmarki kt&#243;re sa wpychane klientom&amp;#8230; I nie ma tam prawie &#347;ladu &#380;adnych mo&#380;liwo&#347;ci kt&#243;re daje J2EE a kt&#243;rych nie ma w PHP &amp;#8230;&lt;/p&gt;


	&lt;p&gt;Efektem sa megabajty fatalnego kodu w Java &amp;#8230;&lt;/p&gt;


	&lt;p&gt;A mog&#322;yby by&#263; setki kB w Java i 3x mniej megabajtow kodu w PHP &amp;#8230;&lt;/p&gt;


	&lt;p&gt;Takie s&#261; tylko moje wra&#380;enia bo paru latach pracy z kodem dostarczanym przez &amp;#8220;najwi&#281;ksze &#347;wiatowe korporacje&amp;#8221; w &amp;#8220;najlepszych technolohiach J2EE&amp;#8221; a tak naprawde pisanym przez kiepsko oplacanych studenciakow &amp;#8230;&lt;/p&gt;</description>
      <pubDate>Fri, 16 Nov 2007 01:15:43 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:d8535bc4-9957-4b1e-b811-a4bbc4392976</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1235</link>
    </item>
    <item>
      <title>"Ruby, Python vs Java,C++" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Troch&#281; m&#281;tnie jest definiowa&#263; j&#281;zyk skryptowy jako j&#281;zyk do pisania skrypt&#243;w (bo tautologia), a skrypty jako &amp;#8220;niedu&#380;e programy&amp;#8221; (bo co to znaczy &amp;#8220;niedu&#380;e&amp;#8221;?) Jedynie uwaga o tej automatyzacji mo&#380;e mie&#263; jaki&#347; sens, ale b&#281;dzie tak tylko wtedy, je&#347;li to jest &lt;strong&gt;jedyne zastosowanie&lt;/strong&gt; danego j&#281;zyka. I tu bym si&#281; zgodzi&#322;. Np. j&#281;zykiem skryptowym mo&#380;na by nazwa&#263; bash&amp;#8217;a. Na pewno jednak nie mo&#380;na tego samego uczyni&#263; w stosunku do Lispa, Pythona, Ruby czy Erlanga. To s&#261; j&#281;zyki og&#243;lnego zastosowania i potrafi&#261; znacznie wi&#281;cej ni&#380; napisanie jakiego kilku linijkowego skryptu automatyzuj&#261;cego zadania.&lt;/p&gt;


	&lt;p&gt;M&#243;wi&#261;c kr&#243;tko: nazywanie Pythona czy Ruby j&#281;zykiem skryptowym jest b&#322;&#281;dem. Zw&#322;aszcza w &#347;wietle istnienia ich javowo-dotnetowych implementacji (JRuby, IronRuby, Jython i IronPython). Python i Ruby to wysokopoziomowe, interpretowane j&#281;zyki &lt;strong&gt;dynamicznie&lt;/strong&gt; i tak powinno je si&#281; okre&#347;la&#263;.&lt;/p&gt;</description>
      <pubDate>Wed, 14 Nov 2007 15:47:11 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:be885fbe-19eb-4e66-b575-63b543434742</guid>
      <link>http://blog.zabiello.com/articles/2005/11/14/ruby-python-vs-java-c#comment-1230</link>
    </item>
  </channel>
</rss>
