<?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>Geekfault &#187; web</title>
	<atom:link href="http://geekfault.org/tag/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://geekfault.org</link>
	<description>If it doesn&#039;t segfault, you&#039;re doing it wrong.</description>
	<lastBuildDate>Sun, 16 Oct 2011 00:54:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Les autres nouveautés de l&#8217;HTML 5</title>
		<link>http://geekfault.org/2010/04/12/les-autres-nouveautes-de-html-5/</link>
		<comments>http://geekfault.org/2010/04/12/les-autres-nouveautes-de-html-5/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 23:14:32 +0000</pubDate>
		<dc:creator>Tito</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2951</guid>
		<description><![CDATA[Quand on parle de la dernière version de l&#8217;HTML introduite par le W3C, beaucoup le résument à l&#8217;élément &#60;video&#62;. Pourtant, le W3C a introduit de nombreux autres balises, attributs et API pour mieux coller au web d&#8217;aujourd&#8217;hui, ainsi que des innovations qui vont permettre de rattraper l&#8217;écart entre les applications natives et les WebApps tout [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/26/plowshare-megaupload-rapidshare-en-cli/' rel='bookmark' title='Plowshare : MegaUpload, RapidShare et autres en CLI'>Plowshare : MegaUpload, RapidShare et autres en CLI</a></li>
<li><a href='http://geekfault.org/2009/04/18/nouveautes-sur-geekfault/' rel='bookmark' title='Nouveautés sur Geekfault'>Nouveautés sur Geekfault</a></li>
<li><a href='http://geekfault.org/2010/08/12/ifconfig-me-connaitre-son-ip-publique-en-un-rien-de-temps/' rel='bookmark' title='Ifconfig.me, connaitre son IP publique en un rien de temps'>Ifconfig.me, connaitre son IP publique en un rien de temps</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/html5.jpg" alt="" title="html5" width="225" height="222" class="alignleft size-full wp-image-3205" />Quand on parle de la dernière version de l&#8217;HTML introduite par le W3C, beaucoup le résument à l&#8217;élément <span style="font-family: monospace;"><strong>&lt;video&gt;</strong></span>. Pourtant, le W3C a introduit de <strong>nombreux autres balises, attributs et API</strong> pour mieux coller au web d&#8217;aujourd&#8217;hui, ainsi que des innovations qui vont permettre de rattraper l&#8217;écart entre les applications natives et les <strong>WebApps</strong> tout en rendant le web plus <strong>accessible</strong>.<br />
<!--more--></p>
<h3>Allez, les balises audio et video</h3>
<p>D&#8217;accord, on en a assez parlé, mais ça constitue une bonne introduction à cet article <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Parmi les nombreuses innovations de l&#8217;HTML 5 qui vont permettre au web de <strong>se séparer d&#8217;Adobe Flash Player</strong> (vous savez, cette extension qui fait planter tous les navigateurs et bouffe <em>au moins</em> un des cores de votre CPU), les tags <span style="font-family: monospace;"><strong>&lt;audio&gt;</strong></span> et <span style="font-family: monospace;"><strong>&lt;video&gt;</strong></span> sont les plus connus. Insérer une vidéo dans un article est maintenant devenu aussi simple qu&#8217;y insérer une image :<br />
<code lang="html"><video width="480" height="360" src="jaimeLesFrites.ogv"><br />
Mais quelle saloperIE, ton navigateur ne supporte pas les vidéos HTML 5 <img src='http://geekfault.org/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
</video></code><script type="text/javascript"><!--
cancel=false;
function autoriseRestore() {
    cancel=false;
}
function maximizeVideo() {
    cancel=true;
    video=document.getElementById('tbbt');
    video.height=270;
    video.width=480;
    setTimeout('autoriseRestore()', 500);
}
function restoreVideo() {
    if(cancel) { return; }
    video=document.getElementById('tbbt');
    video.height=135;
    video.width=240;
}
--></script><video id="tbbt" width="240" height="135" controls style="float: right; margin: 0 0 4px 4px;" onmouseover="maximizeVideo()" onmouseout="setTimeout('restoreVideo()',500);"><source src="http://geekfault.org/wp-content/uploads/2010/04/TBBT.ogg" type='video/ogg; codecs="theora, vorbis"'>  <source src="http://geekfault.org/wp-content/uploads/2010/04/TBBT.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>Mais installe un vrai navigateur rooooh! <a href="http://getfirefox.com">Get Firefox!</a></video>Remarquez la rétro-compatibilité avec les navigateurs HTML4 : puisqu&#8217;ils ne vont pas interpréter ce tag, ils afficheront un gentil petit mot. Pensez éventuellement à y mettre un lien vers http://getFirefox.com ^_^ .</p>
<p>Bien sûr ces balises ont des attributs et une API qui leur sont propre, mais ce n&#8217;est pas le sujet de l&#8217;article.</p>
<h4>La limitation du codec</h4>
<p>La grosse limitation pour ces attributs est <strong>l&#8217;implémentation des codecs</strong>. Les principaux navigateurs libres n&#8217;implémentent que des codecs libres (<strong>Ogg Theora+Vorbis</strong>) mais par exemple Safari ou même Android n&#8217;implémentent que le h264. <strong>La W3C ne résoud pas ce problème</strong>, ce serait comme imposer le PNG dans les éléments <span style="font-family: monospace;">&lt;img&gt;</span> alors que le JPEG (propriétaire) est largement répandu.</p>
<p>Sa solution est donc de fournir les vidéos dans les deux formats, pour que tous les navigateurs compatibles HTML 5 puissent les décoder:<br />
<code lang="html"><video width="320" height="240"><br />
  <source src="Bravo.ogv" type='video/ogg; codecs="theora, vorbis"'><br />
  <source src="GrosVilain.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'><br />
</video></code></p>
<p>Malheureusement la plupart des éditeurs vont privilégier un seul format, que ce soit par idéologie ou par contraintes techniques (temps de conversion, espace de stockage). Déjà aujourd&#8217;hui <strong>YouTube</strong>, dans sa beta HTML 5, ne diffuse ses vidéos que en <strong>h264</strong>, ce qui le rend incompatible avec, entre autres, Firefox.</p>
<h3>La balise canvas</h3>
<p>Un <span style="font-family: monospace;">canvas</span> n&#8217;est pas un dessin à proprement parler mais une zone possédant une API complète pour dessiner des formes en 2D grâce à un JavaScript. Rien de mieux qu&#8217;un petit exemple je pense :<br />
<code lang="javascript"><br />
<canvas id="myCanvas" width="300" height="150"><br />
Votre navigateur n'est pas compatible<br />
</canvas></code><br />
<canvas id="canvas1" width="150" height="120" style="float: right; margin: 0 0 5px 5px;">Votre navigateur n&#8217;est pas compatible</canvas>Et si vous avez un navigateur compatible, vous devriez voir le résultat ci-contre.</p>
<p>L&#8217;API permet de tracer des <strong>rectangles</strong>, des <strong>ronds</strong>, des <strong>traits</strong>, des <strong>pixels</strong> et même d&#8217;insérer des <strong>images</strong> ou du <strong>texte</strong>. On peut aussi jouer avec des <strong>ombres</strong>, des <strong>flous</strong> ou des <strong>dégradés</strong> de couleurs. Très pratique pour faire des manipulations de style sur un texte par exemple :<br />
<script type="text/javascript"><!--
window.addEventListener('load', function () {
  var elem = document.getElementById('canvas2');
  if (!elem || !elem.getContext) { return; }
  var context = elem.getContext('2d');
  if (!context) { return; }
  var color, hue = [
    [255,   0,   0 ], // 0, Red,       0°
    [255, 255,   0 ], // 1, Yellow,   60°
    [  0, 255,   0 ], // 2, Green,   120°
    [  0, 255, 255 ], // 3, Cyan,    180°
    [  0,   0, 255 ], // 4, Blue,    240°
    [255,   0, 255 ], // 5, Magenta, 300°
    [255,   0,   0]], // 6, Red,     360°
    gradient = context.createLinearGradient(0, 0, elem.width, 0);
    for (var i = 0; i <= 6; i++) {
      color = 'rgb(' + hue[i][0] + ', ' + hue[i][1] + ', ' + hue[i][2] + ')';
      gradient.addColorStop(i * 1/6, color);
    }
    context.fillStyle = gradient;
    context.shadowOffsetX = 5;
    context.shadowOffsetY = 5;
    context.shadowBlur    = 4;
    context.shadowColor   = 'rgba(0, 0, 0, 0.5)';
    context.font = 'bold 36px sans-serif';
    context.textBaseline = 'top';
    if (context.fillText) { context.fillText('Ceci n\'est pas une image', 0, 0, 500); }
    context.strokeStyle = '#666';
    if (context.strokeText) { context.strokeText('Ceci n\'est pas une image', 0, 0, 500); }
}, false);
    // --></script><canvas id="canvas2" width="500" height="50">Votre navigateur n&#8217;est pas compatible</canvas><br />
Pour être exact c&#8217;est une image, mais elle a été générée par votre navigateur (comment ça c&#8217;est moche? xD)</p>
<p>Et puis comme c&#8217;est basé sur le JavaScript, l&#8217;image générée peut être entièrement <strong>dynamique</strong> comme ce <a href="http://www.benjoffe.com/code/demos/interpolate/">plotter dynamique</a> ou le <a href="http://www.benjoffe.com/code/demos/canvascape/textures">très impressionnant 3D Walker</a>.</p>
<p><!--pagetitle:Remplacer Adobe Flash Player--><!--nextpage--><!--pagetitle:De la WebApp à l'application Native--></p>
<h3>Standardisation de Google Gears</h3>
<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/Google-Gears.gif" alt="" title="Google-Gears" width="153" height="43" class="alignleft size-full wp-image-3180" />Le HTML 5 a intégré en standard de nombreuses nouveautés introduites par <strong>Google Gears</strong> :</p>
<ul>
<li>Mettre en cache des pages et scripts pour un <strong>accès hors-ligne</strong></li>
<li><strong>Stocker localement des données</strong></li>
<li>Faire tourner les <strong>scripts en arrière-plan</strong></li>
<li>Laisser les applications <strong>interagir</strong> naturellement avec votre environnement</li>
</ul>
<p>Ces fonctionnalités étaient les prémices du rapprochement les applications natives et les <strong>WebApps</strong>. On aime ou on aime pas, mais la standardisation du W3C permettra d&#8217;accélérer ce phénomène proche du <strong>Cloud Computing</strong>.</p>
<h3>Accès hors-ligne</h3>
<p><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2010/04/Offline.png" alt="" title="Offline" width="120" height="120" class="alignright size-full wp-image-3207" />En HTML 5 il est très aisé de forcer un navigateur à garder des données en cache et ainsi permettre au visiteur de revoir cette page même s&#8217;il n&#8217;a plus de connexion. Il suffit de créer un <strong>fichier manifeste</strong> page.manifest listant les fichiers et scripts à garder en cache :<br />
<code>CACHE MANIFEST<br />
CACHE:<br />
page.htm<br />
style.css<br />
image.jpg<br />
script.js</code></p>
<p>Ensuite il suffit de rajouter l&#8217;attribut au tag HTML :<br />
<code lang="html"><html manifest="page.manifest"></code><br />
Et voilà, <span style="font-family: monospace;">page.htm, style.css, image.jpg et script.js</span> seront accessibles même hors ligne!</p>
<h3>Base de donnée locale</h3>
<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/Database.jpg" alt="" title="Database" width="134" height="134" class="alignleft size-full wp-image-3208" />Le HTML 5 définit une nouvelle API JavaScript <span style="font-family: monospace;"><strong>window.localStorage</strong></span> qui permet de stocker des données dans la mémoire du navigateur. Ses deux principales méthodes sont très simples:<br />
<code lang="javascript">window.localStorage.setItem(key, value);<br />
window.localStorage.getItem(key);</code><br />
Le <span style="font-family: monospace;">localStorage</span> est lié à un nom de domaine et les données stockées le restent <strong>même si l&#8217;utilisateur quitte son navigateur</strong> et revient plus tard. Si vos données n&#8217;ont pas besoin d&#8217;une telle persistance, vous pouvez aussi profiter de l&#8217;API <span style="font-family: monospace;"><strong>sessionStorage</strong></span> qui, comme vous l&#8217;aurez compris, permet de stocker des informations tant que l&#8217;utilisateur n&#8217;a pas quitté le site.</p>
<p>La plupart des navigateurs permettent à chaque <a href="http://fr.wikipedia.org/wiki/Domaine_de_deuxi%C3%A8me_niveau">domaine de deuxième niveau</a> de stocker 10Mo, mais le W3C recommande de demander l&#8217;autorisation de l&#8217;utilisateur si l&#8217;application a besoin de plus de place.</p>
<p>Attention, même s&#8217;ils se ressemblent, le Storage et les <strong>cookies</strong> n&#8217;ont pas la même utilité : n&#8217;oubliez pas que les cookies sont envoyés vers le serveur <strong>à chaque requête</strong>, ce qui pourrait rendre le trafic trop important si vous stockez de nombreuses données. À l&#8217;opposé, les données du Storage restent en local, accessibles via JavaScript.</p>
<p>Finalement, pour faire du vrai traitement de <strong>bases de données</strong>, il suffit de combiner le <span style="font-family: monospace;">localStorage</span> avec un <a href="http://www.json.org/jsonfr.html"><span style="font-family: monospace;"><strong>JSON</strong></span></a> ou implémenter votre propre version de l&#8217;interface <span style="font-family: monospace;">Database</span> standardisée par le W3C.</p>
<h3>Scripts en tâche de fond</h3>
<p>Lorsqu&#8217;il exécute une opération très lourde, un JavaScript <strong>immobilise</strong> toute la page web. Parfois même l&#8217;interface du navigateur ne répond plus tant que le script n&#8217;a pas terminé. Heureusement en HTML 5, l&#8217;API <span style="font-family: monospace;"><strong>Worker</strong></span> permet de profiter de faire tourner de tels scripts en <strong>tâche de fond</strong>.<br />
<code lang="javascript">var worker = new Worker("worker.js");<br />
worker.postMessage(0); /* Lance le Woker avec le paramètre 0 */<br />
worker.onmessage = function (evt) { /* Action lorsque le Worker a fini */<br />
    alert(evt.data);<br />
};</code></p>
<p>Et le <span style="font-family: monospace;">worker.js</span> :<br />
<code lang="javascript">onmessage = function (evt) {<br />
    // evt.data est le paramètre 0<br />
    for (var i=evt.data, il=1000001; i<il; i++) {<br />
        postMessage(i);<br />
    };<br />
};</code><br />
Ce code va nécessiter pas mal de travail au cours de ses 1 000 000 itérations mais ne devrait pas immobiliser le navigateur.</p>
<h3>Remplacer une application desktop</h3>
<p>Finalement, les WebApps peuvent s'enregistrer elles-même pour <strong>gérer les liens vers un certain protocole ou un certain type de fichiers</strong>. On peut ainsi imaginer un client IRC en ligne qui reconnait les liens <span style="font-family: monospace;">irc://</span> ou un éditeur de documents qui ouvre un nouvel onglet plutôt qu'OpenOffice lorsqu'il y a un lien vers un .odt :<br />
<code lang="javascript">navigator.registerProtocolHandler("irc",<br />
                                  "https://www.example.com/?uri=%s",<br />
                                  "Client IRC en ligne");<br />
navigator.registerContentHandler("application/vnd.oasis.opendocument.text",<br />
                                 "http://www.example.com/?uri=%s",<br />
                                 "Lecteur de documents en ligne");</code><br />
Malheureusement, pour des raisons de <strong>sécurité</strong>, un site ne peut s'enregistrer que pour ses propres liens : si vous tombez sur un lien <span style="font-family: monospace;">irc://</span> sur <span style="font-family: monospace;">Geekfault.org</span> vous ne serez pas redirigé vers <span style="font-family: monospace;">example.com</span>.<br />
<!--nextpage--><!--pagetitle:Mais encore...--></p>
<h3>Géolocalisation</h3>
<p>Très intéressant sur le web qui devient de plus en plus <strong>mobile</strong> aujourd'hui, l'HTML 5 intègre une API qui permet d'aisément obtenir les coordonnées géographiques du visisteur :<br />
<code lang="javascript"></code></p>
<p>Normalement le navigateur demande à l'utilisateur l'<strong>autorisation</strong> d'envoyer sa position. Sur un iPhone par exemple, elle sera calculée grâce à la puce GPS. Sur un navigateur desktop, la méthode est variable (triangulation WiFi, puce GPS, services de localisation d'IP ou simplement demander l'adresse de l'utilisateur). </p>
<div style="text-align: center;"><br />
<input type="button" value="Hahaaaa, essaye de me géolocaliser pour voir..." onclick="locateMe()" /></div>
<h3>ContentEditable</h3>
<p contenteditable="true"><em>(Attention, paragraphe très... personnel ^^)</em> Alors là je suis fan de cette fonctionnalité : elle permet de <strong>rendre n'importe quelle partie d'une page éditable</strong>. On voyait ça apparaître de plus en plus dans les applications en ligne, et maintenant c'est standardisé et extrêmement facile à mettre en place. La preuve? <strong>Essayez de cliquer sur ce paragraphe !</strong></p>
<p>Et en plus c'est du <a href="http://fr.wikipedia.org/wiki/WYSIWYG">WYSIWYG</a> ! Essayez <strong>Ctrl+B</strong> ou <em>Ctrl+I</em> (sous Chromium) ! Et voilà le code source qui m'a permis de faire ça :<br />
<code lang="html">
<p contenteditable="true">Owi, édite-moi</p>
<p></code><br />
Je vois déjà toutes les possibilités ouvertes par une fonctionnalité si simple à mettre en place, comme par exemple corriger une erreur dans nos articles ou modifier une page de WikiPédia en deux clics.</p>
<h3>Nouveaux inputs</h3>
<p>Essentiellement dans le soucis de rendre le web encore plus <strong>accessible</strong> (aux handicapés) et aux système d'<strong>auto-remplissage</strong>, le HTML 5 intègre une dizaine de nouveaux types d'inputs textuels : <span style="font-family: monospace; font-weight: bold;">tel, search, url, email, datetime, date, month, week, time, datetime-local, number et color</span>. Les navigateurs sont supposés proposer une interface à l'utilisateur comme par exemple un calendrier pour remplir un datetime, mais ni Chromium ni Firefox ne semble s'y conformer pour l'instant.</p>
<p>On remarque aussi l'apparition de l'input <span style="font-family: monospace; font-weight: bold;">range</span> qui vient combler une déficience qui forçait souvent à avoir recours à une librairie JavaScript.</p>
<input type="range" style="width: 100%;" min="0" max="50" />
<code lang="html"><br />
<input type="range" style="width: 100%;" min="0" max="50" /></code></p>
<h3>Autres nouvelles balises</h3>
<p>Le W3C introduit dans l'HTML 5 de nombreuses nouvelles balises, dont voici la liste exhaustive</p>
<ul>
<li><span style="font-family: monospace; font-weight: bold;">section, article, aside, hgroup, header, footer, nav</span> encadrent les principaux contenus d'une page web typique. On abandonne ainsi l'utilisation constante de, par exemple, <span style="font-family: monospace;">&lt;div id="header"&gt;</span></li>
<li><span style="font-family: monospace; font-weight: bold;">figure</span> et son sous-élément <span style="font-family: monospace; font-weight: bold;">figcaption</span> permettent de lier une légende à une image ou une vidéo</li>
<li><span style="font-family: monospace; font-weight: bold;">embed</span> a pour but de remplacer <span style="font-family: monospace;">object</span> lors de l'insertion de Flash ou de Java (dans les rares cas où ce sera nécessaire)</li>
<li><span style="font-family: monospace; font-weight: bold;">mark</span> encadre un mot ou un texte important pour, par exemple, le surligner en CSS</li>
<li><span style="font-family: monospace; font-weight: bold;">progress</span> est l'élément à privilégier si vous affichez la progression d'une tâche</li>
<li><span style="font-family: monospace; font-weight: bold;">meter</span> représente une mesure telle que l'utilisation du disque</li>
<li><span style="font-family: monospace; font-weight: bold;">time</span> représente une date et/ou une heure</li>
<li><span style="font-family: monospace; font-weight: bold;">ruby, rt, rp</span> permet d'intégrer des annotations ruby (WTF?)</li>
<li><span style="font-family: monospace; font-weight: bold;">command</span> représente une commande que l'utilisateur peut invoquer</li>
<li><span style="font-family: monospace; font-weight: bold;">details</span> encadre un complément d'information ou des contrôles supplémentaires que l'utilisateur peut obtenir sur demande</li>
<li><span style="font-family: monospace; font-weight: bold;">keygen</span> permet de fournir une clé de contrôle pour la vérification de la validité des données</li>
<li><span style="font-family: monospace; font-weight: bold;">output</span> encadre une zone où un script affichera son résultat</li>
</ul>
<p>La plupart de ces nouveaux éléments sont liés à l'accessibilité mais peuvent aussi présenter un avantage de lors de la création de scripts complexes.</p>
<h3>Et nouveaux attributs</h3>
<p>Je vouais ai déjà parlé de <span style="font-style: monospace;">contentEditable</span> mais il y a beaucoup d'autres nouveaux attributs standards en HTML 5.</p>
<ul>
<li><span style="font-family: monospace; font-weight: bold;">contextmenu</span> permet de lier un menu au clic droit sur un élément</li>
<li><span style="font-family: monospace; font-weight: bold;">draggable</span> détermine si un élément peut être soumis au drag &#038; drop. Cette fonctionnalité est malheureusement soumise à controverse à cause de sa complexité, c'est pourquoi je ne l'ai pas abordé dans l'article.</li>
<li><span style="font-family: monospace; font-weight: bold;">hidden</span> est un boléen qui remplace sa fonction homonyme en style ou CSS. L'intérêt? Cacher les éléments même dans les navigateurs pour malvoyants qui n'interprètent pas les styles.</li>
<li><span style="font-family: monospace; font-weight: bold;">item</span> et <span style="font-family: monospace; font-weight: bold;">itemprop</span> et <span style="font-family: monospace; font-weight: bold;">subject</span> permettent de regrouper des éléments</li>
<li><span style="font-family: monospace; font-weight: bold;">spellcheck</span> est un boléen qui spécifie si la correction orthographique mérite d'être activée sur un élément</li>
</ul>
<p>Finalement, vous pouvez lier n'importe quel attribut personnalisé (ce qui peut être pratique pour certains scripts) sans contredire les standards du W3C (et donc passer les tests des validateurs) à condition que cet attribut commence par <span style="font-family: monospace; font-weight: bold;">data-</span>.</p>
<p><!--nextpage--><!--pagetitle:Conclusion--></p>
<h3>Conclusion</h3>
<p>Avec ce nouveau standard encore à l'état de brouillon, le W3C réduit la nécessité des applets (Flash, Java) et rend le web plus accessible tout en permettant aux applications web (WebApps) d'être plus puissantes, plus faciles à coder et de vraies alternatives aux applications natives de votre ordinateur.</p>
<p>Si toutes les recommandations ne sont pas encore adoptées par les navigateurs, même ceux en avance sur les normes, les possibilités actuelles sont déjà très intéressantes et à prendre en compte pour tous vos prochains développements HTML/JavaScript.</p>
<h3>Sources</h3>
<p>Il y a encore quelques autres nouveautés dont je ne vous ai parlé, mais j'espère vous avoir donné un bon aperçu des incroyables innovations de l'HTML 5. Si vous en voulez une liste complète, je vous renvoie au site du W3C, tous les liens sont dans les sources ci-dessous.</p>
<ul>
<li><a href="http://www.w3.org/TR/html5-diff/">Brouillon des différences entre HTML4 et HTML 5 édité par le W3C</a></li>
<li><a href="http://molly.com/html5/html5-0709.html">Comparaison des fonctionnalités HTML 5 supportées par les différents navigateurs</a></li>
<li><a href="http://www.w3schools.com/html5/html5_reference.asp">Référence HTML 5 de la w3schools</a></li>
<li><a href="http://diveintohtml5.org/">Dive into HTML 5</a></li>
<li><a href="http://html5demos.com/">HTML 5 Demos</a></li>
</ul>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/26/plowshare-megaupload-rapidshare-en-cli/' rel='bookmark' title='Plowshare : MegaUpload, RapidShare et autres en CLI'>Plowshare : MegaUpload, RapidShare et autres en CLI</a></li>
<li><a href='http://geekfault.org/2009/04/18/nouveautes-sur-geekfault/' rel='bookmark' title='Nouveautés sur Geekfault'>Nouveautés sur Geekfault</a></li>
<li><a href='http://geekfault.org/2010/08/12/ifconfig-me-connaitre-son-ip-publique-en-un-rien-de-temps/' rel='bookmark' title='Ifconfig.me, connaitre son IP publique en un rien de temps'>Ifconfig.me, connaitre son IP publique en un rien de temps</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/04/12/les-autres-nouveautes-de-html-5/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
<enclosure url="http://geekfault.org/wp-content/uploads/2010/04/TBBT.mp4" length="1885998" type="video/mp4" />
		</item>
		<item>
		<title>nginx et python &#8211; le perfect setup</title>
		<link>http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/</link>
		<comments>http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 11:47:32 +0000</pubDate>
		<dc:creator>pistache</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[gunicorn]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[wsgi]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2272</guid>
		<description><![CDATA[Python est devenu assez à la mode, pour le développement web, ces dernières années avec l&#8217;arrivée de frameworks web comme Django, Pylons et web.py. On le voit souvent utilisé sur apache2, avec mod_python, ou sur des serveurs Python dediés à ça (CherryPy, etc) Je cherche depuis longtemps un moyen de faire du Python sur HTTP. [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2011/03/24/devbox-kvmlibvirt-perfect-setup/' rel='bookmark' title='Devbox KVM+Libvirt perfect setup.'>Devbox KVM+Libvirt perfect setup.</a></li>
<li><a href='http://geekfault.org/2010/04/09/maildir-mbox-la-migration/' rel='bookmark' title='Maildir mbox &#8211; La migration'>Maildir mbox &#8211; La migration</a></li>
<li><a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/' rel='bookmark' title='Filtrer ses mails ! Un cauchemard !'>Filtrer ses mails ! Un cauchemard !</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/nginx_logo/" rel="attachment wp-att-2406"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/03/nginx_logo-300x206.gif" alt="" title="nginx_logo" width="300" height="206" class="alignleft size-medium wp-image-2406" /></a></p>
<p><strong>Python est devenu assez à la mode, pour le développement web, ces dernières années avec l&#8217;arrivée de frameworks web comme </strong><a title="Django" href="http://djangoproject.com/"><strong>Django</strong></a><strong>, </strong><a title="Pylons" href="http://pylonshq.com/"><strong>Pylons</strong></a><strong> et </strong><a title="webpy" href="http://webpy.org"><strong>web.py</strong></a><strong>. On le voit souvent utilisé sur apache2, avec mod_python, ou sur des serveurs Python dediés à ça (CherryPy, etc)</strong></p>
<p>Je cherche depuis longtemps un moyen de faire du Python sur HTTP. J&#8217;ai mis pas mal de temps mais je pense avoir trouvé une configuration sympa.</p>
<p>Je vous propose ici d&#8217;essayer <a title="nginx" href="http://nginx.org/">nginx</a>, un serveur HTTP (entre autres), très performant et  <strong>beaucoup</strong> plus léger/rapide que apache2. Il est très efficace pour faire du reverse-proxy (c&#8217;est à dire être utilisé en frontal/load-balancer devant un serveur HTTP, et lui transmettre les requêtes en faisant du cache et le cas échéant du load-balancing).</p>
<p><!--more--></p>
<p>La configuration de nginx est très simple, et la documentation est très complète : <a href="http://wiki.nginx.org/Main">wiki.nginx.org</a>. L&#8217;installation de nginx est facile, il est inclus dans la plupart des distributions actuelles, donc à vos emerge/apt-get.</p>
<p> <code>apt-get install nginx</code>
<p>nginx ne gère pas le python nativement. Il y a plusieurs solutions cependant :</p>
<ul>
<li>Faire du proxy vers un serveur qui gère le python, comme apache2. On perd la majeure partie de l&#8217;intêret de nginx, cependant.</li>
<li>Faire du FastCGI vers un serveur FastCGI. C&#8217;est la solution la plus fréquente, en utilisant fcgi.py ou <a title="Flup" href="http://trac.saddi.com/flup">flup</a></li>
<li>Faire du WSGI. C&#8217;est un protocole de communication entre serveurs HTTP et applications Python. Solution aussi assez fréquente.</li>
<li>Faire du proxy vers un serveur qui gère le python de manière <strong>native</strong>. C&#8217;est une solution moins fréquente mais très pratique.</li>
</ul>
<p>Avant même de penser à choisir une des solutions ici présentes, il faut les comparer entre elles.</p>
<p><strong><br /> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h4>nginx =&gt; apache2 =&gt; python</h4>
<p>L&#8217;ennui de cette solution c&#8217;est : apache2. Utiliser nginx pour forwarder à apache2 est presque inutile. Presque ? Oui, car on peut dire à nginx de garder les fichiers statiques pour lui. Cependant, le gain de cette méthode est assez minime, et ce n&#8217;est intéressant que pour faire du load balancing sur plusieurs apaches.</p>
<p><strong><br /> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h4>le FastCGI</h4>
<p>FastCGI c&#8217;est une norme, pour faire traiter du contenu dynamique par une application externe. Donc le support du FastCGI tout seul est inutile, il faut aussi quelque chose pour gérer derrière.</p>
<p>J&#8217;ai testé <a href="http://trac.saddi.com/flup">flup</a>, un framework Python léger. Le résultat : ça marche, méééé c&#8217;est lent. Je tournais autour de 35/50 requêtes par seconde, et l&#8217;utilisation en mémoire vive était phénoménale, 150 mégas pour 1000 requêtes. (bien sur ces chiffres n&#8217;auront de valeur que lorsqu&#8217;ils seront comparés aux autres).</p>
<p>FastCGI est sympa pour faire une configuration &#8220;vite&#8221;. C&#8217;est d&#8217;ailleurs la seule solution viable, à ma connaissance pour faire du PHP sur nginx, à part le proxy vers un autre serveur HTTP.</p>
<p>Bref, FastCGI ne m&#8217;a pas convaincu. Et mes tests avec les autres solutions m&#8217;ont donné raison. Toujours avec moi ? On passe au WSGI !</p>
<p><strong><br /> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h4>le WSGI</h4>
<p> <em>WSGI is the Web Server Gateway Interface. It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that). It is a Python standard, described in detail in PEP 333.</em>
<p>le WSGI, c&#8217;est le standard pour le Web Python. Il n&#8217;y a qu&#8217;à consulter <a title="WSGI" href="http://wsgi.org">wsgi.org</a> pour se rendre compte que c&#8217;est tout un monde. Il consiste en un ensemble de normes (nom de variables, par exemple) pour permettre au serveur d&#8217;exécuter  un fichier codé en Python.</p>
<p>Le standard pour le WSGI sur les serveurs HTTP grand public, c&#8217;est le mod_wsgi de apache2. Il a été porté sur nginx, mais c &#8216;est une #@!## infame, qui ne marche que sur les vieilles versions et qui n&#8217;a pas été mise à jour depuis bientôt 2 ans et demi (cf. <a href="http://hg.mperillo.ath.cx/nginx/mod_wsgi/">hg.mperillo.ath.cx/nginx/mod_wsgi/</a>). J&#8217;ai obtenu des performances d&#8217;environ 133 requêtes par seconde avec, ce qui est déjà mieux que FastCGI, pour ceux qui suivent <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Par contre, dès que j&#8217;ai voulu avancer un peu avec (toucher à la configuration, et surtout, passer à une version supérieure de nginx), j&#8217;ai été confronté à ses limites (et aux #@!## de faute de frappe dans le code source)</p>
<p>D&#8217;autant plus que l&#8217;auteur de mod_wsgi pour apache2 et l&#8217;auteur de mod_wsgi pour nginx reconnaissent ses limitations, respectivement <a href="http://blog.dscpl.com.au/2009/05/blocking-requests-and-nginx-version-of.html">ici</a> et <a href="http://blogg.ingspree.net/blog/2007/11/24/nginx-mod-wsgi-vs-fastcgi/">ici</a>. Le premier document est très intéressant pour comprendre un peu l&#8217;architecture de nginx et ses différences avec apache2. En effet, le mod_wsgi pour nginx a été codé à partir de celui pour apache2, et il subit les différences d&#8217;architecture entre apache2 et nginx.</p>
<p>Attention, je ne remet absolument pas à cause le WSGI ici, juste l&#8217;implémentation de mod_wsgi dans nginx.</p>
<p>Parce que justement, un projet super récent, c&#8217;est&#8230;. uWSGI ! uWSGI sert à combler le manque de support du WSGI dans nginx, en rajoutant un module, meilleur que mod_wsgi. Il nécessite donc de recompiler nginx. Il y a encore une autre solution, nommée gunicorn, qui ne nécessite pas de recompiler nginx. C&#8217;est un serveur HTTP minimal qui gère le WSGI nativement. uwsgi offre plus de fonctionalitées que gunicorn, mais gunicorn a l&#8217;air assez dynamique (dans le développement), et est plus facile à utiliser (pas de recompilation, support de Django natif). Au niveau des performances, je me suis amusé à faire cette comparaison :</p>
<p> </p>
<p><div class="wp-caption alignnone" style="width: 434px"><img title="Comparaison des performances entre uwsgi et gunicorn en fonction du niveau de parallélisme" src="http://pistaches.net/~pistache/stuff/patch1.png" alt="Comparaison des performances entre uwsgi et gunicorn en fonction du niveau de parallélisme" width="424" height="313" /><p class="wp-caption-text">Comparaison des performances entre uwsgi et gunicorn en fonction du niveau de parallélisme</p></div>
<p> </p>
<p>On constate plusieurs choses :</p>
<ul>
<li>Les performances augmentent en utilisant 2 workers à la place d&#8217;un, mais au delà, le gain est ridicule, puis inexistant. Le nombre 2 est dépendant du nombre de coeurs de la machine, et le nombre de workers à utiliser ne sera pas le même sous un bi-socket octocore, bien évidemment. Les meilleures performances étaient obtenues en utilisant gunicorn+3workers.</li>
<li>La différence est vraiment minime, gunicorn est en moyenne légèrement au dessus de uwsgi.</li>
<li>Ces tests sont réalisés sur une application <strong>Django</strong>. Les performances augmentent en utilisant des frameworks plus légers comme <strong>web.py</strong>, bien évidemment.</li>
</ul>
<p>uwsgi dispose de plus de fonctionalitées, comme par exemple une interface d&#8217;administration de serveur wsgi dans Django. Je vais ici expliquer l&#8217;installation et la configuration des deux solutions.</p>
<p>Ici je vais couvrir l&#8217;installation et la configuration de uwsgi et gunicorn avec <strong>Django</strong> et <strong>web.py</strong>, même si c&#8217;est bien sur adaptable avec d&#8217;autres frameworks supportant le <strong>wsgi </strong>(liste sur <a href="http://wsgi.org/wsgi/Frameworks">wsgi.org/wsgi/Frameworks</a>).</p>
<h3>Installation et configuration de <strong>uwsgi</strong></h3>
<p><strong><br /> </strong></p>
<h4>Sous Debian :</h4>
<p>1) Rajouter les dépots source, par exemple :</p>
<p> <code>deb-src http://ftp.gr.debian.org/debian/ squeeze main contrib non-free</code>
<p>2) Télécharger la source</p>
<p> <code>apt-get source nginx<br />
tar -zxvf nginx_*.orig.tar.gz<br />
cd nginx-*<br />
tar -zxvf nginx_*.debian.tar.gz</code>
<p>2) Télécharger uwsgi</p>
<p> <code>cd ..</p>
<p>wget http://projects.unbit.it/downloads/uwsgi-0.9.4.2.tar.gz</p>
<p>tar -zxvf uwsgi-0.9.4.2.tar.gz</code>
<p>3) Modifier le paquet source de nginx pour y ajouter uwsgi. Il faut éditer le fichier nginx-*/debian/rules, trouver le bloc qui commence par ./configure et ou se trouvent toutes les options de compilation, et y ajouter</p>
<p> <code>--add-module=$(CURDIR)/../uwsgi-0.9.4.2/nginx/</code>
<p>$(CURDIR)/../uwsgi-0.9.4.2/nginx/ est le chemin vers le dossier du module dans la source de uwsgi</p>
<p>4) maintenant, dans le dossier de la source de nginx, faites (pas besoin de root) :</p>
<p> <code>dpkg-buildpackage</code>
<p>5) installer le .deb généré ainsi (en tant que root maintenant)</p>
<p> <code>dpkg -i ../nginx-*.deb</code>
<p>6) Dernière étape : compiler uWSGI (le binaire en lui-même, qui va communiquer avec nginx par le biais du module)</p>
<p> <code>cd ../uwsgi-0.9.4.2/ &amp;&amp; make &amp;&amp; make install &amp;&amp; cp uwsgi_params /etc/nginx/</code>
<p>Cette dernière commande (le cp uwsgi_params&#8230;) sert à placer un fichier de configuration du module uwsgi exemple dans le repertoire de nginx.</p>
<h4>Sous les autres distributions :</h4>
<p>Il faut télécharger la source de nginx et de uwsgi, compiler nginx avec le module uwsgi (dans le répertoire nginx de la source de uwsgi), puis compiler uwsgi.﻿</p>
<p>On a maintenant un serveur uWSGI et un nginx avec  le module uwsgi. Il va maintenant falloir dire à nginx de transférer les requêtes au serveur uWSGI, avec une commande uwsgi_pass. Par exemple, dans la section server d&#8217;un de vos vhost (/etc/nginx/sites-enabled/default, par exemple, sous Debian) :</p>
<p> <code>location / {<br />
include uwsgi_params;<br />
uwsgi_pass unix:///tmp/uwsgi.sock;<br />
}</code>
<p>Il faut ensuite créer une application WSGI, par exemple, pour le framework web.py :</p>
<p> <code>import web</p>
<p>urls = (<br />
    '/.*', 'hello',<br />
    )</p>
<p>class hello:<br />
    def GET(self):<br />
        return "Hello, world."</p>
<p>application = web.application(urls, globals()).wsgifunc()<br />
applications = {'/': application }</code>
<p>Pour Django :</p>
<p> <code>import django.core.handlers.wsgi<br />
application = django.core.handlers.wsgi.WSGIHandler()<br />
applications = {'/': application }</code>
<p>Nommez ce fichier wsgi.py et placez le dans le repertoire ou vous allez placer votre code (pour Django, dans le repertoire du projet, évidemment).  Si vos nerfs n&#8217;ont pas encore lâché ici, allez prendre une petite pause de 5 minutes à titre préventif, et reprenez.  Maintenant, on va démarrer un serveur uWSGI. Placez vous dans le répertoire de votre fichier wsgi.py, et faites :</p>
<p> <code>uwsgi -s /tmp/uwsgi.sock -C -w wsgi -p2 -L</code>
<p>Explications : le -s indique ou placer le socket (ça pourrait aussi être une adresse au format hôte:port, pour un usage distant). Le -w wsgi indique de charger le fichier wsgi(.py), le -p2 indique de démarrer 2 processus, et le -L désactive l&#8217;envoi des requêtes à stdout (=&gt;flood).</p>
<p>Si vous allez à l&#8217;adresse de votre serveur web, vous devriez voir votre application Python en face de vous ! Vous voilà en train d&#8217;utiliser <strong>nginx+uwsgi+python</strong>.</p>
<p>En annexe, je rappelle que uwsgi est aussi utilisable avec apache et lighttpd.</p>
<p>Aussi, dans le dossier source de uwsgi, vous trouverez des templates pour un module d&#8217;administration de Django, à installer dans le repertoire des templates de l&#8217;administration de Django (si, si).</p>
<h3>Installation et configuration de gunicorn</h3>
<p>gunicorn est <strong>carrèment</strong> plus facile à installer. Il est codé en python, donc pas de compilation, seulement un <strong>easy_install</strong> :</p>
<p> <code>easy_install gunicorn</code>
<p>La configuration est tout aussi facile, il suffit de cela dans la configuration du vhost dans nginx :</p>
<p> <code>location / {<br />
proxy_pass http://unix:/tmp/gunicorn.sock<br />
}</code>
<p>On démarre ensuite gunicorn. Pour Django, gunicorn dispose d&#8217;un support intégré, il vous suffit de vous placer dans le répertoire de votre projet, puis :</p>
<p> <code>gunicorn_django -b unix:/tmp/gunicorn.sock --workers=2</code>
<p>Pour web.py, il faut créer un module :</p>
<p> <code>import web</p>
<p>urls = (<br />
    '/.*', 'hello',<br />
    )</p>
<p>class hello:<br />
    def GET(self):<br />
        return "Hello, world."</p>
<p>application = web.application(urls, globals()).wsgifunc()</code>
<p>Il faut ensuite démarrer le serveur Gunicorn. En étant dans le repertoire ou se trouve le module web.py (le fichier donc le code vient avant, là, au-dessus, oui), :</p>
<p> <code>gunicorn -b unix:/tmp/gunicorn.sock --workers=2 wsgi</code>
<p>Je vous invite à consulter ce lien : <a href="http://gunicorn.org/tuning.html"><span style="color: #000000;">gunicorn.org/tuning.html</span></a>, pour vous permettre d&#8217;augmenter les performances de gunicorn.</p>
<h3>Annexe</h3>
<h4><span style="font-weight: normal;">Fichiers statiques</span></h4>
<p> <code>location /admin-media {alias /usr/lib/pymodules/python2.5/django/contrib/admin/media;}</p>
<p>location /static {root /var/www/byteflow;}</code>
<p>Ces deux lignes, à rajouter après le &#8220;location /&#8221; avec uwsgi_pass ou proxy_pass (selon votre configuration) indiquent à nginx de traiter les fichiers statiques directement. Il faut bien évidemment adapter à votre configuration.</p>
<h4><span style="font-weight: normal;">Munin</span></h4>
<p><span style="font-weight: normal;">Vous pouvez trouver des plugins nginx pour munin <a href="http://muninexchange.projects.linpro.no/?search=&amp;cid=54&amp;pid=51">ici</a>. Je n&#8217;ai pas trouvé de plugin munin pour uwsgi/gunicorn, mais je pourrais peut-être en faire un si je trouve le temps.</span></p>
<h4><span style="font-weight: normal;">Plusieurs serveurs</span></h4>
<p><span style="font-weight: normal;">Si par hasard vous avez plusieurs serveurs gunicorn/uwsgi répartis sur plusieurs machines , vous pouvez les utiliser en déclarant une section </span></p>
<p> <code><span style="font-weight: normal;">upstream <em>nom</em> {} </span></code>
<p><span style="font-weight: normal;">dans nginx, contenant les adresses des serveurs distant (hôte:port ou emplacement du socket) et en utilisant &#8220;<em>nom</em>&#8221; comme argument à <em>uwsgi_pass</em> et <em>proxy_pass</em>.</span></p>
<h3>Conclusion</h3>
<p>Ces deux architectures sont très pratiques pour faire tourner du python dans un serveur web, ici nginx. uwsgi dispose de plus de fonctionalités, mais la plupart (template d&#8217;admin Django, memory profiling) pourraient facilement être ajoutées à gunicorn, qui est beaucoup plus léger à installer/configurer/maintenir (2 commandes et 3 lignes de configuration dans nginx). J&#8217;ai les deux personellement sur mon serveur, j&#8217;ai eu à alterner entre les deux pour écrire cet article, et c&#8217;est pas bien dur, un daemon à arrêter, un autre à démarrer, et changer une ligne dans la configuration de nginx.</p>
<h4>Liens</h4>
<p><a href="http://wsgi.org">wsgi.org</a></p>
<p><a href="http://gunicorn.org/">gunicorn.org/</a></p>
<p><a href="http://projects.unbit.it/uwsgi/">projects.unbit.it/uwsgi/</a></p>
<p><a href="irc://irc.freenode.org/#gunicorn">irc.freenode.org/#gunicorn</a></p>
<p><a href="http://nginx.org/">nginx.org/</a></p>
<p><a href="http://djangoadvent.com/">djangoadvent.com/</a></p>
<p><a href="http://www.django-fr.org/">www.django-fr.org/</a></p>
<p><a href="http://www.djangoproject.com/">www.djangoproject.com/</a></p>
<p><a href="http://webpy.org/">webpy.org/</a></p>
<p>Je tiens à remercier la communauté Geek{node|fault}, le chan irc #gunicorn, les développeurs de gunicorn qui sont très aimables, ainsi que Amandarn qui m&#8217;a aidé pour certains détails.</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2011/03/24/devbox-kvmlibvirt-perfect-setup/' rel='bookmark' title='Devbox KVM+Libvirt perfect setup.'>Devbox KVM+Libvirt perfect setup.</a></li>
<li><a href='http://geekfault.org/2010/04/09/maildir-mbox-la-migration/' rel='bookmark' title='Maildir mbox &#8211; La migration'>Maildir mbox &#8211; La migration</a></li>
<li><a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/' rel='bookmark' title='Filtrer ses mails ! Un cauchemard !'>Filtrer ses mails ! Un cauchemard !</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Geekfault disponible en IPv6</title>
		<link>http://geekfault.org/2009/08/28/geekfault-disponible-en-ipv6/</link>
		<comments>http://geekfault.org/2009/08/28/geekfault-disponible-en-ipv6/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 16:04:03 +0000</pubDate>
		<dc:creator>bragon</dc:creator>
				<category><![CDATA[Geekfault]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=1454</guid>
		<description><![CDATA[Bonjour. Peut être l&#8217;avez vous remarqué ? Geekfault est désormais accessible totalement en IPv6 ! Sa superbe IPv6 2001:758:1664::42 en fait frémir plus d&#8217;un Nous prévoyons d&#8217;ailleurs, avec LeCoyote (nouveau contributeur Geekfault), de vous parler en long et en large de ce protocole qu&#8217;internet sera bien obligé d&#8217;adopter d&#8217;ici quelques années. ENJOY ! Si vous [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/17/partenariat-geekfault/' rel='bookmark' title='Geekfault recherche des partenaires'>Geekfault recherche des partenaires</a></li>
<li><a href='http://geekfault.org/2009/12/22/difficultes-techniques-de-geekfault/' rel='bookmark' title='Difficultés techniques de Geekfault'>Difficultés techniques de Geekfault</a></li>
<li><a href='http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/' rel='bookmark' title='IPv6 pour les nuls^Wgeeks'>IPv6 pour les nuls^Wgeeks</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2009/08/ipv6.jpg" alt="IPv6 - Spread the love" title="IPv6 - Spread the love" width="223" height="223" class="alignleft size-full wp-image-1460" />Bonjour.</p>
<p>Peut être l&#8217;avez vous remarqué ? Geekfault est désormais accessible totalement en IPv6 ! Sa superbe IPv6 <strong>2001:758:1664::42</strong> en fait frémir plus d&#8217;un <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Nous prévoyons d&#8217;ailleurs, avec LeCoyote (nouveau contributeur Geekfault), de vous parler en long et en large de ce protocole qu&#8217;internet sera bien obligé d&#8217;adopter d&#8217;ici quelques années.</p>
<p>ENJOY !</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/17/partenariat-geekfault/' rel='bookmark' title='Geekfault recherche des partenaires'>Geekfault recherche des partenaires</a></li>
<li><a href='http://geekfault.org/2009/12/22/difficultes-techniques-de-geekfault/' rel='bookmark' title='Difficultés techniques de Geekfault'>Difficultés techniques de Geekfault</a></li>
<li><a href='http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/' rel='bookmark' title='IPv6 pour les nuls^Wgeeks'>IPv6 pour les nuls^Wgeeks</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2009/08/28/geekfault-disponible-en-ipv6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serveur Lighttpd avec PHP sur iPhone</title>
		<link>http://geekfault.org/2009/05/27/lighttpd-php-iphone/</link>
		<comments>http://geekfault.org/2009/05/27/lighttpd-php-iphone/#comments</comments>
		<pubDate>Wed, 27 May 2009 21:34:22 +0000</pubDate>
		<dc:creator>Tito</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[mobilité]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=734</guid>
		<description><![CDATA[Toujours avoir un petit serveur HTTP dans sa poche, c&#8217;est possible! C&#8217;est même très pratique pour toujours avoir des fichiers sous la main accessibles simplement en HTTP et d&#8217;autres utilisations illicites Nous allons voir comment installer un serveur Lighttpd (alternative à Apache), avec PHP sur un iPhone 2.2.1 jailbreaké. Installation Grâce à Cydia ou Icy, [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/27/internet-via-iphone/' rel='bookmark' title='Internet sur votre laptop via un iPhone'>Internet sur votre laptop via un iPhone</a></li>
<li><a href='http://geekfault.org/2009/06/29/iphone-os-30/' rel='bookmark' title='iPhone OS 3.0'>iPhone OS 3.0</a></li>
<li><a href='http://geekfault.org/2009/06/08/iphone-3gs/' rel='bookmark' title='Le &#8220;nouvel&#8221; iPhone 3GS'>Le &#8220;nouvel&#8221; iPhone 3GS</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/wp-content/uploads/2009/05/iphone-lighttpd.jpg" title="Un script PHP exécuté directement sur l&#039;iPhone avec un serveur Lighttpd" rel="lightbox.734"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2009/05/iphone-lighttpd-200x300.jpg" alt="Un script PHP exécuté directement sur l&#039;iPhone avec un serveur Lighttpd" title="Un script PHP exécuté directement sur l&#039;iPhone avec un serveur Lighttpd" width="200" height="300" class="alignleft size-medium wp-image-736" /></a>Toujours avoir un petit serveur HTTP dans sa poche, c&#8217;est possible! C&#8217;est même très pratique pour toujours avoir des fichiers sous la main accessibles simplement en HTTP et d&#8217;autres utilisations illicites <img src='http://geekfault.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Nous allons voir comment installer un serveur <strong>Lighttpd</strong> (alternative à Apache), avec <strong>PHP</strong> sur un iPhone 2.2.1 jailbreaké.<br />
<!--more--></p>
<h3>Installation</h3>
<p><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2009/05/lighttpd.png" alt="Logo de Lighttpd" title="Logo de Lighttpd" width="170" height="168" class="alignright size-full wp-image-746" />Grâce à Cydia ou Icy, installez les packages suivants:</p>
<ul>
<li><strong>OpenSSH</strong> un des indispensables du hacker iPhone, il lance un serveur SSH sur celui-ci (l&#8217;iPhone, pas le hacker xD)</li>
<li><strong>Lighttpd</strong> est le serveur HTTP à proprement parler. Très léger et sous license libre (BSD), c&#8217;est une très bonne alternative à Apache</li>
<li><strong>PHP: Hypertext Preprocessor</strong> que nous lierons à Lighttpd dans la configuration</li>
</ul>
<h3>Configuration</h3>
<p>Redémarrez et connectez-vous en ssh à votre iPhone, le mot de passe par défaut est <strong>alpine</strong>.<br />
<code>ssh root@iPhone.local</code></p>
<p>D&#8217;abord créons tous les répertoires utiles:<br />
<code>mkdir /etc/lighttpd/ /etc/lighttpd/logs/ /etc/lighttpd/htdocs/</code></p>
<p>Configurons Lighttpd :<br />
<code>nano /etc/lighttpd/lighttpd.conf</code><br />
<code>server.document-root = "/etc/lighttpd/htdocs"<br />
server.port = 80</p>
<p>server.tag ="lighttpd"<br />
server.errorlog = "/etc/lighttpd/logs/error.log"<br />
accesslog.filename = "/etc/lighttpd/logs/access.log"</p>
<p>server.modules = ("mod_access","mod_accesslog","mod_fastcgi","mod_rewrite","mod_auth","mod_fastcgi")</p>
<p>index-file.names = ( "index.html", "index.php" )</p>
<p>#Configuration PHP<br />
fastcgi.server = (".php" =><br />
        ("localhost" =><br />
                ("bin-path" => "/usr/bin/php-cgi",<br />
                "socket" => "/tmp/php.socket")<br />
        )<br />
)</code><br />
Lighttpd est bien sûr un serveur tout à fait standard largement utilisé sur le web : vous pouvez <a href="http://redmine.lighttpd.net/projects/lighttpd/wiki/TutorialConfiguration">adapter sa configuration</a> selon vos moindres désirs.</p>
<h3>Lancer le serveur</h3>
<p>Il ne reste plus qu&#8217;à lancer le serveur en une petite ligne de commande. Je n&#8217;ai pas trouvé d&#8217;interface graphique qui permette de le faire simplement.<br />
<code>lighttpd -f /etc/lighttpd/lighttpd.conf</code></p>
<p>Créons un petit fichier PHP pour voir si tout marche bien:<br />
<code>nano /etc/lighttpd/htdocs/index.php</code><br />
<code>< ?php $who = 'Geekfault';<br />
echo 'Hello, '.$who.'.'; ?></code></p>
<p>La configuration Lighttpd décrite ici permet de se connecter à votre iPhone avec <strong>tous les hostnames qui lui sont affectés</strong>: iPhone.local, localhost, adresse IP, &#8230;</p>
<h3>MySQL ?</h3>
<p>Il n&#8217;est malheureusement pas possible pour l&#8217;instant de faire tourner un serveur MySQL sur l&#8217;iPhone et, pire, le PHP proposé est <strong>compilé sans le mod_mysql</strong>, ce qui empêche même les connexion MySQL à un serveur distant.</p>
<p>Il faudra se contenter de <strong><a href="http://be.php.net/manual/fr/book.sqlite.php">SQLite</a></strong>. Dommage.</p>
<p><a href="http://www.esrun.co.uk/blog/lighttpd-php-on-the-iphone/">Source</a></p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/27/internet-via-iphone/' rel='bookmark' title='Internet sur votre laptop via un iPhone'>Internet sur votre laptop via un iPhone</a></li>
<li><a href='http://geekfault.org/2009/06/29/iphone-os-30/' rel='bookmark' title='iPhone OS 3.0'>iPhone OS 3.0</a></li>
<li><a href='http://geekfault.org/2009/06/08/iphone-3gs/' rel='bookmark' title='Le &#8220;nouvel&#8221; iPhone 3GS'>Le &#8220;nouvel&#8221; iPhone 3GS</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2009/05/27/lighttpd-php-iphone/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Deux simples extensions Firefox</title>
		<link>http://geekfault.org/2009/05/09/deux-simples-extensions-firefox/</link>
		<comments>http://geekfault.org/2009/05/09/deux-simples-extensions-firefox/#comments</comments>
		<pubDate>Sat, 09 May 2009 10:27:57 +0000</pubDate>
		<dc:creator>roidelapluie</dc:creator>
				<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[onglets]]></category>
		<category><![CDATA[textarea]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=292</guid>
		<description><![CDATA[N&#8217;étant pas un grand fan des extensions Firefox, j&#8217;en utilise peu, et celles que j&#8217;utilise sont simples et relativement utiles. Je vais vous en présenter deux: Tabs Open Relative et Resizeable Textarea. Tabs Open Relative Cette première extension a un et un seul but: placer les onglets nouvellement créés à gauche de l&#8217;onglet courant. Pour [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/06/firefox-smart-keywords/' rel='bookmark' title='Astuce Firefox : les Smart Keywords'>Astuce Firefox : les Smart Keywords</a></li>
<li><a href='http://geekfault.org/2009/08/21/concours-google-wave-sandbox/' rel='bookmark' title='Concours : deux jours d&#8217;accès à la Google Wave Sandbox'>Concours : deux jours d&#8217;accès à la Google Wave Sandbox</a></li>
<li><a href='http://geekfault.org/2009/03/21/synergy/' rel='bookmark' title='Synergy'>Synergy</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   class="alignleft size-medium wp-image-301" title="firefox" src="http://geekfault.org/wp-content/uploads/2009/05/firefox-300x282.jpg" alt="firefox" width="91" height="86" />N&#8217;étant pas un grand fan des <strong>extensions Firefox</strong>, j&#8217;en utilise peu, et celles que j&#8217;utilise sont simples et relativement utiles. Je vais vous en présenter deux: <strong>Tabs Open Relative</strong> et <strong>Resizeable Textarea</strong>.<br />
<!--more--></p>
<h3><strong>Tabs Open Relative</strong></h3>
<p>Cette première extension a un et un seul but: placer les onglets nouvellement créés à gauche de l&#8217;onglet courant. Pour que lorsque l&#8217;on navigue sur plusieurs sites différents on ne cherche pas pendant des heures l&#8217;onglet dont on a besoin.</p>
<p>Cette extension ne fait que ça. Ni plus, ni moins. Certains me diront que Tab Mix Plus le fais également, mais cette extension est, à mes yeux, une uzine à gaz.</p>
<h3><strong>Resizeable Textarea</strong></h3>
<p>Si, comme moi, il vous arrive d&#8217;écrire des messages assez longs sur des forums de discussion, ou d&#8217;écrire des pâtés sur vos divers profils, vous allez sans doute apprécier cette extension.</p>
<p>Elle permet à Firefox d&#8217;adopter le même comportement que ses concurrents basés sur Webkit: le coin en bas à droite des zones de textes (textareas) permet de redimensionner le textarea en question. Plus besoin de scroller pour avoir son argumentaire en un clin d&#8217;oeuil, pour avoir une vue d&#8217;ensemble de son commentaire. Un véritable plaisir.</p>
<h3><strong>Abondance de liens ne nuit pas</strong></h3>
<ul>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/1956">L&#8217;extension Tabs Open Relative</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/1122">L&#8217;extension Tab Mix Plus</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/3818/">L&#8217;extension Resizeable Textareas</a></li>
<li><a href="http://orangoo.com/AJS/examples/reziseable_textarea.html">Webmasters: créer une zone de texte redimensionnable avec la bibliothèque AJS (Javascript).</a></li>
</ul>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/06/firefox-smart-keywords/' rel='bookmark' title='Astuce Firefox : les Smart Keywords'>Astuce Firefox : les Smart Keywords</a></li>
<li><a href='http://geekfault.org/2009/08/21/concours-google-wave-sandbox/' rel='bookmark' title='Concours : deux jours d&#8217;accès à la Google Wave Sandbox'>Concours : deux jours d&#8217;accès à la Google Wave Sandbox</a></li>
<li><a href='http://geekfault.org/2009/03/21/synergy/' rel='bookmark' title='Synergy'>Synergy</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2009/05/09/deux-simples-extensions-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

