<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:dt="http://xsltsl.org/date-time" 
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  xmlns:media="http://search.yahoo.com/mrss/" 
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" 
  xmlns:photo="http://www.pheed.com/pheed/" 
  xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
  xmlns:im="http://purl.org/rss/1.0/item-images/" 
>

<channel>
  <title><![CDATA[POUDRO.COM - développeur web freelance - paris - web problem solver - http://poudro.com]]></title>
  <atom:link href="http://poudro.com" rel="self" type="application/rss+xml" />
  <link>http://poudro.com</link>
  <description><![CDATA[POUDRO.COM - développement de sites internet et résolution de problématiques web - php mysql ajax javascript linux]]></description>
  <lastBuildDate>Mon, 05 Mar 2012 09:41:40 +0000</lastBuildDate>
  <language>fr</language>
  <generator>http://poudro.com</generator>
  <copyright><![CDATA[poudro.com]]></copyright>
  <category><![CDATA[developpement]]></category>
  <category><![CDATA[internet]]></category>  
  <category><![CDATA[web]]></category>
  <category><![CDATA[freelance]]></category>
  <category><![CDATA[paris]]></category>
  <category><![CDATA[developpeur]]></category>
  <image>
    <title><![CDATA[POUDRO.COM - développeur web freelance - paris - web problem solver - http://poudro.com - développement de sites internet et résolution de problématiques web]]></title>
    <url>http://poudro.com/logo.png</url>
    <link>http://poudro.com</link>
    <description><![CDATA[POUDRO.COM - développeur web freelance - paris - web problem solver - http://poudro.com - développement de sites internet et résolution de problématiques web]]></description>
    <width>84</width>
    <height>74</height>
  </image>
    <item>
    <title><![CDATA[La Cigale]]></title>
    <link><![CDATA[http://www.poudro.com/work/la-cigale/]]></link>
    <pubDate>Mon, 05 Mar 2012 09:41:40 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/la-cigale/]]></guid>
    <description><![CDATA[Refonte du site de La Cigale. Prestation : Développement du front office et du back office (wordpress). Refonte complète du système de datation pour permettre la plus grande flexibilité possible dans le choix des dates et des périodes. Ajaxification des pages d&#8217;accueil et de programmation. Développement d&#8217;un moteur de recherche avec suggestion basé sur Xapian.&#160;<a href="http://www.poudro.com/work/la-cigale/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Refonte du site de La Cigale.</p>
<p><span class="und">Prestation</span> : Développement du front office et du back office (wordpress). Refonte complète du système de datation pour permettre la plus grande flexibilité possible dans le choix des dates et des périodes. Ajaxification des pages d&#8217;accueil et de programmation. Développement d&#8217;un moteur de recherche avec suggestion basé sur Xapian. Site entièrement en deux langues (anglais/français). Version Desktop/Mobile avec détection automatique. Optimisation du SEO et intégration de microdata. Système de cache basé sur APC.</p>
<p>PHP5 / Javascript / CSS / html5</p>
<p>Site réalisé en collaboration avec <a href="http://www.ofeworks.com/" target="_blank">ofeworks.com</a><br />
<br/><br/><br />
<span class="und">Client</span> : La Cigale, 2012</p>
<p>
<a href="http://www.lacigale.fr/" target=_blank>http://www.lacigale.fr/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Klapshop]]></title>
    <link><![CDATA[http://www.poudro.com/work/klapshop/]]></link>
    <pubDate>Thu, 01 Mar 2012 10:21:45 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/klapshop/]]></guid>
    <description><![CDATA[Site Klapshop. Prestation : développement du front office et du back office (wordpress). PHP5 / Javascript / CSS / html5 Site réalisé en collaboration avec ofeworks.com Client : Klapshop, 2012 http://www.klapshop.com/]]></description>
    <content:encoded><![CDATA[<p>Site Klapshop.</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).</p>
<p>PHP5 / Javascript / CSS / html5</p>
<p>Site réalisé en collaboration avec <a href="http://www.ofeworks.com/" target="_blank">ofeworks.com</a><br />
<br/><br/><br />
<span class="und">Client</span> : Klapshop, 2012</p>
<p>
<a href="http://www.klapshop.com/" target=_blank>http://www.klapshop.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Songonomy]]></title>
    <link><![CDATA[http://www.poudro.com/work/songonomy/]]></link>
    <pubDate>Thu, 01 Mar 2012 10:20:06 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/songonomy/]]></guid>
    <description><![CDATA[Site Songonomy &#8211; Discover a song everyday! Prestation : développement du front office et du back office (wordpress). PHP5 / Javascript / CSS / html5 Design par ofeworks.com Projet Perso http://www.songonomy.com/]]></description>
    <content:encoded><![CDATA[<p>Site Songonomy &#8211; Discover a song everyday!</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).</p>
<p>PHP5 / Javascript / CSS / html5</p>
<p>Design par <a href="http://www.ofeworks.com/" target="_blank">ofeworks.com</a><br />
<br/><br/><br />
<span class="und">Projet Perso</span></p>
<p>
<a href="http://www.songonomy.com/" target=_blank>http://www.songonomy.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Chic Mon Placard]]></title>
    <link><![CDATA[http://www.poudro.com/work/chic-mon-placard/]]></link>
    <pubDate>Thu, 01 Mar 2012 10:22:06 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/chic-mon-placard/]]></guid>
    <description><![CDATA[Site Chic Mon Placard. Prestation : développement du front office et du back office (wordpress). PHP5 / Javascript / CSS / html5 Client : Smartvalue, 2012 http://www.chic-mon-placard.com/]]></description>
    <content:encoded><![CDATA[<p>Site Chic Mon Placard.</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).</p>
<p>PHP5 / Javascript / CSS / html5</p>
<p><span class="und">Client</span> : Smartvalue, 2012</p>
<p>
<a href="http://www.chic-mon-placard.com/" target=_blank>http://www.chic-mon-placard.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[FNE Carte Interactive]]></title>
    <link><![CDATA[http://www.poudro.com/work/fne-carte-interactive/]]></link>
    <pubDate>Thu, 09 Feb 2012 13:29:00 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/fne-carte-interactive/]]></guid>
    <description><![CDATA[Développement de la carte interactive &#8220;L&#8217;Appel des 3000 dans les territoires&#8221; pour l&#8217;association France Nature Environnement (FNE). Prestation : développement de la carte interactive en Javascript / CSS3. Client : FNE, 2011 http://www.fne.asso.fr/fr/nos-dossiers/elections-2012/la-carte-de-france/#LaCarte]]></description>
    <content:encoded><![CDATA[<p>Développement de la carte interactive &#8220;L&#8217;Appel des 3000 dans les territoires&#8221; pour l&#8217;association France Nature Environnement (FNE).</p>
<p>Prestation : développement de la carte interactive en Javascript / CSS3.</p>
<p>Client : FNE, 2011</p>
<p>
<a href="http://www.fne.asso.fr/fr/nos-dossiers/elections-2012/la-carte-de-france/#LaCarte" target="_blank">http://www.fne.asso.fr/fr/nos-dossiers/elections-2012/la-carte-de-france/#LaCarte</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Integrating Full-Text search into WordPress using Xapian]]></title>
    <link><![CDATA[http://www.poudro.com/blog/integrating-full-text-search-into-wordpress-using-xapian/]]></link>
    <pubDate>Sat, 25 Feb 2012 12:29:11 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/integrating-full-text-search-into-wordpress-using-xapian/]]></guid>
    <description><![CDATA[I recently needed to integrate a natural language full-text search bar with a suggestion drop down list into a WordPress project I was working on. Although the default WordPress solution worked ok, I found it to be relatively slow and clumsy. So I decided to have a look at if and how I could integrate&#160;<a href="http://www.poudro.com/blog/integrating-full-text-search-into-wordpress-using-xapian/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>I recently needed to integrate a natural language full-text search bar with a suggestion drop down list into a WordPress project I was working on. Although the default WordPress solution worked ok, I found it to be relatively slow and clumsy. So I decided to have a look at if and how I could integrate Xapian into WordPress.<span id="more-301"></span><br />
<br/><br/><br/></p>
<h3>Context</h3>
<p><br/><br />
<a href="http://wordpress.org/" target="_blank">WordPress</a> has a <a href="http://codex.wordpress.org/Creating_a_Search_Page" target="blank">semi built-in search system</a> that basically issues a &#8220;LIKE&#8221; query on the posts and comments contents to the SQL database that backs WordPress. This is usually considered very slow (there are some examples and performance comparisons to this end <a href="http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql" target="_blank">here</a>) and  if you need to search something else than the contents of the posts (which I did) you need to write a custom query anyway. So I started out trying the full-text indexing capabilities of MySQL (version 5.1).<br />
<br/><br />
To do this, and so as not to touch the basic WP table structure (to reduce risks of breaking on upgrade and things like that), I created a new table which would hold only the post ID and the data I wanted indexed (in this case the post title) in a column with a <a href="http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html" target="_blank">MySQL FULLTEXT index</a> for natural language processing. Then throwing something like this :</p>
<pre>
$wpdb->get_results(
  $wpdb->prepare(
     "SELECT wposts.*
      FROM $wpdb->posts wposts, indexed_content_table ict
      WHERE
        wposts.ID = ict.post_id
        AND MATCH (ict.title) AGAINST (%s);"
     , $search)
);
</pre>
<p><br class="clear"/><br />
would result in a set of posts that correspond to the query.<br />
<br/><br />
There are two issues with this though, the first one being that it is still relatively slow (you at least have to start up the WP system, 200ms minimum from what I have measured) and the second one being that it performs a search on full words only. That means that we have to expand the query somehow if we want to have a suggestion list as soon as the user types in text. There are a number of options you can pass along with the SQL query, but nothing that really does the job straight out of the box. One way of getting around this limitation is to reformat the indexed data and the query into something that can be processed and matched quickly (i.e. usually without wildcard expansion), and which yields coherent results. This can be done, at least in part, by using a <a href="http://en.wikipedia.org/wiki/Trigrams" targer="_blank">trigram</a> (or more generally n-gram) representation of the data. But we are still too slow for a practical suggestion box (about 300ms per query, i.e. per entered character in the search field) and, although we could bypass the WP loading scheme to tap directly into the database, I didn&#8217;t want to do that for several reasons, one of which is that using MySQL for full-text searches is really no fun at all. Ultimately, in my opinion, it would be nice to achieve something well below 100ms per query to make the experience as fluid as possible (the human eye has a refresh rate of about 100ms).<br />
<br/><br/><br/></p>
<h3>About Xapian</h3>
<p><br/><br />
<a href="http://xapian.org/" target="_blank">Xapian</a> &#8220;is an Open Source Search Engine Library&#8221; (as defined on the website). It is written in C++ and has a great number of features and customisations available (I am using version 1.2.7). From what I&#8217;ve been able to gather, although without any real study I can find to back this up (and I may very well be totally wrong about this), Xapian is slightly outperformed by <a href="http://lucene.apache.org/java/docs/index.html" target="_blank">Lucene</a>/<a href="http://lucene.apache.org/solr/" target="_blank">Solr</a> in larger settings (i.e. millions of documents distributed over a number of servers). On the other hand, Xapian is ultra light and has a small memory signature compared to Lucene based projects.<br />
<br/><br />
What I&#8217;m interested in here is that it is also magnitudes easier to set up than Lucene/Solr and that few WordPress sites grow to such a point that we could actually start having the kind of issues that appear with large sets. Finally, what really set me to using it is that it has fast, robust and simple <a href="http://xapian.org/docs/bindings/php/" target="_blank">PHP bindings</a> (WP is PHP).<br />
<br/><br />
I&#8217;m not going to go into the details of Xapian here, they have all the <a href="http://xapian.org/docs/apidoc/html/index.html" target="_blank">documentation</a> you might need for any setup and they have very responsive <a href="http://xapian.org/lists" target="_blank">mailing lists</a> from what I understand (haven&#8217;t actually used them myself though). What I can say is that it is very straightforward, and the basics (being insert, delete and search) are very easy to access and super fast.<br />
<br/><br />
Entries are called documents. To every document can be attached information in three different &#8220;forms&#8221; : term, value and data. The three forms have different uses which you can read all about <a href="http://www.flax.co.uk/blog/2009/04/02/xapian-search-architecture/" target="_blank">here</a>. The terms are generally the indexed part, but you can very easily induce extra text indexing with respect to the document however you like (i.e. the trigram representation already mentionned). Search results are filtered and sorted through the use of values (e.g. date range and such). And finally, the data is a blob that cannot be used for searching.<br />
<br/><br/><br/></p>
<h3>Putting Xapian into WordPress</h3>
<p><br/><br />
To use Xapian on the system where WP is set up means you need to be on a proper server where you can install xapian-core and xapian-bindings for PHP (i.e. you can&#8217;t use simple hosting services, unless they support Xapian, which, I&#8217;m sure, is rare). Once installed, a very good source of inspiration to start interacting with Xapian through PHP can be found in the XapianWrapper.php script which can be found <a href="http://www.contentwithstyle.co.uk/content/searching-with-xapian-and-php/" target="_blank">here</a>. It would need to be changed a bit to fit your needs, but I think it&#8217;s a good base to start with. I recommend getting yourself acquainted with Xapian (if not already) and especially figuring out the proper query procedure you want to use and test it thoroughly before you put it into WP. I made the mistake of putting it in too early and lost a lot of time trying to figure out if bugs where coming from WP or Xapian.<br />
<br/><br />
The first thing to do is write (or not) your own wrapper to Xapian. In my case I wanted titles to be indexed while needing date as well as other filterings. So I started by creating my basic document structure with terms, values, data and indexing as needed (an example can be found in the index and index_row methods of the aforementionned wrapper). Similarly delete and, of course, search methods from the XapianWrapper script are also inspiring.<br />
<br/><br />
Once that is done, you need to index a document when it is published/untrashed in WordPress and remove it from the index when it is trashed and/or deleted. To do this, the usual WP way is to use hooks. To keep it simple, I&#8217;m only going to write about posts, you would have to do the same for pages, comments&#8230; For example, you can use the following hooks :</p>
<pre>
  add_action('publish_post', 'insert_into_Xapian');
  add_action('untrashed_post', 'insert_into_Xapian');

  add_action('delete_post', 'remove_from_Xapian');
  add_action('trashed_post', 'remove_from_Xapian');
</pre>
<p><br class="clear"/><br />
where the functions can be something like this</p>
<pre>
  function insert_into_Xapian($post_id)
  {
    require_once('XapianWrapper.php');
    $x = new XapianWrapper();
    $p = get_post($post_id);

    $params = array( 'id'=>$post_id, 'title'=>$p->post_title, WHAT_YOU_NEED );
    $x->index( $params );
  }

  function remove_from_Xapian($post_id)
  {
    require_once('XapianWrapper.php');
    $x = new XapianWrapper();

    $params = array( 'id'=>$post_id, WHAT_YOU_NEED );
    $x->delete( $params );
}
</pre>
<p><br class="clear"/><br />
That should index and delete your posts using the parameters you set up. Then you need something that calls Xapian directly to process searches upon request, which, in the form of a very simple PHP script can look like this :</p>
<pre>
  if (!isset($_GET['s']))
    exit();

  require_once('XapianWrapper.php');
  $x = new XapianWrapper();
  $search = urldecode($_GET['s']);

  $response = $x->search( $search );

  DO_STUFF_AND_PRINT($response);
</pre>
<p><br class="clear"/><br />
With this method, on a relatively slow and moderately busy server, in testing on about 10000 documents, I have managed to bring response time down to around 50ms from 300ms which it was with the MySQL FULLTEXT version running through WP. That means that when you type in a query, you get the answer almost instantly in the suggestion box. Which is exactly what I wanted, thank you Xapian !<br />
<br/><br/><br/></p>
<h3>Some Stats</h3>
<p><br/><br />
To wrap up I wanted to really test the speed difference, at the query level, between Xapian and MySQL FULLTEXT indices. To do this, I needed a lot of different titles which is basically what I&#8217;m calling a body of documents composed of texts of up to 10 to 15 words at most on average. The easiest I had on hand was to extract the titles of the articles from a dump of the English version of Wikipedia.<br />
<br/><br />
The methodology is as follows, I started out by extracting a certain number N of random title entries from the dump and indexing these in Xapian and in a dedicated MySQL table. Then, from this list of N documents I would extract 5 random sublists of 1000 entries and use these sublists to query the index (i.e. whatever the value of the total number of documents in the index, there will always be the same number of queries performed). I would then measure, as a function of N, the average time it would take for every query to run through the entire process (parsing and transforming the query, connecting to the DB, fetching and validating results and finally returning the answer). The graphs below show the results I obtained.<br />
<br/><br />
<img src="/assets/xapian_vs_mysql_limit_50000.png" width=748 height=500 alt="Xapian vs MySQL - Total number of documents below 50,000"/><br />
<br/><br />
<img src="/assets/xapian_vs_mysql.png" width=748 height=500 alt="Xapian vs MySQL"/><br />
<br/><br />
As you can see, for small database sizes, MySQL actually outperforms Xapian on my system. But, as soon as we hit the 10,000 documents mark, roles become reversed. MySQL&#8217;s performance degrades more rapidly with the total number of documents in the table than Xapian which manages to stay relatively flat. (Both in fact degrade somewhat linearly with N, but MySQL faster than Xapian).</p>
<p><br/><br/><br/><br/><br/><br/><br />
In conclusion, it may not have been totally necessary to move away from MySQL to generate a full-text index on the pages, and actually, for reasonable database sizes (below 10,000 documents) MySQL performs better than Xapian. Why use Xapian, then ? Good question. For one, these tests are all performed locally, on a local MySQL installation on a local hard drive. It is quite standard that the database is accessed through a network which means extra lag. Xapian can be run through the network, but the idea here was to have a small enough index that it can sit locally without too much overhead. For 250,000 documents, both databases holding the same information, the complete index size was 132M for Xapian, with very little extra room needed for the library itself, vs 159M for MySQL which requires all the overhead that comes with the management system. Another reason I can think of, is that by seperating the search from the database, there is less chance of one (mainly the search) interfering with the other (the WP database). Indeed, while playing with MySQL FULLTEXT, I managed to lock the database fairly easily which meant the site was not accessible during that time. I was never able to achieve that with Xapian. I would also like to run the same tests with concurrent requests, but it&#8217;s more difficult to simulate concurrent accesses.<br />
<br/><br />
Overall it was more of an experiment in full-text indices and search engine performance than anything else. I am thinking, though, of maybe (if I have the time) adapting this into plugin form (with support for both Xapian and MySQL?), stay tuned for more.</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Les Gémeaux v2]]></title>
    <link><![CDATA[http://www.poudro.com/work/les-gemeaux-v2/]]></link>
    <pubDate>Sun, 20 Nov 2011 10:52:08 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/les-gemeaux-v2/]]></guid>
    <description><![CDATA[Site du théâtre Les Gémeaux / Scéne Nationale. Prestation : développement du front office et du back office (wordpress). Optimisation du SEO pour la mise en avant du théâtre, adaptation du back-end wordpress pour la structure un peu particulière du site. Système de classement par date personnalisé. PHP5 / Javascript / CSS / html5 Client&#160;<a href="http://www.poudro.com/work/les-gemeaux-v2/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Site du théâtre Les Gémeaux / Scéne Nationale.</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).<br />
<br />Optimisation du SEO pour la mise en avant du théâtre, adaptation du back-end wordpress pour la structure un peu particulière du site. Système de classement par date personnalisé.</p>
<p>PHP5 / Javascript / CSS / html5</p>
<p><span class="und">Client</span> : Les Gémeaux, 2011</p>
<p>
<a href="http://www.lesgemeaux.com/" target=_blank>http://www.lesgemeaux.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[A contribution to the Instagram Unshredder Challenge]]></title>
    <link><![CDATA[http://www.poudro.com/blog/a-contribution-to-the-instagram-unshredder-challenge/]]></link>
    <pubDate>Tue, 29 Nov 2011 16:37:57 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/a-contribution-to-the-instagram-unshredder-challenge/]]></guid>
    <description><![CDATA[Recently Instagram openned a little challenge, the goal of which was to reassemble an image that had been &#8220;shredded&#8221;. All the details of the challenge can be found here : Instagram Engineering Challenge: The Unshredder. The basic idea is to take an image that has been shredded, i.e. where the image has been cut up&#160;<a href="http://www.poudro.com/blog/a-contribution-to-the-instagram-unshredder-challenge/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Recently Instagram openned a little challenge, the goal of which was to reassemble an image that had been &#8220;shredded&#8221;.<br />
<span id="more-269"></span><br />
All the details of the challenge can be found here : <a href="http://instagram-engineering.tumblr.com/post/12651721845/instagram-engineering-challenge-the-unshredder" target="_blank">Instagram Engineering Challenge: The Unshredder</a>.<br />
<br/><br />
The basic idea is to take an image that has been shredded, i.e. where the image has been cut up into vertical stripes of equal width and rearranged in random order. (The image above was the one proposed by Instagram as an example).<br />
<br/><br />
I first tried a Python version, which was the first time I played with Python. I also thought it could be a good way to play around with the canvas element.<br />
<br/><br />
What I have come up with for the canvas version is <a href="http://www.poudro.com/stuff/instagram_unshredder/">here</a> (you can have a look at the <a href="http://www.poudro.com/stuff/instagram_unshredder/js/ic.js">JS source</a>, uses a few Mootools shortcuts).<br />
<br/><br />
In a few words, the idea is to take advantage of the symmetry of the shreds. That is, determine the vertical lines where the colors in the picture, on average, change &#8220;unnaturally&#8221; quickly. This is done by looking at the cartesian distance on the RGB color space between two adjacent pixels of a same row and summing over the columns. This gives us a one dimensional array which can in turn be processed to augment unnatural peaks. By looking at the distances between the biggest peaks it is possible to determine the width of the shreds.<br />
<br/><br />
Once this is done, we need to reorder the shreds, again, using the cartesian distance. Two shreds are set to be congruant when the distance is minimized between adjacent borders.<br />
<br/><br />
Remember, the code is deliberately kept really small. Also all images cannot be completely recovered this way, at least not the way I decide adjacency and where to start. I may try to think up better ways to do this.<br />
<br/><br />
I like these little challenges, especially since I have very little experience playing around with images. <img src='http://www.poudro.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<br/><br />
(Also, on a side note, I wanted to share my absolute favorite version of the solutions I&#8217;ve seen out there : <a href="http://code.recollect.com/post/13372390010/mechanical-turk-unshredder" target="_blank">Solving Instagram’s Unshredder with Mechanical Turk and $0.50</a>).</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Appel d&#8217;offre Palais de Tokyo]]></title>
    <link><![CDATA[http://www.poudro.com/work/appel-doffre-palais-de-tokyo/]]></link>
    <pubDate>Sun, 06 Nov 2011 11:01:09 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/appel-doffre-palais-de-tokyo/]]></guid>
    <description><![CDATA[Participation à l&#8217;appel d&#8217;offre pour la refonte de l&#8217;identité visuelle du Palais de Tokyo (non retenu). Prestation : Réalisation complète d&#8217;une ébauche pour le site avec système de pre-chargement des pages pour inclusion dans la page principale afin de présenter l&#8217;intégralité du site sur une page unique.Conception d&#8217;un site avec cette présentation mono-page compatible SEO&#160;<a href="http://www.poudro.com/work/appel-doffre-palais-de-tokyo/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Participation à l&#8217;appel d&#8217;offre pour la refonte de l&#8217;identité visuelle du Palais de Tokyo (non retenu).</p>
<p><span class="und">Prestation</span> : Réalisation complète d&#8217;une ébauche pour le site avec système de pre-chargement des pages pour inclusion dans la page principale afin de présenter l&#8217;intégralité du site sur une page unique.<br />Conception d&#8217;un site avec cette présentation mono-page compatible SEO par gestion de liens internes crawlables mais transparents pour l&#8217;utilisateur. Développement intégral de la partie Javascript (scroll dynamique, réécriture url, AJAX&#8230;).</p>
<p>Javascript / CSS / HTML5</p>
<p><span class="und">Client</span> : Studio VASCO, 2011</p>
<p>
Exemple en local: <a href="http://www.poudro.com/stuff/etude_palais_de_tokyo/">Etude Palais de Tokyo</a>.</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Player intégrable pour la sortie de Audio, Video, Disco]]></title>
    <link><![CDATA[http://www.poudro.com/work/player-integrable-pour-la-sortie-de-audio-video-disco/]]></link>
    <pubDate>Mon, 24 Oct 2011 17:45:17 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/player-integrable-pour-la-sortie-de-audio-video-disco/]]></guid>
    <description><![CDATA[Player intégrable pour permettre l&#8217;écoute en avant première du nouvel album de Justice: &#8220;Audio, Video, Disco&#8221; en partenariat avec Le Monde et NME. Prestation : Réalisation du player en html5 avec fallback vers flash pour les navigateurs non compatibles.Le player est totalement skinnable et intégrable n&#8217;importe où à l&#8217;aide d&#8217;une iframe.Grâce à la gestion de&#160;<a href="http://www.poudro.com/work/player-integrable-pour-la-sortie-de-audio-video-disco/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Player intégrable pour permettre l&#8217;écoute en avant première du nouvel album de Justice: &#8220;Audio, Video, Disco&#8221; en partenariat avec Le Monde et NME.</p>
<p><span class="und">Prestation</span> : Réalisation du player en html5 avec fallback vers flash pour les navigateurs non compatibles.<br/>Le player est totalement skinnable et intégrable n&#8217;importe où à l&#8217;aide d&#8217;une iframe.<br/>Grâce à la gestion de skin, ce player est réutilisable à volonté pour tout type d&#8217;utilisation.</p>
<p>Javascript / CSS / HTML5</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p>
Exemples sur les sites du Monde et de NME:<br/><br />
<a target="_blank" href="http://www.lemonde.fr/culture/article/2011/10/21/decouvrez-le-nouvel-album-de-justice-en-exclusivite_1590576_3246.html">Ecoutez le nouvel album de Justice en exclusivité !</a><br/><br />
<a target="_blank" href="http://www.nme.com/news/justice/59943">Hear Justice&#8217;s new album &#8216;Audio, Video, Disco&#8217; in full</a><br />
<br/><br/><br />
Une copie locale <a href="http://www.poudro.com/stuff/justice_player/">des deux players</a>.</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Société Saint-Simon]]></title>
    <link><![CDATA[http://www.poudro.com/work/societe-saint-simon/]]></link>
    <pubDate>Sun, 20 Nov 2011 10:51:12 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/societe-saint-simon/]]></guid>
    <description><![CDATA[Site de l&#8217;association Société Saint-Simon. Prestation : développement des parties javascript et php ainsi que d&#8217;une partie de l&#8217;intégration avec WordPress. Déploiement du site. PHP5 / Javascript / CSS / html5 Site réalisé en collaboration avec ofeworks.com Client : Société Saint-Simon, 2011 http://www.saint-simon.net/]]></description>
    <content:encoded><![CDATA[<p>Site de l&#8217;association Société Saint-Simon.</p>
<p><span class="und">Prestation</span> : développement des parties javascript et php ainsi que d&#8217;une partie de l&#8217;intégration avec WordPress. Déploiement du site.</p>
<p>PHP5 / Javascript / CSS / html5</p>
<p>Site réalisé en collaboration avec <a href="http://www.ofeworks.com/" target="_blank">ofeworks.com</a></p>
<p><span class="und">Client</span> : Société Saint-Simon, 2011</p>
<p>
<a href="http://www.saint-simon.net/" target=_blank>http://www.saint-simon.net/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[The Bezier Curve and custom animations in CSS3 and Javascript]]></title>
    <link><![CDATA[http://www.poudro.com/blog/the-bezier-curve-and-custom-animations-in-css3-and-javascript/]]></link>
    <pubDate>Fri, 18 Nov 2011 11:12:01 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/the-bezier-curve-and-custom-animations-in-css3-and-javascript/]]></guid>
    <description><![CDATA[How do you make CSS3 transforms and custom Javascript effects work hand in hand ? You have fun with Bezier curves ! The other day I was trying to handle an effect on several elements at the same time. For a set of reasons, I needed to have one element controlled by javascript (mootools Fx)&#160;<a href="http://www.poudro.com/blog/the-bezier-curve-and-custom-animations-in-css3-and-javascript/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>How do you make CSS3 transforms and custom Javascript effects work hand in hand ? You have fun with Bezier curves !<br />
<span id="more-250"></span><br/><br />
The other day I was trying to handle an effect on several elements at the same time. For a set of reasons, I needed to have one element controlled by javascript (<a href="http://mootools.net/docs/core/Fx/Fx" target="_blank">mootools Fx</a>) and other elements controlled by CSS3 transforms (which you can read all about <a href="http://www.the-art-of-web.com/css/css-animation/" target="_blank">here</a>).<br />
<br/><br />
CSS3 transforms are handled through Bezier curves and there is not much you can do about that (<a href="http://www.webkit.org/blog/138/css-animation/" target="_blank">as is described here</a>). On the other hand, the mootools Fx effect can be controlled by a custom callback.<br />
<br/><br />
So, the first step is figuring out what Bezier parameters you want. The CSS3 property that handles this is &#8216;<span class="blue" style="font-style:italic">transition-timing-function</span>&#8216;. There are five available pre-set values (linear, ease, ease-in, ease-out, ease-in-out) and one that lets you define your custom function as value : cubic-bezier. As its name suggests, this is a Cubic Bezier (<a href="http://en.wikipedia.org/wiki/B%C3%A9zier_curve" target="_blank">the wikipedia page all about about Bezier curves</a>). The already metionned <a href="http://www.webkit.org/blog/138/css-animation/" target="_blank">webkit blog post</a> has this to say about the transition :</p>
<div style="border:1px solid #09A4E4;width:370px;padding:15px;margin:10px 0 10px 30px;">
The transition-timing-function property describes how the animation will proceed over time. Keywords can be used for common functions or the control points for a cubic bezier function can be given for complete control of the transition function. To specify a cubic bezier function, you give an X and Y values for 2 of the control points of the curve. Point P0 is implicitly set to (0,0) and P3 is implicitly set to (1,1). These 4 points are used to compute a cubic bezier curve.
</div>
<p><br/><br />
This means that to completely customize the transition as desired, you need to decide what coordinates you&#8217;re going to use for P1 and P2. Bezier curves are very common, but I couldn&#8217;t really find a good &#8216;in page&#8217; helper solution. So I decided to build one for myself, what I came up with is below. In the left pane is the speed profile as a Bezier curve and on the right you can activate an animation that uses the corresponding profile.<br />
<br class="clear"/><br/></p>
<div id="bezier">
<div id="titles" style="width:748px;height:15px;">
<div style="float:left;width:370px;">&nbsp;&nbsp;Set the animation curve by dragging the white dots</div>
<div style="float:left;width:370px;margin-left:4px;">&nbsp;&nbsp;Test the corresponding animation by clicking in the window</div>
<p><br style="clear:both;"/></div>
<div style="border:1px solid #09A4E4;width:370px;height:300px;margin:auto;background:#000;position:relative;float:left;" id="canvcont">
<div id="bounds" style="position:absolute;top:0px;left:0px;width:370px;height:300px"></div>
<p><canvas id="canv" style="position:absolute;z-index:1000;"></canvas></div>
<div style="border:1px solid #09A4E4;width:370px;height:300px;margin:auto;background:#000;position:relative;float:left;margin-left:4px;overflow:hidden;"  id="ancontainer">
<div id="clickme" style="color:#09A4E4;position:absolute;padding:5px;border:1px solid;top:40px;left:40px;cursor:pointer;max-width:230px">Click me to see animation</div>
<div id="mover" style="width:24px;height:24px;position:absolute;top:-24px;left:-24px;"><canvas id="movercanv"></canvas></div>
</div>
<p><br class="clear"/>&nbsp;//&nbsp;<span id="coords"></span><script type="text/javascript" src="/stuff/bezier/bezier.js"></script><br class="clear"/><br/></div>
<p><br/><br />
In the left window you can see the current Bezier curve applied to the transformation and in the right you can see the effect in action (if your browser supports CSS3 transforms&#8230;) You can modify the Bezier curve by dragging the white points around. As you change the curve you can test the corresponding effect in the right window. The blue dot will move to the position of the click with the corresponding transition.<br />
<br/><br />
-&gt; A full screen version can be found <a href="http://www.poudro.com/stuff/bezier/">here</a>.<br />
<br/><br />
Once you have those points coordinates, you need to apply the same effect to the mootools transitions. By default, there is no Bezier transition in mootools, so you need to define a custom one. This is made relatively easy through the <a href="http://mootools.net/docs/core/Fx/Fx.Transitions" target="_blank">Fx.Transitions Class</a> provided by mootools which is a wrapper to the callback that you can use in all mootools transitions.<br />
<br/><br />
The way this works, relative to the Bezier curve above, the callback takes the x coordinate as a parameter and returns the y coordinate. Bezier curves are parametric, i.e. x and y coordinates are not directly linked, so you need to apply a little mathematics to get what you want (which is very similar to <a href="http://www.flong.com/texts/code/shapers_bez/" target="_blank">this</a>).<br />
<br/><br />
Finally, this is done by the code below which takes the 2 points and returns the Fx.Transitions Object.</p>
<pre>
   function getBezierTransition(P1, P2)
   {
      var
        bzr = [P1.x, P1.y, P2.x, P2.y],
        bzrM = (function(p){ p.push(3*p[0], 3*p[2]-6*p[0], 1+3*p[0]-3*p[2]); return p; }.bind(this,bzr.slice(0)))(),
        bzrTrans = new Fx.Transition(
          function(x,p)
          {
            var t = x,
                nRefinementIterations = 15;

            while(nRefinementIterations--)
            {
              var t3 = Math.pow(t,3),
                  t2 = Math.pow(t,2),
                  currentx = t*p[4] + t2*p[5] + t3*p[6],
                  den = (p[4] + 2*t*p[5] + 3*t2*p[6]),
                  currentslope = (den==0)?.1:1.0/den;
              t -= (currentx - x)*(currentslope);
              t = Math.max(0, Math.min(1, t));
            } 

            var y = 3* Math.pow((1-t),2) * t * p[1] + 3 * (1-t) * Math.pow(t,2) * p[3] + Math.pow(t,3);  

            return y;
          }, bzrM);

          return bzrTrans;
      }
</pre>
<p><br class="clear"/><br />
Once you have this, you can use the returned Object as the transition property of any of your mootools Fx effects.<br />
<br/><br />
On a final note, the calculations between the CSS3 and the Javascript transitions are being done independantly in the browser, there is a little jitter between the two, but in the end it&#8217;s all for fun anyway&#8230; It&#8217;s also a possible fallback solution when CSS3 transforms are not supported by the browser, although it seems like this would be overkill unless you really need the transition to be exactly the same.</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Twitt A River &#8211; admin de tweets en live]]></title>
    <link><![CDATA[http://www.poudro.com/work/twitt-a-river/]]></link>
    <pubDate>Sun, 02 Oct 2011 12:59:03 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/twitt-a-river/]]></guid>
    <description><![CDATA[Twitt-A-River est un système complet d&#8217;administration, de modération et d&#8217;affichage de tweets en live. La commande était pour la diffusion lors d&#8217;un concert mais le système peut s&#8217;adapter à toutes les plateformes. Prestation : Le but de ce projet est de permettre de diffuser des tweets utilisateurs en direct lors d&#8217;événements. La prestation comporte donc&#160;<a href="http://www.poudro.com/work/twitt-a-river/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Twitt-A-River est un système complet d&#8217;administration, de modération et d&#8217;affichage de tweets en live. La commande était pour la diffusion lors d&#8217;un concert mais le système peut s&#8217;adapter à toutes les plateformes.<span id="more-231"></span></p>
<p><span class="und">Prestation</span> : Le but de ce projet est de permettre de diffuser des tweets utilisateurs en direct lors d&#8217;événements. La prestation comporte donc plusieurs facettes.<br />
<br/><br/><br />
La première consiste en la récupération de tweets en direct. Ceci est réalisé grâce aux APIs fournies par Twitter avec l&#8217;utilisation en parallèle du <a href="https://dev.twitter.com/docs/streaming-api" target="_blank">Streaming API</a> et du <a href="https://dev.twitter.com/docs/using-search" target="_blank">Search API</a> classique par souci de redondance. Ces tweets sont filtrés par l&#8217;intermédiaire d&#8217;un ensemble de mots clés modifiable à volonté par l&#8217;utilisation d&#8217;une interface dédiée. L&#8217;ensemble des tweets obtenus est sauvegardé en base locale sur le back-end et devient immédiatement disponible pour le traitement dans l&#8217;interface d&#8217;administration. Lors des tests, sur les mots clés les plus communs, le système est loin d&#8217;être saturé à déjà 100 tweets par seconde.<br />
<br/><br/><br />
La deuxième facette consiste en une interface d&#8217;administration par page web. Celle-ci se doit d&#8217;être claire et précise avec une optimisation poussée du code pour permettre des aller/retour peu coûteux et rapides entre l&#8217;interface et le serveur de back-end. L&#8217;interface consiste en trois colonnes, la première fait défiler les tweets, la deuxième est une étape intermédiaire où l&#8217;on peut stocker et organiser les tweets par drag&#8217;n'drop avant de les envoyer dans la dernière colonne qui est la file d&#8217;attente finale. Les options de défilement, de temporisation, de play/pause et de filtrage sont aussi présents. Une version future prévoit l&#8217;utilisation de websockets pour améliorer encore la fluidité de communication avec le serveur.<br />
<br/><br/><br />
La dernière facette correspond à l&#8217;affichage des tweets. Ceci est réalisé par l&#8217;utilisation d&#8217;une deuxième page web qui est intégralement contrôlée par l&#8217;interface d&#8217;administration à travers le back-end. Les 2 pages n&#8217;ont donc pas besoin d&#8217;être sur le même ordinateur ni au même endroit. Celle-ci est de plus paramétrable à souhait.</p>
<p>A venir, un blog post complet sur le sujet.</p>
<p>PHP / Javascript / HTML5 / mySQL</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Asynchronous and dynamic javascript loading]]></title>
    <link><![CDATA[http://www.poudro.com/blog/asynchronous-and-dynamic-javascript-loading/]]></link>
    <pubDate>Fri, 18 Nov 2011 11:12:06 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/asynchronous-and-dynamic-javascript-loading/]]></guid>
    <description><![CDATA[Or how to make all your javascript asynchronous and dynamic without having to rely on a third party loader or readyStateChange. By now, almost everyone has heard of async javascript and how it is supposed to help with page load times. Although, I&#8217;ve seen lots of articles on how to do this with third party&#160;<a href="http://www.poudro.com/blog/asynchronous-and-dynamic-javascript-loading/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Or how to make all your javascript asynchronous and dynamic without having to rely on a third party loader or readyStateChange.<br />
<span id="more-224"></span><br />
By now, almost everyone has heard of async javascript and how it is supposed to help with page load times. Although, I&#8217;ve seen lots of articles on how to do this with third party libraries or directly through the onreadystatechange technique as discussed <a href="http://www.nczonline.net/blog/2009/07/28/the-best-way-to-load-external-javascript/" target="_blank">here</a>. These all rely on at least one classic script call with src=file syntax, or at best in-lining the call function.</br><br />
That&#8217;s all and well and I often rely on these methods, but I wondered if it were possible to have just about everything load async while having as little as possible inline to keep page size and absolute load times down.</br><br />
For this, I was inspired by Google analytics&#8217; and Piwik&#8217;s asynchronous <a href="http://code.google.com/apis/analytics/docs/tracking/asyncTracking.html" target="_blank">tracking</a> <a href="http://piwik.org/docs/javascript-tracking/#toc-asynchronous-tracking" target="_blank">methods</a>.<br/><br />
What these do is create, inline, a javascript Array object onto which you &#8216;push&#8217; the parameters of your tracking before actually loading the script file. Once the script has loaded, asynchronously, it reads the array and performs its operations. What I like with this way of doing things is that there is no need for a unnecessary event-ful back-and-forth and I find that quite elegant.<br/><br />
As an example, you could look at the source of a number of websites around today and you would see the Google anaytics async tracking code in one form or another, often it&#8217;s default inclination which can look something like this :</p>
<pre>
&lt;script type="text/javascript"&gt;

  var _gaq = _gaq || [];

  _gaq.push(['_setAccount', 'UA-XXXXXX-X'])
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

&lt;/script&gt;
</pre>
<p><br class="clear"/><br />
Breaking this down, the first line defines the _gaq global Array without destroying any potential previous affectations. Then it pushes two sub-arrays into it with, the first setting the account info and the second the default behavior. Finally, the third step is what I am interested in here.<br/><br />
Enclosed within a scoping auto-executing function, the three lines create a DOM script element, define it as async and give it a src. Then it is inserted before the first script tag that exists on the page (which we know exists since we are calling this within a script tag).<br/><br />
As this is done from within an inline script, it can only be executed once the page has been parsed and javascript has started to execute.</br><br />
Why do I find this interesting for my use? When using frameworks like Mootools or jQuery, you need to wait for the DOM and the framework to load before you can do anything. This usually requires attaching the init function to an event triggered by the framework when it is loaded. This, in turn, only happens after the DOM (or at least part of it) is ready. It can also be that you are waiting for the onreadystatechange event discussed earlier before triggering something.<br/><br />
In any case, you have to wait for an event before you trigger your init. Which is fine, but hardly as necessary as it would appear by how popular it is if you are factoring the whole page.<br/><br />
Indeed, when an asynchronously called script has loaded through the technique I am discussing, the DOM is already ready, that means you can immediately init as soon as it is reached. Although, when using a framework, you still need to insure you are loading it prior to any usage you might have of it. To do this I simply append my code to that of the framework. And thus it also has the side effect of reducing the total number of script files to retrieve to a single file.<br/><br />
This can only really be used if it is not imperative that the javascript be ready before the page is loaded in itself, but I usually find it is good practice to always code with this objective. I have often found that, in any case, it is better to have something quickly loaded and displayed.<br/><br />
In practice, what does it look like? All pages don&#8217;t necessarily need the same code to be executed, but as I want to cache everything client-side as early as possible and limit the number of file retrievals, I want to load the whole javascript in one go early on. So, I further the inspiration from the analytics, I create an Array object onto which I push the parameters of the page and then these are read once the async source is ready.<br/><br />
Here&#8217;s an example adapted from one of my projects :</p>
<pre>
&lt;script type="text/javascript"&gt;

  var gVar = gVar || [];
  (function() {
    gVar.push(["function1",['param1','param2']]);
    gVar.push(["function2",['param1','param2','param3']]);
    ...

    var d=document,g=d.createElement("script"),s=d.getElementsByTagName("script")[0];
    g.type="text/javascript";g.defer=true;g.async=true;g.src="source.js";s.parentNode.insertBefore(g,s);
  })();

&lt;/script&gt;
</pre>
<p><br class="clear"/><br />
In this, case, the global array is called &#8216;gVar&#8217;. The bulk of the javascript is contained within &#8220;source.js&#8221; and this is where gVar is interpreted to load the corresponding objects to deal the dynamic elements on the page. The interpretation could look something like this :</p>
<pre>
  for (var _el=0, gl=gVar.length; _el != gl; ++_el)
  {
    if(gVar[_el][0] == "function1")
      dealWithFunction1(gVar[_el][1]);
    if(gVar[_el][0] == "function2" &#038;&#038; gVar[_el][1].length == 3)
      dealWithFunction2(gVar[_el][1]);
    ...
  }
</pre>
<p><br class="clear"/><br />
Which in effect takes over the role of a global init function. This is my way of doing it, but there are plenty of other ways. If you don&#8217;t need the parameters, you could just initialize a variable to a certain value, which, once read, will trigger a certain chain within your code. Also, I&#8217;ve tried this on all relatively recent browsers.<br/><br />
That wraps the gist if the idea. Again, this requires complete control over the page&#8217;s code. If you don&#8217;t have that, a number of fallbacks are possible and are becoming more and more popular which can only be a good thing towards making the net a faster place&#8230; <img src='http://www.poudro.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Manu Chao / Officiel]]></title>
    <link><![CDATA[http://www.poudro.com/work/manu-chao-officiel/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:49:53 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/manu-chao-officiel/]]></guid>
    <description><![CDATA[Refonte des pages &#8220;Radiolina&#8221; et &#8220;Tevelina&#8221; ainsi que des players intégrés dans les articles sur le site officiel de Manu Chao. Prestation : réintégration complète des deux pages pour les rendre à la fois compatibles html5 avec fallback flash et pour intégrer le contenu médias de ces pages avec l&#8217;interface d&#8217;administration de WordPress.Développement des players&#160;<a href="http://www.poudro.com/work/manu-chao-officiel/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Refonte des pages &#8220;Radiolina&#8221; et &#8220;Tevelina&#8221; ainsi que des players intégrés dans les articles sur le site officiel de Manu Chao.</p>
<p><span class="und">Prestation</span> : réintégration complète des deux pages pour les rendre à la fois compatibles html5 avec fallback flash et pour intégrer le contenu médias de ces pages avec l&#8217;interface d&#8217;administration de WordPress.<br/>Développement des players pour permettre l&#8217;inclusion des médias directement dans les articles à partir d&#8217;une interface simplifiée de la partie admin.<br/>Mise en place d&#8217;un nouvel uploader html5 pour que les utilisateurs puissent partager leur musique sur le site.</p>
<p>PHP / Javascript / CSS / HTML5</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p>
<a href="http://www.manuchao.net/tvlina/" target=_blank>Tevelina sur manuchao.net</a><br/><br />
<a href="http://www.manuchao.net/radiolina/" target=_blank>Radiolina sur manuchao.net</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Some More 3D Bubbles]]></title>
    <link><![CDATA[http://www.poudro.com/blog/some-more-3d-bubbles/]]></link>
    <pubDate>Fri, 18 Nov 2011 11:12:32 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/some-more-3d-bubbles/]]></guid>
    <description><![CDATA[These are two simple modified versions of the previous post. Regular bubbles in the plane here. And my personal favorite : the galaxy. A slight variation where initial conditions are 3D also : the 3d galaxy. The galaxy has its own video for those that don&#8217;t have webGL : That&#8217;s all for now&#8230;]]></description>
    <content:encoded><![CDATA[<p>These are two simple modified versions of the previous post.<br />
<span id="more-214"></span><br />
Regular bubbles in the plane <a href="/stuff/3d-bubbles/plane.html">here</a>.<br />
<br/><br />
And my personal favorite : <a href="/stuff/3d-bubbles/galaxy.html">the galaxy</a>.<br />
<br/><br />
A slight variation where initial conditions are 3D also : <a href="/stuff/3d-bubbles/galaxy3d.html">the 3d galaxy</a>.<br />
<br/><br />
The galaxy has its own video for those that don&#8217;t have webGL :<br />
<br/><br />
<iframe width="748" height="461" src="http://www.youtube.com/embed/dAaAkRV9wvU?rel=0&#038;hd=1" frameborder="0" allowfullscreen></iframe><br />
<br/><br />
That&#8217;s all for now&#8230; <img src='http://www.poudro.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[3D Bubbles from Outer Space]]></title>
    <link><![CDATA[http://www.poudro.com/blog/3d-bubbles-from-outer-space/]]></link>
    <pubDate>Fri, 18 Nov 2011 11:12:37 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/3d-bubbles-from-outer-space/]]></guid>
    <description><![CDATA[This is next step in my series of experiments with html5 drawing capabilities. This time I make the shift to the third dimension using WebGL and applying the same principals I used in previous experiments to this one. This doesn&#8217;t do much more than the previous experiments other than add a whole new dimension !&#160;<a href="http://www.poudro.com/blog/3d-bubbles-from-outer-space/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>This is next step in my series of experiments with html5 drawing capabilities. This time I make the shift to the third dimension using WebGL and applying the same principals I used in previous experiments to this one.<br />
<span id="more-209"></span><br />
This doesn&#8217;t do much more than the previous experiments other than add a whole new dimension !<br />
<br/><br />
Check out the demo <a href="/stuff/3d-bubbles/">here</a> (it requires an up-to-date browser, it works with Chrome and FF6 on my system).<br />
<br/><br />
Instead of rebuilding the whole stack of 3d objects from scratch (looks like a <a href="https://developer.mozilla.org/en/WebGL" target="_blank">daunting task</a>), I decided to use an API. After reading a few things <a href="http://aerotwist.com/lab/photoparticles/" target="_blank">here</a> and <a href="http://mrdoob.com/blog/post/693" target="_blank">there</a> about it, I decided to try out <a href="https://github.com/mrdoob/three.js/" target="_blank">Three.js</a>. Waouh ! What a great API, it makes everything look so simple.<br />
<br/><br />
This is my very first ever attempt at making something in 3D, so please be indulgent. No lights, no complexe interactions with the user and stuff. What it does do is augment the bubbles from previous experiments. This time interactions are computed over 3D space and not on a 2d plane as before. And it looks pretty damn good I think.<br />
<br/><br />
There are some basic interactions. You can drag the pane to rotate the system in which ever direction. The mousewheel (or touchpad equivalents) allows to zoom in and out.<br />
<br/><br />
Check out this <a href="http://aerotwist.com/lab/getting-started-with-three-js/" target="_blank">link</a> to learn more about the inner works of the Three.js API.</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Bubbles, more bubbles, bubbles everywhere !]]></title>
    <link><![CDATA[http://www.poudro.com/blog/bubbles-more-bubbles-bubbles-everywhere/]]></link>
    <pubDate>Fri, 18 Nov 2011 11:12:41 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/bubbles-more-bubbles-bubbles-everywhere/]]></guid>
    <description><![CDATA[A quick post today for a quick experiment. More bubbles, bubbles everywhere ! The Google Maps API applied to html5 canvas&#8230; Now this I find uber fun and it actually looks good too I think&#8230; check it out here. This uses the Google Maps API v3. The Maps API is built around the idea of&#160;<a href="http://www.poudro.com/blog/bubbles-more-bubbles-bubbles-everywhere/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>A quick post today for a quick experiment. More bubbles, bubbles everywhere ! The Google Maps API applied to html5 canvas&#8230; <img src='http://www.poudro.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-206"></span><br />
Now this I find uber fun and it actually looks good too I think&#8230;<br/><br />
check it out <a href="http://www.poudro.com/stuff/more-bubbles/">here</a>.<br />
<br/><br />
This uses the <a href="http://code.google.com/apis/maps/documentation/javascript/reference.html" target="_blank">Google Maps API v3</a>. The Maps API is built around the idea of cells, where every cell in the classic version is an image, part of the complete map. It is very very flexible&#8230; You can see an example of how flexible it is on my favorite Google Lab : the <a href="http://juliamap.googlelabs.com/" target="_blank">Julia Map</a> (uses a lot of resources).<br />
<br/><br />
If they can put something else than pictures, so can I. So I plugged in the bubbles of one of my previous <a href="http://www.poudro.com/blog/bubbles-and-canvas/">posts</a> into the API. The result : I love it ! Every cell has its own family of bubbles. Each family is independant and bubbles within each cell interect with each other. Thanks to the API you can drag and zoom in/out.<br />
<br/><br />
Check it out and come back for more bubbles in the future with one big family and interactions between cells&#8230;</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[The Wall Gallery]]></title>
    <link><![CDATA[http://www.poudro.com/blog/the-wall-gallery/]]></link>
    <pubDate>Fri, 18 Nov 2011 11:12:46 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/the-wall-gallery/]]></guid>
    <description><![CDATA[I like taking pictures and I like sharing them, but I don&#8217;t want to upload my pictures to a third party site&#8230; What to do? Build my own gallery system ! This is basically the third instalment of my gallery. It is totally rewritten from scratch. It is going to grow with a few more&#160;<a href="http://www.poudro.com/blog/the-wall-gallery/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>I like taking pictures and I like sharing them, but I don&#8217;t want to upload my pictures to a third party site&#8230; What to do? Build my own gallery system !<br />
<span id="more-202"></span><br />
This is basically the third instalment of my gallery. It is totally rewritten from scratch. It is going to grow with a few more features and especially have its own WordPress plugin so it could easily be integrated with any WP theme. It&#8217;s all open-source, so anyone can use it and modify it. Please let me know if you do.<br />
<br/><br />
Check out the demo <a href="/stuff/the-wall/" title="The Wall Gallery">here</a>.<br />
<br/><br />
Once the page is loaded, all you need to do is click on an image to show the full sized picture. When in zoomed mode, navigation works several ways. By hovering the center image, arrows appear to either side and, when clicked, take you to the previous/next picture in order. You can click on any of the thumbnails surrounding the center image to bring that one to the center. Also, you can use keyboard arrow keys, left/right/up/down, to navigate in the corresponding direction. Finally, on devices, you can swipe in the direction of choice to move in the same way as with keyboard keys. To return to normal mode, click any of the close icons that appear when hovering the center image or simply press the escape key.<br />
<br/><br />
The whole point is to make things simple, so there are few options in the javascript itself and some CSS styling for looks. For starters, this is powered by the <a href="http://mootools.net/" target="_blank">Mootools</a> framework. I like mootools because it integrates well effects and selectors into a lightweight package. It&#8217;s pretty fast and has nice objective definitions. So you&#8217;ll require your own copy (or the google API version or anything else). At the time of writing this, the Mootools Core version is 1.3.2. The gallery also requires the &#8220;Asset&#8221; item from the Mootools More builder (version 1.3.2.1 right now). Nothing else is required and you can get these in the <a href="/stuff/the-wall/the-wall-bundle.zip">bundle</a>. You&#8217;ll need to include Wall.js in your code after mootools.<br />
<br/><br />
In the html, you need to put all your pictures into a single element which has an id (in the demo it is &#8220;global&#8221;). To speed up initial loading, I like to create thumbnails of the full-sized pictures, but this is not compulsory (although the zoomed version of the thumbnails is the full size of the thumbnail). What is compulsory though, is that what is shown when the page loads are the &lt;img&gt; tags (where I put the thumbnails) and these need to be set within &lt;a&gt; anchors to the full-sized pictures (or possibly themselves). It could look something like this :</p>
<pre>
  &lt;div id="global"&gt;
    &lt;a href="bigpic.jpg"&gt;&lt;img src="thumbnail.jpg" alt="some text about the image"/&gt;&lt;/a&gt;
    ...
  &lt;/div&gt;
</pre>
<p><br class="clear"/><br />
<br />
For those unfamiliar with mootools, once everything is loaded, to launch the Wall you simply need to write (replacing &#8216;global&#8217; with the id you have chosen for the container) :</p>
<pre>
  &lt;script type="text/javascript"&gt;
    var gallery;
    window.addEvent('domready',function(){
      gallery = new Wall('global');
    });
  &lt;/script&gt;
</pre>
<p><br class="clear"/><br />
and you&#8217;re done.<br />
<br/><br />
As a mootools Class, there are options you can pass upon instantiation of the gallery. These are mostly useful to control the &#8216;title&#8217; text of the added elements. The complete list and defaults :</p>
<pre>
showAlt: true &nbsp;&nbsp;=&gt; displays the alt text of the thumbnail on hover within the gallery
magnify: true &nbsp;&nbsp;=&gt; if set to false, you cannot go to zoom mode (not really of any use...)

magnifyText: 'Magnify' &nbsp;&nbsp;=&gt; the title text of the magnify icon
closemagnifyText: 'Back to gallery mode' &nbsp;&nbsp;=&gt; the title text of the close buttons

callbackOnImLoad:null &nbsp;&nbsp;=&gt; a callback function for image loads, it takes one argument : the image element

(and a few more only those that know mootools will want to see and they are self explanotory within the code...)
</pre>
<p><br class="clear"/><br />
To use these options, you need to modify the syntax of the instantiation to something like this :</p>
<pre>
gallery = new Wall('global', {option1:value1, option2:value2...});
</pre>
<p><br class="clear"/></p>
<p>If, like me, you use an analytics, you might find useful the &#8216;callbackOnImLoad&#8217; option. It allows the definition of a callback function triggered when a picture is &#8216;seen&#8217; by the user. As an example, in the demo it is integrated with my google analytics tracker and sends an event whenever an image is loaded (in zoomed mode only, the hover doesn&#8217;t do any tracking). That way, in the &#8220;Event Tracking&#8221; submenu of &#8220;Content&#8221; on my analytics page, I can see what pictures are the most popular.<br />
<br />
As for styling, most of it is done via CSS. The classes you might need to modify are all present in the wall.css included in the <a href="/stuff/the-wall/the-wall-bundle.zip">bundle</a>. The parts that are not in the CSS concern image positionning and things like that, so shouldn&#8217;t be of concern.<br />
<br/><br />
Please feel free to contact me with any feedback and/or suggestions you might have using my <a href="/contact/">contact</a> page. Have fun&#8230; <img src='http://www.poudro.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Molotov4]]></title>
    <link><![CDATA[http://www.poudro.com/work/molotov4/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:51:04 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/molotov4/]]></guid>
    <description><![CDATA[Site artiste pour Sefyu. Prestation : refonte complète du site d&#8217;une version flash vers une version html/css/javascript pour assurer la compatibilité avec les devices (iphone, ipad, android&#8230;)Développement d&#8217;une interface pour insérer tout type de player vidéo/audio le plus simplement possible. Dans le cas présent intégration de l&#8217;API iframe Youtube et création d&#8217;un lecteur audio html5&#160;<a href="http://www.poudro.com/work/molotov4/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Site artiste pour Sefyu.</p>
<p><span class="und">Prestation</span> : refonte complète du site d&#8217;une version flash vers une version html/css/javascript pour assurer la compatibilité avec les devices (iphone, ipad, android&#8230;)<br/>Développement d&#8217;une interface pour insérer tout type de player vidéo/audio le plus simplement possible. Dans le cas présent intégration de l&#8217;API iframe Youtube et création d&#8217;un lecteur audio html5 avec fallback flash (jwplayer) quand le navigateur n&#8217;est pas compatible. (Développement prévu d&#8217;une API javascript complète). Optimisation d&#8217;une partie du PHP.</p>
<p>PHP / Javascript / CSS / HTML5</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p>
<a href="http://www.molotov4.com/" target=_blank>http://www.molotov4.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[@gmasot, or a Twitter Last.fm Mashup]]></title>
    <link><![CDATA[http://www.poudro.com/blog/gmasot-or-a-twitter-last-fm-mashup/]]></link>
    <pubDate>Fri, 18 Nov 2011 11:12:52 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/gmasot-or-a-twitter-last-fm-mashup/]]></guid>
    <description><![CDATA[I&#8217;ve been wanting to experiment with Twitter and Last.fm APIs for a while now. Well, why not put them both together ! That&#8217;s how I came up with the bot @gmasot (for Give Me A Suggestion Or Two). How it works, well go to Twitter, post a tweet &#8216;@gmasot artist&#8217;. It will reply with an&#160;<a href="http://www.poudro.com/blog/gmasot-or-a-twitter-last-fm-mashup/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>I&#8217;ve been wanting to experiment with Twitter and Last.fm APIs for a while now. Well, why not put them both together ! That&#8217;s how I came up with the bot @gmasot (for Give Me A Suggestion Or Two).<br />
<span id="more-171"></span><br />
<br/><br />
How it works, well go to Twitter, post a tweet &#8216;@gmasot artist&#8217;. It will reply with an @mention to you with the name of a similar artist taken from Last.fm and a link to artist&#8217;s page on Last.fm. If you follow @gmasot you will see the reply in your own feed. For now, you can&#8217;t put anything else in the tweet you send to the robot. I hope to make the service evolve to connect to your Last.fm user account, allow more text in the tweets you send it, allow for multiple artists and/or multiple replies&#8230; (Your twitter feed needs to be public so it can read the @mention, I don&#8217;t like automatic follows from a bot, a little spammy I find&#8230;)<br />
<br/><br />
<a href="http://twitter.com/gmasot" class="twitter-follow-button" data-show-count="false">Follow @gmasot</a><br />
<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script><br />
<br/><br />
This is the first time I&#8217;ve been playing with these APIs. So to do this I needed to figure out how to &#8220;listen&#8221; to Twitter, fetch similar artists from Last.fm and then post an answer back to Twitter.<br />
<br/><br />
First things first, reading the Twitter feed. This is done by using their &#8220;Streaming API&#8221; (<a href="https://dev.twitter.com/docs/streaming-api" target="_blank">read more</a>). I love it ! It enables you to open a single connection that stays alive for how ever long you want. It is actually strongly recommended to never close it. It gives you access to a few simple search features called filters (track, locations&#8230;). When a new tweet matches your filters it is piped to you via the stream. You can then play with it as you feel. For me, and for now, I apply minimal parsing and fetch a list of similar artists from Last.fm.<br />
<br/><br />
The Last.fm API (<a href="http://www.lastfm.fr/api" target="_blank">read more</a>) is real nice. I love Last.fm, I think it&#8217;s the coolest social site on the web and that it should get more attention than it does (not that it doesn&#8217;t already get some). Anyway, with a simple API key, you can fetch a list of similar artists to the one you request. The returned JSON (or XML) contains loads of information on all the related artists. For gmasot, one parameter that is really useful is the &#8220;match&#8221;. This returns a number between 0 and 1 of the similarity between the initial artist and the one you are looking at in the reply. By transforming these matches into probabilities and applying a simple <a href="http://en.wikipedia.org/wiki/Binary_search" target="_blank">Binary Search</a> on the constructed discrete cumulative distribution function, I extract a single result weighted by these matches. The response tweet (in the form of an RT retweet) is then constructed by appending the name of the suggested artist with a bitly&#8217;ed version of the last.fm profile url for the suggested artist.<br />
<br/><br />
Then, the final step, is to submit the result back to Twitter. This is done through <a href="https://github.com/abraham/twitteroauth" target="_blank">twitteroauth.php</a> that talks to a Twitter App that is connected to the @gmasot account. I really like TwitterOAuth, as far as I can tell, it takes all the pain away but none of the power.<br />
<br/><br />
Anyway, enjoy playing with it. Again, it is in very early stages, so there might very well be bugs and crashes and whatnots, it&#8217;s all for fun&#8230; <img src='http://www.poudro.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<br/><br />
(Of course, I don&#8217;t keep any personal information whatsoever. Once the tweet is parsed it is forgotten by gmasot and me. The only history is in Twitter and I cannot guaranty anything about what Twitter does with the data. No information is sent to Last.fm other than the contents of the tweet, without names. For the time being, it is Last.fm that informs me if there is an artist&#8217;s name in there or not.)</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Bubbles and canvas]]></title>
    <link><![CDATA[http://www.poudro.com/blog/bubbles-and-canvas/]]></link>
    <pubDate>Fri, 18 Nov 2011 11:11:37 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/blog/bubbles-and-canvas/]]></guid>
    <description><![CDATA[In an attempt to test the capabilities of canvas while also researching graph layouts, I came up with this little home made experiment. It&#8217;s in a very early stage for now, but I have a few ideas of directions I might like to take it. =&#62; check out the demo here In the current demo,&#160;<a href="http://www.poudro.com/blog/bubbles-and-canvas/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>In an attempt to test the capabilities of canvas while also researching graph layouts, I came up with this little home made experiment. It&#8217;s in a very early stage for now, but I have a few ideas of directions I might like to take it.<br />
<span id="more-168"></span><br />
<br/><br />
=&gt; check out the demo <a title="Demo Bubbles and canvas - poudro.com" href="http://www.poudro.com/stuff/bubbles/">here</a><br />
<br/><br />
In the current demo, there are 100 independant elements (which I will call bubbles) that act like particles in a simplistic model of molecular interactions. Every bubble interacts with every other though a combination of <a title="Hooke's law - wikipedia" href="http://en.wikipedia.org/wiki/Hooke%27s_law" target="_blank">Hook&#8217;s law of elasticity</a> and <a title="Coulomb's law - wikipedia" href="http://en.wikipedia.org/wiki/Coulomb%27s_law" target="_blank">Coulomb law</a> relating to the effects of two electrically charges particles on each other. Once that said, what is really important to notice is that these interactions require n² computations at each step, where n is the number of particles, to complete. This is taking place on your computer within the confines of the javascript engine of your browser.<br />
<br/><br />
The things I&#8217;ve experimented with here are things like the <strong>requestAnimationFrame</strong> which is a very powerful replacement for the classical timer loop in javascript when doing animations on canvas. The browser &#8220;knows&#8221; when the next update can be done and does it (more about this <a href="http://paulirish.com/2011/requestanimationframe-for-smart-animating/" target="_blank">here</a>). Also, I&#8217;m overall very impressed by the performances of canvas as I can run this seemlessly on my old laptop. I&#8217;m also very fond of the completeness of the <strong>addEventListener</strong> methods (more <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration" target="_blank">here</a>).<br />
<br/><br />
That&#8217;s all for now, stay tuned for more on this&#8230; <img src='http://www.poudro.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Le PADAC 2011]]></title>
    <link><![CDATA[http://www.poudro.com/work/le-padac-2011/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:50:26 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/le-padac-2011/]]></guid>
    <description><![CDATA[Site le PADAC 2011, « le parcours des arts décoratifs du XXe siècle et de l’art contemporain ». Prestation : développement d&#8217;une page unique dans le but de présenter l&#8217;ensemble des informations utiles le plus simplement possible.Mise en place d&#8217;un back end adapté et personnalisé (à partir de wordpress) afin de facilité les mises à&#160;<a href="http://www.poudro.com/work/le-padac-2011/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Site le PADAC 2011, « le parcours des arts décoratifs du XXe siècle et de l’art contemporain ».</p>
<p><span class="und">Prestation</span> : développement d&#8217;une page unique dans le but de présenter l&#8217;ensemble des informations utiles le plus simplement possible.<br />Mise en place d&#8217;un back end adapté et personnalisé (à partir de wordpress) afin de facilité les mises à jours et la cohérence du site. Site en deux langues (français / anglais).</p>
<p>PHP / Javascript / CSS / HTML5</p>
<p><span class="und">Client</span> : Le PADAC via Basilic Studio, 2011</p>
<p>
<a href="http://www.padac.fr/" target=_blank>http://www.padac.fr/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Amadou &amp; Mariam &#8211; MIF event page]]></title>
    <link><![CDATA[http://www.poudro.com/work/amadou-mariam-mif-event-page/]]></link>
    <pubDate>Sun, 02 Oct 2011 13:20:57 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/amadou-mariam-mif-event-page/]]></guid>
    <description><![CDATA[Page pour le passage d&#8217;Amadou et Mariam au festival MIF (Manchester International Festival) Prestation : développement d&#8217;une page unique où le contenu est affiché par le déplacement de la souris au dessus de la page (ou du doigt sur les devices).Intégration d&#8217;un player audio html5 avec fallback flash (jwplayer) si non supporté. Pour être compatible&#160;<a href="http://www.poudro.com/work/amadou-mariam-mif-event-page/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Page pour le passage d&#8217;Amadou et Mariam au festival MIF (Manchester International Festival)</p>
<p><span class="und">Prestation</span> : développement d&#8217;une page unique où le contenu est affiché par le déplacement de la souris au dessus de la page (ou du doigt sur les devices).<br />Intégration d&#8217;un player audio html5 avec fallback flash (jwplayer) si non supporté. Pour être compatible avec tous les browsers, le &#8220;pinhole&#8221; est géré uniquement en javascript sans l&#8217;aide de canvas.</p>
<p>Javascript / CSS / HTML5</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p>
<a href="http://www.poudro.com/stuff/amadou-and-mariam-mif-page/" rel="nofollow" target=_blank>Lien vers une copie locale</a><br/><br/>(En page d&#8217;accueil sur <a href="http://www.amadou-mariam.com/" target=_blank>http://www.amadou-mariam.com/</a> durant le mois de juillet 2011)</p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Nevermind]]></title>
    <link><![CDATA[http://www.poudro.com/work/nevermind/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:51:42 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/nevermind/]]></guid>
    <description><![CDATA[Site de la directrice artistique Nathalie Canguilhem Prestation : développement du front office et du back office (wordpress).Gestion (front et back) de l&#8217;arborescence des menus et sous-menus, slider photos, intégration d&#8217;un player vidéo local. PHP5 / Javascript / CSS / xHTML / HTML5 Client : Nathalie Canguilhem, 2011 http://www.nevermind.tv/]]></description>
    <content:encoded><![CDATA[<p>Site de la directrice artistique Nathalie Canguilhem</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).<br />Gestion (front et back) de l&#8217;arborescence des menus et sous-menus, slider photos, intégration d&#8217;un player vidéo local.</p>
<p>PHP5 / Javascript / CSS / xHTML / HTML5</p>
<p><span class="und">Client</span> : Nathalie Canguilhem, 2011</p>
<p>
<a href="http://www.nevermind.tv/" target=_blank>http://www.nevermind.tv/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Because Music]]></title>
    <link><![CDATA[http://www.poudro.com/work/because-music/]]></link>
    <pubDate>Sun, 02 Oct 2011 14:11:28 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/because-music/]]></guid>
    <description><![CDATA[Prestations multiples pour le site officiel de Because Music, label de musique français. Prestation : développement intégral de la page TV. Refonte d&#8217;une partie des pages News et Artistes ainsi que de la page d&#8217;Accueil.Installation complète du site sur un nouveau serveur avec gestion du cache et optimisation pour rendre la navigation plus fluide.Intégration de&#160;<a href="http://www.poudro.com/work/because-music/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Prestations multiples pour le site officiel de Because Music, label de musique français. </p>
<p><span class="und">Prestation</span> : développement intégral de la page TV. Refonte d&#8217;une partie des pages News et Artistes ainsi que de la page d&#8217;Accueil.<br />Installation complète du site sur un nouveau serveur avec gestion du cache et optimisation pour rendre la navigation plus fluide.<br />Intégration de la partie vidéo sur la page d&#8217;accueil et de la partie photo/video sur les pages artistes. Ajout des fonctionnalités rendant le site compatible avec les devices (iPhone/iPad/Andoid&#8230;).</p>
<p>PHP / Javascript / CSS  / xHTML / Flash / Administration Linux</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p>
<a href="http://www.because.tv/" target=_blank>http://www.because.tv/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Les Gémeaux]]></title>
    <link><![CDATA[http://www.poudro.com/work/les-gemeaux/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:51:54 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/les-gemeaux/]]></guid>
    <description><![CDATA[Site du théâtre Les Gémeaux / Scéne Nationale. Prestation : développement du front office et du back office (wordpress).Optimisation du SEO pour la mise en avant du théâtre, adaptation du back-end wordpress pour la structure un peu particulière du site, mise en place d&#8217;un captcha &#8220;maison&#8221;. PHP5 / Javascript / CSS / xHTML Client :&#160;<a href="http://www.poudro.com/work/les-gemeaux/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Site du théâtre Les Gémeaux / Scéne Nationale.</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).<br />Optimisation du SEO pour la mise en avant du théâtre, adaptation du back-end wordpress pour la structure un peu particulière du site, mise en place d&#8217;un captcha &#8220;maison&#8221;. </p>
<p>PHP5 / Javascript / CSS / xHTML</p>
<p><span class="und">Client</span> : Les Gémeaux, 2011</p>
<p>
<a href="http://www.lesgemeaux.com/" target=_blank>http://www.lesgemeaux.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Keny Arkana / Officiel]]></title>
    <link><![CDATA[http://www.poudro.com/work/keny-arkana/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:52:15 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/keny-arkana/]]></guid>
    <description><![CDATA[Site artiste de Keny Arkana pour la sortie de son album, avec vidéos, morceaux en écoute, blog, tournée, livre d&#8217;or, post, radio&#8230; Prestation : développement du front office et du back office (wordpress).Mise en place d&#8217;un uploader avec captcha pour l&#8217;espace blog participatif. Intégration de W3 Total Cache avec utilisation d&#8217;un CDN (AWS) avec répartition&#160;<a href="http://www.poudro.com/work/keny-arkana/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Site artiste de Keny Arkana pour la sortie de son album, avec vidéos, morceaux en écoute, blog, tournée, livre d&#8217;or, post, radio&#8230;</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).<br />Mise en place d&#8217;un uploader avec captcha pour l&#8217;espace blog participatif. Intégration de W3 Total Cache avec utilisation d&#8217;un CDN (AWS) avec répartition du site sur plusieurs serveurs &#8220;load balancés&#8221;.</p>
<p>PHP5 / Javascript / CSS / xHTML / Administration Linux</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p>
<a href="http://keny-arkana.com/" target=_blank>http://keny-arkana.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Antoine Leonpaul / Officiel]]></title>
    <link><![CDATA[http://www.poudro.com/work/antoine-leonpaul/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:52:39 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/antoine-leonpaul/]]></guid>
    <description><![CDATA[Page photos, vidéos et musique du site d&#8217;Antoine Leonpaul. Prestation : développement des pages cités et intégration dans le back office (WordPress) PHP5 / Javascript / CSS / xHTML Client : Because Music, 2011 http://www.antoineleonpaul.com/]]></description>
    <content:encoded><![CDATA[<p>Page photos, vidéos et musique du site d&#8217;Antoine Leonpaul.</p>
<p><span class="und">Prestation</span> : développement des pages cités et intégration dans le back office (WordPress)</p>
<p>PHP5 / Javascript / CSS / xHTML</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p>
<a href="http://www.antoineleonpaul.com/" target=_blank>http://www.antoineleonpaul.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Selah Sue / Officiel]]></title>
    <link><![CDATA[http://www.poudro.com/work/selah-sue/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:52:52 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/selah-sue/]]></guid>
    <description><![CDATA[Site artiste de Selah Sue pour la sortie de son album, avec vidéos, morceaux en écoute, galerie photo, blog, tournée&#8230; Prestation : développement du front office et du back office (wordpress).Site en deux langues.Écriture d&#8217;un module d&#8217;intégration automatique du feed Twitter. PHP5 / Javascript / CSS / xHTML Client : Because Music, 2011 http://www.selahsue.com/]]></description>
    <content:encoded><![CDATA[<p>Site artiste de Selah Sue pour la sortie de son album, avec vidéos, morceaux en écoute, galerie photo, blog, tournée&#8230;</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).<br />Site en deux langues.<br />Écriture d&#8217;un module d&#8217;intégration automatique du feed Twitter.</p>
<p>PHP5 / Javascript / CSS / xHTML</p>
<p><span class="und">Client</span> : Because Music, 2011</p>
<p>
<a href="http://www.selahsue.com/" target=_blank>http://www.selahsue.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Cieu]]></title>
    <link><![CDATA[http://www.poudro.com/work/cieu/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:53:07 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/cieu/]]></guid>
    <description><![CDATA[Site de l&#8217;artiste peintre Thomas Henault, &#8220;Cieu&#8221;. Présentation de ses œuvres, collaborations&#8230; Prestation : développement du front office et du back office (wordpress). PHP5 / Javascript / CSS / xHTML Client : Thomas Henault, 2010 http://cieu.fr/]]></description>
    <content:encoded><![CDATA[<p>Site de l&#8217;artiste peintre Thomas Henault, &#8220;Cieu&#8221;. Présentation de ses œuvres, collaborations&#8230;</p>
<p><span class="und">Prestation</span> : développement du front office et du back office (wordpress).</p>
<p>
PHP5 / Javascript / CSS / xHTML</p>
<p><span class="und">Client</span> : Thomas Henault, 2010</p>
<p>
<a href="http://cieu.fr/" target=_blank>http://cieu.fr/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Ünkut]]></title>
    <link><![CDATA[http://www.poudro.com/work/unkut/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:53:25 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/unkut/]]></guid>
    <description><![CDATA[Page vidéos du site de la marque streetwear Ünkut. Prestation : développement de la page vidéos. Intégrations des boucles vidéos de la home du site. Javascript / CSS / xHTML Client : Ünkut, 2010 http://www.unkut.fr/videos.html]]></description>
    <content:encoded><![CDATA[<p>Page vidéos du site de la marque streetwear Ünkut.</p>
<p><span class="und">Prestation</span> : développement de la page vidéos. Intégrations des boucles vidéos de la home du site. </p>
<p>Javascript / CSS / xHTML</p>
<p><span class="und">Client</span> : Ünkut, 2010</p>
<p>
<a href="http://www.unkut.fr/videos.html" target=_blank>http://www.unkut.fr/videos.html</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Georges&amp;MonBizarre]]></title>
    <link><![CDATA[http://www.poudro.com/work/georgesmonbizarre/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:53:39 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/georgesmonbizarre/]]></guid>
    <description><![CDATA[Site portfolio pour la graphiste Georges&#038;MonBizarre. Prestation : développement de la page unique avec feed automatique des images au cours du scroll en AJAX (combinaison Javascript / PHP). Écriture du back office pour l&#8217;upload et la gestion des images. Protection rudimentaire des images contre le linkage externe. PHP5 / Javascript / CSS / xHTML Client&#160;<a href="http://www.poudro.com/work/georgesmonbizarre/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Site portfolio pour la graphiste Georges&#038;MonBizarre.</p>
<p><span class="und">Prestation</span> : développement de la page unique avec feed automatique des images au cours du scroll en AJAX (combinaison Javascript / PHP). Écriture du back office pour l&#8217;upload et la gestion des images. Protection rudimentaire des images contre le linkage externe.</p>
<p>PHP5 / Javascript / CSS / xHTML</p>
<p><span class="und">Client</span> : Georges&#038;MonBizarre, 2010</p>
<p>
<a href="http://www.georgesetmonbizarre.com/" target=_blank>http://www.georgesetmonbizarre.com/</a></p>
]]></content:encoded>
  </item>
    <item>
    <title><![CDATA[Torsologo &#8211; Calendrier]]></title>
    <link><![CDATA[http://www.poudro.com/work/torsologo-calendrier/]]></link>
    <pubDate>Sun, 02 Oct 2011 09:53:58 +0000</pubDate>
    <guid isPermaLink="true"><![CDATA[http://www.poudro.com/work/torsologo-calendrier/]]></guid>
    <description><![CDATA[Page Calendrier de Torsologo. Prestation : refonte complète du template de la page calendrier pour permettre une mise en forme plus naturelle des jours de chaque mois et une meilleure mise en avant des sponsors de chaque jour.Développement des parties back-end et front-end intégrées dans WordPress. Disposition automatique des jours, intégration avec l&#8217;API paypal, décompte&#160;<a href="http://www.poudro.com/work/torsologo-calendrier/">[lire la suite...]</a>]]></description>
    <content:encoded><![CDATA[<p>Page Calendrier de Torsologo.</p>
<p><span class="und">Prestation</span> : refonte complète du template de la page calendrier pour permettre une mise en forme plus naturelle des jours de chaque mois et une meilleure mise en avant des sponsors de chaque jour.<br/>Développement des parties back-end et front-end intégrées dans WordPress. Disposition automatique des jours, intégration avec l&#8217;API paypal, décompte automatique des jours restants et présentation de l&#8217;ensemble de la page.</p>
<p>PHP / Javascript / CSS / xHTML</p>
<p><span class="und">Client</span> : Torsologo, 2011</p>
<p>
<a href="http://www.torsologo.com/?mois=fevrier" target=_blank>http://www.torsologo.com/?mois=fevrier</a> (En exemple, la page du mois de février sur <a href="http://www.torsologo.com/" target=_blank>Torsologo</a>)</p>
]]></content:encoded>
  </item>
  </channel>
</rss>

