<?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; Python</title>
	<atom:link href="http://fgallaire.flext.net/tag/python/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>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>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>Txt2tags 2.6 est arrivé !</title>
		<link>http://fgallaire.flext.net/txt2tags-2-6-est-arrive/</link>
		<comments>http://fgallaire.flext.net/txt2tags-2-6-est-arrive/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 15:55:29 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Txt2tags]]></category>

		<guid isPermaLink="false">http://fgallaire.flext.net/?p=770</guid>
		<description><![CDATA[Le voilà enfin, après plus de deux ans d'attente, txt2tags 2.6 est arrivé !

Txt2tags est un langage de markup, c'est-à-dire qu'il utilise une syntaxe non-obstrusive pour signifier les propriétés des éléments de texte, une syntaxe wiki en plus puissante. Mais à la différence des wiki qui ne génèrent que du HTML, txt2tags permet, à ...]]></description>
			<content:encoded><![CDATA[<p>Le voilà enfin, après plus de deux ans d&#8217;attente, <a href="http://txt2tags.wordpress.com/2010/11/05/txt2tags-26/" target="_blank">txt2tags 2.6 est arrivé</a> !</p>
<p>Txt2tags est un langage de markup, c&#8217;est-à-dire qu&#8217;il utilise une syntaxe non-obstrusive pour signifier les propriétés des éléments de texte, une syntaxe wiki en plus puissante. Mais à la différence des wiki qui ne génèrent que du HTML, txt2tags permet, à partir du même fichier source, de générer pas moins de 18 formats différents (appelés target) : HTML, XHTML, SGML, DocBook (<strong>NEW</strong>), LaTeX, Lout, Man page, Creole (<strong>NEW</strong>), Wikipedia / MediaWiki, Google Code Wiki, PmWiki (<strong>NEW</strong>), DokuWiki, MoinMoin, MagicPoint, PageMaker, AsciiDoc (<strong>NEW</strong>), ASCII Art (<strong>NEW</strong>) et Plain text.</p>
<p>J&#8217;ai commencé à m&#8217;investir dans txt2tags car je suis convaincu que le modèle de bureautique <a href="http://en.wikipedia.org/wiki/WYSIWYG" target="_blank">WYSIWYG</a> actuel, promu par des usines à gaz mastodontiques, fussent-elles libres comme <a href="http://www.documentfoundation.org/download/" target="_blank">LibreOffice</a>, est une véritable impasse. Par chance, les <a href="http://www.sange.fi/~atehwa/cgi-bin/piki.cgi/stx2any#hdl10" target="_blank">principaux logiciels</a> intéressants dans ce domaine (txt2tags, <a href="http://docutils.sourceforge.net/" target="_blank">docutils</a>/ReST et <a href="http://www.methods.co.nz/asciidoc/" target="_blank">AsciiDoc</a>), sont écrits en <a href="http://python.org/" target="_blank">Python</a>, mon langage de programmation de prédilection.</p>
<p>Si j&#8217;ai choisi txt2tags c&#8217;est parce que c&#8217;était le code le plus simple à modifier pour faire les expérimentations qui m&#8217;intéressaient. Et puis <a href="http://aurelio.net/soft/" target="_blank">Aurélio Jargas</a>, le principal développeur, a ouvert son développement anciennement très solitaire/centralisé grâce au <a href="http://code.google.com/p/txt2tags/" target="_blank">site Google Code</a>. Il m&#8217;a donné les droits de commit <a href="http://subversion.apache.org/" target="_blank">SVN</a> à la seconde où je l&#8217;ai contacté. Ce très bon feeling humain s&#8217;est poursuivi et a permis une collaboration technique, puisque si j&#8217;ai eu pas mal d&#8217;idées et que je les ai implémentées fonctionnelles et non buggées, Aurélio a fait un sacré travail derrière pour que l&#8217;intégration de mes modifications fassent moins &#8220;hack&#8221;.</p>
<p>Mon traditionnel et important point de juriste <img src='http://fgallaire.flext.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  : txt2tags est sous licence <a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" target="_blank">GNU GPLv2</a>, qui est soumise à un <a href="http://fr.wikipedia.org/wiki/Copyleft" target="_blank">Copyleft</a> fort, ce qui garantit la liberté éternelle de mon travail. Bien qu&#8217;un relativement petit projet en terme de nombre de lignes de code, la <a href="http://txt2tags.org/team/index.html" target="_blank">communauté</a> autour de txt2tags est grande et mondiale, et il est donc localisé dans plus d&#8217;une dizaine de langues (chaînes de caractères dans le code ET <a href="http://txt2tags.org/docs.html" target="_blank">documentation</a>) !</p>
<p>Beaucoup de <a href="http://txt2tags.org/changelog.html" target="_blank">nouvelles fonctionnalités</a> dans cette version 2.6, dont ma nouvelle target ASCII Art sur laquelle je reviendrai plus en détail, mon set <a href="http://markitup.jaysalvat.com/home/" target="_blank">markItUp!</a> pour une <a href="http://txt2tags.wordpress.com/2010/10/22/write-txt2tags-text-in-jquery-markup-editor-markitup/" target="_blank">utilisation aisée sur le web</a>, la possibilité d&#8217;inclure des tableaux de fichiers <a href="http://fr.wikipedia.org/wiki/Comma-separated_values" target="_blank">CSV</a> externes, et un nom de domaine <a href="http://txt2tags.org" target="_blank">txt2tags.org</a>, pour donner plus de visibilité au site web.</p>
<p>Je suis très heureux et très fier de pouvoir faire cette annonce, car cela fait pas loin de deux ans que je me suis engagé dans ce projet, et que cette release permet de rendre accessible au grand public ma première contribution significative aux logiciels libres !</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/txt2tags-2-6-est-arrive/&via=fgallaire&text=Txt2tags 2.6 est arrivé !&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=770&amp;md5=948a8e3866d3a4e7b734bb5d5c1b43b0" 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/txt2tags-2-6-est-arrive/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Smartphones Linux : le point du dev</title>
		<link>http://fgallaire.flext.net/smartphones-linux-dev/</link>
		<comments>http://fgallaire.flext.net/smartphones-linux-dev/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 23:05:19 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Smartphone]]></category>
		<category><![CDATA[Smartphone linux]]></category>
		<category><![CDATA[webOS]]></category>

		<guid isPermaLink="false">http://debian.flext.net/?p=143</guid>
		<description><![CDATA[Un petit point sur le hardware et le software disponibles pour un développeur libre qui voudrait utiliser un smartphone et développer dessus.

Il existe trois plateformes basées sur Linux (je n'écris volontairement pas GNU/Linux car si Android utilise bien le noyau Linux, il n'utilise pas pour autant les outils GNU) :

	Maemo de Nokia
	Android de Google
	webOS ...]]></description>
			<content:encoded><![CDATA[<p>Un petit point sur le hardware et le software disponibles pour un développeur libre qui voudrait utiliser un smartphone et développer dessus.</p>
<p>Il existe trois plateformes basées sur Linux (je n&#8217;écris volontairement pas GNU/Linux car si Android utilise bien le noyau Linux, il n&#8217;utilise pas pour autant les outils GNU) :</p>
<ul>
<li><a href="http://maemo.org/" target="_blank">Maemo</a> de Nokia</li>
<li><a href="http://www.android.com/" target="_blank">Android</a> de Google</li>
<li><a href="http://developer.palm.com/" target="_blank">webOS</a> de Palm</li>
</ul>
<p><strong>Maemo :</strong></p>
<p>Maemo est censé, chez Nokia, remplacer <a href="http://www.symbian.org/" target="_blank">Symbian</a> qui est dépassé technologiquement pour les nouveaux usages mobiles. Après avoir été expérimenté (trop) longuement (depuis 2005 !) sur les tablettes <a href="http://fr.wikipedia.org/wiki/Nokia_770_Internet_Tablet" target="_blank">N770</a>, <a href="http://fr.wikipedia.org/wiki/Nokia_N800" target="_blank">N800</a> et <a href="http://fr.wikipedia.org/wiki/Nokia_N810" target="_blank">N810</a>, il est enfin disponible sur un téléphone : le <a href="http://fr.wikipedia.org/wiki/Nokia_N900" target="_blank">N900</a>, depuis novembre 2009.</p>
<p>Or, si le N900 est disponible, il utilise la plateforme Maemo 5 qui va disparaitre et aucun smartphone n&#8217;est disponible sous Maemo 6. Je ne lancerai donc pas une énième fois le <a href="http://www.wikivs.com/wiki/GTK_vs_Qt" target="_blank">troll</a> <a href="http://fr.wikipedia.org/wiki/GTK%2B" target="_blank">GTK</a> (Maemo 5) vs <a href="http://fr.wikipedia.org/wiki/Qt" target="_blank">Qt</a> (Maemo 6) qui n&#8217;a juste pas lieu d&#8217;être : <em>Maemo n&#8217;est pas dans la course</em>. Et à la vitesse où va cette course, il ne parviendra peut-être jamais à y rentrer.</p>
<p>Je ne m&#8217;étendrai pas sur Maemo car je veux à la fois développer des applications  que je puisse  tester,  et que d&#8217;autres puissent utiliser, et il faut pour cela pouvoir se procurer un smartphone adapté, et ne pas m&#8217;investir dans une plateforme en fin de vie. <span style="background-color: #ffffff;">De plus, le fait que Maemo utilise <a href="http://fr.wikipedia.org/wiki/X.Org" target="_blank">Xorg</a> le rend techniquement contestable, tant <a href="http://www.art.net/~hopkins/Don/unix-haters/x-windows/disaster.html" target="_blank">la complexité et la lourdeur</a> inhérentes à <a href="http://fr.wikipedia.org/wiki/X_Window_System" target="_blank">X11</a> sont malvenues sur un smartphone.</span></p>
<p><strong>Android :</strong></p>
<p>Du côté d&#8217;Android c&#8217;est une toute autre histoire. Des smartphones sont disponibles depuis octobre 2008 aux États-Unis et mars 2009 en France. Au niveau commercial c&#8217;est déjà une grande réussite : Android est la plateforme qui progresse le plus et s&#8217;est imposé en un an comme le principal (le seul ?) challenger de l&#8217;iPhone (voir les <a href="http://metrics.admob.com/2010/01/metrics-update-android/" target="_blank">statistiques d&#8217;AdMob</a> pour plus de détails).</p>
<p>D&#8217;un point de vue technique, Android fournit un <a href="http://en.wikipedia.org/wiki/Software_development_kit" target="_blank">SDK</a> basé sur le langage de programmation <a href="http://fr.wikipedia.org/wiki/Java_(langage)" target="_blank">Java</a>. Cependant, il ne repose pas sur la <a href="http://fr.wikipedia.org/wiki/JVM_(informatique)" target="_blank">JVM</a> de Sun, mais sur <a href="http://fr.wikipedia.org/wiki/Machine_virtuelle_Dalvik" target="_blank">Dalvik</a>, une machine virtuelle à registres (comme <a href="http://www.parrot.org/" target="_blank">Parrot</a>) spécialement développée pour les contraintes hardware (mémoire faible, processeur peu puissant&#8230;) de l&#8217;embarqué. Dalvik est à ma connaissance la seule machine virtuelle à registres qui soit un succès industriel, face à la masse des machines virtuelles à pile (JVM de Sun, <a href="http://fr.wikipedia.org/wiki/Common_Language_Runtime" target="_blank">CLR</a> de Microsoft&#8230;).</p>
<p>Mais que peut-on faire si on ne veut pas programmer en Java ? Les développeurs ont souvent un langage de programmation favori, qu&#8217;ils ont peu ou pas envie d&#8217;abandonner ; dans mon cas c&#8217;est <a href="http://www.python.org/" target="_blank">Python</a>. <span style="background-color: #ffffff;">On pense alors naturellement aux implémentations des langages écrites en Java, <a href="http://www.jython.org/" target="_blank">Jython</a> pour Python ; mais si elles fonctionnent sur la JVM de Sun, ce n&#8217;est pas forcément le cas pas sur Dalvik ! Heureusement, Google a pensé à nous avec <a href="http://code.google.com/p/android-scripting/" target="_blank">ASE</a>, l&#8217;Android Scripting Environment, qui permet d&#8217;utiliser l&#8217;ensemble des API Android à partir de différents langages interprétés, et le choix est vraiment grand : Python, <a href="http://www.lua.org/" target="_blank">Lua</a>, <a href="http://www.perl.org/" target="_blank">Perl</a>, Ruby, JavaScript, <a href="http://www.beanshell.org/" target="_blank">BeanShell</a> et même shell !!</span></p>
<p>Tous les langages ne sont pas égaux devant ASE. Les langages natifs, c&#8217;est-à-dire écrits en Java, comme Ruby basé sur <a href="http://jruby.org/" target="_blank">JRuby</a>, JavaScript basé sur <a href="http://www.mozilla.org/rhino/" target="_blank">Rhino</a> ou encore BeanShell, peuvent théoriquement accéder directement aux API Java natives, alors que les langages &#8220;cross-compilés&#8221;, comme Python (basé sur CPython) ou Lua qui sont écrits en C, ne peuvent procéder que par des appels <a href="http://fr.wikipedia.org/wiki/JavaScript_Object_Notation" target="_blank">JSON</a> <a href="http://fr.wikipedia.org/wiki/Remote_procedure_call" target="_blank">RPC</a>. C&#8217;est cependant cette dernière méthode qui semble conseillée quel que soit le langage utilisé.</p>
<p>Je suis donc maintenant motivé pour me lancer dans l&#8217;aventure Android, d&#8217;autant que Google vient d&#8217;anoncer, lors d&#8217;une conférence de presse le 5 janvier, le lancement de son premier smartphone : le <a href="http://fr.wikipedia.org/wiki/Nexus_One">Nexus One </a>fabriqué par HTC. C&#8217;est tout simplement une &#8220;bête de course&#8221; du point de vue hardware : processeur à 1 Ghz, 512 Mo de RAM et un écran 3,7&#8243; d&#8217;une résolution de 480*800 (pour rappel l&#8217;<a href="http://en.wikipedia.org/wiki/IPhone_3GS">iPhone 3GS</a> fonctionne à 600 Mhz avec 256 Mo de RAM et un écran 3,5&#8243; en 320*480) !!! La disponibilité du Nexus One en France est prévue pour le mois de mars.</p>
<p>J&#8217;hésite cependant encore avec le <a href="http://fr.wikipedia.org/wiki/Motorola_Milestone" target="_blank">Motorola Milestone</a>, qui a lui l&#8217;avantage d&#8217;être déjà disponible et de posséder un clavier physique, ce qui pourrait se révéler bien pratique pour des sessions d&#8217;administration de machines par <a href="http://fr.wikipedia.org/wiki/OpenSSH" target="_blank">SSH</a>, avec le terminal en plein écran !</p>
<p><strong>webOS :</strong></p>
<p>Il y a un an, lors du <a href="http://fr.wikipedia.org/wiki/Consumer_Electronics_Show" target="_blank">CES</a> de janvier 2009, Palm avait créé l&#8217;évènement avec l&#8217;annonce du <a href="http://fr.wikipedia.org/wiki/Palm_Pre" target="_blank">Palm Pré</a> et de son nouveau système d&#8217;exploitation : webOS. Les critiques avaient été très élogieuses et l&#8217;on a même pensé que l&#8217;on tenait là le principal concurrent de l&#8217;iPhone. En effet, webOS est le seul système alternatif  à proposer les mêmes facilités multitouch que l&#8217;iPhone (il semblerait que sur ce sujet, Palm et Apple se tiennent par la barbichette des <a href="http://brevets-logiciels.info/" target="_blank">brevets logiciels</a>). La qualité et la simplicité de l&#8217;ergonomie étaient aussi tout à fait remarquables, et le design très &#8220;sexy&#8221;.</p>
<p>Le Palm Pré a été introduit au États-Unis le 6 juin, et les ventes ont été bonnes. Mais tout cela s&#8217;est un peu essouflé car <a href="http://fr.wikipedia.org/wiki/Sprint_Nextel" target="_blank">Sprint</a>, l&#8217;opérateur exclusif aux USA, est semble-t-il en perte de vitesse, et le Palm Pré n&#8217;a pas été commercialisé dans beaucoup d&#8217;autres pays : il n&#8217;est par exemple toujours pas disponible en France. Seule nouveauté depuis un an, l&#8217;introduction d&#8217;un nouveau modèle moins puissant visant l&#8217;entrée de gamme des smartphones, le <a href="http://en.wikipedia.org/wiki/Palm_Pixi" target="_blank">Palm Pixi</a>.</p>
<p>Et puis voilà à nouveau que, lors de la <a href="http://www.youtube.com/watch?v=Mn6oNKVd29g" target="_blank">présentation</a> du 7 janvier au CES, Palm fait des annonces tonitruantes ! <span style="background-color: #ffffff;">D&#8217;abord l&#8217;arrivée de deux nouveaux modèles : le Palm Pré Plus et le Palm Pixi Plus, qui proposent de grandes améliorations matérielles. Le Palm Pré voit sa capacité de stockage et sa RAM doublées, à 16 Go et 512 Mo respectivement, tandis que le Palm Pixi n&#8217;est plus castré des possibilités Wi-Fi que l&#8217;on peut légitimement attendre d&#8217;un smartphone, fût-il d&#8217;entrée de gamme. Et ces deux modèles seront disponibles en France au début du second trimestre.</span></p>
<p>Ensuite, le programme pour développeur, qui permet de fournir ses applications via le App Catalog officiel de Palm (équivalent du célèbre <a href="http://fr.wikipedia.org/wiki/App_Store" target="_blank">App Store</a> d&#8217;Apple) est maintenant <a href="http://developer.palm.com/index.php?option=com_content&amp;view=article&amp;id=1839&amp;Itemid=33" target="_blank">ouvert à tous</a>. Mais ce n&#8217;est pas tout, un <a href="http://developer.palm.com/index.php?option=com_content&amp;view=article&amp;id=1843" target="_blank">programme spécial pour les développeurs Open Source</a> existe, qui offre comme avantage d&#8217;économiser les 99$ de cotisation annuelle (en ce moment offerts à tous) et les 50$ par application soumises au App Catalog. De plus, Palm montre sa compréhension des logiciels libres, car l&#8217;on peut tout à fait commercialiser ses applications libres, et il n&#8217;y a aucune discrimination, comme pour les applications propriétaires c&#8217;est 70% du prix pour le développeur (comme sur l&#8217;App Store).</p>
<p>Développeur qui pourra désormais programmer de vrais jeux exploitant tout la puissance du la puce graphique, grâce à la mise à disposition d&#8217;un nouveau SDK spécialement destiné au jeux : le <a href="http://developer.palm.com/index.php?option=com_content&amp;view=article&amp;id=1850&amp;Itemid=20" target="_blank">Plug-in Development Kit</a>. Ce dernier est basé sur l&#8217;excellente et très utilisée librairie <a href="http://www.libsdl.org/" target="_blank">SDL</a>, véritable standard des logiciels libres. Le PDK est censé être programmé en C ou en C++, mais il existe des <a href="http://fr.wikipedia.org/wiki/Binding">bindings</a> SDL pour un nombre de langage de programmation très impressionnant, et j&#8217;ai du mal à voir ce qui pourrait m&#8217;empêcher d&#8217;utiliser sous peu <a href="http://www.pygame.org/" target="_blank">Pygame</a> pour programmer des jeux en Python !</p>
<p>Pour ce qui est des applications plus classiques, Palm propose désormais un <a href="http://fr.wikipedia.org/wiki/Environnement_de_développement_intégré" target="_blank">IDE</a> fonctionnant dans votre navigateur web : <a href="http://ares.palm.com/Ares/about.html" target="_blank">Project Ares</a>. On pourra saluer la cohérence technologique qui permet de faire aisément cela puisque l&#8217;ensemble du SDK Palm est construit à base  de technologies web, et espérer que cela permettra de faciliter l&#8217;accès à la programmation webOS au plus grand nombre.</p>
<p>Enfin, pour motiver les développeurs à se lancer et ainsi remplir son App Catalog, Palm propose le concours <a href="http://developer.palm.com/index.php?option=com_content&amp;view=article&amp;id=1841&amp;Itemid=35" target="_blank">Hot Apps</a> doté d&#8217;un million de dollars à partager entre les applications les plus téléchargées du 1er février au 31 mai.</p>
<p>Sur le front des smartphones Linux est là et bien là, en position de force, prêt à exterminer les systèmes d&#8217;exploitation privateurs de liberté Windows Mobile et BlackBerry OS et à mener le grand combat final contre l&#8217;iPhone !</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/smartphones-linux-dev/&via=fgallaire&text=Smartphones Linux : le point du dev&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=143&amp;md5=875d420191d39791324a449380f5ee8a" 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/smartphones-linux-dev/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Tornado !</title>
		<link>http://fgallaire.flext.net/tornado/</link>
		<comments>http://fgallaire.flext.net/tornado/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 19:48:03 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Asynchrone]]></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://debian.flext.net/?p=20</guid>
		<description><![CDATA[Le 10 août 2009, Facebook, le plus largement utilisé des réseaux sociaux, a racheté pour une somme avoisinant les 50 millions de dollars FriendFeed, un site de microblogging fait par d'anciens de chez Google.

Cette information en tant que telle n'est pas si intéressante, mais elle prend beaucoup de force quand c'est Facebook, un gros ...]]></description>
			<content:encoded><![CDATA[<p>Le 10 août 2009, <a href="http://www.facebook.com" target="_blank">Facebook</a>, le plus largement utilisé des réseaux sociaux, a racheté pour une somme avoisinant les 50 millions de dollars <a href="http://friendfeed.com/" target="_blank">FriendFeed</a>, un site de microblogging fait par d&#8217;anciens de chez Google.</p>
<p>Cette information en tant que telle n&#8217;est pas si intéressante, mais elle prend beaucoup de force quand c&#8217;est Facebook, un gros producteur de <a href="http://developers.facebook.com/opensource.php" target="_blank">technologies open source</a>, qui rachète un site fait par d&#8217;anciens de chez Google et donc utilisant <a href="http://www.python.org/" target="_blank">Python</a> comme langage de programmation (oui, vous vous souvenez, le meilleur langage du Monde !!!).</p>
<p>Le résultat de tout cela est la libération de <a href="http://www.tornadoweb.org/" target="_blank">Tornado</a>, un serveur d&#8217;application web asynchrone écrit en Python. Les performances anoncées <a href="http://bret.appspot.com/entry/tornado-web-server" target="_blank">semblent impressionantes</a>, très supérieures à celles du standard actuel pour les applis python en production Apache+mod_wsgi, et donc aussi à ce que peut faire  <a href="http://twistedmatrix.com/trac/wiki/TwistedWeb" target="_blank">TwistedWeb</a>, le seul autre serveur web python asynchrone.</p>
<p>J&#8217;ai été mis au courant par la mailing list django-developers où <a href="http://groups.google.com/group/django-developers/browse_thread/thread/8d1b7f514ef4e88e">une annnonce à été faite</a> par Bret Taylor, et j&#8217;ai pu trouver par la suite <a href="http://glyph.twistedmatrix.com/2009/09/what-i-wish-tornado-were.html" target="_blank">l&#8217;avis de Glyph Lefkowitz</a>, le papa de <a href="http://twistedmatrix.com/trac/" target="_blank">Twisted</a>, une des rares personne très compétentes dans le domaine complexe et globalement mal maitrisé de la programmation asynchrone, alors que Dustin Sallings a déjà <a href="http://github.com/dustin/tornado" target="_blank">forké Tornado</a> de manière à ce qu&#8217;il <a href="http://dustin.github.com/2009/09/12/tornado.html" target="_blank">utilise Twisted</a> (oui, vous vous souvenez, le logiciel libre c&#8217;est trop génial, ça bouge à mille à l&#8217;heure, aucune entrave à la création !).</p>
<p><a href="http://www.apparatusproject.org/blog/2009/09/twisted-web-vs-tornado-performance-test/" target="_blank">Un benchmark</a>, et puis <a href="http://antoniocangiano.com/2009/09/13/benchmarking-tornado-vs-twisted-web-vs-tornado-on-twisted/" target="_blank">un autre</a>, et encore <a href="http://amix.dk/blog/viewEntry/19472" target="_blank">un autre</a>.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/tornado/&via=fgallaire&text=Tornado !&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=20&amp;md5=9114a94f5d3394ef556f6dd7d0459194" 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/tornado/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>python-glpk</title>
		<link>http://fgallaire.flext.net/python-glpk/</link>
		<comments>http://fgallaire.flext.net/python-glpk/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 02:19:41 +0000</pubDate>
		<dc:creator>fgallaire</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Libre]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://debian.flext.net/?p=8</guid>
		<description><![CDATA[Le paquet python-glpk fournit un module qui permet d'utiliser la bibliothèque GNU de programmation linéaire GLPK tout en programmant en Python.

Le mainteneur actuel, Jan Alonzo, semblant ne plus s'en occuper, Sandro Tosi a fait une RFA ("Request for Adoption") sur le paquet.

Python étant mon langage de programmation préféré, j'avais décidé de choisir des paquets ...]]></description>
			<content:encoded><![CDATA[<p>Le paquet python-glpk fournit un module qui permet d&#8217;utiliser la bibliothèque GNU de programmation linéaire <a href="http://www.gnu.org/software/glpk/" target="_blank">GLPK</a> tout en programmant en Python.</p>
<p>Le mainteneur actuel, Jan Alonzo, semblant ne plus s&#8217;en occuper, Sandro Tosi a fait une RFA (&#8220;Request for Adoption&#8221;) sur le paquet.</p>
<p>Python étant mon langage de programmation préféré, j&#8217;avais décidé de choisir des paquets dans ce langage pour commencer à m&#8217;investir sérieusement dans le projet Debian. De plus, j&#8217;ai été amené à utiliser GLPK lors de mon stage de Master, ce qui me donne une petite compétence supplémentaire pertinente.</p>
<p>J&#8217;ai donc logiquement décidé de relever le défi python-glpk !!! et j&#8217;en suis maintenant le &#8220;Owner&#8221;&#8230;il ne reste plus qu&#8217;à travailler <img src='http://fgallaire.flext.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://fgallaire.flext.net/python-glpk/&via=fgallaire&text=python-glpk&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>]]></content:encoded>
			<wfw:commentRss>http://fgallaire.flext.net/python-glpk/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

