<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://moblur.org/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>moBlur.org</title>
  <link>http://moblur.org/</link>
  <description>A web log about Ajax and web coding techniques.</description>
  <language>en</language>
  <pubDate>Tue, 29 Apr 2008 07:58:03 +0200</pubDate>
  <copyright>Nicolas Crovatti</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Favion Archive Update #1</title>
    <link>http://moblur.org/post/2008/04/28/Favion-Archive-Update-1</link>
    <guid isPermaLink="false">urn:md5:0a6869be364d9a76dc8fc26fde0b897b</guid>
    <pubDate>Mon, 28 Apr 2008 20:07:00 +0200</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>The Favicon Archive Project</category>
        <category>database</category><category>favicon</category><category>icons</category><category>service</category>    
    <description>    I recently added one dedicated server to the &lt;a href=&quot;http://moblur.org/tag/Favicon&quot;&gt;Favicon&lt;/a&gt; archive project. It will handle two main duties : serving a fast Postgresql 8.3 DBMS with 1GB physical memory on board and eventually plugs into the main Favicon server as a file server using NFS.
&lt;p&gt;The new dedicated DB &lt;a href=&quot;http://moblur.org/tag/server&quot;&gt;server&lt;/a&gt; is incomparably faster than the shared one (256MB vs 1GB) and allowed the spawn of many more crawler processes. I'm running with 34 currently&amp;nbsp; instead of 6 previously.&lt;/p&gt;
Side effects : hard drive storage will run slow much sooner :D That why I'm wondering about sharing the new server hard drive which will hopefully adds about 200GB to the file archive.&lt;br /&gt;
&lt;p&gt;Here is a summary of the Favicon Archive after one month exploitation:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Favicon files : 4,3GB&lt;/li&gt;
&lt;li&gt;Cache files : 41,0GB&lt;/li&gt;
&lt;li&gt;Database size : 3,0GB&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;Crawler stats 5 minutes (1 month history): &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Average Homepage fetched&amp;nbsp; : 237&lt;/li&gt;
&lt;li&gt;Average Favicon saved&amp;nbsp; :&amp;nbsp; 122&lt;/li&gt;
&lt;li&gt;Total sites discovered : 4 M&lt;/li&gt;
&lt;li&gt;Total saved icons : 728 K&lt;/li&gt;
&lt;/ul&gt;
This is about 1 favicon found every 2 web sites fetched and 1 favicon found every 5,5 sites discovered. &lt;br /&gt;&lt;br /&gt;At this rate, the system will cope about &lt;strong&gt;8,7M&lt;/strong&gt; &lt;a href=&quot;http://moblur.org/tag/favicon&quot;&gt;favicon&lt;/a&gt;s in the next year (generating &lt;strong&gt;51GB&lt;/strong&gt; &lt;a href=&quot;http://moblur.org/tag/icons&quot;&gt;icons&lt;/a&gt; data and about &lt;strong&gt;486GB&lt;/strong&gt; cache files), this will results in about &lt;strong&gt;48M&lt;/strong&gt; web sites in the &lt;a href=&quot;http://moblur.org/tag/database&quot;&gt;database&lt;/a&gt; and I will eventually reach my first billion websites discovered in about &lt;strong&gt;21 years&lt;/strong&gt; (for about &lt;strong&gt;1TB&lt;/strong&gt; icons &lt;strong&gt;11TB&lt;/strong&gt; cache files ) :D&lt;br /&gt;&lt;br /&gt;Still at this rate, I'll will run out of space and shut down all the crawlers in about : &lt;strong&gt;3 months and 3 weeks&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;h2&gt;&lt;a style=&quot;font-weight: bold;&quot; hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/favicon_archive/&quot;&gt;Add your site before closure !&lt;/a&gt;&lt;/h2&gt;
&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;More seriously, I'll try to implement some interesting features like : &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Homepage ownership using special meta tag that will allow you to edit your keywords, tags and description.&lt;/li&gt;
&lt;li&gt;Icon search by colors.&lt;/li&gt;
&lt;li&gt;Community and voting system&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Magento vs OsCommerce, migration et site eCommerce</title>
    <link>http://moblur.org/post/2008/04/22/Magento-vs-OsCommerce-migration-et-site-eCommerce</link>
    <guid isPermaLink="false">urn:md5:bc56ceeac8f9e263d9ee861ea078ed7b</guid>
    <pubDate>Tue, 22 Apr 2008 10:33:00 +0200</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>moBlur</category>
        <category>ecommerce</category><category>magento</category><category>oscommerce</category>    
    <description>    &lt;p&gt;&lt;img style=&quot;margin: 0 1em 1em 0; float: left;&quot; alt=&quot;&quot; src=&quot;http://moblur.org/public/magento-vs-oscommerce.png&quot; /&gt;Mon collègue &lt;a hreflang=&quot;fr&quot; href=&quot;http://feelthemix.wordpress.com/&quot;&gt;Julio&lt;/a&gt; va très bientôt se voir affecter l'interressante tâche de piloter la migration d'un site Ecommerce tournant sous OsCommerce vers une nouvelle plateforme Open Source : Magento. Il a déjà bien étudier son sujet et prévoit de nous tenir au courant de l'évolution de cette migration par le biais de &lt;a hreflang=&quot;fr&quot; href=&quot;http://feelthemix.wordpress.com/2008/04/21/mettre-en-ligne-son-propre-site-e-commerce-a-pas-cher/#more-27&quot;&gt;son blog&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;A suivre donc !&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Introducing : moBlur's Favicon Archive Project</title>
    <link>http://moblur.org/post/2008/04/09/moBlurs-Favicon-Archive-Project</link>
    <guid isPermaLink="false">urn:md5:8e8cc029151e124cf461cb5e6b91c9ab</guid>
    <pubDate>Tue, 15 Apr 2008 11:54:00 +0200</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>moBlur</category>
        <category>archive</category><category>database</category><category>design</category><category>favicon</category><category>icons</category><category>PHP5</category>    
    <description>    &lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/favicon_archive/&quot;&gt;&lt;img style=&quot;margin: 0 1em 1em 0; float: left;&quot; alt=&quot;&quot; src=&quot;http://moblur.org/public/screenshots/fia_index-2008-04.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All hail to&amp;nbsp; the world's first &lt;a hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/favicon_archive/&quot;&gt;Favicon Archive&lt;/a&gt;! &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In the next days you may notice yet another crawler visiting your site; identified by &lt;br /&gt;&quot;FaviconArchiver/1.0 (+http://moblur.org/workshop/favicon_archive/)&quot; user agent, it will gather your homepage (and only this page unless redirected) and save your &lt;strong&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://en.wikipedia.org/wiki/Favicon&quot;&gt;favicon&lt;/a&gt;&lt;/strong&gt; to moblur's dedicated database. Once crawled, if your site does have a favicon, it will appear on our index page and on the search engine. A dedicated page will also be directly accessible and will display a summary of your site based on meta tags and a link to your domain.&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;This project is born from curiosity in large database driven web applications. How to scale, how to optimize, how to deal with a huge database and gigantic filesystem entries were the main questions i was asking myself.&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;The project itself is far from being optimal.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The crawler, written in PHP 5 can be better, faster... in fact, it could have be written in C++ ... &lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt;The database&amp;nbsp; system recently upgraded from PostgreSQL 8.1 to 8.3 still needs some fine tuning ( Thanks Phil for your precious help and advices on this :D ).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So far, (a couple weeks) so good, the crawler discovered 2.5M unique domains (subdomains counts too)&amp;nbsp; and saved&amp;nbsp; 1/2 M&amp;nbsp; Favicons on the filesystem (ext3 on debian stable)&lt;/p&gt;
&lt;p&gt;Current room for the application : &lt;/p&gt;
&lt;ul&gt;&lt;li&gt;CPU 1.20GHz&lt;/li&gt;
&lt;li&gt;RAM 256 Mb&lt;/li&gt;
&lt;li&gt;HDD 144G&lt;/li&gt;
&lt;/ul&gt;
All dedicated (well almost dedicated) to the favicon archive. &lt;br /&gt;&lt;br /&gt;My goal now is to optimize the application to keep it inside this nutshell for the longest time possible.&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Google Charts frontend GUI with Javascript</title>
    <link>http://moblur.org/post/2008/03/24/Google-Charts-frontend-GUI-with-Javascript</link>
    <guid isPermaLink="false">urn:md5:4fc76a1add739de714239201a1a25f96</guid>
    <pubDate>Mon, 24 Mar 2008 20:09:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>JavaScript</category>
        <category>Charts</category><category>Google</category><category>JavaScript</category><category>jQuery</category>    
    <description>    &lt;p&gt;I recently worked on a basic frontend GUI (Graphical User Interface) to the Google's Charts API (http://code.google.com/apis/chart/). It's alpha version so please, if you have any comments, get in touch with me !&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a style=&quot;font-weight: bold;&quot; hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/google_chart_gui/&quot;&gt;Google Charts GUI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;a hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/google_chart_gui/&quot;&gt;&lt;img style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://moblur.org/public/chart.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>moBlur's First month! (Firefox usage evolved)</title>
    <link>http://moblur.org/post/2008/03/17/One-month-history</link>
    <guid isPermaLink="false">urn:md5:d78f1c8590e62eea1b0bdf58910e7b56</guid>
    <pubDate>Sun, 16 Mar 2008 20:45:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>moBlur</category>
        <category>browsers</category><category>firefox rox</category><category>moBlur</category>    
    <description>    &lt;p&gt;To celebrate moBlur's first month, I generated a pie chart of browsers usage on moBlur.org according to my analytics reports.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://moblur.org/public/browserchart-mars2008.png&quot; /&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;strong&gt;1. Firefox                   701  77,29 %&lt;br /&gt;2. Internet Explorer         104  11,47 %&lt;br /&gt;3. Safari                     45   4,96 %&lt;br /&gt;4. Opera                      26   2,87 %&lt;br /&gt;5. Mozilla                    21   2,32 %&lt;br /&gt;6. Mozilla Compatible Agent    6   0,66 %&lt;br /&gt;7. Camino                      3   0,33 %&lt;br /&gt;8. Konqueror                   1   0,11 %&lt;/strong&gt;&lt;/pre&gt;
This is almost 80% Firefox usage. Impressive, the blogs and developer's communities seems to know where the truth is. &lt;br /&gt;It also saves me because I don't have any Windows license to debug my pages in Internet Explorer ... &lt;br /&gt;&lt;br /&gt;Anyway, if you are still using IE, do yourself a favor : &lt;a hreflang=&quot;en&quot; href=&quot;http://www.mozilla-europe.org/en/products/firefox/&quot;&gt;get Firefox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Amazon Web Services with PHP5 and jQuery</title>
    <link>http://moblur.org/post/2008/03/16/Amazon-Web-Services-with-PHP5-and-jQuery</link>
    <guid isPermaLink="false">urn:md5:b34efbb023e0cbbaf31dcbdb2b758302</guid>
    <pubDate>Sun, 16 Mar 2008 18:09:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>Ajax</category>
        <category>Ajax</category><category>amazon</category><category>jQuery</category><category>PHP</category>    
    <description>    &lt;p&gt;Back in 1999 I used to wrote some scripts using ASP and Javascript in order to automagicaly display books related to the topics of my articles. Nowadays this task is quite simple using Amazon's API. There is no more cache problems with outdated prices or products availability. I created an account on AWS and Amazon affiliates and started to code a set of scripts using Amazon's API for education purpose.&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;I came up with a nice search engine that is unfortunately not working with Internet Explorer. The script is far from perfect but, since I find it interesting I put it on my Workshop for all you to see and comment. &lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;del&gt;If you have any lead that can help me to make it functional in Internet Explorer your feedback will be gladly welcomed!&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I finaly managed to get it functional in IE!&lt;/strong&gt;&lt;/p&gt;
&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/ajax_amazon_associates/&quot;&gt;Amazon Associates &amp;amp; AWS - PHP5 and jQuery&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>jQuery + jFlot - Plots, Canvas and Charts</title>
    <link>http://moblur.org/post/2008/03/12/jQuery-jFlot-Plots-Canvas-and-Charts</link>
    <guid isPermaLink="false">urn:md5:d656890f80fbadac6b3560e32378c1b8</guid>
    <pubDate>Wed, 12 Mar 2008 19:14:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>JavaScript</category>
        <category>Canvas</category><category>Charts</category><category>jFlot</category><category>jQuery</category><category>Plots</category>    
    <description>    Sometimes an example tells much more than an article. Please go head to the Workshop to discover the &lt;a hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/jflot_intro/&quot;&gt;jFlot Introduction&lt;/a&gt; on generating charts and plots using Canvases and jQuery's plugin jflot.&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Moteur de template Javascript, comparaison et benchmark</title>
    <link>http://moblur.org/post/2008/03/03/Moteur-de-template-Javascript-comparaison-et-benchmark</link>
    <guid isPermaLink="false">urn:md5:ec604beea9063b8652dc6d8c5de5f5c5</guid>
    <pubDate>Mon, 03 Mar 2008 01:40:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>JavaScript</category>
        <category>Ajax</category>    
    <description>    &lt;p&gt;Comme &lt;a hreflang=&quot;fr&quot; href=&quot;http://moblur.org/post/2008/02/24/jQuery-et-jTemplate&quot;&gt;déjà exprimé&lt;/a&gt; plus tôt j'ai longtemps souhaité déplacer mon code XHTML et CSS en dehors de mes librairies Javascript. J'ai donc récement entendu parler des moteurs de templates Javascript. Seule ou plugin de framework existant, ces outils sont la prochiane étape pour les developpeurs web.&lt;/p&gt;
&lt;p&gt;Je ne parlerai que de trois d'entre eux :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;jTemplates basé sur le framework jQuery. (&lt;a hreflang=&quot;en&quot; href=&quot;http://jtemplates.tpython.com/&quot;&gt;http://jtemplates.tpython.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Javascript Template de Trimpath (&lt;a hreflang=&quot;en&quot; href=&quot;http://code.google.com/p/trimpath/wiki/JavaScriptTemplates&quot;&gt;http://code.google.com/p/trimpath/wiki/JavaScriptTemplates&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;et EJS, Embedded JavaScript. Une libraire dédiée (&lt;a hreflang=&quot;en&quot; href=&quot;http://embeddedjs.com/&quot;&gt;http://embeddedjs.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
J'ai choisis ceux là pour la simple raison qu'il correspondent tous a mes besoins en termes de traitement de données hiérarchisées JSON sous forme princiapelement de tableau. J'ai écrit ce benchmark pour ma propre information. comme je l'ai trouvé interressant j'ai décidé de le publier&lt;br /&gt;&lt;br /&gt;Les résultats mis en évidence par ce script de mesure des performances ne sont pas conçut pour aider quiconque à choisir le &quot;meilleur&quot; moteur de templates, soyez conscient que la vitesse d'execution n'est pas la seul et encore moins le plus important des critères a prendre en compte dans le choix optimal d'un systeme de template pour votre application.&lt;br /&gt;Cependant, si la vitesse et les performances globales sont importante pour votre projet, ce test pourra peut-être vous être utile.&lt;br /&gt;&lt;br /&gt;Notez biens que ce script tourne entièrement&amp;nbsp; côté client, les résultats seront donc uniquement valide sur votre machine et a fortiori seront affectés par les programmes s'executant au moment du test. Ah oui, j'allais oublier, ces tests de performances ne fonctionnent pas sous internet explorer. &lt;br /&gt;&lt;br /&gt;Le benchmark :&lt;br /&gt;Ce script va executer les différente méthodes de transformation des librairies citées en introduction le même nombre de fois. Il va mesurer le temps d'execution pour chacune d'entre elle et les stockera afin d'afficher un graphique généré par un plugin jQuery nommé flot (&lt;a hreflang=&quot;en&quot; href=&quot;http://code.google.com/p/flot/&quot;&gt;http://code.google.com/p/flot/&lt;/a&gt;) de l'intégralité de l'execution ainsi qu'un résumé. Pour eviter tout gel de votre navigateur, les données JSON seront découpées et traitées par lot. Vous pourrez configurer combien de données devront être traitées ainsi que la taille des lots.&lt;br /&gt;&lt;br /&gt;Pour finir, si vous constatez un quelconque illogisme dans les résultats, merci de me contacter !&lt;br /&gt;&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/javascript_template_engines/javascript_template_engines_comparison.html&quot;&gt;Javascript template engines benchmarking&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Javascript Template Engines comparison and benchmark</title>
    <link>http://moblur.org/post/2008/03/03/Javascript-Template-Engines-comparison-and-benchmark</link>
    <guid isPermaLink="false">urn:md5:727e311fec4c8653e4cdfaba2139cec6</guid>
    <pubDate>Mon, 03 Mar 2008 00:26:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>JavaScript</category>
        <category>Ajax</category><category>benchmark</category><category>Canvas</category><category>JavaScript</category><category>jTemplates</category>    
    <description>    &lt;p&gt;For a long time i wished to have the ability to move my XHTML or CSS&amp;nbsp;
code/formatting out of my javascript libraries.&amp;nbsp; I lately heard about&amp;nbsp;
javascript templates engines. Either standalone or plugged into
existing frameworks these tools are the next step for web developpers.&lt;/p&gt;
&lt;p&gt;I will only speak about tree of them :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;jTemplates based on jQuery framework. (&lt;a hreflang=&quot;en&quot; href=&quot;http://jtemplates.tpython.com/&quot;&gt;http://jtemplates.tpython.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Trimpath's Javascript Templates (&lt;a hreflang=&quot;en&quot; href=&quot;http://code.google.com/p/trimpath/wiki/JavaScriptTemplates&quot;&gt;http://code.google.com/p/trimpath/wiki/JavaScriptTemplates&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;and EJS, Embedded JavaScript. A standalone library (&lt;a hreflang=&quot;en&quot; href=&quot;http://embeddedjs.com&quot;&gt;http://embeddedjs.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;Basicaly I choosed them because they have the functionality to process hierachical JSON data input, mainly arrays and evolved syntax. I originally wrote this benchmark script for my own knowledge, since i found it interresting i decided to release it to the public. &lt;br /&gt;&lt;br /&gt;The results shown by the benchmark tool are not intended to guide anyone in choosing the &quot;best&quot; template engine, be aware that speed is not the only and further less the most important criteria in the process of choosing the right template engine for your application. However, it can help if the speed and overall performance is an important issue at some point.&lt;br /&gt;&lt;br /&gt;Note that since the benchmark itself runs on client side, results shown will only be true on your computer and are heavily dependents of its load at the time your are running the test. Oh, a trivial thing, this benchmark is not running at all with internet explorer.&lt;br /&gt;&lt;br /&gt;The benchmark: &lt;br /&gt;This script, will run the different template transformation methods from the librairies the same amount of time for each. It will time every call to these method and stock them into an array. This array will then be processed to display plots using a jQuery plugin named flot (&lt;a hreflang=&quot;en&quot; href=&quot;http://code.google.com/p/flot/&quot;&gt;http://code.google.com/p/flot/&lt;/a&gt;) and summary informations about each of the tree mentioned librairies. To let the control to the browser, the data (JSON) will be splitted into small chunks. You can configure how much data is processed and the chunk's size.&lt;br /&gt;&lt;br /&gt;As a last note, I would be glad if you contact me if you notice any discrepancy in the benchmark results.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://moblur.org/workshop/javascript_template_engines/javascript_template_engines_comparison.html&quot;&gt;Javascript template engines benchmarking&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>jQuery et jTemplates</title>
    <link>http://moblur.org/post/2008/02/24/jQuery-et-jTemplate</link>
    <guid isPermaLink="false">urn:md5:c29ad1a80c9516f2ac3c39923adcfec9</guid>
    <pubDate>Wed, 27 Feb 2008 00:41:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>JavaScript</category>
        <category>Ajax</category><category>benchmark</category><category>jQuery</category><category>jTemplates</category>    
    <description>    &lt;p&gt;jTemplate (http://jtemplates.tpython.com) est un plugin pour jQuery
(http://jquery.com/). Il ajoute la merveilleuse fonctionnalité qu'est
le templating à la librairie jQuery. J'avais longtemps souhaiter cela !
C'est chose faite à présent et c'est à la fois extrêmement pratique et
puissant.&lt;br /&gt;&lt;br /&gt;Les développeurs, par soucis de relecture et maintenance, cherchent à dissocier au maximum le contenu de la partie code. Appliqué à PHP, Smarty (http://www.smarty.net/) fût une véritable révolution lors de sa sortie en 2003.&amp;nbsp; Aujourd'hui des dixaines de milliers de développeurs l'utilisent quotidiennement dans des projets de grande envergure.&lt;br /&gt;&lt;br /&gt;Si vous êtes comme moi un familier de la syntaxe Smarty, vous ne serez pas dépaysé par jTemplates.&lt;br /&gt;&lt;br /&gt;La mise en oeuvre est ultra simple :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;   &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://moblur.org/post/2008/02/24/jquery.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
   &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://moblur.org/post/2008/02/24/jquery-jtemplate.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;La première chose à faire est d'ajouter un conteneur qui recevra le résultats de la &quot;transformation&quot;:&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;   &amp;lt;p id=&quot;my_list&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;Une fois ceci fait il faut créer un element contenant un template :&lt;br /&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;      &amp;lt;textarea name=&quot;template&quot; id=&quot;template&quot;&amp;gt;
      &amp;lt;![CDATA[
      {#template MAIN}
        &amp;lt;p&amp;gt;Pour rouler une {$T.title} vous aurez besoin des fournitures suivantes :&amp;lt;/p&amp;gt;
        &amp;lt;ul&amp;gt;
         {#foreach $T.elements as record}
            &amp;lt;li&amp;gt;{$T.record.element} ({$T.record.quantite})&amp;lt;/li&amp;gt;
         {#/for}
        &amp;lt;/ul&amp;gt;
      {#/template MAIN}
      ]]&amp;gt;&amp;lt;/textarea&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;Et définir nos données JSON de la même manière : &lt;br /&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;      &amp;lt;textarea name=&quot;item&quot; id=&quot;item&quot;&amp;gt;
      {
         &quot;title&quot; : &quot;Cigarette&quot;,
         &quot;elements&quot;: [
         {&quot;element&quot;: &quot;tabac&quot;, &quot;quantite&quot;:&quot;un peu&quot;},
         {&quot;element&quot;: &quot;feuille&quot;, &quot;quantite&quot;:1},
         {&quot;element&quot;: &quot;filtre&quot;, &quot;quantite&quot;:1},
         ]
      }&amp;lt;/textarea&amp;gt;
&lt;/code&gt;&lt;/pre&gt;  
&lt;br /&gt;Nous venons de mettre en place un combo formidable que nous allons activer avec les deux lignes de code suivantes (à affecter sur l'evenement onClick d'un element par exemple) : &lt;br /&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;      $('#my_list').setTemplateElement('template');
      var data = eval( '(' + $('#item').attr('value') + ')');
      $('#my_list').processTemplate(data);
&lt;/code&gt;&lt;/pre&gt; 
&lt;br /&gt;Le seul truc à noter si&amp;nbsp; on ne travaille par directement  avec des objets, c'est qu'il faut impérativement&amp;nbsp; évaluer&amp;nbsp; le JSON  avant d'appliquer la transformation. Pour une raison mal définie, il faut wrapper la chaîne de caractères JSON dans des parenthèses afin que l'&lt;code&gt;eval()&lt;/code&gt; fonctionne...&lt;br /&gt;&lt;br /&gt;Vous pouvez aussi consulter cet exemple ainsi qu'un outil de benchmark sur le &lt;a hreflang=&quot;fr&quot; href=&quot;http://moblur.org/workshop/jtemplate/jtemplate_introduction.html&quot;&gt;Workshop.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pour ma part j'utilise les fonctions &lt;code&gt;$.&lt;span class=&quot;me1&quot;&gt;setTemplate()&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;me1&quot;&gt; et &lt;code&gt;$.setTemplateURL()&lt;/code&gt;. En effet, je ne trouve pas qu'il soit optimal d'avoir les templates dans des textarea cachés dans la page pour plusieurs raisons : &lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;me1&quot;&gt;Cela oblige l'utilisateur à télécharger tous les templates au chargement de la page.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;me1&quot;&gt;L'utilisateur peut éventuellement modifier le contenu des templates à l'aide de Firebug et cela peut poser problème si vous utilisez jTemplates pour générer des formulaires.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
J'ai donc opté pour une solution plus adaptée à l'Ajax et au Web 2.0. &lt;br /&gt;&lt;br /&gt;Quand un template doit être utilisé souvent sur une page, je le télécharge en utilisant la fonction &lt;code&gt;$.get()&lt;/code&gt; de jQuery au chargement de la page et je le stocke dans une variable, il sera disponible tant que l'utilisateur n'aura pas besoin de changer de page.&lt;br /&gt;&lt;br /&gt;Si le template est sensé être utilisé dans des cas plus rare je le télécharge uniquement &quot;on demand&quot;. Biensur, rien n'empêche de dire à la fonction de téléchargement de mettre en cache le template au bout d'un certains nombre de téléchargements :D&lt;br /&gt;&lt;br /&gt;Fonction de mise en cache d'un template au chargement de la page (jQuery) :&lt;br /&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;      var tpl_root = &quot;/templates/jtpl/&quot;;
      var table_template = '';
       
      $(document).ready(function(){
         $.get(tpl_root + &quot;table.html&quot;, function(data) {
            table_template = data;
         });
      });
&lt;/code&gt;&lt;/pre&gt; 
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Une brêve pour validation Technorati</title>
    <link>http://moblur.org/post/2008/02/25/Une-breve-pour-validation-Technorati</link>
    <guid isPermaLink="false">urn:md5:55288b588116262460cc4d7f8cb3d421</guid>
    <pubDate>Mon, 25 Feb 2008 11:31:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
            
    <description>    &lt;p&gt;Même si vous n'e navez rien à faire , vous pourrez trouver mon profil technorati à l'adresse en cliquant sur le liens suivant : &lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://technorati.com/claim/h78i3394n&quot; rel=&quot;me&quot;&gt;Technorati Profile&lt;/a&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Ajax, Json et compression Gzip</title>
    <link>http://moblur.org/post/2008/02/23/Ajax-Json-et-compression-Gzip</link>
    <guid isPermaLink="false">urn:md5:cd95ca0ee1a420f87ac475c76615faee</guid>
    <pubDate>Sat, 23 Feb 2008 19:13:00 +0100</pubDate>
    <dc:creator>Nicolas Crovatti</dc:creator>
        <category>Ajax</category>
        <category>Ajax</category><category>Architecture web</category><category>Compression GZIP</category><category>Diagramme</category><category>JavaScript</category><category>Json</category><category>PHP</category>    
    <description>    &lt;p&gt;Dernièrement je me suis mis a utiliser intensivement le JSON (JavaScript Object Notation). &lt;/p&gt;
&lt;p&gt;Le &lt;a hreflang=&quot;en&quot; href=&quot;http://json.org&quot;&gt;JSON&lt;/a&gt; est un mode léger d'échange de données que je trouve particulièrement adapté aux &quot;XHR&quot; (XmlHTTPRequest). Du coup les échanges avec les différents services ne se font plus en XML mais en JSON. Ce qui me fait poser la question : Dois-je maintenant parler de &quot;JHR&quot; (JsonHTTPRequest) ? Je ne sais pas, une chose est sûre ce format est beaucoup plus light que le XML. &lt;/p&gt;
&lt;p&gt;De fait, les données sont aussi décrites comme en XML et on y gagne énormément en taille. Voici une comparaison :&lt;/p&gt;
En XML :

&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;      &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
      &amp;lt;links&amp;gt;
         &amp;lt;link&amp;gt;
            &amp;lt;title&amp;gt;moBlur.org&amp;lt;/title&amp;gt;
            &amp;lt;url&amp;gt;http://moblur.org/&amp;lt;/url&amp;gt;
         &amp;lt;/link&amp;gt;
         &amp;lt;link&amp;gt;
            &amp;lt;title&amp;gt;moBlur.org - RSS&amp;lt;/title&amp;gt;
            &amp;lt;url&amp;gt;http://moblur.org/index.php?feed/rss2&amp;lt;/url&amp;gt;
         &amp;lt;/link&amp;gt;
      &amp;lt;/links&amp;gt;&lt;/code&gt;&lt;/pre&gt;

Le même message en JSON : 

&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;      {&quot;links&quot;: {
         &quot;link&quot;: [
            {&quot;title&quot;:&quot;moBlur.org&quot;,&quot;url&quot;:&quot;http://moblur.org/&quot;},
            {&quot;title&quot;:&quot;moBlur.org - RSS&quot;,&quot;url&quot;:&quot;http://moblur.org/index.php?feed/rss2&quot;}
            ]
         }
      }
&lt;/code&gt;&lt;/pre&gt;


Comparaison rapide de poids : 

&lt;ul&gt;&lt;li&gt;XML : 256 bytes&lt;/li&gt;
&lt;li&gt;JSON : 168 bytes&lt;/li&gt;
&lt;/ul&gt;

Soit un gain sec d'environ 34% pour cet exemple précis. Après cette constatation, j'ai entamé tout de suite l'implémentation de ce format d'échange pour l'ensemble de mes nouveaux projets web. 

Il est aisé en PHP de transformer un tableau de données en JSON (&lt;a hreflang=&quot;fr&quot; href=&quot;http://fr.php.net/manual/fr/function.json-encode.php&quot;&gt;encore plus avec l'addition à PHP 5 du couple json_encode() et json_ecode()&lt;/a&gt;) avec une simple fonction récursive, voici un &lt;a hreflang=&quot;en&quot; href=&quot;http://www.bin-co.com/php/scripts/array2json/&quot;&gt;exemple&lt;/a&gt; trouvé sur le  site bin-co.com que je vous copie ici (Compte tenu de la volatilité du média, plusieurs sources valent mieux qu'une) : 



&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;      &amp;lt;?php
      function array2json($arr) {
          $parts = array();
          $is_list = false;
       
          //Find out if the given array is a numerical array
          $keys = array_keys($arr);
          $max_length = count($arr)-1;
         
          //See if the first key is 0 and last key is length - 1
          if(($keys[0] == 0) and ($keys[$max_length] == $max_length)) {
              $is_list = true;
              //See if each key correspondes to its position
              for($i=0; $i&amp;lt;count($keys); $i++) {
                  //A key fails at position check.
                  if($i != $keys[$i]) {
                      //It is an associative array.
                      $is_list = false;
                      break;

                  }
              }
          }
       
          foreach($arr as $key=&amp;gt;$value) {
               //Custom handling for arrays
              if(is_array($value)) {
                  /* :RECURSION: */
                  if($is_list) $parts[] = array2json($value);
                  /* :RECURSION: */
                  else $parts[] = '&quot;' . $key . '&quot;:' . array2json($value);
              } else {
                  $str = '';
                  if(!$is_list) $str = '&quot;' . $key . '&quot;:';
                  //Custom handling for multiple data types
                 
                  if(is_numeric($value)) $str .= $value; //Numbers
                  elseif($value === false) $str .= 'false'; //The booleans
                  elseif($value === true) $str .= 'true';
                  //All other things
                  else $str .= '&quot;' . addslashes($value) . '&quot;';
                 
                  $parts[] = $str;
              }
          }
          $json = implode(',',$parts);
         
          //Return numerical JSON
          if($is_list) return '[' . $json . ']';
         
          //Return associative JSON
          return '{' . $json . '}';
      }
      ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;


L'utilisation en combo du json et de cette fonction PHP nous facilite grandement la vie côté développement. J'utilise cette fonction de transformation en JSON uniquement dans mes fichiers web services, ceux qui s'occuppent de l'abstraction des données. Comme parfois il vaut mieux un petit dessin qu'un long discourt voici un diagramme de la solution structurelle que j'utilise dans tous mes développements dit &quot;Web 2.0&quot; :

&lt;img style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://moblur.org/public/ajax_diagram.png&quot; /&gt;

Ce diagramme représente assez bien la quasi majorité des applications Web 2.0 je présume. 

Après avoir lu pas mal d'informations sur le compactage des fichiers JavaScript notement &lt;a hreflang=&quot;fr&quot; href=&quot;http://blogs.developpeur.org/cyril/archive/2007/08/18/compacter-javascript-css-reduire-la-taille-des-fichiers-javascript.aspx&quot;&gt;ici&lt;/a&gt; (Cyril Durand) et &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.lepotlatch.org/index.php/2007/05/26/82-7-pratiques-javascript-qui-changent-la-vie&quot;&gt;là&lt;/a&gt; (Damien Ravé) et encore &lt;a hreflang=&quot;fr&quot; href=&quot;http://loogaroo.net/2007/10/17/ameliorer-les-performances-partie-1/&quot;&gt;là&lt;/a&gt; (loogaroo.net), j'ai voulu enfoncer le clou et j'ai donc ajouté une compression Gzip avant d'envoyer le résultat JSON au client. Toutefois, pour des communications de faible taille, nous ne voudrons pas utiliser la compression Gzip car du principe même de la compression, si il y a trop peu de caractères le fait de compresser&amp;nbsp; les données&amp;nbsp; pourra éventuellement augmenter la taille de la transaction !

Voici une toute petite fonction PHP que j'utilise en conjonction &lt;code&gt;Array2json()&lt;/code&gt; présentée plus haut :



&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;      &amp;lt;?php
      $arr_json = array(
         'link' =&amp;gt; array(
            array( 'link' =&amp;gt; array(
                  'title' =&amp;gt; 'moBlur.org',
                  'url' =&amp;gt; 'http://moblur.org/'
               ),
            array( 'link' =&amp;gt; array(
                  'title' =&amp;gt; 'moBlur.org - RSS',
                  'url' =&amp;gt; 'http://moblur.org/index.php?feed/rss2'
               )
            )
         )
      );
      print array2json($arr_json);
      ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;


Cette fonction compresse tout simplement les chaines de caractères avant de les renvoyer au client. Sur la durée on pourra voir une nette diminution de la bande passante consommée et un accroissement de la vitesse de communication entre votre serveur et vos clients Web. Tout le monde sera ravis, j'en suis sûr :)

Pour finir voici le diagramme final de notre architecture : 

&lt;img style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://moblur.org/public/ajax_diagram_gzip.png&quot; /&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>