<?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>Florent Gallaire&#039;s Blog &#187; Libre</title>
	<atom:link href="http://fgallaire.flext.net/tag/libre/feed/" rel="self" type="application/rss+xml" />
	<link>http://fgallaire.flext.net</link>
	<description>Free (libre) software and free (libre) culture (science and law)</description>
	<lastBuildDate>Tue, 03 Jan 2012 13:11:41 +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>Django 1.4 passe à HTML5 ! et autres nouveautés</title>
		<link>http://fgallaire.flext.net/django-1-4-passe-a-html5-et-nouveautes/</link>
		<comments>http://fgallaire.flext.net/django-1-4-passe-a-html5-et-nouveautes/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 04:38:35 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Django-nonrel]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Framework python]]></category>
		<category><![CDATA[Framework web]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1935</guid>
		<description><![CDATA[Le 22 décembre dernier est sorti Django 1.4 alpha 1. Comme on peu l'imaginer pour un projet d'une telle ampleur, cette nouvelle version apporte beaucoup de nouveautés. Je me contenterai d'en détailler rapidement cinq qui me semblent particulièrement intéressantes :


	Le passage au Doctype HTML5, tous les templates fournis avec Django, en particulier ceux de ...]]></description>
			<content:encoded><![CDATA[<p>Le 22 décembre dernier est sorti <a href="https://www.djangoproject.com/weblog/2011/dec/22/14-alpha-1/" target="_blank">Django 1.4 alpha 1</a>. Comme on peu l&#8217;imaginer pour un projet d&#8217;une telle ampleur, cette nouvelle version apporte <a href="https://docs.djangoproject.com/en/dev/releases/1.4-alpha-1/" target="_blank">beaucoup de nouveautés</a>. Je me contenterai d&#8217;en détailler rapidement cinq qui me semblent particulièrement intéressantes :</p>
<ol>
<ol>
<li>Le passage au Doctype HTML5, tous les templates fournis avec Django, en particulier ceux de l&#8217;interface d&#8217;administration, utilisant donc désormais <code>&lt;!DOCTYPE html&gt;</code>. C&#8217;est un choix logique, qui permet d&#8217;utiliser toutes les nouvelles fonctionnalités de HTML5 sans plus se soucier de devoir corriger le Doctype.</li>
<li>L&#8217;abandon du support de Python 2.4, datant de 2004, mais pas le passage à Python 3. Django supporte et est testé sur Python 2.5, 2.6 et 2.7.</li>
<li>Le nouveau framework de test <a href="https://docs.djangoproject.com/en/dev/topics/testing/#django.test.LiveServerTestCase" target="_blank"><code>LiveServerTestCase</code></a>, compatible avec <a href="http://seleniumhq.org/" target="_blank">Selenium</a> et <a href="http://www.getwindmill.com/" target="_blank">Windmill</a>, pour tester l&#8217;interface de votre application web côté client (dans le navigateur web).</li>
<li>La nouvelle option <code>--template</code> pour les commandes <a href="https://docs.djangoproject.com/en/dev/ref/django-admin/#django-admin-startapp" target="_blank"><code>startapp</code></a> et <a href="https://docs.djangoproject.com/en/dev/ref/django-admin/#django-admin-startproject" target="_blank"><code>startproject</code></a>, permettant de leur spécifier aisément un template personnalisé.</li>
<li>La nouvelle <a href="https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatetag-if" target="_blank">clause <code>elif</code></a> pour la balise <code>if</code>. Elle permettra de ne plus avoir à imbriquer plusieurs <code>if then else</code> et autant d&#8217;indentations ou à se définir une balise personnalisée. Alors oui j&#8217;ose le dire : c&#8217;est pas trop tôt !</li>
</ol>
</ol>
<p>On voit donc qu&#8217;encore une fois Django continue d&#8217;avancer dans la bonne direction, bonifiant sans cesse une base déjà excellente. La seule chose que je regrette encore et toujours, c&#8217;est la défiance manifeste de la core team envers l&#8217;intégration de <a href="http://www.allbuttonspressed.com/projects/django-nonrel" target="_blank">django-nonrel</a>&#8230; peut-être pour Django 1.5 ?</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/django-1-4-passe-a-html5-et-nouveautes/&via=fgallaire&text=Django 1.4 passe à HTML5 ! et autres nouveautés&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1935&amp;md5=ea89b8d1982d6a689a50a1ec78b72ed8" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/django-1-4-passe-a-html5-et-nouveautes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>La compréhension de liste en Python, une syntaxe moderne pour map() et filter()</title>
		<link>http://fgallaire.flext.net/comprehension-de-liste-en-python-map-filter/</link>
		<comments>http://fgallaire.flext.net/comprehension-de-liste-en-python-map-filter/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 02:08:29 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Compréhension de liste]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Programmation fonctionnelle]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1787</guid>
		<description><![CDATA[La compréhension de liste est un syntactic sugar pour les fonctions classiques de la programmation fonctionnelle que sont map() et filter(). Disponible depuis Python 2.0, la compréhension de liste devrait à terme amener à la disparition des fonctions map() et filter() du langage Python, ce que Guido van Rossum avait déjà envisagé pour Python ...]]></description>
			<content:encoded><![CDATA[<p>La <a href="http://fr.wikipedia.org/wiki/Liste_en_compr%C3%A9hension" target="_blank">compréhension de liste</a> est un <a href="http://en.wikipedia.org/wiki/Syntactic_sugar" target="_blank"><em>syntactic sugar</em></a> pour les fonctions classiques de la programmation fonctionnelle que sont <code>map()</code> et <code>filter()</code>. Disponible <a href="http://docs.python.org/dev/whatsnew/2.0.html" target="_blank">depuis Python 2.0</a>, la compréhension de liste devrait à terme amener à la disparition des fonctions <code>map()</code> et <code>filter()</code> du langage Python, ce que <a href="http://fr.wikipedia.org/wiki/Guido_van_Rossum" target="_blank">Guido van Rossum</a> avait déjà <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=98196" target="_blank">envisagé pour Python 3</a>.</p>
<p>Ainsi, si vous avez du &#8220;vieux code&#8221; utilisant ces fonctions, je vous encourage à le porter vers cette nouvelle syntaxe beaucoup plus lisible et plus pythonique. J&#8217;espère que cet article pourra aider certains à éviter les pièges qui pourraient apparaître devant eux lors de cette démarche.</p>
<p><strong>map()</strong><br />
Commençons d&#8217;abord par la fonction <code>map()</code>, dont la syntaxe est <code>map(fonction, liste)</code>. Prenons un exemple très simple, avec une fonction anonyme <code>lambda</code> qui à tout <code>x</code> élément de la liste des chiffres de <code>0</code> à <code>9</code> associe <code>2</code> fois <code>x</code>.</p>
<blockquote><p><code>&gt;&gt;&gt; map(lambda x: 2*x, range(10))</code><br />
<code>[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]</code></p></blockquote>
<p>On obtient l&#8217;équivalent de la fonction <code>map()</code> avec une compréhension de liste de la forme <code>[fonction(x) for x in liste]</code>, ce qui donne pour notre exemple :</p>
<blockquote><p><code>&gt;&gt;&gt; [2*x for x in range(10)]</code><br />
<code>[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]</code></p></blockquote>
<p><strong>filter()</strong><br />
La syntaxe de la fonction <code>filter()</code> est <code>filter(fonction, liste)</code>. Prenons ici aussi un exemple très simple, avec une fonction anonyme <code>lambda</code> qui n&#8217;est <code>Vrai</code> pour chaque <code>x</code> élément de la liste des chiffres de <code>0</code> à <code>9</code> que s&#8217;il est strictement supérieur à <code>5</code>.</p>
<blockquote><p><code>&gt;&gt;&gt; filter(lambda x: x&gt;5, range(10))</code><br />
<code>[6, 7, 8, 9]</code></p></blockquote>
<p>On obtient l&#8217;équivalent de la fonction <code>filter()</code> avec une compréhension de liste de la forme <code>[x for x in liste if fonction(x)]</code>, et donc notre exemple devient :</p>
<blockquote><p><code>&gt;&gt;&gt; [x for x in range(10) if x&gt;5]</code><br />
<code>[6, 7, 8, 9]</code></p></blockquote>
<p>Un des grands intérêts des fonctions est de pouvoir être composées. Cependant, cette opération de composition n&#8217;est pas anodine, et il faut bien envisager les différents cas pour ne pas commettre d&#8217;erreur.</p>
<p><strong>map o filter()</strong><br />
La composition notée <code>map o filter()</code> revient à <code>map(filter())</code>, c&#8217;est-à-dire à appliquer d&#8217;abord la fonction <code>filter()</code>, puis la fonction <code>map()</code>. Si nous combinons nos deux premiers exemples, nous obtenons :</p>
<blockquote><p><code>&gt;&gt;&gt; map(lambda x: 2*x, filter(lambda x: x&gt;5, range(10)))</code><br />
<code>[12, 14, 16, 18]</p></blockquote>
<p></code><br />
On obtient l&#8217;équivalent de la composition de fonction <code>map o filter()</code> avec une compréhension de liste de la forme <code>[fonction_map(x) for x in liste if fonction_filter(x)]</code>, ce qui donne ici :</p>
<blockquote><p><code>&gt;&gt;&gt; [2*x for x in range(10) if x&gt;5]</code><br />
<code>[12, 14, 16, 18]</code></p></blockquote>
<p>La composition de fonction <code>map o filter()</code> <strong>ne pose pas de problème</strong>.</p>
<p>On remarque que plus l&#8217;on compose des fonctions <code>map()</code> et <code>filter()</code>, plus l&#8217;avantage syntaxique de lisibilité et de compréhensibilité des compréhensions de liste augmente. </p>
<p><strong>filter o map()</strong><br />
Mais qu&#8217;en est-il de la composition notée <code>filter o map()</code>, qui revient à <code>filter(map())</code>, c&#8217;est-à-dire à appliquer d&#8217;abord la fonction <code>map()</code>, puis la fonction <code>filter()</code>. Si nous combinons ici aussi nos deux premiers exemples, nous obtenons :</p>
<blockquote><p><code>&gt;&gt;&gt; filter(lambda x: x&gt;5, map(lambda x: 2*x, range(10)))</code><br />
<code>[6, 8, 10, 12, 14, 16, 18]</code></p></blockquote>
<p>Le résultat retourné est différent de celui obtenu à l&#8217;exemple précédent avec une compréhension de liste de la forme <code>[fonction_map(x) for x in liste if fonction_filter(x)]</code>. En fait, la bonne compréhension de liste est :</p>
<blockquote><p><code>&gt;&gt;&gt; [2*x for x in range(10) if 2*x&gt;5]</code><br />
<code>[6, 8, 10, 12, 14, 16, 18]</code></p></blockquote>
<p>Nous voyons que la composition de fonction <code>filter o map()</code> <strong>pose des problèmes</strong>, et qu&#8217;il faudra y porter une attention particulière en cas de conversion de vieux code fonctionnel en compréhensions de liste.</p>
<p><strong>filter o filter()</strong><br />
La composition notée <code>filter o filter()</code> revient à <code>filter(filter())</code>, c&#8217;est-à-dire à appliquer deux fois de suite la fonction <code>filter()</code>. Nous allons donc rajouter une deuxième condition à notre premier exemple de <code>filter()</code>, qui sera que chaque élément <code>x</code> devra en plus être strictement inférieur à <code>8</code>.</p>
<blockquote><p><code>&gt;&gt;&gt; filter(lambda x: x&lt;8, filter(lambda x: x&gt;5, range(10)))</code><br />
<code>[6, 7]</code></p></blockquote>
<p>Le même résultat est obtenu en inversant l&#8217;ordre des deux conditions :</p>
<blockquote><p><code>&gt;&gt;&gt; filter(lambda x: x&gt;5, filter(lambda x: x&lt;8, range(10)))</code><br />
<code>[6, 7]</code></p></blockquote>
<p>La composition <code>filter o filter()</code> <strong>est commutative</strong>, et peut en fait facilement se factoriser sous la forme :</p>
<blockquote><p><code>&gt;&gt;&gt; filter(lambda x: x&gt;5 and x&lt;8, range(10))</code><br />
<code>[6, 7]</code></p></blockquote>
<p>On obtient l&#8217;équivalent de la composition de fonction <code>filter o filter()</code> avec une compréhension de liste de la forme <code>[x for x in liste if fonction_filter_1(x) and fonction_filter_2(x)]</code>, ce qui donne ici :</p>
<blockquote><p><code>&gt;&gt;&gt; [x for x in range(10) if x&gt;5 and x&lt;8]</code><br />
<code>[6, 7]</code></p></blockquote>
<p>La composition de fonction <code>filter o filter()</code> <strong>ne pose pas de problème</strong>.</p>
<p><strong>map o map()</strong><br />
Mais qu&#8217;en est-il de la composition notée <code>map o map()</code>, qui revient à <code>map(map())</code>, c&#8217;est-à-dire à appliquer deux fois de suite la fonction <code>map()</code> ? Rajoutons une deuxième fonction à notre premier exemple de <code>map()</code>, qui à chaque <code>x</code> associera <code>x</code> plus <code>1</code>. </p>
<blockquote><p><code>&gt;&gt;&gt; map(lambda x: x+1, map(lambda x: 2*x, range(10)))</code><br />
<code>[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]</code></p></blockquote>
<p>et</p>
<blockquote><p><code>&gt;&gt;&gt; map(lambda x: 2*x, map(lambda x: x+1, range(10)))</code><br />
<code>[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]</code></p></blockquote>
<p>ne donnent pas les mêmes résultats. La composition <code>map o map()</code> <strong>n&#8217;est pas commutative</strong>. On obtient l&#8217;équivalent de la composition de fonction <code>map o map()</code> avec une compréhension de liste de la forme <code>[fonction_map_2(x) for x in [fonction_map_1(x) for x in liste]]</code>, ce qui donne ici :</p>
<blockquote><p><code>&gt;&gt;&gt; [x+1 for x in [2*x for x in range(10)]]</code><br />
<code>[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]</code></p></blockquote>
<p>et</p>
<blockquote><p><code>&gt;&gt;&gt; [2*x for x in [x+1 for x in range(10)]]</code><br />
<code>[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]</code></p></blockquote>
<p>Il est possible de factoriser les deux fonctions <code>map()</code> comme nous l&#8217;avons fait pour les fonctions <code>filter()</code>, mais il faut faire très attention à l&#8217;ordre de composition des fonctions. Dans le premier cas on a <code>(2*x)+1 = 2*x+1</code> qui donne :</p>
<blockquote><p><code>&gt;&gt;&gt; [2*x+1 for x in range(10)]</code><br />
<code>[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]</code></p></blockquote>
<p>et dans le deuxième cas on obtient <code>2*(x+1) = 2*x+2</code> qui produit :</p>
<blockquote><p><code>&gt;&gt;&gt; [2*x+2 for x in range(10)]</code><br />
<code>[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]</code></p></blockquote>
<p>Nous voyons que la composition de fonction <code>map o map()</code> <strong>pose des problèmes</strong>.</p>
<p>Pour ne pas tomber dans des pièges, il suffit de retenir que toutes les compositions de fonctions qui commencent par une fonction <strong>map() sont dangereuses</strong>, alors que celles commençant par une fonction <strong>filter() sont sans danger</strong>.</p>
<p>Pour mon plus grand bonheur, la syntaxe de compréhension de liste rend particulièrement pythonique et centrale au langage Python une partie de la sémantique de la programmation fonctionnelle qui y était jusqu&#8217;à présent mal intégrée et mal aimée. Encore une fois, et même si certains de mes professeurs d&#8217;informatique ne l&#8217;ont jamais accepté, <em>sans une bonne syntaxe, une sémantique géniale n&#8217;est rien</em>.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/comprehension-de-liste-en-python-map-filter/&via=fgallaire&text=La compréhension de liste en Python, une syntaxe moderne pour map() et filter()&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1787&amp;md5=ae2ac2b716233828f1b9f08019ce4b2e" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/comprehension-de-liste-en-python-map-filter/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Steve Jobs est mort, un pionnier de l&#8217;informatique disparaît</title>
		<link>http://fgallaire.flext.net/steve-jobs-est-mort-un-pionnier-de-linformatique-disparait/</link>
		<comments>http://fgallaire.flext.net/steve-jobs-est-mort-un-pionnier-de-linformatique-disparait/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 02:49:26 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iMac Tournesol]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[NeXT]]></category>
		<category><![CDATA[NeXTstation]]></category>
		<category><![CDATA[NeXTSTEP]]></category>
		<category><![CDATA[Steve Jobs]]></category>
		<category><![CDATA[Window Maker]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1742</guid>
		<description><![CDATA[Steve Jobs est mort hier, seulement un mois et demi après s'être retiré de son poste de CEO d'Apple. Il aura donc mené sa passionnante vie jusqu'à la toute dernière limite de ses possibilités physiques.

En tant qu'informaticien, et en tant que simple utilisateur d'ordinateur, je le remercie d'être allé voler les idées géniales et ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.apple.com/stevejobs/">Steve Jobs est mort</a> hier, seulement un mois et demi après s&#8217;être retiré de son poste de CEO d&#8217;Apple. Il aura donc mené sa passionnante vie jusqu&#8217;à la toute dernière limite de ses possibilités physiques.</p>
<p>En tant qu&#8217;informaticien, et en tant que simple utilisateur d&#8217;ordinateur, je le remercie d&#8217;être allé voler les idées géniales et inexploitées d&#8217;interfaces graphiques et de souris au PARC, le <a href="http://fr.wikipedia.org/wiki/Palo_Alto_Research_Center">Palo Alto Research Center</a> de Xerox, dont la photo orne toujours la porte de ma chambre.</p>
<p style="text-align: center;"><a href="http://img.x-drivers.ru/articles/33/xerox_parc.jpg"><img class="aligncenter" title="Xerox PARC" src="http://img.x-drivers.ru/articles/33/xerox_parc.jpg" alt="" width="400" height="199" /></a></p>
<p>Et d&#8217;en avoir conçu en 1983 le premier ordinateur personnel utilisable par une personne normale, nommé <a href="http://fr.wikipedia.org/wiki/Apple_Lisa">Lisa</a> (le prénom de sa fille).</p>
<p style="text-align: center;"><a href="http://www.macgeek.org/museum/applelisa1/apple1_00.jpg"><img class="aligncenter" title="Apple Lisa" src="http://www.macgeek.org/museum/applelisa1/apple1_00.jpg" alt="" width="410" height="307" /></a></p>
<p>Quand il fut viré d&#8217;Apple par <a href="http://fr.wikipedia.org/wiki/John_Sculley" target="_blank">John Sculley</a> en 1985, il fonda une entreprise nommée <a href="http://fr.wikipedia.org/wiki/NeXT" target="_blank">NeXT</a>. Le nom de domaine que j&#8217;utilise, FLeXT, y fait directement référence.</p>
<p>Avec <a href="http://fr.wikipedia.org/wiki/NeXTSTEP" target="_blank">NeXTSTEP</a>, il créa le premier <a href="http://fr.wikipedia.org/wiki/Unix" target="_blank">Unix</a> doté d&#8217;une interface graphique innovante tant d&#8217;un point de vue technique qu&#8217;ergonomique, que l&#8217;on connaît encore aujourd&#8217;hui sous le nom de Mac OS X (avec un look un peu plus eye candy), et dont le projet <a href="http://www.gnustep.org/" target="_blank">GNUstep</a> est une réimplémentation libre des APIs.</p>
<p style="text-align: center;"><a href="http://upload.wikimedia.org/wikipedia/en/3/3b/NeXTSTEP_desktop.jpg"><img class="aligncenter" title="NeXTSTEP" src="http://upload.wikimedia.org/wikipedia/en/3/3b/NeXTSTEP_desktop.jpg" alt="" width="405" height="316" /></a></p>
<p>J&#8217;ai très longtemps utilisé exclusivement <a href="http://windowmaker.org/" target="_blank">Window Maker</a>, un gestionnaire de fenêtre libre pour X11 réimplémentant l&#8217;ergonomie de NeXTSTEP.</p>
<p style="text-align: center;"><a href="http://cltb.ojuba.org/images/wmaker.jpg"><img class="aligncenter" title="Window Maker" src="http://cltb.ojuba.org/images/wmaker.jpg" alt="" width="403" height="302" /></a></p>
<p>Merci à toi Steve d&#8217;avoir été à l&#8217;origine de certains des plus beaux designs de l&#8217;histoire de l&#8217;informatique, comme la première version de la <a href="http://fr.wikipedia.org/wiki/NeXTstation" target="_blank">NeXTstation</a>, avec son écran noir et blanc NeXT MegaPixel de 17&#8243; dont un exemplaire est encore stocké dans ma cave, alors qu&#8217;une NeXTstation TurboColor est toujours présente sur mon bureau pour rehausser mon écran ;</p>
<p style="text-align: center;"><a href="http://www.old-computers.com/museum/photos/Next_Station_Side_s1.jpg"><img class="aligncenter" title="NeXT Station" src="http://www.old-computers.com/museum/photos/Next_Station_Side_s1.jpg" alt="" width="365" height="389" /></a></p>
<p>comme l&#8217;Apple Cube dans l&#8217;esprit duquel, avec l&#8217;aide de Philou, j&#8217;ai essayé de réaliser un boîtier en plexiglas pour une carte mère <a href="http://fr.wikipedia.org/wiki/ITX" target="_blank">mini-ITX</a> ;</p>
<p style="text-align: center;"><a href="http://www.memoclic.com/4-1212-600x450/fond-ecran-cube-apple.jpg"><img class="aligncenter" title="Apple Cube" src="http://www.memoclic.com/4-1212-600x450/fond-ecran-cube-apple.jpg" alt="" width="432" height="324" /></a></p>
<p>et bien sûr comme le sublime iMac Tournesol, dont je serais très heureux de récupérer un modèle 20&#8243; !</p>
<p style="text-align: center;"><a href="http://www.aventure-apple.com/ordis/images/07imactournesol.jpg"><img class="aligncenter" title="iMac Tournesol" src="http://www.aventure-apple.com/ordis/images/07imactournesol.jpg" alt="" width="479" height="207" /></a></p>
<p>&nbsp;</p>
<p>Merci aussi d&#8217;avoir longtemps été l&#8217;un des seuls à tenir tête à Bill Gates et à son empire de médiocrité informatique nommé Microsoft. Bravo pour avoir eu l&#8217;intelligence technique d&#8217;<a href="http://www.apple.com/opensource/" target="_blank">utiliser massivement les logiciels libres</a>, qui sont la composante principale des systèmes <a href="http://opensource.apple.com/release/mac-os-x-1071/" target="_blank">Mac OS X</a> et iOS diffusés par Apple, même si tu n&#8217;en as pas compris la puissance politique.</p>
<p>Alors bien sûr, l&#8217;Apple d&#8217;aujourd&#8217;hui, première valorisation boursière mondiale, l&#8217;Apple des bobos, des <a href="http://www.defectivebydesign.org/" target="_blank">DRM</a> et des iBidules, très peu pour moi comme pour tous les libristes. Mais Steve Jobs a fait bien d&#8217;autres choses que cela, c&#8217;est un exceptionnel pionnier de l&#8217;informatique qui nous a quitté hier.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/steve-jobs-est-mort-un-pionnier-de-linformatique-disparait/&via=fgallaire&text=Steve Jobs est mort, un pionnier de l'informatique disparaît&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1742&amp;md5=ec3d03b082e4f448e9955be65bc7ce9e" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/steve-jobs-est-mort-un-pionnier-de-linformatique-disparait/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Freebox, enfin le code source !</title>
		<link>http://fgallaire.flext.net/freebox-enfin-le-code-source/</link>
		<comments>http://fgallaire.flext.net/freebox-enfin-le-code-source/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 15:35:10 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[BusyBox]]></category>
		<category><![CDATA[Copyleft]]></category>
		<category><![CDATA[Droit]]></category>
		<category><![CDATA[Free]]></category>
		<category><![CDATA[Freebox]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1706</guid>
		<description><![CDATA[&#160;

Après de trop longues tergiversations, et en accord avec l'article 11.5.2 de ses nouvelles conditions générales de vente du 1er août 2011, Free se met enfin en conformité avec les termes de la licence GNU GPL et de son Copyleft, en donnant accès aux codes sources modifiés utilisés dans les Freebox !

C'est le dernier ...]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Après de trop longues tergiversations, et en accord avec l&#8217;article 11.5.2 de ses <a href="https://adsl.free.fr/cgv/CGV_FORFAIT_hors_opt_01082011.pdf" target="_blank">nouvelles conditions générales de vente</a> du 1er août 2011, <a href="http://portail.free.fr/" target="_blank">Free</a> se met enfin en conformité avec les termes de la licence <a href="http://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU" target="_blank">GNU GPL</a> et de son <a href="http://fr.wikipedia.org/wiki/Copyleft" target="_blank">Copyleft</a>, en donnant accès aux <a href="http://floss.freebox.fr/" target="_blank">codes sources modifiés</a> utilisés dans les <a href="http://fr.wikipedia.org/wiki/Freebox" target="_blank">Freebox</a> !</p>
<p>C&#8217;est le dernier des trois grands <a href="http://fr.wikipedia.org/wiki/Fournisseur_d%27acc%C3%A8s_%C3%A0_Internet" target="_blank">FAI</a> français à effectuer cette démarche, SFR ayant ouvert <a href="http://www.efixo.com/neufbox4/freesoftware/" target="_blank">un premier site en 2007</a>, puis <a href="http://dev.efixo.net/wiki" target="_blank">un second en 2010</a> pour les sources de sa NeufBox, et Orange <a href="http://www.livebox-opensource.com/" target="_blank">un site en 2009</a> pour les sources de sa LiveBox. Il semblerait d&#8217;ailleurs qu&#8217;il y ait une belle dynamique de <a href="http://www.neufbox4.org/blog/" target="_blank">création de firmwares alternatifs pour la NeufBox</a>, puisque c&#8217;est la seule des trois box à ne pas être victime de <a href="http://fr.wikipedia.org/wiki/Tivoisation" target="_blank">tivoisation</a>, c&#8217;est-à-dire d&#8217;un système électronique empêchant l&#8217;utilisation d&#8217;un firmware modifié.</p>
<p>Si la liste des logiciels libres utilisés dans ces box est très longue, les composants de base sont le <a href="http://fr.wikipedia.org/wiki/Noyau_Linux" target="_blank">noyau Linux</a> et la mini boîte à outils Unix <a href="http://www.busybox.net/" target="_blank">BusyBox</a>, qui sont tous les deux sous licence <a href="http://www.gnu.org/licenses/gpl-2.0.html" target="_blank">GNU GPLv2</a>. L&#8217;<a href="http://fsffrance.org/news/assignation-free.pdf" target="_blank">action en justice entreprise en 2008 contre Free</a> par <a href="http://fr.wikipedia.org/wiki/Harald_Welte" target="_blank">Harald Welte</a>, pour son code de <a href="http://fr.wikipedia.org/wiki/Netfilter" target="_blank">Netfilter</a> dans le noyau Linux, et les développeurs de BusyBox <a href="http://www.codepoet.org/andersen/erik/erik.html" target="_blank">Erik Andersen</a> et <a href="http://landley.net/" target="_blank">Rob Landley</a>, trouve ici son dénouement logique. On appréciera au passage  le travail de <a href="http://www.hugot.fr/avocats/olivier-hugot/" target="_blank">Maître Olivier Hugot</a> dans ce dossier.</p>
<p>Pour les personnes qui auraient encore eu un doute, la licence GNU GPL et le Copyleft ont une validité juridique incontestable, et si vous voulez utiliser des codes sources qui y sont soumis, vous devez en respecter les règles, toutes les règles.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/freebox-enfin-le-code-source/&via=fgallaire&text=Freebox, enfin le code source !&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1706&amp;md5=201fbe87aa11cb7fcc491f455e828d41" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/freebox-enfin-le-code-source/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>L&#8217;impact de Django</title>
		<link>http://fgallaire.flext.net/impact-de-django/</link>
		<comments>http://fgallaire.flext.net/impact-de-django/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 01:58:10 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AGPL]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[Copyleft]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Droit]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Framework python]]></category>
		<category><![CDATA[Framework web]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1658</guid>
		<description><![CDATA[Armin Ronacher, membre de la Pocco Team, est le principal développeur de nombreux projets libres comme le langage de template Jinja et le microframework Flask, qui sont des programmes Python très populaires et d'excellente qualité.

Le 8 juin, lors du DjangoCon Europe 2011, il a fait une présentation intitulée The Impact of Django ayant un ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://lucumr.pocoo.org/about/" target="_blank">Armin Ronacher</a>, membre de la <a href="http://www.pocoo.org/team" target="_blank">Pocco Team</a>, est le principal développeur de <a href="http://lucumr.pocoo.org/projects/" target="_blank">nombreux projets libres</a> comme le <a href="http://jinja.pocoo.org/" target="_blank">langage de template Jinja</a> et le <a href="http://flask.pocoo.org/" target="_blank">microframework Flask</a>, qui sont des programmes <a href="http://www.python.org/" target="_blank">Python</a> très populaires et d&#8217;excellente qualité.</p>
<p>Le 8 juin, lors du <a href="http://2011.djangocon.eu/" target="_blank">DjangoCon Europe 2011</a>, il a fait une présentation intitulée <em>The Impact of Django</em> ayant un contenu similaire en bien des points à mon article du 6 juin intitulé <a href="http://fgallaire.flext.net/meilleur-framework-web-python-django/" target="_blank">Et le meilleur framework web Python est&#8230; Django !</a>. Vous pouvez <a href="http://blip.tv/djangocon-europe-2011/wednesday-0930-armin-ronacher-5311189" target="_blank">voir la conférence en ligne</a> et en <a href="http://www.scribd.com/doc/57352264/The-Impact-of-Django" target="_blank">consulter</a> ou <a href="http://dev.pocoo.org/~mitsuhiko/impact.pdf" target="_blank">télécharger</a> les slides.</p>
<p>Bien sûr, il est assez plaisant de constater qu&#8217;un développeur, qui n&#8217;est pas loin d&#8217;être le meilleur au monde sur le sujet, fait une analyse très proche de la mienne en particulier en prenant le contre-exemple de <a href="http://turbogears.org/" target="_blank">TurboGears</a> et en montrant l&#8217;influence du <a href="https://docs.djangoproject.com/en/dev/topics/templates/" target="_blank">langage de template de Django</a>. Cependant, il ajoute deux éléments  d&#8217;analyse, l&#8217;un social et l&#8217;autre juridique.</p>
<p>Premièrement, Armin pense que, d&#8217;une manière assez similaire à <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a> pour <a href="http://www.ruby-lang.org/fr/" target="_blank">Ruby</a>, Django est actuellement la locomotive du langage Python :</p>
<blockquote><p><em>Django is the reason Python is getting that much attention lately</em>.</p></blockquote>
<p>Ainsi, environ 1 200 des 15 000 paquets disponibles sur <a href="http://pypi.python.org/pypi" target="_blank">PyPi</a> contiendraient &#8220;Django&#8221; dans leur nom, de même que 10 000 des 77 000 dépôts sur <a href="https://github.com/" target="_blank">GitHub</a> et 3 000 dépôts sur <a href="https://bitbucket.org/" target="_blank">Bitbucket</a>. Si Python est beaucoup plus utilisé que Ruby en dehors du web, l&#8217;importance de ce dernier est telle qu&#8217;il est logique que le logiciel qui y est leader soit aussi le leader du langage.</p>
<p>Deuxièmement, Armin lie le succès de la <a href="http://fr.wikipedia.org/wiki/Licence_BSD" target="_blank">licence BSD</a> dans la communauté Python avec celui de Django et de son écosystème. Ansi 700 des 2 500 paquets sous licence BSD sur PyPI sont classés Django. Et surtout la licence BSD semble être utilisée par des projets assez récents, quand les plus anciens privilégiaient la <a href="http://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU" target="_blank">licence GNU GPL</a>.</p>
<p>Le choix de la licence est quelque chose de fondamental pour un logiciel libre, et il faut réfléchir aux implications réelles qui en découlent. En pratique, dans le contexte du serveur web qui est celui de Django, la licence GNU GPL n&#8217;est pas spécialement plus contraignante qu&#8217;une licence BSD, n&#8217;obligeant pas à redistribuer le code source modifié, et choisir l&#8217;une plutôt que l&#8217;autre n&#8217;a donc pas vraiment de signification pertinente.</p>
<p>Pour ce type de logiciel, si l&#8217;on veut voir s&#8217;appliquer la puissance du <a href="http://fr.wikipedia.org/wiki/Copyleft" target="_blank">copyleft</a>, il faut utiliser la licence <a href="http://fr.wikipedia.org/wiki/Affero_General_Public_License" target="_blank">GNU Affero GPL</a>. À titre personnel, c&#8217;est la licence que je conseille, mais si l&#8217;on veut une licence libérale, alors je trouve effectivement plus clair de choisir une licence BSD qu&#8217;une licence GNU GPL vidée de sa substance par le contexte du logiciel serveur.<a href="https://github.com/" target="_blank"><br />
</a></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/impact-de-django/&via=fgallaire&text=L'impact de Django&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1658&amp;md5=c73d3ddc516344e6ba3588a3fd31a0dd" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/impact-de-django/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Comparaison des langages de balisage (markup) léger (lightweight) : Txt2tags, Pandoc, Docutils, AsciiDoc, Deplate, Stx2any, AFT, Markdown et Textile</title>
		<link>http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/</link>
		<comments>http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/#comments</comments>
		<pubDate>Sun, 14 Aug 2011 01:51:11 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AFT]]></category>
		<category><![CDATA[Almost Free Text]]></category>
		<category><![CDATA[AsciiDoc]]></category>
		<category><![CDATA[Balisage léger]]></category>
		<category><![CDATA[Bureautique]]></category>
		<category><![CDATA[Deplate]]></category>
		<category><![CDATA[Docutils]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Langage de balisage léger]]></category>
		<category><![CDATA[Langage de Markup]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[Markup]]></category>
		<category><![CDATA[Pandoc]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ReST]]></category>
		<category><![CDATA[ReStructuredText]]></category>
		<category><![CDATA[Stx2any]]></category>
		<category><![CDATA[Textile]]></category>
		<category><![CDATA[Txt2tags]]></category>
		<category><![CDATA[WYSIWYG]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=819</guid>
		<description><![CDATA[La bureautique est la principale utilisation de l'informatique depuis sa création. Pourtant, les outils majoritairement utilisés dans ce domaine, les logiciels de traitement de texte WYSIWYG comme LibreOffice et OpenOffice, laissent la majorité des informaticiens et des ergonomes très dubitatifs, voire totalement désespérés.

Ces logiciels ont en effet un nombre de défauts très important : ...]]></description>
			<content:encoded><![CDATA[<p>La bureautique est la principale utilisation de l&#8217;informatique depuis sa création. Pourtant, les outils majoritairement utilisés dans ce domaine, les logiciels de traitement de texte <a href="http://fr.wikipedia.org/wiki/What_you_see_is_what_you_get" target="_blank">WYSIWYG</a> comme <a href="http://fr.libreoffice.org/">LibreOffice</a> et <a href="http://fr.openoffice.org/" target="_blank">OpenOffice</a>, laissent la majorité des informaticiens et des ergonomes très dubitatifs, voire totalement désespérés.</p>
<p>Ces logiciels ont en effet un nombre de défauts très important : ils font se concentrer sur la forme et non sur le fond, leur résultat final ne correspond souvent pas à ce qui est affiché, ils sont incompatibles entre eux, ce sont d&#8217;énormes usines à gaz inutilisables sur de vieilles machines, ils ne fonctionnent qu&#8217;en mode graphique, etc. La seule manière rationnelle, efficace et interopérable de travailler sur un ordinateur est d&#8217;utiliser de simples fichiers textes, tous les documents étant donc modifiable dans n&#8217;importe quel éditeur de texte.</p>
<p>Il a donc fallu penser à une manière de donner ces instructions de mise en forme au sein du fichier texte lui-même, et c&#8217;est ainsi que sont apparus les langages de balisage (markup), dont les plus connus sont <a href="http://fr.wikipedia.org/wiki/Hypertext_Markup_Language" target="_blank">HTML</a> (inventé en 1991 par <a href="http://fr.wikipedia.org/wiki/Tim_Berners-Lee" target="_blank">Tim Berners-Lee</a>) et <a href="http://fr.wikipedia.org/wiki/LaTeX" target="_blank">LaTeX</a> (créé en 1985, et basé sur <a href="http://fr.wikipedia.org/wiki/TeX" target="_blank">TeX</a>, inventé par le grand <a href="http://fr.wikipedia.org/wiki/Donald_Knuth" target="_blank">Donald Knuth</a> en 1977), et dont la première grande figure fut <a href="http://fr.wikipedia.org/wiki/Roff" target="_blank">Roff</a>, un programme Unix historique développé à partir de 1961, et dont la version <a href="http://fr.wikipedia.org/wiki/GNU" target="_blank">GNU</a>, <a href="http://www.gnu.org/s/groff/" target="_blank">Groff</a>, est installée par défaut sur toutes les distributions Linux, puisqu&#8217;on l&#8217;utilise encore pour les pages de <a href="http://fr.wikipedia.org/wiki/Man_%28commande_Unix%29" target="_blank">man</a> des logiciels.</p>
<p>Pour mieux visualiser, prenons comme exemple la création d&#8217;une nouvelle section d&#8217;un document en man :</p>
<blockquote><p><code>.SH Nouvelle section en man<br />
</code></p></blockquote>
<p>en HTML :</p>
<blockquote><p><code>&lt;h1&gt;Nouvelle section en HTML&lt;/h1&gt;<br />
</code></p></blockquote>
<p>et en LaTeX :</p>
<blockquote><p><code>\section{Nouvelle section en LaTeX}<br />
</code></p></blockquote>
<p>Ces langages représentent une nette amélioration, mais ont tous un gros problème : ils sont gênants ! On ne retrouve plus aussi facilement son contenu au milieu de toutes ces balises supplémentaires, sans parler du fait que les syntaxes complexes ouvrent la voie à de nombreuses erreurs de compilation.</p>
<p>C&#8217;est en 1995 que l&#8217;on trouva la solution de ce problème, avec la création du premier langage <a href="http://fr.wikipedia.org/wiki/Wiki" target="_blank">Wiki</a>, dont le but principal était de permettre l&#8217;édition facile de pages web par tout un chacun, et dont l&#8217;utilisateur actuel le plus célèbre est l&#8217;encyclopédie libre <a href="http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal" target="_blank">Wikipédia</a>. S&#8217;il y a presque autant de <a href="http://www.wikicreole.org/wiki/Reasoning" target="_blank">syntaxes différentes</a> que de logiciels Wiki, elles ont toutes la caractéristique d&#8217;utiliser des caractères textuels simples et intuitifs pour donner les indications de formatage du texte.</p>
<p>Toujours le même exemple, une nouvelle section en <a href="http://www.mediawiki.org/wiki/MediaWiki/fr" target="_blank">MediaWiki</a> :</p>
<blockquote><p><code>= Nouvelle section Wiki =<br />
</code></p></blockquote>
<p>et une en <a href="http://docutils.sourceforge.net/mirror/setext.html" target="_blank">Setext</a> :</p>
<blockquote><p><code>Nouvelle section Setext<br />
=======================<br />
</code></p></blockquote>
<p>Mais pourquoi limiter ces langages de balisage léger à la seule génération de HTML ? Pourquoi ne pas utiliser la même syntaxe pour différentes cibles (appelées <em>backends</em>, <em>targets</em> ou <em>writers</em> selon les logiciels), de manière à obtenir aussi bien une page web en HTML, qu&#8217;un document en LaTeX pour l&#8217;impression, ou qu&#8217;une page de man pour un logiciel ? Ce sont les logiciels qui poursuivent ce but qui m&#8217;intéressent, ils constituent pour moi l&#8217;avenir de la bureautique informatique, et j&#8217;ai été amené à les comparer pour en choisir un dans lequel m&#8217;investir comme développeur.</p>
<p>Voici un tableau comparatif des meilleurs logiciels libres existants, avec comme information supplémentaire l&#8217;existence d&#8217;une cible texte brut, puisque je souhaitais me baser sur ce code pour programmer certaines de mes idées <a href="http://fr.wikipedia.org/wiki/Art_ASCII" target="_blank">ASCII art</a>.<br />
<h2 class="wp-table-reloaded-table-name">Les logiciels complets</h2>

<table id="wp-table-reloaded-id-4-no-1" class="wp-table-reloaded wp-table-reloaded-id-4">
<thead>
	<tr class="row-1 odd">
		<th class="column-1">Nom</th><th class="column-2">Langage de programmation</th><th class="column-3">Popularité du projet</th><th class="column-4"><a href="http://fr.wikipedia.org/wiki/Internationalisation_et_localisation">i18n</a></th><th class="column-5">Cible texte brut</th><th class="column-6">Licence</th>
	</tr>
</thead>
<tbody>
	<tr class="row-2 even">
		<td class="column-1"><a href="http://txt2tags.org/">Txt2tags</a></td><td class="column-2"><a href="http://www.python.org/">Python</a></td><td class="column-3"><a href="http://qa.debian.org/popcon.php?package=txt2tags">moyenne</a> + <a href="http://qa.debian.org/popcon.php?package=rednotebook">RedNotebook</a></td><td class="column-4">Oui + <a href="http://txt2tags.org/docs.html">doc</a></td><td class="column-5">Oui</td><td class="column-6"><a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU GPLv2</a></td>
	</tr>
	<tr class="row-3 odd">
		<td class="column-1"><a href="http://docutils.sourceforge.net/">Docutils</a></td><td class="column-2">Python</td><td class="column-3"><a href="http://qa.debian.org/popcon.php?package=python-docutils">forte</a> + <a href="http://qa.debian.org/popcon.php?package=sphinx">Sphinx</a></td><td class="column-4">Non</td><td class="column-5">Non</td><td class="column-6"><a href="http://docutils.sourceforge.net/docs/dev/policies.html#copyrights-and-licensing">Domaine public</a></td>
	</tr>
	<tr class="row-4 even">
		<td class="column-1"><a href="http://www.methods.co.nz/asciidoc/">AsciiDoc</a></td><td class="column-2">Python</td><td class="column-3"><a href="http://qa.debian.org/popcon.php?package=asciidoc">forte</a></td><td class="column-4">Non</td><td class="column-5">Dump de <a href="http://w3m.sourceforge.net/">w3m</a> ou de <a href="http://lynx.browser.org/">Lynx</a></td><td class="column-6">GNU GPLv2 ou suivante</td>
	</tr>
	<tr class="row-5 odd">
		<td class="column-1"><a href="http://deplate.sourceforge.net/">Deplate</a></td><td class="column-2"><a href="http://www.ruby-lang.org/fr/">Ruby</a></td><td class="column-3"><a href="http://qa.debian.org/popcon.php?package=deplate">faible</a></td><td class="column-4">Non</td><td class="column-5">Oui</td><td class="column-6">GNU GPLv2 ou suivante</td>
	</tr>
	<tr class="row-6 even">
		<td class="column-1"><a href="http://johnmacfarlane.net/pandoc/">Pandoc</a></td><td class="column-2"><a href="http://haskell.org/">Haskell</a></td><td class="column-3"><a href="http://qa.debian.org/popcon.php?package=pandoc">moyenne</a></td><td class="column-4">Non</td><td class="column-5">Oui</td><td class="column-6">GNU GPLv2 ou suivante</td>
	</tr>
	<tr class="row-7 odd">
		<td class="column-1"><a href="http://www.sange.fi/~atehwa/cgi-bin/piki.cgi/stx2any">Stx2any</a></td><td class="column-2"><a href="http://fr.wikipedia.org/wiki/Stream_Editor">Sed</a> et <a href="http://fr.wikipedia.org/wiki/M4_%28langage%29">m4</a></td><td class="column-3"><a href="http://qa.debian.org/popcon.php?package=stx2any">faible</a></td><td class="column-4">Non</td><td class="column-5">Dump de w3m</td><td class="column-6"><a href="http://sange.fi/~atehwa/Stx/LICENSE">Licence copyleftée personnalisée</a></td>
	</tr>
	<tr class="row-8 even">
		<td class="column-1"><a href="http://www.maplefish.com/todd/aft.html">AFT</a></td><td class="column-2"><a href="http://www.perl.org/">Perl</a></td><td class="column-3"><a href="http://qa.debian.org/popcon.php?package=aft">faible</a></td><td class="column-4">Non</td><td class="column-5">Non</td><td class="column-6"><a href="http://www.disobey.com/amphetadesk/LICENSE">Clarified Artistic License</a></td>
	</tr>
</tbody>
</table>
<br />
Exceptés Docutils et AFT (Almost Free Text), tous les logiciels semblaient au premier abord proposer une cible texte. Mais en fait c&#8217;est un peu un trompe l&#8217;œil, car deux d&#8217;entre eux, AsciiDoc et Stx2any, se contentent de dumper un navigateur web en mode texte (w3m ou Lynx) du résultat généré par leur cible HTML. Il n&#8217;y avait donc pas dans ces cas de base de code que je pouvais espérer améliorer.</p>
<p>J&#8217;ai mis dans le comparatif stx2any et AFT codés respectivement en m4 et en Perl, de manière à proposer un large éventail de langages de programmation, mais ces logiciels sont à la fois moins utilisés et dotés de moins de fonctionnalités que les autres. En étudiant les différents logiciels disponibles, je me suis rendu compte que, par chance pour moi, beaucoup étaient codés en Python (3 sur 7 au total, mais surtout 3 sur les 5 vraiment intéressants). Ce n&#8217;est d&#8217;ailleurs pas la première fois que je constate, en cherchant à sélectionner des logiciels libres, que ceux codés en python sont à la fois les plus nombreux et les meilleurs.</p>
<p>Les cinq logiciels restants sont vraiment excellents, et constituent tous un bon choix. Trois d&#8217;entre eux, Docutils, Deplate et Pandoc, ont un design évolué, avec une <a href="http://fr.wikipedia.org/wiki/Automate_fini" target="_blank">machine à états finis</a> pour laquelle on peut écrire de nouveaux <em>readers</em> et <em>writers</em> de manière parfaitement propre. Cependant, malgré leurs grandes qualités, Deplate est un projet trop confidentiel (ainsi il n&#8217;est incompréhensiblement pas présent parmi les pourtant si nombreux paquets Debian), et je ne me sentais pas à la hauteur pour m&#8217;investir dans un projet comme Pandoc, totalement écrit en Haskell, qui est un langage de programmation complexe que j&#8217;aimerais beaucoup utiliser, mais où ma compétence est encore trop limitée.</p>
<p>Il fallait donc que j&#8217;approfondisse ma réflexion sur les logiciels en Python :<br />
<h2 class="wp-table-reloaded-table-name">Choix en Python</h2>

<table id="wp-table-reloaded-id-3-no-1" class="wp-table-reloaded wp-table-reloaded-id-3">
<thead>
	<tr class="row-1 odd">
		<th class="column-1">Nom</th><th class="column-2">Cibles principales</th><th class="column-3">Cible texte brut</th>
	</tr>
</thead>
<tbody>
	<tr class="row-2 even">
		<td class="column-1"><a href="http://txt2tags.org/">Txt2tags</a></td><td class="column-2">HTML, Latex et syntaxes Wiki</td><td class="column-3">Oui</td>
	</tr>
	<tr class="row-3 odd">
		<td class="column-1"><a href="http://docutils.sourceforge.net/">Docutils</a></td><td class="column-2">HTML et Latex</td><td class="column-3">Non </td>
	</tr>
	<tr class="row-4 even">
		<td class="column-1"><a href="http://www.methods.co.nz/asciidoc/">AsciiDoc</a></td><td class="column-2">HTML et DocBook</td><td class="column-3">Dump</td>
	</tr>
	<tr class="row-5 odd">
		<td class="column-1"><a href="http://www.freewisdom.org/projects/python-markdown/">Markdown</a></td><td class="column-2">HTML</td><td class="column-3">Non</td>
	</tr>
	<tr class="row-6 even">
		<td class="column-1"><a href="http://loopcore.com/python-textile/">Textile</a></td><td class="column-2">HTML</td><td class="column-3">Non</td>
	</tr>
</tbody>
</table>
<br />
J&#8217;ai rajouté dans ce comparatif Markdown et Textile, puisqu&#8217;ils ont chacun une implémentation en Python, mais ne générant que du HTML, ils ne m&#8217;intéressaient pas vraiment. AsciiDoc et Txt2tags ont un peu la même architecture, avec un gros fichier principal faisant tout le travail, que l&#8217;on peut configurer, respectivement avec un fichier .conf et <a href="http://txt2tags.org/new-target.html" target="_blank">deux dictionnaires Python (un pour les <em>Tags</em> et l&#8217;autre pour les <em>Rules</em>)</a>, pour créer de nouvelles cibles. AsciiDoc et Txt2tags sont donc plus aisés à prendre en main et à modifier rapidement que Docutils, qui est une très belle et très bien architecturée machine à états objet, mais aussi plus difficile à appréhender.</p>
<p>De plus, comme je désapprouvais totalement la politique de licence domaine publique de Docutils, il ne me restait plus qu&#8217;à faire mon choix entre Txt2tags et AsciiDoc. C&#8217;est principalement l&#8217;orientation très DocBook (un format ne m&#8217;intéressant personnellement pas du tout) d&#8217;AsciiDoc, et d&#8217;autres détails, comme la localisation en de nombreuses langues de Txt2tags et sa plus grande simplicité, qui m&#8217;ont finalement fait choisir Txt2tags.</p>
<p>Ce choix est confirmé par une étude plus avancée des différentes syntaxes. Ainsi alors que la syntaxe reST de Docutils ne dispose que de :</p>
<blockquote><p><code>*italique* et **gras**<br />
</code></p></blockquote>
<p>Txt2tags est beaucoup plus riche :</p>
<blockquote><p><code>//italique// **gras** __souligné__ et --barré--<br />
</code></p></blockquote>
<p>Le codage visuel est bien meilleur, et le compréhension instantanée avec la syntaxe de Txt2tags, puisque les slashs donnent l&#8217;impression penchée de l&#8217;italique, les étoiles imitent la surcharge du gras, les underscores donnent l&#8217;impression de soulignement, et les moins apparaissent comme une barre. De plus, l&#8217;utilisation généralisée des caractères de balisage en doubles, permet de lever à peu de frais un maximum d&#8217;ambiguïtés syntaxiques.</p>
<p>Par exemple une phrase aussi simple que celle contenue dans le fichier d&#8217;exemple de Txt2tags :</p>
<blockquote><p><code>We use double *, /, - and _ to represent **bold**, //italic//, --strike-- and __underline__.</code></p></blockquote>
<p>et qui ne pose aucun problème :</p>
<p style="text-align: center;"><a href="http://fgallaire.flext.net/wp-content/uploads/2011/08/txt2tags.png"><img class="aligncenter size-full wp-image-1599" title="txt2tags" src="http://fgallaire.flext.net/wp-content/uploads/2011/08/txt2tags.png" alt="" width="476" height="25" /></a></p>
<p>est en fait déjà trop ambigüe en reST, puisque :</p>
<blockquote><p><code>We use double *, /, - and _ to represent **bold**, *italic*, strike and underline.</code></p></blockquote>
<p>donnera :</p>
<p style="text-align: center;"><a href="http://fgallaire.flext.net/wp-content/uploads/2011/08/rst.png"><img class="aligncenter size-full wp-image-1600" title="rst" src="http://fgallaire.flext.net/wp-content/uploads/2011/08/rst.png" alt="" width="484" height="23" /></a></p>
<p>De manière générale, la syntaxe reST est souvent trop lourde. Par exemple dans le cas de l&#8217;insertion d&#8217;une image servant de lien :</p>
<blockquote><p><code>.. image:: picture.png<br />
:target: http://fgallaire.flext.net<br />
</code></p></blockquote>
<p>que l&#8217;on peut comparer avec le beaucoup plus simple Txt2tags :</p>
<blockquote><p><code>[[picture.png] http://fgallaire.flext.net]<br />
</code></p></blockquote>
<p>On remarque bien sûr ici que la syntaxe reST offre sûrement plein d&#8217;autres options que la simple <code>:target:</code>, et qu&#8217;elle est donc plus puissante que celle de Txt2tags. Cependant, mon avis est que la pénalité de lourdeur est toujours présente, alors qu&#8217;elle n&#8217;est utile que dans peut-être 1% des cas.</p>
<p>Voici maintenant un comparatif des logiciels disponibles par syntaxe :<br />
<h2 class="wp-table-reloaded-table-name">Classement par syntaxe</h2>

<table id="wp-table-reloaded-id-8-no-1" class="wp-table-reloaded wp-table-reloaded-id-8">
<thead>
	<tr class="row-1 odd">
		<th class="column-1">Usage</th><th class="column-2">Txt2tags</th><th class="column-3">AsciiDoc</th><th class="column-4">reStructuredText</th><th class="column-5">Markdown</th>
	</tr>
</thead>
<tbody>
	<tr class="row-2 even">
		<td class="column-1">Bureautique</td><td class="column-2">Txt2tags</td><td class="column-3">AsciiDoc</td><td class="column-4">Docutils<br />
Pandoc</td><td class="column-5">Pandoc</td>
	</tr>
	<tr class="row-3 odd">
		<td class="column-1">Web serveur</td><td class="column-2">Txt2tags (Python)</td><td class="column-3">AsciiDoc (Python)</td><td class="column-4">Docutils (Python)</td><td class="column-5"><a href="http://daringfireball.net/projects/markdown/">Perl</a><br />
<a href="http://www.freewisdom.org/projects/python-markdown/">Python</a><br />
<a href="http://deveiate.org/projects/BlueCloth">Ruby</a><br />
<a href="http://michelf.com/projects/php-markdown/">PHP</a></td>
	</tr>
	<tr class="row-4 even">
		<td class="column-1">Web client</td><td class="column-2"></td><td class="column-3"></td><td class="column-4"></td><td class="column-5"><a href="http://www.showdown.im/">JavaScript</a></td>
	</tr>
</tbody>
</table>
<br />
Leur implémentation en Python permet à Txt2tags, reST (par Docutils) et AsciiDoc d&#8217;être utilisables à la fois comme logiciels de bureautique multiplateforme (Linux, Mac OS X, Windows et *BSD) et pour le web côté serveur. En face, Markdown est représenté par une armada d&#8217;implémentations dans tous les langages utilisés sur le web côté serveur, et aussi en JavaScript côté client pour des prévisualisation efficace sans <a href="http://fr.wikipedia.org/wiki/Ajax_%28informatique%29" target="_blank">Ajax</a>, mais seul Pandoc, qui n&#8217;est pas si facile à compiler sur toutes les plateformes, propose autre chose qu&#8217;un rendu en HTML.</p>
<p>Je vais bien sûr continuer à travailler sur le logiciel Txt2tags, mais une implémentation de la syntaxe Txt2tags en JavaScript pour un rendu live sur le net, ainsi que des <em>readers</em> Pandoc, car j&#8217;ai vraiment envie de programmer en Haskell, et Docutils, pour pouvoir bénéficier ensuite du sublime <a href="http://sphinx.pocoo.org/" target="_blank">Sphinx</a>, sont des projets qui me motivent de plus en plus.</p>
<p>Enfin, je suis toujours un peu nostalgique devant ce screenshot, parce que c&#8217;est en le voyant, avec en haut à gauche le fichier avec les balises, et en bas à droite celui avec le résultat texte brut, que j&#8217;ai pris conscience que Txt2tags faisait bien ce que j&#8217;espérais, et que comme en plus il était en Python, ce serait probablement le logiciel auquel j&#8217;allais contribuer !</p>
<p style="text-align: center;"><a href="http://txt2tags.org/img/all-targets.png"><img class="aligncenter" title="Txt2tags targets" src="http://txt2tags.org/img/all-targets.png" alt="" width="503" height="373" /></a></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/&via=fgallaire&text=Comparaison des langages de balisage (markup) léger (lightweight) : Txt2tags, Pandoc, Docutils, AsciiDoc, Deplate, Stx2any, AFT, Markdown et Textile&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=819&amp;md5=b9ec3936e1ee09d5b36cd1765d57dbfb" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Compter récursivement le nombre de lignes avec wc (Word Count)</title>
		<link>http://fgallaire.flext.net/compter-recursivement-nombre-lignes-avec-wc-recursif/</link>
		<comments>http://fgallaire.flext.net/compter-recursivement-nombre-lignes-avec-wc-recursif/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 20:23:19 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Commandes Unix]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[wc]]></category>
		<category><![CDATA[Word Count]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1455</guid>
		<description><![CDATA[Comme j'ai passé beaucoup de temps à programmer sur Txt2tags en juin et en juillet, j'ai été amené à comparer avec mon ami Carl le nombre de lignes de code de nos projets libres respectifs. Or, contrairement à grep, wc ne fournit pas d'option -r pour activer la récursivité.

Pour pallier cela, l'utilisation des classiques ...]]></description>
			<content:encoded><![CDATA[<p>Comme j&#8217;ai passé beaucoup de temps à programmer sur <a href="http://txt2tags.org/">Txt2tags</a> en juin et en juillet, j&#8217;ai été amené à comparer avec <em>mon ami Carl</em> le nombre de lignes de code de nos projets libres respectifs. Or, contrairement à <code><a href="http://fr.wikipedia.org/wiki/Grep">grep</a></code>, <code><a href="http://fr.wikipedia.org/wiki/Wc_%28Unix%29">wc</a></code> ne fournit pas d&#8217;option <code>-r</code> pour activer la récursivité.</p>
<p>Pour pallier cela, l&#8217;utilisation des classiques commandes Unix <code><a href="http://fr.wikipedia.org/wiki/Find">find</a></code> et <code><a href="http://en.wikipedia.org/wiki/Xargs">xargs</a></code> est de rigueur. Ainsi, pour avoir le nombre total de lignes de tous les fichiers du répertoire faites :</p>
<blockquote><p><code>$ find . -type f | xargs  wc -l</code></p></blockquote>
<p>Si, comme moi, seuls les fichiers python vous intéressent, vous pouvez ajouter un grep au milieu qui filtrera tous les noms de fichier se finissant par <code>.py</code> :</p>
<blockquote><p><code>$ find . -type f | grep .py$ | xargs  wc -l</code></p></blockquote>
<p>Ou, encore plus simple, vous pouvez utiliser l&#8217;option <code>-name</code> de <code>find</code> :</p>
<blockquote><p><code>$ find . -name "*.py" | xargs  wc -l</code></p></blockquote>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/compter-recursivement-nombre-lignes-avec-wc-recursif/&via=fgallaire&text=Compter récursivement le nombre de lignes avec wc (Word Count)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1455&amp;md5=12aa9e3c1555fd4c840ef2067040a6b7" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/compter-recursivement-nombre-lignes-avec-wc-recursif/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Et le meilleur framework web Python est&#8230; Django !</title>
		<link>http://fgallaire.flext.net/meilleur-framework-web-python-django/</link>
		<comments>http://fgallaire.flext.net/meilleur-framework-web-python-django/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 06:48:43 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Django-nonrel]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Framework python]]></category>
		<category><![CDATA[Framework web]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Pylons]]></category>
		<category><![CDATA[Pyramid]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Zope]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1263</guid>
		<description><![CDATA[On  observe depuis quelques temps un phénomène de "consolidation" au niveau de beaucoup de logiciels libres. En effet, le modèle du libre est par essence de permettre à chacun de faire se qu'il veut, et donc d'expérimenter et d'innover. Cette dynamique est encore plus sensible quand il s'agit de technologies nouvelles. Mais une fois ...]]></description>
			<content:encoded><![CDATA[<p>On  observe depuis quelques temps un phénomène de &#8220;consolidation&#8221; au niveau de beaucoup de logiciels libres. En effet, le modèle du libre est par essence de permettre à chacun de faire se qu&#8217;il veut, et donc d&#8217;expérimenter et d&#8217;innover. Cette dynamique est encore plus sensible quand il s&#8217;agit de technologies nouvelles. Mais une fois cette phase d&#8217;expérimentation passée, il faut aussi en tirer des conclusions, et se rassembler pour atteindre une masse critique d&#8217;utilisateurs et de développeurs, une communauté, qui viabilise le projet sur la durée.</p>
<p>Ainsi <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a> a été dès 2004 le grand précurseur des frameworks web de nouvelle génération. Mais même dans le monde Ruby des projets concurrents sont apparus, dont le plus important fut <a href="http://www.merbivore.com/" target="_blank">Merb</a>, un framework plus léger et plus modulaire. En décembre 2008, <a href="http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3" target="_blank">Merb et RoR ont fusionné</a> pour donner Ruby on Rails 3, et ainsi rassembler les énergies et les talents.</p>
<p>La situation dans le monde Python, bien que beaucoup plus complexe, a <a href="http://blog.ianbicking.org/2007/08/21/the-shrinking-python-web-framework-world/">pris le même chemin</a>. En effet, il existait depuis longtemps un grand nombre de technologies web en Python, aussi bien des serveurs d&#8217;application comme <a href="http://www.cherrypy.org/" target="_blank">CherryPy</a> ou <a href="http://pythonpaste.org/" target="_blank">Paste</a>, que des langages de templates comme <a href="http://www.myghty.org/" target="_blank">Myghty</a>, <a href="http://www.modpython.org/live/current/doc-html/pyapi-psp.html" target="_blank">Python Server Pages</a> ou <a href="http://www.cheetahtemplate.org/" target="_blank">Cheetah</a>. On ne peut que constater cette <a href="http://wiki.python.org/moin/WebFrameworks" target="_blank">incroyable diversité</a> sur le site officiel de Python. Une blague classique était de dire que Python était un langage tellement simple que chaque développeur pouvait écrire son propre framework. Mais aucun ne proposait un ensemble cohérent et tout intégré&#8230; aucun sauf <a href="http://zope2.zope.org/" target="_blank">Zope 2</a>, mais qui lui avait comme défaut principal d&#8217;être trop intégré !</p>
<p>Ainsi, si sa <a href="http://www.zodb.org/" target="_blank">ZODB</a>, une vraie base de données orientée objet, était en avance techniquement sur un ORM (Object-Relationnal Mapping), c&#8217;est-à-dire une simple surcouche pour donner une apparence objet à une base de données relationnelle (SQL), elle a néanmoins fait fuire la majorité des développeurs, qui avaient comme contrainte non négociable de s&#8217;interfacer avec des bases de données <a href="http://www.mysql.fr/" target="_blank">MySQL</a>, <a href="http://www.postgresql.org/" target="_blank">PostgreSQL</a> ou <a href="http://fr.wikipedia.org/wiki/Oracle_Database" target="_blank">Oracle</a> préexistantes. De plus Zope 2 est connu pour sa courbe d&#8217;apprentissage en &#8220;Z&#8221; (<em>Z-shaped learning curve</em>), qui vous donne d&#8217;abord l&#8217;impression de régresser et nécessite beaucoup de temps et d&#8217;efforts avant d&#8217;obtenir un premier résultat intéressant, ainsi que pour mériter le fameux qualificatif &#8220;d&#8217;usine à gaz logicielle&#8221;.</p>
<p>En janvier 2006, Stéphane Fermigier, président fondateur de <a href="http://www.nuxeo.com/" target="_blank">Nuxeo</a>, <a href="http://blogs.nuxeo.com/fermigier/2006/01/updated-megaframeworks.html" target="_blank">essayait d&#8217;y voir plus clair</a> grâce à <a href="http://blogs.nuxeo.com/sections/blogs/fermigier/2006_01_22_updated-megaframeworks/downloadFile/attachedFile_1_f0/megaframeworks-v2.png" target="_blank">ce schéma</a> :</p>
<p><a href="http://blogs.nuxeo.com/sections/blogs/fermigier/2006_01_22_updated-megaframeworks/downloadFile/attachedFile_1_f0/megaframeworks-v2.png"><img class="alignnone" title="Frameworks web Python" src="http://blogs.nuxeo.com/sections/blogs/fermigier/2006_01_22_updated-megaframeworks/downloadFile/attachedFile_1_f0/megaframeworks-v2.png" alt="" width="542" height="230" /></a></p>
<p>On peut identifier cinq concurrents directs, de type framework web complet : <a href="http://cps-cms.org/sections/index-en" target="_blank">CPS</a>, <a href="https://www.djangoproject.com/" target="_blank">Django</a>, <a href="http://turbogears.org/" target="_blank">TurboGears</a>, Subway et <a href="http://pylonsproject.org/projects/pylons-framework/about" target="_blank">Pylons</a>, ainsi qu&#8217;un serveur d&#8217;application moderne orienté composant, n&#8217;attendant que de servir de base pour de nouveaux frameworks : <a href="http://wiki.zope.org/zope3/Zope3Wiki" target="_blank">Zope 3</a>.</p>
<p>Que sont-ils tous devenus ? Il y a d&#8217;abord ceux qui sont morts, Subway, de manière classique dans le monde du libre, par désintérêt (des développeurs et/ou des utilisateurs), et CPS, de manière plus originale, en se faisant <a href="http://fr.wikipedia.org/wiki/Seppuku" target="_blank">&#8220;seppuku&#8221;</a> (d&#8217;un point de vue pythonique), en décidant de changer de base technologique, <a href="http://linuxfr.org/news/nuxeo-cps-tournera-sous-java" target="_blank">passant de Zope 2 et Python à J2EE et Java</a>.</p>
<p>Restaient donc trois frameworks, Django, un ensemble complet et monolithique d&#8217;un côté, et TurboGears et Pylons de l&#8217;autre, qui essayaient quant à eux de réutiliser au maximum les nombreux projets python existants. Ainsi, Django a souvent été <a href="http://www.b-list.org/weblog/2006/oct/21/django-and-nih/" target="_blank">accusé de souffrir du syndrome NIH</a> (<a href="http://en.wikipedia.org/wiki/Not_Invented_Here" target="_blank">Not Invented Here</a>), voir <a href="http://www.youtube.com/watch?v=fipFKyW2FA4" target="_blank">l&#8217;intéressante conférence de Mark Ramm</a> (principal développeur de TurboGears) sur le sujet lors du DjangoCon 2008. Il y eu donc naturellement un rapprochement entre TurboGears et Pylons, et en juin 2007 Mark Ramm annonça que le futur <a href="http://compoundthinking.com/blog/index.php/2007/06/27/turbogears-11-and-beyond/" target="_blank">TurboGears 2 serait basé sur Pylons</a>. au <a href="http://www.cherrypy.org/wiki/CherryPyAndPaste" target="_blank">grand désarroi de CherryPy</a>.</p>
<p>D&#8217;un autre côté apparurent plusieurs frameworks, dont <a href="http://grok.zope.org/" target="_blank">Grok</a> et <a href="http://bfg.repoze.org/" target="_blank">repoze.bfg</a>, prenant comme base technologique Zope 3, mais en essayant de le rendre plus facile à utiliser et à configurer, par exemple en vous préservant de trop nombreux fichiers <a href="http://worldcookery.com/files/ploneconf05-five/step2.html" target="_blank">ZCML</a>. Et voilà qu&#8217;en novembre 2010, <a href="http://groups.google.com/group/pylons-discuss/browse_thread/thread/97faa18a3429a28e#" target="_blank">Pylons et repoze.bfg fusionnent</a> pour donner naissance à un nouveau framework soutenu par le <a href="http://pylonsproject.org/" target="_blank">Projet Pylons</a> et appelé <a href="http://pylonsproject.org/projects/pyramid/about" target="_blank">Pyramid</a>, qui se base sur le code source de repoze.bfg et son architecture à composant, Pylons ne pouvant plus évoluer à cause d&#8217;un <a href="http://be.groovie.org/post/1558848023/notes-on-the-pylons-repoze-bfg-merger" target="_blank">problème de design</a>. Enfin, en décembre, c&#8217;est <a href="http://compoundthinking.com/blog/index.php/2010/12/28/turbogears-joins-the-pylons-project/" target="_blank">TurboGears qui fusionne avec Pyramid</a>.</p>
<p><a href="http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2011-state-of-pylons-turbogears-2-repoze-bfg-4896763" target="_blank">Trois frameworks qui ne font donc plus qu&#8217;un</a>, espérant qu&#8217;en additionnant toutes leurs forces ils pourront constituer un adversaire crédible à Django. Mais un survol du <a href="http://docs.pylonsproject.org/docs/pyramid_quick_tutorial.html" target="_blank">tutoriel rapide</a> m&#8217;a fait froid dans le dos : du SQL à la main (c&#8217;est bien la dernière chose que je souhaitait revivre) et des décorateurs pour spécifier le langage de template pour chaque view !? Comme en plus je ne suis pas convaincu que l&#8217;architecture à composant enthousiasme grand monde, j&#8217;ai de gros doutes sur l&#8217;avenir de Pyramid.</p>
<p>On en est donc arrivé à un point où les concurrents de Django ont soit disparu, soit fusionné. Alors qu&#8217;il a lui continué son chemin sans trop d&#8217;embûches, en étant en particulier extrêmement stable technologiquement. Imaginez le cauchemard du développeur TurboGears, qui a d&#8217;abord appris <a href="http://www.kid-templating.org/" target="_blank">Kid</a>, CherryPy et <a href="http://www.sqlobject.org/" target="_blank">SQLObject</a> dans la version 1, puis <a href="http://genshi.edgewall.org/" target="_blank">Genshi</a>, Paste et <a href="http://www.sqlalchemy.org/" target="_blank">SQLAlchemy</a> dans la version 2, et qui doit maintenant ouvrir son esprit à l&#8217;architecture composant de Pyramid ! Les développeurs Django n&#8217;ont eux jamais eu à vivre ce genre de choses, et ce à mon avis grâce aux excellents choix de design logiciel faits dès le départ :</p>
<ol>
<li>Le langage de template de Django est devenu un standard, <a href="http://code.google.com/intl/fr/appengine/docs/python/gettingstarted/templates.html" target="_blank">utilisé par le Google App Engine</a> et repris dans de nombreuses autres implémentations comme <a href="http://jinja.pocoo.org/" target="_blank">Jinja</a> et le langage de template de <a href="http://www.tornadoweb.org/documentation/template.html" target="_blank">Tornado</a> en Python, <a href="http://code.google.com/p/erlydtl/" target="_blank">ErlyDTL</a> en Erlang, <a href="http://www.twig-project.org/" target="_blank">Twig</a> (le langage de template de <a href="http://symfony.com/doc/current/book/templating.html" target="_blank">Symfony2</a>) et <a href="https://github.com/speedmax/h2o-php/wiki/" target="_blank">H2O</a> en PHP, <a href="http://www.liquidmarkup.org/" target="_blank">Liquid</a> en Ruby, <a href="http://www.dotiac.com" target="_blank">Dotiac</a> en Perl, <a href="http://www.jangod.org/" target="_blank">Jangod</a> en Java, <a href="http://ndjango.org" target="_blank">NDjango</a> en F#, ou encore <a href="https://github.com/simonw/djangode" target="_blank">djangode</a> de <a href="http://nodejs.org/" target="_blank">node.js</a> et le langage de template de <a href="http://dojotoolkit.org/reference-guide/dojox/dtl.html#dojox-dtl" target="_blank">Dojo</a> en JavaScript. Cette réussite est principalement due à la simplicité de ce langage de template qui est <a href="http://pydanny.blogspot.com/2010/12/stupid-template-languages.html" target="_blank">&#8220;stupide&#8221;</a>, ce qui force à mettre la logique de traitement hors des templates, et<strong> <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=146647" target="_blank">n</a></strong><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=146647" target="_blank">&#8216;a <strong>pas</strong> une  syntaxe XML</a>, ce qui le rend utilisable facilement par des humains. Enfin, en janvier 2006 c&#8217;est le créateur de Python, <a href="http://www.python.org/~guido/" target="_blank">Guido Van Rossum</a> en personne, <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=146606" target="_blank">qui le consacre</a> comme son choix personnel.</li>
<li>Beaucoup décriaient l&#8217;ORM de Django, qu&#8217;aucun autre projet n&#8217;utilisait, et conseillaient l&#8217;utilisation de SQLobject -un changement-&#8230; <a href="http://groups.google.com/group/django-developers/browse_thread/thread/75b92b43dee0ebcb?fwc=1" target="_blank">puis de SQLAlchemy</a> -un deuxième changement-, juste pour faire comme les autres frameworks Python&#8230; Puis les bases de données <a href="http://fr.wikipedia.org/wiki/NoSQL" target="_blank">NoSQL</a> sont arrivées, que ni <strong>SQL</strong>object, ni <strong>SQL</strong>Alchemy n&#8217;ont vocation de supporter (ce n&#8217;est plus du SQL !), alors que l&#8217;ORM de Django <a href="https://code.djangoproject.com/wiki/NoSqlSupport" target="_blank">s&#8217;adapte elle à la situation</a> grâce au projet <a href="http://www.allbuttonspressed.com/projects/django-nonrel" target="_blank">Django-nonrel</a>, qui sera je l&#8217;espère bientôt intégré dans la branche principale.</li>
<li>Le choix standard du langage de template et de l&#8217;ORM a permis et encouragé l&#8217;émergence d&#8217;un écosystème de <a href="http://djangopackages.com/" target="_blank">nombreuses applications</a>, toutes compatibles entre elles, et de <a href="http://djangosnippets.org/" target="_blank">snippets</a> permettant aux développeurs de ne pas sans cesse réinventer la roue logicielle. De plus ils peuvent se baser sur l&#8217;un des nombreux <a href="http://www.djangosites.org/with-source/">sites libres</a> disponibles pour créer les leurs. À l&#8217;opposé d&#8217;un Pylons qui laissait la liberté de ces choix, et qui n&#8217;a donc jamais pu bénéficier d&#8217;une dynamique comparable, Django est devenu une plateforme de développement autonome et incroyablement riche.</li>
</ol>
<p>Ce développement cohérent et linéaire depuis 2005 a permis la constitution d&#8217;un large communauté et rendu Django suffisamment crédible et répandu en entreprise pour que l&#8217;on puisse trouver assez facilement <a href="https://code.djangoproject.com/wiki/DjangoJobs" target="_blank">un travail</a>, <a href="http://www.djangojobs.org/" target="_blank">un job</a>, <a href="http://djangozen.com/jobs/" target="_blank">un emploi</a>, ou encore un <a href="http://www.djangohire.com/a/jbb/find-jobs" target="_blank">autre travail</a> ou un <a href="http://djangogigs.com/" target="_blank">autre job</a>, de développeur rémunéré à plein temps pour travailler sur une technologie libre qu&#8217;il aime (je n&#8217;ai pas dit faire du libre), ce qui est encore trop rare.</p>
<p>Alors bien sûr vous pouvez aussi utiliser <a href="http://www.web2py.com/" target="_blank">web2py</a>, Tornado pour faire de l&#8217;asynchrone, un des <a href="http://fewagainstmany.com/blog/python-micro-frameworks-are-all-the-rage" target="_blank">nombreux microframeworks</a>, ou encore <a href="http://pythonpaste.org/webob/do-it-yourself.html" target="_blank">créer le vôtre avec WebOb</a>, si vous êtes bons, vous ferez d&#8217;excellentes choses. Mais LE meilleur framework web Python, c&#8217;est Django !</p>
<p><strong>Mise à jour du 28 juillet 2011</strong> : J&#8217;ai rajouté trois liens dans l&#8217;article. De plus, <a href="http://www.racinet.fr/">Georges Racinet</a> m&#8217;a gentiment contacté pour me faire part du fait qu&#8217;il est mainteneur de CPS depuis trois ans, et que si le projet a &#8220;une communauté restreinte et peu de visibilité, il n&#8217;est pas mort et il y a du dév actif dessus&#8221;.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/meilleur-framework-web-python-django/&via=fgallaire&text=Et le meilleur framework web Python est... Django !&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1263&amp;md5=fc17194e92a964eaa39efa0d5a2b04ce" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/meilleur-framework-web-python-django/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Head et tail de liste en Python 3</title>
		<link>http://fgallaire.flext.net/head-tail-python-3/</link>
		<comments>http://fgallaire.flext.net/head-tail-python-3/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 06:26:26 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Programmation fonctionnelle]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Python 3]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1185</guid>
		<description><![CDATA[Bien que Python ne soit pas un langage de programmation fonctionnelle, il incorpore un certain nombre de fonctionnalités typiques de ces langages. Ainsi les fonctions anonymes lambda, la compréhension de liste, ou encore les fonctions built-in map(), filter() et reduce() (cette dernière ayant été supprimée dans Python 3).

La programmation fonctionnelle est caractérisée par une ...]]></description>
			<content:encoded><![CDATA[<p>Bien que Python ne soit pas un langage de programmation fonctionnelle, il incorpore un certain nombre de fonctionnalités typiques de ces langages. Ainsi les fonctions anonymes <code>lambda</code>, la <a href="http://fr.wikipedia.org/wiki/Liste_en_compr%C3%A9hension" target="_blank">compréhension de liste</a>, ou encore les fonctions built-in <code>map()</code>, <code>filter()</code> et <code>reduce()</code> (cette dernière ayant été <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=98196" target="_blank">supprimée dans Python 3</a>).</p>
<p>La programmation fonctionnelle est caractérisée par une utilisation intensive des listes, et en particulier par de nombreuses opérations récursives sur ces dernières. On est donc souvent amené à vouloir récupérer le premier élément d&#8217;une liste, sa tête ou <strong>head</strong>, et l&#8217;ensemble des éléments restants, sa queue ou <strong>tail</strong>. Ce qui s&#8217;écrit donc trivialement avec la fonction <code>f()</code> retournant une liste :</p>
<blockquote><p><code>head, tail = f()[0], f()[1:]</code></p></blockquote>
<p>Le premier problème ici est le double appel de la fonction <code>f()</code>, que l&#8217;on peut facilement corriger grâce à l&#8217;utilisation d&#8217;une variable intermédiaire <code>result</code> :</p>
<blockquote><p><code>result = f()</code><br />
<code>head, tail = result[0], result[1:]</code></p></blockquote>
<p>Le second problème est la lourdeur syntaxique de l&#8217;ensemble, avec la variable intermédiaire et le double usage du <code>[]</code> (le <code>__getitem__</code> des listes en Python). On aimerait bien à la place avoir une syntaxe plus adaptée, c&#8217;est-à-dire plus proche de celles utilisées par les langages de programmation fonctionnelle, comme par exemple <a href="http://fr.wikipedia.org/wiki/Erlang_%28langage%29" target="_blank">Erlang</a> :</p>
<blockquote><p><code>[Head|Tail] = Result</code></p></blockquote>
<p>Et comme toujours avec Python, le langage se bonifie grâce à une PEP (<a href="http://www.python.org/dev/peps/pep-0001/" target="_blank">Python Enhancement Proposal</a>), en l&#8217;occurence la <a href="http://www.python.org/dev/peps/pep-3132/" target="_blank">PEP 3132</a> intitulée E<em>xtended Iterable Unpacking</em>. Ainsi, depuis Python 3.0, on peut utiliser une nouvelle syntaxe qui reprend celle des star-args (*args) des fonctions Python :</p>
<blockquote><p><code>head, *tail = result</code></p></blockquote>
<p>Ceci se teste facilement dans un shell Python 3 :</p>
<blockquote><p><code>&gt;&gt;&gt; result = [1, 2, 3, 4]</code><br />
<code>&gt;&gt;&gt; head, *tail = result</code><br />
<code>&gt;&gt;&gt; head</code><br />
<code>&gt;&gt;&gt; 1</code><br />
<code>&gt;&gt;&gt; tail</code><br />
<code>&gt;&gt;&gt; [2, 3, 4]</code></p></blockquote>
<p>On a donc maintenant une syntaxe tout à fait satisfaisante, très lisible et facilitant un style de programmation fonctionnel. Ce qui est encore plus intéressant avec cette notation, c&#8217;est qu&#8217;elle ne se limite pas au couple <code>head</code> et <code>tail</code>, et peut ainsi être déclinée de bien des manières tout à fait intéressantes comme par exemple :</p>
<blockquote><p><code>&gt;&gt;&gt; result = [1, 2, 3, 4]</code><br />
<code>&gt;&gt;&gt; head, *body, tail = result</code><br />
<code>&gt;&gt;&gt; head</code><br />
<code>&gt;&gt;&gt; 1</code><br />
<code>&gt;&gt;&gt; body</code><br />
<code>&gt;&gt;&gt; [2, 3]</code><br />
<code>&gt;&gt;&gt; tail</code><br />
<code>&gt;&gt;&gt; 4</code></p></blockquote>
<p>Python 3 est sorti depuis plus de deux ans et, sans être révolutionnaire, il apporte de <a href="http://docs.python.org/release/3.0/whatsnew/3.0.html" target="_blank">nombreuses améliorations</a> à Python 2 qui valent le coup d&#8217;être découvertes et utilisées !</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/head-tail-python-3/&via=fgallaire&text=Head et tail de liste en Python 3&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1185&amp;md5=96227a5ebc4bae5d75011608edb15859" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/head-tail-python-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zack 2.0</title>
		<link>http://fgallaire.flext.net/zack-2-0/</link>
		<comments>http://fgallaire.flext.net/zack-2-0/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 04:53:21 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[DPL]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Stefano Zacchiroli]]></category>
		<category><![CDATA[Zack]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=1139</guid>
		<description><![CDATA[
C'est officiel depuis le 16 avril, Stefano Zacchiroli (Zack) vient d'être réélu Debian Project Leader. Sans surprise, car comme vous pourrez le constater à la vue des résultats, l'option 1 "Stefano Zacchiroli" était seulement concurrencée par l'option 2 "None Of The Above", et ces deux options ne constituaient donc pas une réelle alternative.

Le fait ...]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://lwn.net/images/conf/2010/LinuxTag/StefanoZacchiroli.jpg"><img class="aligncenter" title="Zack" src="http://lwn.net/images/conf/2010/LinuxTag/StefanoZacchiroli.jpg" alt="Zack" width="392" height="405" /></a></p>
<p>C&#8217;est officiel depuis le 16 avril, <a href="http://upsilon.cc/~zack/" target="_blank">Stefano Zacchiroli</a> (Zack) vient d&#8217;<a href="http://lists.debian.org/debian-devel-announce/2011/04/msg00009.html" target="_blank">être réélu</a> <a href="http://www.debian.org/devel/leader" target="_blank">Debian Project Leader</a>. Sans surprise, car comme vous pourrez le constater à la vue <a href="http://www.debian.org/vote/2011/vote_001" target="_blank">des résultats</a>, l&#8217;option 1 &#8220;Stefano Zacchiroli&#8221; était seulement concurrencée par l&#8217;option 2 &#8220;None Of The Above&#8221;, et ces deux options ne constituaient donc pas une réelle alternative.</p>
<p style="text-align: center;"><a href="http://master.debian.org/~secretary/leader2011/results.png"><img class="aligncenter" src="http://master.debian.org/~secretary/leader2011/results.png" alt="null" width="200" height="171" /></a></p>
<p>Le fait que Zack soit le seul candidat a provoqué un petit débat sur le caractère démocratique du vote, lui-même <a href="http://lists.debian.org/debian-vote/2011/03/msg00008.html" target="_blank">regrettant de ne pas avoir &#8220;d&#8217;adversaire&#8221;</a>. Mais cela aurait-il été mieux  avec un &#8220;adversaire&#8221; fantoche, ayant le rôle pré-attribué du perdant de l&#8217;élection, comme caution démocratique ? En fait, nous sommes ici confrontés à un faux problème, lié à l&#8217;erreur très répandue d&#8217;établir l&#8217;unité entre démocratie et élections, quelque chose que l&#8217;on pourrait écrire :</p>
<blockquote><p><code>démocratie = élections</code></p></blockquote>
<p>alors que même sans chercher trop loin, et en utilisant le <strong>ou</strong> informatique, c&#8217;est-à-dire non exclusif, on peut proposer facilement le beaucoup plus riche :</p>
<blockquote><p><code>démocratie = consensus ou élections ou manifestations ou insurrections</code></p></blockquote>
<p>Zack, dont l&#8217;action comme DPL cette année a de toute évidence été grandement appréciée, a fait <strong>consensus</strong> sur son nom. Tout le monde le sait depuis la clôture de la période de candidature le 12 mars.</p>
<p>Sauf a faire du fétichisme du vote, on aurait pu apprécier la chance qu&#8217;une communauté aussi grande et diverse arrive à un consensus, et se baser sur cette dynamique pour commencer des actions utiles, plutôt que d&#8217;organiser un vote inutile et absurde.</p>
<p>Zack, dont les qualités aussi bien techniques qu&#8217;humaines sont reconnues de tous, a un an de plus pour mettre en œuvre son <a href="http://www.debian.org/vote/2011/platforms/zack" target="_blank">programme</a>, et il est certain qu&#8217;avec l&#8217;expérience qu&#8217;il a maintenant, il sera encore meilleur que l&#8217;année dernière !</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/zack-2-0/&via=fgallaire&text=Zack 2.0&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><p class="wp-flattr-button"></p> <p><a href="http://fgallaire.flext.net/?flattrss_redirect&amp;id=1139&amp;md5=b542bbf6c47f2a79e466e1d6a532048d" title="Flattr" target="_blank"><img src="http://fgallaire.flext.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/zack-2-0/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

