<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>ascendances</title>
	<atom:link href="http://ascendances.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ascendances.wordpress.com</link>
	<description></description>
	<lastBuildDate>Mon, 20 Feb 2012 13:14:05 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='ascendances.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>ascendances</title>
		<link>http://ascendances.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://ascendances.wordpress.com/osd.xml" title="ascendances" />
	<atom:link rel='hub' href='http://ascendances.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Comparatif grep, ack et grin</title>
		<link>http://ascendances.wordpress.com/2012/02/17/comparatif-grep-ack-et-grin/</link>
		<comments>http://ascendances.wordpress.com/2012/02/17/comparatif-grep-ack-et-grin/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 14:55:57 +0000</pubDate>
		<dc:creator>ascendances</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[okiwi]]></category>
		<category><![CDATA[yaal]]></category>

		<guid isPermaLink="false">http://ascendances.wordpress.com/?p=452</guid>
		<description><![CDATA[Sur le ring, grep dominait et le public l&#8217;acclamait. Mais deux petits nouveaux, ack et grin, avaient enfilé leurs plus belles tenues de super-stars du catch pour lui ravir sa ceinture de champion et le cœur des développeurs. Vont-ils y arriver ? C&#8217;est ce que vous saurez en lisant cet article ! Parfois, un programmeur veut connaître [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=452&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sur le ring, <code>grep</code> dominait et le public l&#8217;acclamait.  Mais deux petits nouveaux, <code>ack</code> et <code>grin</code>, avaient enfilé leurs plus belles tenues de super-stars du catch pour lui ravir sa ceinture de champion et le cœur des développeurs. Vont-ils y arriver ? C&#8217;est ce que vous saurez en lisant cet article ! </p>
<p>Parfois, un programmeur veut connaître l&#8217;ensemble des occurrences d&#8217;un symbole dans un programme (une variable, une classe, etc.). La solution la plus évidente est d&#8217;utiliser <code>grep</code> mais, pour peu qu&#8217;il y ait d&#8217;autres fichiers dans le répertoire du projet, de nombreux faux positifs vont apparaître, rendant le travail d&#8217;analyse fastidieux. Par exemple, s&#8217;il existe des copies créées automatiquement par un éditeur de texte, les fichiers des dépôts (<code>.svn</code>, <code>.hg</code>, fichier binaire, etc.). À <a href="http://www.yaal.fr" title="Yaal : développement logiciel">Yaal</a>, nous utilisons Python. Avec virtualenv, les fichiers de dépôt, les fichiers .pyc produits automatiquement, la documentation, etc. les résultats de <code>grep</code> sont plus ou moins truffés de faux positifs.</p>
<p>Il est bien évidemment possible d&#8217;exclure ce genre de fichier en multipliant les commandes (<code>| grep -v a_exclure</code>). Mais l&#8217;augmentation des lignes à éliminer rend la commande toujours moins pratique. Pour contourner cela, la suite logique est de transformer la commande en un script shell. Cependant, d&#8217;autres programmes comme <code>ack</code> et <code>grin</code> visent déjà à résoudre ce problème. L&#8217;objectif de cet article est de montrer quelques spécificités de chaque outil.</p>
<h3>Les différents outils</h3>
<p>Voici une présentation succincte des trois adversaires :</p>
<ul>
<li><code>grep</code> : l&#8217;outil Unix classique qui servira de référence ;</li>
<li><code>ack</code> : outil écrit en Perl visant à faire des recherches, orienté pour des développeurs. Ce logiciel est disponible dans Debian et dérivées par l&#8217;intermédiaire du paquet <code>ack-grep</code>. La commande est aussi <code>ack-grep</code>. Le changement de nom est dû au fait qu&#8217;il existait déjà un paquet du nom de <code>ack</code>. Dans la suite de l&#8217;article, on mentionnera simplement <code>ack</code> ;</li>
<li><code>grin</code> : outil écrit en Python ayant le même but que <code>ack</code>. Il n&#8217;est pas disponible dans Debian. Étant donné qu&#8217;il est disponible dans Pypi (les dépôts de paquets Python, équivalant au CPAN de Perl), grin peut être installé avec <code>pip install grin</code>. Le paquet python-pip doit être préalablement installé. Puisqu&#8217;il n&#8217;y a pas de page de manuel, la documentation à utiliser est celle de <code>grin --help</code> et la <a href="http://pypi.python.org/pypi/grin" title="dépôt Python pour grin">page de documentation sur le dépôt Python</a>.</li>
</ul>
<p>Que le match commence !</p>
<h3>Usage</h3>
<h4>Recherche dans un fichier</h4>
<pre>grep MOTIF FICHIER
ack-grep MOTIF FICHIER
grin MOTIF FICHIER</pre>
<p>Dans chaque cas, MOTIF peut être une expression rationnelle (par exemple <code>[fF]év</code> vaut <code>fév</code> ou <code>Fév</code>). </p>
<p>Voici un exemple de résultats que l&#8217;on peut obtenir :</p>
<pre>stephane@foehn:~/src/strdatetime$ grep [Ff]év translation.py
u"janv", u"févr", u"mars",
u"janvier", u"février", u"mars",
u"Janvier", u"Février", u"Mars",
stephane@foehn:~/src/strdatetime$ ack-grep [Ff]év translation.py
u"janv", u"févr", u"mars",
u"janvier", u"février", u"mars",
u"Janvier", u"Février", u"Mars",
stephane@foehn:~/src/strdatetime$ grin [Ff]év translation.py
translation.py:
   19 : u"janv", u"févr", u"mars",
   26 : u"janvier", u"février", u"mars",
   30 : u"Janvier", u"Février", u"Mars",</pre>
<p>La sortie de <code>grep</code> et d&#8217;<code>ack</code> sont identiques, alors que <code>grin</code> fournit le nom du fichier et le numéro de lignes. </p>
<h4>Recherche récursive</h4>
<p>La plupart du temps, l&#8217;objectif est de chercher dans tout une arborescence de répertoire. C&#8217;est le fonctionnement par défaut pour <code>ack</code> et <code>grin</code>.</p>
<pre>grep -r MOTIF . #ou rgrep
ack-grep MOTIF
grin MOTIF</pre>
<p>La sortie produite par <code>grep</code> et <code>ack</code> évolue pour ajouter le nom du fichier et les lignes. <code>grep</code> met tout sur une ligne alors qu&#8217;<code>ack</code> a une sortie identique à celle de <code>grin</code>. <code>grin</code> produit une sortie toujours structurée de la même manière (cf. l&#8217;exemple du paragraphe précédent).</p>
<p>Alors que la différence de vitesse lors de l&#8217;analyse d&#8217;un seul fichier ne se sent pas, elle devient sensible lors d&#8217;une recherche récursive. Quelques tests rapides (et sans prétention d&#8217;exhaustivité ou de représentativité) donnent des résultats bien plus lents pour <code>ack</code> et <code>grin</code>.</p>
<blockquote><p>grep : 0,3 s<br />
ack-grep : 1,7 s<br />
grin : 2,8 s</p></blockquote>
<p>Cependant, ajouter des tubes pour exclure des résultats obtenus avec <code>grep</code> dans le but d&#8217;éliminer des résultats (et donc arriver à un résultat comparable avec ce qui est obtenu avec <code>ack</code> ou <code>grin</code>) augmentera le temps passé et donc réduira l&#8217;écart avec les deux autres outils.</p>
<h4>Recherche insensible à la casse</h4>
<pre>grep -i MOTIF FICHIER
ack-grep -i MOTIF FICHIER
grin -i MOTIF FICHIER</pre>
<p>Même syntaxe que dans les cas précédents, juste l&#8217;option <code>-i</code> en plus. Aucune surprise ici. Pas la peine d&#8217;en rajouter. Passez au paragraphe suivant. Faut-il vraiment que j&#8217;arrête d&#8217;écrire ce paragraphe pour vous arrêtiez de le lire ?!</p>
<h4>Recherche en ignorant certains types de fichiers</h4>
<p>Cette fonctionnalité est très utile pour ne pas chercher dans des fichiers sans intérêt :</p>
<pre>grep -r --exclude=*.sh  --exclude=*.h "interpreted as " .
ack-grep --type=nohh --type=noshell  "interpreted as "
grin --skip-exts .h,.sh  "interpreted as "</pre>
<p>Ici, on exclut les fichiers d&#8217;en-tête de code C (<code>*.h</code>) et les scripts shell (<code>*.sh</code>). <code>grep</code> et <code>grin</code> recherchent directement une correspondance de motif alors qu&#8217;<code>ack</code> permet des exclusions de types ou d&#8217;extension. Les types sont basés sur les noms d&#8217;extension de fichiers (avec la correspondance de motif). Par exemple, le type <code>shell</code> correspond à <code>.sh</code>, <code>.bash</code>, <code>.csh</code>, <code>.tcsh</code>, <code>.ksh</code> et <code>.zsh</code>. La définition d&#8217;un type de fichier est conçu pour être facilement extensible.</p>
<p>Par défaut, <code>ack</code> et <code>grin</code> exclut les répertoires et les fichiers sans intérêt. L&#8217;option d&#8217;exclusion permet d&#8217;en ajouter de nouveaux. La liste des fichiers exclus par défaut n&#8217;est pas identique entre <code>ack</code> et <code>grin</code> donc les résultats peuvent différer un peu. Par exemple, c&#8217;est le cas des fichiers <code>.texi</code>, exclus par <code>ack</code>, mais pas par <code>grin</code>.</p>
<h4>Recherche en ignorant certains répertoires</h4>
<pre>grep -r --exclude-dir DIR1 --exclude-dir DIR2 MOTIF .
ack-grep --ignore-dir DIR1 --ignore-dir DIR2  MOTIF
grin --skip-dirs DIR1,DIR2 MOTIF</pre>
<p>Ces commandes permettent d&#8217;exclure DIR1 et DIR2 de la recherche. <code>grin</code> ajoute les répertoires enlevés à la liste des répertoires qu&#8217;il exclut automatiquement.</p>
<h4>Ajout des lignes de contexte</h4>
<p>Les options sont toutes identiques et ont le même comportement.</p>
<pre>-A, --after-context
-B, --before-context
-C, --context  #avant et après</pre>
<p>Comme à chaque fois, <code>grin</code> affichage systématiquement le numéro des lignes.</p>
<h4>Affichage limité aux fichiers correspondants</h4>
<pre>grep -r -l MOTIF.
ack-grep -l MOTIF
grin -l MOTIF</pre>
<p>C&#8217;est donc l&#8217;option <code>-l</code> ou <code>--files-with-matches</code> à chaque fois.</p>
<h4>Affichage limité aux fichiers non correspondants</h4>
<pre>grep -r -L MOTIF .
ack-grep -L MOTIF  # = -l -v
#rien pour grin !</pre>
<p>L&#8217;option <code>-L</code> (ou <code>--files-without-matches</code>) permet de n&#8217;afficher que les fichiers sans l&#8217;occurence MOTIF pour <code>grep</code> et <code>ack</code>. <code>grin</code> a bien une option de ce nom mais son comportement est complètement différent. L&#8217;aide de la commmande signale que ce paramètre permet d&#8217;afficher le nom du fichier avec la correspondance. Ce qui est le comportement par défaut. Je ne comprend pas l&#8217;intérêt de cette option, trompeuse de surcroît.</p>
<h4>Inversion de la sélection</h4>
<pre>grep -v MOTIF FICHIER
ack-grep -v  MOTIF FICHIER
#rien pour grin !</pre>
<p>Pas d&#8217;option équivalente à <code>-v</code> pour <code>grin</code>. Rien ! Nada ! Zéro ! Que dalle ! ∅ !</p>
<h3>Intégration avec un éditeur</h3>
<p><code>ack</code> dispose d&#8217;un paramètre <code>--column</code> pour qu&#8217;un éditeur de texte se place directement sur la première occurence.</p>
<p>La documentation d&#8217;<code>ack</code> précise que l&#8217;outil est intégrable avec Vim, Emacs et TextMate. Je n&#8217;ai testé aucune de ces possibilités.</p>
<p><code>grin</code> dispose d&#8217;un paramètre <code>--emacs</code> qui affiche le nom du fichier, le numéro de la ligne et son contenu sur la même ligne pour faciliter l&#8217;analyse « par exemple avec emacs » :</p>
<pre>stephane@foehn:~/src/strdatetime$ grin Fév
./tests.py:
  122 :         d_fr = strdatetime.strdatetime(u"Févr", "%b", lang="fr")
  136 :         d_fr = strdatetime.strdate(u"Févr", "%b", lang="fr")
./translation.py:
   30 : u"Janvier", u"Février", u"Mars",
stephane@foehn:~/src/strdatetime$ grin --emacs Fév
./tests.py:122:         d_fr = strdatetime.strdatetime(u"Févr", "%b", lang="fr")
./tests.py:136:         d_fr = strdatetime.strdate(u"Févr", "%b", lang="fr")
./translation.py:30: u"Janvier", u"Février", u"Mars",</pre>
<p>Je suis très dubitatif sur le choix de nommage des options dans grin mais cette option me semble vraiment intéressante.</p>
<h3>Configuration</h3>
<p>Il est possible d&#8217;enregistrer des préférences pour qu&#8217;elles soient utilisées à chaque fois.</p>
<p><code>grep</code> est le plus limité. Si l&#8217;utilisateur enregistre un fichier FICHIER avec tous les motifs de noms de fichier (possibilité d&#8217;utiliser les caractères jokers de l&#8217;interprète de commande) qu&#8217;il veut exclure, il peut les faire prendre en compte en utilisant <code>--exclude-from=FICHIER</code>. C&#8217;est limité mais cette fonctionnalité reste probablement sous-exploitée.</p>
<p><code>ack</code> prend en compte un fichier de configuration <code>.ackrc</code> dans lequel on peut ajouter les options à lancer systématiquement. Simple et efficace. Certains paramètres sont aussi accessibles grâce à des variables d&#8217;environnement.</p>
<p><code>grin</code> utilise une variable d&#8217;environnement <code>$GRIN_ARGS</code>. Elle doit valoir une chaîne de caractère qui inclut les paramètres à ajouter par défaut. Fonctionnel mais moins élégant que le fichier de configuration d&#8217;<code>ack</code>.</p>
<h3>Conclusion</h3>
<p>Pour une utilisation dans le cadre de développement logiciel, <code>ack</code> me semble le plus adapté. Par contre, le fait qu&#8217;il n&#8217;affiche pas toutes les informations sur la même ligne empêche sa sortie d&#8217;être réutilisable facilement. <code>grin</code> me semble moins bon mais évite cet écueil (avec <code>--emacs</code>) et affiche toujours les lignes, ce qui peut s&#8217;avérer assez pratique.</p>
<p><code>grep</code> est plus généraliste et possède plus d&#8217;options. Il reste donc indispensable et a l&#8217;avantage d&#8217;être toujours disponible sur le système, ce qui n&#8217;est pas le cas des deux autres.</p>
<p>Je n&#8217;ai fait qu&#8217;aborder les fonctionnalités qui me semblaient les plus courantes, chacun en possède d&#8217;autres et sont à portée de <code>man</code>. Explorez-les !</p>
<p>Versions utilisées :<br />
grep (GNU grep) 2.10<br />
ack-grep 1.92<br />
grin 1.2.1</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ascendances.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ascendances.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ascendances.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ascendances.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ascendances.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ascendances.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ascendances.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ascendances.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ascendances.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ascendances.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ascendances.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ascendances.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ascendances.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ascendances.wordpress.com/452/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=452&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ascendances.wordpress.com/2012/02/17/comparatif-grep-ack-et-grin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bcc6840b48d2ee3ea608e58356fa7d47?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ascendances</media:title>
		</media:content>
	</item>
		<item>
		<title>Carte heuristique de commandes unix</title>
		<link>http://ascendances.wordpress.com/2012/01/17/carte-heuristique-de-commandes-unix/</link>
		<comments>http://ascendances.wordpress.com/2012/01/17/carte-heuristique-de-commandes-unix/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 23:06:24 +0000</pubDate>
		<dc:creator>ascendances</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[okiwi]]></category>
		<category><![CDATA[yaal]]></category>

		<guid isPermaLink="false">http://ascendances.wordpress.com/?p=415</guid>
		<description><![CDATA[Voici une carte heuristique (mind map en anglais) de commandes unix. Évidemment, la carte est loin d&#8217;être exhaustive (il n&#8217;existe pas d&#8217;écran assez grand pour toutes les afficher en même temps). Il s&#8217;agit plutôt d&#8217;une tentative pour représenter les outils disponibles en partant du besoin de l&#8217;utilisateur plutôt que des outils eux-mêmes : il est [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=415&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Voici une <a href="http://fr.wikipedia.org/wiki/Carte_heuristique" title="page wikipedia francophone sur les cartes heuristiques">carte heuristique</a> (<em>mind map</em> en anglais) de commandes unix. </p>
<p>Évidemment, la carte est loin d&#8217;être exhaustive (il n&#8217;existe pas d&#8217;écran assez grand pour toutes les afficher en même temps). Il s&#8217;agit plutôt d&#8217;une tentative pour représenter les outils disponibles en partant du besoin de l&#8217;utilisateur plutôt que des outils eux-mêmes : il est facile de consulter une page de manuel si l&#8217;on sait quelle page consulter. La commande <code>apropos</code> et le web permettent en général de trouver quelle commande utiliser mais cela reste parfois difficile lorsque l&#8217;on ne sait pas définir exactement son problème.</p>
<p><a href="http://ascendances.files.wordpress.com/2012/01/mindmap_commandes_unix.png"><img src="http://ascendances.files.wordpress.com/2012/01/mindmap_commandes_unix.png?w=300&#038;h=218" alt="" title="Carte heuristique de commandes Unix" width="300" height="218" class="aligncenter size-medium wp-image-414" /></a></p>
<p>Lorsqu&#8217;il y a plusieurs commandes sur le même noeud, cela signifie qu&#8217;elles peuvent être utilisées dans le même but mais selon les préférences, les habitudes ou leur disponibilité (si elles sont installées ou non sur le système), on pourra préférer l&#8217;une ou l&#8217;autre d&#8217;entre elles. Par exemple, à titre personnel, j&#8217;apprécie <code>most</code> comme lecteur de fichier, entre autres pour la coloration des pages de manuel, mais le paquet n&#8217;est pas installé par défaut sous Debian et dérivées. Dans ce cas-là, <code>less</code> est la solution. Je ne cite pas <code>more</code>, réservé aux fans de masochisme hardcore. Autant utiliser <code>cat</code>, il y a un caractère de moins à taper.</p>
<p>Parfois des paramètres sont ajoutées à la commande car ils sont nécessaires pour l&#8217;obtention du résultat attendu. Pour autant, l&#8217;utilisateur ne devrait pas faire l&#8217;économie de regarder les autres options s&#8217;il désire un résultat un peu différent.</p>
<p>La plupart des outils cités sont très connus. À part peut-être <a href="http://screenshots.debian.net/package/bsdmainutils">cal</a> (inclus dans le paquet bsdmainutils dans Debian), <a href="http://screenshots.debian.net/package/concalc">concalc</a> (paquet concalc), <a href="http://screenshots.debian.net/screenshots/c/coreutils/8306_large.png">fold</a> (inclus dans le paquet coreutils) ou <a href="http://screenshots.debian.net/package/tree">tree</a> (paquet tree) ?</p>
<p>Rappelons que la puissance du shell ne se résume à des outils mais bien dans leur combinaison. Si elle ne suffit pas, rien n&#8217;empêche d&#8217;utiliser un langage de script de plus haut niveau (Perl, Python, Ruby, etc.).</p>
<h3>Sources</h3>
<p>Carte réalisée avec <a href="http://freeplane.sourceforge.net/wiki/index.php/Main_Page" title="site web de Freepane">Freeplane</a> v.1.1.3.<br />
D&#8217;autres logiciels existent :</p>
<ul>
<li>Freemind, Vym (directement dans Debian) ;</li>
<li>xmind, labyrinth, etc. (non packagés).</li>
</ul>
<p>Le fichier source  .mm est disponible <a href="http://stephane.yaal.fr/img/mindmap_commandes_unix.mm" title="fichier source mindmap mm">ici</a>.</p>
<p>D&#8217;autres personnes ont déjà réalisés des cartes heuristiques comme <a href="http://mind-map-you.blogspot.com/2006/12/unix-command-in-mind-map.html">ici</a> ou <a href="http://www.dsimb.inserm.fr/~gelly/old/files/CommandesUnix.pdf">là</a>.</p>
<p><a href="http://screenshots.debian.net" title="Site regroupant des captures d'écran des logiciels dans Debian">http://screenshots.debian.net</a> est un site regroupant des captures d&#8217;écran de logiciels en actions qui sont disponibles comme paquet dans Debian. L&#8217;envoi de captures d&#8217;écran de paquets pour compléter le site est ouvert à tous. Les captures sont aussi réutilisées ailleurs, par exemple dans <a href="http://www.nongnu.org/synaptic/" title="site web de Synaptic"></a>synaptic.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ascendances.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ascendances.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ascendances.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ascendances.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ascendances.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ascendances.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ascendances.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ascendances.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ascendances.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ascendances.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ascendances.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ascendances.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ascendances.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ascendances.wordpress.com/415/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=415&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ascendances.wordpress.com/2012/01/17/carte-heuristique-de-commandes-unix/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bcc6840b48d2ee3ea608e58356fa7d47?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ascendances</media:title>
		</media:content>

		<media:content url="http://ascendances.files.wordpress.com/2012/01/mindmap_commandes_unix.png?w=300" medium="image">
			<media:title type="html">Carte heuristique de commandes Unix</media:title>
		</media:content>
	</item>
		<item>
		<title>Supprimer des lignes identiques réparties dans un fichier</title>
		<link>http://ascendances.wordpress.com/2011/12/21/supprimer-des-lignes-identiques-reparties-dans-un-fichier/</link>
		<comments>http://ascendances.wordpress.com/2011/12/21/supprimer-des-lignes-identiques-reparties-dans-un-fichier/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 23:11:06 +0000</pubDate>
		<dc:creator>ascendances</dc:creator>
				<category><![CDATA[Autre]]></category>
		<category><![CDATA[okiwi]]></category>
		<category><![CDATA[yaal]]></category>

		<guid isPermaLink="false">http://ascendances.wordpress.com/?p=331</guid>
		<description><![CDATA[Jules et Vincent doivent fournir un fichier texte en supprimant les lignes qui sont plusieurs fois dans le fichier, mais réparties de manière quelconque dans le fichier (par exemple un fichier journal ou une liste de nombres aléatoires). Alors qu&#8217;ils descendent de la voiture pour aller sur le lieu de leur mission, ils en discutent [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=331&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Jules et Vincent doivent fournir un fichier texte en supprimant les lignes qui sont plusieurs fois dans le fichier, mais réparties de manière quelconque dans le fichier (par exemple un fichier journal ou une liste de nombres aléatoires). Alors qu&#8217;ils descendent de la voiture pour aller sur le lieu de leur mission, ils en discutent nonchalamment :<br />
 &#8211; Il nous faudrait des outils Unix pour ces affaires-là.<br />
 &#8211; Y&#8217;a combien de lignes ?<br />
 &#8211; 1.200<br />
 &#8211; En comptant les doublons ?<br />
 &#8211; Oui.<br />
 &#8211; Faudrait des outils Unix&#8230;</p>
<p>Après un moment de réflexion plus ou moins court (selon votre taux de caféine), comme eux, vous vous dites que cela ne devrait vous prendre que quelques secondes, le temps de dégainer un terminal et de taper une commande Unix adéquate&#8230;</p>
<h3>Solutions basées sur le shell</h3>
<p><code>uniq</code> est un outil shell permettant de supprimer des lignes répétées. Voilà qui semble parfait pour ce genre d&#8217;affaire. Malheureusement, en lisant un peu plus la page de man, on apprend qu&#8217;<code>uniq</code> filtre « les  lignes  successives identiques ». La page de man propose un contournement en utilisant <code>sort</code>. Avec un fichier de log, cela peut être plus ou moins utilisable en triant d&#8217;abord par la chaîne de log puis par la date. En revanche, cela ne peut pas vraiment résoudre le problème de valeurs aléatoires. En revanche, il est possible de combiner plusieurs outils Unix en utilisant un compteur de ligne, qui sera supprimé ensuite. </p>
<p>Soit un fichier nommé <code>pulp.txt</code> et contenant les données suivantes :</p>
<pre>1994-10-26
cheese
1994-10-26
1994-10-26
tarte
myrtille
1994-10-26
chalumeau
1994-10-26
1994-10-26
verset
massage</pre>
<p>Commençons par ajouter un compteur de ligne :</p>
<pre>$ nl pulp.txt
     1	1994-10-26
     2	cheese
     3	1994-10-26
     4	1994-10-26
     5	tarte
     6	myrtille
     7	1994-10-26
     8	chalumeau
     9	1994-10-26
    10	1994-10-26
    11	verset</pre>
<p>Puis on trie en fonction des données préalablement fournies, tout en éliminant des chaînes en doubles en même temps :</p>
<pre>$ nl pulp.txt | sort --key 2 --unique
     1	1994-10-26
     8	chalumeau
     2	cheese
     6	myrtille
     5	tarte
    11	verset</pre>
<p>On réordonne selon l&#8217;ordre précédent :</p>
<pre>$ nl pulp.txt | sort --key 2 --unique | sort --key 1 --numeric-sort
     1	1994-10-26
     2	cheese
     5	tarte
     6	myrtille
     8	chalumeau
    11	verset</pre>
<p>Pour finir, on supprime la numérotation :</p>
<pre>$ nl pulp.txt | sort --key 2 --unique | sort --key 1 --numeric-sort | cut --fields 2
1994-10-26
cheese
tarte
myrtille
chalumeau
verset</pre>
<p>Le problème est alors résolu, mais et la mise au point aura probablement pris plus de temps que prévu (selon votre taux d&#8217;alcoolémie) :</p>
<blockquote><p>nl pulp.txt | sort &#8211;key 2 &#8211;unique | sort &#8211;key 1 &#8211;numeric-sort | cut &#8211;fields 2</p></blockquote>
<p>Cependant cette succession de commande ne sera directement réutilisable dès que la structure des chaînes variera (même un tout petit peu). </p>
<p>Il est regrettable qu&#8217;il y ait pas une option permettant de filtrer l&#8217;ensemble des lignes par <code>uniq</code>. Si jamais vous êtes en train de faire une overdose de shell, demandez à votre voisin de vous faire une piqûre d&#8217;adrénaline. (Attention, <a href="http://www.mirror.co.uk/celebs/news/2009/06/28/jacko-was-injected-in-the-heart-to-try-to-revive-him-115875-21476864/" title="piqûre d'adrenaline sur Mickaël Jackson">ça ne fonctionne pas</a> à chaque fois.) Le mainteneur d&#8217;uniq refuse l&#8217;ajout d&#8217;une telle fonctionalité à cause de l&#8217;<a href="http://lists.gnu.org/archive/html/coreutils/2011-11/msg00018.html" title="réponse sur la complexité d'uniq">augmentation de la complexité</a> que cela provoquerait. Par contre, des solutions bien plus compactes de contournement ont été proposées sur la liste de diffusion de coreutils.</p>
<h3>One-liners</h3>
<p>On se repoudre le nez et on y retourne !</p>
<p>Les premières solutions ont été à base de Perl :</p>
<blockquote><p>perl -lne &#8216;print $_ if ! defined $a{$_}; $a{$_}=$_;&#8217;</p>
<p>perl -MDigest::MD5=md5 -lne &#8216;$m=md5($_); print $_ if ! defined $a{$m}; $a{$m}=1&#8242;</p></blockquote>
<p><code>$_</code> représente la ligne en cours de traitement ; elle est affichée si ce n&#8217;est pas une clef d&#8217;un tableau associatif puis on ajoute la chaîne comme clef. La seconde version reprend ce même principe en utilisant une signature md5. Perl est vraiment adapté à l&#8217;écriture de code d&#8217;une ligne : c&#8217;est compact et illisible. Ce qui est tout de même un grand principe de Perl : « <a href="http://jargonf.org/wiki/TIMTOWTDI" title="définition de TIMTOWTDI">il y a plus d&#8217;une façon de le faire</a> », mais on choisira toujours la plus incompréhensible. <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Puis une solution en <a href="http://fr.wikipedia.org/wiki/Awk" title="page wikipedia francophone sur awk">awk</a> a été proposée :</p>
<blockquote><p>awk &#8216;!a[$0]++&#8217;</p></blockquote>
<p>La ligne traitée est <code>$0</code> ; la valeur d&#8217;un tableau <code>a</code> ayant pour clé la ligne en cours de traitement est incrémentée. Si c&#8217;est la deuxième fois qu&#8217;elle est rencontrée, la valeur sera non nulle. Le <code>!</code> inverse le résultat qui sera donc évalué à faux (la chaîne est déjà présente). </p>
<p>Ces solutions résolvent le problème, de manière plus souple que la suite de commandes précédentes. Par contre, elles ne résolvent pas le problème de complexité. Comme cela est réalisé par un interpréteur plutôt que du code C compilé (pour uniq), il est quasi-certain que la consommation mémoire est plus importante et que la vitesse d&#8217;exécution est plus lente&#8230; Je ne pense pas que ce soit un problème mais la réponse est pire que le contre-argument de ne pas le réaliser via uniq.<br />
Pour autant, cela ne m&#8217;a pas apparu nécessaire de tenter de convaincre à nouveau le mainteneur. C&#8217;est comme masser les pieds de la femme du parrain de la pègre locale. Vous le feriez, vous ? Moi non plus.</p>
<h3>Mise en place d&#8217;un alias</h3>
<p>Pour garder le filtre à disposition, il est possible d&#8217;en faire un alias. Pour cela, il suffit de copier la ligne suivante in <code>~/.bash_aliases</code> (si ce fichier est activé dans <code>~/.bashrc</code>) :</p>
<blockquote><p>alias uniqall=&#8217;awk &#8216;&#8221;&#8216;&#8221;&#8216;! a[$0]++&#8217;&#8221;&#8216;&#8221;</p></blockquote>
<p>Alors qu&#8217;ils sont sur la route du retour, Vincent a les mains sur le clavier et un cahot de son fauteuil à roulette fait partir d&#8217;un coup une série de caractères supplémentaires !<br />
Vincent : Oh putain le con j&#8217;ai ajouté plein d&#8217;apostrophes et de guillemets !<br />
Jules : Mais pourquoi t&#8217;as fait ça putain ?<br />
Vincent : Mais parce qu&#8217;il le fallait, c&#8217;est pas un accident !</p>
<p>En effet, Vincent était obligé : la commande awk ou perl fonctionne très bien seule mais elle ne peut pas être insérée directement comme alias. En effet, il faut transformer la commande en chaîne de caractère pour l&#8217;insérer dans le fichier .bash_aliases, donc mettre des apostrophes autour de la commande. Or, il y a déjà des apostrophes à l&#8217;intérieur de la commande (<code>interpréteur 'code'</code>). On aurait donc des apostrophes incluses entre d&#8217;autres apostrophes et le shell interprèterait la seconde apostrophe comme la fin de la première chaîne. Quelques solutions semblent évidentes :</p>
<ul>
<li>Protéger les apostrophes intérieures avec un antislash (<code>\'</code>) ;</li>
<li>Remplacer les apostrophes intérieures par des guillemets ;</li>
<li>Remplacer les apostrophes extérieures par des guillemets.</li>
</ul>
<p>Ces différentes stratégies vont d&#8217;un fonctionnement incorrect (il ne retourne que la première ligne du flux) à une erreur lors de l&#8217;ajout de l&#8217;alias.</p>
<h4>Explication du &#8216;&#8221;&#8216;&#8221;&#8216;</h4>
<p>La ruse est de découper la commande en plusieurs sous-chaînes qui seront concaténées automatiquement par le shell.<br />
<a href="http://ascendances.files.wordpress.com/2011/12/concatenation_guillemets_apostrophes1.gif"><img src="http://ascendances.files.wordpress.com/2011/12/concatenation_guillemets_apostrophes1.gif?w=497" alt="" title="Concaténation de chaînes avec des guillemets et des apostrophes"   class="aligncenter size-full wp-image-377" /></a></p>
<p>Il est tout à fait possible de mettre des espaces à l&#8217;intérieur des chaînes mais pas entre elles. Sinon le shell les interprétera comme des mots différents et ne les concatènera pas.</p>
<h3>Générique de fin</h3>
<p>Merci aux participants de liste de diffusion bug-coreutils qui ont été très réactifs : Pádraig Brady, Jim Meyering et Bob Proulx (le <a href="http://lists.gnu.org/archive/html/bug-coreutils/2011-12/msg00047.html" title="archive e-mail du rapport de bug sur uniq">rapport de bug</a>, début de la discussion).</p>
<p>Merci à Arthur et <a href="http://colingarrigasalaun.blogspot.com/" title="Blog de Colin Garriga Salaün"></a>Colin qui m&#8217;ont suggéré d&#8217;en faire un article. (Ils ne pensaient pas que j&#8217;allais vous faire subir un article de plus de 50 tweets de longueur&#8230;)</p>
<p>Les discussions de Vincent et de Jules sont des références à <a href="http://fr.wikipedia.org/wiki/Pulp_Fiction" title="page wikipedia francophone sur Pulp Fiction">Pulp</a> <a href="http://www.replikultes.net/films/fiches/91/pulp_fiction/repliks/" title="répliques de Pulp Fiction">Fiction</a>. (liste non exhaustive)</p>
<p>Le shell utilisé est bash, version 4.2.20. L&#8217;interpréteur Awk est mawk, version 1.3.3.</p>
<p>Aucun compilateur n&#8217;a été maltraité durant l&#8217;écriture de cet article, ni lors de la mise au point de l&#8217;alias final.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ascendances.wordpress.com/331/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ascendances.wordpress.com/331/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ascendances.wordpress.com/331/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ascendances.wordpress.com/331/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ascendances.wordpress.com/331/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ascendances.wordpress.com/331/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ascendances.wordpress.com/331/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ascendances.wordpress.com/331/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ascendances.wordpress.com/331/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ascendances.wordpress.com/331/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ascendances.wordpress.com/331/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ascendances.wordpress.com/331/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ascendances.wordpress.com/331/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ascendances.wordpress.com/331/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=331&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ascendances.wordpress.com/2011/12/21/supprimer-des-lignes-identiques-reparties-dans-un-fichier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bcc6840b48d2ee3ea608e58356fa7d47?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ascendances</media:title>
		</media:content>

		<media:content url="http://ascendances.files.wordpress.com/2011/12/concatenation_guillemets_apostrophes1.gif" medium="image">
			<media:title type="html">Concaténation de chaînes avec des guillemets et des apostrophes</media:title>
		</media:content>
	</item>
		<item>
		<title>Publications Debian sur une ligne du temps</title>
		<link>http://ascendances.wordpress.com/2011/10/28/publications-debian-sur-une-ligne-du-temps/</link>
		<comments>http://ascendances.wordpress.com/2011/10/28/publications-debian-sur-une-ligne-du-temps/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 10:12:56 +0000</pubDate>
		<dc:creator>ascendances</dc:creator>
				<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://ascendances.wordpress.com/?p=295</guid>
		<description><![CDATA[La distribution Debian est connue pour donner des codes de personnage de Toy Story aux différentes distributions publiées. Il y a aussi un numéro mais c&#8217;est tout de même moins amusant. L&#8217;idée a depuis été reprise par Ubuntu et Fedora, mais en utilisant d&#8217;autres thèmes. Android fait de même avec son API. Même Apple a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=295&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>La distribution Debian est connue pour donner des codes de personnage de <a href="http://www.allocine.fr/film/fichefilm_gen_cfilm=14264.html" title="page Allocine sur le premier Toy Story"><em>Toy Story</em></a> aux différentes distributions publiées. Il y a aussi un numéro mais c&#8217;est tout de même moins amusant. L&#8217;idée a depuis été reprise par <a href="http://fr.wikipedia.org/wiki/Liste_des_versions_d%27Ubuntu" title="page wikipedia francophone sur les versions d'Ubuntu">Ubuntu</a> et <a href="http://fedoraproject.org/wiki/History_of_Fedora_release_names" title="liste des versions de Fedora">Fedora</a>, mais en utilisant d&#8217;autres thèmes. <a href="http://source.android.com/source/build-numbers.html" title="numéros de version et noms de code pour Android">Android</a> fait de même avec son API. Même <a href="http://fr.wikipedia.org/wiki/Mac_OS_X#Versions_principales" title="page wikipedia francophone sur les versions de Mac OS X">Apple</a> a réutilisé le concept. Il est cependant probable que l&#8217;idée avait déjà été utilisée avant Debian&#8230;</p>
<h3>Vers l&#8217;infini et au-delà ! (mais quand ce sera prêt)</h3>
<p>Voici le résultat si l&#8217;on met chaque version sur une frise chronologique. Le segment jaune de la ligne de temps correspond à une période où il n&#8217;y avait pas encore de noms de code. Les noms de code pouvaient difficilement apparaître avant la sortie de <em>Toy Story</em>&#8230; Ils ont été ajoutés à partir de la première version officielle : la 1.1, surnommée Buzz.</p>
<p><a href="http://ascendances.files.wordpress.com/2011/10/timeline_debian_1993_20111.png"><img src="http://ascendances.files.wordpress.com/2011/10/timeline_debian_1993_20111.png?w=300&#038;h=153" alt="" title="Frise chronologique des distributions Debian 1993 - 2011" width="300" height="153" class="aligncenter size-medium wp-image-307" /></a></p>
<p>On voit bien le changement de rythme entre les premières années et la suite, la loooooooooooongue période de développement de Sarge et la régularité des publications suivantes.</p>
<p>La prochaine version aura pour nom de code Wheezy, un personnage qui apparaît dans le deuxième épisode de <em>Toy Story</em>. Après la période sans nom de code, puis celle des noms du premier film, peut-être est-ce le début d&#8217;une troisième période pour les noms de code de la distribution ?</p>
<h3>Sources</h3>
<p>L&#8217;image a été réalisée avec The Gimp.</p>
<p>Les personnages sont principalement tirés de fonds d&#8217;écran distribués par Pixar, retouchés pour l&#8217;occasion (trouvables, par exemple sur <a href="http://pixar.wikia.com/Category:Toy_Story_Characters" title="wiki anglophone à propos pixar">pixar.wikia.com</a>). </p>
<p>La ligne de temps est un bricolage fait avec Calc (LibreOffice) et la touche <code>Impr écran</code>.</p>
<h3>Correctifs</h3>
<p>Merci à TomThePhysicist, la honte et l&#8217;opprobre sont sur moi : je me suis trompé dans la frise comme l&#8217;atteste les commentaires. La version dans l&#8217;article prend en compte ces remarques. Je ferai pénitence en écrivant plus de 65.000 de lignes de code en {insérez ici votre langage détesté}, sans indentation et sans parenthèse.<br />
Merci aussi à Elessar, je ne retrouvais plus le terme exact en français.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ascendances.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ascendances.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ascendances.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ascendances.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ascendances.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ascendances.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ascendances.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ascendances.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ascendances.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ascendances.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ascendances.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ascendances.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ascendances.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ascendances.wordpress.com/295/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=295&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ascendances.wordpress.com/2011/10/28/publications-debian-sur-une-ligne-du-temps/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bcc6840b48d2ee3ea608e58356fa7d47?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ascendances</media:title>
		</media:content>

		<media:content url="http://ascendances.files.wordpress.com/2011/10/timeline_debian_1993_20111.png?w=300" medium="image">
			<media:title type="html">Frise chronologique des distributions Debian 1993 - 2011</media:title>
		</media:content>
	</item>
		<item>
		<title>Carte de répartition des développeurs Debian dans le monde</title>
		<link>http://ascendances.wordpress.com/2011/09/28/carte-de-repartition-des-developpeurs-debian-dans-le-monde/</link>
		<comments>http://ascendances.wordpress.com/2011/09/28/carte-de-repartition-des-developpeurs-debian-dans-le-monde/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 08:49:44 +0000</pubDate>
		<dc:creator>ascendances</dc:creator>
				<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://ascendances.wordpress.com/?p=11</guid>
		<description><![CDATA[Tout comme la répartition des éléphants de mers ou des Edelweiss, celle des informaticiens n&#8217;est pas homogène à travers le monde. Concernant les Edelweiss et les informaticiens, il semble assez évident que les pays du Nord sont plus fournis que ceux du Sud. En se restreignant aux informaticiens, la propriété reste vraie, que l&#8217;on parle [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=11&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Tout comme la répartition des éléphants de mers ou des Edelweiss, celle des informaticiens n&#8217;est pas homogène à travers le monde. Concernant les Edelweiss et les informaticiens, il semble assez évident que les pays du Nord sont plus fournis que ceux du Sud. En se restreignant aux informaticiens, la propriété reste vraie, que l&#8217;on parle de logiciel propriétaire ou de logiciels libres. Pour illustrer ce dernier cas, on peut voir une <a href="http://www.debian.org/devel/developers.loc.fr.html" title="Répartition des développeurs Debian">mappemonde des développeurs Debian</a> directement sur le site de la distribution. </p>
<p>Un développeur Debian (noté DD par la suite) est un membre du projet <a href="http://www.debian.org" title="site web de Debian">Debian</a>, ayant un droit de vote au sein du projet et ayant la possibilité d&#8217;envoyer de nouvelles versions de n&#8217;importe quel paquet. Il existe un processus de validation pour pouvoir devenir DD. L&#8217;entrée et la sortie de Debian étant relativement lente, les variations de population sont assez faibles.</p>
<p>Un <a href="http://fr.wikipedia.org/wiki/Cartogramme" title="Article sur les cartogrammes (Wikipedia francophone)">cartogramme</a> est une carte géographique, déformée selon le critère que l&#8217;on souhaite mettre en évidence, de manière à sur-représenter (ou sous-représenter) une zone dans le but de mieux visualiser les différences. C&#8217;est une anamorphose appliquée à une carte. Voici deux cartogrammes sur la répartition des DD dans le monde en Juin 2011 :</p>
<h3>Répartition en valeur absolue</h3>
<p>Le critère utilisé est le nombre de DD actifs par pays. </p>
<p><a href="http://ascendances.files.wordpress.com/2011/09/cartogramme_debian_absolu_2011_06.png"><img src="http://ascendances.files.wordpress.com/2011/09/cartogramme_debian_absolu_2011_06.png?w=300&#038;h=160" alt="" title="Répartition en valeur absolue de DD en Juin 2011" width="300" height="160" class="aligncenter size-medium wp-image-275" /></a></p>
<p>Assez logiquement, les pays industrialisés avec une forte population s&#8217;en sortent mieux. Debian est surtout développée en Europe et aux États-Unis mais cette caractéristique était déjà visible sur la carte fournie par Debian. L&#8217;Afrique disparaît complètement à l&#8217;exception de l&#8217;Afrique du Sud et de Madagascar.</p>
<h3>Répartition en valeur relative</h3>
<p>Le critère utilisé est le ratio entre le nombre de DD actifs et le nombre d&#8217;habitants dans un pays.</p>
<p><a href="http://ascendances.files.wordpress.com/2011/09/cartogramme_debian_relatif_2011_06.png"><img src="http://ascendances.files.wordpress.com/2011/09/cartogramme_debian_relatif_2011_06.png?w=300&#038;h=160" alt="" title="Répartition en valeur relative de DD en Juin 2011" width="300" height="160" class="aligncenter size-medium wp-image-275" /></a></p>
<p>Les pays peu peuplés sont mieux représentés : ceux qui était déjà visibles explosent (en particulier l&#8217;Irlande et la Nouvelle-Zélande). Les États-Unis font un assez mauvais score alors que l&#8217;Europe domine la carte. Les pays de l&#8217;Europe du Nord sont beaucoup plus visibles (Danemark, Norvège, Suède et surtout la Finlande). Cette dernière a le record en valeur relative avec 3,9 DD actifs par millions d&#8217;habitants. L&#8217;inde disparaît, écrasée par sa population.</p>
<h3>Sources</h3>
<p>Anamorphoses réalisées avec <a href="http://scapetoad.choros.ch/" title="site web de ScapeToad">ScapeToad</a>, un logiciel libre écrit en Java, puis légèrement retouchée.</p>
<p>La carte des pays vient de <a href="http://thematicmapping.org/downloads/world_borders.php" title="fichier shape">thematicmapping.org</a> (l&#8217;archive TM_WORLD_BORDERS-0.3).</p>
<p>Le <a href="http://www.perrier.eu.org/weblog/2011/06/12#devel-countries-201106-3" title="Article à propos du nombre de développeurs par pays">décompte des développeurs Debian</a> a été réalisé par Christian Perrier, infatiguable DD, en Juin 2011. Il s&#8217;est basé sur les données fournies directement par Debian. Les cartes réalisées utilisent les statistiques de développeurs considérés comme actifs.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ascendances.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ascendances.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ascendances.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ascendances.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ascendances.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ascendances.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ascendances.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ascendances.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ascendances.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ascendances.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ascendances.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ascendances.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ascendances.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ascendances.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ascendances.wordpress.com&amp;blog=24442983&amp;post=11&amp;subd=ascendances&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ascendances.wordpress.com/2011/09/28/carte-de-repartition-des-developpeurs-debian-dans-le-monde/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bcc6840b48d2ee3ea608e58356fa7d47?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ascendances</media:title>
		</media:content>

		<media:content url="http://ascendances.files.wordpress.com/2011/09/cartogramme_debian_absolu_2011_06.png?w=300" medium="image">
			<media:title type="html">Répartition en valeur absolue de DD en Juin 2011</media:title>
		</media:content>

		<media:content url="http://ascendances.files.wordpress.com/2011/09/cartogramme_debian_relatif_2011_06.png?w=300" medium="image">
			<media:title type="html">Répartition en valeur relative de DD en Juin 2011</media:title>
		</media:content>
	</item>
	</channel>
</rss>
