Présents à la réunion, approximativement en fonction de l'emplacement autour de la table
Laurent,
Kai,
Éric,
Nicolas,
Julien,
moi,
Théo,
Olivier,
Sébastien,
Xavier,
Romain,
et David (L).
Nous avons mangé des bacon-cheeseburgers, des blue-cheeseburgers, des magrets de canard,
et des spaghetti bolognaise.
Nous avons bu de la Beamish Red, de la Stout, de la Paulaner
d'autres bières, une margarita, un gin fizz et de l'eau.
Julien vient de livrer un développement à un client.
Il nous a montré le
POD
de son programme,
converti en HTML. Le client a été impressionné par la
qualité de cette documentation.
Il nous a montré également une partie de code en nous demandant
si c'était compréhensible. La partie en question
concernait la mise à jour d'un
hachage de hachages de hachages.
Ce n'est pas les trois ou quatre minutes que j'ai passées
à lire le code de Julien qui peuvent suffire à comprendre
un tel code, mettant à jour des structures de données
imbriquées. Mais je pense qu'en s'accrochant un peu, on
pourrait arriver à comprendre. Sinon, j'ai noté que Julien
utilise des noms de fonction assez longs et assez descriptifs.
En revanche, ce que je n'ai pas eu le temps de signaler en
réunion, il n'y a aucun commentaire dans le code.
Un idiome que Julien affectionne, c'est l'utilisation
des connecteurs logiques pour conditionner des
instructions. Par exemple, il écrit :
$opt{verbose} andprint"Début du programme\n";
plutôt que :
print"Début du programme\n"if$opt{verbose};
ou bien
$requete_reussieordie"Problème dans la requête\n";
plutôt que :
die"Problème dans la requête\n"unless$requete_reussie;
Moi, je préfère les if et les unless dans
le cas général où il n'y a qu'une seule instruction à conditionner.
Dans le cas beaucoup plus rare où il y a plusieurs instructions
à la suite et que chacune est conditionnée par la réussite
de l'instruction précédente, là, je suis d'accord pour
un enchaînement de and.
Kai a lu
Perl Best Practices.
Comme tout bon anglophone, il est allé voir chez
Brentanos.
Là, ils lui ont dit qu'ils n'avaient pas de rayon
informatique. Il est allé ensuite à la
FNAC
Saint-Lazare. Là, le rayon informatique
occupe deux panneaux d'étagères. L'un des panneaux
est consacré à
JavaScript
et à PHP,
l'autre à tout le reste de l'informatique.
Et Perl ? Rien. Ou plutôt, après avoir longtemps
fouillé les rayonnages, Kai a quand même réussi à
trouver un exemplaire de
Learning Perl
coincé entre deux livres. Selon moi, la clientèle
visée par la FNAC n'est pas du tout la même que celle
d'Eyrolles
ou Le Monde en Tique.
Finalement, Kai a réussi à trouver dans une autre boutique
le livre de Conway. Apparamment, il ne savait pas que
BooK, Jérôme et moi avions traduit le livre en français.
C'est vrai que depuis un certain temps, sa présence
aux réunions est très rare. Il l'a donc
acheté en anglais. Sa lecture lui a occasionné
quelques éclats de rire. Il a cité entre autres
la note de bas de page destinée à dénigrer la convention
de nommage des variables consistant à supprimer
toutes les voyelles et à conserver les consonnes,
laquelle note était rédigée en appliquant justement
ce procédé. Il a cité également les exemples de mauvaises
pratiques que Damian présente dans son livre.
Kai trouve que le titre français,
De l'art de programmer en Perl,
est très bien trouvé. Je lui précise que ce n'est
pas Philippe, Jérôme et moi qui nous en sommes occupés, c'est
O'Reilly France
qui l'a choisi.
Bien que j'aie traduit fidèlement (je l'espère) une
bonne partie de ce livre, je ne suis pas entièrement
d'accord avec Conway. Par exemple, selon l'auteur, les
substr
en partie gauche
sont de nature à effrayer
les programmeurs. Au contraire, lorsque j'ai
lu Programming Perl
deuxième édition en 1998 pour apprendre Perl,
c'est en découvrant à la page 228 que l'on pouvait
utiliser un substr en partie gauche
que j'ai compris que Perl était beaucoup plus
qu'un succédané de C et awk
et que c'était un langage de génie.
Un autre reproche que je fais à ce livre, c'est le chapitre 3
sur les conventions de nommage. Ce chapitre est
destiné uniquement aux anglophones.
Le livre a été traduit en français et,
compte tenu des
filiales
d'O'Reilly,
on peut envisager qu'il puisse être
traduit également en allemand, en russe, en
japonais et en chinois.
Mais les Italiens, les Espagnols, les Néerlandais
et autres le liront dans la version originale,
donc en anglais et ce chapitre ne leur sera
pour ainsi dire d'aucune utilité.
Le chapitre 3 contient quand même quelques exemples
qui peuvent être transcrits dans d'autres langages.
Kai donne l'exemple de la convention de nommage
des tableaux et des hachages : il faut utiliser
le pluriel pour les tableaux et le singulier pour les
hachages. Selon mes souvenirs, c'est un tout petit peu
plus compliqué dans le cas des tableaux. Conway
nous enjoint d'utiliser le pluriel lorsqu'un
tableau est utilisé de manière globale uniquement,
comme :
Le problème, c'est que les programmes commencent
en traitant les tableaux de façon globale avec des map,
des grep et des for sans utilisation d'indice,
donc les tableaux sont créés avec un nom au pluriel.
Puis on ajoute des fonctionnalités au programme et
ces fonctionnalités requièrent l'utilisation d'indices
pour accéder au tableau. Du coup, pour obéir au conseil
de Damian, il faut changer toutes les occurrences du nom
de tableau pour y enlever la marque du pluriel.
Je signale que David, notre ancien tsar, avait déjà
fait une remarque sur le choix du singulier ou du
pluriel dans les noms de tableau et qu'il avait
décidé que désormais, il n'utiliserait
que le singulier, même si toutes les utilisations du
tableau sont des utilisations en globalité.
Avec cette convention, il n'a plus de question à se poser.
[ Apparamment, cette remarque ne figure pas dans
un compte-rendu passé. J'ai dû l'omettre au moment
d'écrire ce compte-rendu. ]
En annexe à sa lecture, Kai s'est mis à utiliser le module
Perl::Critic.
C'est un module qui examine des programmes Perl
et qui rend compte des écarts par rapport aux conseils
de Perl Best Practices.
Il est possible de n'activer qu'un sous-ensemble de ces
règles. Kai, qui donne des cours de programmation en Perl,
a soumis les exemples de son cours à Perl::Critic
pour s'assurer que ces exemples sont suffisamment propres.
Xavier est peut-être un nouveau venu à nos réunions, mais
ce n'est pas un inconnu. C'est en effet l'ancien chef
d'Anthony, qui ne vient plus à nos réunions parce qu'il
a déménagé. Contrairement à Anthony qui est un employé civil
du Ministère de la Défense et qui a une formation d'informaticien,
Xavier est un officier de la Gendarmerie Nationale
et il s'est mis à l'informatique car à un moment de sa carrière,
il fallait qu'il suive une formation complémentaire, soit
dans un domaine technique, soit dans un domaine juridique.
Et il a choisi la technique.
Néanmoins, il nous a fait un exposé de ses connaissances
juridiques de base. J'ai loupé le début, j'ai juste appris
que la mise en examen, malgré la connotation négative qui
lui est attachée, est une procédure destinée à protéger
l'accusé. Dans le cadre de cette procédure, tous les actes
de l'enquête qui le concernent doivent être signalés
au juge d'instruction.
Il a été question des ORM
(objet-relational mappers),
avec
Class::DBI
et surtout
Class::DBI::Loader
pour Perl, mais aussi
Hibernate
pour Java et
Django
pour Python. Je n'ai pas suivi dans les détails,
mais il a été dit que tous les ORM fonctionnaient dans
le sens base de données -> hiérarchie d'objets.
[ Cela dit, ne peut-on pas considérer que
Tangram
est un ORM fonctionnant dans l'autre sens ?
Je reconnais toutefois que je n'ai pas écouté
la totalité de la discussion, loin de là.
]
Nicolas ne tarit pas d'éloges sur
Ruby on Rails.
C'est le framework
qui offre le meilleur
équilibre entre la simplicité d'installation
et d'apprentissage d'un côté et la puissance
et la souplesse de l'autre côté. Les logiciels
équivalents écrits en Perl sont pour certains
très lourds à installer, à cause de toutes leurs
dépendances, ou peu commodes d'utilisation.
Xavier a évoqué l'utilisation de
Sympa
par la Gendarmerie Nationale. On peut avoir
une idée de l'intérêt que porte la Gendarmerie
sur ce logiciel en comptant le nombre de
patchs proposés à l'équipe de développement
et qui ont pour origine la Gendarmerie. Xavier a évoqué
une utilisation très spécifique de Sympa :
grâce à une codification bien pensée des noms
de liste, Sympa construit dynamiquement un filtre LDAP, cherche dans
l'annuaire et construit dynamiquement une liste éphémère.
Cela fait un bon bout de temps qu'Olivier Poitrey
n'est plus venu à nos réunions. Mais Kai
a retrouvé sa trace par hasard. Il voulait
charger sur le web quelques morceaux de films
qu'il a obtenus avec son téléphone portable.
Or, le format de ces films n'est pas accepté par
YouTube.
Il a cherché un site du même genre qui
accepterait ce format et il est tombé sur
Daily Motion,
un site français qui répond à ses desiderata.
En regardant d'un peu plus près qui s'occupe
de ce site, il a trouvé le nom
d'Olivier Poitrey.
Julien nous a livré ses réflexions sur comment
traverser un mur anti-feu (firewall).
L'établissement d'un tunnel n'est qu'une partie
de la solution. En effet, si l'administrateur
du mur anti-feu est consciencieux, il analyse les
logs de son serveur et il risque
de remarquer le volume anormal de trafic avec
le site de destination du tunnel. Même si le contenu
des paquets est crypté, le volume des données échangées
est suspect. Mais si les fichiers échangés sont,
par exemple, des
RFC
dans un format par nature assez volumineux, du genre
PostScript
(je ne me souviens plus exactement quel format Julien se proposait d'utiliser),
alors le volume des échanges se justifie et cela désamorce
les suspicions de l'administrateur. Qui ne verra pas
que les commentaires PostScript dans les fichiers échangés
contiennent un texte crypté.
Ce mois-ci, c'est Kai qui a eu droit à la démo du
Nokia 770 par Laurent. Lequel Laurent a fait une
entrée remarquée, avec un logo Red Hat bien visible
sur sa sacoche et un autre tout aussi visible sur
sa polaire. Il ne lui manquait plus qu'un couvre-chef
rouge sur la tête.
Nicolas ne vante pas seulement
Ruby on Rails,
mais également le langage
Ruby.
Les fonctions de traitement de liste sont nettement
plus fournies que dans Perl.
On peut utiliser des opérateurs ensemblistes, notamment le signe
moins pour faire la différence de deux listes : tous les éléments
qui appartiennent à la première liste mais pas à la seconde.
Ou alors, un
grep
renvoyant deux listes, celle des éléments qui vérifient la
condition et celle des éléments qui ne la vérifient pas.
[ Cela dit, List::MoreUtils
contient la fonction part
pour effectuer une partition. Si le test est écrit de façon que la valeur
« vrai » soit toujours la valeur 1, alors on obtient le même
résultat qu'avec la fonction Ruby citée par Nicolas.
Et d'autre part, il existe des modules permettant de
faire des opérations ensemblistes, tels que
Set::Object
et Set::Scalar
avec un overload pour les opérateurs ensemblistes dans les deux modules.
]
Julien a évoqué la classification
COCOMO
des langages de programmation. En tête de peloton, nous
avons Perl,
Python
et Ruby
ex-aequo avec une note de 5, tandis que les
langages du genre
Java,
C++
ou C#
pataugent entre 1 et 1,5.
Xavier a donné l'historique du projet ICARE (il n'a pas donné
la signification du I, j'ai oublié celle du C mais le reste
signifie « Aide à la Rédaction des Écrits »).
L'un des avantages de ce système est que la rédaction de deux
documents de synthèse à la fin d'une affaire est facilitée.
En effet, lors de la rédaction de chacun des procès-verbaux antérieurs,
les utilisateurs repèrent les informations cruciales qui permettront
de rédiger ces notes de synthèse et au moment venu, la recherche
s'effectue automatiquement, sans que la personne ait besoin
de fouiller dans la liasse des documents existants (laquelle liasse,
pour certaines affaires très longues, peut représenter le volume
d'un camion de déménagement). Dans la première version,
il s'agissait d'une application de saisie de données qui
fait appel à
OpenOffice.org
pour compléter la rédaction d'un document et le mettre en forme.
Avec la version 2, l'ergonomie change en profondeur.
Le rédacteur est sous OpenOffice.org et il dispose
de barres d'outils spécifiques qui lui permettent
d'effectuer les tâches spécifiques, comme l'insertion des éléments de
procédure pénale.
Les administrateurs tels que Nicolas ont évoqué le stockage
réseau des données. J'ai failli ne pas en dire plus, n'ayant pas retenu
les détails. Heureusement, Jérôme (qui n'était pas là lors
de la réunion) a donné quelques explications sur la
liste un peu plus tard. Voici donc ce qu'a écrit Jérôme. Il a été donc question de
baies NAS (Network Attached Storage). En gros, un serveur de fichiers
sur un réseau de données (genre IP avec NFS/CIFS/NWFS).
À ne pas confondre avec SAN (Storage Area Network), qui présente des
volumes bloc sur un réseau de stockage (SCSI sur FC, iSCSI), sur
lesquels les machines qui y sont attachées créeront des filesystems.
Si on veut compliquer, on peut noter que certaines baies NAS sont
capables d'exporter des fichiers, qui seront vus comme un volume bloc,
via iSCSI. Et qu'un serveur NFS Linux connecté à un SAN devient une tête NAS.
Les mêmes ont évoqué les sauvegardes et restaurations de bases de
données. La sauvegarde s'effectue en exécutant un programme
nommé, par exemple, oradump et en redirigeant la sortie
vers un fichier sur le volume de sauvegarde, avec éventuellement
un compacteur tel que gzip ou bzip2
entre les deux. Quelqu'un a raconté qu'une personne
de chez
Oracle
avait vu fonctionner une sauvegarde sous
PostGreSQL,
via un programme appelé pgdump.
Le gars d'Oracle avait été sidéré en voyant ce que
pgdump sortait : une suite d'ordres
SQL permettant de remplir les tables de la base
de données.
Julien a évoqué les cinq plaies de l'informatique.
La première plaie concerne
l'encodage
des données alphabétiques, avec la cohabitation entre
les différents ISO-8859-n
et UTF-8.
La deuxième plaie est le stockage
et la manipulation des
dates.
Il a juste eu le temps de dire que la troisième plaie était
l'
ouverture des fichiers,
avec les multiples options pour
open
et les interactions entre ces options. Mais la discussion
a dérivé avant qu'il puisse nous présenter la quatrième
et la cinquième plaies.
Si Julien a mis en première place l'encodage des données alphabétiques,
c'est parce qu'il vient de travailler sur le traitement de fichiers
logs produit par un logiciel un peu particulier.
Ce logiciel change implicitement d'encodage en fonction de l'origine
des messages à ajouter au journal. Si le message d'erreur concerne
des données d'origine thaïlandaise, l'entrée du fichier journal
utilisera l'encodage conventionnel de la langue thaïe. Tandis que
l'entrée suivante utilisera, en toute vraisemblance, un tout autre
encodage. Une autre remarque sur ce logiciel : Julien a cru
reconnaître les différents formats utilisés dans les fichiers logs
en sortie. Il s'agit des formats pour lesquels il existe déjà
un logiciel libre. D'où une supposition sur la génèse de ce
logiciel...
Il a été question des différentes têtes d'affiche du logiciel libre et
de leurs divergences dogmatiques. D'ailleurs, Julien a fait mine de
croire que le Théo qui assistait à notre réunion, notre Théo, n'était
autre que
Theo de Raadt.
Les divergences concernent entre autres la différence entre « logiciel
libre » et « logiciel open source ».
J'en était resté à un document que j'avais lu en 1998 sur le
site d'ESR,
où il expliquait que les
costards-cravates
se méfieraient des
termes « logiciel libre », mais que les termes
open source leur conviendraient mieux, alors
qu'il s'agissait exactement du même concept. Apparamment,
ce n'est plus le même concept.
Julien rappelle qu'un programme est véritablement au point lorsqu'on
a enlevé tout ce que l'on peut enlever : code mort,
factorisation du code dupliqué, etc. C'est la même chose
avec les licences de logiciel libre. La
licence OpenBSD
est au point, elle est réduite à deux clauses.
[ Enfin, pas tout-à-fait, lisez en détail le texte vers lequel
pointe le lien : il s'agit du texte de copyright, pas de la
licence et ce texte apparaît assez souvent avec trois clauses quand
même. ]
Il a été question de l'installation de certains gros logiciels,
genre gestionnaire de base de données (nous ne citerons pas de nom)
avec notamment création d'un compte utilisateur pour faire
tourner le démon associé. Devinez quel est le code utilisateur...
Oui, c'est le nom du logiciel. Plus fort, quel est le mot de passe
de ce compte utilisateur ? Bravo, vous avez deviné, c'est également le
nom du logiciel.
Julien évoque l'appel à l'aide qu'il a passé sur la liste le mois
précédent. Il demandait comment faire pour convertir un exécutable
Windows en service Windows. Et aucune des réponses ne lui a apporté
la marche à suivre. Peut-être aurait-il dû, comme je le faire remarquer,
poser sa question sur une liste Windows.
L'un des participants, dont le nom sera passé sous silence pour lui éviter
des visites nocturnes inopinées, stocke de l'argent non
pas dans un bas de laine sous une pile de draps, mais entre
les pages des livres de sa bibliothèque. Mais lorsqu'il donne
un exemple, ses interlocuteurs lui font remarquer qu'un livre
de Chomsky qui n'accumule pas la poussière, c'est louche.
À un moment, Julien a sorti une citation qu'il a attribuée
à Napoléon. Je ne me souviens plus des termes exacts, mais
l'idée était la suivante :
N'attribuez pas à la méchanceté ce qui peut s'expliquer
par la stupidité.
Je fais remarquer que je connaissais cette maxime sous le
nom de
« Rasoir de Hanlon ».
Tout le monde a
pensé à une autre maxime, bien plus connue, dénommée
« Rasoir de Occam », mais ce n'est pas du tout
la même maxime. Pour ceux qui l'ignoreraient encore,
cette maxime s'exprime parfois sous la forme :
Entre deux explications, choisissez la plus simple.
soit sous la forme :
Ne supposez pas l'existence de plus de causes pour un phénomène qu'il n'est
absolument nécessaire pour expliquer ce phénomène.
Cela dit, lors de la rédaction du présent compte-rendu,
j'ai feuilleté
l'Almanach du Premier Empire
par Jean Massin, édité par l'Encyclopaedia Universalis
et j'y ai trouvé la citation suivante :
27 JANVIER 1806 Napoléon réunit un conseil extraordinaire sur la
situation financière. Barbé-Marbois lui offre sa tête ; Napoléon
réplique: « Ta tête, que veux-tu que j'en fasse, grosse bête ! » Et il
continue, comme l'autre proteste qu'il n'est pas un voleur : « Je le
préférerais cent fois ; la friponnerie a des bornes ; la bêtise n'en a
point ».
Peut-être est-ce cette citation qui, après avoir subi
quelques déformations, est arrivée aux oreilles de Julien.
Quant au
rasoir de Hanlon,
j'ai longtemps cherché dans ma
bibliothèque et j'ai fini par trouver dans
If it ain't broke...
de Hugh Rawson, éditions Penguin. Le
rasoir de Hanlon
y est cité en tant que variante du Rasoir (encore un) de
Ulmann :
Lorsque la stupidité est une explication suffisante, il n'y a pas
besoin d'une autre explication.
Puis je l'ai trouvé également dans le
Jargon File.
Julien a apporté deux romans qu'il est en train de lire.
Comme tout bon geek qui se respecte, Julien lit de la
science-fiction ou de la fantasy.
L'un de ces deux romans fait partie d'un cycle.
Curieusement, les personnages principaux se font
presque tous trucider à la moitié du premier volume
de la série. Et parmi les personnages qui se retrouvent
au premier plan à ce moment-là, une bonne partie se
font également occire dans le deuxième ou le troisième
roman.
Quelqu'un a évoqué le nom de Bernard Werber,
mais d'autres ont dit que ce n'était pas de la science-fiction,
ou bien que lorsqu'il écrivait de la science-fiction,
ce n'était pas original. En effet, les bonnes idées qui
apparaissent dans les romans de Werber
se trouvaient déjà chez Frank Herbert
ou chez Zelazny.
J'ai entendu des bribes d'une discussion qui faisait référence
à un DVD que j'ai regardé le mois précédent. Que faire
si l'on vous demande votre avis sur un sujet que vous ne
connaissez pas, voire si l'on vous pose une question que
vous ne comprenez pas ? La botte secrète, c'est de
répondre : « C'est pas faux. » Et
là, vous ne pouvez pas vous tromper. Sauf que
cette situation a été mise en scène dans
Kaamelott
et qu'elle a inévitablement conduit à des
quiproquos et à des méprises. Pour ceux qui
n'ont pas de DVD mais qui ont la télévision,
Kaamelot, c'est tous les soirs sur M6,
aux environs de 20h40 et cela dure à peine
cinq minutes.