<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Tag javascript</title>
    <link>http://blog.zabiello.com/articles/tag/javascript</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Prototype - oficjalne API i dokumentacja</title>
      <description>&lt;p&gt;Znana biblioteka &lt;strong&gt;Prototype&lt;/strong&gt; doczeka&#322;a si&#281; w&#322;asnej dokumentacji, &lt;span class="caps"&gt;API&lt;/span&gt; oraz bloga: &lt;a href="http://prototypejs.org/"&gt;http://prototypejs.org&lt;/a&gt;. Prototype zapewnia lekkie, eleganckie &lt;span class="caps"&gt;API&lt;/span&gt; &lt;strong&gt;o sk&#322;adni wzorowanej na j&#281;zyku Ruby&lt;/strong&gt;. Ta sk&#322;adnia jest tak &#322;adna, &#380;e niekt&#243;rzy nawet nie widz&#261; potrzeby tworzenia dodatkowych helper&#243;w.  W tej chwili to, moim zdaniem, najlepsza biblioteka do JavaScript i &lt;span class="caps"&gt;AJAX&lt;/span&gt;. &lt;a href="http://rubyonrails.org"&gt;Rails&lt;/a&gt; postawi&#322; zdecydowanie na dobrego konia. &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt; &amp;#8211; niejako  &amp;#8220;z rozp&#281;du&amp;#8221;, bo skopiowali railsowe helpery &amp;#8211; te&#380;. :)&lt;/p&gt;


	&lt;p&gt;Rozmawia&#322;em niedawno na &lt;span class="caps"&gt;IRC&lt;/span&gt;&amp;#8217;u (irc.freenode#pylons) z developerami &lt;a href="http://pylonshq.com"&gt;Pylons&#243;w&lt;/a&gt;. Maj&#261; rozszerzy&#263; swoje helpery o dodatkowe funkcje, ale nie zaimplementuj&#261; p&#281;tli kt&#243;re s&#261; w Prototype i railsowych &lt;a href="http://www.rubyinside.com/16-rjs-resources-and-tutorials-for-rails-programmers-5.html"&gt;&lt;span class="caps"&gt;RJS&lt;/span&gt;&lt;/a&gt; (szablonach generuj&#261;cych JavaScript w j&#281;z. Ruby) Ograniczeniem jest tu sk&#322;adnia Pythona. Tzn. mo&#380;na by si&#281; pokusi&#263; o tak&#261; implementacj&#281;, ale by&#322;aby ma&#322;o &amp;#8220;pythonic&amp;#8221;, tj. zgodna z filozofi&#261; i czytelno&#347;ci&#261; j&#281;zyka Python. Wi&#281;c raczej na &lt;span class="caps"&gt;RJS&lt;/span&gt; dla Pythona nie ma co liczy&#263;.&lt;/p&gt;


	&lt;p&gt;Wg mnie te wszystkie helpery jakie ma RoR (i &lt;span class="caps"&gt;RJS&lt;/span&gt; w szczeg&#243;lno&#347;ci) to jedna z lepszych cech Rails&#243;w kt&#243;rej brak  u konkurencji. Nie zgodz&#281; si&#281; tu z tymi, co uwa&#380;aj&#261; &#380;e lepiej w og&#243;le nie u&#380;ywa&#263; &#380;adnych helper&#243;w i pisa&#263; w czystym JavaScript.  Mimo &#322;adnej sk&#322;adni Prototype, railsowe helpery i &lt;span class="caps"&gt;RJS&lt;/span&gt; daj&#261; znacznie wi&#281;kszy komfort pracy. Np. we&#378;my tak&#261; konstrukcj&#281; w pliku &lt;span class="caps"&gt;RJS&lt;/span&gt;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;replace_html&lt;/span&gt; &lt;span class="symbol"&gt;:my_id&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:partial&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;podszablon&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Co robi powy&#380;sza metoda? Buduje kod JavaScript kt&#243;ry podmienia zawarto&#347;&#263; (innerHTML) dla tagu o id =&amp;#8217;my_id&amp;#8217; zawarto&#347;ci&#261; szablonu &lt;span class="caps"&gt;RHTML&lt;/span&gt; (oczywi&#347;cie jego zawarto&#347;&#263; jest automatycznie &amp;#8220;escape&amp;#8217;owana&amp;#8221;, aby kod JS si&#281; nie wysypa&#322;). Trzeba si&#281; nie&#378;le napracowa&#263; aby uzyska&#263; podobny efekt poza Railsami.&lt;/p&gt;


	&lt;p&gt;Troch&#281; si&#281; dziwi&#281;, &#380;e &lt;a href="http;//djangoproject.com"&gt;Django&lt;/a&gt; my&#347;li o &lt;a href="http://article.gmane.org/gmane.comp.web.dojo.user/3603"&gt;dodaniu Dojo&lt;/a&gt; zamiast Prototype. Mamy w pracy raczej z&#322;e do&#347;wiadczenie z Dojo. Jest ci&#281;&#380;kie, zamotane, trudne do debugowania, modyfikacji. To po cz&#281;&#347;ci efekt podej&#347;cia nastawionego na u&#380;ywanie z&#322;o&#380;onych komponent&#243;w (na&#347;laduj&#261; .NET?) Takie podej&#347;cie (u&#380;ywanie zbyt wysokopoziomowych, z&#322;o&#380;onych komponent&#243;w) generalnie spotyka si&#281; z krytyk&#261; wielu programist&#243;w. Pro&#347;ciej operowa&#263; elastycznym i przejrzystym  kodem (takim jak w Prototype) ni&#380; gotowymi, zamkni&#281;tymi i  trudnymi do debugowania komponentami Dojo.&lt;/p&gt;</description>
      <pubDate>Fri, 19 Jan 2007 16:53:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:f2186883-61cb-4878-ac1c-a526a3b53694</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/01/19/prototype-oficjalne-api-i-dokumentacja</link>
      <category>prototype</category>
      <category>ajax</category>
      <category>javascript</category>
      <category>rjs</category>
      <category>rails</category>
      <category>dojo</category>
    </item>
    <item>
      <title>Ruby najszybciej rosn&#261;cym j&#281;zykiem</title>
      <description>&lt;p&gt;Ruby ostro idzie do przodu przesuwaj&#261;c si&#281; w g&#243;r&#281; na li&#347;cie popularno&#347;ci oczko za oczkiem. Wg &lt;a href="http://www.tiobe.com/tpci.htm"&gt;&lt;span class="caps"&gt;TIOBE&lt;/span&gt; Programming Community Index&lt;/a&gt; Ruby by&#322; j&#281;zykiem roku 2006 (w styczniu 2007 Ruby jest 10 pozycji). Z pewno&#347;ci&#261; przyczyni&#322; si&#281; do tego framework &lt;a href="http://rubyonrails.org"&gt;Rails&lt;/a&gt;. Pewnie z tego samego powodu (tu jest ni&#261; &lt;span class="caps"&gt;AJAX&lt;/span&gt;) rosnie popularno&#347;&#263; j&#281;zyka JavaScript.&lt;/p&gt;


	&lt;p&gt;Dawniej popularno&#347;&#263; j&#281;zyka dyktowa&#322;o wsparcie du&#380;ych firm (Sun dla Javy i Microsoft dla C#). Ale wsp&#243;&#322;cze&#347;nie du&#380;o wi&#281;ksze znaczenie zaczyna mie&#263; &amp;#8220;killer application&amp;#8221; (&amp;#8220;zab&#243;jcza&amp;#8221; aplikacja promuj&#261;ca j&#281;zyk w jakim zosta&#322;a napisana) oraz to co twierdzi internet. St&#261;d zwyci&#281;zcy w ostatnich dw&#243;ch latach (PHP i Java) w tym roku (2006) s&#261; przegranymi.&lt;/p&gt;


	&lt;p&gt;Mo&#380;na te&#380; zauwa&#380;y&#263; trend rosn&#261;cej popularno&#347;ci j&#281;zyk&#243;w typowanych dynamicznie przy malej&#261;cym tych typowanych statycznie. Ale to nic dziwnego. Od czasu prze&#322;amania pewnej bariery wydajno&#347;ci sprz&#281;tu upad&#322; g&#322;&#243;wny pow&#243;d od aby nie korzysta&#263; z j&#281;zyk&#243;w dynamicznych na szersz&#261; skal&#281;. (Z pewno&#347;ci&#261; taki &lt;a href="http://pl.wikipedia.org/wiki/Smalltalk"&gt;Smalltalk&lt;/a&gt; narodzi&#322; si&#281; zdecydowanie w z&#322;ym czasie)  Ciekawa jest te&#380; uwaga, &#380;e wi&#281;kszo&#347;&#263; popularno&#347;ci j&#281;zyka &lt;span class="caps"&gt;PHP&lt;/span&gt; nabijana jest jego problemami z bezpiecze&#324;stwem zamiast faktycznym uzyskiwaniem popularno&#347;ci w kr&#281;gach programist&#243;w.&lt;/p&gt;


	&lt;p&gt;Interesuj&#261;ce jest r&#243;wnie&#380; to, &#380;e szybko zdobywa popularno&#347;&#263;  &lt;a href="http://www.tiobe.com/tiobe_index/D.html"&gt;j&#281;zyk D&lt;/a&gt;, o kt&#243;rym do niedawna ma&#322;o kto s&#322;ysza&#322;. To dosy&#263; ciekawy j&#281;zyk i do tego ekstremalnie szybki (stosuje jakie&#347; agresywne algorytmy kompilacji). Ma te&#380; automatyczne zarz&#261;dzanie pami&#281;ci&#261; (garbage collector). Chyba mo&#380;e bez kompleks&#243;w i&#347;&#263; na wojn&#281;  C++, Jav&#261; czy C#. (Zobacz &lt;a href="http://www.digitalmars.com/d/comparison.html"&gt;por&#243;wnanie D z innymi j&#281;zykami&lt;/a&gt;.)&lt;/p&gt;


	&lt;p&gt;Z kolei z j&#281;zyk&#243;w bardziej niszowych odnotowa&#263; mo&#380;na wzrost popularno&#347;ci &lt;a href="http://en.wikipedia.org/wiki/Lua_%28programming_language%29"&gt;Lua&lt;/a&gt; (z pozycji 58 na 47) oraz funkcyjnego &lt;a href="http://en.wikipedia.org/wiki/Haskell_%28programming_language%29"&gt;Haskella&lt;/a&gt; (z 56 na 42).  Przewiduje si&#281; te&#380;, &#380;e z powodu oczekiwanej migracji z C++ i Visual Basic, w roku 2007 zwyci&#281;zc&#261; w kategorii najbardziej popularnego j&#281;zyka, b&#281;dzie C#.&lt;/p&gt;</description>
      <pubDate>Thu, 04 Jan 2007 18:00:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:6780b9da-c0a2-46c4-b8c0-48037eb49cec</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/01/04/ruby-najszybciej-rosn%C4%85cym-j%C4%99zykiem</link>
      <category>news</category>
      <category>ruby</category>
      <category>d</category>
      <category>c</category>
      <category>php</category>
      <category>javascript</category>
      <category>lua</category>
      <category>haskell</category>
    </item>
    <item>
      <title>JavaScript idzie w dobrym kierunku</title>
      <description>&lt;p&gt;Musz&#281; przyzna&#263;, &#380;e od czasu grzebania w bibliotece &lt;a href="http://prototype.conio.net/"&gt;Prototype&lt;/a&gt; spojrza&#322;em w troch&#281; &#347;wie&#380;y spos&#243;b na j&#281;zyk JavaScript. Prototype jest przyk&#322;adem tego, jak bardzo elegancki, dynamiczny i obiektowy kodu mo&#380;na pisa&#263; w tym j&#281;zyku. Pozwala te&#380; na pisanie bardzo eleganckiego kodu mocno &lt;a href="http://encytemedia.com/blog/articles/2005/12/07/prototype-meets-ruby-a-look-at-enumerable-array-and-hash"&gt;przypominaj&#261;cego j&#281;zyk Ruby&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Np. poni&#380;szy kod wy&#347;wietla cztery razy okienko alertu. (Odpowiednikiem bloku kodu (ang. closure) w Ruby jest tu anonimowa funkcja).&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;function&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="ident"&gt;alert&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;JavaScript is cool&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;span class="punct"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Co ciekawe, w JavaScript (podobnie jak Ruby) mo&#380;na przeci&#261;&#380;a&#263; wszystkie obiekty. Np. poni&#380;ej do klasy Array dodano metod&#281; inArray.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;prototype&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;inArray&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;function&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;needle&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="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;var&lt;/span&gt; &lt;span class="ident"&gt;key&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;this&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&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;this&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;key&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;===&lt;/span&gt; &lt;span class="ident"&gt;needle&lt;/span&gt;&lt;span class="punct"&gt;)&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;true&lt;/span&gt;
    &lt;span class="punct"&gt;}&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="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;JavaScript posiada te&#380; wbudowany operator do wyra&#380;e&#324; regularnych. Np. poni&#380;szy kod sprawdza poprawno&#347;&#263; pola w formularzu:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_html "&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
//&amp;lt;![CDATA[
var MyForm = {
  validateEmail: function() {
    if ($F('email_id').match(/^.+?@([\w\d\.-]+?\.\w{2,5})\s*$/)) {
      $('email_error').innerHTML = '';
      return true;
    } else {    
      $('email_error').innerHTML = 'Wrong email format!';
      return false;
    }
  },
  validateForm: function() {
    return this.validateEmail() ? true: false;
  }
};
//]]&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;form action=&amp;quot;&amp;quot; method=&amp;quot;post&amp;quot; onsubmit=&amp;quot;return MyForm.validateForm()&amp;quot;&amp;gt;
  &amp;lt;table border=&amp;quot;0&amp;quot; id=&amp;quot;container&amp;quot;&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;&amp;lt;label for=&amp;quot;email_id&amp;quot;&amp;gt;Email Adddress:&amp;lt;/label&amp;gt;&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email_id&amp;quot; onchange=&amp;quot;MyForm.validateEmail()&amp;quot; /&amp;gt;
        &amp;lt;span id=&amp;quot;email_error&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;input id=&amp;quot;submit&amp;quot; type=&amp;quot;submit&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/table&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Jakby tego by&#322;o ma&#322;o, JavaScript w nadchodz&#261;cej &lt;a href="http://developer.mozilla.org/en/docs/New_in_JavaScript_1.7"&gt;wersji 1.7&lt;/a&gt; przejmuje troch&#281; wygodnej sk&#322;adni Pythona!&lt;/p&gt;


	&lt;p&gt;Szkoda, &#380;e taki popularny &lt;span class="caps"&gt;PHP&lt;/span&gt; wzoruje si&#281; na brzydkiej sk&#322;adni Perla,  C++ i Javy. JavaScript wybra&#322; sobie znacznie bardziej eleganckie wzorce.&lt;/p&gt;</description>
      <pubDate>Mon, 13 Nov 2006 17:56:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:c009fda8-0967-4000-845a-d56fd7e6d86a</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/11/13/javascript-is-cool</link>
      <category>javascript</category>
      <category>prototype</category>
    </item>
  </channel>
</rss>
