<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.2-beta" -->
<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/"
	>

<channel>
	<title>I, NaPs</title>
	<link>http://inaps.org</link>
	<description>Le blog de NaPs !</description>
	<pubDate>Mon, 02 Jun 2008 16:51:08 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.2-beta</generator>
	<language>en</language>
			<item>
		<title>Qui n&#8217;en veuuuuxx ? :)</title>
		<link>http://inaps.org/journal/are-you-one-true-escalope</link>
		<comments>http://inaps.org/journal/are-you-one-true-escalope#comments</comments>
		<pubDate>Mon, 02 Jun 2008 16:41:29 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Ego]]></category>

		<category><![CDATA[escalope]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/are-you-one-truth-escalope</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://inaps.org/static/pools/escalope/escalope.jpg" alt="Escalope" /></p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/are-you-one-true-escalope/feed</wfw:commentRss>
		</item>
		<item>
		<title>Et c&#8217;est qui qui dit &#8220;fail&#8221; ?</title>
		<link>http://inaps.org/journal/fail</link>
		<comments>http://inaps.org/journal/fail#comments</comments>
		<pubDate>Thu, 22 May 2008 09:26:26 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Coup de gueule]]></category>

		<category><![CDATA[fail]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/fail</guid>
		<description><![CDATA[
Ceci dit, ça aurait pu être moins pire : le bureau aurait pu être vernis.
Calme, cool, zeeen, lexomiiil.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://inaps.org/static/pools/fail/milk-fail.png" alt="MILK FAILED" /></p>
<p>Ceci dit, ça aurait pu être moins pire : le bureau aurait pu être vernis.</p>
<p>Calme, cool, zeeen, lexomiiil.</p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/fail/feed</wfw:commentRss>
		</item>
		<item>
		<title>PyCon fr 08</title>
		<link>http://inaps.org/journal/pycon08</link>
		<comments>http://inaps.org/journal/pycon08#comments</comments>
		<pubDate>Mon, 19 May 2008 20:46:12 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Developpement]]></category>

		<category><![CDATA[pycon]]></category>

		<category><![CDATA[pyconfr08]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/pycon08</guid>
		<description><![CDATA[J&#8217;étais en train de rédiger un billet sur la PyCon FR 2008 quand Sunny m&#8217;a parlé du sien, et du coup, comme je suis un gros flemmard, je vais simplement faire un lien sur son blog : Pycon FR 2008.
]]></description>
			<content:encoded><![CDATA[<p>J&#8217;étais en train de rédiger un billet sur la PyCon FR 2008 quand Sunny m&#8217;a parlé du sien, et du coup, comme je suis un gros flemmard, je vais simplement faire un lien sur son blog : <a href="http://sunfox.org/blog/2008/05/19/pycon/">Pycon FR 2008</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/pycon08/feed</wfw:commentRss>
		</item>
		<item>
		<title>Mais où en est Bearnaise ?</title>
		<link>http://inaps.org/journal/mais-ou-en-est-bearnaise</link>
		<comments>http://inaps.org/journal/mais-ou-en-est-bearnaise#comments</comments>
		<pubDate>Fri, 09 May 2008 14:02:46 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Kernel Panic]]></category>

		<category><![CDATA[bearnaise]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/mais-ou-en-est-bearnaise</guid>
		<description><![CDATA[Voici un petit billet pour donner des nouvelles du nouveau Bearnaise pour ceux que ça intéresse
Bon, déjà, pour les plus retardés niveau information, Dedibox nous ont livrés le serveur le mercredi 30 au soir. Au passage, nous avons dû  resouscrire l&#8217;ancien serveur pour un mois vu le peu de temps entre la livraison du [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un petit billet pour donner des nouvelles du nouveau Bearnaise pour ceux que ça intéresse</p>
<p>Bon, déjà, pour les plus retardés niveau information, Dedibox nous ont livrés le serveur le mercredi 30 au soir. Au passage, nous avons dû  resouscrire l&#8217;ancien serveur pour un mois vu le peu de temps entre la livraison du nouveau serveur et la fin du contrat de l&#8217;ancien. Depuis la livraison, Sunny et moi avons pas mal travaillé sur le serveur. Pour l&#8217;instant, voila ce qui est fait :</p>
<ul>
<li><strong>Le serveur (en lui même) : </strong>Il est installé, sous Debian Etch (la dernière stable donc), et plus ou moins configuré. Il manque surtout des outils de monitoring et un poil de sécurité (en gros, de la remontée d&#8217;informations).</li>
<li><strong>Le DNS : </strong>Contrairement à avant, nous avons décidés d&#8217;utiliser notre propre DNS pour éviter les problèmes que l&#8217;on a eu avec XName. Il est installé, configuré, ainsi que le DNS secondaire fournit par dedibox.</li>
<li><strong>Le serveur web : </strong>Comme avant, on utilise Lighttpd sur Bearnaise. Le serveur est configuré, et les outils pour créer vos virtuals hosts sont pratiquement terminés (je publierais un billet pour vous aider à les utiliser bientôt).</li>
<li><strong>Le serveur de mail : </strong>Tout comme avant, Postfix comme serveur smtp. Je suis passé à Dovecot pour le serveur imap4 (pas encore configuré le pop3, mais vu que personne l&#8217;utilise&#8230;). Le serveur est aussi accessible par SSL pour les paranos (pour moi quoi :)).</li>
<li><strong>Jabber : </strong>Je me suis aussi occupé de migrer le serveur Jabber. Ça m&#8217;a l&#8217;air de fonctionner même si il y a quelques trucs un chouilla bizarres qui se produisent.</li>
<li><strong>MySQL : </strong>Il est installé, rien de particulier à dire dessus.</li>
</ul>
<p>Ce qu&#8217;il manque</p>
<ul>
<li><strong>La migration du SVN : </strong>et des tracs. Mais ça ne devrais pas être trop difficile&#8230;</li>
<li><strong>Monitoring &#038; Sécu</strong></li>
<li><strong>L&#8217;écriture du reste des outils : </strong>Pour l&#8217;instant les outils pour gérer les vhosts sont pratiquement terminé, un outil pour créer un domaine sur le DNS aussi. Il manque un moyen de gérer les comptes mails, les bdd mysql etc.</li>
<li><strong>Finitions : </strong>création de vos comptes, documentation, faire un joli motd (si vous avez des idées pour ça) etc/</li>
</ul>
<p>Bref, c&#8217;est pour très bientôt, encore un peu de patience :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/mais-ou-en-est-bearnaise/feed</wfw:commentRss>
		</item>
		<item>
		<title>Le petit projet des vacances&#8230;</title>
		<link>http://inaps.org/journal/le-petit-projet-des-vacances</link>
		<comments>http://inaps.org/journal/le-petit-projet-des-vacances#comments</comments>
		<pubDate>Sat, 26 Apr 2008 17:10:44 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Developpement]]></category>

		<category><![CDATA[httpd]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[spy]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/le-petit-projet-des-vacances</guid>
		<description><![CDATA[Entre ma vie, la migration de Bearnaise (qui tarde un peu trop d&#8217;ailleurs, merci Free.), et le projet scolaire que je dois terminer pour la rentrée, je m&#8217;ennuyais un peu. Alors j&#8217;ai décidé de reprendre un vieux projet que j&#8217;avais entamé il y a fort longtemps avec Swater : un analyseur de logs de serveurs [...]]]></description>
			<content:encoded><![CDATA[<p>Entre ma vie, la migration de Bearnaise (qui tarde un peu trop d&#8217;ailleurs, merci Free.), et le projet scolaire que je dois terminer pour la rentrée, je m&#8217;ennuyais un peu. Alors j&#8217;ai décidé de reprendre un vieux projet que j&#8217;avais entamé il y a fort longtemps avec Swater : un analyseur de logs de serveurs HTTP.</p>
<p>L&#8217;idée est de faire un analyseur de logs extremement modulaire afin de pouvoir ajouter ou retirer à souhait les traitements qui seront effectués sur les fichiers. Pour résumer le fonctionnement, il y a d&#8217;un coté des modules d&#8217;analyse genre &#8220;visiteurs&#8221;, &#8220;referers&#8221;, &#8220;hits&#8221;, etc. qui s&#8217;occupent de collecter des données sur chaques lignes des fichiers de logs. De l&#8217;autre coté, un module de rendu (genre &#8220;html&#8221;, &#8220;mail&#8221;, &#8220;texte&#8221;) qui lui s&#8217;occupe comme son nom l&#8217;indique si bien, du rendu du rapport de résultats.</p>
<p>Le projet est déjà bien entamé, et je compte releaser une première version très bientôt. J&#8217;ai fais quelques tests de performances pour avoir une idée (pour l&#8217;instant, ce n&#8217;est pas optimisé). Condition des tests : sur mon portable, Core Duo 1.66Ghz, 1Go de RAM (mais l&#8217;utilisation par le programme de la ram était minime), fichiers de logs du serveur http de Bearnaise, un peu plus d&#8217;un an pour 1231699 lignes.</p>
<h4>Test #1</h4>
<p>Traitement des lignes relatives au domaine &#8220;inaps.org&#8221; avec un seul module d&#8217;analyse actif et en mode verbeux : <code>time python s.py -m inaps.org -d 01012006 -e 99999 -v html visitors logs/*</code></p>
<p>Résultat : <code>132.91user 0.58system 2:16.75elapsed 97%CPU (0avgtext+0avgdata 0maxresident)k</code></p>
<h4>Test #2</h4>
<p>Traitement des lignes relatives a tous les domaines avec un seul module d&#8217;analyse actif et en mode verbeux : <code>time python s.py -d 01012006 -e 99999 -v html visitors logs/*</code></p>
<p>Résultat : <code>144.67user 4.52system 2:33.67elapsed 97%CPU (0avgtext+0avgdata 0maxresident)k</code></p>
<h4>Test #3</h4>
<p>Traitement des lignes relatives a tous les domaines avec deux modules d&#8217;analyse actifs et en mode verbeux : <code>time python s.py -d 01012006 -e 99999 -v html visitors,referers logs/*</code></p>
<p>Résultat : <code>168.98user 5.69system 3:05.21elapsed 94%CPU (0avgtext+0avgdata 0maxresident)k</code></p>
<h4>Test #4</h4>
<p>Traitement des lignes relatives a tous les domaines avec deux modules d&#8217;analyse actifs et en mode silencieux : <code>time python s.py -d 01012006 -e 99999 -q html visitors,referers logs/*</code></p>
<p>Résultat : <code>155.58user 0.24system 2:35.86elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k</code></p>
<p>Même si ces tests ne sont pas hyper démonstratifs (ils dépendent des modules activés), ils donnent quand même une idée de la vitesse d&#8217;exécution du truc (il faudrait que je regarde ce qui se fait à coté).</p>
<p>Si certains ont des suggestions, elles sont les bienvenues&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/le-petit-projet-des-vacances/feed</wfw:commentRss>
		</item>
		<item>
		<title>L&#8217;illimité selon Bouygue</title>
		<link>http://inaps.org/journal/lillimite-selon-bouygue</link>
		<comments>http://inaps.org/journal/lillimite-selon-bouygue#comments</comments>
		<pubDate>Wed, 09 Apr 2008 21:01:04 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Coup de gueule]]></category>

		<category><![CDATA[Bouygue]]></category>

		<category><![CDATA[GSM]]></category>

		<category><![CDATA[Internet]]></category>

		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/lillimite-selon-bouygue</guid>
		<description><![CDATA[Bouygue télécom a annoncé au début du mois de mars une nouvelle option &#8220;data&#8221; illimitée pour faire comme ses petits copains (avec lesquels il s&#8217;entend si bien), l&#8217;option Web &#038; Mail. Sauf que Bouygue à une conception un peu particulière de l&#8217;illimité :

L&#8217;option illimitée l&#8217;est, mais pas pour plus de 500Mo par mois, au delà, [...]]]></description>
			<content:encoded><![CDATA[<p>Bouygue télécom a annoncé au début du mois de mars une nouvelle option &#8220;data&#8221; illimitée pour faire comme ses petits copains (avec lesquels il s&#8217;entend si bien), l&#8217;option <strong>Web &#038; Mail</strong>. Sauf que Bouygue à une conception un peu particulière de l&#8217;illimité :</p>
<ul>
<li>L&#8217;option illimitée l&#8217;est, mais pas pour plus de 500Mo par mois, au delà, c&#8217;est 1 euro par Mo</li>
<li>L&#8217;option illimitée limite son utilisation sur le mobile, les ordinateurs et PDA ne doivent pas utiliser le mobile comme modem (cela dit, ce n&#8217;est pas une limitation technique).</li>
<li>L&#8217;option illimitée est limitée au port 80 et 110 (pop3). Pour l&#8217;https, on doit passer par un proxy Bouygue, le reste, c&#8217;est nada. Exit donc l&#8217;utilisation d&#8217;SSH, Jabber, IRC, ou même simplement d&#8217;IMAP.</li>
<li>Enfin, l&#8217;option illimitée limite la taille maximum des fichiers que l&#8217;on peut télécharger à 600Ko, au delà, la connexion au serveur se coupe.</li>
</ul>
<p>Si c&#8217;est pas du joli foutage de gueule tout ça&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/lillimite-selon-bouygue/feed</wfw:commentRss>
		</item>
		<item>
		<title>En vrac</title>
		<link>http://inaps.org/journal/envrac-040308</link>
		<comments>http://inaps.org/journal/envrac-040308#comments</comments>
		<pubDate>Tue, 04 Mar 2008 00:41:05 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[iNaPs]]></category>

		<category><![CDATA[eeepc]]></category>

		<category><![CDATA[FreeBSD]]></category>

		<category><![CDATA[jeux]]></category>

		<category><![CDATA[Phun]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/envrac-040308</guid>
		<description><![CDATA[
Cette fois ci c&#8217;est à la branche 7.0 de FreeBSD de releaser sa version stable. Celle ci devient donc la version stable &#8220;officielle&#8221; de FreeBSD. Y&#8217;a de l&#8217;upgrade dans l&#8217;air :-). Quelques infos sur DLFP sur le sujet.
Ça m&#8217;a repris ! Cette fois ci, pour assouvir mes pulsions de gamer j&#8217;ai du me payer une [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>Cette fois ci c&#8217;est à la branche 7.0 de FreeBSD de releaser sa version stable. Celle ci devient donc la version stable &#8220;officielle&#8221; de FreeBSD. Y&#8217;a de l&#8217;upgrade dans l&#8217;air :-). <a href="http://linuxfr.org/2008/02/28/23772.html">Quelques infos sur DLFP sur le sujet</a>.</li>
<li>Ça m&#8217;a repris ! Cette fois ci, pour assouvir mes pulsions de gamer j&#8217;ai du me payer une nouvelle carte graphique. Bon, c&#8217;est la dernière fois que j&#8217;upgrade cette config (qui est passée progressivement depuis 2002, du PIV 1.7Ghz / 256Mo de ram / Radeo 7500 à l&#8217;AMD 3000+ / 1Go de ram / Nvidia GF 7600GT). Cette petite mise à jour m&#8217;aura permit de jouer à des jeux récents qui nécessitent le support des Shaders 3, et un peu plus de fluidité dans les autres.</li>
<li>Dans la série des &#8220;je découvre un truc totalement inutile mais pourtant je passe 2h dessus&#8221; voici <a href="http://www.vrlab.umu.se/research/phun/">Phun</a>. C&#8217;est un programme qui permet de &#8220;jouer&#8221; avec un moteur physique en 2D. Il y a tout plein de possibilités que je laisserais aux intéressés la joie de découvrir eux même.</li>
<li>Apparement, l&#8217;EEEPC d&#8217;Asus sortira bientôt dans une version avec écran 9 pouces, avec un SSD plus gros et 1Go de ram. Finalement, j&#8217;ai bien fait de ne pas me jeter vers la première version venue&#8230;</li>
</ul>
<p>Flemme de me relire ce soir, je ferais ça demain&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/envrac-040308/feed</wfw:commentRss>
		</item>
		<item>
		<title>Steam Presence !§</title>
		<link>http://inaps.org/journal/steampresence</link>
		<comments>http://inaps.org/journal/steampresence#comments</comments>
		<pubDate>Sat, 09 Feb 2008 11:10:53 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Developpement]]></category>

		<category><![CDATA[steam jeux python développement]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/steampresence</guid>
		<description><![CDATA[
SteamPresence est un petit programme que j&#8217;ai réalisé avec l&#8217;aide de Sunny (pour la classe SteamPresence qui parse tout le caca juteux du site de Steam). Ce programme permet de garder un oeil sur ses amis gamers inscrits sur steam pour les rejoindres quand ils sont en train de jouer. Une fois lancé, il se [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/static/pools/steampresence/icon.png" alt="Steam Presence en action" style="float: left;"/></p>
<p>SteamPresence est un petit programme que j&#8217;ai réalisé avec l&#8217;aide de <a href="http://sunfox.org">Sunny</a> (pour la classe SteamPresence qui parse tout le caca juteux du site de Steam). Ce programme permet de garder un oeil sur ses amis gamers inscrits sur steam pour les rejoindres quand ils sont en train de jouer. Une fois lancé, il se place dans la zone de notification et affiche une bulle verte ou rouge selon l&#8217;état de l&#8217;ami.</p>
<h4>Comment ça marche ?</h4>
<p>C&#8217;est très simple, il suffit de lancer le programme avec comme seul et unique argument l&#8217;identifiant de l&#8217;ami sur steam community. Par exemple, l&#8217;adresse de mon profil est <a href="http://steamcommunity.com/id/grillepain">http://steamcommunity.com/id/<strong>grillepain</strong></a>, mon identifiant est &#8220;grillepain&#8221;. Il faut donc que je lance le programme comme ceci : <samp>./steam_presence.py grillepain</samp>.</p>
<p>Sous gnome, vous pouvez utiliser les &#8220;programmes au démarrage&#8221; pour lancer automatiquement steam_presence. Je n&#8217;ai pas testé sur d&#8217;autres environnements.</p>
<p>Sous Windows le programme fonctionne mais ne permet pas d&#8217;afficher le menu (je corrigerais ce bug à l&#8217;occasion).</p>
<h4>Et techniquement ?</h4>
<p>Techniquement parlant, ce programme est fait en Python (étonnant ;)) avec PyGTK (sans glade cette fois, pas utile). Pour sa classe SteamPresence, Sunny à utilise Beautiful Soup, un module python qui permet de parser &#8220;facilement&#8221; du html tout crado. Ah oui, et il est sous GPL.</p>
<h4>Je trouve ça où ?</h4>
<h5>Deux moyens, le SVN :</h5>
<p>La version de développement :</p>
<p><code>svn checkout svn://dev.inaps.org/inaps/steam_presence/trunk/ .</code></p>
<p>La release 1.0 :</p>
<p><code>svn checkout svn://dev.inaps.org/inaps/steam_presence/tags/1.0/ .</code></p>
<h5>Le ftp/http :</h5>
<p>Direction le miroir bearnaise en <a href="ftp://miroir.bearnaise.net/steam_presence">ftp</a> ou <a href="http://miroir.bearnaise.net/steam_presence">http</a>, choisisez l&#8217;archive qui vous convient.</p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/steampresence/feed</wfw:commentRss>
		</item>
		<item>
		<title>Les itérateurs et générateurs en Python</title>
		<link>http://inaps.org/journal/les-iterateurs-et-generateurs-en-python</link>
		<comments>http://inaps.org/journal/les-iterateurs-et-generateurs-en-python#comments</comments>
		<pubDate>Sat, 26 Jan 2008 18:45:11 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Developpement]]></category>

		<category><![CDATA[Programmation]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/les-iterateurs-et-generateurs-en-python</guid>
		<description><![CDATA[La boucle for en python ne fonctionne pas comme dans la majorité des autres langages de programmation. Elle permet de parcourir les objets &#8220;itérables&#8221;, c&#8217;est à dire, de manière générale, les chaines, les listes, les tuples et les dictionnaire. En réalité, la boucle for à besoin d&#8217;un objet iterator pour fonctionner. Cet objet possède une [...]]]></description>
			<content:encoded><![CDATA[<p>La boucle for en python ne fonctionne pas comme dans la majorité des autres langages de programmation. Elle permet de parcourir les objets &#8220;itérables&#8221;, c&#8217;est à dire, de manière générale, les chaines, les listes, les tuples et les dictionnaire. En réalité, la boucle for à besoin d&#8217;un objet <em>iterator</em> pour fonctionner. Cet objet possède une méthode next() qui renvoit à tour de rôle chacunes des valeurs que doit renvoyer l&#8217;objet pour chaque itération, et déclenche une exception <em>StopIteration</em> quand il arrive au bout. Petit exemple avec une liste :</p>
<pre><code>&gt;&gt;&gt; liste = ['Python', 'c\'est', 'bon']
&gt;&gt;&gt; iterateur = liste.__iter__()
&gt;&gt;&gt; iterateur
&lt;listiterator object at 0x808968c&gt;
&gt;&gt;&gt; iterateur.next()
'Python'
&gt;&gt;&gt; iterateur.next()
&quot;c'est&quot;
&gt;&gt;&gt; iterateur.next()
'bon'
&gt;&gt;&gt; iterateur.next()
Traceback (most recent call last):
  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;
StopIteration
</code></pre>
<p>Comme vous pouvez le constater, chaque liste possède une méthode __iter__() qui retourne un objet iterator. Cet objet peut aussi être obtenu grace à la primitive iter(objet). On peut donc conclure qu&#8217;un objet itérable est un objet qui possède une méthode __iter__() qui retourne elle même un objet iterator.</p>
<p>En python, on ne se soucie pas de savoir si tel objet est de tel type, mais plutôt de savoir si l&#8217;on peut faire telle chose avec tel objet. On appel cela le <em>duck typing</em> : &#8220;Si ça marche comme un canard, que ça fait coin coin comme un canard, alors on peut appeler ça un canard&#8221;. Il est donc possible de créer très simplement un itérateur, et par extension un objet itérable :</p>
<pre><code>&gt;&gt;&gt; class Iterateur:
...     i = 0
...     def next(self):
...             if self.i &gt;= 10: raise StopIteration
...             self.i += 1
...             return 2**self.i
...     def __iter__(self): return self
...
&gt;&gt;&gt; objet_iterateur = Iterateur()
&gt;&gt;&gt; for i in objet_iterateur: print i
...
1
2
4
8
16
32
64
128
256
512</code></pre>
<h4>Les générateurs</h4>
<p>Les générateurs sont une manière de créer des itérateurs. Il existe deux moyens d&#8217;utiliser les générateurs : au travers d&#8217;une fonction en utilisant le mot clé <samp>yield</samp> au lieu de <samp>return</samp> et en utilisant les &#8220;generator expressions&#8221; qui ressemblent à la définition de liste par &#8220;list comprehension&#8221;.</p>
<p>Puisqu&#8217;un petit exemple vaut mieux qu&#8217;un beau discours :</p>
<pre><code>&gt;&gt;&gt; def iterateur():
...     for i in xrange(10):
...             yield 2**i
...
&gt;&gt;&gt; for i in iterateur(): print i
...
1
2
4
8
16
32
64
128
256
512</code></pre>
<p>Et de manière plus concise avec les &#8220;<em>generator expressions</em>&#8221; (voir <a href="http://inaps.org/journal/python-et-la-comprehension-de-liste-exemples">mon billet sur la compréhension de liste</a> pour voir des exemples de la syntaxe générale, le seul différence résidant dans l&#8217;utilisation des parenthèses au lieu des crochets) :</p>
<pre><code>&gt;&gt;&gt; for i in (2**x for x in xrange(10)): print i
...
1
2
4
8
16
32
64
128
256
512</code></pre>
<p>Comprendre les itérateurs et les générateurs permet de rendre son code plus concis et de mieux comprendre le fonctionnement de Python avec les objets itérables.</p>
<h4>A voir</h4>
<ul>
<li><a href="http://www.dabeaz.com/generators/">Pleins d&#8217;exemples sur l&#8217;utilisation des generators et des generators expressions</a> (via <a href="http://www.biologeek.com/">David</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/les-iterateurs-et-generateurs-en-python/feed</wfw:commentRss>
		</item>
		<item>
		<title>Python et la compréhension de liste : exemples</title>
		<link>http://inaps.org/journal/python-et-la-comprehension-de-liste-exemples</link>
		<comments>http://inaps.org/journal/python-et-la-comprehension-de-liste-exemples#comments</comments>
		<pubDate>Sat, 26 Jan 2008 18:38:54 +0000</pubDate>
		<dc:creator>Antoine</dc:creator>
		
		<category><![CDATA[Developpement]]></category>

		<category><![CDATA[Programmation]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://inaps.org/journal/python-et-la-comprehension-de-liste-exemples</guid>
		<description><![CDATA[Python 3000, la prochaine version de Python, va supprimer un certain nombre de primitives pourtant bien utiles, tels que map() et filter(). A la place, la solution recommandée est l&#8217;utilisation des &#8220;list comprehension&#8221;, où en francais, compréhension de liste. Wikipedia nous propose cette définition :
Une liste, comme un ensemble, peut-être définie par la donnée d&#8217;une [...]]]></description>
			<content:encoded><![CDATA[<p>Python 3000, la prochaine version de Python, va supprimer un certain nombre de primitives pourtant bien utiles, tels que <samp>map()</samp> et <samp>filter()</samp>. A la place, la solution recommandée est l&#8217;utilisation des <em>&#8220;list comprehension&#8221;</em>, où en francais, compréhension de liste. Wikipedia nous propose cette définition :</p>
<blockquote><p>Une liste, comme un ensemble, peut-être définie par la donnée d&#8217;une propriété caractéristique de ses éléments, on dit qu&#8217;on l&#8217;a définie en compréhension. Comme cette construction offre des avantages de lisibilité et de concision, certains langages de programmation proposent donc la possibilité de définir une liste par une propriété caractéristique et l&#8217;on appelle cela la compréhension de liste.</p></blockquote>
<p>Avant de débuter avec les exemples, voici la grammaire des compréhension de liste en Python telle qu&#8217;<a href="http://www.python.org/doc/2.4.1/ref/lists.html">elle est donnée</a> dans la documentation :</p>
<blockquote><pre>test 	 	::=  	and_test ( "or" and_test )* | lambda_form
testlist 	::= 	test ( "," test )* [ "," ]
list_display 	::= 	"[" [listmaker] "]"
listmaker 	::= 	expression ( list_for | ( "," expression )* [","] )
list_iter 	::= 	list_for | list_if
list_for 	::= 	"for" expression_list "in" testlist [list_iter]
list_if 	::= 	"if" test [list_iter]</pre>
</blockquote>
<h4>Exemple 1 : équivalence à map :</h4>
<p>Trouver les 10 premières puissances de 2, avec map :</p>
<p><code>map(lambda x: 2**x, xrange(10))</code></p>
<p>Avec la compréhension de listes :</p>
<p><code>[2**x for x in xrange(10)]</code></p>
<h4>Exemple 2 : équivalence à filter :</h4>
<p>Trouver les nombres pairs parmis les nombres de 0 à 9, avec filter() :</p>
<p><code>filter(lambda x:x%2 == 0, xrange(10))</code></p>
<p>Avec la compréhension de listes :</p>
<p><code>[x for x in xrange(10) if x%2==0]</code></p>
<h4>Exemple 3 : les deux à la fois :</h4>
<p>Trouver la puissance de deux des nombres pairs de 0 à 9 (oui c&#8217;est totalement inutile), avec map() et filter() :</p>
<p><code>map(lambda x:2**x, filter(lambda x:x%2==0, xrange(10)))</code></p>
<p>Et avec les compréhension de listes :</p>
<p><code>[2**x for x in xrange(10) if x%2==0]</code></p>
<p>Un peu plus compréhensible non ?</p>
<h4>Exemple 4 : Renvoyer plusieurs résultats</h4>
<p>On reprend l&#8217;exemple des puissances de deux, mais on veut renvoyer cette fois ci, à la fois le nombre calculé, et sa puissance :</p>
<p><code>[(x, 2**x) for x in xrange(10)]</code></p>
<p>Et avec un for pour gérer l&#8217;affichage :</p>
<pre><code>for n, v in [(x, 2**x) for x in xrange(10)]:
     print "2^%s = %s" % (n, v)</code></pre>
<p>Résultat :</p>
<blockquote><p>2^0 = 1<br />
2^1 = 2<br />
2^2 = 4<br />
2^3 = 8<br />
2^4 = 16<br />
2^5 = 32<br />
2^6 = 64<br />
2^7 = 128<br />
2^8 = 256<br />
2^9 = 512</p></blockquote>
<p>Pratique !</p>
]]></content:encoded>
			<wfw:commentRss>http://inaps.org/journal/python-et-la-comprehension-de-liste-exemples/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
