Article publié dans Linux Magazine 101, janvier 2008.
Copyright © 2007 - Sébastien Aperghis-Tramoni
Après Paris et Marseille, les Journées Perl se sont déplacées cette fois-ci dans la troisième grande ville de France, et la capitale de la charcutaille, Lyon. Plus précisément dans les locaux de CPE Lyon (École Supérieure Chimie, Physique et Électronique), situés à côté du CC IN2P3 (Centre de Calculs de l'Institut National de Physique Nucléaire et de Physique des Particules) qui a fourni un webcast en direct et maintenant l'hébergement des vidéos.
Comme bien souvent, la plupart des participants et en particulier les conférenciers viennent la veille afin de se retrouver pour un repas convivial. C'était d'autant plus vrai cette année étant donné que, par manque de chance, la conférence est tombé en plein pendant la grève des transports. Pour oublier ces problèmes et faire découvrir la cuisine locale, les organisateurs ont indiqués l'adresse d'un restaurant où la charcuterie était servie par paniers entiers, assurant une joyeuse ambiance.
Après un discours présentant les Journées Perl aux nouveaux venus, Philippe Bruhat laisse la parole aux différentes sociétés qui ont sponsorisé l'événement pour qu'elles puissent se présenter et expliquer, pour celles désirant recruter, les profils recherchés.
Rafaël, pumpking de Perl 5.10, explique quelles seront les nouveautés
de cette nouvelle version majeure de Perl 5, attendue depuis plusieurs
années. Plusieurs sont d'ailleurs des fonctionnalitées importées de Perl 6,
telle le defined-or qui va permettre de remplacer du code comme
defined $a ? $a : $b
par le plus concis $a // $b
. Très pratique en
particulier pour mettre une valeur par défaut : $value //= $default
given
est un genre de switch
, mais en plus puissant car il utilise
la magie du smart match qui permet de comparer n'importe quel type
de données entre elles. Voir perlsyn
section Switch statements
pour plus de détails.
Autres nouveautés : on peut déclarer des variables d'état avec state
(comme static
en C), $_
est maintenant lexical, on dispose de
blocs UNITCHECK
exécutés juste après la compilation. On peut contrôler
l'activation de ces fonctionnalités avec la pragma features
. On peut
d'ailleurs maintenant écrire ses propres pragma lexicales (voir
encoding::source
sur le CPAN à titre d'exemple).
Gros chantier de cette version de Perl, les expressions régulières ont été
profondément améliorées. Ainsi, on peut écrire des expressions récursives,
on peut nommer les tampons de capture et donc les retrouver plus facilement,
on dispose de nouveaux verbes de contrôle du retour arrière, des nouveaux
quantificateurs possessifs (?+
, *+
, ++
), de l'assertion keep
\K
pour trouver du texte sans y toucher. En interne, le moteur a été
dérécursé, faisant ainsi sauter toutes les limitations et bugs qui pesaient
dessus, et de nouvelles optimisations (trie et Aho-Corasick) ont été
intrégrées.
Perl 5.10 offrira aussi un meilleur support des nouvelles techniques
d'objets retournés avec le module Hash::Util::FieldHash
. Plus
généralement, cette version est plus rapide et prend moins de mémoire,
plusieurs structures internes ayant été retravaillées, et offre en plus
des messages d'erreurs plus explicites.
Farceurs, les organisateurs ont placé la présentation de votre serviteur
sur comment gérer les vieux Perl juste après celle de Rafaël sur la toute
nouvelle version :-)
Il s'agit de la même que celle réalisée à Bruxelles, avec la mise à jour suite aux conseils de Nicholas Clark. Je ne reviens pas dessus car un prochain article sera consacré à ce sujet.
Laurent explique l'utilisation qui est faite de Perl dans le cadre des
procédures judiciaires genevoises : un gros applicatif de gestion de
ces procédures, écrit en COBOL, est en train d'être remplacé par
l'équivalent en Apache / mod_perl / Catalyst. Laurent décrit les technologies
qu'ils ont utilisées, en particulier les modules CPAN : YAML::Syck
,
DBI
et DBD::JDBC
(la base de données étant très exotique, ils sont
obligés de passer par un proxy JDBC), leur ORM DBIx::DataModel
,
Data::Domain
, CGI::Expand
, Template Toolkit, Jemplate, GvaScript
(ensemble de composants DHTML).
Il a constaté qu'il était plus facile de former un ingénieur accompli au langage Perl que de former un Perliste accompli à la culture d'un gros projet.
Michel présente le module XML::Twig
qu'il maintient depuis 10 ans.
Ce module rend service à beaucoup de monde car sa manière originale
de gérer le XML lui permet de manipuler sans problème des fichiers
de grande taille, et même des flux continus. Contrairement à DOM qui
impose de charger l'arbre XML en entier et à SAX qui est selon Michel
suprêmement lent, XML::Twig
offre accès à des morceaux de l'arbre
dès qu'ils sont complets, ce qui simplifie leur traitement. C'est ce
qu'il appelle un "twig" (une branchette), auxquels il peut appliquer des handlers.
Le module supporte XPath et une grande quantité de fonctionnalités
diverses et variées. Ce n'est pas toujours très cohérent mais cela
fait néanmoins une boîte à outils bien pratique.
En complément avec l'article publié dans le numéro 100 de Linux Magazine France, Jérôme présente POE, l'environnement d'exécution multitâches objet Perl. Totalement orienté événements, POE propose une immense quantité de composants de haut niveau et s'interface sans souci avec les toolkits graphiques. Il fait remarquer que si on y perd en performances, cela ne l'empêche pas de supporter une charge de l'ordre du millier de messages par seconde.
Il entre ensuite dans le détail de fonctionnement de POE, les différents niveaux d'abstraction, puis montre différents exemples. Je vous renvoie à son article pour une présentation plus complète.
Damien commence par jeter des fleurs sur RT (Request Tracker), l'outil de gestion des tickets utilisé sur le CPAN et par Perl, mais se plaint de son interface web, jolie mais un peu lente. Les solutions évidentes de type web scraping ne lui ont pas semblé pratiques et il s'est orienté vers REST.
Il rappelle ce qu'est REST : une interface simple à une application
web complexe, qui fonctionne avec peu d'opérations, sans états et
réutilise les sémantiques HTTP. RT propose une interface REST, et un
module existe déjà pour l'encapsuler, RT::Client::REST
. Damien a
commencé par écrire un plugin de bot IRC pour tester ce module, puis
est passé aux choses sérieuses.
Damien voulait en effet un client en mode console, et s'appuie pour
cela sur Curses::Widget
, en remplaçant sa boucle d'événements par
celle de POE. Il présente ensuite plus en détail son application,
et fait quelques démonstrations.
Pierrick présente la société Talend, sponsor de précédentes Journées Perl, et le type de produits qu'ils proposent, des outils spécialisés dans l'intégration de données, en particulier dans le domaine des ERP.
Il explique ensuite au fur et à mesure la démonstration en live qui est réalisée par son collègue. Il prend comme exemple un fichier XML qui contient comme données les ventes automobiles en France par marque et par date. L'environnement est totalement graphique, et permet même de sélectionner graphiquement les parties de la structure à transformer en enregistrements. Une grande quantité de modules de traitement et de filtres sont disponibles, et peuvent être assemblés en les reliant avec la souris.
Aaron travaille pour The Register, un site d'informations du net, où il utilise de manière intensive les expressions régulières pour analyser les logs. Il montre le code utilisé, et explique les micro-optimisations déjà en place. Il faut environ 10 microsecondes par ligne de log, mais comme on parle de plusieurs dizaines de gigaoctets de logs, c'est encore trop. Un problème est qu'il y a des parties plus complexes comme la détermination du client et du type MIME. Mais en mettant les résultats en cache, il arrive à doubler la vitesse.
Sur les expressions régulières mêmes, il les créait en concaténant une
longue liste de mots fixes (par exemple les noms des robots web) avec
la barre verticale pour créer les alternances. Facile, mais peu optimal.
Comme il n'utilise pas véritablement les expressions régulières, les
modules comme Regexp::Trie
ou Regexp:Assemble
, quoique excellents,
ne sont pas ici d'un grand secours. Il a donc écrit le module XS
Text::Match::FastAlternatives
, qui s'avère 90 fois plus rapide
que l'expression régulière habituelle !
Jonathan commence par un peu de théorie et définit la sécurité comme la
protection de données (qui ont de la valeur) contre une personne mal intentionnée.
Les applications interagissant avec les utilisateurs en recevant et en
traitant des données de ceux-ci, l'application doit les valider pour
n'accepter que les données valides, et non juste vérifier de potentielles
attaques. Plusieurs modules existent déjà pour réaliser cette tâche
(HTML::FormValidator
, Data::Validate
). Le taint mode de Perl
est aussi très pratique, mais n'est pas pour autant magique, et le
programmeur peut le contourner, dans certains cas sans faire exprès.
Il faut donc nettoyer les données, par exemples les "<">
et ">"
dans les formulaires web, et ce toujours du côté serveur : JavaScript
peut être désactivé, les requêtes HTTP peuvent être construites. C'est
en particulier important pour prévenir les injections SQL, mais c'est
plus difficile à faire correctement, et il est donc largement préférable
de passer au modèle Prepare / Bind / Execute / Fetch qui isole
véritablement les données.
Jonathan continue en montrant d'autres exemples d'injections pas toujours
connues comme il le faudrait : les injections de chemins (navigation
par ../
, lecture de /etc/shadow
), de shell, d'en-têtes de mail
(ajout d'en-têtes comme Bcc:
avec des sauts de lignes bien placés).
Il termine enfin sur les problèmes de XSS (Cross-Site Scripting).
Sa proposition ayant rencontré un vif succès, Xavier Canehan fait visiter le centre de calcul de l'IN2P3 à un petit groupe enthousiaste de découvrir un centre à 25 téraflops et 2 pétaoctets, et qui héberge aussi un nœud Renater. Les connaisseurs étaient eux surtout surpris de l'ordre presque parfait régnant dans une salle serveurs de cette taille. Encore merci à Xavier pour cette visite très enrichissante.
Laurent présente son module Data::Domain
, qui permet de valider les
données en vérifiant qu'elles sont bien au sein d'un domaine, c'est-à-dire
une structure qui définit un ensemble de valeurs valides, par exemple
comprises entre des bornes définies, pour les types courants comme les
nombres, les chaînes, les dates. Le module permet aussi de construire des
lazy domains, avec des contraintes dynamiques : la date de décès
d'une personne doit être postérieure à sa date de naissance.
Jonathan cite certains grands nombres comme la vitesse de la lumière, qui est aussi la vitesse limite de l'information, et explique les limitations intrinsèques des ordinateurs actuels. Pour les contourner, le moyen est d'exécuter les opérations en parallèle. Par exemple, on peut appliquer une même opération à un ensemble de données homogènes.
Il rappelle les notions de base sur les threads, mutexes et sémaphores, et fait remarquer que les threads ont un coût (d'ordonnancement, de synchronisation, de communication) et que cela n'apporte un gain que si on dispose d'autant de processeurs. Sans compter les problèmes de verrous où il est facile de tomber dans un interblocage.
Par ailleurs, il faut savoir utiliser le cache CPU correctement afin de véritablement bénéficier de temps d'accès réduits, en particulier en lecture. Dans le cas d'architecture multi-processeurs, l'écriture dans les zones de mémoire partagées posent des problèmes de contention et doivent donc être évitées.
Perl 6 est très orienté parallélisme, avec par exemple les blocs async
pour exécuter du code dans un autre thread, ou le support de STM (Software
Transaaction Memory) qui implémente des transactions légères au niveau
du cache. Du code dans un bloc atomic
sera exécuté dans une transaction.
Perl 6 permet aussi du parallélisme sur des ensembles de données avec les
hyper-opérateurs ( @c = @a »+« @b
), les opérateurs de croisement et de
réduction.
Dans les idées explorées, Jonathan note qu'on pourrait annoter les variables avec le type de concurrence dont elles ont besoin. On pourrait aussi construire des structures sans verrou, en s'appuyant sur l'opération atomique bas niveau CAS (Compare And Swap).
Christian présente les PMC et les macros de Parrot. Je vous renvoie à ses articles publiés dans les numéros 97 à 99 de Linux Magazine France pour les détails.
Rafaël explique le fonctionnement du module encoding::source
pour
illustrer comment on peut maintenant écrire ses propres pragmas lexicales,
une nouveauté de Perl 5.10. La partie lexicale fonctionne principalement
par la variable %^H
. La gestion des encodages est elle gérée par la
variable ${^ENCODING}
, qui attend un objet Encode
et l'implémentation
de trois fonctions qui seront invoquées par l'interpréteur.
Après quelques rappels, Jonathan introduit le modèle objet de Perl 6 :
class Puppy { has $.name is rw; has $.colour; has @paws; has $tail; }
Le point "."
après le sigil indique que les accesseurs de cet attribut
seront automatiquement créés. Les méthodes sont déclarées avec le mot-clé
method
:
method bark() { say "woof!" } method chew($item) { $item.damage++ }
On accède aux attributs avec la syntaxe $.colour
, ou avec $!colour
si
on veut l'attribut privé de la classe.
my $puppy = Puppy.new(name => "Rosey", colour => white); $puppy.bark();
On peut aussi l'écrire
my Puppy $puppy .= new(name => "Rosey", colour => white);
car une variable peut être non définie mais néanmoins associée à une classe. L'héritage multiple est toujours supporté :
class Puppy is Dog is Pet { ... }
Nouveauté, les rôles permettent de partager du code en dehors du modèle d'héritage, un rôle étant un groupe de méthodes que l'on attache à une classe.
role Walk { has Paw @paws; method walk($num_steps) { for 1..$num_steps { .step for @paws } } } class Dog does Walk { ... }
Autre nouveauté, on peut appliquer des contraintes permettant de réduire les valeurs possibles afin de créer des sous-ensembles :
subset EvenInt of Int where { $^n % 2 == 0 };
Cela permet aussi d'écrire des genres de méta-classes :
subset Walkable of Any where { .can("step") } role Walk { has Walkable @paws; ... }
Alexis présente Moose
, une méta-classe basée sur Class::MOP
très
inspirée du modèle objet de Perl 6. Bien sûr, cela reste du Perl 5,
mais on voit les similarités :
package Hero; use Moose; has name => ( is => 'ro', required => 1, isa => 'Str' );
On peut même définir des déclencheurs s'exécutant avant, pendant ou après l'accès ou la modification des attributs :
has life => ( is => 'rw', required => 1, isa => 'Int', default => 20, trigger => sub { my ($self, $life, @args) = @_; $self->dies if $life == 0; } );
Moose
supporte aussi les rôles, qui ici sont des classes particulières,
non instanciables :
package Weapon; use Moose::Role; requires "hits"; 1; package Sword; use Moose; with "Weapon"; sub hit_points { 3 } 1;
Un problème de Moose
est qu'il utilise une quantité non négligeable
de modules, et en conséquence peut être difficile à installer et a un
coût d'exécution. La performance devrait s'améliorer avec Perl 5.10
qui offre un meilleur support pour ces nouveau modèles objets.
En attendant, Alexis a codé Coat
, une version réduite de Moose
avec bien moins de dépendances (et forcément moins de fonctionnalités,
dont les rôles). L'intérêt est que l'on peut commencer à coder avec
Coat
, pour un coût raisonnable, et ensuite passer à Moose
sans
avoir besoin de changer le reste du code.
« CPAN is the language, Perl is just its syntax » -- Audrey Tang
L'auteur présente à l'assistance une liste de modules du CPAN, classés par domaine d'utilisation, pour débroussailler ce qui peut apparaître comme une jungle aux débutants. C'est loin d'être exhaustif, mais au vu des questions et des retours, cela en a intéressé plus d'un.
Serge Hoffmann montre comment créer une base de données Access, sans utiliser Access.
Laurent Dami revient sur le concours Plat-Forms qui avait opposé des équipes représentant les langages Java, Python et Perl, et explique les points où ils ont été forts et ceux où ils ont été faibles.
En direct, en live et sans filet, Rafaël publie, sous les yeux du public, la Release Candidate 1 de Perl 5.10. Applaudissements nourris pour cette version si longtemps attendue.
Je viens parler de deux modules que j'ai récemment écris :
relative.pm
et Win32::Mock
.
Dirk De Nijs explique tous les ennuis provoqués cette nouvelle "fonctionalité" de Vista, le User Acceptance Control (UAC), qui demande 10 confirmations pour chaque action.
Laurent Dami présente son module Pod::POM::Web
, une application
web pour butiner la documentation des modules Perl installés sur
votre machine, avec coloration de syntaxe et quelques pointes d'Ajax.
Jean Forget continue dans sa série low-tech, et faisant suite à sa présentation de l'an passé où il expliquait en quoi réinventer le roue était une bonne chose, il montre cette fois-ci quelle devrait être la bonne métaphore : il ne faut pas réinventer la brosse à dents. Et illustre avec une grande quantité de brosses à dents toutes plus démentielles les unes que les autres. Acclamations de la salle.
David Morel présente en cinq minutes une petite application Catalyst pour afficher des fortunes.
Philippe Bruhat termine en présentant l'association des Mongueurs de Perl, annonce que l'adhésion est maintenant plus facile et gratuite (il suffit de s'inscrire à la liste de diffusion des adhérents) et invite les participants à venir dans les groupes locaux. L'adresse de la liste : http://listes.mongueurs.net/mailman/listinfo/adherents
Comme souvent, la vente de charité est l'occasion de s'amuser en achetant des livres, des t-shirts et autres objets véritablement exceptionnels. Ainsi, on aura vu passer des jeux Fluxx de la boîte hippie Looney Labs, et surtout des t-shirts uniques, réalisés par des grands noms de la communauté Perl, y compris un par Larry Wall. Inutile de préciser que la bataille a été plutôt sévère, en particulier pour celui de Larry, qui est finalement parti pour 250 euros.
La date pouvait difficilement plus mal tomber, la conférence commençant juste après le début de la grève des transports, privant ainsi les organisateurs de deux conférenciers (un troisième ayant déjà dû se désister pour raison de maladie). Une soixantaine de personnes s'étant finalement déplacé (sur les 90 inscrites), on peut considérer que la conférence est quand même un succès, surtout si l'on en juge par le nombre de nouveaux venus. Un grand bravo donc aux organisateurs.
Pour ceux qui n'ont pu se déplacer, notez que vous pouvez visionner une bonne partie des présentations grâces aux vidéos mises en ligne par le CC IN2P3.
Les Journées Perl 2007 - http://conferences.mongueurs.net/fpw2007/
Les supports des présentations - http://conferences.mongueurs.net/fpw2007/talks
Les vidéos des présentations - http://webcast.in2p3.fr/FPW2007
Les nombreuses photos de la conférence publiées sur Flickr - http://flickr.com/photos/tags/fpw2007/
CPE Lyon - http://www.cpe.fr/
CC IN2P3 - http://cc.in2p3.fr/
RT::Client::Console
-
http://code.bestpractical.com/project/RT-Client-Console
Copyright © Les Mongueurs de Perl, 2001-2011
pour le site.
Les auteurs conservent le copyright de leurs articles.