- Philippe essaye d'utiliser qq, en choisissant comme séparateur
le dollar. Du coup, quel que soit le nombre de backslashs que Philippe insère
devant le dollar, impossible d'insérer un dollar dans la chaîne.
L'interpréteur choisit toujours d'interpoler une variable $a ou
$bb dans la chaîne obtenue, quand il ne plante pas.
Samuel propose d'utiliser pour ce faire l'une des variables
magiques, en l'occurrence $\, en utilisant bien sûr un
local $\. Philippe est réticent, et la réplique
de Samuel nous a sidéré, compte tenu de ce que nous savons de
Samuel : "je te propose une solution simple et tu n'en veux pas !".
Essayez avec :
my $a = 'Variable a';
$ch = qq $Un seul backslash : \$a \n$;
print $ch; # imprime Un seul backslash : Variable a
# fait planter à la compil
# $ch = qq $Deux backslashs : \\$a $;
# print $ch, qq $\n$;
$ch = qq $Trois backslashs : \\\$a \n$;
print $ch; # imprime Trois backslashs : \Variable a
{
local $\ = '$';
$ch = qq $Bidouille Samuel : \$\\a \n$;
# Ne faites pas de print avant de refermer l'accolade, vous seriez surpris.
}
print $ch;
{
my $dollar = '$';
$ch = qq $Propre : \${dollar}a \x24a \n$;
}
print $ch; # imprime Propre $a $a
- Les Perl Mongueurs de Tokyo se sont fait faire des cartes de visite.
Nous ne devons pas rester en plan. Nous avons donc délibéré
sur le contenu de la carte de visite type. Doit-il y avoir un dromadaire ?
Devons nous ajouter un symbole pour la France ou pour Paris (pour nous
distinguer des Perl Mongueurs de Toulouse) ? Et quel symbole adopter, la
Tour Eiffel, ou bien une tête de grenouille dans laquelle on pourrait
retrouver le plan de Paris, avec la rive gauche, la rive droite, l'île
de la Cité et l'île Saint-Louis ? Samuel nous a dessinés
plusieurs logos, de qualité variable.
- À ce propos, Samuel nous avertit que PPM prête à
confusion, puisque cela veut aussi bien dire "Paris Perl Mongers" que
"Paris Pokémon".
- Fabien a de nombreux problèmes avec use strict, non pas
à cause des programmes qu'il écrit, mais à cause des
modules provenant de CPAN et qu'il utilise dans ses programmes. Les autres
personnes présentes à ce moment-là ont manifesté
leur étonnement, nous avons rarement rencontré ce problème.
Quant à Samuel, il proclame qu'il n'utilise jamais use strict,
même dans du code de production !
- Stef nous présente la première mouture du programme qu'il
présentera à l'OPC. Pour l'instant, c'est un programme bien
présenté, avec passage à la ligne et tabulations et tout
et tout... Mais Stéphane va le retravailler pour en faire un programme
digne de l'OPC.
- Au sujet des programmes OPC polyglottes, Samuel suggère un programme
compatible entre
Perl/Tk
et Visual Basic,
ou bien un programme Perl + assembleur
68000 + assembleur 8086 (ou quelque chose comme cela).
Philippe rappelle qu'il a vu un
programme
qui pouvait être traité par
sept compilateurs, et qui affichait "Hello World" à chaque fois.
- Je crois que c'est Samuel qui a lancé l'idée d'utiliser
de la programmation par contrainte dans Perl... Et à ce propos,
certains évoquent Prolog, en rappelant qu'il y a le Prolog de Marseille
d'un côté, et le Prolog d'Edimbourg de l'autre côté.
- Artur cherche à savoir ce qu'il en est des interfaces
Perl - Java.
Le Perl kit,
édité par O'Reilly, contenait un CD-ROM
avec entre autres des outils permettant d'interfacer Perl et Java, outils
disponibles nulle part ailleurs à l'époque. Cela permettait
de justifier l'existence et le prix de ce kit. Ces outils, ou au moins
une partie d'entre eux, sont maintenant livrés avec la version 5.6.0
de base. Le problème est que les gourous de Perl, semble-t-il,
n'admettent pas que le gourou suprème puisse s'intéresser
à Java, et donc cette partie reste dans l'ombre.
- Stéphane nous signale que l'installation d'un module ne devrait
pas se résumer à
perl Makefile.PL
make
make test
make install
mais qu'il faut aussi regarder tout ce qui est fourni. Par exemple, dans
HTML::Parser,
il existe un répertoire eg qui
contient des scripts intéressants, par exemple
pour extraire la liste des liens figurant
dans un fichier HTML, ou pour convertir du HTML en texte simple
il y a aussi lynx -d,
mais après tout, TMTOWTDI.
La discussion dérive sur les magazines
informatiques, qui ont la regrettable habitude de ne mettre sur
leurs CD-ROM que les exécutables,
car il n'y a pas la place d'y ajouter les fichiers archives pour les sources.
- Le shellish Perl de Stéphane avance, mais il n'est pas
encore prêt pour une diffusion au grand public. Le but de cette
adaptation est d'éliminer autant que possible les caractères
spéciaux (dollar, pour-cent, etc). En effet, ces caractères
ralentissent la lecture d'un programme, car nous sommes habitués
à lire des caractères alphanumériques, et nous
ne sommes pas câblés pour lire des signes mathématiques.
La difficulté (enfin, l'une des difficultés) rencontrée
par Stéphane est de faire cohabiter les constructions perliennes avec
les constructions shelliennes. Par exemple, lorsque l'on rencontre un slash,
s'agit-il d'un fichier avec un chemin d'accès absolu, ou bien est-ce
une expression régulière ?
- Il est question d'une fonction de taille monstrueuse dans le source de
Perl. Je n'ai pas noté le nom de cette fonction, mais des recherches
ulérieures m'ont donné Perl_yylex, dans toke.c
version 5.6.0. Cette fonction
commence à la ligne 2029 pour se terminer ligne 4976.
- Samuel m'a demandé en quoi consistait le module
Memoize
de
Mark-Jason Dominus
et que j'avais évoqué sur la liste.
Ce module sert pour les fonctions dont le calcul est lourd, comme le calcul
de factorielle ou le calcul de la fonction de Fibonacci, lorsque le
programme utilise de nombreuses fois les mêmes valeurs. La première
fois, le calcul est effectué normalement, puis le résultat est
stocké dans un hash. Et les fois suivantes, l'appel de la fonction est
intercepté par le module Memoize, qui renvoie la valeur
sans avoir besoin d'appeler la fonction.
Dans le cas du calcul récursif de la fonction de Fibonacci,
use Memoize;
memoize('fib');
sub fib {
my $n = shift;
return 1 if $n < 2;
return fib($n - 1) + fib($n - 2);
}
je disais que le gain est notable dès le premier appel car on obtient
du O(n) au lieu de O(2n). En fait je me suis trompé, le calcul
récursif de fib(n) est en O(1,618n). Pour le calcul
de fib(n), le nombre de fois que l'on exécute le "+" dans la fonction ci-dessus
est fib(n) - 1. Mais Samuel n'a pas voulu me croire quand je lui disais que le
calcul récursif de la fonction de Fibonacci est exponentiel. Il m'assurait
que ce calcul devait être polynomial. A mon avis, son raisonnement est
que le calcul de Fibonacci n'est pas l'un des problèmes NP-complets
répertoriés, donc c'est un problème polynomial. Le défaut
de son raisonnement, c'est qu'un problème polynomial est un problème
qui admet entre autres une solution polynomiale. Et Fibonacci se calcule
en un temps O(1) :
use constant PHI => (1 + sqrt(5)) / 2;
use constant LAMBDA => (1 + sqrt(5)) /(2 * sqrt(5));
sub fib { int(LAMBDA * PHI ** $_[0] + .5) }
- Il a été question de la documentation de Perl, et
notamment de la série
FMTEYEWTK
de Tom Christiansen. David
croyait que c'était dans cette série qu'il avait trouvé
comment utiliser alarm pour interrompre une commande au bout d'un
temps donné. En fait, c'est la recette 16.21 du
livre du mouflon,
du même Tom. Le problème, c'est que
cela ne fonctionne pas
sous Windows.
- Samuel nous évoque un de ses clients, et son site web. Les détails
m'échappent, mais il a été question de DHTML (D pour dynamic), qui permet
un positionnement aisé des éléments graphiques (voire
textuels) dans la page web. Il a été également question
de VRML, un langage tombé en désuétude, mais qui était
mal conçu.
- Fabien nous a de nouveau fait de la retape pour son site
Somenews.
Le logiciel correspondant permet d'extraire et d'archiver des articles
sur des sites de journaux. À l'occasion de cette extraction,
il est même possible de nettoyer le source HTML, ce qui fait que l'on
obtient un document de meilleure qualité que l'original. D'autre
part, moyennant quelques adaptations simples et rapides, il est possible
d'utiliser ce logiciel pour sonder les sites de petites annonces, et
extraire, par exemple, toutes les annonces
proposant une moto d'occasion (mais pourquoi Fabien a-t-il pensé
à cet exemple d'utilisation ?).
- Artur et David ont eu une discussion sur l'équilibrage de la charge
sur un gros site web. Artur évoquait notamment un site sur lequel
il y a 100 processeurs qui font fonctionner Oracle et rien d'autre, une
trentaine qui servent des pages web, et encore d'autres machines pour
je ne sais plus quel usage.
- Dans le même ordre d'idée, David a signalé un
benchmark,
slashdotté le jour même, comparant
Linux
et Windows 2000,
et aboutissant aux conclusions opposées de l'étude de
Mindcraft
il y a quelque temps.
- Toujours dans slashdot, mais il y
a un peu plus longtemps, il était question d'insérer des
images de 1 x 1 pixel,
images permettant d'envoyer un cookie sur la machine
cliente. Mais il était dit que Doubleclick n'utilisait pas les informations
collectées, et que même s'ils le voulaient, ils n'en seraient
pas capables. Bien sûr...
- David nous (re)signale l'existence de memepool,
un site donnant une sélection des nouveautés du web. Récemment,
il y a eu un dessin illustrant le
débat Linux contre BSD...
- Il est question de
Mozilla,
XUL
et XML-Term,
à propos du nouvel environnement
Komodo
annoncé par
Active State.
La discussion dérive vers les éditeurs HTML ou XML, qui
permettent de manipuler la structure arborescente
du document. Quant à moi, l'éditeur que j'utilise pour taper du
HTML, y compris le présent compte-rendu, c'est
Emacs.
- Stéphane trouve que la présentation du site PPM, et notamment
des comptes-rendus, est un peu austère. C'est vrai que je pourrais
caser quelques illustrations çà et là, mais il faudrait
trouver des illustrations déjà faites, sans droits d'auteur,
ni redevances.
Il trouve que les lignes de texte sont trop longues, et
il aimerait un découpage en deux colonnes, avec le texte à gauche,
et par exemple les liens à droite. Cela dit, si tu trouves les lignes
de texte trop longues, tu peux toujours réduire la taille de la fenêtre
de ton navigateur pour obtenir la longueur qui te convient.
- Quant à énumérer les liens à part, David a exprimé
une opinion à l'opposé en évoquant
memepool. Il trouve maladroit les sites qui
écrivent :
Pour en savoir plus sur xxx, cliquez là
et en revanche, il trouve élégante la méthode de memepool,
consistant à écrire un texte comme s'il était destiné
à paraître dans une revue sur papier, et ensuite à
mettre en valeur certains mots par une balise hypertexte. Et comme vous
pouvez le constater, c'est le style adopté par les comptes-rendus,
y compris les plus anciens, qui ne sont pas issus de ma plume... euh de mon
curseur.
- Stéphane a récemment découvert que l'on pouvait
clore un élément de liste HTML par la balise </li>,
ce qui permet d'assurer la compatibilité HTML-XML. Lorsque l'élément
n'est pas associé à du texte, comme les balises <img>
et <hr>, alors il faut les écrire <img src="xxx"/>
et <hr/> respectivement. Mais l'exemple qu'il nous a donné,
la balise de paragraphe <p/>, n'a pas plu à David et à
moi : nous considérons qu'en fait, un paragraphe commence par <p>,
se poursuit pas du texte, et se termine par un </p> généralement
omis.
- Récemment, slashdot a évoqué la plate-forme en pleine
mer
Sealand,
où se trouve un serveur Internet, à l'abri
de toute réglementation nationale. Le problème, c'est que le
responsable du site a perdu son laptop au fond de la Mer du Nord !
- Quelques plantages signalés par les Perl Mongueurs. Lorsque Philippe
a essayé le programme obfusqué de Stéphane, les ressources
consommées étaient telles que le processus gérant la
mémoire virtuelle s'est planté (si j'ai bien compris). Fabien
a constaté que le script C-shell
while (1) { grep 'toto' /dev/zero & }
bloque la machine je n'ai pas testé ; d'abord, je ne connais pas C-shell.
Non seulement il forke comme un forcené, mais en plus
chaque processus fils cherche à s'allouer toujours plus de mémoire,
car il n'y a pas beaucoup de sauts de ligne dans /dev/zero (euphémisme...).
Finalement, Samuel a eu un Ooops, ce qui est plus sérieux qu'un
kernel panic. Mais je ne me souviens plus des circonstances exactes.
- Philippe a apporté le CD-ROM de
ssh
pour BSD, représentant
un blowfish
(poisson-ballon ?). En fait il y a deux CD-ROM, le deuxième
représentant le poisson vu de l'arrière. Nous notons qu'il y a des
bulles dessinées sur chacune des images.
- Nous sommes venus à parler de C et de ses difficultés. Mais
tout le monde n'a pas la même échelle pour les difficultés.
Pour un de mes anciens chefs, C était difficile dès que l'on avait des tableaux
de pointeurs. Des pointeurs et des tableaux d'autre chose, c'était simple,
mais des tableaux de pointeurs, c'était, d'office, incompréhensible.
Sachant que la quasi-totalité des programme utilise *argv[],
on est mal barré...
Pour Frédéric, la complexité
se rencontre lorsque l'on utilise des signaux. Sans dout a-t-il été
impressionné (et c'est compréhensible) par la définition :
void *(signal(int sig, void (*func)(int)))(int);
- Je ne sais plus qui signale qu'il se fait régulièrement avoir
par les tests en C : if (a = b). En positionnant les options adéquates
de gcc, une telle construction déclenche au moins un avertissement.
Je fais remarquer qu'un idiome C consiste à ouvrir un fichier et tester la
bonne fin de l'ouverture par :
if (fd = fopen("toto", "r"))
mais David me répond qu'en doublant les parenthèses
if ((fd = fopen("toto", "r")))
le compilateur ne produit pas d'avertissement.
- Stéphane cherche un débuggueur C capable de faire référence
au source avant passage dans le préprocesseur. Sur le coup, j'ai mal compris la
question et j'ai fait remarquer que les
débuggueurs actuels
étaient capables de traiter comme il faut les #include
et les #ifdef. En fait,
ce que Stéphane cherche, c'est un débuggueur qui comprend les enum
et les #define.
- Il existe un langage (lequel ?), dans lequel
a = b
ne donne pas le résultat attendu. Le résultat véritable
est que a contient une référence à b.
Pour copier la valeur, il faut écrire
a = .b
Je fais remarquer que, dans le peu de Python que je connais, les affectations
a = b
sont des affectations de références, et que toute modification
ultérieure de a se répercute inévitablement sur b.
David m'explique que le but est de ne pas recopier un gros paquet d'octets lorsque
a et b sont des objets avec de nombreux attributs. Et, pour
préserver l'orthogonalité, la même chose se produit si a
et b sont des entiers ou des caractères.
- Philippe racontait qu'il avait parfois des problèmes pour taper des
lignes de commande très longues sous ksh. Je lui suggère
d'utiliser la commande v de ksh, qui permet d'appeler vi
avec un fichier temporaire dans lequel la commande est recopiée. Ensuite,
on peut éditer la commande comme on veut, avec toutes les fonctionnalités
de vi. On termine la session avec :wq, et alors la commande
s'exécute. Magique !
La commande v a une autre utilité. Vous tapez une commande
compliquée, mais ô combien utile sous ksh. Et une fois
que vous avez obtenu le résultat escompté, vous réalisez
que vous auriez dû en faire un script, ou un alias dans .profile.
Faut-il tout retaper (et se botter son propre arrière-train pour ne pas
y avoir pensé plus tôt) ? Non ! Voici la procédure à suivre.
- Tapez ESC k pour
récupérer la commande dans l'historique de la session,
- puis v pour la récupérer dans un fichier temporaire
sous vi,
- tapez :w /home/jf/bin/super_commande,
- détruisez la ligne par dd
(pour éviter une deuxième exécution de la commande),
- quittez vi par :wq,
- et il ne vous reste plus qu'à faire le chmod qui va bien.
- Philippe et je ne sais plus qui ont discuté du piratage par
débordement de tampon (sprintf et autres), et de la
méthode du canari permettant de détecter une telle attaque.
Le nom vient des canaris utilisés par les mineurs pour détecter
les problèmes de ventilation et l'imminence des coups de grisou.
Si le système d'exploitation constate la "mort" du canari informatique,
il arrête la machine, ce qui est un moindre mal par rapport à l'intrusion
d'une personne malveillante qui a obtenu (suppose-t-on) les attributs de root.
- David et Artur ont discuté de l'interpréteur
Dynamo
de HP.
Le principe de fonctionnement de cet interpréteur est similaire au
"code morphing" du processeur
Crusoe.
Il en résulte que l'interpéteur
peut effectuer un "profilage" au fil de l'eau, ce qui permet d'optimiser les
portions de code les plus souvent utilisées. Stéphane fait le
rapprochement avec l'optimisation de Perl. Actuellement, lorsque l'interpréteur
Perl rencontre, par exemple, un codop "addition", il doit prévoir tous les
cas de figure possible :
- addition d'entiers,
- addition de flottants,
- conversion chaîne de caractères en numérique puis addition,
- évaluation d'une liste dans un contexte scalaire puis addition,
- appel à une méthode "overloadant" l'addition,
et ainsi de suite. Avec un fonctionnement inspiré de Dynamo / Crusoe,
l'interpréteur se poserait la question la première fois seulement,
et les fois suivantes il exécuterait directement l'opération
souhaitée, sans avoir à tester tous les cas.
- Tout au long de la soirée, nous avons évoqué divers
langages de programmation, tels que Prolog, Eiffel, Icon, Python,
Ruby (un langage OO avec une syntaxe
inspirée d'Eiffel, mais des fonctions inspirées de Perl), C, Java,
Lisp (pour dire que Perl est en fait Lisp, avec une syntaxe améliorée),
Lotus-script (un langage dans lequel tous les mots-clé sont préfixés
par @ ; il y en a qui ne savent pas faire de l'analyse lexicale)
et la toute dernière nouveauté, qui en a fait ricaner quelques-uns :
C#.
- Nous avons évoqué les satellites Iridium.
Samuel croyait qu'il
s'agissait de satellites géostationnaires, et il a été surpris
d'apprendre qu'ils sont en orbite basse, et qu'ils ont donc une espérance
de vie limitée. Les arguments permettant de savoir qu'ils sont en orbite
basse sont les suivants.
- La distance à parcourir fait que, entre le moment où vous
donnez la parole à votre interlocuteur et le moment où vous entendez
la réponse, il s'écoule un temps de 0,4 s environ (deux allers-retours
terre-satellite géostationnaire). Ce n'est pas grand
chose, mais c'est suffisant pour perturber une conversation orale.
- Un téléphone qui émet vers un satellite géostationnaire
(36000 km d'altitude) a besoin d'une puissance 2025 fois supérieure que
s'il émet vers un satellite à 800 km d'altitude (45 fois moins).
- Il suffit de trois satellites géostationnaires pour couvrir la
quasi-totalité de la surface terrestre. Pourquoi avoir lancé une
soixantaine de satellites simultanément ? Il y a peut-être eu
des erreurs de gestion, mais à ce point-là...
- BooK a apporté quelques bouquins (jeu de mots délibéré :-),
dont un ouvrage de 1969, donnant les fondements mathématiques de l'informatique,
y compris pour des concepts tels que les pointeurs. Il y avait également
Hackers de S. Levy,
et La Route du Futur de Billou.
- Philippe a également apporté un exemplaire d'un zine qu'il compose,
et dans lequel il écrit également. Il demande si nous connaissons
des logiciels de PAO permettant de mettre en page une telle publication.
David explique qu'aucun des logiciels qu'il connaît ne fait bien le travail.
A ce sujet, nous avons pu nous rendre compte que David maîtrise très
bien les règles de typographie française. Combien de Français
de souche savent qu'un ":" doit être précédé d'un
espace quart de cadratin ? Et bien notre Australien de service le sait, lui.
Le seul point où je n'étais pas d'accord avec lui est de savoir si l'on peut
passer à la ligne après un nombre exprimé en chiffres.
Je pensais que c'est interdit lorsque le nombre est suivi de l'abréviation
d'une unité de mesure comme "300 km", mais que c'est autorisé pour les autres
cas comme "300 personnes".
David pense que c'est interdit dans les deux cas.
Des recherches ultérieures m'ont révélé
que David avait raison.
- David évoque les problèmes mathématiques de
Dr. Dobb's.
Il lui est arrivé de résoudre un problème de combinatoire
par la "force brute". Stéphane lui dit que cela se traduit plutôt
par "méthode bestiale".
- Il a été question des
quines,
un sujet bien connu de
Douglas Hofstadter,
surtout que c'est l'un des piliers du théorème
d'incomplétude de Gödel.
Tout au long de la soirée, nous avons appris :
- Gill signifie ouïe. Ainsi, sur le T-shirt de BooK,
le poisson-ballon de ssh est armé
jusqu'aux ouïes. Mais pour des humains, on dit
armed to the teeth, comme en Français.
- Meme est l'équivalent culturel d'un gène. C'est un
élément d'information, qui s'applique à une
population d'individus, mais qui se transmet par apprentissage
plutôt que par les chromosomes. Quelqu'un a cité la
lambada comme exemple.
- La traduction du mot anglais rut est habituellement "ornière".
Néanmoins ce mot signifie également "rut" (période de
chaleur), mais en
Anglais, cette signification tend à s'estomper.
- Hubris signifie "orgueil". Mais, dans la mythologie grecque, il
s'agit plus spécialement de l'orgueil d'un mortel qui cherche à
être l'égal des dieux de l'Olympe. C'est ce que j'ai lu dans
un bouquin sur Perl.
- e.g. est l'abréviation de exempli gratia, et non
pas de example given comme je l'ai longtemps cru. Pour cette raison,
il faut le mettre en italiques, comme toutes les expressions latines.
- Et brute force se traduit par "méthode bestiale".