<?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; INL</title>
	<atom:link href="http://blog.p.engu.in/category/inl/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>Bépo — c&#8217;est bon</title>
		<link>http://blog.p.engu.in/2008/10/04/bepo-%e2%80%94-cest-bon/</link>
		<comments>http://blog.p.engu.in/2008/10/04/bepo-%e2%80%94-cest-bon/#comments</comments>
		<pubDate>Sat, 04 Oct 2008 13:48:06 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[INL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ma vie]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=509</guid>
		<description><![CDATA[La majeure partie des ordinateurs francophones disposent d'un clavier de type azerty ou plus rarement qwerty. Nous allons voir que ces dispositions sont anti-ergonomiques et qu'il existe des dispositions optimisées pour augmenter la vitesse de frappe tout en réduisant l'effort. Azerty et qwerty Les dispositions azerty et qwerty sont héritées des machines à écrire et [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:9283fed34fd6f015567ee316a0a18ff88037bf2b'><p>La majeure partie des ordinateurs francophones disposent d'un clavier de type azerty ou plus rarement qwerty. Nous allons voir que ces dispositions sont anti-ergonomiques et qu'il existe des dispositions optimisées pour augmenter la vitesse de frappe tout en réduisant l'effort.</p>
<p><span id="more-509"></span></p>
<h4>Azerty et qwerty</h4>
<p>Les dispositions <i>azerty</i> et <i>qwerty</i> sont héritées des machines à écrire et ont été étudiées afin de réduire autant que possible la vitesse de frappe en séparant physiquement les touches composant les <a href="http://fr.wikipedia.org/wiki/Digramme">digrammes</a> les plus communément utilisés. Le but était d'éviter de provoquer une panne matérielle due à une frappe trop rapide, ce qui pouvait résulter à coincer entre eux deux percuteurs de lettres.</p>
<p>Malgré le fait que ces problèmes techniques ne sont plus d'actualité sur les ordinateurs utilisés quotidiennement, les dispositions <i>azerty</i> et <i>qwerty</i> sont encore largement utilisées.</p>
<h4>Dvorak</h4>
<p>Dans les années 30, le professeur en psycologie <a href="http://en.wikipedia.org/wiki/August_Dvorak">August Dvorak</a> a conçu une méthode permettant d'obtenir une disposition ergonomique, de laquelle découla la <a href="http://fr.wikipedia.org/wiki/Disposition_Dvorak">Disposition Dvorak</a>.</p>
<p>Cette disposition, adaptée à la langue anglaise, permet d'obtenir une vitesse de frappe supérieur (bien qu'aucune étude sérieuse ne l'ai prouvé) avec un effort moindre (les touches composant les digrammes courament utilisés étant proches les unes des autres, et plus facilement accessibles), réduisant ainsi les mouvements de la main et les risques de pathologies des poignets et des articulations.</p>
<p>En outre, Dvorak prétendait que l'apprentissage sur son clavier était plus rapide que sur un clavier Qwerty.</p>
<h4>fr-dvorak-bepo</h4>
<p>Depuis 2003, un projet de disposition de type Dvorak francophone s'est formé, le <a href="http://bepo.fr">fr-dvorak-bepo</a>.</p>
<p>L'accent a été mis sur la disponibilité des caractères typographiques français et au support des langues étrangères, contrairement à la disposition <a href="http://fr.wikipedia.org/wiki/Disposition_Dvorak#Dvorak-fr">Dvorak-fr</a>, notamment grâce à l'utilisation de la touche modificatrice Alt-Gr.</p>
<p>Le développement de cette variante est communautaire et passe par le biais de votes et de consensus. La dernière version en date est la <b>1.0rc1</b>. Cela signifie que les éventuelles modifications apportées à la 1.0 seront mineurs et n'auront pas d'impact sur les caractères de la carte simplifiée, permettant d'apprendre le bépo sans avoir à redouter de gros changements.</p>
<h4>Conclusion</h4>
<p>Je suis donc passé à <i>bépo</i> il y a maintenant une semaine, et c'est très difficile au début, notamment des maux de tête à la fin de la journée. En outre, il est très difficile de tenir une conversation sur IRC, et il faut reconfigurer en partie ses raccourcis claviers.</p>
<p>Maintenant ça va mieux, je n'ai plus à regarder le <a href="http://peerfuse.org/~rom1/bepo.jpg">schema que j'ai imprimé</a>, je suis redevenu productif avec vim (dont j'ai changé la <a href="http://clavier-dvorak.org/wiki/Vim">conf</a>, et mon temps de réponse sur IRC a diminué.</p>
<p>Voici le score que j'obtiens à <a href="http://tobias.eyedacor.org/typespeed/">typespeed</a> :</p>
<pre>
Rank:               Average
Score:              309
WPM:                28
CPS:                2.361
Typo ratio:         7.6%
Typorank:           Handicap
</pre>
<p>On peut constater qu'il reste beaucoup d'efforts avant d'atteindre un niveau satisfaisant. Je me permets toute fois de nuancer les résultats de typespeed, en effet, je trouve le mode d'acquisition stressant, ce qui réduit la vitesse de frappe et augmente le nombre d'erreur.</p>
<p>Voici en comparaison mon score en azerty :</p>
<pre>
Rank:               Average
Score:              672
WPM:                83
CPS:                6.926
Typo ratio:         6.3%
Typorank:           Handicap
</pre>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/10/04/bepo-%e2%80%94-cest-bon/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Peerfuse, Chimera, git, mailman et redmine</title>
		<link>http://blog.p.engu.in/2008/08/17/peerfuse-chimera-git-mailman-et-redmine/</link>
		<comments>http://blog.p.engu.in/2008/08/17/peerfuse-chimera-git-mailman-et-redmine/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 13:11:35 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[peerfuse]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=508</guid>
		<description><![CDATA[L'activité de Peerfuse reprends de plein pied. Chimera Le but du mois de juillet était de convertir la DHT Pastry (écrite en Java) pour l'intégrer au code C++ de Peerfuse. La flemme et la laideur du code Java n'aidant pas, les choses étaient restées en état jusqu'il y a deux semaines... En effet, il y [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:c0cb4b3f5fc529703195a9b7fc4517a88da21f46'><p>L'activité de <b><a href="http://peerfuse.org">Peerfuse</a></b> reprends de plein pied.</p>
<h4>Chimera</h4>
<p>Le but du mois de juillet était de convertir la <a href="http://en.wikipedia.org/wiki/Distributed_hash_table">DHT</a> Pastry (écrite en Java) pour l'intégrer au code C++ de Peerfuse. La flemme et la laideur du code Java n'aidant pas, les choses étaient restées en état jusqu'il y a deux semaines...</p>
<p>En effet, il y a deux semaines, j'apprends l'existence d'une DHT similaire à Pastry (plus légère), écrite en C, nommée <a href="http://current.cs.ucsb.edu/projects/chimera/">Chimera</a>.</p>
<p>Le portage a débuté la semaine dernière, et je peux dire que je me suis amusé... Ça a bien avancé, la quasi totalité du code se trouve dans diverses classes, mais j'ai été confronté à certains problèmes...</p>
<p>Je dirais que le plus chiant, était ce qui est résumé par une phrase sur le site de Chimera : </p>
<blockquote><p>Thanks to Perry Lorier for a patch to make Chimera compatible w/ 64 Bit machines!</p></blockquote>
<p>Non, je ne le remercie pas. En effet, quand on voit qu'ils stockent l'ID dans des <b>unsigned long</b>, type dont la taille varie suivant l'architecture, et qu'ils font diverses opérations de bits en considérant qu'il s'agit de <b>uint32_t</b>, on peut aisément deviner pourquoi ça ne marche pas.</p>
<p>En outre, toujours un problème similaire :</p>
<pre class="c">&nbsp;
<span style="color: #808080; font-style: italic;">/* encode the message */</span>
type = htonl <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span><span style="color: #66cc66;">&#41;</span> message-&gt;type<span style="color: #66cc66;">&#41;</span>;
memcpy <span style="color: #66cc66;">&#40;</span>data, &amp;type, <span style="color: #993333;">sizeof</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
size = htonl <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span><span style="color: #66cc66;">&#41;</span> message-&gt;size<span style="color: #66cc66;">&#41;</span>;
memcpy <span style="color: #66cc66;">&#40;</span>data + <span style="color: #993333;">sizeof</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span><span style="color: #66cc66;">&#41;</span>, &amp;size, <span style="color: #993333;">sizeof</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
memcpy <span style="color: #66cc66;">&#40;</span>data + <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span> * <span style="color: #993333;">sizeof</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>,
                get_key_string <span style="color: #66cc66;">&#40;</span>&amp;message-&gt;dest<span style="color: #66cc66;">&#41;</span>,
                strlen <span style="color: #66cc66;">&#40;</span>get_key_string <span style="color: #66cc66;">&#40;</span>&amp;message-&gt;dest<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
memcpy <span style="color: #66cc66;">&#40;</span>data + HEADER_SIZE, message-&gt;payload, message-&gt;size<span style="color: #66cc66;">&#41;</span>;
size = HEADER_SIZE + message-&gt;size;     <span style="color: #808080; font-style: italic;">/*reset due to htonl */</span>
&nbsp;</pre>
<p>Il est facile de comprendre que si on connecte un chimera x86 sur un chimera x86_64, ils risquent de ne pas parler la même langue...</p>
<p>Bref, j'ai fais remonté l'info à Chimera et pour ma part j'ai corrigé tout ça dans Peerfuse...</p>
<h4>Git</h4>
<p>Afin de développer au mieux le portage de Chimera, j'ai profité des joies de git et ai créé une branche <i>chimera</i> sur mon dépôt local. C'est un vrai bonheur. D'autant plus qu'on peut <a href="http://lists.peerfuse.org/pipermail/peerfuse-dev/2008-August/000000.html">travailler à plusieurs sur cette branche</a>.</p>
<p>Depuis peu, deux nouveaux contributeurs se sont joint sur Peerfuse, l'un a déjà travaillé sur une implantation de XML-RPC dans Peerfuse afin de faire communiquer le démon peerfuse avec des frontends (en console ou graphiques), le second a pour le moment la tâche de porter peerfuse en ipv6.</p>
<p>Chacun des développeurs de Peerfuse s'est vu doter d'une dépôt public chacun ainsi qu'on peut le voir : <a href="http://git.peerfuse.org/">http://git.peerfuse.org/</a></p>
<p>Je trouve vraiment sympatique cette façon de travailler, même si c'est un peu déroutant au départ pour l'utilisateur de Subversion que je suis habituellement.</p>
<h4>Mailing lists</h4>
<p>La mailing list a été réinstallée, et une seconde spécifique au développement a été créée.</p>
<p>Pour plus d'informations : <a href="http://lists.peerfuse.org">http://lists.peerfuse.org</a></p>
<h4>Redmine</h4>
<p>Enfin, il semblerait que les <a href="http://linuxfr.org/~ploum/27014.html#955094">fichiers TASKS et BUGS</a> présents dans les sources n'étaient pas satisfaisants pour les contributeurs de Peerfuse, ainsi j'ai été contraint d'installer <a href="http://www.redmine.org">Redmine</a>, une alternative très sympatique à Trac.</p>
<p>Ça donne ceci : <a href="http://dev.peerfuse.org">http://dev.peerfuse.org</a>.</p>
<h4>Conclusion</h4>
<p>Peerfuse reprends son souffle et on devrait maintenant avoir tout ce qui faut pour pouvoir travailler vite. Il ne manque plus qu'à remettre en place les buildbots, mais il faudra de toute façon encore quelques semaines avant de retrouver un état stable.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/08/17/peerfuse-chimera-git-mailman-et-redmine/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Peerfuse aux RMLL</title>
		<link>http://blog.p.engu.in/2008/07/14/peerfuse-aux-rmll/</link>
		<comments>http://blog.p.engu.in/2008/07/14/peerfuse-aux-rmll/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 14:25:49 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ma vie]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[peerfuse]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=507</guid>
		<description><![CDATA[Le futur de Peerfuse s'annonce radieux. Après plus d'un mois de discussions, une nouvelle version du protocole permettant de meilleurs performances est définie, et va se baser sur Pastry, une DHT qui corresponds à ce que l'on souhaite implémenter. Le nouveau protocole a été décrit (grossièrement) dans la présentation de Peerfuse aux RMLL08, dont vous [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:64c1e4b69b3c96efe6dd5782b1a3e70fd30867d0'><p>Le futur de <a href="http://peerfuse.org">Peerfuse</a> s'annonce radieux. Après plus d'un mois de discussions, une nouvelle version du protocole permettant de meilleurs performances est définie, et va se baser sur <a href="http://research.microsoft.com/~antr/PASTRY/">Pastry</a>, une <a href="http://en.wikipedia.org/wiki/Distributed_hash_table">DHT</a> qui corresponds à ce que l'on souhaite implémenter.</p>
<p>Le nouveau protocole a été décrit (grossièrement) dans <a href="http://2008.rmll.info/Peerfuse.html">la présentation de Peerfuse</a> aux <a href="http://2008.rmll.info">RMLL08</a>, dont vous pouvez retrouver les <a href="http://peerfuse.net/~rom1/peerfuse.pdf">slides ici</a>.</p>
<p>Malheureusement, ceci implique une importation de Pastry, qui est écrit en Java, vers le langage utilisé pour Peerfuse qui est le C++.</p>
<p>C'est un travail monstrueux, et malgré la propagande faite par hydromiel et moi aux RMLL, personne ne s'est senti de m'aider à cette tâche. D'ailleurs, dans les discussions que j'ai pu avoir, il semblerait que l'utilisation du langage C++ soit un vrai frein pour les contributeurs (à moins que ça ne soit qu'un prétexte).<br />
Je n'ose imaginer comment ça serait si on avait écrit Peerfuse, comme j'avais soulevé l'idée au départ, en <a href="http://fr.wikipedia.org/wiki/D_(langage)">langage D</a>.</p>
<p>Notez que le projet utilise maintenant <a href="http://blog.p.engu.in/2008/06/18/de-subversion-a-git/">Git</a>, que le site <a href="http://peerfuse.org">peerfuse.org</a> est temporairement mort, et que vous êtes donc bien invité de venir sur le <a href="irc://irc.freenode.net/peerfuse">canal IRC #peerfuse@freenode</a> si vous souhaitez suivre l'évolution.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/07/14/peerfuse-aux-rmll/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>De subversion à git</title>
		<link>http://blog.p.engu.in/2008/06/18/de-subversion-a-git/</link>
		<comments>http://blog.p.engu.in/2008/06/18/de-subversion-a-git/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 10:42:21 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[peerfuse]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=505</guid>
		<description><![CDATA[Il a été décidé il y a peu que le projet Peerfuse utiliserait dorénavant le système de gestion de version Git. Je ne reviendrai pas sur l'intérêt qu'apporte un système de révision distribué (indépendance vis à vis d'un serveur central, l'avantage des branches, facilité pour un contributeur irrégulier de contribuer, etc.). Je me permets juste [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:a3f8fe005466bf0123a1eff49d0994e9e059579f'><p>Il a été décidé il y a peu que le projet <b><a href="http://peerfuse.org">Peerfuse</a></b> utiliserait dorénavant le <a href="http://fr.wikipedia.org/wiki/Système_de_gestion_de_versions">système de gestion de version</a> <b><a href="http://git.or.cz/">Git</a></b>.</p>
<p>Je ne reviendrai pas sur l'intérêt qu'apporte un système de révision distribué (indépendance vis à vis d'un serveur central, l'avantage des branches, facilité pour un contributeur irrégulier de contribuer, etc.).</p>
<p>Je me permets juste de donner quelques opérations à suivre pour importer un dépôt subversion (note: installer préalablement git et git-svn) :</p>
<pre>
$ mkdir project
$ cd project
$ git svn init -t tags -b branches -T trunk https://svn.example.org/prjt
Initialized empty Git repository in .git/
$ git svn fetch
</pre>
<p>Et.. c'est tout.</p>
<p>Nous disposons maintenant d'un dépôt git indépendant, contenant l'intégralité de l'historique des commits du subversion. On peut ainsi le mettre à disposition pour que d'autres en profitent, et se mettre à travailler immédiatement.</p>
<p>Pour plus d'informations sur comment utiliser git, je préfère vous laisser vous référer à la très bonne <a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html">documentation de Git</a>.</p>
<p>Je profite de ce bref billet pour rappeler que <a href="http://peerfuse.org/">Peerfuse</a> a besoin de contributeurs.<br />
À ce propos, <a href="http://2008.rmll.info/Peerfuse.html">une conférence se déroulera aux RMLL08 sur Peerfuse</a>, ainsi n'hésitez pas à la regarder si vous êtes intéressé par le projet.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/06/18/de-subversion-a-git/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Peerfuse 0.0 released</title>
		<link>http://blog.p.engu.in/2008/05/12/peerfuse-00-released/</link>
		<comments>http://blog.p.engu.in/2008/05/12/peerfuse-00-released/#comments</comments>
		<pubDate>Mon, 12 May 2008 15:15:59 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[peerfuse]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/?p=493</guid>
		<description><![CDATA[Peerfuse paraît aujourd'hui dans sa version 0.0. En effet, bien qu'utilisable, le numéro de version traduit le fait qu'il est encore pleinement en développement et qu'il ne faut pas l'utiliser en production, ainsi que la présence éventuelle de divers bugs. En outre, bien que le concept est présenté, divers éléments d'implémentation sont susceptible d'évoluer, comme [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:55a7ab13aff31e82a28c91f282141547779b6c34'><p><b><a href="http://peerfuse.org">Peerfuse</a></b> paraît aujourd'hui dans sa version 0.0.</p>
<p>En effet, bien qu'utilisable, le numéro de version traduit le fait qu'il est encore pleinement en développement et qu'il ne faut pas l'utiliser en production, ainsi que la présence éventuelle de divers bugs.</p>
<p>En outre, bien que le concept est présenté, divers éléments d'implémentation sont susceptible d'évoluer, comme la DHT utilisée, etc.</p>
<p>Vous pouvez télécharger les sources sur le <a href="http://peerfuse.org/download.html">site de Peerfuse</a>.</p>
<p>Diverses documentations sont présentes à <a href="http://peerfuse.org/documentation.html">cette adresse</a>.</p>
<p>Le réseau peerfuse-net officiel, <a href="http://peerfuse.net">Peerfuse.net</a>, est accessible. Vous pouvez lire <a href="http://peerfuse.net/howto.html">ici comment le rejoindre</a>.</p>
<p>Enfin, si vous souhaitez nous rejoindre afin de discuter du développement sur le salon IRC <a href="irc://irc.freenode.net/peerfuse">#peerfuse@freenode</a>, vous êtes la bienvenue.</p>
<p>Une <a href="https://peerfuse.org/mailman/listinfo/peerfuse">mailing list</a> est également à votre disposition.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/05/12/peerfuse-00-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Lancement du réseau peerfuse.net</title>
		<link>http://blog.p.engu.in/2008/04/25/creation-du-reseau-peerfusenet/</link>
		<comments>http://blog.p.engu.in/2008/04/25/creation-du-reseau-peerfusenet/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 08:00:48 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[peerfuse]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/2008/04/25/creation-du-reseau-peerfusenet/</guid>
		<description><![CDATA[Hier soir, après de nombreux efforts, le réseau peerfuse.net a été lancé ! Les premiers peers ont rejoint le réseau (que des développeurs et quelques testeurs), et il s'agit bien évidemment d'un réseau "beta", car Peerfuse risque d'évoluer encore fortement (notament au niveau du protocole) cette semaine jusqu'à la sortie de la 0.1. Nous avons [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:6e73e8fc94e6d37f92f7d888489f4e82b8406d9d'><p>Hier soir, après de nombreux efforts, le réseau <b><a href="http://peerfuse.net">peerfuse.net</a></b> a été lancé !<br />
Les premiers peers ont rejoint le réseau (que des développeurs et quelques testeurs), et il s'agit bien évidemment d'un réseau "beta", car Peerfuse risque d'évoluer encore fortement (notament au niveau du protocole) cette semaine jusqu'à la sortie de la <a href="http://blog.p.engu.in/2008/04/23/peerfuse-sortie-annoncee-le-2-mai-2007/">0.1</a>.</p>
<p>Nous avons pu procéder à des tests grandeur nature, ce qui n'avait jamais été le cas jusqu'alors (uniquement en local), et la conclusion est la suivante : <b>ça marche</b> !</p>
<p>Enfin... presque. Nous avons tout de même découvert des bugs (dont une partie est corrigée; hier a été une journée particulièrement productive de ce côté là), mais le premier fichier a été transféré avec succès.</p>
<p>Les pairs possédant un certificat et étant connecté au réseau forment la topologie suivante :</p>
<pre>
sunigav.vaginus.org (1)
|- nivagus.vaginus.org (2)
|- hubb_server (3)
|  `- hubb (4)
|- moonpa.inl.fr (5)
|- lids (6)
`- dehy (7)
</pre>
<p><span id="more-491"></span></p>
<p>Les fichiers contenus actuellement sont :</p>
<pre>
rom1@nivagus ~/Projets/peerfuse/trunk/nivagus/mnt $ ls -lh
total 0
-rw------- 0 lp   lp   9.2M 2008-04-25 00:40 05 La ritournelle.mp3
-rw------- 0 rom1 rom1 5.5M 2008-04-24 22:32 06 BOA_Get There_A Girl.mp3
-rw-r--r-- 0 lp   lp   100M 2008-04-25 01:07 Fragmovie.avi
-rw-r--r-- 0 lp   lp      0 2008-04-25 01:07 One Page Linux Manual.pdf
-rw-r----- 0 rom1 rom1 1.0M 2008-04-24 21:07 random
-rw-r--r-- 0 rom1 rom1 748K 2008-04-23 18:02 Speedy's Coming [Live].mp3
</pre>
<p>Dont le premier fichier a être transféré fut <b>05 La ritournelle.mp3</b>. Attention, il s'agit mieux que de transfert, car en effet une simple utilisation de la commande suivante suffit :</p>
<pre>
rom1@nivagus ~/Projets/peerfuse/trunk/nivagus/mnt $ mplayer 05\ La\ ritournelle.mp3
MPlayer dev-SVN-rUNKNOWN-4.1.2 (C) 2000-2007 MPlayer Team
CPU: Intel(R) Pentium(R) M processor 2.00GHz (Family: 6, Model: 13, Stepping: 8)
CPUflags:  MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
Can't open joystick device /dev/input/js0: No such file or directory
Can't init input joystick
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing 05 La ritournelle.mp3.
Audio file file format detected.
==========================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
AUDIO: 44100 Hz, 2 ch, s16le, 192.0 kbit/13.61% (ratio: 24000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)
==========================================================================
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A: 401.1 (06:41.0) of 401.0 (06:41.0)  1.8%

Exiting... (End of file)
rom1@nivagus ~/Projets/peerfuse/trunk/nivagus/mnt $
</pre>
<p>La lecture s'est faite de manière tout à fait transparente, sans interruption ni saccade, alors que le transfert se faisait entre <b>dehy</b> et <b>nivagus.vaginus.org</b> (par l'intermédiaire de <b>sunigav.vaginus.org</b>).</p>
<p>Notez la présence de <b>sunigav.vaginus.org</b> au milieu des autres peers. En l'occurence, il s'agit d'un serveur, donc par commodité nous avons connecté la majeur partie de nos pairs à celui-ci. Mais il est tout à fait possible de se connecter à n'importe quel pair du réseau, du moment qu'il n'est pas caché derrière un firewall ou un routeur NAT.</p>
<p>Si vous souhaitez en connaître plus, vous êtes visiter à lire <a href="http://peerfuse.net">http://peerfuse.net</a> (site du <i>réseau officiel</i> de Peerfuse, en opposition à <a href="http://peerfuse.org">http://peerfuse.org</a> qui est le site du projet).</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/04/25/creation-du-reseau-peerfusenet/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Peerfuse 0.1 annoncé pour le 2 mai 2008</title>
		<link>http://blog.p.engu.in/2008/04/23/peerfuse-sortie-annoncee-le-2-mai-2007/</link>
		<comments>http://blog.p.engu.in/2008/04/23/peerfuse-sortie-annoncee-le-2-mai-2007/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 07:00:09 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[peerfuse]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/2008/04/23/peerfuse-sortie-annoncee-le-2-mai-2007/</guid>
		<description><![CDATA[Ainsi que les lecteurs attentifs le savent, Peerfuse est un projet de système de fichier distribué pair à pair utilisant la bibliothèque FUSE. Après quelques mois de développement, la version 0.1 devrait être prête pour le Vendredi 2 mai 2008 ! Beaucoup de travail a été fournis par lodesi et moi même, et le projet [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:cd63f9842d196422fe7e1180420984770ccf72d4'><p><a href="http://blog.p.engu.in/2008/03/12/peerfuse/">Ainsi que les lecteurs attentifs le savent</a>, <b><a href="http://peerfuse.org">Peerfuse</a></b> est un projet de système de fichier distribué pair à pair utilisant la bibliothèque <a href="http://fuse.sourceforge.net/">FUSE</a>.</p>
<p>Après quelques mois de développement, la version <b>0.1</b> devrait être prête pour le <b>Vendredi 2 mai 2008</b> !</p>
<p>Beaucoup de travail a été fournis par <a href="http://piggledy.org">lodesi</a> et moi même, et le projet est quasiment utilisable. Bien sur, il est loin d'être terminé, seules les fonctionnalités de base sont présentes ;</p>
<ul>
<li> Connexion des pairs entre eux</li>
<li> Synchronisation des arbres</li>
<li> Transfert des fichiers</li>
</ul>
<p>Ce sont les fonctionnalités fondamentales qui permettent (malgré un manque côté sécurité) d'utiliser le projet dans son but premier : le partage de fichiers via un système de fichier virtuel.</p>
<p>Les principales fonctionnalités manquantes et qui seront développées après la 0.1 sont :</p>
<ul>
<li> Redondance automatique des fichiers dans le réseau</li>
<li> Optimisation des transferts (par la détermination de la qualité d'un lien, etc)</li>
<li> Gestion des permissions</li>
<li> Utilisation de systèmes cryptographiques d'encryption et de signature relatifs aux permissions des fichiers, afin qu'il soit impossible de lire ou d'écrire des données auxquelles on a pas accès</li>
<li> Interface graphique. Ça sera développé en tant que projet à part par <a href="http://goatse.fr">hubbb</a>, et permettra d'assurer des fonctionnalités supplémentaires qu'on ne peut pas retrouver avec l'interface de FUSE (comme la constitution des groupes, système de discussion avec les autres pairs (à un pair en particulier, à un groupe ou à tout le monde, ce que je trouve intéressant afin de créer une communauté autour du projet)).</li>
<li> Bien sur, afin d'assurer ces fonctionnalités supplémentaires, une petite application ncurse pourra être utilisée à la place de l'interface graphique</li>
</ul>
<p>Il reste encore beaucoup à faire, et nous espérons que la 0.1 permettra de faire connaître le projet et de trouver des contributeurs.</p>
<p>Dans ce sens est d'ailleurs prévu une petite <b>soirée de lancement</b> le <b>vendredi 2 mai</b> à <b>19:00</b>, au <a href="http://www.ledockscafe.com/">Dock's café</a> (Paris, XIXe).<br />
N'hésitez pas à venir si vous êtes intéressé par le projet, afin de faire connaissance et de boire quelques bières en discutant de <b>Peerfuse</b>. Quelques t-shirts seront donnés aux futurs contributeurs ;)</p>
<p>Nous vous invitons à nous rejoindre sur le salon IRC <a href="irc://irc.freenode.net/peerfuse">#peerfuse@Freenode</a> si vous souhaitez avoir plus d'informations sur le projet ou sur la soirée.<br />
Une mailing list devrait par ailleurs être prochainement créée.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/04/23/peerfuse-sortie-annoncee-le-2-mai-2007/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dix pratiques pour être un mauvais programmeur</title>
		<link>http://blog.p.engu.in/2008/04/14/dix-pratiques-pour-etre-un-mauvais-programmeur/</link>
		<comments>http://blog.p.engu.in/2008/04/14/dix-pratiques-pour-etre-un-mauvais-programmeur/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 11:18:22 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Saimal]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/2008/04/14/dix-pratiques-pour-etre-un-mauvais-programmeur/</guid>
		<description><![CDATA[Il est malheureusement fréquent de rencontrer du code vraiment mauvais, principalement dans des petits projets, des projets "vites faits bien faits", mais également dans de plus grosses usines à gaz, ou souvent dans les entreprises qui éditent des logiciels propriétaires. Mais est-il facile pour autant de devenir un mauvais programmeur ? Voici 10 astuces qui [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:c8e420073556567c9e0927f677acd2ec1d064a9a'><p>Il est malheureusement fréquent de rencontrer du code vraiment mauvais, principalement dans des petits projets, des projets "vites faits bien faits", mais également dans de plus grosses usines à gaz, ou souvent dans les entreprises qui éditent des logiciels propriétaires.</p>
<p>Mais est-il facile pour autant de devenir un mauvais programmeur ?</p>
<p><b>Voici 10 astuces qui permettront à tout un chacun de s'en approcher.</b></p>
<p><span id="more-487"></span></p>
<h4>I. Obscurcir le code</h4>
<p>La première chose que tout mauvais programmeur doit savoir, est qu'il est absolument hors de question de mettre des commentaires, à moins que ceux-ci soient tout sauf pertinents. Mieux, il peut être très intéressant de mettre un excès de commentaires totalement inutiles qui ne font qu'obscurcir davantage le code.</p>
<p>Par ailleurs, il est impératif de ne pas respecter les <a href="http://fr.wikipedia.org/wiki/Style_d'indentation">conventions d'indentation habituelle</a>. Abandonnez même toute indentation, et favorisez l'écriture de plusieurs instructions sur une même ligne. N'hésitez pas à faire des fichiers de plus de 2 000 lignes, préférez les très grosses fonctions à plusieurs niveaux d'indentations.<br />
Rajoutez à ça des <b>goto</b> et vous obtiendrez un code illisible.</p>
<h4>II. Réinventer la roue</h4>
<p>Vous avez un traitement basique à effectuer ? Vous doutez des fonctions standards ? Vous vous emmerdez pendant votre pause café ?<br />
Pas de problème ! Réécrivez vous-même la fonction ou la classe en question !</p>
<p>Ceci a particulièrement son intérêt si vous utilisez un langage tel que Python ou Java, dans lesquels il est impossible de retrouver les performances des fonctions que vous copiez qui elles sont dans un langage bas niveau tel que le C.</p>
<p>Bien évidemment, encore une fois, prenez le soin de ne <b>pas</b> commenter, afin que vos collègues ne puissent pas saisir la subtilité de votre code et en soient dépendant.</p>
<p>Voici un bel exemple où un programmeur décide de réinventer le tri à bulle (pourtant déjà pas très efficace) en réduisant ses performances (<a href="http://fr.thedailywtf.com/Articles/QuelleEstLaTailleDeMaStackTRI(T).aspx">source</a>) :</p>
<pre class="c">&nbsp;
<span style="color: #993333;">void</span> sortMe<span style="color: #66cc66;">&#40;</span>ListType list<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
  <span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> i = <span style="color: #cc66cc;">0</span>; i &lt; <span style="color: #66cc66;">&#40;</span>list.<span style="color: #202020;">entries</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> - <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>; i++<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>list<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> &gt; list<span style="color: #66cc66;">&#91;</span>i<span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
      list.<span style="color: #202020;">swap</span><span style="color: #66cc66;">&#40;</span>i, i<span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#41;</span>;
      sortMe<span style="color: #66cc66;">&#40;</span>list<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<h4>III. Variables globales</h4>
<p>Contrairement à ce que l'on peut supposer, le passage d'argument à une fonction est quelque chose qu'il faut éviter à tout prix.<br />
Il est bien plus naturel de faire un maximum de variables globales. Ceci aura l'avantage de rendra le code bien moins lisible et moins naturel.</p>
<p>Par exemple :</p>
<pre class="c">&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #993333;">int</span> a;
<span style="color: #993333;">int</span> b;
<span style="color: #993333;">int</span> result;
&nbsp;
<span style="color: #993333;">void</span> calcul<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	result = a + b;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> argc, <span style="color: #993333;">char</span>** argv<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	a = atoi<span style="color: #66cc66;">&#40;</span>argv<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
	b = atoi<span style="color: #66cc66;">&#40;</span>argv<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
	calcul<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, result<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Notez de non seulement grâce à ce code vous aurez utilisé des variables globales comme un gros gland, mais qu'en plus vous aurez pris soint de ne pas avoir fait de vérification de paramètres avant de les utiliser (si il y a bien trois cases dans <b>argv</b>, et si ce sont des entiers), ce qui augmente davantage encore votre niveau de mauvais programmeur.</p>
<h4>IV. Convention de noms</h4>
<p>Tout mauvais programmeur le sait : respecter une convention de nommage est quelque chose de fastidieux qui facilite la lisibilité de votre code.</p>
<p>Préférez donner des noms soit <b>très courts</b> (une lettre ou deux), soit <b>très longs</b> (plus de quinze lettres).</p>
<p>Voici un exemple de code très représentatif des mauvaises pratiques que vous devez de respecter :</p>
<pre class="c">&nbsp;
&nbsp;
class A
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #993333;">int</span> j;
&nbsp;
public:
&nbsp;
	A<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> _j, <span style="color: #993333;">int</span> _k<span style="color: #66cc66;">&#41;</span>
		: j<span style="color: #66cc66;">&#40;</span>_j+_k<span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #993333;">int</span> GetTheJVariableWhichIsPrivate<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333;">const</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">return</span> j; <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>;
&nbsp;</pre>
<p>Ainsi que vous le voyez dans ce bref extrait que vous êtes encouragé à utiliser comme modèle, il faut absolument suivre les règles suivantes :</p>
<ul>
<li> <b>Toujours</b> nommer vos variables privées avec une seule lettre non significative.</li>
<li> Vous pouvez pousser le vice jusqu'à nommer vos classes avec une seule lettre, comme dans cet exemple, mais là c'est d'un niveau bien plus élevé que ce vous pourrez espérer atteindre dans vos rêves les plus fous. </li>
<li> Dans vos fonctions (ici le constructeur), ne <b>jamais</b> donner de nom explicite aux arguments. Ainsi, en plus de ne pas savoir ce que fait la fonction, les utilisateurs de celle-ci ne sauront pas non plus comment s'en servir.</li>
<li> Détailler à mort le nom de vos fonctions et méthodes, mais sans donner d'information utile, juste ce que l'on sait déjà. </li>
<li> Notez aussi que le constructeur de <b>A</b> fait la somme de <b>_j</b> et <b>_k</b> pour la stocker dans l'attribut <b>j</b> de la classe, sans aucune raison apparente ni justification. </li>
</ul>
<p>Vous pouvez aussi découvrir dans <a href="http://thedailywtf.com/Articles/A-Method-by-Any-Other-Name.aspx">cet article</a> un autre exemple de mauvaise convention de nommage.</p>
<h4>V. Copié/coller</h4>
<p>La factorisation consiste à mettre à un seul endroit du code utilisé plusieurs fois. Ceci facilite la maintenance de ce code, et c'est pourquoi vous devez l'éviter à tout prix !</p>
<p>Au contraire, préférez la duplication de code, en n'oubliant pas si possible de prendre, au passage, les quelques commentaires qui subsistaient dans le code original. Bien sur, si vous êtes amené à modifier la copie de ce code, surtout ne pas mettre à jour ces commentaires, afin d'obscurcir davantage.</p>
<p>Voici un exemple de bout de code que je n'invente pas, tout droit sortit d'un projet très connu sur IRC, qui n'est autre que <b>CS</b>, le service IRC, utilisé en particulier par le réseau IRC <b>Orange</b> avec le pseudo <b>IriX</b> :</p>
<pre class="c">&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>caddr == <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
   add_userinfo<span style="color: #66cc66;">&#40;</span>csadminchan, nick, atoi<span style="color: #66cc66;">&#40;</span>level<span style="color: #66cc66;">&#41;</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, cryptpass, time<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
   add_user_addrinfo<span style="color: #66cc66;">&#40;</span>csadminchan, nick, usrhost<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>caddr != <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
   add_userinfo<span style="color: #66cc66;">&#40;</span>csadminchan, nick, atoi<span style="color: #66cc66;">&#40;</span>level<span style="color: #66cc66;">&#41;</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, <span style="color: #000000; font-weight: bold;">FALSE</span>, cryptpass, time<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
   add_user_addrinfo<span style="color: #66cc66;">&#40;</span>csadminchan, nick, usrhost<span style="color: #66cc66;">&#41;</span>;
   add_user_addrinfo<span style="color: #66cc66;">&#40;</span>csadminchan, nick, ip_addr<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>caddr == <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
   send_to_server<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;:%s NOTICE %s : Profile [%s] [ %d ] Autoop [OFF] Protection [OFF] Suspendu [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
                  bot.<span style="color: #202020;">nick</span>, nwho, nick,atoi<span style="color: #66cc66;">&#40;</span>level<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
   send_to_server<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;:%s NOTICE %s : Mask %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, bot.<span style="color: #202020;">nick</span>, nwho, usrhost<span style="color: #66cc66;">&#41;</span>;
   write_single_channel<span style="color: #66cc66;">&#40;</span>csadminchan<span style="color: #66cc66;">&#41;</span>;
   info1<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\0</span>'</span>;
   add_infoinfo<span style="color: #66cc66;">&#40;</span>csadminchan, nick, info1<span style="color: #66cc66;">&#41;</span>;
   write_single_infolines<span style="color: #66cc66;">&#40;</span>csadminchan<span style="color: #66cc66;">&#41;</span>;
   <span style="color: #b1b100;">return</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>caddr != <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
   send_to_server<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;:%s NOTICE %s : Profile [%s] [ %d ] Autoop [OFF] Protection [OFF] Suspendu [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
                  bot.<span style="color: #202020;">nick</span>, nwho, nick,atoi<span style="color: #66cc66;">&#40;</span>level<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
   send_to_server<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;:%s NOTICE %s : Masks %s %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, bot.<span style="color: #202020;">nick</span>, nwho, usrhost, ip_addr<span style="color: #66cc66;">&#41;</span>;
   write_single_channel<span style="color: #66cc66;">&#40;</span>csadminchan<span style="color: #66cc66;">&#41;</span>;
   info1<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\0</span>'</span>;
   add_infoinfo<span style="color: #66cc66;">&#40;</span>csadminchan, nick, info1<span style="color: #66cc66;">&#41;</span>;
   write_single_infolines<span style="color: #66cc66;">&#40;</span>csadminchan<span style="color: #66cc66;">&#41;</span>;
   <span style="color: #b1b100;">return</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<h4>VI. Organisation des classes n'importe comment</h4>
<p>Lorsque vous faites de la programmation objet, il est indispensable de ne <b>PAS</b> réfléchir à l'organisation de vos classes.</p>
<p>Voici quelques pratiques à suivre :</p>
<ul>
<li> Préférez les grosses classes usines à gaz à tout faire, avec un maximum de méthodes dedans. </li>
<li> Faites beaucoup de liens entre vos classes, afin que toutes dépendent les unes des autres. </li>
<li> N'hésitez pas à faire des appels qui partent dans tous les sens. Par exemple la méthode A::Blah() appelle B::Truc() qui appellera C::Foo() rappelant A::Bar(), et ainsi de suite. (C'est la <a href="http://fr.wikipedia.org/wiki/Programmation_spaghetti">programmation spaghetti</a>).</li>
<li> Ne créez pas d'attributs privés. L'encapsulation est inutile et complexifie inutilement le code. Rendez toutes vos variables publiques. Après tout cela facilite les comportements indésirables. </li>
</ul>
<h4>VII. Ne pas respecter le cycle de développement</h4>
<p>Une mauvaise pratique qu'il est indispensable de suivre, est la restructuration du code pendant une phase de stabilisation du projet, par exemple après la sortie d'une <a href="http://fr.wikipedia.org/wiki/Release_Candidate##Release_candidate_.28RC.29_ou_pre-release">RC</a>.</p>
<p>Rien de tel en effet que retarder la release en modifiant un composant de base utilisé un peu partout dans le code, afin de rendre celui-ci instable et de nécessiter une RC supplémentaire. Un bon moyen est par exemple de changer totalement l'interface d'une classe très utilisée.</p>
<p>À ce propos, en particulier pour une bibliothèque, il est recommandé à chaque version de changer complètement l'API sans garder de retro compatibilité. Après tout cela donnera bien plus de travail aux utilisateurs de votre bibliothèque et favorisera une diminution du chômage.</p>
<h4>VIII. Préférer le hard coding aux fichiers de configuration</h4>
<p>Le <i>hard-coding</i> est tout un art qu'il est absolument nécessaire de maîtriser lorsqu'on est un mauvais programmeur. Il consiste à laisser dans le code des éléments de configuration, tels que le nom d'hôte de la base de donnée, les chemins d'accès aux données (<b>"C:\Mes Documents"</b> par exemple sous Windows 98, qui est un chemin par défaut mais qui pourrait avoir été configuré autrement par l'utilisateur), etc.</p>
<p>Le summum est de laisser dans le code le mot de passe d'un serveur utilisé en prod dans votre entreprise, surtout lorsque ce serveur est accessible depuis l'extérieur.</p>
<p>Une autre forme de hard-coding un peu plus modérée, est l'usage des <i>magic-numbers</i>. Il consiste en laissant des tailles de tableaux, par exemple, dans le code, plutôt que des constantes. Ceci a le merveilleux effet de rendre très difficile la modification de la taille d'un tableau utilisé à plusieurs endroits dans le code.<br />
À ce propos, quelque chose qu'il faut absolument pratiquer, est l'utilisation de tailles excessives pour les buffers. Quoi de mieux en effet que de gaspiller la mémoire.</p>
<h4>IX. Hacking</h4>
<p>La pratique du <i>hack</i> est quelque chose de primordial dans la génération de code de merde.<br />
Il consiste à préférer la modification locale et non généralisée d'une partie du code afin de résoudre un problème, plutôt que de généraliser davantage le système actuel en rajoutant des mécanismes permettant la résolution de ce problème, ce qui serait plus long à développer sur le moment, mais bien plus profitable sur le long terme.</p>
<p>Voici un exemple légèrement comique, qui est issue du code de <b>Windows 2000</b> (rendu public illégalement il y a plusieurs années).</p>
<p>La fonction en question est <b>CScriptHolder::OnScriptError()</b>, qui apparament est un handler appellé en cas d'erreur dans un script JS. En voici un extrait :</p>
<pre class="c">&nbsp;
        hr = errRecord.<span style="color: #202020;">Init</span><span style="color: #66cc66;">&#40;</span>pScriptError, pDoc<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>hr<span style="color: #66cc66;">&#41;</span>
            <span style="color: #b1b100;">goto</span> Cleanup;
&nbsp;
        <span style="color: #808080; font-style: italic;">// HACK fix for IE5 bug# 58568</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>OutLook98HackReqd<span style="color: #66cc66;">&#40;</span>pDoc, errRecord._uLine, errRecord._uColumn<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #b1b100;">goto</span> Cleanup;
&nbsp;</pre>
<p>Il semblerait donc qu'un bug dans <b>IE5</b> oblige le parseur à être un peu plus tolérant avec lui. Une fonction est donc dédiée à la détection de cette erreur. Et quelle fonction ! Admirez :</p>
<pre class="c">&nbsp;
BOOL OutLook98HackReqd<span style="color: #66cc66;">&#40;</span>CDoc *pDoc, ULONG uLine, ULONG uCol<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">36</span> == uLine<span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">35</span> == uCol<span style="color: #66cc66;">&#41;</span> ||
        <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">51</span> == uLine<span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">28</span> == uCol<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp;
        !_tcsicmp<span style="color: #66cc66;">&#40;</span>pDoc-&gt;_cstrUrl, _T<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;outday://&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">TRUE</span>;
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">FALSE</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<h4>X. Préférer les fonctions insécuriées telles que scanf(), strcpy(), etc</h4>
<p>Vous ne deviendrez un mauvais programmeur que si prenez un soin particulier à y parsemer des failles en tous genres et autres petits bugs très joyeux à corriger.</p>
<p>Une chose à savoir est d'avant tout préférer les fonctions telles que <b>strcpy()</b>, <b>scanf()</b>, <b>strcat()</b> plutôt que respectivements <b>strncpy()</b>, <b>fgets()</b> ou <b>strncat()</b> (qui, au demeurant, ont des comportements pouvant également poser problème si elles sont mal utilisées).</p>
<p>Le top est quand même d'appeler strcpy() à partir d'une chaîne récupérer par le réseau. Par exemple :</p>
<pre class="c">&nbsp;
<span style="color: #993333;">void</span> func<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span>* buf<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #993333;">char</span> args<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#93;</span>;
	<span style="color: #993333;">int</span> i = <span style="color: #cc66cc;">0</span>;
	<span style="color: #993333;">char</span>* ptr;
&nbsp;
	strtok<span style="color: #66cc66;">&#40;</span>buf, <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">do</span>
	<span style="color: #66cc66;">&#123;</span>
		strcpy<span style="color: #66cc66;">&#40;</span>args<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>, ptr<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
	<span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>ptr = strtok<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	call_cmd<span style="color: #66cc66;">&#40;</span>i, args<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> recv_msg<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> sock<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #993333;">char</span> buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">&#93;</span>;
&nbsp;
	recv<span style="color: #66cc66;">&#40;</span>sock, buf, <span style="color: #993333;">sizeof</span> buf - <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	func<span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Grâce à ce morceau de code erroné, vous pouvez envoyer un message au socket du type <i>"a a a a a a a a a a a a a a aaaaa[100 fois][votre code frauduleux]"</i> pour introduire des instructions dans la pile du programme.</p>
<p>Les exemples sont très multiples avec les diverses fonctions, donc allez y de cœur joie avec les dépassements de tampon.</p>
<h4>Conclusion</h4>
<p>Nous avons vu dix méthodes pour pourrir un projet qui ont fait leur preuve, ainsi que la majeur partie des programmeurs peuvent en témoigner. On a également été tous amené à en utiliser, soit par ignorance, soit par commodité, ou encore par faute de temps.</p>
<p>Cependant, il en existe bien d'autres. Je recommande à ce propos la lecture de <a href="http://en.wikipedia.org/wiki/Anti-pattern">cet article sur les Anti-Pattern</a> qui en donne un bon nombre.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/04/14/dix-pratiques-pour-etre-un-mauvais-programmeur/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Peerfuse : Nouveau site</title>
		<link>http://blog.p.engu.in/2008/03/30/peerfuse-nouveau-site/</link>
		<comments>http://blog.p.engu.in/2008/03/30/peerfuse-nouveau-site/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 14:08:09 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[peerfuse]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/2008/03/30/peerfuse-nouveau-site/</guid>
		<description><![CDATA[Voici le nouveau site de Peerfuse en exclusivité : http://peerfuse.org/ Il va bientôt également y avoir un site pour peerfuse.net qui se concentrera sur le réseau officiel de peerfuse-net, là où peerfuse.org concerne le projet lui même (développement, etc).]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:2a21fcaa472ffc7157565d6e681fd6ddb8eb8793'><p>Voici le nouveau site de <b><a href="http://blog.p.engu.in/2008/03/12/peerfuse/">Peerfuse</a></b> en exclusivité : <a href="http://peerfuse.org/">http://peerfuse.org/</a></p>
<p>Il va bientôt également y avoir un site pour <b>peerfuse.net</b> qui se concentrera sur le réseau officiel de <b>peerfuse-net</b>, là où <b>peerfuse.org</b> concerne le projet lui même (développement, etc).</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/03/30/peerfuse-nouveau-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[C++] Des défauts du C++ (Part 1) : std::string</title>
		<link>http://blog.p.engu.in/2008/03/24/c-des-defauts-du-c-part-1-stdstring-non-generalisee/</link>
		<comments>http://blog.p.engu.in/2008/03/24/c-des-defauts-du-c-part-1-stdstring-non-generalisee/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 09:52:15 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[INL]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://blog.p.engu.in/2008/03/24/c-des-defauts-du-c-part-1-stdstring-non-generalisee/</guid>
		<description><![CDATA[Le C++ est un langage très sympa qui permet de faire de l'objet tout en gardant une compatibilité avec le C. Il est de fait le langage le plus approprié lorsqu'on veut allier objet et "bas niveau". Cependant, il possède des défauts assez décevants car pouvant être (je pense) évités. Je vais débuter une série [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:136592443773105d36ee1a4f1a2b98ab25e38f8b'><p>Le C++ est un langage très sympa qui permet de faire de l'objet tout en gardant une compatibilité avec le C. Il est de fait le langage le plus approprié lorsqu'on veut allier objet et "bas niveau". Cependant, il possède des défauts assez décevants car pouvant être (je pense) évités.<br />
Je vais débuter une série d'articles concernant les quelques inconvénients que je rencontre au quotidien. Si bien évidemment pour vous c'est une "feature not a bug", n'hésitez pas à exprimer votre pensée dans les commentaires.</p>
<p><span id="more-483"></span></p>
<h4> std::string non généralisé</h4>
<p>Quelque chose de très chiant que je rencontre fréquemment en C++, c'est le fait que l'objet <b>std::string</b> n'est pas utilisée tout le temps, même dans la STL. Bien évidemment, on serait tenté de réagir en disant qu'il y a des moments où ça n'est pas nécessaire, quand on veut accélerer les opérations ou faire du bas niveau.</p>
<p>Oui mais dans le cas suivant je trouve ça quand même dommage d'avoir à écrire :</p>
<pre class="c">std::<span style="color: #202020;">ifstream</span> fp<span style="color: #66cc66;">&#40;</span>filename.<span style="color: #202020;">c_str</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre>
<p>Le constructeur de cette classe, dont but est l'ouverture d'un fichier en écriture, ne prend qu'un <b>const char*</b> et même pas un <b>std::string</b>.</p>
<p>Vous allez me dire que ça ne change rien, si ce n'était pas moi qui appellait la méthode <b>c_str()</b> c'est lui qui le ferait. Certes. Sauf que je trouve ça incroyablement laid de devoir faire appel à ces méthodes dans mon code. Le but de la STL est d'encapsuler du code de bas niveau dans des objets.<br />
Il est navrant je trouve même que l'on ait, dans le cas d'une utilisation haut niveau, à savoir qu'un <b>std::string</b> encapsule un <b>char[]</b>. L'utilisation de <b>c_str()</b> devrait être réservée lorsque l'on souhaite faire du bas niveau (sockets par exemple).</p>
<p>Le pire dans cet exemple c'est qu'un simple constructeur de trois lignes auraient pu régler ce problème.</p>
<h4>Conversation std::string <-> int</h4>
<p>Il n'existe pas, à l'instar des autres langages objet de haut niveau, une méthode <b>.toint()</b> ou similaire, à l'objet <b>std::string</b>. Le seul moyen de convertir une chaîne en entier est :</p>
<pre class="c"><span style="color: #993333;">int</span> i;
std::<span style="color: #993333;">string</span> str = <span style="color: #ff0000;">&quot;123&quot;</span>;
std::<span style="color: #202020;">istringstream</span> s<span style="color: #66cc66;">&#40;</span>str<span style="color: #66cc66;">&#41;</span>;
s &gt;&gt; i;</pre>
<p>Et d'un entier en une chaîne :</p>
<pre class="c">std::<span style="color: #202020;">ostringstream</span> s;
std::<span style="color: #993333;">string</span> str;
<span style="color: #993333;">int</span> i = <span style="color: #cc66cc;">123</span>;
s &lt;&lt; i;
str = s.<span style="color: #202020;">str</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre>
<p>C'est très peu pratique, et en général dans mes projets C++ je me défini les deux fonctions templates ci-dessous :</p>
<pre class="c">template&lt;typename T&gt;
T StrToTyp<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">const</span> std::<span style="color: #202020;">string</span>&amp; str<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
        T dest;
        std::<span style="color: #202020;">istringstream</span> iss<span style="color: #66cc66;">&#40;</span> str <span style="color: #66cc66;">&#41;</span>;
        iss &gt;&gt; dest;
        <span style="color: #b1b100;">return</span> dest;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
template&lt;typename T&gt;
std::<span style="color: #993333;">string</span> TypToStr<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">const</span> T&amp; value<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
        std::<span style="color: #202020;">ostringstream</span> oss;
        oss &lt;&lt; value;
        <span style="color: #b1b100;">return</span> oss.<span style="color: #202020;">str</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>À utiliser de la manière suivante :</p>
<pre class="c"><span style="color: #993333;">int</span> i = <span style="color: #cc66cc;">123</span>;
std::<span style="color: #993333;">string</span> s;
&nbsp;
s = TypToStr<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>;
i = StrToTyp&lt;int&gt;<span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>;</pre>
<p>L'avantage est que ce template permet de convertir de et vers tous les types pris en charge par les objets <b>std::ostringstream</b> et <b>std::istringstream</b></p>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.p.engu.in/2008/03/24/c-des-defauts-du-c-part-1-stdstring-non-generalisee/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
