<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Not My Idea</title>
	<atom:link href="http://www.notmyidea.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.notmyidea.org</link>
	<description>Carnets Web d&#039;Alexis Métaireau</description>
	<lastBuildDate>Tue, 20 Jul 2010 10:07:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Réaliser un injecteur de dépendances, en utilisant de bonnes pratiques logicielles</title>
		<link>http://www.notmyidea.org/article/realiser-un-injecteur-de-dependances-en-utilisant-de-bonnes-pratiques-logicielles/</link>
		<comments>http://www.notmyidea.org/article/realiser-un-injecteur-de-dependances-en-utilisant-de-bonnes-pratiques-logicielles/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 10:07:17 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[php-fr]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=413</guid>
		<description><![CDATA[Je publie ici un article que j&#8217;ai rédigé il y à un moment et qui à été publié dans PHP solutions en février dernier, à propos de l&#8217;injecteur de dépendances sur lequel j&#8217;ai travaillé pour mon framework spiral. (Dur de retourner à du PHP après avoir découvert les possibilités offertes par python !)
L&#8217;article est également [...]]]></description>
			<content:encoded><![CDATA[<p>Je publie ici un article que j&#8217;ai rédigé il y à un moment et qui à été publié dans PHP solutions en février dernier, à propos de l&#8217;injecteur de dépendances sur lequel j&#8217;ai travaillé pour mon framework <a href="http://www.spiral-project.org">spiral</a>. (Dur de retourner à du PHP après avoir découvert les possibilités offertes par <a href="http://python.org">python</a> !)</p>
<p>L&#8217;article est également <a href='http://www.notmyidea.org/wp-content/uploads/2010/07/injection_1b.pdf'>disponible en PDF</a> si vous souhaitez.</p>
<h2 id="toc-larticle">L&#8217;article !</h2>
<p>Un injecteur de dépendances ? Peut être cela ne vous parle il pas vraiment. Tant mieux, l&#8217;objectif de cet article est d&#8217;éclaircir ces termes, et de présenter une implémentation que j&#8217;ai eu l&#8217;occasion de mettre en place, en essayant de m&#8217;appuyer sur de bonnes pratiques logicielles.</p>
<p>Cet article est basé sur mon expérience personnelle, ainsi que sur des recherches effectuées lors de la réalisation d&#8217;un composant logiciel. L&#8217;objectif n&#8217;est aucunement d&#8217;imposer ma vision des choses, mais bel et bien de partager les interrogations, réflexion et découvertes que nous avons eu alors.</p>
<p>Nous parlerons ici de l&#8217;injecteur de dépendances de Spiral, un framework maison réalisé avec quelques amis, et dont l&#8217;objectif principal est de découvrir les rouages des frameworks, ainsi que de nous initier aux bonnes pratiques logicielles.</p>
<p>Alors que nous travaillions sur ce projet, notre principal but était de réellement comprendre, dans le détail, comment un injecteur de dépendances pouvait fonctionner. <em>Ré-inventer la roue</em>, pour mieux comprendre comment une roue fonctionne, en quelque sorte.</p>
<p>Aussi, l&#8217;objectif de ce document n&#8217;est pas de fournir une documentation sur l&#8217;utilisation du composant, mais bien d&#8217;expliquer <em>comment</em> nous l&#8217;avons réalisé.</p>
<p>L&#8217;injecteur de dépendances est disponible dans une version intégrée à Spiral ou dans une version <em>standalone</em>. Vous pouvez trouver le code sur le <a href="http://bitbucket.org/ametaireau/spiral/">dépôt mercurial</a> du projet.</p>
<p>A l&#8217;heure ou j&#8217;écris ces lignes, l&#8217;injecteur de dépendances de spiral n&#8217;est pas encore terminé (sept 09), mais est dans un état avancé, et devrait être disponible en novembre 2009.</p>
<p>L&#8217;ensemble des exemples de ce document sont en PHP, mais les concepts discutés ici peuvent être (et sont!) implémentés dans d&#8217;autres langages.</p>
<p>Donc, parlons un peu d&#8217;injection de dépendances !</p>
<h2 id="toc-comment-gerons-nous-nos-objets">Comment gérons-nous nos objets ?</h2>
<p>Avant toute chose, il est indispensable de bien comprendre ce qu&#8217;est l&#8217;inversion de contrôle.</p>
<p><img class="alignright" src="http://www.notmyidea.org/wp-content/uploads/2010/07//icecream.png" alt="une glace ?" /></p>
<p>Lorsque nous réalisons des logiciels en utilisant le <em>paradigme</em> orienté objet, nous travaillons avec des classes, et la majeure partie du temps, nous faisons interagir ces classes entre elles. En pratique, certaines classes sont dépendantes d&#8217;autres classes.</p>
<p>Pour mettre un exemple derrière ces concepts, tout au long de ce document, nous allons nous mettre dans la peau d&#8217;<em>Alice</em>, une jeune fille qui adore manger des glaces, spécialement celles à la fraise !</p>
<p>Certains disent même qu&#8217;Alice est dépendante de la glace à la fraise.</p>
<div class="codecolorer-container php notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Alice <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> mangerGlace<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$glace</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GlaceALaFraise<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$glace</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">manger</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Il est clair, au regard de cette implémentation, qu&#8217;à chaque fois qu&#8217;Alice mange une glace, il s&#8217;agit d&#8217;une glace à la fraise. Génial,  mais un jour, la mère d&#8217;Alice souhaite lui faire découvrir d&#8217;autres parfums&#8230;</p>
<p>En réalité, avec cette implémentation, il est impossible de changer la glace qu&#8217;Alice va manger.</p>
<h2 id="toc-inversion-de-controle-ioc">Inversion de Contrôle (IoC)</h2>
<h3 id="toc-principe">Principe</h3>
<p><img class="alignright" src="http://www.notmyidea.org/wp-content/uploads/2010/07//holywood-principle.png" alt="Don't call me, I'll call you!" /></p>
<p>Il apparait donc nécessaire de supprimer les dépendances entre nos deux classes, pour permettre à Alice de gouter de nouveaux parfums.</p>
<p>Comment ? C&#8217;est assez simple, regardez donc le code:</p>
<div class="codecolorer-container php notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Alice <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> mangerGlace<span style="color: #009900;">&#40;</span>Glace <span style="color: #000088;">$glace</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$glace</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">manger</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Quand Alice mange une glace (via la méthode<code>mangerGlace</code>), nous devons lui passer la glace, ce n&#8217;est plus elle qui choisit, <em>nous</em> le faisons à sa place.</p>
<p>Ce principe est connu comme étant <strong>le principe d&#8217;Hollywood</strong>: <em>&laquo;&nbsp;Ne nous appelez pas, nous vous appellerons&raquo;&nbsp;</em>. En d&#8217;autres termes, n&#8217;utilisez pas l&#8217;opérateur<code>new</code>dans vos classes, mais préférez passer (ou qu&#8217;on vous passe) les objets par référence.</p>
<p>Alice peut faire d&#8217;autres choses avec sa glace, la laisser tomber par terre par exemple (oups!), grâce à la méthode<code>lacherGlace()</code>. Nous pouvons alors choisir de passer la glace à cette méthode également, ou choisir de la donner directement à Alice, la laissant s&#8217;occuper du reste, et évitant de lui passer une glace pour chaque action qui en nécessite une.</p>
<div class="codecolorer-container php notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Alice <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; protected <span style="color: #000088;">$_glace</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setGlace<span style="color: #009900;">&#40;</span>Glace <span style="color: #000088;">$glace</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_glace <span style="color: #339933;">=</span> <span style="color: #000088;">$glace</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> mangerGlace<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_glace<span style="color: #339933;">-&gt;</span><span style="color: #004000;">manger</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> lacherGlace<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_glace<span style="color: #339933;">-&gt;</span><span style="color: #004000;">l</span>âcher<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Il est bien plus facile maintenant de choisir la glace à donner a Alice, et ainsi de contrôler les dépendances d&#8217;Alice vis à vis de la glace.</p>
<p>Ici, il subsiste des dépendances dans le code. Il s’agit de dépendances vis à vis de contrats (interfaces) et non d’implémentations données (classes), puisque j’ai choisi d’utiliser le paradigme de <a href="http://fr.wikipedia.org/wiki/Programmation_par_contrat">programmation par contrats</a>.</p>
<p>Et c&#8217;est tout pour le principe d&#8217;inversion de contrôle (pas les glaces à la fraise, contrôler les dépendances)! Il s&#8217;agit <em>simplement</em> du fait d&#8217;inverser le flux de contrôle de vos application, en déléguant à un plus haut niveau la création des objets.</p>
<h3 id="toc-injection-de-dependances">Injection de dépendances</h3>
<p>Maintenant que le concept d&#8217;inversion de contrôle est clair, expliquons ce qu&#8217;est l&#8217;injection de dépendances. Les deux concepts sont assez proches, et souvent utilisés de pair, mais il est important de bien saisir la frontière entre les deux.</p>
<p>Dans la méthode<code>mangerGlace</code>, nous considérons que la glace en question est déjà donnée à Alice. C&#8217;est un comportement vraiment utile: Nous n&#8217;avons plus à nous occuper de la manière dont la glace est arrivée là, nous l&#8217;avons déjà (dans une propriété privée par exemple).</p>
<p>Dans la section précédente, Alice était <em>dépendante</em> de sa glace. En inversant le flux de contrôle, le comportement d&#8217;Alice vis à vis des glaces est plus facilement contrôlable, et testable (utiliser des <em>mocks</em>, ou <em>bouchons de tests</em> est aussi facile que de régler une propriété, nous parlerons de tests plus tard).</p>
<p>Notre travail (celui de la mère d&#8217;Alice), est de créer les objets et de les passer à Alice. Les <em>injecter</em> est le bon mot. En utilisant des mutateurs, ou en utilisant le constructeur, injectant les objets nécessaires.</p>
<p>Allons-y:</p>
<div class="codecolorer-container php notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$alice</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Alice<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$glaceAuPat</span>é <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GlaceAuPaté<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$alice</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setGlace</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$glaceAuPat</span>é<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>L&#8217;inversion de contrôle est donc le fait d&#8217;exposer des méthodes publiques (ou des constructeurs) pour régler certaines propriétés, et l&#8217;injection de dépendances est le fait de, justement, injecter ces dépendances, utiliser ces méthodes et constructeurs.</p>
<h3 id="toc-un-conteneur">Un Conteneur ?</h3>
<p>L&#8217;exemple utilisé jusqu&#8217;ici est volontairement simple, et il à été choisi afin d&#8217;expliquer les concepts le plus clairement possible: Nous avons uniquement deux classes, et une dépendance.</p>
<p>En pratique, vous serez surement d&#8217;accord pour dire qu&#8217;un projet est rarement aussi simple. Aussi, dans les projets importants, la gestion du cycle de vie des objets et de l&#8217;injection de leurs propriété peut rapidement devenir un vrai casse tête.</p>
<p>L&#8217;idéal est alors d&#8217;automatiser le processus de création, d&#8217;injection et de gestion de ces cycles de vie. Le conteneur fait exactement ça.</p>
<p>Pourquoi &laquo;&nbsp;conteneur&raquo;&nbsp; ? Parce que la création automatique et l&#8217;injection est effectuée grâce à un objet, qui se charge de contenir toutes les informations sur les dépendances. Une fois les objets crées, le conteneur garde une référence vers ces derniers au cas ou nous en aurions encore besoin (voir la  définition de portée d&#8217;un service &#8211; les &laquo;&nbsp;scopes&raquo;&nbsp;- plus loin)</p>
<p>Le conteneur va donc se charger d&#8217;injecter les objets pour nous, en quelque sorte, il fait le travail de la Mère d&#8217;Alice à sa place.</p>
<p>Nous souhaitons donc que lorsque nous appellerons Alice, via le conteneur, elle nous soit retourné avec une glace prête à être mangée !</p>
<div class="codecolorer-container php notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$alice</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$container</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getService</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Alice'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$alice</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">mangerGlace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Ici, le conteneur à injecté la bonne glace à Alice (peu importe laquelle d&#8217;ailleurs, nous souhaitons juste avoir une glace)</p>
<p>Si la glace elle même avait été dépendante d&#8217;autres objets (disons, des noix de coco par exemple), c&#8217;est le rôle du conteneur que de résoudre l&#8217;ensemble des dépendances, dans le bon ordre, simplifiant au maximum la tâche de gestion des dépendances entre les objets et les classes, laissant la tâche simple pour le développeur.</p>
<h2 id="toc-concepts-logiciels">Concepts logiciels</h2>
<p>Maintenant que les concepts d&#8217;inversion de contrôle et d&#8217;injection de dépendances sont clairs (enfin, j&#8217;espère!), nous pouvons commencer à parler de <em>comment</em> nous avons réalisé cette bibliothèque.</p>
<p>Les concepts discutés ici sont des concepts assez simples, dont le principal objectif est de fournir une structure solide aux composants. Chaque composant à ainsi un rôle et un emplacement précis au sein de notre architecture.</p>
<h3 id="toc-le-schema">Le Schéma</h3>
<p><img class="alignright" src="http://www.notmyidea.org/wp-content/uploads/2010/07//schema.png" alt="Le Schéma, avec les services, méthodes, et arguments" /></p>
<p>Dans le schéma, et dans l&#8217;injecteur de dépendances en général, un &laquo;&nbsp;service&raquo;&nbsp; est un objet qui est géré par le conteneur.</p>
<p>Le schéma représente les liens entre les différents services. Il décrit les dépendances de nos objets.</p>
<p>Si vous connaissez le patron de conception de <em>fabrique abstraite</em>, vous pouvez vous représenter le schéma comme une configuration alors que le conteneur serait la fabrique elle même (ou quelque chose d&#8217;approchant).</p>
<p>Le schéma contient toutes les informations sur les méthodes qui doivent êtres appelées pour injecter les objets, le type des arguments qui doivent être passés, et tout autre type d&#8217;information potentiellement utile au moment de l&#8217;injection.</p>
<p>Pour en revenir à notre exemple, le schéma contiendrait des informations sur le type de glace qui doit être passée à Alice (Une glace à la fraise bien sur!), et sur la manière de donner cette glace à Alice (via la méthode<code>setGlace()</code>)</p>
<p>Jusqu&#8217;à maintenant, nous avons parlé de dépendances simples, mais le schéma peut aussi gérer d&#8217;autres types de services, méthodes et arguments. Tout est décrit dans les sections suivantes:<code>Services</code>,<code>Methods</code>et<code>Attibutes</code>.</p>
<h4 id="toc-services">Services</h4>
<p>Un service représente un objet. Dans notre exemple, la Glace et Alice sont des services.</p>
<p>Un service se compose d&#8217;:</p>
<ul>
<li>un nom</li>
<li>un ensemble de méthodes</li>
<li>une manière de se construire</li>
<li>une portée (scope)</li>
</ul>
<p>La portée d&#8217;un service définit comment la durée de vie des services doit être gérée par le conteneur: Est-ce que le service doit rester dans le conteneur pendant toute la durée du script (singleton), ou doit il être systématiquement supprimé après avoir été construit (prototype)? </p>
<p>L&#8217;instance de l&#8217;objet courant peut être la même pour l&#8217;ensemble des services si la portée du service est définie comme étant un <em>singleton</em>, ou être à chaque fois différente si la portée est définie comme <em>prototype</em>.</p>
<p>D&#8217;autres types de portées peuvent êtres imaginées comme une portée de &laquo;&nbsp;session&raquo;&nbsp;, qui retournerait la même instance durant une session unique, ou une sorte de portée &laquo;&nbsp;immortelle&raquo;&nbsp;, qui retournerait toujours le même objet, en faisant persister cet objet à travers différentes sessions.</p>
<p>L&#8217;injecteur de dépendances est fourni avec les types de service suivants:</p>
<p><strong>Défaut</strong> :   Un service &laquo;&nbsp;simple&raquo;&nbsp;, composé de méthodes, et qui peut être construit comment un simple objet.</p>
<p><strong>Alias</strong> :   Un alias vers un autre service. Seul le nom est différent. Ce type de service permet de gérer facilement les dépendances dans le temps. &laquo;&nbsp;Pour le moment, il s&#8217;agit d&#8217;un alias, mais peut être qu&#8217;un jour nous aurons besoin d&#8217;un autre type de service&raquo;&nbsp;.</p>
<p><strong>Héritage de services</strong> :   Plutôt que de se répéter maintes et maintes fois lors de la description de services qui se ressemblent, il est possible d&#8217;utiliser l&#8217;héritage. Cela ressemble grandement à l&#8217;héritage de classes: les méthodes que vous redéfinissez ou ajoutez dans les services enfants écraseront ceux des parents.</p>
<h4 id="toc-methodes">Méthodes</h4>
<p>Chaque service contient des méthodes.</p>
<p>Une méthode permet d&#8217;injecter certains paramètres dans nos services, ou de définir certaines ressources qui doivent être appelées au moment de la construction des services. Dans le cas d&#8217;Alice,<code>setGlace()</code>est une méthode.</p>
<p>Une méthode est composée d&#8217;:</p>
<ul>
<li>un nom,</li>
<li>optionellement, un nom de classe</li>
<li>une liste d&#8217;arguments</li>
<li>une information disant si la méthode est statique ou non</li>
</ul>
<p>Voici les différents types de méthodes actuellement implémentées:</p>
<p><strong>Défaut</strong> :   Une simple méthode, avec des arguments. Peut être une méthode statique</p>
<p><strong>Attributs</strong> :   Utilisé pour régler directement les propriétés en utilisant les attributs publics de l&#8217;objet ($service->attribut = $valeur`).    Ce type de méthode peut contenir uniquement un argument. Il peut paraître étrange de gérer les attributs comme des méthodes. En réalité, il est important de comprendre la différence entre une méthode et un argument. Alors qu&#8217;un argument représente une valeur, une méthode représente une manière d&#8217;utiliser ces arguments. Dès lors, il parait plus logique de gérer les attributs comme des méthodes que comme des arguments.</p>
<p><strong>Rappels (callbacks)</strong> :   Avant ou après la création de vos services, il est possible d&#8217;appeler des méthodes spécifiques, appelées méthodes de rappel.</p>
<h4 id="toc-arguments">Arguments</h4>
<p>Les méthodes contiennent donc des arguments, et il existe plusieurs types d&#8217;arguments également.<br />
Les arguments sont le bout de la chaine services / méthodes / arguments.</p>
<p><strong>Défaut</strong> :   Types PHP natifs (int, string, float etc)</p>
<p><strong>Conteneur</strong> :   Il est possible d&#8217;injecter directement le conteneur. Ce type d&#8217;argument n&#8217;est utilisé que par les services qui nécessitent d&#8217;utiliser le conteneur. Ils sont appelées services &laquo;&nbsp;ContainerAware&raquo;&nbsp;.</p>
<p><strong>Service courant</strong> :   Il est possible d&#8217;injecter le service en cours, et de l&#8217;utiliser comme argument. En pratique, ceci est uniquement utile pour les méthodes de rappel (callback)</p>
<p><strong>Argument vide</strong> :    Il s&#8217;agit d&#8217;un type d&#8217;argument qui na pas de valeur. L&#8217;argument &laquo;&nbsp;conteneur&raquo;&nbsp; et &laquo;&nbsp;service courant&raquo;&nbsp; étendent ce type. Attention, l&#8217;argument vide est différent de null.</p>
<p><strong>Référence à un service</strong> :   C&#8217;est un des types d&#8217;argument le plus utilisé, il représente un autre service.</p>
<p><strong>Argument résolu grâce aux services</strong> :   Parfois, il est utile d&#8217;utiliser un service pour récupérer un argument, je pense à la configuration entres autres. Ce type d&#8217;argument utilise donc une méthode spécifique d&#8217;un autre service pour être résolu.</p>
<h3 id="toc-strategies-de-construction">Stratégies de construction</h3>
<p><img class="alignright" src="http://www.notmyidea.org/wp-content/uploads/2010/07//construction.png" alt="Stratégies de construction" /></p>
<p>Maintenant que nous avons un schéma qui représente les relations entre nos services, nous allons nous occuper de la construction de ces services.</p>
<p>Nous avons choisi de séparer complètement les logiques de construction et de définition, pour permettre de favoriser un maximum d&#8217;usages possibles pour l&#8217;un et l&#8217;autre des composants.</p>
<p>Chaque type, dans le schéma, peut être lié à un type de stratégie pour se construire. Il y à donc plusieurs stratégies de construction pour les services, les méthodes et les arguments.</p>
<p>L&#8217;intérêt d&#8217;utiliser des stratégies de construction est de permettre à chacun de nos types, dans le schéma, de se construire <em>eux même</em>, en utilisant leur méthode<code>build()</code>, qui va elle déléguer la tache de construction aux stratégies.</p>
<p>En interne, il est possible d&#8217;utiliser des stratégies de construction différentes, et d&#8217;en changer à tout moment. Ce comportement suit, en fait, <a href="http://fr.wikipedia.org/wiki/Strat%C3%A9gie_(patron_de_conception)">le patron de conception stratégie</a>.</p>
<h3 id="toc-builders-monteurs"><em>Builders</em> / Monteurs</h3>
<p>Puisque nous parlons de patrons de conception (design patterns), parlons du motif &laquo;&nbsp;Monteur&raquo;&nbsp;.</p>
<p>Vous serez sans doute d&#8217;accord avec moi pour dire qu&#8217;écrire un schéma entièrement à la main, en utilisant les classes dont nous avons parlé un peu plus haut peut s&#8217;avérer rapidement assez pénible. En tout cas, pour l&#8217;avoir expérimenté lors de l&#8217;écriture des tests, je peux dire qu&#8217;il ne s&#8217;agit pas d&#8217;un gain de temps, loin de là.</p>
<p>Une solution pratique consiste à utiliser le motif <em>Monteur</em>. L&#8217;idée est d&#8217;écrire le schéma sous une forme sympathique et facile à écrire pour nous, développeurs, et d&#8217;utiliser une classe intermédiaire pour transformer notre représentation du schéma dans la représentation compréhensible par notre composant.</p>
<p>Cette classe intermédiaire <em>monte</em> donc notre schéma, en déchiffrant une autre structure.</p>
<p><img class="alignright" src="http://www.notmyidea.org/wp-content/uploads/2010/07//builders.png" alt="Builders" /></p>
<p>Le premier type de <em>monteur</em> qui me vient à l&#8217;esprit (le plus pratique, en fait), est le <em>monteur</em> XML. Il est capable de lire un schéma, décrit au format XML, et de construire le schéma en utilisant les objets de notre bibliothèque. L&#8217;écriture du schéma XML à plusieurs avantages: il est facile à écrire, permet d&#8217;utiliser des outils extérieurs pour l&#8217;éditer facilement, et bénéficie, grâce a <a href="http://fr.wikipedia.org/wiki/XML_Schema">XML Schema</a>, d&#8217;une auto-complétion et d&#8217;une vérification à la volée, lors de l&#8217;écriture.</p>
<p>Les injecteurs de dépendances <a href="http://code.google.com/p/google-guice/">Google Juice</a> et <a href="www.springsource.org">Spring</a> permettent l&#8217;utilisation des annotations directement dans le code, pour définir les règles d&#8217;injection (le schéma pour nous).</p>
<p>Bien qu&#8217;il ne s&#8217;agisse pas d&#8217;un comportement recommandé (les annotations ne sont exploitables que par un type d&#8217;injecteur, même si <a href="http://jcp.org/en/jsr/summary?id=dependency+injection">une spécification est actuellement en cours</a>), il est possible d&#8217;utiliser la réflexion sur un projet, et de la combiner a l&#8217;utilisation d&#8217;annotations pour déduire facilement la structure de notre schéma, pour le remplir ensuite à notre guise.</p>
<p>Ce composant est également un <em>monteur</em>.</p>
<p>Les monteurs suivants sont fournis de base:</p>
<ul>
<li>Le monteur XML</li>
<li>Le monteur PHP, qui utilise une interface fluide, pour permettre des configurations de ce type:<code>$monteur->addService()->withMethod()</code></li>
<li>Le monteur Réflexion (utilise la réflexion sur nos classes pour construire un schéma)</li>
</ul>
<h3 id="toc-dumpers"><em>Dumpers</em></h3>
<p>Un <em>dumper</em> est un objet qui copie des données d&#8217;un type de format vers un autre. Effectivement, il peut s&#8217;avérer utile d&#8217;avoir une manière simple de se représenter un schéma déjà défini.</p>
<p><img class="alignright" src="http://www.notmyidea.org/wp-content/uploads/2010/07//dumpers.png" alt="Dumpers" /></p>
<p>Les dumpers permettent par exemple de représenter un schéma sous une forme graphique, ou bien sous une forme plus compréhensible pour nous, avec un simple texte par exemple.</p>
<p>Il est donc vraiment facile de montrer les dépendances de vos projets, en utilisant simplement le dumper Dot (qui est le format utilisé par <a href="www.graphviz.com">graphviz</a>) par exemple.</p>
<p>Voici la liste des dumpers :</p>
<ul>
<li>Le dumper texte</li>
<li>Le dumper Dot (graphviz)</li>
<li>Le dumper XML</li>
<li>Le dumper PHP</li>
</ul>
<p>Ces deux composants laissent entrevoir des pistes intéressantes: il est possible d&#8217;écrire ses classes, puis de générer un schéma partiel grâce au monteur &laquo;&nbsp;réflexion&raquo;&nbsp;, de le <em>dumper</em> en XML, de le compléter à la main (avec de l&#8217;auto-complétion), et de le monter à nouveau, grâce au monteur XML.</p>
<h2 id="toc-implementation">Implémentation</h2>
<p>Voici quelques règles que nous avons suivi lors du développement en lui même:</p>
<h3 id="toc-espaces-de-noms-php-5-3">Espaces de noms / PHP 5.3</h3>
<p>Alors que nous nous penchions sur ce projet, PHP 5.3 n&#8217;était pas encore sorti, mais puisque cette version apportait des fonctionnalités vraiment intéressantes (late static binding, espaces de noms et closures), nous avons choisi d&#8217;utiliser alors la version en cours de développement de PHP 5.3.</p>
<p>Maintenant, PHP 5.3 est disponible en version stable, et permet de faire fonctionner notre projet.</p>
<p>Notre bibliothèque se sépare selon les espaces de noms suivants:</p>
<ul>
<li>L&#8217;espace de nom<code>Construction</code>, qui contient toutes les classes liées au concept de construction (les stratégies de construction)</li>
<li>L&#8217;espace de nom<code>Definition</code>, qui contient le schéma.</li>
<li>L&#8217;espace de nom<code>Transformation</code>qui contient les Dumpers et les <em>Monteurs</em></li>
</ul>
<h3 id="toc-developpement-pilote-par-les-tests-tdd">Développement piloté par les tests (TDD)</h3>
<p>Ce projet fut également l&#8217;occasion d&#8217;écrire nos premiers tests, pour finir par utiliser une approche pilotée par les tests.</p>
<p>Le développement piloté par les tests préconise de réaliser ses tests <strong>avant</strong> d&#8217;écrire ses classes. Au début, ça chatouille un peu, mais on comprend rapidement l&#8217;intérêt de cette méthodologie, qui est une vraie bonne pratique.</p>
<p>Écrire ses tests avant d&#8217;avoir codé la classe nous oblige à la fois à privilégier une utilisation logique de nos composants, et à fixer les interfaces. Le code produit est réellement comme on souhaite l&#8217;utiliser, et non pas comme il est plus facile de l&#8217;implémenter.</p>
<p>Écrire des tests, c&#8217;est aussi penser à l&#8217;ensemble des scénarios d&#8217;utilisation de ces classes, même les plus farfelus. Cela nous oblige à réfléchir à tous ces cas d&#8217;utilisation, et ça fait le plus grand bien !</p>
<p>Pour revenir aux tests, ils permettent de tester que notre application se comporte bien comme elle le devrait, mais cela permet aussi de détecter rapidement des régressions que de nouvelles fonctionnalités peuvent apporter.</p>
<p>Rapidement, on écrit des tests pour tout: bugs, idées, etc. Ça favorise vraiment le développement d&#8217;une application.</p>
<p>Un peu plus haut, je parlais de Mock objets (ou objets bouchon, en français). Je vous laisse consulter l&#8217;<a href="http://en.wikipedia.org/wiki/Mock_object">article wikipédia sur les mocks</a> pour vous faire une idée plus précise, mais il s&#8217;agit, rapidement, d&#8217;objets qui permettent de simuler le comportement d&#8217;autres objets, ces derniers pouvant communiquer avec la suite de tests.</p>
<h3 id="toc-interfaces">Interfaces</h3>
<p>Dans l&#8217;ensemble de nos classes, nous essayons d&#8217;utiliser des interfaces plutôt que des implémentations particulières.<br />
Pourquoi ? Parce que travailler avec des interfaces nous permet de changer à tout moment d&#8217;implémentation !</p>
<p>Dans le cas d&#8217;Alice, elle n&#8217;est pas dépendante d&#8217;un type particulier de glace (celle à la fraise), mais simplement aux glaces, à l&#8217;<em>interface</em><code>Glace</code>, pour être exact.</p>
<p>Chacune des interfaces ci dessous représente un comportement décrit plus haut:</p>
<ul>
<li>Schema</li>
<li>Service</li>
<li>Method</li>
<li>Argument</li>
<li>Container</li>
<li>Dumper</li>
<li>Builder</li>
</ul>
<h3 id="toc-lecriture-des-classes">L&#8217;écriture des classes</h3>
<p>Pour écrire nos classes, et parce que nous souhaitons fournir un système facilement extensible, nous fournissons quasi systématiquement une interface, et une classe abstraite, pour que chaque concept puisse être étendu facilement.</p>
<p>D&#8217;ailleurs, l&#8217;écriture des classes en elle même est assez simple, une fois que tous les concepts ont étés décrit et sont clairs.</p>
<p>Vous pouvez regarder le code sur <a href="http://bitbucket.org/ametaireau/spiral/src/">le dépôt mercurial de spiral</a></p>
<p>Je ne vois pas grand chose à ajouter à propos de l&#8217;implémentation, si ce n&#8217;est, peut être, qu&#8217;il est indispensable de commenter votre code: cela permet aux potentiels futur contributeurs de s&#8217;y retrouver facilement, et de comprendre le détail des opérations !</p>
<h2 id="toc-conclusion">Conclusion</h2>
<p>J&#8217;espère que cet article vous aura intéressé, en tout cas j&#8217;ai pris beaucoup de plaisir à l&#8217;écrire, et vous aurez au moins appris comment nous avons choisi d&#8217;implémenter un injecteur de dépendances en utilisant quelques bonnes pratiques logicielles !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/realiser-un-injecteur-de-dependances-en-utilisant-de-bonnes-pratiques-logicielles/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A distutils2 month &#8212; PyPI simple index ready.</title>
		<link>http://www.notmyidea.org/article/a-distutils2-month-pypi-simple-index-ready/</link>
		<comments>http://www.notmyidea.org/article/a-distutils2-month-pypi-simple-index-ready/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 07:12:00 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[distutils2]]></category>
		<category><![CDATA[cheeseshop]]></category>
		<category><![CDATA[pypi]]></category>
		<category><![CDATA[simple index]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=391</guid>
		<description><![CDATA[I&#8217;m working for about a month for distutils2, even if I was being a bit busy (as I had some class courses and exams to work on)
I&#8217;ll try do sum-up my general feelings here, and the work I&#8217;ve made so far. You can also find, if you&#8217;re interested, my weekly summaries in a dedicated wiki [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working for about a month for distutils2, even if I was being a bit busy (as I had some class courses and exams to work on)</p>
<p>I&#8217;ll try do sum-up my general feelings here, and the work I&#8217;ve made so far. You can also find, if you&#8217;re interested, my weekly summaries in <a class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule">a dedicated wiki page</a>.</p>
<div class="section" id="general-feelings">
<h3 id="toc-general-feelings">General feelings</h3>
<p>First, and it&#8217;s a really important point, the GSoC is going very well, for me as for other students, at least from my perspective. It&#8217;s a pleasure to work with such enthusiast people, as this make the global atmosphere very pleasant to live.</p>
<p>First of all, I&#8217;ve spent time to read the existing codebase, and to understand what we&#8217;re going to do, and what&#8217;s the rationale to do so.</p>
<p>It&#8217;s really clear for me now: what we&#8217;re building is the foundations of a packaging infrastructure in python. The fact is that many projects co-exists, and comes all with their good concepts. Distutils2 tries to take the interesting parts of all, and to provide it in the python standard libs, respecting the recently written PEP about packaging.</p>
<p>With distutils2, it will be simpler to make &quot;things&quot; compatible. So if you think about a new way to deal with distributions and packaging in python, you can use the Distutils2 APIs to do so.</p>
</div>
<div class="section" id="tasks">
<h3 id="toc-tasks">Tasks</h3>
<p>My main task while working on distutils2 is to provide an installation and an un-installation command, as described in PEP 376. For this, I first need to get informations about the existing distributions (what&#8217;s their version, name, metadata, dependencies, etc.)</p>
<p>The main index, you probably know and use, is PyPI. You can access it at <a class="reference external" href="http://pypi.python.org">http://pypi.python.org</a>.</p>
</div>
<div class="section" id="pypi-index-crawling">
<h3 id="toc-pypi-index-crawling">PyPI index crawling</h3>
<p>There is two ways to get these informations from PyPI: using the simple API, or via xml-rpc calls.</p>
<p>A goal was to use the version specifiers defined in<a href="http://www.python.org/dev/peps/pep-0345/"> PEP 345</a> and to provides a way to sort the grabbed distributions depending our needs, to pick the version we want/need.</p>
<div class="section" id="using-the-simple-api">
<h2 id="toc-using-the-simple-api">Using the simple API</h2>
<p>The simple API is composed of HTML pages you can access at <a class="reference external" href="http://pypi.python.org/simple/">http://pypi.python.org/simple/</a>.</p>
<p>Distribute and Setuptools already provides a crawler for that, but it deals with their internal mechanisms, and I found that the code was not so clear as I want, that&#8217;s why I&#8217;ve preferred to pick up the good ideas, and some implementation details, plus re-thinking the global architecture.</p>
<p>The rules are simple: each project have a dedicated page, which allows us to get informations about:</p>
<ul class="simple">
<li>the distribution download locations (for some versions)</li>
<li>homepage links</li>
<li>some other useful informations, as the bugtracker address, for instance.</li>
</ul>
<p>If you want to find all the distributions of the &quot;EggsAndSpam&quot; project, you could do the following (do not take so attention to the names here, as the API will probably change a bit):</p>
<div class="codecolorer-container python notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> index = SimpleIndex<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> index.<span style="color: black;">find</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;EggsAndSpam&quot;</span><span style="color: black;">&#41;</span><br />
<span style="color: black;">&#91;</span>EggsAndSpam <span style="color: #ff4500;">1.1</span>, EggsAndSpam <span style="color: #ff4500;">1.2</span>, EggsAndSpam <span style="color: #ff4500;">1.3</span><span style="color: black;">&#93;</span></div></div>
<p>We also could use version specifiers:</p>
<div class="codecolorer-container python notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> index.<span style="color: black;">find</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;EggsAndSpam (&lt; =1.2)&quot;</span><span style="color: black;">&#41;</span><br />
<span style="color: black;">&#91;</span>EggsAndSpam <span style="color: #ff4500;">1.1</span>, EggsAndSpam <span style="color: #ff4500;">1.2</span><span style="color: black;">&#93;</span></div></div>
<p>Internally, what&#8217;s done here is the following:</p>
<ul class="simple">
<li>it process the <a class="reference external" href="http://pypi.python.org/simple/FooBar/">http://pypi.python.org/simple/FooBar/</a> page, searching for download URLs.</li>
<li>for each found distribution download URL, it creates an object, containing informations about the project name, the version and the URL where the archive remains.</li>
<li>it sort the found distributions, using version numbers. The default<br />
behavior here is to prefer source distributions (over binary ones), and to rely on the last &quot;final&quot; distribution (rather than beta, alpha etc. ones)</li>
</ul>
<p>So, nothing hard or difficult here.</p>
<p>We provides a bunch of other features, like relying on the new <a class="reference external" ref="http://www.python.org/dev/peps/pep-0381/">PyPI mirroring<br />
infrastructure</a> or filter the found distributions by some criterias. If you&#8217;re curious, please browse the <a class="reference external" href="http://distutils2.notmyidea.org/">distutils2 documentation</a>.</p>
<p></code></div>
<div class="section" id="using-xml-rpc">
<h2 id="toc-using-xml-rpc">Using xml-rpc</h2>
<p>We also can make some xmlrpc calls to retreive informations from PyPI. It's a really more reliable way to get informations from from the index (as it's just the index that provides the informations), but cost processes on the PyPI distant server.</p>
<p>For now, this way of querying the xmlrpc client is not available on Distutils2, as I'm working on it. The main pieces are already present (I'll reuse some work I've made from the SimpleIndex querying, and <a class="reference external" href="http://github.com/ametaireau/pypiclient">some code already set up</a>), what I need to do is to provide a xml-rpc PyPI mock server, and that's on what I'm<br />
actually working on.</p>
</div>
</div>
<div class="section" id="processes">
<h3 id="toc-processes">Processes</h3>
<p>For now, I'm trying to follow the &quot;documentation, then test, then code&quot; path, and that seems to be really needed while working with a community. Code is hard to read/understand, compared to documentation, and it's easier to change.</p>
<p>While writing the simple index crawling work, I must have done this to avoid some changes on the API, and some loss of time.</p>
<p>Also, I've set up <a class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule">a schedule</a>, and the goal is to be sure everything will be ready in time, for the end of the summer. (And now, I need to learn to follow schedules ...)</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/a-distutils2-month-pypi-simple-index-ready/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A distutils2 sprint in tours</title>
		<link>http://www.notmyidea.org/article/a-distutils2-sprint-in-tours/</link>
		<comments>http://www.notmyidea.org/article/a-distutils2-sprint-in-tours/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 00:48:41 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[distutils2]]></category>
		<category><![CDATA[sprint]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=386</guid>
		<description><![CDATA[
Yesterday, as I was traveling to Tours, I&#8217;ve took some time to visit  Éric, another student who&#8217;s working on distutils2 this summer, as a part of  the GSoC. Basically, it was to take a drink, discuss a bit about distutils2, our  respective tasks and general feelings, and to put a face on [...]]]></description>
			<content:encoded><![CDATA[<div id="a-distutils2-sprint-in-tours">
<p>Yesterday, as I was traveling to Tours, I&#8217;ve took some time to visit  Éric, another student who&#8217;s working on distutils2 this summer, as a part of  the GSoC. Basically, it was to take a drink, discuss a bit about distutils2, our  respective tasks and general feelings, and to put a face on a pseudonym.</p>
<p>I&#8217;d really enjoyed this time, because Éric knows a lot of things  about mercurial and python good practices, and I&#8217;m eager to learn about those.</p>
<p>So, we have discussed about things, have not wrote so much code, but  have some things to propose so far, about documentation, and I also provides here  some bribes of conversations we had.</p>
<div id="documentation">
<h3 id="toc-documentation">Documentation</h3>
<p>While writing the PyPI simple index crawler documentation, I realized  that we miss some structure, or how-to about the documentation. Yep, you read  well. We lack documentation on how to make documentation. Heh.</p>
<p>We&#8217;re missing some rules to follow, and this lead to a  not-so-structured final documentation.</p>
<p>We probably target three type of publics, and we can split the  documentation regarding those:</p>
<ul>
<li><strong>Packagers</strong> who want to distribute their softwares.</li>
<li><strong>End users</strong> who need to understand how to use end  user commands, like the installer/uninstaller</li>
<li><strong>packaging coders</strong> who <em>use</em> distutils2, as a  base for building a package manager.</li>
</ul>
<p>We also need to discuss about a pattern to follow while writing  documentation. How many parts do we need ? Where to put the API description ? etc. That&#8217;s maybe seems to be not so important, but I guess the readers would appreciate to have the same structure all along distutils2  documentation.</p></div>
<div id="mercurial">
<h3 id="toc-mercurial">Mercurial</h3>
<p>I&#8217;m really <em>not</em> a mercurial power user. I use it on daily  basis, but I lack of basic knowledge about it. Big thanks Éric for sharing yours with me,  you&#8217;re of a great help.</p>
<p>We have talked about some mercurial extensions that seems to make the  life simpler, while used the right way. I&#8217;ve not used them so far, so  consider this as a personal note.</p>
<ul>
<li>hg histedit, to edit the history</li>
<li>hg crecord, to select the changes to commit</li>
</ul>
<p>We have spent some time to review a merge I made sunday, to re-merge  it, and commit the changes as a new changeset. Awesome.</p>
<p>These things make me say I <strong>need</strong> to read <a href="http://hgbook.red-bean.com/read/">the hg book</a>,  and will do as soon as I got some spare time: mercurial seems to be simply great.</p>
<p>So &#8230; Great. I&#8217;m a powerful merger now !</p></div>
<div id="on-using-tools">
<h3 id="toc-on-using-tools">On using tools</h3>
<p>Because we <em>also</em> are <em>hackers</em>, we have shared a bit  our ways to code, the tools we use, etc.</p>
<p>Both of us were using vim, and I&#8217;ve discovered vimdiff and hgtk,  which will completely change the way I navigate into the mercurial history.</p>
<p>We aren&#8217;t &laquo;&nbsp;power users&raquo;&nbsp;, so we have learned from each other about vim  tips.</p>
<p>You can find <a href="http://github.com/ametaireau/dotfiles">my dotfiles on github</a>,  if it could help. They&#8217;re not perfect, and not intended to be, because  changing all the time, as I learn. Don&#8217;t hesitate to have a look, and to propose  enhancements if you have !</div>
<div id="on-being-pythonic">
<h3 id="toc-on-being-pythonic">On being pythonic</h3>
<p>My background as an old Java user disserves me so far, as the  paradigms are not the same while coding in python. Hard to find the more pythonic way to do,  and sometimes hard to unlearn my way to think about software engineering.</p>
<p>Well, it seems that the only solution is to read code, and to re-read  <cite>import this</cite> from times to times ! <a href="http://python.net/%7Egoodger/projects/pycon/2007/idiomatic/handout.html">Coding  like a pythonista</a> seems to be a must-read, so, I know what to do.</div>
<div id="conclusion">
<h3 id="toc-conclusion">Conclusion</h3>
<p>It was really great. Next time, we&#8217;ll need to focus a bit more on  distutils2, and to have a bullet list of things to do, but days like this one are  opportunities to catch !</p>
<p>We&#8217;ll probably do another sprint in a few weeks, stay tuned !</p></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/a-distutils2-sprint-in-tours/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Use Restructured Text (ReST) to power your presentations</title>
		<link>http://www.notmyidea.org/article/use-restructured-text-rest-to-power-your-presentations/</link>
		<comments>http://www.notmyidea.org/article/use-restructured-text-rest-to-power-your-presentations/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 17:17:21 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[rst]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=381</guid>
		<description><![CDATA[Wednesday, we give a presentation, with some friends, about the CouchDB Database, to the Toulouse local LUG.
Thanks a lot to all the presents for being there, it was a pleasure to talk about this topic with you. Too bad the season is over now an I quit Toulouse next year.
During our brainstorming about the topic, [...]]]></description>
			<content:encoded><![CDATA[<p>Wednesday, we give a presentation, with some friends, about the CouchDB Database, to <a href="http://www.toulibre.org">the Toulouse local LUG</a>.</p>
<p>Thanks a lot to all the presents for being there, it was a pleasure to talk about this topic with you. Too bad the season is over now an I quit Toulouse next year.</p>
<p>During our brainstorming about the topic, we used some paper, and we wanted to make a presentation the simpler way. </p>
<p>First thing that come to my mind was using <a href="http://docutils.sourceforge.net/rst.html">restructured text</a>, so I&#8217;ve wrote a simple file containing our different bullet points.</p>
<p>In fact, there is quite nothing to do then, to have a working presentation.<br />
So far, I&#8217;ve used <a href="http://code.google.com/p/rst2pdf/">the rst2pdf program</a>, and a simple template, to generate output.</p>
<p>It&#8217;s probably simple to have similar results using latex + beamer, I&#8217;ll try this next time, but as I&#8217;m not familiar with latex syntax, restructured text was a great option.</p>
<p>Here are <a href="http://files.lolnet.org/~alexis/rst-presentations/couchdb/couchdb.pdf">the final PDF output</a>, <a href="http://files.lolnet.org/~alexis/rst-presentations/couchdb/couchdb.rst">Rhe ReST source</a>, <a href="http://files.lolnet.org/~alexis/rst-presentations/slides.style">the theme used</a>, and the command line to generate the PDF:</p>
<div class="codecolorer-container text notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">rst2pdf couchdb.rst -b1 -s ../slides.style</div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/use-restructured-text-rest-to-power-your-presentations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GSOC Distutils first report</title>
		<link>http://www.notmyidea.org/article/gsoc-distutils-first-report/</link>
		<comments>http://www.notmyidea.org/article/gsoc-distutils-first-report/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 10:27:33 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[distutils2]]></category>
		<category><![CDATA[GSOC]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=369</guid>
		<description><![CDATA[As I&#8217;ve been working on Distutils2 during the past week, taking part of the GSOC program, here is a short summary of what I&#8217;ve done so far.
As my courses are not over yet, I&#8217;ve not worked as much as I wanted, and this will continues until the end of June. My main tasks are about [...]]]></description>
			<content:encoded><![CDATA[<p>As I&#8217;ve been working on <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a> during the past week, taking part of the <a class="reference external" href="http://code.google.com/intl/fr/soc/">GSOC</a> program, here is a short summary of what I&#8217;ve done so far.</p>
<p>As my courses are not over yet, I&#8217;ve not worked as much as I wanted, and this will continues until the end of June. My main tasks are about making installation and uninstallation commands, to have a simple way to install distributions via <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a>.</p>
<p>To do this, we need to rely on informations provided by the Python Package Index (<a class="reference external" href="http://pypi.python.org/">PyPI</a>), and there is at least two ways to retreive informations from here: XML-RPC and the &quot;simple&quot; API.</p>
<p>So, I&#8217;ve been working on porting some <a class="reference external" href="http://bitbucket.org/tarek/distribute/">Distribute</a> related stuff to <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a>, cutting off all non distutils&#8217; things, as we do not want to depend from Distribute&#8217;s internals. My main work has been about reading the whole code, writing tests about this and making those tests possible.</p>
<p>In fact, there was a need of a pypi mocked server, and, after reading and introducing myself to the distutils behaviors and code, I&#8217;ve taken some time to improve the work <a class="reference external" href="http://bitbucket.org/konrad">Konrad</a> makes about this mock.</p>
<div class="section" id="a-pypi-server-mock">
<h3 id="toc-a-pypi-server-mock">A PyPI Server mock</h3>
<p>The mock is embeded in a thread, to make it available during the tests, in a non blocking way. We first used <a class="reference external" href="http://wsgi.org">WSGI</a> and <a class="reference external" href="http://docs.python.org/library/wsgiref.html">wsgiref</a> in order control what to serve, and to log the requests made to the server, but finally realised that <a class="reference external" href="http://docs.python.org/library/wsgiref.html">wsgiref</a> is not python 2.4 compatible (and we <em>need</em> to be python 2.4 compatible in Distutils2).</p>
<p>So, we switched to <a class="reference external" href="http://docs.python.org/library/basehttpserver.html">BaseHTTPServer</a> and <a class="reference external" href="http://docs.python.org/library/simplehttpserver.html">SimpleHTTPServer</a>, and updated our tests accordingly. It&#8217;s been an opportunity to realize that <a class="reference external" href="http://wsgi.org">WSGI</a> has been a great step forward for making HTTP servers, and expose a really simplest way to discuss with HTTP !</p>
<p>You can find <a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/changesets">the modifications I made</a>, and the <a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/src/tip/docs/source/test_framework.rst">related docs</a> about this on <a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/">my bitbucket distutils2 clone</a>.</p>
<h3 id="toc-the-pypi-simple-api">The PyPI Simple API</h3>
<p>So, back to the main problematic: make a python library to access and request information stored on PyPI, via the simple API. As I said, I&#8217;ve just grabbed the work made from <a class="reference external" href="http://bitbucket.org/tarek/distribute/">Distribute</a>, and played a bit with, in order to view what are the different use cases, and started to write the related tests.</p>
<h3 id="toc-the-work-to-come">The work to come</h3>
<p>So, once all use cases covered with tests, I&#8217;ll rewrite a bit the grabbed code, and do some software design work (to not expose all things as privates methods, have a clear API, and other things like this), then update the tests accordingly and write a documentation to make this clear.</p>
<p>Next step is to a little client, as I&#8217;ve <a class="reference external" href="http://github.com/ametaireau/pypiclient">already started here</a> I&#8217;ll take you updated !</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/gsoc-distutils-first-report/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Distutils2 GSOC</title>
		<link>http://www.notmyidea.org/article/a-distutils2-gsoc/</link>
		<comments>http://www.notmyidea.org/article/a-distutils2-gsoc/#comments</comments>
		<pubDate>Sat, 01 May 2010 14:33:01 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[distutils2]]></category>
		<category><![CDATA[GSOC]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=352</guid>
		<description><![CDATA[WOW.
I&#8217;ve been accepted to be a part of the Google Summer Of Code program, and will work on python distutils2, with a lot of (intersting!) people.
So, it&#8217;s about building the successor of Distutils2, ie. &#171;&#160;the python package manager&#187;&#160;. Today, there is too many ways to package a python application (pip, setuptools, distribute, distutils, etc.) so there is [...]]]></description>
			<content:encoded><![CDATA[<p>WOW.</p>
<p>I&#8217;ve been accepted to be a part of the <a href="http://code.google.com/intl/fr/soc/">Google Summer Of Code</a> program, and will work on <a href="http://python.org/">python</a> <a href="http://hg.python.org/distutils2/">distutils2</a>, with <a href="http://pygsoc.wordpress.com/">a</a> <a href="http://konryd.blogspot.com/">lot</a> <a href="http://ziade.org/">of</a> (intersting!) <a href="http://zubin71.wordpress.com/">people</a>.</p>
<blockquote><p>So, it&#8217;s about building the successor of Distutils2, ie. &laquo;&nbsp;the python package manager&raquo;&nbsp;. Today, there is too many ways to package a python application (pip, setuptools, distribute, distutils, etc.) so there is a huge effort to make in order to make all this packaging stuff interoperable, as pointed out by the <a href="http://www.python.org/dev/peps/pep-0376/">PEP 376</a>.</p></blockquote>
<p><img src="http://www.notmyidea.org/wp-content/uploads/2010/05/state_of_packaging-300x171.jpg" alt="The current state of packaging" title="The current state of packaging" width="300" height="171" class="size-medium wp-image-355" /></p>
<p>In more details, I&#8217;m going to work on the Installer / Uninstaller features of Distutils2, and on a PyPI XML-RPC client for distutils2. </p>
<p>Here are the already defined tasks:</p>
<ul>
<li>Implement Distutils2 APIs described in PEP 376.</li>
<li>Add the uninstall command.</li>
<li>think about a basic installer / uninstaller script. (with deps) &#8212; similar to pip/easy_install</li>
<li>in a pypi subpackage;</li>
<li>Integrate a module similar to setuptools&#8217; package_index&#8217;</li>
<li>PyPI XML-RPC client for distutils 2: http://bugs.python.org/issue8190</li>
</ul>
<p>As I&#8217;m relatively new to python, I&#8217;ll need some extra work in order to apply all good practice, among other things that can make a developper-life joyful.</p>
<p>I&#8217;ll post here, each week, my advancement, and my tought about python and especialy python packaging world.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/a-distutils2-gsoc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#171;&#160;Le temps de grâces&#187;&#160;, Courrez-y !</title>
		<link>http://www.notmyidea.org/article/le-temps-de-graces-courrez-y/</link>
		<comments>http://www.notmyidea.org/article/le-temps-de-graces-courrez-y/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 12:38:33 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[Associatif]]></category>
		<category><![CDATA[Films]]></category>
		<category><![CDATA[agriculture]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=343</guid>
		<description><![CDATA[Ouf, notre semaine de l&#8217;environnement s&#8217;est terminée, après un peu de neige et un brin de soleil quand il en fallait. Ce fut l&#8217;occasion de rencontrer beaucoup de gens biens, et de regarder d&#8217;un peu plus près toutes ces problématiques qui mériteraient à elles seules, chacune un billet.
Après un répis d&#8217;une semaine, pour récupérer des [...]]]></description>
			<content:encoded><![CDATA[<p>Ouf, notre <a href="http://www.reseaugrappe.org">semaine de l&#8217;environnement</a> s&#8217;est terminée, après un peu de neige et un brin de soleil quand il en fallait. Ce fut l&#8217;occasion de rencontrer beaucoup de gens biens, et de regarder d&#8217;un peu plus près toutes ces problématiques qui mériteraient à elles seules, chacune un billet.</p>
<p>Après un répis d&#8217;une semaine, pour récupérer des folies organisatrices (c&#8217;est ça qui fait du bien, ceci dit &#8212; les folies, pas le repos), je me retrouve de nouveau sur ces mêms réflexions, grâce aux journées organisées par <a href="http://www.fne.asso.fr/">France Nature Environnement</a>, qui proposaient ce jeudi soir une projection de &quot;Le temps des grâces&quot;, un documentaire sur l&#8217;agriculture.</p>
<p><img src="http://www.notmyidea.org/wp-content/uploads/2010/03/affiche-le-temps-des-graces-225x300.jpg" alt="affiche-le-temps-des-graces" title="affiche-le-temps-des-graces" width="225" height="300" class="alignleft size-medium wp-image-344" /> Parce que depuis 60 ans, il est pratiqué le remembrement des parcelles à gogo, parce que nos sols deviennent completement morts à cause des tonnes d&#8217;intrants qu&#8217;on leur fait absorber, et parce que les exploitations s&#8217;agrandissent sans en finir pour tenter de réagir façe à un marché financier toujours plus insaisissable, mené de très loin par la PAC, il fallait un film pour en parler.</p>
<p>C&#8217;est ce que fait &quot;le temps des grâçes&quot;, avec un bon sens et une facilité à faire passer des messages, qu&#8217;on ne peut qu&#8217;applaudir. Malheureusement il s&#8217;agissait de la dernière diffusion à <a href="http://www.cinemas-utopia.org/toulouse/">L&#8217;Utopia de Toulouse</a>&#8230; Si vous en avez l&#8217;occasion, sautez dessus et profitez le temps de ces 2 heures, ou vous pourrez écouter à la fois des discours d&#8217;agronomes, d&#8217;agriculteurs, de chercheurs et bien d&#8217;autres, qui dressent un constat pas si brillant de notre agriculture. On n&#8217;est pas sorti de l&#8217;auberge, enfin, c&#8217;est l&#8217;expression.</p>
<p>Je vous laisse avec le synopsis et une bande annonce.</p>
<p><cite>Une enquête documentaire sur le monde agricole français aujourd&#8217;hui à travers de nombreux récits : agriculteurs, chercheurs, agronomes, écrivains&#8230; Un monde qui parvient à résister aux bouleversements qui le frappent &#8211; économiques, scientifiques, sociaux &#8211; et qui, bon gré mal gré, continue d&#8217;entretenir les liens entre générations. Un monde au centre d&#8217;interrogations majeures sur l&#8217;avenir.</cite></p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/Ix8DrbwHVp0&#038;hl=fr_FR&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Ix8DrbwHVp0&#038;hl=fr_FR&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p>Ainsi qu&#8217;un commentaire que je ne peux m&#8217;empécher de relayer, trouvé sur allocine.fr (oui, vous savez, ce site rempli de pubs).</p>
<p><cite>Le temps des grâces c&#8217;est je pense le plus grand film traitant de l&#8217;écologie en tant que documentaire ou en sujet principal, on y apprend une multitude de choses, on en ressort en colère contre le système, le film propose différents points de vues, ici on a pas de voix off moralisatrice à deux balles avec des gros titres bien surlignés pour que même les beaufs matant TF1 puissent comprendre, ici même si ça reste accessible au citoyen lambda, le film ne fait pas de compromis avec le monde agroalimentaire, il ose dénoncer les filière d&#8217;agronomie qui apprennent pas les bonnes choses à leurs étudiants, aux lobbys de cette agro-industrie qui n&#8217;en fait qu&#8217;à sa tête pour amasser de l&#8217;argent, cette tendance à tout uniformiser et détruire… Franchement j&#8217;ai trouvé ça génial de bout en bout, captivant, on explore cette campagne française, on comprend les dilemmes des paysants. Le film n&#8217;étant pas opposé à la modernité, ni même réactionnaire, il propose juste un constat alarmant du monde agricole français, tout en proposant des alternatives qui pourraient être utilisée, si les pouvoirs publics lâchaient un peu la main des lobbys. Passionnant, vraiment.</cite></p>
<p>Courrez-y, je vous dis.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/le-temps-de-graces-courrez-y/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP jouerais-t-il dans la cours des grands ?</title>
		<link>http://www.notmyidea.org/article/php-ou-spaggethi/</link>
		<comments>http://www.notmyidea.org/article/php-ou-spaggethi/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 11:14:43 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[Humeur]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=185</guid>
		<description><![CDATA[Le temps passe, et la mauvaise image du langage PHP marque les esprits. Mauvaise image, qui n&#8217;est pas complètement dénuée de sens, même si les choses évoluent doucement. PHP est considéré par beaucoup comme un langage de débutants, et bon nombre d&#8217;entreprises et de personnes font le choix d&#8217;utiliser ce langage en mettant de coté [...]]]></description>
			<content:encoded><![CDATA[<p><em>Le temps passe, et la mauvaise image du langage PHP marque les esprits. Mauvaise image, qui n&#8217;est pas complètement dénuée de sens, même si les choses évoluent doucement. PHP est considéré par beaucoup comme un langage de débutants, et bon nombre d&#8217;entreprises et de personnes font le choix d&#8217;utiliser ce langage en mettant de coté les bonnes pratiques de la conception logicielle, traînant avec eux une vieille image ternie de ce qu&#8217;est PHP actuellement.</em></p>
<p>D&#8217;un autre coté, des projets matures et fiables voient le jour, héritant du savoir faire et de la qualité du monde Java, un exemple frappant est <a href="http://flow3.typo3.org">Flow3</a>, et plus récemment, Symfony 2 (ce qui m&#8217;à d&#8217;ailleurs agréablement surpris). Le monde de PHP est donc en pleine mutation, avec la montée en puissance de concepts avancés tels l&#8217;inversion de contrôle, les tests unitaires et (enfin!), de la VRAIE persistance.</p>
<h3 id="toc-a-lorigine-un-langage-de-debutants">A l&#8217;origine, un langage de débutants&#8230;</h3>
<p><img class="size-medium wp-image-288" title="3038125365_ee399515d4_b" src="http://www.notmyidea.org/wp-content/uploads/2009/11/3038125365_ee399515d4_b-300x240.jpg" alt="PHP joue-t-il dans la cour des grands ?" width="300" height="240" /></p>
<p>Ce qui <em>plombe</em> le plus PHP, doit être le non professionnalisme d&#8217;une partie de sa communauté, découvrant le développement via PHP &#8212; langage permissif au possible &#8212; et laissant la porte ouverte à des aberrations folles.</p>
<p>Le langage laisse (trop) libre les nouveaux venus, et on ne parles que peu de tests unitaires, de code commenté (j&#8217;en passe des tonnes, volontairement). Facile donc de faire les choses de travers, et vous ne trouverez que peu de personnes pour vous encourager à ne pas continuer dans ce sens, à moins de savoir vers ou chercher.</p>
<p>On trouve encore trop de scripts en PHP avec une approche fonctionnelle (de par le passé de php et son approche fonctionnelle de la programmation), et trop de bibliothèques pas ou peu testées, bref, dans l&#8217;ensemble c&#8217;est une catastrophe. Je m&#8217;amuse à faire l&#8217;analogie avec la construction de maisons avec du scotch.</p>
<h3 id="toc-qui-tends-a-se-professionnaliser">&#8230; qui tends à se professionnaliser</h3>
<p>Je suis le premier à dire que les (petites) entreprises (en général) manquent d&#8217;un savoir faire crucial en terme de bonnes pratiques, et pourtant, ces dernières commencent à s&#8217;intéresser de près à des concepts avancés, et aux bonnes pratiques. Les frameworks utilisés en entreprise sont souvent testés unitairement (Jelix, symfony, Zend Framework, pour ceux que j&#8217;ai eu l&#8217;occasion d&#8217;apprivoiser), et les bonnes pratiques sont parfois vraiment mises en avant.</p>
<p>Avec la sortie de PHP 5.3, on peut désormais utiliser des fonctionnalités telles que les espaces de noms ou les <em>closures</em>, concepts déjà implémentés depuis fort longtemps dans d&#8217;autres langages, et qui venaient à briller par leur absence.</p>
<p>Et un front de raz-le-bol général qui bat son plein: on veut du code testé, du code bien fait, on en veux plus de la soupe (et de la programmation spaghetti) ! Rébellion !</p>
<p>Même si je fonde de grands espoirs dans PHP, et que je penses que tout n&#8217;est pas à jeter, qu&#8217;il y à une réelle motivation qui commence à se faire sentir de la part de la communauté, je me demandes si PHP joue dans la même cour que Java, ou que Python et Ruby pour ne citer qu&#8217;eux, qui bénéficient d&#8217;une communauté forte et avide de bonnes pratiques.</p>
<p>Et vous qui utilisez PHP, vous en pensez quoi ? PHP peut-il être comparé à Java, à Python, à Ruby ? Est-ce une abération de faire de telles comparaisons? ou est-ce définitivement à un autre niveau ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/php-ou-spaggethi/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Semaine de l&#8217;environnement: La consommation étudiante</title>
		<link>http://www.notmyidea.org/article/semaine-de-lenvironnement-consommation-etudiante/</link>
		<comments>http://www.notmyidea.org/article/semaine-de-lenvironnement-consommation-etudiante/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 22:05:36 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[Associatif]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=312</guid>
		<description><![CDATA[Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à Framasoft, à la Quadrature du net ou à Ars Industrialis (dans le domaine de la science et de l&#8217;informatique), mais aussi aux Amis de la Terre, à ATTAC (dans le domaine de l&#8217;environnement entres autres), et a tout un tas [...]]]></description>
			<content:encoded><![CDATA[<p><em>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a href="http://www.framasoft.net/">Framasoft</a>, à <a href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l&#8217;informatique), mais aussi <a href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a href="http://www.attac.org/">ATTAC</a> (dans le domaine de l&#8217;environnement entres autres), et a tout un tas d&#8217;autres associations que je ne peux pas citer ici exhaustivement&#8230; Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l&#8217;environnement.</em></p>
<p><img src="http://www.notmyidea.org/wp-content/uploads/2010/02/q85-500x500-dev_courbes-300x204.jpg" alt="q85-500x500-dev_courbes" title="q85-500x500-dev_courbes" width="300" height="204" class="alignright size-medium wp-image-320" />Dans cette optique, depuis près de 3 ans (déjà !), au sein du <a href="http://www.reseaugrappe.org">réseau GRAPPE</a>, on <em>essaye</em> d&#8217;aborder des thématiques qui touchent de près ou de loin à l&#8217;environnement, parce que c&#8217;est un sujet qui nous importe et nous passionne.</p>
<p>L&#8217;année dernière, c&#8217;était l&#8217;alimentation étudiante, ce qui à abouti à la publication de <a href="http://public.reseaugrappe.org/alimentation.pdf">la revue &laquo;&nbsp;les étudiants se mettent à table&raquo;&nbsp;</a>. Cette année c&#8217;est la consommation étudiante qui est au programme.</p>
<h3 id="toc-la-consommation-etudiante">La consommation étudiante ?</h3>
<p>L&#8217;idée principale de cette étude est de tenter de faire une analyse de la &laquo;&nbsp;société de consommation&raquo;&nbsp;, souvent questionnée par les étudiants et par d&#8217;autres, et de jeter un œil sur le rapport des étudiants à cette société: </p>
<p>Quoi et comment consomment-ils ? Les universités et les écoles ne poussent-elles pas d’une certaine manière les étudiants à la consommation ?</p>
<p>Quelles sont les alternatives face aux dérives de surconsommation ?</p>
<blockquote><p>Analyse des pratiques, réflexions et mobilisations des étudiants en termes de consommation seront réalisés pour comprendre leur modes de vie, mais aussi leurs attentes, leurs propositions sur cette thématique</p></blockquote>
<h3 id="toc-la-semaine-de-lenvironnement">La semaine de l&#8217;environnement !</h3>
<p><img src="http://www.notmyidea.org/wp-content/uploads/2010/02/SDE_18012010_TOULOUSE.jpg" alt="SDE_18012010_TOULOUSE" title="SDE_18012010_TOULOUSE" width="200" height="299" class="alignleft size-full wp-image-325" />A travers l&#8217;ensemble des villes du réseau, des projections de films et des débats auront donc lieu sur ce thème, lors de la semaine de l&#8217;environnement 2010, qui se déroulera d&#8217;ailleurs durant le mois de Mars <a href="http://www.reseaugrappe.org/la-semaine-de-lenvironnement-programme/">partout en france</a>, et <strong>du 6 au 14 Mars sur Toulouse</strong>. <a href="http://docs.notmyidea.org/sde/prog-toulouse.pdf">Jetez un oeil au programme</a> !</p>
<p>Avec pour objectif de sonder un peu le ressenti des étudiants en terme de consommation, nous avons mis en place <a href="http://spreadsheets.google.com/viewform?formkey=dHV2bVllS2lWbzhyV3NBN3NUbi1TM2c6MA">un questionnaire en ligne</a>, que vous pouvez compléter en une petite 10aine de minutes, n&#8217;hésitez pas !</p>
<p><a href="http://www.reseaugrappe.org/consommation/">La page sur la consommation étudiante sur le site du GRAPPE</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/semaine-de-lenvironnement-consommation-etudiante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python, go !</title>
		<link>http://www.notmyidea.org/article/python-go/</link>
		<comments>http://www.notmyidea.org/article/python-go/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 13:07:33 +0000</pubDate>
		<dc:creator>Alexis Metaireau</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.notmyidea.org/?p=302</guid>
		<description><![CDATA[Cela fait maintenant un peu plus d&#8217;un mois que je travaille sur un projet en django, et que, nécessairement, je me forme à Python.
Je prends un plaisir non dissimulé à découvrir ce langage (et à l&#8217;utiliser), qui ne cesse de me surprendre.  Les premiers mots qui me viennent à l&#8217;esprit à propos de Python, [...]]]></description>
			<content:encoded><![CDATA[<p>Cela fait maintenant un peu plus d&#8217;un mois que je travaille sur un projet en <a href="http://www.djangoproject.org">django</a>, et que, nécessairement, je me forme à <a href="http://python.org/">Python</a>.</p>
<p>Je prends un plaisir non dissimulé à découvrir ce langage (et à l&#8217;utiliser), qui ne cesse de me surprendre.  Les premiers mots qui me viennent à l&#8217;esprit à propos de Python, sont &laquo;&nbsp;logique&raquo;&nbsp; et &laquo;&nbsp;simple&raquo;&nbsp;. Et pourtant puissant pour autant.</p>
<p>Je ne manque d&#8217;ailleurs pas une occasion pour faire un peu d&#8217;<em>évangélisation</em> auprès des quelques personnes qui veulent bien m&#8217;écouter.</p>
<h3 id="toc-the-zen-of-python">The Zen of Python</h3>
<p>Avant toute autre chose, je pense utile de citer Tim Peters, et <a href="http://www.python.org/dev/peps/pep-0020/">le PEP20</a>, qui constituent une très bonne introduction au langage, qui prends la forme d&#8217;un <em>easter egg</em> présent dans python:</p>
<div class="codecolorer-container python notmyidea" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:420px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> this<br />
The Zen of Python, by Tim Peters<br />
<br />
Beautiful <span style="color: #ff7700;font-weight:bold;">is</span> better than ugly.<br />
<span style="color: black;">Explicit</span> <span style="color: #ff7700;font-weight:bold;">is</span> better than implicit.<br />
<span style="color: black;">Simple</span> <span style="color: #ff7700;font-weight:bold;">is</span> better than <span style="color: #008000;">complex</span>.<br />
<span style="color: black;">Complex</span> <span style="color: #ff7700;font-weight:bold;">is</span> better than complicated.<br />
<span style="color: black;">Flat</span> <span style="color: #ff7700;font-weight:bold;">is</span> better than nested.<br />
<span style="color: black;">Sparse</span> <span style="color: #ff7700;font-weight:bold;">is</span> better than dense.<br />
<span style="color: black;">Readability</span> counts.<br />
<span style="color: black;">Special</span> cases aren<span style="color: #483d8b;">'t special enough to break the rules.<br />
Although practicality beats purity.<br />
Errors should never pass silently.<br />
Unless explicitly silenced.<br />
In the face of ambiguity, refuse the temptation to guess.<br />
There should be one-- and preferably only one --obvious way to do it.<br />
Although that way may not be obvious at first unless you'</span><span style="color: #dc143c;">re</span> Dutch.<br />
<span style="color: black;">Now</span> <span style="color: #ff7700;font-weight:bold;">is</span> better than never.<br />
<span style="color: black;">Although</span> never <span style="color: #ff7700;font-weight:bold;">is</span> often better than <span style="color: #66cc66;">*</span>right<span style="color: #66cc66;">*</span> now.<br />
<span style="color: black;">If</span> the implementation <span style="color: #ff7700;font-weight:bold;">is</span> hard to explain, it<span style="color: #483d8b;">'s a bad idea.<br />
If the implementation is easy to explain, it may be a good idea.<br />
Namespaces are one honking great idea -- let'</span>s do more of those<span style="color: #66cc66;">!</span></div></div>
<p>J&#8217;ai la vague impression que c&#8217;est ce que j&#8217;ai toujours cherché à faire en PHP, et particulièrement dans <a href="http://www.spiral-project.org">le framework Spiral</a>, mais en ajoutant ces concepts dans une sur-couche au langage.</p>
<p>Ici, c&#8217;est directement de <em>l&#8217;esprit</em> de python qu&#8217;il s&#8217;agit, ce qui signifie que la plupart des bibliothèques python suivent ces concepts. Elle est pas belle la vie ?</p>
<h3 id="toc-comment-commencer-et-par-ou">Comment commencer, et par ou ?</h3>
<p>Pour ma part, j&#8217;ai commencé par la lecture de quelques livres et articles intéressants, qui constituent une bonne entrée en matière sur le sujet (La liste n&#8217;est bien évidemment pas exhaustive et vos commentaires sont les bienvenus) :</p>
<ul>
<li><a href="http://diveintopython.adrahon.org/">Dive into python</a></li>
<li><a href="http://www.swaroopch.com/notes/Python_fr:Table_des_Mati%C3%A8res">A byte of python</a></li>
<li><a href="http://www.amazon.fr/Python-Petit-guide-lusage-d%C3%A9veloppeur/dp/2100508830">Python: petit guide à l&#8217;usage du développeur agile</a> de <a href="http://tarekziade.wordpress.com/">Tarek Ziadé</a></li>
<li><a href="http://docs.python.org/index.html">La documentation officielle python</a>, bien sûr !</li>
<li><a href="http://video.pycon.fr/videos/pycon-fr-2009/">Les vidéos du pyconfr 2009 </a>!</li>
<li>Un peu de temps, et une console python ouverte <img src='http://www.notmyidea.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>J&#8217;essaye par ailleurs de partager au maximum les ressources que je trouve de temps à autres, que ce soit <a href="http://www.twitter.com/ametaireau">via twitter</a> ou <a href="http://delicious.com/ametaireau">via mon compte delicious</a>. Allez jeter un œil <a href="http://delicious.com/ametaireau/python">au tag python</a> sur mon profil, peut être que vous trouverez des choses intéressantes, qui sait!</p>
<h3 id="toc-un-python-sexy">Un python sexy</h3>
<p>Quelques fonctionnalités qui devraient vous mettre l&#8217;eau à la bouche:</p>
<ul>
<li><a href="http://docs.python.org/library/stdtypes.html#comparisons">Le chaînage des opérateurs de comparaison</a> est possible (a&lt;b &lt;c dans une condition)</li>
<li>Assignation de valeurs multiples (il est possible de faire a,b,c = 1,2,3 par exemple)</li>
<li><a href="http://docs.python.org/tutorial/datastructures.html">Les listes</a> sont simples à manipuler ! </li>
<li>Les<a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions"> list comprehension</a>, ou comment faire des opérations complexes sur les listes, de manière simple.</li>
<li>Les <a href="http://docs.python.org/library/doctest.html?highlight=doctest">doctests</a>: ou comment faire des tests directement dans la documentation de vos classes, tout en la documentant avec de vrais exemples.</li>
<li>Les <a href="http://www.python.org/doc/essays/metaclasses/meta-vladimir.txt">métaclasses</a>, ou comment contrôler la manière dont les classes se construisent</li>
<li>Python est <a href="http://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language">un langage à typage fort dynamique</a>: c&#8217;est ce qui m&#8217;agaçait avec PHP qui est un langage à typage faible dynamique. </li>
</ul>
<p>Cous pouvez également aller regarder <a href="http://video.pycon.fr/videos/free/53/">l&#8217;atelier donné par Victor Stinner durant le Pyconfr 09</a>.</p>
<p>Have fun !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.notmyidea.org/article/python-go/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
