<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>./maxime.sh &#187; Développement</title>
	<atom:link href="http://maxime.sh/category/developpement/feed/" rel="self" type="application/rss+xml" />
	<link>http://maxime.sh</link>
	<description>Le blog de Maxime VALETTE : Web, Vin, Littérature, Culture outrancière.</description>
	<lastBuildDate>Mon, 26 Jul 2010 07:23:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Coral, un CDN gratuit pour votre site</title>
		<link>http://maxime.sh/2010/07/coral-un-cdn-gratuit-pour-votre-site/</link>
		<comments>http://maxime.sh/2010/07/coral-un-cdn-gratuit-pour-votre-site/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 08:49:00 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=3025</guid>
		<description><![CDATA[CDN est l&#8217;abréviation couramment utilisée pour Content Delivery Network, ce qui signifie en bon français Réseau de distribution de contenus. En clair, il s&#8217;agit d&#8217;un réseau d&#8217;ordinateurs dédiés à délivrer du contenu statique, à l&#8217;inverse du contenu généré dynamiquement par un site en fonction de sa base de données ou de l&#8217;utilisateur identifié. Les fichiers [...]]]></description>
			<content:encoded><![CDATA[<p>CDN est l&#8217;abréviation couramment utilisée pour <i>Content Delivery Network</i>, ce qui signifie en bon français <i>Réseau de distribution de contenus</i>. En clair, il s&#8217;agit d&#8217;un réseau d&#8217;ordinateurs dédiés à délivrer du contenu statique, à l&#8217;inverse du contenu généré dynamiquement par un site en fonction de sa base de données ou de l&#8217;utilisateur identifié.</p>
<p>Les fichiers mis à disposition sur un CDN sont en général les images d&#8217;un site, ses fichiers JavaScript, ses feuilles de style. L&#8217;avantage est double : D&#8217;une part ça soulage le serveur qui préfère occuper son temps à générer des pages dynamiques plus rapidement, d&#8217;autre part les CDN sont souvent géolocalisés et l&#8217;utilisateur récupère les fichiers sur le serveur le plus proche de chez lui, diminuant le temps de réponse global du site.</p>
<p>L&#8217;inconvénient est unique : <b>Ça coûte cher</b>. Mais une solution gratuite existe.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/07/logo.jpg" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/07/logo.jpg" alt="logo.jpg" border="0" /></a></p>
<p><a href="http://coralcdn.org/" target="_blank">CoralCDN</a> se veut être la solution de CDN pour tous les gens qui ont envie de réduire leur trafic (très limité dans le cas d&#8217;un hébergement mutualisé par exemple) et d&#8217;accélérer le chargement de leurs pages, mais qui n&#8217;en ont pas les moyens.</p>
<p>Le système CoralCDN est on ne peut plus simple : Il suffit d&#8217;ajouter <span class="code">.nyud.net</span> au nom de domaine dans l&#8217;adresse du fichier que l&#8217;on souhaite mettre en cache sur CoralCDN, et le tour est joué.</p>
<p>Exemple :</p>
<p class="code">http://ootweet.com/images/ootweet.png</p>
<p>devenant…</p>
<p class="code">http://ootweet.com<b>.nyud.net</b>/images/ootweet.png</p>
<p>… le fichier est automatiquement répliqué sur tous les serveurs de CoralCDN.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/07/map-world-gen-1.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/07/map-world-gen-1.png" alt="map-world-gen-1.png" border="0" /></a><br /><em>260 serveurs à travers le monde. C&#8217;est mieux qu&#8217;une Dédibox à Bezons.</em></p>
<p>Vous l&#8217;aurez compris, pour l&#8217;utiliser sur votre site vous n&#8217;avez vraiment pas grand chose à modifier, alors autant en profiter si vous avez des problèmes pour boucler votre bande passante en fin de mois. Encore mieux, si vous êtes sur WordPress, vous n&#8217;avez qu&#8217;<a href="http://wordpress.org/extend/plugins/free-cdn/" target="_blank">un plugin</a> à installer pour profiter de CoralCDN dès maintenant :)</p>
<p>A noter que selon la <a href="http://wiki.coralcdn.org/wiki.php?n=Main.FAQ" target="_blank">FAQ</a>, la taille des fichiers transférés sur le CDN est limitée à 50 Mo, pas besoin de tenter de mettre vos DivX en cache.</p>
<p>Une utilisation détournée mais néanmoins intéressante pour tous ceux qui travaillent derrière un proxy : Les domaines créés grâce à CoralCDN et son .nyud.net échappent la plupart du temps aux filtres de contrôle. Ainsi, si VDM est bloqué à votre boulot par exemple, vous pouvez vous y rendre en tapant l&#8217;URL suivante :</p>
<p class="code">http://www.viedemerde.fr<b>.nyud.net</b></p>
<p>A noter que ce proxy de fortune fonctionne sur les ports 80, 8080 et 8090.</p>
<p>Si vous tombez souvent sur des filtrages en visitant vos sites préférés, vous pouvez installer le bookmarklet <a href="javascript:void((function(){location.href=location.href.replace(/^http\:\/\/([^\/\@]+)\/(?:)/,%22http://%22+%22$1%22.replace(%22\:%22,%22.%22)+%22.nyud.net/%22);})())" target="_blank">Coralize</a> (glissez-le dans votre barre personnelle) et cliquez dessus dès que le monstre proxy tentera une attaque sur votre humble personne.</p>
<p>Voilà pour l&#8217;astuce du jour mes petits pandas, je vais maintenant me plonger dans un bain de glaçons pendant que Friedrich <a href="http://friedri.sh/post/749062364/dyson-air-multiplier-with-a-cat" target="_blank">joue avec le ventilateur</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/07/coral-un-cdn-gratuit-pour-votre-site/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Bookmarklet &#8211; Tout aimer sur Facebook</title>
		<link>http://maxime.sh/2010/06/bookmarklet-tout-aimer-sur-facebook/</link>
		<comments>http://maxime.sh/2010/06/bookmarklet-tout-aimer-sur-facebook/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 10:50:42 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2948</guid>
		<description><![CDATA[Hier, Facebook a ajouté la possibilité d&#8217;aimer les commentaires postés par les gens sur son site. Après avoir transformé la fonction &#171;&#160;Devenir fan&#160;&#187;, c&#8217;est encore une nouvelle possibilité d&#8217;aimer, de s&#8217;aimer, vive l&#8217;amour sur Facebook. Alors, c&#8217;est très bien de pouvoir aimer plein de choses, j&#8217;ai tant d&#8217;amour à donner. Mais si peu de temps [...]]]></description>
			<content:encoded><![CDATA[<p>Hier, Facebook a ajouté la possibilité d&#8217;aimer les commentaires postés par les gens sur son site. Après avoir transformé la fonction &laquo;&nbsp;Devenir fan&nbsp;&raquo;, c&#8217;est encore une nouvelle possibilité d&#8217;aimer, de s&#8217;aimer, vive l&#8217;amour sur Facebook.</p>
<p class="image border"><a href="http://maxime.sh/wp-content/uploads/2010/06/you-like-this-facebook-t-shirt-1.jpg" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/06/you-like-this-facebook-t-shirt-1.jpg" alt="you-like-this-facebook-t-shirt-1.jpg" border="0" /></a></p>
<p>Alors, c&#8217;est très bien de pouvoir aimer plein de choses, j&#8217;ai tant d&#8217;amour à donner. Mais si peu de temps pour une tâche répétitive ! Attendez&#8230; Un être humain, faire une tâche répétitive ? Autant laisser le Javascript s&#8217;en occuper pour moi.</p>
<p>C&#8217;est pourquoi j&#8217;ai créé ces bookmarklets dont l&#8217;unique fonction est de <strong>tout aimer sur Facebook</strong>. Trêve de blablas, la sauce est ici :</p>
<ul>
<li>Facebook en <strong>Français</strong> : <a href="javascript:(function(e,a,g,h,f,c,b,d){if(!(f=e.jQuery)||g%3Ef.fn.jquery||h(f)){c=a.createElement(%22script%22);c.type=%22text/javascript%22;c.src=%22http://ajax.googleapis.com/ajax/libs/jquery/%22+g+%22/jquery.min.js%22;c.onload=c.onreadystatechange=function(){if(!b&#038;&#038;(!(d=this.readyState)||d==%22loaded%22||d==%22complete%22)){h((f=e.jQuery).noConflict(1),b=1);f(c).remove()}};a.documentElement.childNodes[0].appendChild(c)}})(window,document,%221.4.2%22,function($,L){(function(){var%20b=[];var%20a=0;$(%22button%22).each(function(){if($(this).find(%22span%22).html()==%22J'aime%22){b[a]=$(this);a++}});var%20c=function(){like=b.shift();like.click();if(b.length%3E0){setTimeout(c,500)}};c()})();});">J&#8217;aime</a> &#8211; <a href="javascript:(function(e,a,g,h,f,c,b,d){if(!(f=e.jQuery)||g%3Ef.fn.jquery||h(f)){c=a.createElement(%22script%22);c.type=%22text/javascript%22;c.src=%22http://ajax.googleapis.com/ajax/libs/jquery/%22+g+%22/jquery.min.js%22;c.onload=c.onreadystatechange=function(){if(!b&#038;&#038;(!(d=this.readyState)||d==%22loaded%22||d==%22complete%22)){h((f=e.jQuery).noConflict(1),b=1);f(c).remove()}};a.documentElement.childNodes[0].appendChild(c)}})(window,document,%221.4.2%22,function($,L){(function(){var%20b=[];var%20a=0;$(%22button%22).each(function(){if($(this).find(%22span%22).html()==%22Je%20n'aime%20plus%22){b[a]=$(this);a++}});var%20c=function(){like=b.shift();like.click();if(b.length%3E0){setTimeout(c,500)}};c()})();});">Je n&#8217;aime plus</a></li>
<li>Facebook en <strong>Anglais</strong> : <a href="javascript:(function(e,a,g,h,f,c,b,d){if(!(f=e.jQuery)||g%3Ef.fn.jquery||h(f)){c=a.createElement(%22script%22);c.type=%22text/javascript%22;c.src=%22http://ajax.googleapis.com/ajax/libs/jquery/%22+g+%22/jquery.min.js%22;c.onload=c.onreadystatechange=function(){if(!b&#038;&#038;(!(d=this.readyState)||d==%22loaded%22||d==%22complete%22)){h((f=e.jQuery).noConflict(1),b=1);f(c).remove()}};a.documentElement.childNodes[0].appendChild(c)}})(window,document,%221.4.2%22,function($,L){(function(){var%20b=[];var%20a=0;$(%22button%22).each(function(){if($(this).find(%22span%22).html()==%22Like%22){b[a]=$(this);a++}});var%20c=function(){like=b.shift();like.click();if(b.length%3E0){setTimeout(c,500)}};c()})();});">Like</a> &#8211; <a href="javascript:(function(e,a,g,h,f,c,b,d){if(!(f=e.jQuery)||g%3Ef.fn.jquery||h(f)){c=a.createElement(%22script%22);c.type=%22text/javascript%22;c.src=%22http://ajax.googleapis.com/ajax/libs/jquery/%22+g+%22/jquery.min.js%22;c.onload=c.onreadystatechange=function(){if(!b&#038;&#038;(!(d=this.readyState)||d==%22loaded%22||d==%22complete%22)){h((f=e.jQuery).noConflict(1),b=1);f(c).remove()}};a.documentElement.childNodes[0].appendChild(c)}})(window,document,%221.4.2%22,function($,L){(function(){var%20b=[];var%20a=0;$(%22button%22).each(function(){if($(this).find(%22span%22).html()==%22Unlike%22){b[a]=$(this);a++}});var%20c=function(){like=b.shift();like.click();if(b.length%3E0){setTimeout(c,500)}};c()})();});">Unlike</a></li>
</ul>
<p>Pour installer ces bookmarklets, il suffit de les glisser dans votre barre de signets. Une fois sur une page de Facebook, cliquez dessus et vous aimerez tout en quelques secondes (il y a une sorte d&#8217;anti-flood Javascript sur Facebook à détourner).</p>
<p>L&#8217;énorme avantage quand vous aimez quelque chose est que <strong>votre nom ainsi qu&#8217;un lien vers votre profil</strong> apparaissent en dessous des éléments. Un excellent moyen d&#8217;améliorer son personal branding et de gagner beaucoup d&#8217;amis !</p>
<p>A vous la gloire. On dit merci qui mes petits pandas ?</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/06/bookmarklet-tout-aimer-sur-facebook/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Sauvegarder son Gmail grâce à Linux</title>
		<link>http://maxime.sh/2010/06/sauvegarder-son-gmail-grace-a-linux/</link>
		<comments>http://maxime.sh/2010/06/sauvegarder-son-gmail-grace-a-linux/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 14:54:53 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2899</guid>
		<description><![CDATA[Comme beaucoup de gens autour de moi, je suis parano de la sauvegarde. Certains le sont de naissance, d&#8217;autres parce qu&#8217;ils ont perdu beaucoup de données un jour (DTC !)&#8230; J&#8217;ai vécu les deux, et même avec Gmail (compte piraté il y a quelques années). Pour mes e-mails, j&#8217;ai pendant très longtemps utilisé gmail-backup, qui [...]]]></description>
			<content:encoded><![CDATA[<p>Comme beaucoup de gens autour de moi, je suis parano de la sauvegarde. Certains le sont de naissance, d&#8217;autres parce qu&#8217;ils ont perdu beaucoup de données un jour (DTC !)&#8230; J&#8217;ai vécu les deux, et même avec Gmail (compte piraté il y a quelques années).</p>
<p>Pour mes e-mails, j&#8217;ai pendant très longtemps utilisé gmail-backup, qui faisait tout ce qu&#8217;on lui demandait de faire en voyant son nom. Seulement Gmail a mis à jour ses serveurs IMAP il y a peu de temps, rendant <em>inutilisable</em> gmail-backup.</p>
<p>Les serveurs IMAP de Gmail possédaient un bug depuis leur lancement. En récupérant les e-mails via IMAP par la méthode traditionnelle (RFC822), les e-mails n&#8217;étaient pas marqués comme lus. Cependant la RFC précise qu&#8217;ils <em>devraient</em> l&#8217;être. Ce bug a été <a href="http://www.google.com/support/forum/p/gmail/thread?tid=77f2d37c3eda6eaa&#038;hl=en" target="_blank">corrigé</a> il y a quelques semaines, et j&#8217;ai eu le bonheur de voir mes nouveaux e-mails marqués comme lus du jour au lendemain :)</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/06/3a45.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/06/3a45-500.png" alt="3a45.png" border="0" /></a></p>
<p>Le script n&#8217;étant pas open-source et la dernière version datant d&#8217;il y a environ un an, je pense qu&#8217;il est raisonnable de penser que le développement de gmail-backup est mort. J&#8217;ai donc dû trouver un remplaçant.</p>
<p>Ce remplaçant s&#8217;appelle <strong>getmail</strong>. Au premier abord, drôle de remplaçant, puisqu&#8217;il est connu pour utiliser la RFC822. Son créateur maintient cependant que c&#8217;est lui qui a raison et non Google dans cette histoire d&#8217;e-mails marqués comme lus. Qu&#8217;à cela ne tienne, contrairement à gmail-backup, getmail est open-source, il suffit de modifier la récupération des e-mails et le problème est résolu.</p>
<p>Voici donc une longue introduction pour un petit tutorial sur comment sauvegarder votre Gmail sous Linux.</p>
<h2>Télécharger et modifier getmail</h2>
<h3>A la main</h3>
<p>A vrai dire c&#8217;est assez simple. Téléchargez tout d&#8217;abord les <a href="http://pyropus.ca/software/getmail/" target="_blank">sources de getmail</a>. Il faut jeter ensuite un oeil dans <span class="code">getmailcore/_retrieverbases.py</span> pour y faire une modification. Trouvez la ligne suivante :</p>
<pre class="brush: bash;">return self._getmsgpartbyid(msgid, '(RFC822)')</pre>
<p>C&#8217;est cette fameuse RFC822 qui nous fait chier et qui met les e-mails téléchargés comme lus automatiquement. Remplacez-la par une commande PEEK :</p>
<pre class="brush: bash;">return self._getmsgpartbyid(msgid, '(BODY.PEEK[])')</pre>
<p>Vous vivrez ainsi heureux.</p>
<h3>Paresseux</h3>
<p>Vous vivrez tout aussi heureux en prenant ma version déjà modifiée.</p>
<ul class="download">
<li class="file">Télécharger <a href="http://cdn.betacie.com/.maxime/blog/getmail-4.17.0-peek.tar.gz" target="_blank">getmail-4.17.0-peek.tar.gz</a></li>
<li class="desc">getmail 4.17.0 avec PEEK &mdash; Taille : 168 Ko</li>
</ul>
<h2>Installer getmail</h2>
<p>L&#8217;installation se fait ensuite comme à peu près tous les logiciels Python, à savoir avec deux lignes de commande dans la racine des sources getmail :</p>
<pre class="brush: bash;">python setup.py build
python setup.py install</pre>
<h2>Configurer getmail</h2>
<p>Maintenant que getmail est modifié et installé, il faut créer le fichier de configuration qui va indiquer à getmail quoi prendre et où prendre. Commencez par créer un dossier <span class="code">.getmail</span> dans votre répertoire utilisateur, ainsi qu&#8217;un répertoire <span class="code">gmail</span> et son fichier mbox pour stocker la sauvegarde.</p>
<pre class="brush: bash;">mkdir ~/.getmail
mkdir ~/gmail
touch ~/gmail/gmail-backup.mbox</pre>
<p>Dans ce répertoire, créons un fichier de configuration, appelé au hasard <span class="code">getmail.gmail</span>, qui contiendra les informations suivantes :</p>
<pre class="brush: plain;">[retriever]
type = SimpleIMAPSSLRetriever
server = imap.gmail.com
username = /* Votre e-mail Gmail */
password = /* Votre mot de passe Gmail */
mailboxes = (&quot;[Gmail]/All Mail&quot;,)

[destination]
type = Mboxrd
path = ~/gmail/gmail-backup.mbox

[options]
read_all = false
verbose = 2
message_log = ~/.getmail/gmail.log</pre>
<p>Remplacez évidemment username et password (je le dis quand même, on ne sait jamais).</p>
<h2>Sauvegarder !</h2>
<p>L&#8217;utilisation de l&#8217;IMAP permet de tout télécharger en une fois lors de la première synchronisation. Avec du POP Gmail permet de ne récupérer que 500 e-mails à la fois environ.</p>
<p>Pour faire une première sauvegarde intégrale, tapez la commande suivante (prévoyez un café si vous avez beaucoup d&#8217;e-mails) :</p>
<pre class="brush: bash;">/usr/bin/getmail -la -r getmail.gmail</pre>
<p>Si cette première récupération s&#8217;est déroulée sans accrocs, vous pouvez mettre la commande suivante dans un crontab, qui va récupérer uniquement les nouveaux mails sur votre compte :</p>
<pre class="brush: bash;">/usr/bin/getmail -ln -r getmail.gmail</pre>
<p>Et voilà, vous n&#8217;aurez plus à craindre un tremblement de terre qui ferait imploser tous les datacenters de Google. Vos e-mails sont tous chez vous, et vous pouvez continuer à utiliser l&#8217;interface si pratique de Gmail en toute sécurité.</p>
<p>PS : Evidemment cela peut s&#8217;adapter à à peu près n&#8217;importe quel fournisseur de courrier électronique. J&#8217;ai titré Gmail car le patch de getmail était nécessaire pour que ça fonctionne en particulier avec le service de Google.</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/06/sauvegarder-son-gmail-grace-a-linux/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Twitter : La fin d&#8217;un modèle</title>
		<link>http://maxime.sh/2010/04/twitter-la-fin-dun-modele/</link>
		<comments>http://maxime.sh/2010/04/twitter-la-fin-dun-modele/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 08:13:59 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2843</guid>
		<description><![CDATA[Cette nuit aura été marqué par un tweet, puis un communiqué de presse : Twitter rachète Tweetie 2. Les conséquences de ce rachat sont simples, de prime abord : Le client devient gratuit (actuellement à 2,39 euros) et sera renommé Twitter for iPhone. Si la nouvelle pouvait se faire attendre, suite au développement d&#8217;un premier [...]]]></description>
			<content:encoded><![CDATA[<p>Cette nuit aura été marqué par un <a href="http://twitter.com/twitter/status/11912673829" target="_blank">tweet</a>, puis un <a href="http://blog.twitter.com/2010/04/twitter-for-iphone.html" target="_blank">communiqué de presse</a> : <b>Twitter rachète Tweetie 2</b>. Les conséquences de ce rachat sont simples, de prime abord : Le client devient gratuit (actuellement à 2,39 euros) et sera renommé Twitter for iPhone.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/04/twitter_logo.jpg" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/04/twitter_logo-500.jpg" alt="twitter_logo.jpg" border="0" /></a></p>
<p>Si la nouvelle pouvait se faire attendre, suite au développement d&#8217;un premier client <em>officiel</em> pour BlackBerry, elle va sûrement choquer beaucoup de développeurs de clients Twitter autour du monde, et nous n&#8217;avons pas fini d&#8217;en entendre parler. Pourtant, mes petits pandas, il va falloir vous y habituer : <strong>La fête est finie</strong> :)</p>
<p>A dire vrai, Echofon, Tweetdeck et consorts n&#8217;ont pas de soucis à se faire. S&#8217;ils sont intelligents ils devaient se douter que ça arriverait tôt ou tard. On ne lève pas 100 millions de dollars en laissant s&#8217;échapper 70 % de son trafic monétisable. Nous avons eu le problème de notre côté avec FML, la version anglaise de VDM, c&#8217;est pourquoi j&#8217;ai décidé d&#8217;en parler un peu aujourd&#8217;hui.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/04/mss2.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/04/mss2.png" alt="mss2.png" border="0" /></a></p>
<p>En effet, <a href="http://www.fmylife.com" target="_blank">FMyLife</a> est particulièrement populaire aux Etats-Unis comme vous le savez. Mais il l&#8217;est spécialement sur appareils mobiles, et a fortiori sur iPhone où nous comptabilisons près de la moitié de notre trafic global. C&#8217;est donc bien beau de paraître utopiste et de laisser tout le monde gagner de l&#8217;argent en faisant des applications payantes ou financées par la publicité, mais on ne pouvait pas se permettre d&#8217;en perdre pour que les autres en gagnent, à un moment on n&#8217;est pas Mère Térésa SARL.</p>
<p>C&#8217;est pourquoi en Décembre dernier nous étions passés sur une API fermée (cf. <a href="http://techcrunch.com/2010/01/02/fmylife-api/" target="_blank">TechCrunch</a>) où seulement les applications que nous choisissons ont un accès à notre contenu et à l&#8217;API en général. De cette manière nous avons sorti des <a href="http://www.fmylife.com/applications/official" target="_blank">clients officiels</a> gratuits, financés par la publicité, tout comme le site Internet, et avons pu garder la main sur notre trafic et notre monétisation, tout en laissant libre cours aux développeurs la création d&#8217;applications non-concurrentes.</p>
<p>En conclusion, les applications Twitter existantes se devront d&#8217;innover et de créer de la valeur ajoutée au lieu de réinventer la roue du client Twitter.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/04/9fs9.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/04/9fs9-500.png" alt="9fs9.png" border="0" /></a></p>
<p>Ainsi je pense que dans les prochains mois, nous allons assister à l&#8217;ajout de nouvelles conditions dans l&#8217;API de Twitter. Elle ne deviendra sûrement jamais une API fermée, cependant l&#8217;apparition d&#8217;applications officielles (et de leur monétisation qui va avec, le marché de la publicité mobile étant très juteux) va couper l&#8217;herbe sous le pied aux applications qui n&#8217;auront aucune valeur ajoutée par rapport à l&#8217;application officielle.</p>
<p>Twitter pourra conserver son avance dans le monde des applications grâce à des fonctionnalités API utilisables uniquement par leurs applications officielles, ainsi que le fait de savoir d&#8217;avance les prochaines évolutions du service de microblogging et d&#8217;adapter leurs développements en conséquence (les comptes payants me viennent tout de suite à l&#8217;esprit).</p>
<p>Enfin, concernant Tweetie 2 for Mac (qui n&#8217;est pas concernée par le rachat, contrairement à ce qu&#8217;on peut lire sur le NY Times ou dans certains autres blogs &mdash; lisez le vrai communiqué), Loren Brichter nous <a href="http://www.macheist.com/forums/viewtopic.php?pid=370710#p370710" target="_blank">annonce</a> que le développement est toujours &laquo;&nbsp;en cours&nbsp;&raquo;. Je sens qu&#8217;on va avoir du mal à avoir une version non-bêta rapidement (cf. <a href="http://maxime.sh/2010/01/nachetez-pas-tweetie/" target="_blank">N&#8217;achetez pas Tweetie</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/04/twitter-la-fin-dun-modele/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Faille SQL : LoL Guru, je LIKE.</title>
		<link>http://maxime.sh/2010/03/faille-sql-lol-guru-je-like/</link>
		<comments>http://maxime.sh/2010/03/faille-sql-lol-guru-je-like/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 11:50:54 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2745</guid>
		<description><![CDATA[Aujourd&#8217;hui a été annoncé en grandes pompes (&#8230;) le nouveau site du groupe PlayWeb, dirigé de main de maître par Romain Casolari (on sent que c&#8217;est le même, vu les sites), alias Chauffeur de Buzz, j&#8217;ai nommé LoL Guru. Le nom fait déjà frémir, cependant la description vaut le détour : Bienvenue sur mon site, [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui a été annoncé <a href="http://www.nowhereelse.fr/lol-guru-ouvre-ses-portes-30948/" target="_blank">en grandes pompes</a> (&#8230;) le nouveau site du <a href="http://www.groupeplayweb.com/" target="_blank">groupe PlayWeb</a>, dirigé de main de maître par <a href="http://casolari.fr/" target="_blank">Romain Casolari</a> (on sent que c&#8217;est le même, vu les sites), alias Chauffeur de Buzz, j&#8217;ai nommé <a href="http://lolguru.com/" target="_blank">LoL Guru</a>. Le nom fait déjà frémir, cependant la description vaut le détour :</p>
<blockquote class="quote"><p>Bienvenue sur mon site, je suis LoL Guru ®, né le 21 décembre 1891, je suis considéré comme le Gourou du Divertissement !!! Je blogue, mets à jour ce site depuis le début du XXe siècle pour partager avec vous les news, photos, vidéos, sites Internet, jeux et coloriages en ligne, prochaines et dernières sorties de DVD, jeux vidéo, logiciels, applications, &#8230;</p>
<p>Amusez-vous bien LOL</p></blockquote>
<p>Moi quand on me propose de m&#8217;amuser, je dis jamais non.</p>
<p>Mais&#8230; J&#8217;ai des loisirs un peu différents.</p>
<p>En tant que développeur, le backoffice d&#8217;un site si énorme m&#8217;intriguait. Je l&#8217;imaginais déjà rempli d&#8217;algorithmes, une interface à la Minority Report pour taper plus vite que son ombre, de <em>l&#8217;autocompletion</em> en AJAX en veux-tu en voilà&#8230;</p>
<p class="image border"><a href="http://maxime.sh/wp-content/uploads/2010/03/akaa.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/akaa-500.png" alt="akaa.png" border="0" /></a><br /><em>Paie ta déception.</em></p>
<p>Ouais bon, on repassera. Je vous reprends encore quelques minutes de votre temps, mes petits pandas, pour vous expliquer comment j&#8217;en suis arrivé là.</p>
<p>Il ne faut pas très longtemps, même pour un con comme moi, pour trouver l&#8217;adresse de l&#8217;administration du site. En effet, un aller simple sur <span class="code">http://fr.lolguru.com/admin/connexion.asp</span> nous laissait apparaître un joli formulaire d&#8217;identification.</p>
<p>Ayant peu d&#8217;espoir mais ne pouvant repartir sans avoir testé, je me lance et écris une apostrophe comme identifiant, ainsi qu&#8217;en mot de passe. Je m&#8217;attendais à me faire rejeter bien comme il faut, avec une alerte automatique au GIGN. Quand je vois simplement l&#8217;erreur suivante :</p>
<p class="code">[Microsoft][Pilote ODBC Microsoft Access] Erreur de syntaxe dans la chaîne dans l&#8217;expression &quot;login like &#8217;&#8217;&#8217; and password like &#8217;&#8217;&#8217;&quot;.</p>
<p>Je n&#8217;ai donc pas pu accéder à l&#8217;administration du site. Cependant deux points m&#8217;intriguent :</p>
<ul>
<li>L&#8217;utilisation de la syntaxe SQL <strong>LIKE</strong> pour l&#8217;identification autorise le wildcard %. Très dangereux pour un système d&#8217;identification.</li>
<li>Mes apostrophes n&#8217;ont en plus pas été échappées par un antislash, ce qui a provoqué l&#8217;erreur SQL. Très très dangereux&#8230;</li>
</ul>
<p>L&#8217;idée de mettre le wildcard % comme identifiant ainsi que mot de passe rendrait donc la requête SQL suivante : <span class="code">login like &#8216;%&#8217; and password like &#8216;%&#8217;</span>, ce qui sélectionnerait donc n&#8217;importe quel identifiant stocké dans la base. Et effectivement, j&#8217;ai été identifié comme administrateur (voir capture d&#8217;écran ci-dessus).</p>
<p class="image border"><a href="http://maxime.sh/wp-content/uploads/2010/03/axcv.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/axcv-500.png" alt="axcv.png" border="0" /></a><br /><em>Faut toujours deux preuves.</em></p>
<p>Ne cherchez plus à aller sur cette page, elle a été supprimée / renommée depuis. Encore mes talents de <a href="http://maxime.sh/2010/01/yes-we-ads-envoie-du-bois-invisible/" target="_blank">prestidigitateur</a>.</p>
<p>Pour résumer, voici 4 erreurs à ne pas reproduire sur votre site :</p>
<ul>
<li>Ne pas utiliser la syntaxe SQL LIKE en dehors de cas très particuliers (comme la recherche dans une table).</li>
<li>Ne pas afficher les erreurs SQL lorsque son site est en production (ou au moins, pas les requêtes complètes&#8230;).</li>
<li>Ne pas oublier d&#8217;échapper les données injectées dans une requêtes.</li>
<li>Eviter d&#8217;avoir un répertoire administration avec un nom évident si on n&#8217;est pas sûr de sa sécurité.</li>
</ul>
<p>Si vous ne savez pas protéger correctement votre administration et que vous êtes sur Apache, vous pouvez tout aussi bien utiliser la méthode de la protection par .htaccess/.htpasswd.</p>
<p>Au-delà de cette faille, j&#8217;ai été surpris par l&#8217;austérité de ce backoffice. Rempli de cases austères tel un formulaire de l&#8217;administration pénitencière, avec des couleurs hasardeuses et des fautes d&#8217;orthographe, ça ne donne pas vraiment envie de travailler et produire du contenu.</p>
<p>Et vous, est-ce que l&#8217;administration de votre blog/site est agréable ? Est-ce que ça a de l&#8217;importance pour vous ?</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/03/faille-sql-lol-guru-je-like/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>L&#8217;infrastructure VDM : Memcache</title>
		<link>http://maxime.sh/2010/03/linfrastructure-vdm-memcache/</link>
		<comments>http://maxime.sh/2010/03/linfrastructure-vdm-memcache/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 19:44:50 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Ma vie]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2661</guid>
		<description><![CDATA[La semaine dernière, je vous annonçais la création d&#8217;une suite d&#8217;articles concernant l&#8217;infrastructure de VDM. J&#8217;ai commencé en présentant mes serveurs MySQL. Récapitulatif : L’infrastructure que j’ai montée pour VDM/FML Dans cette série de billets (normalement trois en comptant celui là), je vais vous raconter ce qui se passe derrière les URL viedemerde.fr et fmylife.com, [...]]]></description>
			<content:encoded><![CDATA[<p>La semaine dernière, je vous annonçais la création d&#8217;une suite d&#8217;articles concernant l&#8217;infrastructure de VDM. J&#8217;ai commencé en présentant mes <a href="http://maxime.sh/2010/03/linfrastructure-vdm-mysql/" target="_blank">serveurs MySQL</a>. Récapitulatif :</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/03/betacie_network1.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/betacie_network1-500.png" border="0" alt="betacie_network.png" /></a><br />
<em>L’infrastructure que j’ai montée pour VDM/FML</em></p>
<p>Dans cette série de billets (normalement trois en comptant celui là), je vais vous raconter ce qui se passe derrière les URL viedemerde.fr et fmylife.com, qui représentent 98% du trafic de l’infrastructure d’hébergement de ma société, Beta&amp;Cie. Ces articles n’ont pas pour vocation de me vanter ou de dire au monde entier que ma solution est la meilleure, c’est juste ma solution et elle marche bien jusqu’à maintenant.</p>
<p>Aujourd&#8217;hui, parlons de <strong>Memcache</strong>.</p>
<h2>Présentation de memcached</h2>
<p>Comme nous l&#8217;avons vu la semaine dernière, les serveurs de données sont bien remplis en données diverses et variées, que ce soit des votes, des anecdotes, les informations de connexion. Beaucoup de données, dont une partie est redondante. Mais pas la totalité de la page puisque chaque anecdote est votée, impossible donc de <em>cacher</em> toute la page.</p>
<p>Un <a href="http://memcached.org/" target="_blank">serveur memcached</a> (d pour daemon) est un serveur léger qui permet de stocker temporairement des données en RAM. Si léger qu&#8217;il ne dispose d&#8217;aucun système d&#8217;identification pour accéder ou modifier ces données, donc faites bien attention à ne faire écouter le serveur qu&#8217;en local si vous installez un jour une telle solution pour votre serveur.</p>
<h2>Son utilisation sur VDM</h2>
<p>La technologie memcached permet donc de stocker n&#8217;importe quel type de données. Il sert souvent par exemple sur des clusters de serveurs Web pour centraliser les sessions PHP. On peut donc facilement en tirer profit pour mettre en cache plusieurs informations du site, et ainsi soulager de manière significative les serveurs MySQL.</p>
<p class="image border"><a href="http://maxime.sh/wp-content/uploads/2010/03/memcache.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/memcache.png" border="0" alt="memcache.png" /></a><br />
<em>One server to rule them all.</em></p>
<p>La problématique est maintenant la mise en place de cette solution sur le code PHP existant de VDM. PHP possède une <a href="http://php.net/manual/en/ref.memcache.php" target="_blank">extension Memcache</a> qui permet d&#8217;implémenter facilement une solution de cache.</p>
<p>La solution que j&#8217;ai retenue est résumée dans le code suivant. Les requêtes SQL sont transformées en hash MD5 pour le nom de la clé, et l&#8217;objet du résultat de la requête est stockée en cache, avec un cache par défaut d&#8217;une heure (3600 secondes). De cette manière, si la clé n&#8217;existe pas sur le serveur memcached, la requête est automatiquement exécutée et le résultat stocké.</p>
<pre class="brush: php;">&lt;?php

$memcache = new Memcache();
$memcache-&gt;pconnect(&quot;127.0.0.1&quot;,&quot;9000&quot;);

function mcache($query,$timeout=3600,$force=false) {

	global $memcache;

	$hash = md5($query);

	if (!$force) {

		$value = $memcache-&gt;get($hash);

	}

	if ($force || $value === FALSE) {

		$result = mysql_query($query);
		$value = mysql_fetch_object($result);
		$memcache-&gt;set($hash,$value,NULL,$timeout);

	}

	return $value;

}

function mcache_set($query,$value,$timeout=3600) {

	global $memcache;

	$hash = md5($query);

	$value = $memcache-&gt;set($hash,$value,NULL,$timeout);

	return $value;

}

function mcache_delete($query) {

	global $memcache;

	$hash = md5($query);
	$value = $memcache-&gt;delete($hash);

	return $value;

}

?&gt;</pre>
<p>Grâce à ces fonctions nous avons conservé toutes nos requêtes, et pouvons utiliser de manière transparente soit Memcache soit MySQL. Plus pratique pour pouvoir synchroniser rapidement les données entre les deux serveurs, en plus d&#8217;avoir facilité la migration vers Memcache.</p>
<p>Exemple d&#8217;utilisation :</p>
<pre class="brush: php;">&lt;?php

/* Je suis un nul alors je mets pas de mot de passe en root */
mysql_connect(&quot;localhost&quot;,&quot;root&quot;,&quot;&quot;);
mysql_select_db(&quot;base&quot;);

/* La requête MySQL normale sans cache */
$result = mysql_query(&quot;SELECT texte FROM articles WHERE id = '1337' LIMIT 1&quot;);
$row = mysql_fetch_object($result);

/* La requête avec le cache Memcache */
$row = mcache(&quot;SELECT texte FROM articles WHERE id = '1337' LIMIT 1&quot;);

?&gt;</pre>
<p>Grâce aux fonctions <span class="code">mcache()</span> et consorts, on peut donc sans trop de difficultés alléger le travail des serveurs de bases de données. Si vous avez besoin de mettre en cache un tableau de résultats, vous pouvez utiliser la fonction suivante :</p>
<pre class="brush: php;">&lt;?php

function mcache_array($query,$timeout=3600,$force=false) {

	global $memcache;

	$hash = md5($query);

	if (!$force) {

		$value = $memcache-&gt;get($hash);

	}

	if ($force || $value === FALSE) {

		$memcache-&gt;delete($hash);

		$result = mysql_query($query);
		while ($row = mysql_fetch_object($result)) {
			$value[] = $row;
		}

		$memcache-&gt;set($hash,$value,NULL,$timeout);

	}

	if (!is_array($value)) $value = array();
	return $value;

}

?&gt;</pre>
<p>Ainsi, sur VDM et FML, nous mettons en cache principalement les données suivantes :</p>
<ul>
<li>Les données &laquo;&nbsp;statiques&nbsp;&raquo; des anecdotes (texte, auteur, etc.)</li>
<li>Les totaux des votes sur les anecdotes (mis à jour à chaque vote sans appel à MySQL)</li>
<li>Les ID des dernières anecdotes lues par les utilisateurs, pour afficher les &laquo;&nbsp;NEW&nbsp;&raquo;</li>
<li>Certains rendus XML de l&#8217;API pour les applications mobiles</li>
</ul>
<p>Au niveau des chiffres, voici des statistiques sur les 3 dernières semaines d&#8217;utilisation du serveur memcached :</p>
<ul>
<li>900 connexions simultanées en permanence</li>
<li>90 000 connexions par jour</li>
<li>14,4 Mo écrits par seconde (via 622 requêtes en moyenne)</li>
<li>1,8 Go de données stockées en ce moment</li>
<li>6,9 millions de données stockées en ce moment</li>
<li>1,3 milliard de données stockées en tout</li>
</ul>
<p>Comme d&#8217;habitude, n&#8217;hésitez pas à commenter pour plus d&#8217;informations, j&#8217;ai sûrement oublié beaucoup de choses. La semaine prochaine nous parlerons de serveurs Web.</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/03/linfrastructure-vdm-memcache/feed/</wfw:commentRss>
		<slash:comments>75</slash:comments>
		</item>
		<item>
		<title>PD.TC, le raccourcisseur du LOL</title>
		<link>http://maxime.sh/2010/03/pd-tc-le-raccourcisseur-du-lol/</link>
		<comments>http://maxime.sh/2010/03/pd-tc-le-raccourcisseur-du-lol/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 08:03:53 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2577</guid>
		<description><![CDATA[Peu de gens le savent, Beta&#038;Cie faisait partie des premiers à créer un service de &#171;&#160;raccourcisseur d&#8217;URL&#160;&#187;, en mauvais français. C&#8217;était en 2008 et il fonctionne toujours. Cependant aujourd&#8217;hui, 7 caractères c&#8217;est trop long. Il a fallu en trouver un autre. Laissez-moi vous présenter PD.TC, le raccourcisseur d&#8217;URL le plus LOL. Grâce à son acronyme [...]]]></description>
			<content:encoded><![CDATA[<p>Peu de gens le savent, Beta&#038;Cie faisait partie des premiers à créer un service de &laquo;&nbsp;raccourcisseur d&#8217;URL&nbsp;&raquo;, en mauvais français. C&#8217;était en 2008 et il <a href="http://shrt.fr/" target="_blank">fonctionne toujours</a>. Cependant aujourd&#8217;hui, 7 caractères c&#8217;est trop long. Il a fallu en trouver un autre.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/03/2hgh.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/2hgh-500.png" alt="2hgh.png" border="0" /></a></p>
<p>Laissez-moi vous présenter <strong>PD.TC</strong>, le raccourcisseur d&#8217;URL le plus LOL. Grâce à son acronyme équivoque, vos soirées Twitter n&#8217;en seront que plus gaies. Ô la joie de balancer à son prochain &laquo;&nbsp;C&#8217;est où que t&#8217;as trouvé machin ? PDTC&nbsp;&raquo;. Oui, c&#8217;est aujourd&#8217;hui à votre portée.</p>
<p>Mais pour bien l&#8217;utiliser au quotidien, quelle idée d&#8217;utiliser un simple formulaire ! Toi la star de Twitter, tu as besoin de l&#8217;intégrer directement dans les outils que tu utilises quotidiennement.</p>
<p>Voici trois tutoriaux qui couvriront toutes tes attentes pour utiliser PD.TC dans les meilleures conditions possibles, et ainsi diffuser l&#8217;esprit du LOL partout autour de toi.</p>
<h2>Utiliser PD.TC avec n&#8217;importe quel client Twitter</h2>
<p>Pour pouvoir utiliser mon service sur la plupart des clients Twitter Mac/Windows/Linux, mes petits pandas, il va falloir utiliser une méthode de sioux.</p>
<p><strong>Sous Mac/Linux :</strong> Ouvrez une fenêtre de Terminal pour modifier le fichier hosts en tapant ces deux lignes :</p>
<pre class="brush: bash;">echo '91.191.146.209 tinyurl.com' | sudo tee -a /etc/hosts</pre>
<p><strong>Sous Windows :</strong> Ajoutez la ligne <span class="code">91.191.146.209 tinyurl.com</span> dans votre fichier hosts, dont l&#8217;emplacement varie selon les versions. En général dans <span class="code">C:\Windows\system32\drivers\etc\hosts</span>.</p>
<p>De cette manière, toutes les URL TinyURL passeront par mes serveurs qui simuleront son comportement. En contrepartie vous ne pourrez plus raccourcir d&#8217;URL sur TinyURL (en même temps le site est tout moche, c&#8217;est pas une perte), mais les URL raccourcies de TinyURL <em>marcheront toujours</em> !</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/03/bq6d.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/bq6d.png" alt="bq6d.png" border="0" /></a></p>
<p>Modifiez ensuite dans votre client Twitter votre URL Shortening Service en indiquant TinyURL, et vous pourrez utiliser PD.TC facilement et rapidement.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/03/q8vr.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/q8vr.png" alt="q8vr.png" border="0" /></a></p>
<p>Je pense que la technique marche à peu près avec n&#8217;importe quel client Twitter, à partir du moment que vous modifiez le fichier hosts et que vous pouvez sélectionner TinyURL dans votre client, tout roule.</p>
<h2>Utiliser PD.TC avec Tweetie iPhone</h2>
<p>Tweetie 2 pour iPhone intègre nativement la possibilité d&#8217;avoir son propre raccourcisseur d&#8217;URL. Il suffit donc d&#8217;aller dans les réglages &laquo;&nbsp;URL shortening&nbsp;&raquo; de Tweetie :</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/03/IMG_0620.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/IMG_0620-iphone.png" alt="IMG_0620.PNG" border="0" /></a><br /><em>Settings > Services > URL Shortening > Custom&#8230;</em></p>
<p>Et entrez l&#8217;URL suivante pour utiliser PD.TC automatiquement :</p>
<p class="code">http://pd.tc/?api=1&#038;url=%@</p>
<h2>Utiliser PD.TC avec PHP</h2>
<p>Vous pouvez utiliser PD.TC dans tous vos scripts et applications. Voici un simple exemple en PHP, que vous pourrez adapter à à peu près tous les langages de programmation existants :</p>
<pre class="brush: php;">&lt;?php

/* Appel de pd.tc avec l'URL qu'on veut raccourcir */

$url = &quot;http://www.google.fr&quot;;
$pdtc = file_get_contents(&quot;http://pd.tc/?api=1&amp;url=&quot;.urlencode($url));

/* Retournera : string(17) &quot;http://pd.tc/0236&quot; */

var_dump($pdtc);

?&gt;</pre>
<p>A noter que j&#8217;enregistre tous les accès aux URL, donc si le service est utilisé je ferai peut-être des classements &#038; consorts, mais pour le moment c&#8217;est surtout pour le fun du nom de domaine que j&#8217;ai créé ce service, et ça restera pour le fun :)</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/03/pd-tc-le-raccourcisseur-du-lol/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>L&#8217;infrastructure VDM : MySQL</title>
		<link>http://maxime.sh/2010/03/linfrastructure-vdm-mysql/</link>
		<comments>http://maxime.sh/2010/03/linfrastructure-vdm-mysql/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 16:35:14 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Ma vie]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2500</guid>
		<description><![CDATA[Depuis des mois je promets une série d&#8217;articles qui ne va peut-être pas intéresser grand monde, mais qui aura le mérite d&#8217;exister et de soulager ma conscience (ma mère m&#8217;a dit que ce n&#8217;était pas joli de ne pas tenir ses promesses). Contrairement à ce que certains laissent penser, je fais quelque chose de mes [...]]]></description>
			<content:encoded><![CDATA[<p>Depuis des mois je promets une série d&#8217;articles qui ne va peut-être pas intéresser grand monde, mais qui aura le mérite d&#8217;exister et de soulager ma conscience (ma mère m&#8217;a dit que ce n&#8217;était pas joli de ne pas tenir ses promesses).</p>
<p>Contrairement à ce que certains laissent penser, je fais quelque chose de mes journées. Je suis développeur Web, mais aussi administrateur système. Créer puis s&#8217;occuper de l&#8217;hébergement de sites comme VDM et FML n&#8217;arrive pas tous les jours, et j&#8217;ai gagné beaucoup d&#8217;expérience ces 12 derniers mois en montant une infrastructure qui accueille chaque jour <em>plus de 3 millions de visiteurs</em>.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/03/betacie_network.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/betacie_network-500.png" alt="betacie_network.png" border="0" /></a><br /><em>L&#8217;infrastructure que j&#8217;ai montée pour VDM/FML</em></p>
<p>Dans cette série de billets (normalement trois en comptant celui là), je vais vous raconter ce qui se passe derrière les URL viedemerde.fr et fmylife.com, qui représentent 98% du trafic de l&#8217;infrastructure d&#8217;hébergement de ma société, Beta&#038;Cie. Ces articles n&#8217;ont pas pour vocation de me vanter ou de dire au monde entier que ma solution est la meilleure, c&#8217;est juste ma solution et elle marche bien jusqu&#8217;à maintenant.</p>
<p>Passons au premier sujet : <strong>Les serveurs MySQL</strong>.</p>
<h2>Réplication circulaire</h2>
<p class="image border"><a href="http://maxime.sh/wp-content/uploads/2010/03/tv8n.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/tv8n-500.png" alt="tv8n.png" border="0" /></a><br /><em>Mes sept petits bouts de chou.</em></p>
<p>Comme le montre le schéma, mes sept serveurs sont configurés en réplication circulaire. C&#8217;est à dire que chacun est maître et esclave à la fois (pas de connotations sexuelles ici, merci !). s1 est donc maître sur s2, mais il est esclave de s7.</p>
<p>Cette configuration a l&#8217;avantage de bien fonctionner derrière un <em>load balancer</em> puisque chaque serveur a le droit d&#8217;écriture. C&#8217;est donc transparent pour le développeur qui n&#8217;a qu&#8217;à renseigner l&#8217;IP du load balancer dans sa connexion à MySQL et travailler comme s&#8217;il n&#8217;avait qu&#8217;un seul serveur.</p>
<p>L&#8217;inconvénient est un inconvénient de taille. Comme les requêtes s&#8217;exécutent comme dans une ronde, si un serveur plante, toute la ronde est cassée et plus rien ne se réplique. Il faut donc avoir du bon matériel, et au cas où ça arrive quand même, <a href="http://maxime.sh/2009/12/le-monitoring-cette-belle-activite/" target="_blank">agir très vite</a> pour éviter que les utilisateurs ne râlent :)</p>
<p>Une petite astuce pour éviter que votre réplication ne s&#8217;arrête pour des raisons connes : Je fais ignorer par mes serveurs systématiquement les erreurs 1062 (nouvelle entrée avec le même ID) et 1053 (déclenchée quand le serveur maître s&#8217;éteint ou redémarre) :</p>
<pre class="brush: plain;">slave-skip-errors=1062,1053</pre>
<p>Pour diminuer les latences de réplication il est aussi important d&#8217;avoir un bon réseau&#8230;</p>
<h2>Réseau VLAN</h2>
<p>Au delà de l&#8217;onomatopée, un VLAN est l&#8217;abréviation de Réseau Local Virtuel (RLV ça le faisait pas, hein ?). Il permet de créer un réseau indépendant du reste des machines du réseau où est hébergée l&#8217;infrastructure. Concrètement chaque serveur possède deux interfaces physiques :</p>
<pre class="brush: bash;"># ifconfig
eth0      Link encap:Ethernet  HWaddr 00:30:48:b9:42:e2
          inet addr:91.191.146.199  Bcast:91.191.146.255  Mask:255.255.255.192

eth1      Link encap:Ethernet  HWaddr 00:30:48:b9:42:e3
          inet addr:10.191.146.199  Bcast:10.191.146.255  Mask:255.255.255.0</pre>
<p>eth0 a l&#8217;adresse IP 91.191.146.199 qui est atteignable de l&#8217;extérieur du réseau, alors que eth1 a l&#8217;adresse IP 10.191.146.199 qui est interne au VLAN et qui par conséquent ne peut communiquer qu&#8217;avec ses copines du même VLAN qu&#8217;elle.</p>
<p>Avoir ses serveurs en VLAN diminue donc la latence entre les serveurs, la réplication se fait plus rapidement et avec plus de sécurité puisqu&#8217;aucun paquet ne sort de votre réseau local. Deux avantages indéniables qui devraient vous faire <s>quitter OVH</s> choisir un hébergeur qui fait du VLAN ! En effet les réseaux virtuels se configurent au niveau des routeurs/switches, il faut donc choisir un hébergeur qui puisse le prendre en charge.</p>
<h2>Disques SSD</h2>
<p>Pour économiser un certain nombre de machines dans ma réplication circulaire et ainsi réduire le nombre de défaillances matérielles, j&#8217;ai très vite décidé d&#8217;utiliser du SSD pour héberger les données de mes bases. Au début j&#8217;ai eu des X25-M chez OVH (mon ancien hébergeur), qui est le moyen de gamme du SSD, puis je suis passé récemment au X25-E, la version haut de gamme, comme le montre ce <a href="http://www.sd-france.com/news-200908/24/disques-ssd-intel-x25-e.html" target="_blank">benchmark par SD-France</a>, mon gentil hébergeur :</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/03/20090824-test-ssd-graph-ecriture.gif" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/03/20090824-test-ssd-graph-ecriture.gif" alt="20090824-test-ssd-graph-ecriture.gif" border="0" /></a></p>
<p>Le X25-E dépasse largement tous ses concurrents en terme d&#8217;écriture et de lecture de disque. Cela assure évidemment un meilleur temps de réponse sur les requêtes, différence qui se ressent lorsque l&#8217;on traite <strong>15 000 requêtes par seconde</strong>&#8230;</p>
<p>Les deux inconvénients de cette méthode :</p>
<ul>
<li>La capacité. La plus grande taille disponible est 64 Go, ce qui peut paraître beaucoup pour de simples bases de données, mais qui se remplit vite quand le site repose sur beaucoup d&#8217;anecdotes / commentaires et surtout votes.</li>
<li>Le prix. Les disques SSD X25-E sont encore très chers, même s&#8217;ils économisent parfois de nouvelles machines, je me fais taper quand j&#8217;en demande des nouveaux :D</li>
</ul>
<h2>Optimisations</h2>
<p>Comme le disque SSD est déjà pas mal occupé à traiter les requêtes SQL, la copie des résultats de SELECT sur les bases temporaires dans <span class="code">/tmp</span> (configuration par défaut) est fortement ralentie. En parallèle la RAM n&#8217;est en général pas utilisée à fond. Il est donc judicieux d&#8217;utiliser la RAM restante comme espace pour les fichiers temporaires, grâce au système de fichier <em>tmpfs</em> :</p>
<pre class="brush: bash;">mkdir /tmpfs
mount tmpfs /tmpfs -t tmpfs</pre>
<p>Vérifiez que votre nouveau répertoire fonctionne correctement, puis modifiez la configuration de votre <span class="code">my.cnf</span> pour la valeur suivante :</p>
<pre class="brush: plain;">tmpdir = /tmpfs</pre>
<p>Ne pas oublier de rajouter le montage du tmpfs dans votre <span class="code">/etc/fstab</span>, pour éviter les problèmes au reboot :)</p>
<p>Avec tout ceci, nous arrivons à traiter <em>vaguement</em> ces quelques données :</p>
<ul>
<li>2 millions d&#8217;anecdotes, 8000 nouvelles par jour</li>
<li>1,7 million de commentaires, 5000 nouveaux par jour</li>
<li><strong>630 millions de votes</strong>, 850 000 nouveaux par jour</li>
</ul>
<p>Voilà mes petits pandas, je pense avoir couvert pas mal des aspects principaux &laquo;&nbsp;caractéristiques&nbsp;&raquo; de l&#8217;infrastructure au niveau de MySQL. Mais j&#8217;ai sûrement oublié beaucoup de choses, alors n&#8217;hésitez pas si vous avez des questions.</p>
<p>Pas de date pour le prochain article mais j&#8217;espère la semaine prochaine.</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/03/linfrastructure-vdm-mysql/feed/</wfw:commentRss>
		<slash:comments>83</slash:comments>
		</item>
		<item>
		<title>Votre fond d&#8217;écran iPhone avec Wlppr</title>
		<link>http://maxime.sh/2010/02/votre-fond-decran-iphone-avec-wlppr/</link>
		<comments>http://maxime.sh/2010/02/votre-fond-decran-iphone-avec-wlppr/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 15:31:58 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2332</guid>
		<description><![CDATA[Je vous ai déjà parlé il y a quelques semaines de mon site Wlppr, qui existe depuis plus d&#8217;un an et demi maintenant, via un tutorial pour avoir son fond d&#8217;écran mis à jour quotidiennement sur votre Mac. Aujourd&#8217;hui mes petits pandas, je vous reparle de Wlppr, mais cette fois-ci pour une annonce un peu [...]]]></description>
			<content:encoded><![CDATA[<p>Je vous ai déjà parlé il y a quelques semaines de mon site Wlppr, qui existe depuis plus d&#8217;un an et demi maintenant, via un <a href="http://maxime.sh/2010/01/un-fond-decran-par-jour-avec-wlppr/" target="_blank">tutorial</a> pour avoir son fond d&#8217;écran mis à jour quotidiennement sur votre Mac.</p>
<p>Aujourd&#8217;hui mes petits pandas, je vous reparle de Wlppr, mais cette fois-ci pour une annonce un peu plus spéciale, puisque c&#8217;est la <strong>version iPhone</strong> qui vient d&#8217;atterrir sur l&#8217;AppStore il y a quelques minutes, la première application iPhone réalisée par les petites mains de votre serviteur.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/02/IMG_0501.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/02/IMG_0501-iphone.png" alt="IMG_0501.PNG" border="0" /></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://maxime.sh/wp-content/uploads/2010/02/IMG_0504.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/02/IMG_0504-iphone.png" alt="IMG_0504.PNG" border="0" /></a></p>
<p>Wlppr est une application iPhone basée sur Wlppr.com, qui fournit chaque jour de nouveaux fonds d&#8217;écran adaptés au format iPhone.</p>
<ul>
<li><strong>Notifications Push</strong> : Soyez averti chaque jour, dès qu&#8217;un nouveau fond est arrivé, et sauvez le directement sur votre téléphone.</li>
<li><strong>Catégories &#038; Favoris</strong> : Fonctions exclusives de cette version iPhone. Sauvez tous vos fonds d&#8217;écran favoris, et envoyez-les à vos amis.</li>
</ul>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/02/IMG_0502.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/02/IMG_0502-iphone.png" alt="IMG_0502.PNG" border="0" /></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://maxime.sh/wp-content/uploads/2010/02/IMG_0503.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/02/IMG_0503-iphone.png" alt="IMG_0503.PNG" border="0" /></a></p>
<p>Je me suis amusé à découvrir l&#8217;univers des applications iPhone, pouvoir contrôler des éléments natifs c&#8217;est quand même bien plus agréable que se faire chier à rejouer les mouvements sur son site mobile avec des JavaScript&#8230; même si pour cela j&#8217;ai dû retrouver les &laquo;&nbsp;joies&nbsp;&raquo; de la compilation.</p>
<p>Il n&#8217;y a aucune publicité dedans, elle coûte 0,79 euros et est disponible dès maintenant en cliquant sur le lien ci-dessous :)</p>
<p class="image"><a href="http://itunes.apple.com/us/app/wlppr/id354145355?mt=8" target="_blank"><img src="http://wlppr.com/images/appstore.png" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/02/votre-fond-decran-iphone-avec-wlppr/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>HipHop : L&#8217;histoire d&#8217;un mal nécessaire</title>
		<link>http://maxime.sh/2010/02/hiphop-lhistoire-dun-mal-necessaire/</link>
		<comments>http://maxime.sh/2010/02/hiphop-lhistoire-dun-mal-necessaire/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 08:03:00 +0000</pubDate>
		<dc:creator>Maxime</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://maxime.sh/?p=2122</guid>
		<description><![CDATA[Il y a quelques heures a eu lieu une conférence Facebook très attendue par la communauté de développeurs Web tels que votre serviteur. Facebook a annoncé un projet sur lequel 6 personnes travaillent en secret depuis deux ans. Cela s&#8217;appelle HipHop for PHP, et c&#8217;est un projet open-source visant à transformer du langage PHP en [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a quelques heures a eu lieu une conférence Facebook très attendue par la communauté de développeurs Web tels que votre serviteur. Facebook <a href="http://www.ustream.tv/recorded/4409735" target="_blank">a annoncé</a> un projet sur lequel 6 personnes travaillent en secret depuis deux ans. Cela s&#8217;appelle <a href="http://developers.facebook.com/hiphop-php/" target="_blank">HipHop for PHP</a>, et c&#8217;est un projet open-source visant à transformer du langage PHP en langage C++, afin de le compiler pour atteindre un niveau plus bas dans l&#8217;interprétation et accélérer le calcul de ses nombreuses pages dynamiques.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/02/HipHop_logo_white.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/02/HipHop_logo_white.png" alt="HipHop_logo_white.png" border="0" /></a></p>
<p>C&#8217;est un travail gigantesque qui a été accompli par cette équipe de Facebook. Même si dans l&#8217;absolu peu de gens en auront réellement besoin pour leurs sites PHP ; la plupart du temps l&#8217;exécution des scripts en eux-même est assez rapide depuis PHP 4 et son Zend Engine. Même pour WordPress, ce qui ralentit l&#8217;affichage relève en général des requêtes à la base de données ou du serveur Web (HipHop n&#8217;utilise pas Apache, Facebook l&#8217;utilisait auparavant), puisque très peu de sites peuvent se targuer d&#8217;avoir comme Facebook des pages qui sont uniques pour <em>chaque utilisateur</em>.</p>
<p>Un autre indicateur qui montre que le développeur PHP lambda n&#8217;utilisera jamais HipHop réside dans son incompréhension complète de l&#8217;utilité voire même de la définition d&#8217;HipHop en elle-même&#8230; Morceaux choisis, pour le fun :</p>
<blockquote class="quote"><p>&laquo;&nbsp;I think the HipHop compiler should be great for WordPress users.&nbsp;&raquo; &mdash; <a href="http://twitter.com/patrickmusgrave" target="_blank">Patrick Musgrave</a></p>
</blockquote>
<p>Le script WordPress en lui-même utilise beaucoup la fonction eval(), qui a été explicitement sacrifiée par HipHop. Impossible donc.</p>
<blockquote class="quote"><p>&laquo;&nbsp;il semblerait que Facebook se soit amusé à reécrire tout ou une bonne partie de PHP. [...] un compilateur de PHP ne serait pas une idée si farfelue que ça…&nbsp;&raquo; &mdash; <a href="http://www.korben.info/facebook-va-probablement-sortir-un-compilateur-php.html" target="_blank">Korben.info</a></p>
</blockquote>
<p>Deux billets associant &laquo;&nbsp;Facebook&nbsp;&raquo; avec le terme &laquo;&nbsp;compilateur PHP&nbsp;&raquo;. Cela n&#8217;a rien d&#8217;un compilateur PHP, il en existe déjà plusieurs depuis des années, le plus connu étant <a href="http://www.phpcompiler.org/" target="_blank">phc</a>. C&#8217;est dommage qu&#8217;un blog qui se veut vulgarisateur emploie des termes erronés à longueur de journée.</p>
<blockquote class="quote"><p>&laquo;&nbsp;@Korben: hum, je me disais surtout que vu que Java est plus proche de C++ que Php, pourquoi il n’ont pas écrit Facebook en Java directement. Enfin je me trompe peut-être.&nbsp;&raquo; &mdash; <a href="http://www.tux-planet.fr/" target="_blank">Tux-planet</a></p>
</blockquote>
<p>Tu te trompes effectivement. En réfléchissant une minute il paraît évident que Facebook ne peut se permettre de re-coder tout son site, d&#8217;autant qu&#8217;un bon développeur Java se trouve plus difficilement qu&#8217;un bon développeur PHP.</p>
<p class="image border"><a href="http://maxime.sh/wp-content/uploads/2010/02/08_05_php_vikinger_elephpant.jpg" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/02/08_05_php_vikinger_elephpant-500.jpg" alt="08_05_php_vikinger_elephpant.jpg" border="0" /></a><br /><em>Pour ceux qui se posent la question : Oui j&#8217;en ai un chez moi &lt;3</em></p>
<blockquote class="quote"><p>&laquo;&nbsp;mais si on code avec un framework genre cakePHP, est-ce que l’on va pouvoir quand même le compiler ?&nbsp;&raquo; &mdash; crevette d&#8217;@cier</p>
</blockquote>
<p>Faux problème : Avant d&#8217;en arriver au stade d&#8217;avoir besoin de compiler du PHP transformé en C++, il faudrait déjà penser à s&#8217;affranchir de son framework qui ne peut que ralentir l&#8217;exécution de son site.</p>
<blockquote class="quote"><p>&laquo;&nbsp;There’s this distinction in coding between a scripted language and a compiled language. PHP is an example of a scripted language. The computer or browser reads the program like a script, from top to bottom, and executes it in that order: anything you declare at the bottom cannot be referenced at the top.&nbsp;&raquo; &mdash; <a href="http://therumpus.net/2010/01/conversations-about-the-internet-5-anonymous-facebook-employee/?full=yes" target="_blank">Une employée de Facebook</a></p>
</blockquote>
<p>Je ne sais pas où l&#8217;auteur a récupéré cette employée de Facebook, mais je parie qu&#8217;elle s&#8217;occupe de la cantine, de la salle Guitar Hero, ou alors du ménage ; en tout cas elle ne peut pas avoir un lien avec les développeurs pour déclarer que PHP est un langage one-pass. Qu&#8217;elle demande à ses collègues, ou qu&#8217;elle se taise !</p>
<blockquote class="quote"><p>&laquo;&nbsp;Cela me parait étonnant tout de meme, je vois mal des .exe tourné pour une site web, http://truk.com/hu.exe?var=prout ??? loool&nbsp;&raquo; &mdash; krg</p>
</blockquote>
<p>J&#8217;ai gardé le meilleur pour la fin&#8230; :) Ça se passe de commentaire. A noter que deux lignes plus loin, krg nous dit qu&#8217;il est un hacker. Au moins il ne se fera pas bloquer chez Korben.</p>
<p>Pour en revenir au titre de cet article, les gens qui me connaissent un petit peu savent que je n&#8217;ai pas Facebook en particulière adoration, je pense même que plus ça va et plus ça se transforme en un Skyblog mondialisé. Mais tout comme Facebook, Skyblog participe <em>activement</em> à la communauté open-source. Si leurs projets ne sont pas mis en avant de la même manière médiatique, Frank Denis fournit un <a href="http://www.pureftpd.org/project/pure-ftpd" target="_blank">travail remarquable</a> pour la communauté PHP et open-source depuis des années.</p>
<p class="image"><a href="http://maxime.sh/wp-content/uploads/2010/02/pure-ftpd.png" target="_blank"><img src="http://maxime.sh/wp-content/uploads/2010/02/pure-ftpd.png" alt="pure-ftpd.png" border="0" /></a></p>
<p>Evidemment, tout comme HipHop, dans l&#8217;absolu ça ne servira qu&#8217;à peu de gens, mais allez dire à un administrateur système que sans Skyblog, son serveur FTP n&#8217;existerait pas, et qu&#8217;il aurait sûrement plus de mal à faire <a href="http://skycache.pureftpd.org/project/skycache" target="_blank">du cache Web</a> efficace, et il va vous rire au nez :) Et peut-être vous frapper. Donc ne le faites pas.</p>
<p>HipHop for PHP sera disponible <a href="http://github.com/facebook/hiphop-php" target="_blank">sur GitHub</a> dans les heures qui viennent.</p>
]]></content:encoded>
			<wfw:commentRss>http://maxime.sh/2010/02/hiphop-lhistoire-dun-mal-necessaire/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>
