[couverture de Linux Magazine 101]

Les Journées Perl 2007

Article publié dans Linux Magazine 101, janvier 2008.

Copyright © 2007 - Sébastien Aperghis-Tramoni

[+ del.icio.us] [+ Developers Zone] [+ Bookmarks.fr] [Digg this] [+ My Yahoo!]

Chapeau

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.

Le jour d'avant, jeudi 15 novembre

[logo des Journées Perl 2007]

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.

Premier jour, vendredi 16 novembre

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 Garcia-Suarez - Perl 5.10

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.

Sébastien Aperghis-Tramoni - Vieux Perl et nouveau code

[photo du public]
Le public, dans la salle principale

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 Dami - Gestion des procédures judiciaires genevoises

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 Rodriguez - XML::Twig pour les nuls

[logo de XML::Twig]

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.

Jérôme Quelin - Introduction à POE

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 Krotkine - RT::Client::Console

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 Le Gall - Génération de code Perl avec Talend Open Studio

[logo de Talend]

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 Crane - Faster Regexes: What to do when text matching is your bottleneck

[photo de Aaron Crane]
Aaron Crane montre comment optimiser
l'utilisation des expressions régulières

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 Worthington - Perl in secure web environment

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).

Visite du centre de calcul

[logo du CC IN2P3]

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.

Second jour, samedi 17 novembre

Laurent Dami - Data::Domain - validation d'arbres de données

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 Worthington - Parallel New World

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 Aperghis-Tramoni - La magie dans Parrot

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 Garcia-Suarez - encoding::source

[photo de Rafaël Garcia-Suarez]
Rafaël Garcia-Suarez explique le fonctionnement
de la pragma lexicale encoding::source

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.

Jonathan Worthington - Understanding roles, constraints and classes

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 Sukrieh - Redécouvrir le Perl Objet avec Moose

[logo de Moose]
Teh Møøse!

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.

Sébastien Aperghis-Tramoni - Le meilleur du CPAN

« 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.

Présentations éclairs

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.

[photo du t-shirt avec une citation de Larry Wall]
Perl is the worst programming language
-- except for all the others!
-- Larry Wall

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

Vente de charité

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.

Conclusion

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.

Liens

Auteur

Sébastien Aperghis-Tramoni <sebastien@aperghis.net> - Sophia.pm

[IE7, par Dean Edwards] [Validation du HTML] [Validation du CSS]