<?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>Romain&#039;s blog &#187; Programmation</title>
	<atom:link href="http://blog.p.engu.in/category/programmation/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.p.engu.in</link>
	<description>Toute une continuité d&#039;informations inutiles.</description>
	<lastBuildDate>Sun, 02 May 2010 14:50:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Activité IRC</title>
		<link>http://blog.p.engu.in/2010/05/02/activite-irc/</link>
		<comments>http://blog.p.engu.in/2010/05/02/activite-irc/#comments</comments>
		<pubDate>Sun, 02 May 2010 14:31:38 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ma vie]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[irc]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=839</guid>
		<description><![CDATA[Je suis tombé hier sur le post suivant : http://www.phoboslab.org/log/2010/05/9-years-of-sleep J'ai trouvé l'idée surpuissante, malheureusement, d'une part il n'a pas rendu public son code, et d'autre part, de toute façon, il opère sur des logs mIRC, moi même utilisant irssi. C'est pourquoi je me suis mis en tête de réaliser un programme ayant pour but [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:33e210228dedc9486aebcdbf73f87671258a87c6'><p>Je suis tombé hier sur le post suivant :</p>
<p><a href="http://www.phoboslab.org/log/2010/05/9-years-of-sleep">http://www.phoboslab.org/log/2010/05/9-years-of-sleep</a></p>
<p>J'ai trouvé l'idée surpuissante, malheureusement, d'une part il n'a pas rendu public son code, et d'autre part, de toute façon, il opère sur des logs <a href="http://fr.wikipédia.org/wiki/mIRC">mIRC</a>, moi même utilisant <a href="http://www.irssi.org">irssi</a>.</p>
<p>C'est pourquoi je me suis mis en tête de réaliser un programme ayant pour but de générer un graph similaire, à partir de mes sept ans de logs.<br />
Et ça donne ça :</p>
<div style="width: 100%; overflow: auto;">
  <a href="http://peerfuse.org/~rom1/irssleep/output.png"><img src="http://peerfuse.org/~rom1/irssleep/output.png" /></a>
</div>
<p>Mon irssi étant lancé en permanence, plutôt que de regarder les ouvertures/fermetures de session, je tente de deviner les moments où je suis actif sur IRC (donc où j'écris), avec un <i>idle time</i> de deux heures.</p>
<p>Ayant plus de 500Mo de logs, j'ai écris le programme en C, avec la possibilité de lancer des jobs simultanément, ce qui au final s'est révélé peut-être overkill, puisque sur ma machine cela s'exécute en moins de dix secondes.</p>
<p>Ne trouvant rien de satisfaisant pour faire des graphes comme celui-ci, je dessine moi-même l'image avec <a href="http://docs.enlightenment.org/api/imlib2/html/">Imlib2</a> (qui a une documentation et une API bien moisie, au passage).</p>
<p>Ainsi, contrairement à mon con mais néanmoins frère cité au début, je mets à disposition les sources, que vous pourrez trouver sur le <a href="http://git.symlink.me/?p=romain/irssleep.git;a=summary">dépôt git</a> :</p>
<pre>$ git clone git://git.symlink.me/pub/romain/irssleep.git</pre>
<p>Lire <b>README</b> pour savoir comment compiler et exécuter.</p>
<p>À titre d'information, pour ma part je lance la commande suivante :</p>
<pre>$ ./irssleep -j 5\
             -n romain\
             -e 1/5/2003,1/8/2006,School\
             -e 1/2/2005,Black-hole\
             -e "10/12/2006,Irssi at home"\
             -e 1/10/2006,31/6/2008,Bordeaux\
             -e 10/7/2008/,27/08/2009,INL\
             -e 15/12/2008,Katin\
             -e 1/12/2009,1/1/2011,Proformatique\
             irclogs/**/*</pre>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2010/05/02/activite-irc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le suppositoire du web</title>
		<link>http://blog.p.engu.in/2010/04/06/le-suppositoire-du-web/</link>
		<comments>http://blog.p.engu.in/2010/04/06/le-suppositoire-du-web/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 07:00:56 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[weboob]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=829</guid>
		<description><![CDATA[Le web, c'est le mal. Et pourtant, on est contraint de vivre avec lui au quotidien, puisqu'il semble que le Cloud Computing est la voie de l'avenir. Mes amis, allons nous rester les bras ballants, à devoir supporter l'utilisation de navigateurs tous plus lourds les uns que les autres, ne s'intégrant pas dans notre environnement [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:7d1e90392fc2a234a74877fa7ed9c22eaa8b7025'><p>Le web, c'est le mal. Et pourtant, on est contraint de vivre avec lui au quotidien, puisqu'il semble que le <a href="http://fr.wikipedia.org/wiki/Cloud_Computing">Cloud Computing</a> est la voie de l'<i>avenir</i>.</p>
<p>Mes amis, allons nous rester les bras ballants, à devoir supporter l'utilisation de navigateurs tous plus lourds les uns que les autres, ne s'intégrant pas dans notre environnement de bureau ? Mais pire encore, qui nous font perdre notre liberté. La liberté de choisir les applications que l'on souhaite, le traitement de nos données par des logiciels tiers, la liberté de bénéficier de l'ergonomie qui nous arrange ?</p>
<p>Heureusement, ces contraintes sont peut-être bientôt révolues. Je tiens en effet à vous présenter <b><a href="http://weboob.org">weboob</a></b>.</p>
<p>Projet complémentaire à <a href="http://minbif.im">Minbif</a>, qui permet d'utiliser son client IRC favori pour accéder aux réseaux de messagerie instantanée, qui sort ce lundi 5 avril en <a href="http://symlink.me/news/28">version 1.0.2</a>, et au sujet duquel une <a href="http://2010.rmll.info/Minbif-Une-passerelle-IRC-vers-le.html">conférence</a> se déroulera aux <a href="http://2010.rmll.info">RMLL 2010</a>, <a href="http://weboob.org">weboob</a> (<b>WEB Out Of Browsers</b>) se veut un espoir pour tous les révoltés qui ne supportent plus d'être à la merci des ”webmaster”.</p>
<p><b>Weboob</b> est un projet qui a pour but de réunir un nombre important de modules maintenus pour divers sites web, offrant une interface logique avec eux. Chaque module implémente des <i>capabilities</i>, décrivant les services offerts.</p>
<p>À partir de là, des applications utilisateurs sont réalisées, reposant sur des modules implémentant telle ou telle <i>capability</i>, et permettant une interaction riche avec les sites web.</p>
<p>La particularité est que la couche d'abstraction offerte par weboob permet aux applications de ne pas se soucier des modules qui sont chargés. L'utilisateur rempli une première fois une configuration en sélectionnant les sites web qu'il souhaite voir utilisé, et avec quelle configuration. Puis après, quelque soit l'application utilisée, il n'aura plus à se soucier des sites qui sont derrière les opérations qu'il effectue.</p>
<p><span id="more-829"></span></p>
<p>Afin de mieux montrer le potentiel de weboob, voici quelques cas d'utilisation concrets :</p>
<h4>Monboob</h4>
<p>Cette application est en fait un démon. Il se repose sur les modules qui implémentent les <i>capabilities</i> <b>ICapMessages</b> et dérivés. Pour le moment seul le module <a href="http://linuxfr.org">DLFP</a> (linuxfr.org) est implémenté, mais pourront voir le jour non seulement des modules pour <a href="http://slashdot.org">Slashdot</a>, <a href="http://reddit.com">Reddit</a>, ou autres sites de news, mais également des moteurs de forum.</p>
<p>L'idée est d'une part d'envoyer par mail non seulement les articles, mais aussi les commentaires associés. Et d'autre part, lorsqu'on répond à ce mail avec son client préféré, de poster cette réponse.</p>
<p>Voici ce que ça donne :</p>
<p><a href="http://peerfuse.org/~rom1/weboob/dlfp1.png"><img src="http://peerfuse.org/~rom1/weboob/dlfp1_mini.png" /></a></p>
<p><a href="http://peerfuse.org/~rom1/weboob/dlfp2.png"><img src="http://peerfuse.org/~rom1/weboob/dlfp2_mini.png" /></a></p>
<p>Increase de sa productivity : maximum.</p>
<h4>travel</h4>
<p>Cette application en console utilise les modules implémentant <b>ICapTravel</b> et dérivés. Les sites supportés pour le moment sont <a href="http://canaltp.com">CanalTP</a> (pour les horaires de TGV/Corail/TER), et <a href="http://transilien.fr">transilien.fr</a> (pour les horaires de transilien, RER, bus, sur Paris).</p>
<p>On peut faire une recherche sur les gares :</p>
<pre>$ travel stations defense
.--------------------------------.---------------------------------------------.
| ID                             | Name                                        |
+--------------------------------+---------------------------------------------+
| LDU                            | LA DEFENSE GARE SNCF                        |
| GAW                            | LA DEFENSE RER A                            |
| OCE87382218                    | gare de La Défense (92800)                  |
+--------------------------------'---------------------------------------------+
|   3 stations listed                                                          |
'------------------------------------------------------------------------------'</pre>
<p>Et à partir de là, récupérer les horaires d'une gare donnée :</p>
<pre>$ travel departures GAW
.-----.-----------.-------.-----------------------.-------.--------------------.
| ID  | Type      | Time  | Arrival               | Late  | Info               |
+-----+-----------+-------+-----------------------+-------+--------------------+
|   0 | QTIE      | 09:30 | MARNE LA VALLEE CHESSY|       | Voie 1             |
|   1 | UBOS      | 09:32 | CERGY LE HAUT         |       | Voie 2             |
|   2 | OKEY      | 09:33 | TORCY MARNE LA VALLEE |       | Voie 1             |
|   3 | TEDY      | 09:37 | POISSY                |       | Voie 2             |
|   4 | QTIE      | 09:40 | MARNE LA VALLEE CHESSY|       | Voie 1             |
|   5 | UBOS      | 09:41 | CERGY LE HAUT         |       | Voie 2             |
+-----'-----------'-------'-----------------------'-------'--------------------+
|   6 departures listed                                                        |
'------------------------------------------------------------------------------'</pre>
<p>On peut constater que l'intégration entre les deux backends est faite de façon plus ou moins transparente. En effet, ainsi que l'on voit dans la liste des gares, les identifiants courts sont issus de transilien.fr, et les identifiants longs de CanalTP. Ainsi, pour récupérer les horaires de TGV, on préfèrera utiliser un ID long. Une amélioration au niveau de la présentation est à faire.</p>
<p>Il est à noter qu'un frontend similaire graphique est en préparation pour Nokia N900.</p>
<p>Un autre aspect de cette application serait de permettre la réservation de billets de TGV en ligne, en se reposant sur le site web dont la notoriété n'est malheureusement plus à faire, <a href="http://www.voyage-sncf.fr">voyage-sncf</a>.</p>
<h4>boobank</h4>
<p>Application toujours en console, changeant les modules implémentant la capability <b>ICapBank</b>, et permet de récupérer des informations de site bancaire. L'avantage de weboob est que si vous possédez des comptes dans plusieurs banques, vous pourrez afficher vos comptes de manière unifiée.</p>
<p>Pour le moment, seul le module <a href="http://www.bnpparibas.net">bnporc</a>, issus du <a href="http://bnporc.symlink.me">projet éponyme</a> que j'avais implémenté il y a un an de cela, est implémenté.</p>
<p>On peut ainsi récupérer la liste de ses comptes :</p>
<pre>$ boobank list
               ID   Account                    Balance        Coming
+-----------------+---------------------+--------------+-------------+
  1255000XXXXXXXX   Compte de chèques          -314.13      -1110.36
  1255000XXXXXXXX   Livret Jeune                 74.17          0.00</pre>
<p>Et également obtenir un détail des opérations à venir :</p>
<pre>$ boobank coming 1255000XXXXXXXX
      Date   Label                                                     Amount
+----------+----------------------------------------------------+-------------+
  20100503   FACTURE CARTE DU 310310 SNC HAUDRECHY 92 PUTEA        -28.70
  20100503   FACTURE CARTE DU 310310 LA DIVA 92 PUTEAUX CAR        -30.50
  20100503   FACTURE CARTE DU 310310 TAVERNE OLYMPIA 75 PAR        -26.80
  20100503   FACTURE CARTE DU 260310 SNC HAUDRECHY 92 PUTEA        -27.50</pre>
<p>On peut imaginer réaliser des graphes à partir de ces données, les stocker au fur et à mesure pour voir l'évolution des comptes, et même pourquoi pas imaginer un démon qui mettrait à jour régulièrement et enverrait des alertes en cas de mouvements inhabituels.</p>
<h4>Conclusion</h4>
<p>On se rend compte que la séparation entre les backends (les modules accédant aux sites web) et les frontends (les applications faisant appel à ces modules par l'intermédiaire de weboob), et la couche d'abstraction que représente weboob entre les deux, permet de concentrer les efforts, d'une part sur la simple <i>boobisation</i> des sites web, de par les outils que fournis weboob, et d'autre part sur le traitement de ces données. Ainsi, un même set de backends peut être utilisé par des applications différentes, graphiques ou non.</p>
<p>Il n'y a pour l'instant que quelques modules, et des applications certes fonctionnelles mais assez pauvres en traitement des données. Mais il y a là une formidable opportunité d'améliorer considérablement cela et de permettre de retirer de plus en plus le web pour les besoins quotidiens.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2010/04/06/le-suppositoire-du-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Roadmap 2010 Minbif sur IRC</title>
		<link>http://blog.p.engu.in/2010/02/20/roadmap-2010-minbif-sur-irc/</link>
		<comments>http://blog.p.engu.in/2010/02/20/roadmap-2010-minbif-sur-irc/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 15:39:57 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[minbif]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=825</guid>
		<description><![CDATA[Minbif est déjà une passerelle IRC vers réseaux de messageries instantanées stable et largement utilisable. Néanmoins, afin de mieux satisfaire les attentes des utilisateurs, une réunion Roadmap 2010 va être organisée, afin de parler des objectifs de cette nouvelle année, les futures fonctionnalités que vous souhaiteriez voir dans Minbif, comment innover, mais aussi comment gagner [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:ce0d5cb1744607af771192f03520c0b714b55c71'><p><a href="http://minbif.im">Minbif</a> est déjà une passerelle IRC vers réseaux de messageries instantanées stable et largement utilisable.</p>
<p>Néanmoins, afin de mieux satisfaire les attentes des utilisateurs, une réunion <b>Roadmap 2010</b> va être organisée, afin de parler des objectifs de cette nouvelle année, les futures fonctionnalités que vous souhaiteriez voir dans Minbif, comment innover, mais aussi comment gagner en popularité, quel type de marketing on pourrait faire autour de Minbif, etc.</p>
<p><b>Minbif</b> vivant grâce à sa communauté, tout le monde peut se joindre à nous pour cet évènement :</p>
<pre>
Où:    #minbif-roadmap sur Freenode.
Quand: on Thursday 4th March 2010
De:    21:00 CET
À:     23:00 CET
De:    01:00 CET
À:     03:00 CET
</pre>
<p>Vous pourrez nous aider à rendre Minbif meilleur !</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2010/02/20/roadmap-2010-minbif-sur-irc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CACAcam</title>
		<link>http://blog.p.engu.in/2009/10/05/cacacam/</link>
		<comments>http://blog.p.engu.in/2009/10/05/cacacam/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 12:13:54 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[cacacam]]></category>
		<category><![CDATA[minbif]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=741</guid>
		<description><![CDATA[La communication est une nécessité dans notre société moderne, dont personne ne peut se passer, sous peine de se voir coupé du monde et d'être réduit à l'état d'ermite. La webcam joue un rôle important dans ce besoin d'échanges par Internet, permettant d'atteindre les interactions les plus folles. Mais qu'en est-il pour le geek qui [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:93ab1a8744af50d7117644d83161e9d596bb60e5'><p><img src="http://peerfuse.org/~rom1/minbif_caca.png" /></p>
<p>La communication est une nécessité dans notre société moderne, dont personne ne peut se passer, sous peine de se voir coupé du monde et d'être réduit à l'état d'ermite. La webcam joue un rôle important dans ce besoin d'échanges par Internet, permettant d'atteindre les interactions les plus folles.</p>
<p>Mais qu'en est-il pour le geek qui reste cantonné à son bon vieux terminal, se restreignant à IRC, ou tout au plus profitant d'outils dépassés tels que <a href="http://www.bitlbee.org">BitlBee</a> pour accéder aux messageries instantanées, sans avoir même la possibilité d'échanger de fichiers, contraint de se passer de toute autre forme d'échanges que celui du texte ? N'a-t-il pas le droit lui aussi de bénéficier des cam hots après avoir récupéré une proie facile et dépravée sur messagerie instantanée depuis le site de rencontre <a href="http://symlink.me/wiki/aum">Adopte un mec</a> ?</p>
<p>Heureusement pour lui, les laboratoires <a href="http://symlink.me">Symlink Me</a> apportent la solution !</p>
<p><a href="http://minbif.im">MinBif</a>, cette passerelle IRC libre vers plus d'une quinzaine de réseaux de messageries instantanées, déjà évoquée ici, et qui est parue la semaine dernière en <a href="http://symlink.me/news/show/16">version 1.0beta</a>, propose maintenant, outre le support des transferts de fichiers dans les deux sens, la <a href="http://symlink.me/wiki/minbif/CACAcam">CACAcam</a>.</p>
<p>Cette fonctionnalité permet de réceptionner, sur les réseaux de messageries instantanées supportés*, le flux de la webcam de son correspondant, et de l'afficher en ASCII Art dans son client IRC favori.</p>
<p>Comment cela marche-t-il ? Une fois accepté la proposition de session webcam, vous vous verrez proposé par le serveur un DCC CHAT. Celui-ci établi, vous recevrez les frames dans la fenêtre correspondante. Associé à un plugin irssi, vous verrez, dans la fenêtre de discussion de votre contact, une zone sur le coin supérieur droit contenant l'affichage de la vidéo.</p>
<p>Un exemple parlant davantage, voici, cachée derrière cette capture d'écran, une vidéo montrant le système en &#339;uvre :</p>
<p><a href="http://peerfuse.org/~rom1/cacacam_irssi2.ogv"><img src="http://peerfuse.org/~rom1/cacacam_irssi_mini.png" alt="cacacam" /></a><br /><i>Vidéo sous format OGV</i></p>
<p>MinBif 1.0beta2 devrait paraître très rapidement afin de proposer cette évolution majeure. <a href="http://symlink.me/wiki/minbif/CACAcam">Retrouvez ici les informations complémentaires sur la CACAcam</a>.</p>
<p><i>* Dans la limite des réseaux de messageries instantanées dont libpurple supporte le flux vidéo.</i></p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2009/10/05/cacacam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://peerfuse.org/~rom1/cacacam_irssi2.ogv" length="3522391" type="video/ogg" />
<enclosure url="http://peerfuse.org/~rom1/cacacam_irssi2.ogv" length="3522391" type="video/ogg" />
		</item>
		<item>
		<title>Évolutions MinBif</title>
		<link>http://blog.p.engu.in/2009/08/19/evolutions-minbif/</link>
		<comments>http://blog.p.engu.in/2009/08/19/evolutions-minbif/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 12:07:31 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=725</guid>
		<description><![CDATA[Transferts de fichiers Fonctionnalité tant attendue des grands mais aussi des petits, c'est le transfert de fichiers. Absente de BitlBee, réclamée de tous, primordiale dans les rapports sociaux sur messagerie instantanée, MinBif l'a faite ! Le fonctionnement est simple. En réception, lorsque vous acceptez de réceptionner le fichier, le téléchargement débute entre IM-&#62;MinBif en background. Dans [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:84a3ca8172627b048bb52b8e621b67aabc1301ca'><h4 id="transferts-de-fichiers">Transferts de fichiers</h4>
<p>Fonctionnalité tant attendue des grands mais aussi des <a href="http://pankkake.headfucking.net">petits</a>, c'est le transfert de fichiers.</p>
<p>Absente de <a href="http://www.bitlbee.org">BitlBee</a>, réclamée de tous, primordiale dans les rapports sociaux sur messagerie instantanée, <a href="http://symlink.me/wiki/minbif">MinBif</a> l'a faite !</p>
<p>Le fonctionnement est simple. En réception, lorsque vous acceptez de réceptionner le fichier, le téléchargement débute entre <em>IM-&gt;MinBif</em> en background. Dans le même temps, MinBif vous propose un <a href="http://en.wikipedia.org/wiki/Direct_Client-to-Client">DCC</a>, et le transfert <em>MinBif-&gt;IRC User</em> se fait en parallèle.</p>
<p>Pour l'envoie, ce serait pareil, sauf que ce serait exactement le contraire. L'utilisateur enverrait le fichier par DCC à MinBif, qui lui lancerait le transfert vers IM.</p>
<p>Pour le moment, seule la partie réception est <a href="http://git.symlink.me/?p=romain/minbif.git;a=commitdiff;h=da4e2f25a134125fcdb621dbc9bf71a4b0a37f14">implémentée</a>, et la partie d'envoi devrait être faite sous peu.</p>
<h4 id="webcam">Webcam</h4>
<p>Aujourd'hui est parue <a href="http://theflamingbanker.blogspot.com/2009/08/pidgin-260-its-about-time.html">libpurple 2.6</a>. Dans le <a href="http://developer.pidgin.im/wiki/ChangeLog">ChangeLog</a> apparaît un point vraiment très intéressant :</p>
<p><em>libpurple support maintenant la voix et la vidéo !</em></p>
<p>C'est une très bonne nouvelle pour <a href="http://symlink.me/wiki/minbif">MinBif</a>, car ce sera l'occasion d'implémenter la <em>CACAcam</em>.</p>
<p>Une autre idée plus <i>user friendly</i> et <i>usefull</i> m'est venue ce matin, ce serait d'ouvrir un flux <em>DCC CHAT</em> entre MinBif et l'utilisateur, dans lequel on ferait transiter les frames de la vidéo, et d'avoir un script <a href="http://www.irssi.org">irssi</a> qui l'affiche dans une fenêtre. Et si irssi est lancé sur un serveur, encore rajouter une couche pour que les données arrivent jusqu'à votre machine :)</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2009/08/19/evolutions-minbif/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Source code should look professional, even if some developers are not.</title>
		<link>http://blog.p.engu.in/2009/06/10/source-code-should-look-professional-even-if-some-developers-are-not/</link>
		<comments>http://blog.p.engu.in/2009/06/10/source-code-should-look-professional-even-if-some-developers-are-not/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 18:33:34 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[looooooooool]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=703</guid>
		<description><![CDATA[Ça, j'aime ! Le commit de Matthew Barnes, un employé Redhat, sur Evolution, m'a bien fait rire : 2009-04-12 Matthew Barnes &#60;mbarnes@redhat.com&#62; ** Remove a bunch of juvenile comments. Source code should look professional, even if some developers are not. La première chose que je constate, c'est que je ne suis pas le seul à [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:d64a7bba721cbc8e604178290a02a8aaff1ff0df'><p>Ça, j'aime ! Le <a href="http://git.gnome.org/cgit/evolution-data-server/commit/?id=d17494da8ebaba8673a581f256efc8a1d41e1e40">commit de Matthew Barnes</a>, un employé Redhat, sur Evolution, m'a bien fait rire :</p>
<pre><code>2009-04-12  Matthew Barnes  &lt;mbarnes@redhat.com&gt;

       ** Remove a bunch of juvenile comments.  Source code should
          look professional, even if some developers are not.
</code></pre>
<p>La première chose que je constate, c'est que je ne suis pas le seul à avoir du mal avec la glib, lorsque l'on voit des structures comme <strong>_glib_sux_donkeys</strong>, et des fonctions comme <strong>g_lib_sux_htor</strong>, <strong>g_lib_sux_htand</strong>, ou des commentaires qui veulent tout dire comme <strong>/* fucking glib... */</strong>. Je dois avouer que la fonction <strong>courier_imap_is_a_piece_of_shit</strong> est assez sympa aussi, tout comme ce commentaire qui finalement veut tout dire :</p>
<pre><code>/* FIXME: please god, when will the hurting stop? Thus function is so
   fucking broken it's not even funny. */
</code></pre>
<p>Je préfère donc avoir recours à un MUA sérieux dont les développeurs ont davantage de respect pour le code que pour leurs utilisateurs :</p>
<pre><code>rom1@nasiguv ~/mutt-1.5.17 $ grep -i fuck *
rom1@nasiguv ~/mutt-1.5.17 $ grep -i shit *
rom1@nasiguv ~/mutt-1.5.17 $ grep -i crap * -A 1
init.c:/* initial string that starts completion. No telling how much crap
init.c- * the user has typed so far. Allocate LONG_STRING just to be sure! */
rom1@nasiguv ~/mutt-1.5.17 $
</code></pre>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2009/06/10/source-code-should-look-professional-even-if-some-developers-are-not/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ses comptes bancaires en ligne de commande</title>
		<link>http://blog.p.engu.in/2009/06/02/ses-comptes-bancaires-en-ligne-de-commande/</link>
		<comments>http://blog.p.engu.in/2009/06/02/ses-comptes-bancaires-en-ligne-de-commande/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 17:59:38 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=676</guid>
		<description><![CDATA[Ceux qui maintenant savent comment sortir son python pour draguer seront peut-être intéressé d'apprendre que j'ai réitéré l'expérience avec le site de la BNP Paribas. En effet, las d'avoir à passer par Firefox pour aller sur un site lent et mal codé afin de savoir si je peux encore me permettre de sortir me bourrer [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:591ccf41318a020b494765eb006361105e24a352'><p>Ceux qui maintenant savent comment <a href="http://symlink.me/wiki/aum">sortir son python pour draguer</a> seront peut-être intéressé d'apprendre que j'ai réitéré l'expérience avec le site de la <a href="http://www.bnpparibas.net">BNP Paribas</a>.</p>
<p>En effet, las d'avoir à passer par Firefox pour aller sur un site lent et mal codé afin de savoir si je peux encore me permettre de sortir me bourrer la gueule, j'ai repris l'idée que j'avais eu pour <b>AuM</b>, et ai profité de mon arrêt maladie d'aujourd'hui pour écrire un petit programme dont le but est d'avoir une commande à lancer pour récupérer dans son terminal l'état de ses comptes :</p>
<pre>
$ ./bnporc.py -l 30141xxxxx list
Password:
  Compte                       Solde       À venir
+---------------------+--------------+-------------+
  Compte de chèques         xxx65.12       -160.18
  Livret Jeune              xxx71.86          0.00
  Prêt personnel            xxx46.39          0.00
</pre>
<p><i>Les 'x' sont placés à postériori dans l'unique but de maintenir ma vie privée.</i></p>
<p><span id="more-676"></span><br />
<h4>Identification graphique</h4>
<p>La particularité de ce site, c'est que pour s'identifier, il est nécessaire d'entrer son identifiant dans un champ texte, mais l'insertion de son mot de passe se fait graphiquement :</p>
<p><img src="http://peerfuse.org/~rom1/bnp.gif" /></p>
<p>L'image est générée pour positionner les chiffres à des emplacements aléatoires. Lorsque l'utilisateur clique sur une partie de l'image, le navigateur va rajouter dans un champ caché la position de la case cochée. C'est le serveur qui a stocké l'équivalence et qui va être en mesure de vérifier la validité.</p>
<p>Ainsi que l'on peut le voir, la grille est assez triviale à analyser. BNPorc va donc se contenter de parcourir l'image avec des sauts hardcodés et vérifiera la couleur du pixel en haut à gauche de chaque case pour tout d'abord savoir si la case contient ou pas un chiffre (puisque les chiffres ont un fond gris). Il ajoute alors le contenu de la case dans un buffer, hash le tout et compare avec les valeurs enregistrées pour retrouver le chiffre auquel la case correspond.<br />
Il est alors aisé, à partir du mot de passe numérique entrée au clavier par l'utilisateur de BNPorc, de retrouver les identifiants des cases à transférer au serveur.</p>
<h4>Code HTML pourri</h4>
<p>Une autre difficulté que j'ai rencontré, c'est la présence de code de merde. On trouve par exemple ceci :</p>
<pre>&lt;SCRIPT language=javascript&gt;
if (navigator.appName != "Microsoft Internet Explorer") {
    document.write('&lt;INPUT size="10" '); }
else {
    document.write('&lt;INPUT size="10" ');
}
&lt;/SCRIPT&gt;
maxlength="10" value="" name="ch1" type="text"&amp;gt;</pre>
<p>Allez savoir l'intérêt d'une telle manipulation, le problème que ça m'a posé c'est que, du coup, <a href="http://wwwsearch.sourceforge.net/mechanize/">mechanize</a> ne trouvait pas cette entrée là. Heureusement, après avoir cherché dans les tréfonds de la lib, ainsi que de ClientForm, il a été possible de rajouter à la main le champ.</p>
<h4>BNP's Original Reporter Client</h4>
<p>Ce petit outil est donc pour le moment limité au listing des comptes avec leur solde, mais il sera aisé de rajouter diverses informations, comme la liste de toutes les opérations à venir (notamment en ce qui concerne les achats effectués par carte bancaire).</p>
<p>Je pense qu'un tel outil apporte vraiment quelque chose, par exemple, on pourrait faire un indicateur dans la statusbar afin d'avoir le montant du compte, faire des stats sur ses achats (voir avec des regexp où part l'argent), rajouter un système d'alertes, etc.<br />
L'inconvénient, par contre, c'est que je n'ai plus d'excuses pour faire attention à ne pas être à découvert.</p>
<p>Le code source peut être récupéré par git :</p>
<pre>
$ git clone git://git.symlink.me/pub/romain/bnporc.git
</pre>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2009/06/02/ses-comptes-bancaires-en-ligne-de-commande/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Minbif 1.0alpha</title>
		<link>http://blog.p.engu.in/2009/05/10/minbif-10alpha/</link>
		<comments>http://blog.p.engu.in/2009/05/10/minbif-10alpha/#comments</comments>
		<pubDate>Sun, 10 May 2009 00:31:11 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/2009/05/10/minbif-10alpha/</guid>
		<description><![CDATA[Je vous parlais dans un autre billet du projet précédemment appelé BitlBee2, qui est une passerelle IRC vers des réseaux de messagerie instantanée. Sur le site du projet se trouvent l'annonce de la release, incluant le ChangeLog et l'archive de la release. Je dis précédemment appelé bitlbee2, tout simplement parce qu'en raison d'un conflit avec [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:afdaedcc64334f71d9dbaff61d417c67176a3334'><p>Je vous parlais dans un <a href="http://blog.p.engu.in/2009/04/19/du-caca-dans-bitlbee/">autre billet</a> du projet précédemment appelé <b>BitlBee2</b>, qui est une passerelle IRC vers des réseaux de messagerie instantanée.</p>
<p>Sur le <a href="http://symlink.me/wiki/minbif">site du projet</a> se trouvent <a href="http://symlink.me/projects/minbif/news">l'annonce de la release</a>, incluant le <a href="http://git.symlink.me/?p=romain/minbif.git;a=blob;f=ChangeLog;hb=1.0alpha">ChangeLog</a> et <a href="http://symlink.me/projects/list_files/minbif">l'archive de la release</a>.</p>
<p>Je dis <i>précédemment appelé bitlbee2</i>, tout simplement parce qu'en raison d'un conflit avec <a href="http://wilmer.gaast.net">Wilmer</a>, un des auteurs de BitlBee, suite à <a href="http://peerfuse.org/~rom1/bitlbee_reply.txt">quelques échanges</a> par email, puis des <a href="http://blog.p.engu.in/2009/04/19/du-caca-dans-bitlbee/comment-page-1/#comment-3803">commentaires de sa part</a> peu cordiaux sur mon autre billet, le projet a été amené à être renommé.</p>
<p>Cette version alpha a pour but de présenter le projet qui se trouve être dans un état utilisable, reprenant les principales fonctionnalités de BitlBee.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2009/05/10/minbif-10alpha/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Du caca dans bitlbee</title>
		<link>http://blog.p.engu.in/2009/04/19/du-caca-dans-bitlbee/</link>
		<comments>http://blog.p.engu.in/2009/04/19/du-caca-dans-bitlbee/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 13:04:53 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[bitlbee]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=641</guid>
		<description><![CDATA[MAJ: Ainsi que l'on peut le voir dans les commentaires, j'ai tenté de contacter par email Wilmer, un des auteurs de bitlbee, afin de lui parler du projet et d'avoir son avis concernant l'éventuelle utilisation du nom bitlbee2 pour le projet. L'accueil a été très cassant, me demandant de changer le nom, et cherchant à [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:6b86a1901cde1520a81b0b859fbe1f0188ebd2ee'><p><b>MAJ: Ainsi que l'on peut le voir dans les commentaires, j'ai tenté de contacter par email <i>Wilmer</i>, un des auteurs de <i>bitlbee</i>, afin de lui parler du projet et d'avoir son avis concernant l'éventuelle utilisation du nom <i>bitlbee2</i> pour le projet. L'accueil a été très cassant, me demandant de changer le nom, et cherchant à critiquer le projet plutôt que de voir les bonnes idées que j'essaie de pratiquer dans ce projet.</b><br />
<b>Je reviendrai sur cette histoire dans un billet prochain. En attendant, le projet s'appelle maintenant <a href="http://symlink.me/wiki/minbif">Minbif</a>.</b></p>
<p>Tout le monde connaît <a href="http://www.bitlbee.org">bitlbee</a>, cette passerelle <a href="http://fr.wikipedia.org/wiki/IRC">IRC</a> vers des protocoles d'<a href="http://fr.wikipedia.org/wiki/IM">IM</a>, qui a été créée il y a sept ans et qui est connu notamment pour son support <a href="http://fr.wikipedia.org/wiki/Jabber">Jabber</a> désastreux.</p>
<p>Lorsqu'il fut créé, ce projet avait pompé du code de <a href="http://fr.wikipedia.org/wiki/GAIM">GAIM</a>, un logiciel de messagerie instantanée d'abord orienté <a href="http://fr.wikipedia.org/wiki/AIM">AIM</a> puis qui est devenu multi-protocole. Bien évidemment, les récupérations upstreams se sont avérées faibles ou inexistantes, ainsi bitlbee bénéficie d'un support de très peu de protocoles : MSN Messenger, AIM, Yahoo et Jabber. En plus de ça, le code des protocoles de bitlbee est hacké de tous les côtés, et le support Jabber a mis très longtemps avant de devenir stable, même si il reste incomplet.<br />
En outre, bitlbee ne supporte qu'une ancienne version du protocole de MSN Messenger (MSNP8 alors qu'on en est à MSNP15), qui ne supporte pas les transferts de fichiers, et est très peu robuste. Un patch avait été établi sur une ancienne version de bitlbee pour supporter le protocole MSN9 et <a href="http://fr.wikipedia.org/wiki/MSN_Plus">MSN Plus!</a>, mais il ne fut pas intégré à bitlbee, notamment en raison de fonctionnalités potentiellement coûteuses comme le transfert de fichier, posant d'éventuels problèmes sur leur serveur <a href="irc://im.bitlbee.org/">bitlbee public</a>.</p>
<p>Ayant une installation propre de bitlbee, ne supportant plus les limitations de bitlbee, ne souhaitant pas m'attaquer au code incompréhensible (que j'avais eu l'occasion d'appercevoir lorsque j'avais fais un <a href="http://peerfuse.org/~rom1/patches/bitlbee1.2.2-notinlist.patch">patch</a>), et ayant du temps à perdre (bon ce n'est pas tout à fait vrai), je me suis donc lancé dans l'écriture d'une version 2 de bitlbee from scratch.</p>
<p>Écrit en C++, le grand apport de <b><a href="http://symlink.me/wiki/bitlbee2">Bitlbee 2</a></b> est d'utiliser la <a href="http://fr.wikipedia.org/wiki/Libpurple">libpurple</a>, cette bibliothèque en C (avec la Glib) créée par et pour <a href="http://www.pidgin.im">Pidgin</a>, le nouveau nom de GAIM après un <a href="http://en.wikipedia.org/wiki/Pidgin_(software)#Naming_dispute">litige avec AOL</a>, offre toute l'API nécessaire et suffisante pour créer des comptes permettant de se connecter à n'importe lequel des <b>13</b> protocoles supportés de base (sans compter les plugins) de façon transparente, gérer la liste des contacts, le transfert de fichier, etc.</p>
<p>Cherchant à éviter les défauts conceptuels de bitlbee, les changements fonctionnels seront (en partie) les suivants :</p>
<ul>
<li> Suppression du robot <b>root</b>. Tout passe maintenant exclusivement par des commandes IRC.</li>
<li> Un <i>compte</i> est représenté par un serveur IRC. Ceux qui ignorent l'architecture d'un réseau IRC, celui-ci est composé de plusieurs serveurs reliés les uns aux autres, généralement en étoile.</li>
<li> La commande <b>/map</b> est utilisée pour lister les comptes, mais aussi en rajouter, en supprimer ou en modifier.</li>
<li> Pour se connecter à un compte, la commande à utiliser est naturellement /sconnect, et /squit pour s'y déconnecter.</li>
<li> Remplaçant l'identifiant numérique unique de bitlbee1, il y a maintenant deux manières de représenter un compte. L'identifiant court se présente sous forme <b>&lt;proto&gt;&lt;num&gt;</b> ou sous forme longue (utilisée pour les serveurs) <b>&lt;username&gt;:&lt;proto&gt;&lt;num&gt;</b>. Par exemple, <b>romain@example.com:jabber0</b>.</li>
<li> Chaque compte a son propre salon de statut. Il est également possible de faire partager le même salon de statut à plusieurs comptes.</li>
<li> Les salons de statut débutent par '&amp;' alors que les salons sur IM débutent par '#'.</li>
<li> La commande /invite sera utilisée sur le salon de statut pour ajouter quelqu'un dans ses contacts.</li>
<li> La commande /kick pourra être utilisée pour retirer quelqu'un de ses contacts, et /ban pour bloquer le contact.</li>
</ul>
<p>Le but à terme est de réimplémenter toutes les fonctionnalités de bitlbee à travers les commandes IRC, et des extra. Je me suis par exemple intéressé ce matin à réaliser ceci :<br />
<img src="http://peerfuse.org/~rom1/bitlbee_icon.png" /><br />
<i>rendu ASCII-art de l'avatar avec <a href="http://caca.zoy.org/wiki/libcaca">libcaca</a></i></p>
<p>Malheureusement, libpurple ne supporte pas la webcam, ce qui est fort dommage, mais j'ai d'autres idées sympa en tête.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2009/04/19/du-caca-dans-bitlbee/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>[C++] Des défauts du C++ (Part 2) : pointeurs de fonctions</title>
		<link>http://blog.p.engu.in/2009/04/13/c-des-defauts-du-c-part-2-pointeurs-de-fonctions/</link>
		<comments>http://blog.p.engu.in/2009/04/13/c-des-defauts-du-c-part-2-pointeurs-de-fonctions/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 13:00:00 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=621</guid>
		<description><![CDATA[Faisant suite au précédent billet, celui-ci va pointer une grande difficulté du C++, qui est la gestion des pointeurs de fonctions sur les objets. Pointeurs de fonction La syntaxe C est très simple, pour faire un pointeur vers une fonction, il suffit d'une ligne : void f&#40;int arg&#41; &#123;&#125; &#160; void &#40;*callback&#41; &#40;int arg&#41; = &#38;f; [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:cdaac732641b2c012aa0876634b85555e8f7fc74'><p>Faisant suite au <a href="http://blog.p.engu.in/2008/03/24/c-des-defauts-du-c-part-1-stdstring-non-generalisee/">précédent billet</a>, celui-ci va pointer une grande difficulté du C++, qui est la gestion des pointeurs de fonctions sur les objets.<br />
<span id="more-621"></span><br />
<h4>Pointeurs de fonction</h4>
<p>La syntaxe C est très simple, pour faire un pointeur vers une fonction, il suffit d'une ligne :</p>
<pre class="c"><span style="color: #993333;">void</span> f<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> arg<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> <span style="color: #66cc66;">&#40;</span>*callback<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> arg<span style="color: #66cc66;">&#41;</span> = &amp;f;
callback<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>;</pre>
<p>En C++, c'est un peu plus complexe. Le pointeur de fonction représentant une adresse mémoire, on ne peut pas dans un seul pointeur associer la méthode pointée, et l'objet appelé avec cette méthode. Ceci est impossible en C++ :</p>
<pre class="cpp"><span style="color: #0000ff;">class</span> A
<span style="color: #000000;">&#123;</span>
<span style="color: #0000ff;">public</span>:
	<span style="color: #0000ff;">bool</span> f<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>; <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>;
&nbsp;
A a;
<span style="color: #0000ff;">bool</span> <span style="color: #000000;">&#40;</span>*callback<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> = &amp;a.<span style="color: #00eeff;">f</span>; <span style="color: #ff0000;">//error </span></pre>
<p>Il est cependant possible de garder le pointeur vers la méthode (statiquement), puis d'appeler cette méthode sur un objet donné. Ce qui donne :</p>
<pre class="cpp"><span style="color: #0000ff;">bool</span> <span style="color: #000000;">&#40;</span>A::<span style="color: #00eeff;">*callback</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> = &amp;A::<span style="color: #00eeff;">f</span>;
&nbsp;
<span style="color: #000000;">&#40;</span>a.<span style="color: #00eeff;">*func</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</pre>
<h4>Callbacks</h4>
<p>Il est possible, en C++, de masquer ce mécanisme, grâce à une classe dédiée du genre :</p>
<pre class="cpp"><span style="color: #0000ff;">class</span> _CallBack
<span style="color: #000000;">&#123;</span>
<span style="color: #0000ff;">public</span>:
        <span style="color: #0000ff;">virtual</span> ~_CallBack<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span><span style="color: #000000;">&#125;</span>
        <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">bool</span> run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> = <span style="color: #0000dd;">0</span>;
<span style="color: #000000;">&#125;</span>;
&nbsp;
template&lt;typename T&gt;
<span style="color: #0000ff;">class</span> CallBack : <span style="color: #0000ff;">public</span> _CallBack
<span style="color: #000000;">&#123;</span>
<span style="color: #0000ff;">public</span>:
&nbsp;
        <span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">bool</span> <span style="color: #000000;">&#40;</span>T::<span style="color: #00eeff;">*TFunc</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        CallBack<span style="color: #000000;">&#40;</span>T* _obj, TFunc _func<span style="color: #000000;">&#41;</span>
		: obj<span style="color: #000000;">&#40;</span>_obj<span style="color: #000000;">&#41;</span>, func<span style="color: #000000;">&#40;</span>_func<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span><span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">bool</span> run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #000000;">&#40;</span>obj-&gt;*func<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span>:
        T* obj;
        TFunc func;
<span style="color: #000000;">&#125;</span>;</pre>
<p>Pour garder un callback, il devient alors juste nécessaire d'avoir un pointeur vers une instance de CallBack :</p>
<pre class="cpp">_CallBack* cb = <span style="color: #0000dd;">new</span> CallBack&lt;A&gt;<span style="color: #000000;">&#40;</span>a, &amp;A::<span style="color: #00eeff;">f</span><span style="color: #000000;">&#41;</span>;
cb-&gt;run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #ff0000;">// calls a.f() </span></pre>
<p>Il est à noter que comme CallBack est une classe template, il est nécessaire de garder un pointeur vers sa classe de base _CallBack, et par polymorphisme les appels seront correctement effectués.</p>
<h4>Compatibilité C</h4>
<p>Il arrive parfois qu'il est nécessaire d'utiliser une bibliothèque C qui, évidement, requiert un pointeur vers une fonction. Il est relativement fréquent que les méthodes de définition de callback prenne un argument <b>void* data</b>, permettant ainsi de récupérer le contexte dans le callback.</p>
<p>Il est dans ce cas là possible de trouver une parade, grâce à la méthode suivante :</p>
<pre class="cpp"><span style="color: #0000ff;">bool</span> g_callback<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span>* data<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
        _CallBack* cb = static_cast&lt;_CallBack*&gt;<span style="color: #000000;">&#40;</span>data<span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #0000ff;">if</span><span style="color: #000000;">&#40;</span>!data<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
                b_log<span style="color: #000000;">&#91;</span>W_ERR<span style="color: #000000;">&#93;</span> &lt;&lt; <span style="color: #666666;">&quot;g_callback() error&quot;</span>;
                <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0000ff;">return</span> cb-&gt;run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre>
<pre>read_cb = new CallBack<IRC>(a, &A::f);
glib_input_add(fd, PURPLE_INPUT_READ, g_callback_input, read_cb); </pre>
<p>Dans cet exemple, chaque fois qu'un événement en lecture se produit sur le descripteur de fichier <b>fd</b>, l'appel est effectué à <b>a.f()</b>. Évidement, il faut faire très attention à ce que <b>a</b> ne soit pas libéré.</p>
<h4>Le cas sans solution</h4>
<p>Malheureusement, dans le cas où la bibliothèque ne permet pas de définir un attribut <i>data</i> arbitraire, il est impossible de retrouver le contexte, mis à part en misant aléatoirement sur la valeur des éventuels arguments du callback. Si il n'y en a pas, il n'y a pas de solution.</p>
<p>C'est le cas avec la <a href="http://developer.pidgin.im/wiki/WhatIsLibpurple">libpurple</a>, dans le cadre de mon projet <a href="http://symlink.me/projects/show/bitlbee2">bitlbee2</a>, qui prends des instances de structures contenant des pointeurs de fonctions sans pouvoir spécifier aucun argument arbitraire, et bien évidement sans aucun argument de contexte.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2009/04/13/c-des-defauts-du-c-part-2-pointeurs-de-fonctions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
