[Toulouse-pm] [ppm] YAPC::Europe::2003 (2) (fwd)
Michel Rodriguez
mirod at xmltwig.com
Tue Jul 29 10:28:07 CDT 2003
Michel Rodriguez
Perl & XML
http://www.xmltwig.com
---------- Forwarded message ----------
Date: Tue, 29 Jul 2003 02:24:27 +0200
From: "[ISO-8859-1] Sébastien Aperghis-Tramoni" <maddingue at free.fr>
To: Paris.pm <paris-pm-list at pm.org>
Subject: [ppm] YAPC::Europe::2003 (2)
Jeudi 24 juillet
* Robin Berjon - Introducing PerlSAX
Robin nous expose dans ce talk l'intérêt d'utiliser l'API SAX par
rapport à DOM.
Il commence en expliquant que les APIs basées sur les arbres
sont bien, car contrairement à DOM elles ne nécessitent pas de
tout charger en mémoire.
Il oppose ainsi les APIs "push" (SAX) aux APIs "pull" (DOM) en
indiquant que le contrôle que le programmeur croît conserver par
l'utilisation d'une API pull (où le programmeur va extraire les
données) est une illusion.
Dans le cas d'une API push, les données sont fournies au
programme au fur et à mesure de la lecture du document XML,
qui ne voit donc ces données que par fragments. On parle
alors plutôt de filtre. L'intérêt est qu'on peut alors facilement
chaîner plusieurs filtres les uns à la suite des autres, comme
on peut chaîner des commandes Unix dans un pipe (ça c'est
la comparaison qui m'a permit de comprendre le fonctionnement
général, c'était bien vu Robin).
Le gros avantage de cette programmation événementielle est
qu'un filtre est plus facile à écrire car on peut ne conserver que
la partie qui nous intéresse, en laissant tomber le reste. Reste
qui pourra être traité par le filtre suivant.
Robin présente ensuite XML::SAX::ParserFactory qui permet de
sélectionner automatiquement le "meilleur" parser SAX disponible
sur le système, avec en dernier recours un parser en pur Perl.
Pour comparer, c'est un peu comme si on pouvait faire du DBI
sans devoir indiquer le driver de base de données.
Il présente enfin XML::SAX::Machines, qui est un module
comprenant quelques filtres bien utiles comme les étonnants
XML::Filter::Tee et XML::Filter::Merger qui permettent
respectivement d'envoyer des événements SAX à plusieurs
processeurs et de fusionner plusieurs flux SAX en un seul !
* Uri Guttman - Better Perl code in 65 minutes
Ce talk consiste principalement en un ensemble de règles de
bon sens de développement.
Le code doit être écrit pour le mainteneur, car c'est le mainteneur
(que ce soit soi-même ou une autre personne) qui devra relire le
code six mois plus tard pour corriger d'éventuels bugs ou ajouter
des fonctionnalités. En conséquence, Uri recommande de nommer
les choses (variables, fonctions, objets, etc) de manière
appropriée,
de sorte que ce soit compréhensible. Éviter donc les $foo, @bar et
autres $pipo{$machin}.
Il donne aussi le conseil suivant sur les commentaires : les
commentaires doivent indiquer *pourquoi* le code fait telle ou
telle chose. Écrire
$a += 1; # add 1 to $a
est inutile et ne sert à rien.
Il indique aussi que programmer du code spaghetti aboutit à la
confusion et recommande donc de programmer du code lasagnes !
En effet le code est organisé en couches réalisant des
fonctionnalités
spécifiques et communiquant par des interfaces.
En résumé :
- Code is for People, not for Computers
- Code is for Others, not for Yourself
- Code is What, Comments are Why
Uri présente ensuite quelques exemples autour des contextes
d'exécution. Il fait un rappel sur wantarray et montre qu'outre les
contextes scalaire et de liste, elle renvoie aussi undef en contexte
vide. Il conseille d'utilise Want.pm, qui offre plus de possibilité
que
wantarray.
Il y a aussi toute une discussion autour de l'utilisation des here-
documents. Uri essaye de convaincre quelqu'un dans le public
qui pense que les here-docs c'est pas bien que, oui, les here-docs
c'est bien.
* Peter Sergeant - Virus detection with Perl
Ce talk est comme son nom l'indique consacré à la détection de
virus en Perl.
Il présente d'abord File::Scan, un module qui permet de scanner
les fichiers et d'y détecter d'éventuels virus. Pour Peter, le
module
est sympa mais est insuffisant en production puisque les signatures
de virus ne sont disponibles qu'une ou deux semaines après la
publication de ces signatures chez les éditeurs commerciaux. Et
évidemment il ne dispose pas d'un support commercial.
Il présente ensuite SAVI qui est un module s'interfaçant avec le
logiciel Sophos Antivirus via la bibliothèque libsavi. L'intérêt est
que Sophos est disponible gratuitement en version d'évaluation
pour une large variété de systèmes (Windows, Unix, Linux, Mac,
VMS, etc). Si on achète la version complète on dispose alors d'un
support commercial. (Néanmoins je connais des personnes qui
refusent d'utiliser Sophos parce que le PDG de cette boîte serait
un scientologue).
Il explique ensuite les méthode de base pour écrire son propre
anti-virus pour emails en exposant les principaux mécanismes de
fonctionnement de ces virus. En effet les virus de mails sont pour
la plupart basés sur l'exploitation de failles dans les logiciels.
Bien
que les virus doivent forger des mails semblant valides, ils
contiennent nécessairement l'exploit en clair dans le corps de
l'email, qu'on peut donc intercepter grâce à Perl.
A vrai dire ce talk était un peu décevant car il a juste présenté
des
techniques assez générales, connues depuis longtemps et sans
montrer d'exemple en Perl.
* Marty Pauley - Test-driven Perl development
Marty nous présente en trois slides une méthodologie de
développement basée sur le système suivant : *avant* d'écrire
le code, quand on sait ce qu'il doit faire, on écrit les tests
correspondants, seulement *ensuite* on écrit effectivement le
code, et on exécute make test pour vérifier que cela fonctionne.
Le principe est donc que les tests constituent le design fonctionnel
du code. L'écriture du programme est terminée quand tous les
tests réussissent.
* Philip Newton - Building an RFC 1086 simulator using ithreads
Dans ce talk Philip nous expose un cas d'utilisation de Perl
comme simulateur de RFC 1086.
Il explique d'abord ce que c'est : une passerelle TCP/IP - X.25.
Sa boîte avait un logiciel en C++ qui marchait au-dessus de X.25
et qui envisageait d'utiliser un système de ce genre. Pour tester
quels changement il aurait à effectuer dans le code C++, il a
décidé d'écrire ce simulateur.
La difficulté résidait dans le fait qu'il devait gérer trois
connexions
simultanément.
_____________ _______________
| | <------------------ | <--\ /--> |
| | incoming data | \ / |
| X.25 based | | (X) |
| application | ------------------> | / \ |
| | control connection | <--/ \--> |
| | | TCP-IP / X.25 |
| | ------------------> | gateway |
|_____________| outgoing data |_______________|
Il a alors décidé d'utiliser les threads de Perl 5.6, et montre
quelques
unes des fonctionnalités offertes par Perl.
Il montre d'abord comment on peut partager des données (ici
des variables) entre threads grâce à threads::shared :
use threads::shared;
my $data : share;
Il montre ensuite comment créer une queue "thread-safe" avec
Thread::Queue : on peut ainsi ajouter des données dans cette
queue depuis un thread et en lire depuis un autre :
use Thread::Queue;
my $queue = new Thread::Queue;
# thread A:
$queue->enqueue("hello the world");
# thread B:
print $queue->dequeue;
Il montre enfin comment créer un sémaphore avec
Thread::Semaphore.
use Thread::Semaphore;
my $sem = new Thread::Semaphore;
# create threads...
$sem->down;
# do stuff....
$sem->up;
Il conclue enfin en expliquant que son simulateur n'a servi à rien
car sa boîte a finalement décidé d'utiliser une autre solution, mais
il était content car il avait pu découvrir les threads en Perl.
* Paul Johnson - Code coverage - Tales from the trenches
Ce talk est destiné à nous présenter le module Devel::Cover, dont
le but est de déterminer de manière pratique la couverture de code.
La couverture d'un code est la partie du code qui est exécutée au
cours d'un ensemble d'instances d'exécution. En clair, ce module
permet de vérifier si le code contient des parties mortes ainsi que
de vérifier quelles sont les parties les plus exécutées (utile pour
déterminer quelles sont les parties à optimiser). Cela ressemble
donc un peu à Devel::DProf mais en utilisant un système de profilage
différent (basé sur la surcharge des ops de l'interpréteur Perl) et
surtout en fournissant en sortie un rapport en HTML permettant de
suivre l'exécution du code par ligne, par branche et par boucle.
L'utilisation de Devel::Cover est aussi simple que ça :
$ perl -MDevel::Cover program.pl
$ cover -report html
Un aspect dommage est que Paul a tendance à traîner en longueur
sur son exemple alors que plusieurs personnes (dont moi-même et
Arnaud) trépignent d'impatience en se demandant s'il va montrer le
Makefile.PL permettant de lancer un make test avec Devel::Cover
(ce qui constitue une technique fabuleuse pour vérifier que les
tests
font s'exécuter tout ou partie du code).
Il s'excuse en disant qu'on lui avait déjà posé la question à
Munich,
qu'il n'avait pas pu la fournir et que là il avait oublié ce qu'il
fallait
ajouter à Makefile.PL pour avoir "make cover".
Il parle après de CPANCover, un projet dérivé de ça qui consiste à
exécuter un make cover sur tous les modules du CPAN.
* Jos Boumans - 20 things you may not know about Perl
Pour certaines raisons, ce talk a attiré beaucoup de personnes qui,
venant en avance, ont débarqué dans celui de Guillaume Rousse
"Yet another Perl biology toolkit". Désolé Guillaume.
Jos a en effet présenté vingt modules (ou pseudo-modules) en
prenant comme thème de présentation le Seigneur des Anneaux :
Neuf furent donnés aux Hommes mortels,
Sept aux Nains avides d'or,
Trois furent protégés par les Elfes,
Et l'Unique, le Maître Anneau, forgé par Sauron.
Les modules n'ont en réalité pas grand-chose à voir avec les Elfes
ou les Anneaux, mais l'idée est amusante et surtout Jos était un
bon orateur.
Sur tous les modules qu'il a présenté au pas de charge, je n'en ai
retenu que quelques uns :
- Devel::Peek qui permet de voir les structures internes de
l'interpréteur Perl;
- File::Chdir qui permet de gérer automatiquement le répertoire
courant;
- Config::Auto, un module de gestion de fichiers de configuration;
- Hook::Scope qui permet d'avoir l'équivalent de BEGIN et END
mais au niveau scope (c'est-à-dire au niveau des blocs);
- Hook::LexWrap, un module de Damian Conway qui fait quelque
chose de similaire mais au niveau des fonctions si j'ai bien
compris;
- Scalar::Utils qui permet de stocker plusieurs valeurs différentes
(un entier ET une chaîne) dans une même variable;
Je crois que dans ce talk aussi Nick Clark a réussi à parler de
Acme::Buffy :-)
Sébastien Aperghis-Tramoni
-- - --- -- - -- - --- -- - --- -- - --[ http://maddingue.org ]
-
Paris Perl Mongueu(r|se)s => http://paris.mongueurs.net/mail.html
More information about the Toulouse-pm
mailing list