Skip to content

DebConf sur la planète

Cette année, la conférence Debian annuelle aura lieu à Portland, aux États-Unis. Comme l’année dernière, j’y participerai. :)

Participation à la conférence Debian

Cette conférence sera la quinzième du nom. Voici une carte des différentes DebConf (passées en rouge, la prochaine en blanc et celle de l’année prochaine en jaune).

debconf14_planet

Jusqu’ici les conférences ont eu lieu alternativement en Europe et en Amérique (du Nord, centrale ou du Sud). Ce sera aussi le cas en 2015 puisque la conférence aura lieu en Allemagne à Heidelberg.

Réalisation de la carte

La carte diffère légèrement de celle réalisée l’année dernière (pour DebConf13) grâce quelques changements de configuration d’xplanet.

Commande utilisée

xplanet -transpng debconf14_planet.png -geometry 1024x512 -projection peters -config debconf14_planet.conf -num_times 1

Deux paramètres ont été modifiés :

  • La carte utilise une projection de Peters plutôt qu’une projection de Mercator. Pour cela, il suffit de remplacer -projection mercator par -projection peters.
  • Avec cette projection, la taille de la Terre n’est pas la même et la zone vide est rempli par défaut par un ciel étoilé. Il est aussi possible de choisir une couleur unie ou sa propre image de fond. Remplacer le paramètre -output par -transpng pour définir le fichier de sortie permet d’avoir un fond transparent.

Fichier debconf14_planet.conf

[earth]
shade=100
marker_file=coords.txt
marker_fontsize=15
map=night.jpg

L’ajout de map permet de définir l’image à utiliser à la place de l’image par défaut. Ici, on obtient une image de la Terre de nuit (qui provient de /usr/share/xplanet/images/night.jpg).

Fichier coords.txt

+44.80 +0.58 "0&1" #Bordeaux, France
+43.65 -79.38 "2" #Toronto, Canada
+59.92 +10.75 "3" #Oslo, Norway
-29.99 -51.22 "4" #Porto Alegre, Brazil
+60.22 +24.66 "5" #Espoo, Finland
+18.91 -98.97 "6" #Oaxtepec, Mexico
+55.96 -3.19 "7" #Edinburgh, Scotland
-37.96 -57.59 "8" #Mar del Plata, Argentina
+39.60 -6.08 "9" #Extremadura, Spain
+40.74 -74.00 "10" #New York City, USA
+44.78 +17.21 "11" #Banja Luka, Republika Srpska, Bosnia and Herzegovina
+12.14 -86.25 "12" #Managua, Nicaragua
+46.87 +6.75 "13" #Le Camp, Vaumarcus, Switzerland
+45.53 -122.67 "14" color=white #Portland, Oregon, USA
+49.24 +8.42 "15" color=yellow #Heidelberg, Germany

Le fichier a simplement été mis à jour (ajout d’Heidelberg, décalage des couleurs).

À bientôt !

Créer un motif pour cowsay

Cowsay est un de ces outils en ligne de commande prouvant que le génie humain est sans limite. Indispensable lors des grandes étapes d’une vie (déclaration d’amour, divorce, post sur IRC, etc.), il est nécessaire de maîtriser cet outil crucial au point de ne faire qu’un avec lui. À la limite 1,2 si vous n’êtes pas ambitieux.

Installation et utilisation

Cowsay est écrit en Perl et est disponible dans toutes les distributions sérieuses :

apt-get install cowsay  #sous Debian et dérivées

Le paquet fournit `cowsay` et `cowthink`. Une démo valant mille mots, voici deux démos pour deux fois plus d’économies :

$ cowsay "Bonjour lecteur"
 _________________
< Bonjour lecteur >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
$ cowthink "Ça c'est fait"
 _______________
( Ça c'est fait )
 ---------------
        o   ^__^
         o  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Il est possible de changer les yeux, et de faire apparaître la langue avec des paramètres facultatifs. Par exemple :

$ cowsay -t "Malaaaade, je suis malaaade"
 _____________________________
< Malaaaade, je suis malaaade >
 -----------------------------
        \   ^__^
         \  (--)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
$ cowsay -d "Malaaaade, j'étais trop malaaade"
 __________________________________
< Malaaaade, j'étais trop malaaade >
 ----------------------------------
        \   ^__^
         \  (xx)\_______
            (__)\       )\/\
             U  ||----w |
                ||     ||

Il est aussi possible de changer la vache par un autre dessin. Plus de 50 motifs sont disponibles dans /usr/share/cowsay/cows/. Cependant, nous ne sommes pas limités à ces motifs car nous pouvons fournir notre propre motif :

$ cowsay -f ./rabbit.cow "Je n'ai pas la myxomatose..."
 ______________________________
< Je n'ai pas la myxomatose... >
 ------------------------------
    \    /|
     \  | |   ____
      \ \ |--/ ___\
       \ ) oo (   `
       =(>(\/)<)=_ --._
         (       /     \_
          \    ,(      / )
          | | / _\   ,'-'
         (_(_/ (______)

Voyons comment réaliser un tel prodige !

Créer son propre motif

Le plus simple est de commencer par une version en ascii satisfaisante. Si on veut avoir la possibilité de modifier les yeux, les deux caractères les représentant doivent être l’un à côté de l’autre. Pour le lapin, on commence avec :

$ cat lapin.txt 
         /|
        | |   ____
        \ |--/ ___\
         ) oo (   `
       =(>(\/)<)=_ --._
         (       /     \_
          \    ,(      / )
          | | / _\   ,'-'
         (_(_/ (______)

Pour en faire un fichier utilisable par `cowsay`, le nouveau fichier devra finir par ".cow" et être du code Perl valide.
Ainsi les caractères « \ » et « @ » doivent être protégé par un premier « \ ». L’emplacement (facultatif) de la langue est marqué par $tongue, celui des yeux par $eyes. Les variables $thoughts seront remplacées automatiquement pour relier le motif (ici le lapin) à la bulle contenant le texte.

La variable $the_cow sera définie avec ce motif.

Au final, on obtient :

$the_cow = <<EOC;
    $thoughts    /|
     $thoughts  | |   ____
      $thoughts \\ |--/ ___\\
       $thoughts ) $eyes (   `
       =(>(\\/)<)=_ --._
         (  $tongue   /     \\_
          \\    ,(      / )
          | | / _\\   ,'-'
         (_(_/ (______)
EOC

Évidemment, le résultat est beaucoup moins lisible mais comme c’est du Perl, les traditions sont respectées.

Le résultat en action :

$ cowsay -d -f ./rabbit.cow "Caramba, encore raté"
 ______________________
< Caramba, encore raté >
 ----------------------
    \    /|
     \  | |   ____
      \ \ |--/ ___\
       \ ) xx (   `
       =(>(\/)<)=_ --._
         (  U    /     \_
          \    ,(      / )
          | | / _\   ,'-'
         (_(_/ (______)

Code source et références

Télécharger rabbit.cow

Pour connaître les possibilités non couvertes par l’article, lisez la page de manuel de `cowsay`. C’est la même page qui sert de manuel pour `cowthink`.

La version utilisée pour cet article est la 3.0.3.

La page historique sur `cowsay` par son créateur : https://web.archive.org/web/20120225123719/http://www.nog.net/~tony/warez/cowsay.shtml

Naviguer entre répertoires avec popd, pushd et cd

Parfois, il est nécessaire de naviguer entre plusieurs répertoires dont le chemin est long. Certes, les interpréteurs complètent les chemins, ce qui rend les manipulations moins douloureuses. Certes, cd - rend bien service lorsque l’on souhaite simplement revenir dans le répertoire précédent. Cependant, des shells comme Bash ou zsh possèdent une pile dans laquelle il est possible d’enregistrer des chemins pour les réutiliser par la suite. Utiliser cette pile est parfois une solution bien plus pratique.

Les commandes popd et push ne sont pas disponibles dans tous les interprètes de commandes. Par exemple, sh ne les a pas.

Quatres commandes sont nécessaires :

  • popd, pour empiler les répertoires ;
  • pushd, pour dépiler les répertoires ;
  • dirs, pour voir la pile ;
  • cd, pour se déplacer entre les répertoires. Oui, la commande que tout le monde connaît. :-)

Première visite

Empiler un répertoire

Partons d’une pile vide :

chaperonrouge@conte:/$ cd /maison
chaperonrouge@conte:/maison$ dirs -v
0 /maison

dirs affiche uniquement le répertoire actuel (donc /maison, à l’index 0), et rien d’autre car la pile ne possède qu’un seul élément. L’option -v permet d’afficher l’index.

déplacement dans un répertoire

Par défaut, pushd prend un répertoire en paramètre. Il empile ce répertoire, qui est donc à l’index 0. L’ancien répertoire à l’index 0 est décalé à l’index 1. Le nouveau répertoire de travail est donc celui qui est en 0. Enfin, pushd affiche l’état de la nouvelle pile.

Par exemple, en utilisant deux fois la commande pushd sur des répertoires différents :

chaperonrouge@conte:/maison$ pushd /chez/mere/grand
/chez/mere/grand /maison
chaperonrouge@conte:/chez/mere/grand$ dirs -v
0 /chez/mere/grand
1 /maison
chaperonrouge@conte:/chez/mere/grand$ pushd /dans/la/foret
/dans/la/foret /chez/mere/grand /maison
chaperonrouge@conte:/dans/la/foret$ dirs -v
0 /dans/la/foret
1 /chez/mere/grand
2 /maison

Pushd, comportement par défaut

Changer de répertoire

Pour se déplacer vers un répertoire enregistré dans la pile, il suffit de préfixer l’index par le caractère tilde (~). La pile reste inchangée.

Par exemple, chaperonrouge veut aller dans le répertoire /chez/mere/grand qui est actuellement à l’index 1 de la pile :

chaperonrouge@conte:/maison$ dirs -v
0 /dans/la/foret
1 /chez/mere/grand
2 /maison
chaperonrouge@conte:/$ cd ~1
chaperonrouge@conte:/chez/mere/grand$

Déplacement dans un répertoire enregistré dans la pile

Supprimer un répertoire

popd supprime un répertoire de la pile puis affiche le nouvel état de la pile.
Par défaut, popd supprime le premier répertoire de la pile et se déplace vers le répertoire qui est passé à l’index 0.

Par exemple, chaperonrouge décide de faire le ménage :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /en/chemin
2 /dans/la/foret
3 /chez/mere/grand
chaperonrouge@conte:/maison$ popd
/en/chemin /dans/la/foret /chez/mere/grand
chaperonrouge@conte:/en/chemin$ dirs -v
0 /en/chemin
1 /dans/la/foret
2 /chez/mere/grand

Popd, comportement par défaut

Il est aussi possible de supprimer un élément quelconque de la pile en précisant l’index de l’élément à supprimer. Dans ce cas, popd ne change pas le répertoire actuellement utilisé (le chemin enregistré à l’index 0 n’a pas changé).

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
3 /dans/le/ventre/du/loup
chaperonrouge@conte:/maison$ popd +2
/maison /dans/la/foret /dans/le/ventre/du/loup
chaperonrouge@conte:/maison$

Popd (sélection d'un répertoire particulier)

Autres possiblités

L’option -n de pushd permet d’empiler le répertoire passé en paramètre sans se déplacer :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
chaperonrouge@conte:/maison$ pushd -n /porte/du/village
0 /maison
1 /porte/du/village
1 /dans/la/foret
2 /chez/mere/grand
/maison /porte/du/village /dans/la/foret /chez/mere/grand
chaperonrouge@conte:/maison$

Pushd, sans déplacement

Mettre le répertoire de travail dans la pile :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
chaperonrouge@conte:/maison$ pushd .
/maison /maison /dans/la/foret /chez/mere/grand
chaperonrouge@conte:/maison$

Pushd, empilement du répertoire actuel

L’option -c de dirs vide la pile des répertoires enregistrés :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
chaperonrouge@conte:/maison$ dirs -c
chaperonrouge@conte:/maison$ dirs -v
0 /maison

Vider la pile

Il est possible de compter l’index de la pile en partant de la fin (-0 pour le dernier, -1 pour l’avant dernier, etc.). Le comportement est équivalent aux index de liste en Python (et probablement dans beaucoup d’autres langages).

Voici un exemple pour aller dans le dernier répertoire de la pile :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
chaperonrouge@conte:/maison$ cd ~-0
chaperonrouge@conte:/chez/mere/grand$

Déplacement dans un répertoire de la pile, comptage par la fin

Les options de ces commandes sont évidemment non exhaustives.

Logiciels utilisés et codes source des schémas

Pour avoir la documentation des commandes, il faut utiliser « man bash » et non « man pushd ».

Le comportement des outils est basé sur Bash, version 4.2.45(1)-release.

Les schémas ont été réalisés avec ditaa, version 0.9. La version utilisée provient du paquet Debian du même nom.
La commande de base à utiliser est :

$ ditaa pushdpopd_exemple1.txt pushdpopd_exemple1.png

Voici le code source des schémas inclus dans l’article :
pushdpopd_exemple1 :

/-------------------\       +-------------+          /-------------------\
| 0 /               |-------: cd /maison  |--------->| 0 /maison         |
\-------------------/       +-------------+          \-------------------/
/-------------------\                                /-------------------\
| cYEL(vide)        |                                | cYEL(vide)        |
\-------------------/                                \-------------------/

pushdpopd_exemple2 :

/-------------------------\      +---------------------------+       /-------------------------\
| 0 /maison               |------: pushd /chez/mere/grand    |------>| 0 /chez/mere/grand      |--+
\-------------------------/      +---------------------------+       \-------------------------/  |
/-------------------------\                                          /-------------------------\  |
| cYEL(vide)              |                                          | cYEL1 /maison           |  |
\-------------------------/                                          \-------------------------/  |
                                                                                                  |
/-------------------------\      +---------------------------+                                    |
| 0 /dans/la/foret        |<-----: pushd /dans/la/foret      |------------------------------------+
\-------------------------/      +---------------------------+
/-------------------------\
| cYEL1 /chez/mere/grand  |
+-------------------------+
| cYEL2 /maison           |
\-------------------------/

pushdpopd_exemple3 :

/-------------------------\       +-------------------------+            /-------------------------\
| 0 /dans/la/foret        |-------: cd ~1                   |----------->| 0 /chez/mere/grand      |
\-------------------------/       +-------------------------+            \-------------------------/
/-------------------------\                                              /-------------------------\
| cYEL1 /chez/mere/grand  |                                              | cYEL1 /chez/mere/grand  |
+-------------------------+                                              +-------------------------+
| cYEL2 /maison           |                                              | cYEL2 /maison           |
\-------------------------/                                              \-------------------------/

pushdpopd_exemple4 :

/-------------------------\       +-------------------------+            /-------------------------\
| 0 /maison               |-------: popd                    |----------->| 0 /en/chemin            |
\-------------------------/       +-------------------------+            \-------------------------/
/-------------------------\                                              /-------------------------\
| cYEL1 /en/chemin        |                                              | cYEL1 /dans/la/foret    |
+-------------------------+                                              +-------------------------+
| cYEL2 /dans/la/foret    |                                              | cYEL2 /chez/mere/grand  |
+-------------------------+                                              \-------------------------/
| cYEL3 /chez/mere/grand  |
\-------------------------/

pushdpopd_exemple5 :

/-------------------------------\       +-----------------------+        /-------------------------------\
| 0 /maison                     |-------: popd  +2              |------->| 0 /maison                     |
\-------------------------------/       +-----------------------+        \-------------------------------/
/-------------------------------\                                        /-------------------------------\
| cYEL1 /dans/la/foret          |                                        | cYEL1 /dans/la/foret          |
+-------------------------------+                                        +-------------------------------+
| cYEL2 /chez/mere/grand        |                                        | cYEL2 /dans/le/ventre/du/loup |
+-------------------------------+                                        \-------------------------------/
| cYEL3 /dans/le/ventre/du/loup |
\-------------------------------/

pushdpopd_exemple6 :

/-------------------------\       +----------------------------+         /-------------------------------\
| 0 /maison               |-------: pushd -n /porte/du/village |-------->| 0 /maison                     |
\-------------------------/       +----------------------------+         \-------------------------------/
/-------------------------\                                              /-------------------------------\
| cYEL1  /dans/la/foret   |                                              | cYEL1 /porte/du/village       |
+-------------------------+                                              +-------------------------------+
| cYEL2 /chez/mere/grand  |                                              | cYEL2 /dans/la/foret          |
\-------------------------/                                              +-------------------------------+
                                                                         | cYEL3 /chez/mere/grand        |
                                                                         \-------------------------------/

pushdpopd_exemple7 :

/-------------------------\       +----------------------------+         /-------------------------------\
| 0 /maison               |-------: pushd .                    |-------->| 0 /maison                     |
\-------------------------/       +----------------------------+         \-------------------------------/
/-------------------------\                                              /-------------------------------\
| cYEL1  /dans/la/foret   |                                              | cYEL1 /maison                 |
+-------------------------+                                              +-------------------------------+
| cYEL2 /chez/mere/grand  |                                              | cYEL2 /dans/la/foret          |
\-------------------------/                                              +-------------------------------+
                                                                         | cYEL3 /chez/mere/grand        |
                                                                         \-------------------------------/

pushdpopd_exemple8 :

/-------------------------\       +----------------------------+         /-------------------------------\
| 0 /maison               |-------: dirs -c                    |-------->| 0 /maison                     |
\-------------------------/       +----------------------------+         \-------------------------------/
/-------------------------\                                              /-------------------------------\
| cYEL1  /dans/la/foret   |                                              | cYEL (vide)                   |
+-------------------------+                                              \-------------------------------/
| cYEL2 /chez/mere/grand  |
\-------------------------/

pushdpopd_exemple9 :

/---------------------------\       +----------------------------+         /-------------------------------\
| 0 /maison              -2 |-------: cd ~-0                     |-------->| 0 /chez/mere/grand            |
\---------------------------/       +----------------------------+         \-------------------------------/
/---------------------------\                                              /-------------------------------\
| cYEL1  /dans/la/foret  -1 |                                              | cYEL1 /dans/la/foret          |
+---------------------------+                                              +-------------------------------+
| cYEL2 /chez/mere/grand -0 |                                              | cYEL2 /chez/mere/grand        |
\---------------------------/                                              \-------------------------------/

Attaquer n’importe quel serveur comme dans les films

Lorsqu’un film représente une personne attaquant un système informatique, on nous montre parfois quelqu’un tapant frénétiquement sur un clavier des commandes plus ou moins crédibles.

Si seulement il existait une commande shell pour faire n’importe quelle attaque, donc adaptée à n’importe quel scénario…
Par exemple :
$ attack --rf extraterrestres #Independance day
$ attack le_grand_mechant_caricatural #la liste ne rentrera jamais sur 80 colonnes

Malheureusement, on obtient un résultat de ce genre :
$ attack nsa
bash: attack : commande introuvable

Sur Ubuntu, un message d’erreur signalera que la commande est disponible une fois le paquet adéquat installé. Sur Debian, il faut installer le paquet command-not-found et mettre à jour pour avoir les suggestions. Sur une autre distribution, j’imagine que c’est aussi disponible mais j’ignore la procédure.
# aptitude install command-not-found
# update-command-not-found

Et là pouf, on progresse :
$ attack nsa
The program 'attack' is currently not installed. To run 'attack' please ask your administrator to install the package 'ladr4-apps'
attack: command not found

Le paquet ladr4-apps semble donc la solution magique, sauf qu’elle ne l’est pas. C’est un ensemble d’outils et de bibliothèques pour construire des preuves.

LADR (Library for Automated Deduction Research) is a library for
use in constructing theorem provers. Among other useful routines it
provides facilities for applying inference rules such as resolution
and paramodulation to clauses. LADR is used by the prover9 theorem
prover, and by the mace4 countermodel generator.

…Encore raté ! Il faudra encore continuer à copier/coller du code pour illustrer les aventures du héros. ;-)

Évolution comparée du nombre de bogues entre distribution Linux

Il est difficile de connaitre la vitalité d’une distribution Linux. Il est possible de s’en faire une idée en fonction du nombre de posts sur des forums, de recherche sur un moteur de recherche, du nombre de téléchargement ou la visibilité sur Distrowatch, etc. Regarder le nombre de bogues en est une autre. Après tout, on ne signale des bogues que sur les distributions (et les logiciels) que l’on utilise… C’est celle qu’utilise bubulle.

Le but de l’article est de visualiser l’évolution du nombre de bogues entre Arch Linux, Debian, Ubuntu et RedHat. Puis de poser des pistes sur les causes possibles. À la fin de l’article, des liens vers les scripts de récupération des données (en python, à l’aide des bibliothèques requests et beautifulSoup) et les représentations graphiques (en python, avec la bibliothèque matplotlib) sont fournis.

Résultats obtenus

En bogues cumulés

Bogues cumulés

ArchLinux a un score extrêmement faible (moins de 40.000 bogues) comparé aux autres distributions.
Je connais mal ArchLinux donc je resterai au stade des hypothèses :

  • Je n’ai pas regardé le bon bug tracker. J’ai utilisé les données fournies sur bugs.archlinux.org.
  • Arch aurait un mode de travail différent des 3 autres distributions (par exemple si les problèmes sont signalés directement au responsable du paquet).
  • Arch n’aurait quasiment pas de bogue. Mon expérience personnelle de cette distribution me fait exclure cette hypothèse.
  • Arch aurait finalement peu d’utilisateurs.

Lors de la deuxième moitié 2007, Redhat a une augmentation durable dont j’ignore l’origine. La sortie de RHEL 5 ne me semble pas être une explication très convaincante.

Ubuntu, dernière distribution créée, dépasse toute les autres en 2010. La croissance reste rapide au fil du temps.

Sur le long terme, la croissance de Debian est globalement la même. La croissance des rapports de bogues est plus faible pour Debian qu’Ubuntu. Quelques hypothèses, non exclusives entre elles :

  • Moins d’utilisateurs pour Debian qu’Ubuntu. Ubuntu ayant été créée après, elle aurait dépassée Debian au début 2007 (en supposant un nombre de rapports envoyés par utilisateur égal entre les deux distributions).
  • L’interface web d’Ubuntu faciliterait plus le signalement de bogues que l’utilisation d’e-mails pour communiquer avec le BTS utilisé par Debian
  • On m’a signalé que reportbug, l’outil de signalement de bogues de Debian, aurait lui-même eu des problèmes pendant un moment. Cependant je ne pense pas que ce soit une cause significative sur une période longue.
  • Il y aurait plus d’envois automatiques lors de plantage chez Ubuntu que chez Debian (par exemple lorsque les paquets n’arrivent pas à être reconstruit – FTBFS).

Variations de la croissance du nombre de bogues

Variations au fil du temps

On constate un ralentissement de l’augmentation ces dernières dernières années pour Ubuntu (depuis 2010) et Debian (depuis 2006-2007) et une accélération pour RedHat, au point de rattraper celle de la phase base d’Ubuntu. En effet, la croissance pour Ubuntu subit des cycles en fonctions des publications tous les 6 mois.

C’est le même phénomène que celui de Debian lors de la préparation d’une nouvelle version stable. Phénomène peu visible sur le graphique ci-dessus, il faut regarder un graphique limité aux bogues de Debian.
Concernant Debian, la mesure de l’usage faite avec PopCon montre une augmentation ; il serait intéressant de voir si l’usage ralentit parallèlement à celle des rapports de bogues.

Si la mesure en nombre de bogues est pertinente, la distribution qui monte est RedHat plutôt qu’Ubuntu ou Arch.

Limites de l’approche

L’estimation du nombre de bogues est basé sur les identifiant des bogues donc les résultats peuvent être approximatifs.

Quelques données semblaient aberrantes, elles ont été supprimées des résultats. Les voici :

distrb id_bug AAAA MM JJ
redhat 100213 2002 05 06
redhat 780001 2010 09 29
redhat 900001 2012 03 08
ubuntu 80001 2005 07 25

La comparaison des valeurs absolues entre distribution n’a pas forcément de sens car on ne mesure pas les mêmes choses. C’est d’autant plus vrai que les distributions sont éloignées. Les variations et l’évolution de la variation semble plus pertinente même si elles sont à prendre avec précaution vu les erreurs de mesure…

Méthode de récolte des données et traitement

La récolte des données a été faite avec un script python qui télécharge des pages sur les interfaces web des rapports de bogues (merci requests !) puis cherche la date de création de l’alerte (merci BeautifulSoup !).

Le script est téléchargeable : dl_stats.py.
La bibliothèque requests permet de simplifier la récupération du code html. Lorsqu’il y a une redirection, la bibiothèque suit le lien automatiquement pour obtenir le contenu. Par exemple, pour Ubuntu, l’adresse https://bugs.launchpad.net/bugs/308191 redirige automatiquement vers https://bugs.launchpad.net/ubuntu/+source/xf86-input-multitouch/+bug/308191. Il suffit donc de faire :

r = requests.get("https://bugs.launchpad.net/bugs/308191")

Les statistiques sont écrites sur la sortie standard et doivent être copiées dans des fichiers .txt, un par distribution. Les fichiers seront lus par le script de traçage des graphiques. Ce script utilise matplotlib et est disponible à http://stephane.yaal.fr/evolution-rapports-de-bogues/draw_stats.py. Les fichiers de statistiques utilisés sont disponibles dans le même répertoire (http://stephane.yaal.fr/evolution-rapports-de-bogues/).

Inspirations

La création des graphique est basée sur l’exemple de l’évolution du prix de l’essence disponible sur geophysique.be (évolution du prix de l’essence).

La documentation de matplolib pour personnaliser ces graphiques : pyplot.plot

Merci à Christian Perrier (bubulle) pour cette façon originale d’estimer la vitalité d’une distribution.

Merci aussi à Nirgal, Joey Hess et tout ceux avec qui j’en ai parlé à la DebConf 13 pour leurs réflexions.