Copyright © 2006 - Michel Rodriguez.
Salut les p'tits gars. Donc cette année encore, pas de YAPC::Europe pour moi, mais par contre un petit compte-rendu d'OSCON, au cas où quelques uns d'entre vous ne seraient pas là.
J'arrive donc dans l'après-midi, sous une chaleur accablante, bonne excuse pour goûter les bières locales, légèrement meilleures que les Nostro Azzuro ou Moretti auxquelles je suis condamné à la maison.
Je tombe sur quelques têtes connues, MJD avec sa fille, Iris, Nat Torkington qui porte un T-shirt Google et un sac MSN qui se battent (la femme de MJD éloigne sa fille pour qu'elle ne soit pas contaminée par le langage... fleuri de Nat).
Bon, si je commence comme ça, je crois que dans la version HTML du
compte rendu je mettrais des div avec des classes (technique
, people
,
news
, non_perl
, insultes_gratuites
,...)
La soirée est assez calme, j'ai encore le double jet-lag (je ne suis arrivé que mardi sur la côte est). Donc une paire de bières avec Scott Matthews, que je n'avais pas vu depuis une éternité, quelques "ribs"... et au lit.
J'ai déjà vu des bouts de ce cours, mais franchement il n'y avait pas grand chose de plus excitant au programme.
Donc Damian explique que le but c'est de proposer des interfaces minimales.
L'API d'un module peut être très simple.
En exemple, il propose IO::All
(http://search.cpan.org/dist/IO-All) ou
Perl6::Say
(http://search.cpan.org/dist/Perl6-Say).
Il détaille un peu Perl6::Say
, qui exporte une fonction, say
, un print
avec
un \n
à la fin). Curieusement le code de la fonction est un peu plus compliqué
que ce que j'aurais pensé (pas trop, juste un peu), ce qui montre bieng que
perl cache bien des choses sous son capot. Au passage perl 5.10 aura la
fonction say
, et d'autres (switch
!).
Sur CPAN, les modules Perl6::* sont souvent de ce type.
Pour lui, toute séquence d'instructions souvent répétée devrait se retrouver dans une fonction, elle-même stockée dans un module.
Il a écrit un module, Toolkit, qui permet de mettre un paquet de modules dans un
répertoire, et use Toolkit
les charge d'un coup
(http://search.cpan.org/dist/Toolkit)
Commencez par écrire le code qui va utiliser le module/fonction que vous devez développer, ça vous permet de détecter très tôt la meilleure manière d'écrire l'interface. Écrire des tests est une bonne façon de faire ça.
Exemple: Regexp::Common (http://search.cpan.org/dist/Regexp-Common): "Who do you want to write your regular expressions? Abigail!".
Il explique comment il est passé d'une interface où la regexp était renvoyée par une fonction, à un simple hash (qui masque une... certaine complexité, qu'il explique). C'est pas mal, ça complète bien la présentation d'Abigail que j'avais vu à Londres l'an dernier à la London Perl Workshop (c'est masculin ou féminin Workshop ?).
Au passage, une théorie de Larry Wall: certaines tâches ont une complexité intrinsèque, le code de toute façon sera compliqué. Par contre on peut distribuer cette complexité, et en l'occurence la cacher dans les couches basses de l'application. Du coup ça permet d'avoir des couches hautes simples, qui peuvent être écrites par des codeurs moins expérimentés.
Puis un conseil : quand on écrit une suite de if
, TOUJOURS, avoir le
else
à la fin, même si le else ne doit jamais arriver. Dans ce cas, lui faire émettre
un message adéquat car prendre cette habitude permet de détecter pas mal de bugs, quand le
cas impossible se produit !
Puis il décrit l'interface de Contextual::Return (http://search.cpan.org/dist/Contextual-Return)
(il note que wantarray
en fait ne dit pas si l'appelant veut un tableau, juste
s'il veut une une liste!).
Le code de Contextual::Return est assez chiadé par contre, un peu trop pour que je puisse l'expliquer ici (la marge de ma fenêtre n'est pas assez large).
À la pause je croise Mister Cholet, un couple de fervent Pythoniste et Nat qui devient "corporate" (il porte des tongues au lieu de se promener pieds-nu comme d'hab).
En 2 mots, à partir de l'API initiale, identifier les endroits où l'utilisation est un peu bizarre, et réduire la bizarrerie. Souvent ça consiste à rajouter des options aux fonctions pour déplacer la complexité du code utilisateur vers la fonction de plus bas niveau.
pause...
À la reprise, c'est l'heure pour Damian de parler de IO::Prompt
(http://search.cpan.org/dist/IO-Prompt), dont l'interface "Does The Right Thing".
Comme Contextual::Return
, il est base sur Want
(http://search.cpan.org/dist/Want), qui
est un super wantarray
, mais donne beaucoup plus d'infos sur le contexte dans lequel
une fonction est appelée.
IO::Prompt
exporte une unique fonction, qui fait pleing de choses différentes, en fonction
des options qui lui sont passées.
Éviter les interfaces où la première chose que l'utilisateur doit faire est d'initialiser un paquet de variables. D'abord ça force l'utilisateur à lire la doc. Et pis du coup le "vrai" code ne commence qu'assez bas dans le code.
Exemple: Exporter
, avec ses EXPORT, EXPORT_OK
et autres variables. Perl6::Export::Attrs
(http://search.cpan.org/dist/Perl6-Export-Attrs) est plus naturel:
sub toto :Export( :DEFAULT :ALL ) { ... }
On voit bien que c'est au niveau de la fonction, on déclare l'export, pas loin de là. en plus
le module offre quelques fonctions que Exporter n'offre pas, comme des fonctions qui sont
exportées quoique l'utilisateur dise (dans le use
). Il semble que Damian lui même (qui a
écrit le module) ne sait pas exactement à quel point le module est magique: aprês une question,
il découvre dans le code du module que si on fait use :ALL
toutes les fonctions sont exportées
(sauf celles qui commencent par _
je suppose).
Un autre module qui montre l'intérêt des interfaces déclaratives: Getopt::Euclid
(http://search.cpan.org/dist/Getopt-Euclid) (Euclid est un acronyme, mais il le dit
tellement vite que je ne saisis pas tout. Dans le POD du code on rajoute la description
de l'interface de l'outil, avec une syntaxe simple... et ça marche.
Ne pas obliger l'utilisateur à répéter plusieurs fois les mêmes infos.
Exemple: Config::Std
(http://search.cpan.org/dist/Config-Std), qui préserve les commentaires
dans un fichier de configuration quand il est mis à jour. Ça n'est pas très compliqué
(pour Damian!), ça suppose juste d'avoir un parser qui garde tout, commentaires et ordre des
options dans le fichier, et de ruser un peu avant de sauver le fichier.
Oh, et quand on sauve le fichier, pas besoin de redonner le nom du fichier, par défault c'est le même. Ça évite souvent de devoir passer le nom du fichier partout dans le code où la config peut être mise-à-jour.
Si on fait ce genre de chose à la maison, le comportement exact dépend du type de fichier: on peut vouloir par exemple "comment out" (comment ça se dit en français?) les options qu'on a enlevé.
Il s'excuse pour l'utilisation du terme "leverage"...
Exemple: Log::StdLog (http://search.cpan.org/dist/Log-StdLog). L'interface est la même
que... print
! Au niveau de log près. Comme ça l'utilisateur n'a pas trop de problème
à savoir comment utiliser le module.
if( $verbose) { local *STDOUT = *STDLOG; print debug => "coucou"; print info => "rmatique"; print fatal => "Aaaarrrrrgghhh!"; }
Bon, pour les explications techniques sur comment ça marche, j'écoute, donc pas de commentaires.
Il a regardé sur CPAN, les 30+ modules qui font du log. Son commentaire est que quand il n'y a qu'un ou 2 modules sur CPAN qui font un truc, en général c'est qu'il y a consensus sur la manière de résoudre le problème. Par contre Il admet que Log4Perl est pas mal, mais un peu compliqué. Pourquoi avoir un module OO pour du log? Commentaire de mon voisin dans la salle: Log4Perl a un "easy" mode qui évite de devoir se trimballer un objet partout dans le code. Damian recommande d'y jeter un œil.
Oops, son micro le lâche. Il va devoir crier, ce qui ne le dérange pas trop!
Citations: "This is maintenance by complaint" à quelqu'un qui demande une option supplémentaire, je ne saisis pas laquelle.
Le simple fait de faire un use Module
fait que "shit happens".
Exemple: Object::Dumper (http://search.cpan.org/dist/Object-Dumper)
use Object::Dumper; my $object = MyClass->new(...); print $obj;
Et ça marche! Ca dumpe le contenu de l'objet, au lieu du classique HASH[0x12a8f2]
Au passage ça fait aussi un die
si on essaye de se servir de l'objet dans un
contexte numérique, sauf bieng sûr si on overloade la numérification de la classe.
2 grandes forces de perl: Il fait déjà plein de chose pour nous, et il ne gène pas ("it doesn't get in the way"). On devrait essayer de faire la même chose avec notre propre code.
Un bon tutorial, intéressant parce qu'il allait de principes généraux de design d'interface, à des exemples de code assez pointus.
Et oui, c'est la journée Conway. Je me sers à peu près bien de vim, mais comme dit Damian "je me sers de vim, il fait ce que je veux, mais je sais vaguement qu'il y a plein de trucs super cool qu'il peut faire mais que je ne connais pas". Donc tutorial. En plus je tape ce CR avec vim, donc ça devrait donner un super texte.
Son premier conseil: utiliser vim, pas vi. Jusque là j'ai tout bong.
Je vais pas vous répéter tout ce qu'il dit, juste vous donner les trucs sympas (et que je connaissais pas) qu'il donne.
Toutes les touches du clavier sont des commandes valides. Celles qu'on utilise le plus sont à moitié effacées (où complètement dans le cas de mon vieux Mac, ce qui me handicape pas mal vu que je connais pas bien le clavier).
Il n'arrête pas de dire "perl" à la place de vim, il menace d'unifier les 2 dans le futur.
Donc une longue liste de trucs que je ne connaissais pas:
font la même chose que w/b, mais en prenant l'espace comme séparateur de mots.
debut du premier mot de la ligne
debut du fichier
comme G, mais avec plus de détails.
set matchpair <:> # < et > sont maintenant des délimiteurs (% va de l'un à l'autre)
même chose que ml, mais global, permet de naviguer entre différents fichiers.
montre tous les marqueurs
d'a
efface toutes les lignes du curseur au marqueur
retour au dernier endroit, couplé avec l'utilisation de marqueurs, permet de sauter facilement entre 2 régions d'un fichier.
le dernier endroit ou on était la dernière fois qu'on a édité le fichier.
navigue vers l'avant et l'arrière dans l'historique des sauts entre marqueurs
remplace <n> caractères par le texte tapé ensuite.
remplace depuis le curseur jusqu'à la fin du déplacement
delete efface maintenant tout, sans s'arrêter
insère le caractère de la même colonne de la ligne au-dessus <CTRL-E> pareil avec la ligne au-dessous.
évalue une expression et insère le résultat
repasse en mode normal (d'un autre mode) pour une seule commande
trouve le caractère, intéressant couplé à d par example
trouve le caractère, et se positionne devant
search devient non case-sensitive
set smartcase
: case-sensitive seulement si le pattern est tout en minuscule.
case-sensitivity on/off dans un pattern
annule le highlighting du search (utile surtout si mappée sur une touche)
dans le genre:
le + veut dire 33 lignes après la ligne 10
. est la ligne courante .+1 est la ligne d'après
<n>: initialise le range à .,+<n>
%s: initialise le range à 1,$
on peut utiliser des searches dans le range: /<body>/;<\/body>/s/<I>/<EM>/
wahouh!
Ça marche aussi avec des marqueurs. Damian ne le savait pas. Il essaye, ça marche avec ', pas avec `
Ne pas oublier le g à la fin du s.
Un c à la fin du pattern demande confirmation de toutes les substitutions
:s
ou &
refait la dernière substitution (pratique si on traite plusieurs fichiers à la file)
"yanke" le paragraphe courant (la version avec i ne prends pas les espaces avant/après) (je crois, mon Mac a crashé depuis la dernière phrase.
paste en respectant le niveau d'indentation. Cool pour bouger du code.
devinez ce que ça fait?
insère (en fait tape) le contenu du registre n. <CTRL-R><CTRL-R>n fait un vrai insert (les charactères de contrôle sont vraiment insérés).
après ça :next
sauve le fichier courant
ouvre le fichier dont le nom est sous le curseur
insère le contenu du fichier :read !<commande shell>
marche aussi avec un préfixe: :Gread <filename>
insère à la fin du fichier
on peut aussi remplacer du contenu :%!sort
Très utile pour trier un paragraphe par exemple
(au passage :sort
est aussi une commande de vim, avec diverses options (n numériquement, u unique,
i case-insensitive...) sort!
trie en ordre inverse.
on peut donner des fichiers qu'on ne veut pas auto-completer: :set ???
(j'ai pas saisi)
Ça marche aussi en mode commande
En mode perl (ou si on le définit soi-même) <CTRL-X><CTRL-D> auto-complète un nom de fonction.
<CTRL-X><CTRL-N> auto complète un nom (un mot en fait). On peut même avoir un fichier avec une liste
de noms standards ( set complete+=k~/data/my_std_identifiers
)
<CTRL-X><CTRL-L> complète avec une ligne (du fichier) qui commence comme la ligne courante.
faire :options
choisir parmis les milliers d'options possibles, puis faire :mkvimrc
(dans $HOME)
ma config de choix, si je suis bien
:set shiftround :set expandtab :set tabstop=4
Il y a un moyen (par une variable magique) de configurer le moteur d'expressions régulières pour qu'il soit plus proche des regexp de Perl.
D'une manière générale, sauts à marqueurs et recherches peuvent toujours être utilisés comme modificateurs
de commandes: d/__END__
efface tout jusqu'au __END__
Les registres sont sauvés entre session, donc on peut s'en resservir.
"A3yy ajoute les 3 liges à la fin du registre a
En vim 7 g- et g+ permettent de naviguer entre les branches de l'edition. les commandes :earlier
et :later
permettent de se retrouver dans un état différent (genre :earlier 10mn
).
On peut éditer normalement (avec les commandes de vim) l'historique des commandes ':' en faisant q:
V
met en mode visuel. Tout déplacement sélectionne le texte, ensuite les commandes normales s'appliquent.
v
est similaire, mais sélectionne des lignes entières
<CTRL-v>
fait pareil, mais sur un block rectangulaire de texte. mega-funky comme dit Damian, que je
ne sais pas expliquer proprement en 3 mots.
vip>
sélectionne le paragraphe et l'indente
vipJ
sélectionne le paragraphe et joint les lignes
:abbreviate <abbreviation> <texte>
Par exemple :abbreviate =i =item
pour ce pod
À noter qu'on peut par exemple avoir <CTRL-O> pour avoir des commandes dans les abréviations.
:iabbrev
marche en mode insert et :cabbrev
uniquement en mode commande (et :abbrev
dans
les 2 modes)
:imap <abbreviation> <text>
Les abréviations sont insérées uniquement si l'abbréviation est suivi d'un caractère non-mot, les maps sont insérées dès que les caractères sont tapés.
On peut programmer les maps pour avoir encore plus de possibilités.
:help :map-modes
décrit d'autres modes (xmap pour mode visual, omap pour operator-pending mode...)
23% envoie à 23% du fichier...
Il avoue qu'il a couvert à peu près 10% de ce que peut faire vim.
Au final un tutorial très dense, avec pleins de trucs. Les notes sont très complètes. Ça va me prendre quelques temps pour digérer tout ça. Mais déjà j'ai utilisé pas mal de ses trucs en tapant ce CR, donc j'ai espoir.
Désolé pour le franglais dans la liste au dessus, mais ça va assez vite, et j'ai pas toujours le temps de traduire tout comme il faut ;--( En plus, du coup j'ai sauté presque tout ce que je connaissais déjà, ça m'a laissé le temps de respirer un peu. Ah! oui, en plus j'ai sauté tout ce qui causait C.
Bon, fini pour la partie sérieuse d'aujourd'hui, à demain !
Oh, et désolé pour le manque de g à la fin des mots, je crois que je suis en train de perdre mon assent :--(.
Donc me revoila tout frais, après une soirée tranquille hier soir, en companie de quelques italiens, vu qu'il faut bien que je bosse un peu (mon italien) pendant cette conf. donc quelques bières, peu de chanve de convaincre 2 adeptes de Rails que Perl est bieng mieux, et au dodo.
http://www.davisworld.org/presentations/handsOnWebServices.pdf est une partie de la présentation.
Et oui, c'est l'année du ouèbe tout poynt ziro, donc je m'intéresse aux technologies de l'an dernier... mais vous inquiétez pas, O'Reilly donne un livre gratuit aux participants, et j'ai choisi "Ajax Hacks".
Il commence par un peu de pub pour sa boite, dont je tairais le nom parce que je suis méchant et rancunier.
Au passage, pour taper les compte-rendus en français sur un clavier US, quelques imap en vi
comme :imap e' é
évitent de taper <CTRL-K> avant... bien pratique, et ça me donne l'impression
de pas avoir perdu mon temps hier. Ca donne juste des trucs un peu bizzare avec le curseur, après
une voyelle il se positionne _devant_ la lettre pendant 1 seconde, mais on s'y habitue. Remapper
<CTRL-N> sur <TAB> est aussi excellent, ça auto-compléte les mots si je les ai déja utilisés
dans le fichier (ça tombe bien, je me repète souvent et j'ai un vocabulaire limité). Je ne peux
plus taper de tabs, mais de toute façon j'aime pas les tabs, et ça sert à rieng en POD.
Maintenant une longue liste d'acronymes... beurk!
Bonne idée, il donne les définitions des acronymes tirées de Wikipedia.
Il commence par SOA : au choix Service-Oriented Architecture, ou Sarbanes-Oxley act (si vous savez pas ce que c'est, vous avez bien de la chance, ou Soldiers of Allah)
http://en.wikipedia.org/wiki/Service-oriented_Architecture
Il parle beaucoup, vite, donc ça va être dur de tout retranscrire, je pense que je vais devoir me limiter à vous donner les liens vers les définitions.
Maintenant on passe à Web Services (WS)
http://en.wikipedia.org/wiki/Web_service
Un truc : un web service n'est pas forcément en XML, le plus important c'est qu'il soit "remote", et "message-oriented". En plus il devrait être "platform-independant", "vendor-neutral" et "internet-based".
Pour l'instant c'est un peu du vent quand même, beaucoup de "c'est super" et pas beaucoup de détails technique.
L<http://en.wikipedia.org/wiki/Ajax_%28programming%29>.
Client/SOA : pour certains c'est l'étape après Ajax. Un gros problème cependant : XSS (cross-site scripting), les requêtes Ajax ne peuvent pas contacter un server dans un domaine différent pour limiter le risque. On pourrait avoir du javascript signé par le site web d'origine, mais ça ne marche pas cross-browser. Donc ça doit être le serveur d'origine qui appelle les autres sites web pour le client. Par exemple on peut avoir un proxy qui gère les appels à différents sites. Là ça commence à devenir intéressant.
http://en.wikipedia.org/wiki/Client/SOA
Donc comme c'est une conférence O'Reilly, il doit maintenant nous causer de Web 2.0
Il demande à la salle : qui a déjà utilisé Mapquest? Toutes les mains se lèvent. Qui à déjà utilisé Google Maps? Pareil. Qui a utilisé Mapquest depuis que Google Maps existe? 3 mains! Web 2.0 - Web : 1 - 0
Mash-ups : pour ceux qui vivent dans une grotte, c'est la combinaison de données venues de plusieurs sources. Exemples http://www.chicagocrime.org/map/.
Au passage, en cherchant autre chose, je tombe sur un catchpa sympa: http://www.hotcaptcha.com/ (pas forcément un truc à voir au boulot)
http://en.wikipedia.org/wiki/SOAP
Avant SOAP il y avait XML-RPC, qui une fois trituré par un commité est devenu SOAP (la trituration à été assez importante !).
http://en.wikipedia.org/wiki/WSDL
SOAP est le format du message, WSDL décrit l'interface du WS.
Il y a plein d'outils pour générer au moins un squelette de code à partir du WSDL... en Java. En Perl je sais pas, les spécialistes peuvent nous dire.
http://en.wikipedia.org/wiki/UDDI
Pas vraiment utilisé, au contraire des 2 précedentes technologies. Ca permet de faire des répertoires de WS, mais en pratique on récupère le WSDL directement, sans passer par une étape intermédiaire.
SOAP avec l'API WS de Google (en béta depuis le dernier millénaire).
Il nous montre le format des messages, requêtes et réponses. Je tape pas assez vite pour retranscrire le tout ! En plus ça cause surtout Java, fait chier.
Il nous montre le résultat de WSDL2Java sur le WSDL de Google. Puis déclare que c'est pas trop joli, donc il préfère utliser l'API fournie par Google, plus pratique.
Je vous passe le code en Java, pour ne pas me faire virer de la liste.
Pause, il est content que tout le monde revienne après le café.
Une remarque du public: pourquoi c'est tot en Java. Il s'excuse et avoue que ses exemples en Perl sont trop horrible pour qu'il les montre en public.
Conclusion sur SOAP : c'est lourd, pas vraiment browser-friendly. Donc on va passer à :
http://en.wikipedia.org/wiki/Representational_State_Transfer
Plus simple (mais il y a quand même une thèse par Roy Fielding dessus (http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm)
Il y a 2 types d'applications REST : pur REST, qui suit les principes développés par Fielding, et "popular REST", en fait tout ce qui est WS mais pas SOAP.
Il explique l'origine du terme "cargo-cult" (http://en.wikipedia.org/wiki/Cargo_cult)
Le principe c'est de faire des requêtes simplement avec une URL et des paramêtres, et de récupérer le résultat en simple XML (ou en fait autre chose, genre JSON). Ce qui est cool c'est qu'en regardant la requête on la comprend. Par contre il faut lire la définition de l'API pour pouvoir l'utiliser, il n'y a pas l'équivalent de WSDL (encore qu'il semble qu'il y ait un projet pour ça).
Un service REST : Yahoo! Ca tombe bien, ça complète bien le service SOAP de Google. Effectivement, sur ce qu'il montre, c'est bien plus simple à utiliser que le WS de Google. Pas besoing de générer le squelette du client, c'est tellement simple qu'il n'y en a pas besoin!
Il demande : "comment rendre ça sûr?" Ben de la même façon qu'on rend un site web sûr: https!
C'est un des avantages de REST : ça réutilise l'infrastructure existante (ceci dit il me semble qu'on peut faire ça aussi avec SOAP).
Un exemple avec l'API REST d'Amazon (Amazon a aussi une API SOAP, mais vraiment c'est plus simple d'utiliser l'API REST).
http://awszone.com présente un peu toutes les possibiltés offertes par Amazon. Je peux pas trop tester le site, la connexion wireless est pas terrible ici (pour une raison à laquelle je n'aurais pas pensé : http://radar.oreilly.com/archives/2006/07/oscon_kicks_off.html#comments), mais le site a l'air assez impressionant : il présente aussi la version SOAP du service, génére du code si on veut... la totale ("really cool stuff" d'après le speaker).
Il fait une erreur en tapant le critère de tri dans une requête, récupère un message d'erreur : avec SOAP il aurait utilisé le WSDL et n'aurait pas eu ce problème (mais bon, s'il avait lu la doc du service REST non plus, et pis les tests devraient révéler l'erreur assez tôt dans le processus de développement).
En fait, pour lui, il n'y a pas vraiment de différence philosophique entre la version SOAP (Google) et la version Yahoo! (REST). L'implémentation est différente, mais le code suit exactement les même principes.
Il rentre dans une discussion sur la différence entre URI et URL. Les vrai RESTeurs (ou RESTafarians) affirment que seule les URIs devraient être utilisées, pas les URL. Il avoue ne pas vraiment être d'accord. J'avoue ne rieng comprendre au débat ! Donc j'en profite pour aller faire un tour sur le site de la Gazzeta dello Sport pour voir le résultat de l'appel des clubs punis... Zut, ça sera dans demi-heure, donc je retourne à mon compte-rendu, vous avez de la chance.
Je vois qu'il recommande de jeter un oeil à http://www.xml.com/pub/a/2004/12/01/restful-web.html (et aux autres articles du même auteur (http://xml.com/pub/at/34).
Une des forces du "popular REST" est qu'en utilisant GET, ça permet de bookmarker facilement le résultat d'une requête. Bien sûr ça limite aussi la taille des donnés passées entre le client et le serveur. Il n'y a pas de règles qui force à utiliser GET, mais c'est recommendé pour respecter l'esprit REST.
Un peu de Google maps (obligé non ?). Il nous montre le lien généré par le bouton "link to this page". Ca montre bien l'interêt de REST, qui permet de retrouver facilement les choses, en donnant une URL à tous les résultats renvoyés par un service.
Par exemple je suis là : http://maps.google.com/maps?f=q&hl=en&ie=UTF8&t=k&om=1&ll=45.529508,-122.663008&spn=0.001853,0.003573
Atom suit aussi les principes REST (et au passage, je trouve Atom bien mieux fait que RSS, c'est plus logique, ça permet de mettre à peu près tout ce que je veux dans le feed... recommandé !)
Le principal avantage de JSON, c'est que ça n'est pas XML ! ("we don't need no stinkin' XML") C'est dur de parser du XML en Javascript, tandis que JSON ça se charge hyper facilement en Javascript dans le client. Malgré mon (lourd !) passé XMLien, je dois dire que je suis complètement d'accord. Tiens, je savais pas que JSON est un sous-ensemble de YAML.
json.org pour plus d'info. En perl on a JSON et JSON::Syck (parce que "JSON is YAML")
Un dernier acronyme pour nous achever, mais je saisis pas ce que ça veut dire : le E est pour "Enterprise", donc mon cerveau se déconnecte automatiquement, désolé.
C'est fini, c'était pas mal en fait, des fois d'un peu trop haut niveau, et un peu marketing parfois, mais c'était un bon tour d'horizon quanf même.
Bon, je vais devoir aller manger sans savoir ce qui se passe en Italie... je pense que je survivrai quand même.
A plus.
Il recommence avec sa pub au début du cours.
Il commence par expliquer en quoi Google maps est important : l'utilisation de Javascript et CSS pour une application complètement nouvelle, et impossible à faire sans ça. En plus il n'y a pas besoin de plug-in pour s'en servir.
En plus Google a publié une API pour Google maps.
Les limitations du service : c'est gratuit, mais pas libre. L'utilisateur DOIT utiliser l'API fournit par Google.
2 frameworks pour faire la même chose: MapBuilder (http://mapbuilder.sourceforge.net/) et OpenLayers (http://www.openlayers.org)
Donc attaquons la partie pratique : créons notre propre appli !
Le code est disponible pour les participants au cours, il sera disponible pour le public dès que le livre qu'il est en train d'écrire sera publié. Donc vous n'aurez pas le code aujourd'hui, juste la description de la démarche qu'il utilise.
Version 1 : d'abord on crée une image avec des "tiles", dans une table, 3 lignes, 4 colonnes.
Version 2 : il crée 2 div
s autour de la table: une qui définit la table entière, et une qui définit la partie
affichée de la table. Il utilise CSS pour que la partie affichée soit plus petite que la table entière.
Version 3-5 : Il commence à écrire le js qui fait bouger la table entière. Du coup la table affichèe montre une autre partie de la table. Il assigne ça au drag-n-drop de la souris (entre mouseDown et MouseUp il "dragge"). Il utilise prototype (librairie javascript).
Un truc qui me plaît : dans son script il écrit Event.observe( window, 'load', myscript, false);
au lieu de mettre le script
dans l'attribut onload
du tag body
. Je débute en js, et c'est le genre d'info que j'apprécie (je sais pas si
c'est spécifique à prototype ou si ça marche de base en js, j'essaierai plus tard). Le false
empêche l'évênement de "bubbler".
Version 6 : il ajoute un peu de code pour empêcher l'utilisateur de dragger trop loin, pour bloquer le déplacement de la table entière.
Version 7-8 : Il se débarasse de la table, et commence à faire des calculs (semi-)sophistiqués pour savoir quelles sont les lignes/colonnes affichées et ajuster le positionnement de la carte entière avec CSS, puis il télécharge les images (toujours de fausses images à lui.
Bon, en fait ce tutorial me fait quand même un peu chier. Ce genre d'exercice, pour moi, ça marche si c'est un TP. Mais suivre un mec qui explique son code au podium pendant 3 heures, ça commence à me fatiguer. Donc je suis pas sûr de rentrer aprés la pause...
Ma conclusion perso sur ces 2 cours est que Web Services ou Google maps ou Ajax bidule... au bout d'un moment, c'est plus la peine de lire des papiers ou d'aller à des cours, il faut se poser devant le clavier et JFDI ("Just Fucking Do It!").
Doc... ce soir il y a la soirée MySQL au bar d'un des hotels de la conf, puis le State of The Onion de Larry Wall, donc c'est l'heure d'aller faire la sieste et de prendre des forces.
Ciao
Après la réception MySQL dans un hôtel pas loin, retour au centre de la conférence pour la session du soir. Je passe sur les remises de prix, vu qu'encore une fois j'en ai pas eu.
Le State of the Onion de Larry était centré sur la famille. Il décrit Perl comme son enfant. Comme Perl approche les 20 ans, c'est le moment de la dernière phase de croissance, et grâce à la grande famille qu'est la communauté Perl, il pense qu'elle (Perl) a été bien éduquée.
A la fin, Nat en conclut que maintenant il comprend tout : Perl couche ! ("Perl got laid!"), avec Haskell par exemple.
Ensuite un talk intéressant de Kathie Sierra, d'O'Reilly, sur "comment créer des utilisateurs passionnés". Quelques points dont je me rappelle : il faut s'adresser non seulement à l'intellect (mind) mais aussi au cerveau profond (brain) (je connais pas les termes exact, si on a un psychologue dans le coing il me corrigera), en jouant sur les émotions "primitives". Si je trouve la présentation sur le web je vous passerai l'url, parce qu'il y avait vraiment beaucoup de points qui m'ont semblés pertinents.
Finalement une pièce de Damian Conway "DaVinci Codebase", une histoire policière (avec l'obligatoire minette française) assez impossible à retranscrire, mais bien marrante, qui finit par un clip sur les MP3 libres.
Après retour à l'hôtel et dodo. Comme le Dr Nicholas Clark (dont j'espère que pour une fois je n'écorche pas le nom, Hi Nick!) remarquait, cette année il manque un point central pour rencontrer des gens. Le soir le centre de conf est désert, et les participants sont éparpillés dans pleins d'hôtels, pas tous tout près. En plus le lobby est tout petit, donc passer dans la chambre poser le sac et redescendre pour tomber sur des gens au hasard ne marche pas. Dommage.
Au passage je remercie Eric Cholet pour son soutien moral (il consulte son mail à côté de moi).
Tim O'Reilly nous cause.
5 idées sur l'Open Source (en anglais parce que ça va vite, commentaire d'Eric: "blah blah blah"):
Quelques notes au passage: pour lui, avec les nouvelles architectures basées sur le réseau, toutes les licenses libres sont dépassées. Du code sur un serveur distant n'est pas soumis à la license GNU par exemple.
Une nouvelle tendance pour les projets Open-Source: les Frameworks, qui commencent comme applications propriétaires, d'oû est extrait ensuite une partie générique qui est Open-Sourcée (Ruby on Rails, Django...)
Regarder movemydata.org
http://radar.oreilly.com/archives/2006/07/four_big_ideas_about_open_sour.html développe ces idées.
Puis un gars de greenplum, qui sponsorise la conférence, nous compare l'Open-Source et le Rock'n Roll.
C'est assez rigolo, un point qu'il développe : keep it real. Le but n'est pas forcément de récupérer pleing de pognon, et d'essayer d'être le projet le plus téléchargé au monde, mais de rester fidèle à nous-mêmes, à être dangereux, au sens de révolutionnaire.
Puis Anil Dash, de Six Apart (Movable Type), nous cause de "Making Web 2.0 Mean Something", également intitulé "Trying to Suck Less". C'est pas hyper-passionant, il nous montre les trucs OS que sa boîte fait. Ca rappelle le talk de Tim plus haut, au sens que ce sont des trucs que Six Apart a développé pour leur produit, puis Open-Sourcé un fois stable et working like crazy. On peut les récupérer chez Six Apart (un balanceur de charge, un serveur Jabber...).
Pour finir : interview du fondateur de Sleepycat (Berkeley DB), récemment acquis par Oracle. Il parle des relations entre Oracle et Sleepycat (et ses 25 employés). Il souligne que Oracle a une longue tradition d'aider des projets OS, quoique ça ne se sache pas trop (Linux, Perl...). Il reste très politiquement correct, dit que Oracle n'a pas de problème avec MySQL ou PostgreSQL. Il insiste sur le fait que one size doesn't fit all : différents SGBD sont adaptés a différents problèmes (sur O'Reilly Radar il y avait une série de posts de Tim O'Reilly sur le fait que pas mal de gros, en fait énormes, projets n'utilisent pas de SGBD, et pourquoi (http://radar.oreilly.com/archives/2006/04/web_20_and_databases_part_1_se.html).
Donc pour résumer, les keynotes c'est super énervant : la plupart du temps elles sont pas terrible, mais de temps en temp il y en a une géniale. En général le jour oû je n'y vais pas ;--(
Ensuite un petit tour a l'exposition. Je récupère un T-Shirt du labo Open-Source de Microsoft, portant l'inscription Reports of Snowballs Seen in Hell. Pour me rattraper j'achète un T-Shirt Firefox, et je renouvelle mon inscription à l'EFF. Je me sens moins sale.
Le sujet a été bien couvert dans d'autres compte-rendus, donc juste les points saillants (surtout que j'ai raté le début pendant que gozer essayait de me convaincre d'utiliser komodo, qui effectivement semble pas mal comme debugger).
Une regexp est juste un autre type de fonction. C'est plus facile pour les autres langages où les regexps ne sont pas intégrées à la syntaxe de base.
Pour sortir des messages d'erreur :
rule if_statement { if [ <expression> | <die: Expression expected> ] [ then | <die: then expected> ] [ <block> | <die: Block expected> ] }
Il montre la grammaire de bc
. J'aime bien la définition de la précédence en utilisant
is_looser( '<autre_opérateur
')> (ou is_equiv
): c'est facile et maintenable, et
en fait c'est comme ça que notre cerveau fonctionne (on peut aussi utiliser un nombre qui
donne le niveau de précédence).
On jète aussi un coup d'oeil aux grammaires de Perl6 et de APL (pour les plus vieux d'entre vous, il faut une fonte unicode pour pouvoir l'afficher bien sûr, créée à partir d'une photocopie d'un manuel APL de 1975). D'après lui il est très facile, et rapide d'écrire des parseurs avec PGE.
Pour lui Perl6 est vraiment facile à parser avec PGE, et Larry, Damian et les autres ont fait un boulot génial.
Peter Scott est l'auteur de Perl Medic et Perl Debugged, 2 excellent livres, donc ça vaut le coup de voir ça (et pour une fois je suis même à l'heure, et ça laisse le temps à Damian de s'excuser pour la façon dont il a maltraité les français hier).
Il annonce qu'il ne va pas vraiment parler de sujets techniques, mais plutôt de sujets comme les relations avec d'autres développeurs, et des citations de développeurs célèbres.
Il commence par se demander pourquoi il a fallu tant de temps pour qu'on commence à écrire les tests avant le code. We are now smart enough to realize that we are not smart enough to write tests after the code.
Il explique que nous avons tous différentes personnalités, suivant les moments, qui ont différentes forces, faiblesses, buts. Il nus faut apprendre à les écouter, à les connaître et à travailler avec elles.
Quelques exemples:
Intervient quand on lit du code. Assez primitif, c'est pour ça que les variables doivent être déclarées localement, les fonctions doivent être courtes...
Le module Smart::Comments, qui met des instructions de debug en commentaires, ce qui fait qu'elles sont assez différentes du code pour qu'on ne les voit plus.
Veut juste coder, déteste conception, docs, planning, réunions, travail en équipe...
On a tous ces différents types en nous, arriver à les intégrer nous rend meilleurs programmeurs.
Arriver à les intégrer toutes permet de. Historiquement les programmeurs étaient plutôt de type "Glory Hunter" dominant. Maintenant l'aspect bon samaritain est plus mis en valeur. Ce qui au passage satisfait aussi souvent le Glory Hunter.
Par exemple module-starter pour commencer à écrire un module
Nos croyances (beliefs) commandent nos attitudes (je sais pas traduire), qui commandent nos comportements. Mais également nos comportement peuvent modifier nos croyances. Ca s'appelle la discipline. Apparement ça marche ;--) Imaginer le résultat d'un comportement qu'on veut adopter nous aide à l'adopter.
Même si on y croit pas au départ, des comportements comme être clair, précis, suivre les méthodologies appropriées (contrôle de version...) améliorent notre code.
Il veut lancer un projet pour compiler des citations et idées de bon codeurs.
En vrac, sans attribution, pas le temps, et avec des trous :
Apprendre, être curieux, essayer avant de demander de l'aide sont des thêmes récurrents.
Au final une présentation intéressante, mais, comme promis, pas très technique.
Ingy, Hello, my name is Ingi döt Net, avec un très joli mohawk, commence la présentation (?) au son de Rock'nRoll, commence à se déshabiller. Chemise, tee shirt, pantalon... Le public lance des billets. Le caleçon descend.
Comme promis, Nothing but Ingi döt Net!
Il va se rhabiller... What the fuck was that?
Il rappelle la phrase de Nat hier : Perl finally got laid, et rapelle que ça a commencé en 2001, avec
la série des Inline::*
: Perl s'est tapé tous les langages.
Mais récemment Ingy a plutôt fait du Javascript (comme tout le monde ?).
Il adore JSON, et en Perl JSON::Syck (rapellons que JSON est un sous-ensemble de YAML).
L'intérêt c'est qu'il peut passer des données, quelques soient leur taille, de Perl a js d'une seule ligne de Perl et une de js.
Pour se faciliter la vie, il a écrit Jemplate : tout le Template::Toolkit (le core) porté en js. Donc maintenant on peut utiliser les mêmes templates en Perl et en js. Le fichier Jemplate.js fait un peu plus de 100 lignes (et bien sûr est caché par le browser).
Il nous montre un bout de code. Effectivement les templates se ressemblent beaucoup (ceux en js ont besoin de charger).
Quelqu'un dans le public proteste contre l'utilisation de innerHTML
, disant que ça va être "deprecated".
Ingy répond qu'il attendra de voir la fonction enlevée des js des browsers avant de la remplacer dans son code.
Je veux rester poli, mais innerHTML est quand même bieng pratique, et fuck les intégristes qui veulent nous
forcer à faire du DOM sans raison.
Apparement tout le monde déteste la base de beaucoup de ses modules : Spiffy.
Alors, doit-il admettre sa défaite, ou pousser l'insanité plus loin et confondre ses détracteurs ?
Connaissant Ingy, il n'y a pas beaucoup de suspense sur la réponse.
D'où orz.pm, sur CPAN, (orz: http://www.boingboing.net/2005/02/07/all_about_orz.html).
Il se sert
d'une vieille fonction de Perl, qui, quand il charge un module, cherche un fichier .pmc
avant de
chercher un .pm
(un reste de vieilles expérimentations avec le compilateur Perl). Donc vous l'avez
deviné, Ingy applique une transformation à un module, typiquement un filtre, et stocke le résultat dans
un fichier .pmc
. En fait, ça marche même avec perl -c <fichier>
.
Ah ah !
Ca permet des trucs sympa : on peut donc utiliser les modules perl v6 sans avoir pugs installé, vu qu'on se sert des versions compilées de ces modules.
Ca a l'air kewl. Dans XML::Twig, pour prendre un exemple au hasard, j'ai effectivement une phase de pré-compilation du module, pour laquelle je pourrais utiliser Module::Compile (si je ne voulais pas être toujours compatible avec perl 5.004).
Je me rends compte que je n'ai rien compris au rapport entre Module::Compile et orz, mais bon, faudra que je creuse.
Filter::Simple::Compile peut remplacer Filter::Compile et génère le .pmc
(qu'on peut aller vérifier).
Donc Ingy a encore été occupé cette année.
Miyagawa est l'auteur de XML::Liberal, que je pense intégrer avec XML::Twig, donc ça m'intéresse de voir ce qu'il a à raconter.
Plagger est un aggregateur de RSS/Atom "pluggable".
Il n'arrête pas d'écrire des bouts de code qui triturent du rss (rss2ipod, rss2audiobook, bloglines2gmail). D'autres on écrit rss2atom, rss2pdf, rss2gmail, rss2imap, svn2rss, ebay2rss...
Il en a marre de réecrire sans arrêt le même genre de code, avec les inévitables copier-coller, les difficultés pour maintenir toutes ces versions. Donc il a décidé de créer une platform thingy : plagger, pour faire du <truc> 2 <machin> où truc ou machin est rss ou atom ou opml. Ça marche sur le principe des pipes unix, avec des modules pour lire, transformer et écrire différents formats, et on peut bien sûr enchaîner les plugins. On programme le système par un fichier de config en YAML.
Le tout est assez sophistiqué, avec découverte automatique des feeds, XML::Feed est utilisé pour lire les feeds, et supporte RSS (toutes versions) et Atom, il peut utiliser les cookies du browser (IE/Safari/Firefox), peut faire du screen-scrapping...
Plus de 100 plugins sont disponibles, divisés en plusieurs types (par phases du process de transformation), extraits :
Il nous montre comment il archive ses feeds sur son compte gmail : les mails pour chaque feed se retrouvent dans la même thread ils sont taggés (plagger) donc il peut les chercher très facilement, et en plus il a configuré pour les archiver dans un répertoire séparé.
Il a aussi un bot qui l'informe des feeds mis-à-jour sur IRC.
Plaggnet lui est sa réponse à planet (écrit en Python): il aggrège une série de feed et les filtre par mot-clefs. Vous pouvez le voir en action à http://oscon2006.plagger.org/ (et en plus il peut utiliser les fichiers de config de planet, donc switcher est très facile!).
Enfin, en 8 lignes de config, il crée un moteur de recherche de blogs, utilisant Subscription::PingServer, Aggregator::Xango et Search::Estraier.
Les configs qu'il nous montre sont effectivement très simple.
Bien cool!
Au rayon, pas si cool : la doc n'est pas super, Plagger dépends de 73 modules, pour l'installer il faut vraiment charger la version du repository de subversion (sinon, par CPAN, il ne crée pas tous les répertoires nécessaire).
Mais bon, c'est Open Source, donc tout le monde peut se mettre à l'améliorer. Dans le futur il veut ajouter des back-end DB, un meilleur support pour le contenu multimedia, support pour les calendriers...
Un excellent talk, je pense que je vais jouer avec ça quand je rentre à la maison.
Et oui, c'est l'heure de mon chemin de croix (quasi) annuel. L'heure et demi passée à tapoter fiévreusement pour essayer de suivre le rythme effréné des présentations.
D'abord MJD s'excuse pour le fait que les LT, qui auraient du être informels et sans pression, ont tournée à la grande foire. Donc cette année pas de gong, mais quand même avec des vedettes.
La prochaine OSCON devrait être près d'une chute d'eau (waterfall, le modèle de développement), et sur Ruby on Snails. Bon, c'est presque tout des vannes, facile à transcrire ;--( Elle propose de convertir les codeurs Perl à Ruby en enlevant les touches $ et ; du clavier. Mais elle nous monter un bout de code écrit en perl juste avec des fonctions et des espaces, sans aucune ponctuation!
Puis un javascript qui convertit un texte en code perl sans ponctuation: ppencode !
Bien sur elle nous montre la réponse des ruby-ers, qui convertit un texte en code perl sans lettres !
Apparement les pythoniste n'ont pas encore fini leur version.
Sans slides c'est dur pour moi de vraiment suivre. Il semble qu'il décrive un système qui émule un système sur un autre, pour que ses utilisateurs n'aient pas à s'adapter au nouveau système.
Je crois.
Il s'en servent pour distribuer des bouts de codes génétiques dans le domaine public pour éviter qu'ils ne soient brevétés.
Je crois.
Il avait envoyé pleins de propositions, et comme 2 seulement ont été retenues, il va nous parler de toutes celles qui ont été rejetées.
ack
remplace grep
: fait -r par default, utilise les regexps de perl, color-code les résultats, ignore les fichiers CVS,
permet d'inclure/exclure des fichiers par type (par langage)
Qui suit religieusement "Perl Best Practices"? 3 mains se lévent. Ah ah!
Il recommende Perl::Critic qui est extrêmement configurable et extensible (les siennes sont dans Perl::Critic::Bangs)
C'est le plus important pour le futur de Perl. Tout le monde pense que Perl est sur le déclin parce que Perl6 traîne. Donc il organise les volontaires pour participer, même si on n'est pas très fort (genre nettoyer la doc, passer lint sur le C de Parrot...)
Pour lui, social networking ça n'est pas Orkut, LiveJournal... c'est email, aim, IRC, le téléphone (il donne son numéro), la conf ici
Son téléphone sonne !
Encore !
Perl::Critic est le premier module de son auteur. Il utilise PPI, qui parse le code Perl sans l'exécuter.
Quand on lance l'utilitaire pcritic
, inclus dans la distribution, il...
se plaint ! Beaucoup !
Il a un switch pour la sévérité des erreurs qu'il détecte (commencer à 5 et descendre ensuite vers 1).
Chaque règle du PBP est implémentée dans un module séparé.
Dans le code on peut mettre des commentaires comme ## no critic pour éviter les plaintes abusives.
On peut aussi utiliser un fichier .perlcriticrc
Test::Perl::Critic
peut aussi être utilisé.
Un update sur un LT qu'il a donné l'an dernier.
Il pense que ça serait pas mal si au lieu de recevoir les mails sur notre serveur, on allait chercher les mails sur le serveur de l'expéditeur. A la RSS par exemple.
Donc en avril, il a organisé un hackaton avec quelques autres anti-spammeurs.
Questions : quand "poller" ? Il envoie une notification par UDP
Question : qui "poller" ? longue réponse, désolé.
C'est Email 2.0 !
2 minutes pour arriver à taper l'URL de... sa home page.
Le micro est super fort il est content.
XML extension pour awk ! Méga Cool !
Pour moi ça ressemble à PYX (jetez un oeil à XML::PYX). En plus pour grepper du XML il y a
xml_grep
(distribué avec... XML::Twig) ou xml_grep2
(basé sur XML::LibXML et libxml2),
disponible à http://xmltwig.com/tool/.
Ceci dit son projet a l'air assez complet.
Sous-titré So you think that Perl isn't appropriate for the enterprise?
Whitepages.com est le moteur utilisé pour la recherche de personnes par msn.com, 411.com et d'autres. Ils ont 10 millions de recherches par jour, jusqu'à 2500 hits par seconde. C'est tout en Perl et un peu de XSLT. Il nous montre le schéma de leur application, assez complexe, qui servent une requête en 1/3s en moyenne. Ils utilisent juste 40 serveurs pour tout ça.
Comme chacun sait il est fan de baseball (http://bumppo.net/lists/macperl/1999/07/msg00113.html). Donc il génère ses fiches de score en Perl (un truc imbitable, qui permet de retranscrire exactement ce qui s'est passé pendant une partie).
Bien sûr il nous montre la feuille du dernier match des World Series de 2004 (gagnée par les Red Sox).
Zut, j'ai raté le nom du module... je suis pas sûr que ça intéresse trop de monde de l'autre côté de l'océan.
Unne bonne douzaine d'acteurs, pour illustrer le processus d'installation d'un module.
Bieng sur l'utilisatrice veut un module de templating, donc ça se bat un peu. Les tests ne passent pas,
c'est le souk. Le développeur patche, make
grogne, les tests volent sur la
scène et chantent...
Finalement le module s'installe... mais l'utilisatrice en fait en voulait un
autre... et ça recommence au début.
Il nous prévient : pas de blagues dans son LT. Mais une (trés courte) vidéo de sa fille de 8 mois.
Les interfaces pour Java, C#, VB... suxent aussi, mais elles ont plus de fonctionnalités.
Les interfaces de Perl/Python/Tcl/Ruby... sont toutes légèrement differentes, les efforts sont dupliqués...
La solution : avoir un unique driver, une unique API, écrite pour Parrot. Quelle API choisir ? JDBC! Il dit bien l'API : elle est connue, stable. Les couches au-dessus pourront être différentes, mais la couche de base (correspondant à la couche DBD::*) sera JDBC. Il a déjà écrit JDBC.pm (avec Inline::Java). La v2 de l'API de DBI suivra, une fois que les problèmes d'"impedance mismatch" entre JDBC et DBI ne seront plus apparents.
Pas bête !
Uh?
Ca commence par ne scène des Blues Brothers (celle où James Brown chante à l'église du titre).
Il proteste contre les catégorisations de langages de programmation.
Perl a tout, objets, closures, phase de compilation (comme java, juste plus rapide), tout quoi... frameworks, plus de frameworks
Ca finit en prêche (à la James Brown)
Il n'utilise jamais print dans tous les programmes qu'il écrit (en général de l'admin système) mais plutôt Log::Dispatch. Après il peut envoyer les sorties où il veut, suivant les cas : moniteur, fichier, log, email...
Encore un! Je crois que je vais vous passer les détails, si vous contactez Uri je suis sûr qu'il sera ravi de vous expliquer tout ça.
Pas encore un module (*DEITE* merci!)
Il explique pourquoi tant de langages sont implémentés sur Parrot (au moins il y a des tentatives d'implémentations) et que c'est bien pour Parrot.
Mais le but de son LT est de nous montrer un peu d'APL, le dernier langage implémenté sur Parrot.
http://en.wikipedia.org/wiki/APL_programming_language vous fera peur si vous ne connaissez pas. C'est un langage ou le _code_ est en unicode, mais pas les données. Au passage ça les a fait progresser pas mal sur l'aspect unicode de Parrot.
Un schéma qui décrit les différentes parties de Perl6/Parrot/Pugs/Ponie, les différentes possibiltés de compilations de Perl6 (sur Parrot Javascript Haskell et Perl5).
C'est pleing de diagrammes UML et tout, je crois qu'en voyant ça je comprends encore moins qu'avant! Il faudra que je regarde ça de plus près si je le trouve. Quelqu'un a l'url?
Bon, aprés ça je suis épuisé, je vous laisse,
Mercredi soir était la traditionelle soirée p5p dans la chambre (ou plutôt suite) de Nat. Traditionnellement, bien que n'étant pas sur p5p, j'assiste à la soirée.
C'est vraiment un des aspects d'OSCON que j'aime: je ne cause quasiment pas de Perl, mais j'ai droit à une description de zimbra et de leurs buts (virer Outlook), de openId, une comparaison de divers téléphones portables, je tire sur le hookah de Josh, je vois mon premier canadien en colère, c'est une canadienne, et j'admire Portland la nuit (si j'avais porté le chargeur de la batterie de mon appareil photo vous auriez une photo :--( heureusement, flickr à la rescousse: http://www.flickr.com/photos/80818705@N00/197831169/
Je me lève un peu en retard, et je rate (comme d'hab apparement!) une bonne partie des keynotes.
J'arrive à la fin du talk de Robert "r0ml" Leibowitz, qui avait l'air bien rigolo, comparant Open Source au légumes, et combien de légumes est bon pour la santé (RMS est bien sûr un végétarien).
Par le gars qui fait SQLite, mon SGBD favori (parce que mon sysadmin est nul, c'est moi!). Il devrait savoir de quoi il parle!
Pour lui ill faut penser à SQL comme à un langage de programmation, simplement il décrit ce que l'on veut, pas comment le récupérer. Chaque instruction SQL est une fonction.
Il montre un peu de pseudo-code, qui implémenterait une requête typique. Puis 3 autres versions, en ajoutant des index à lalgorithme. Juste pour nous montrer que même une simple requête peut être traduite de pas mal de façon.
Une requête un peu plus compliquée (waouh! l'auto-complétion de vi marche super bieng, c'est un vrai plaisir que de taper req<TAB>). Est-ce que ça serait facile d'écrire le code?
Son talk va surtotu porter sur cette phase, sur la compilation de la requête. Pas sur la machine virtuelle et le systême de stockage.
Différents moteurs génèrent différents formats: MySQL, PostgreSQL génèrent une structure de donnée (un arbre), SQLite génère du bytecode, d'autres génèrent même directement de l'assembleur. Ca n'est pas important, ce qui est important ce sont les principes utilisés.
Donc il nous montre la structure d'une table: chaque ligne a un id, des champs, et l'addresse oû le record est stocké. Puis la structure d'un index (valeur de l'index, qui peut être réparti sur plusierus colonnes, et addresse du record).
Pour l'instant c'est pas d'un très haut niveau. Les questions sont intéressantes néanmoins, Monty de MySQL et des gens de PostgreSQL sont dans le public et participent à la discussion.
Par exemple si on a une requête sur un champ qui est le second de l'index, PostgreSQL et Oracle (et dans le futur MySQL) peuvent quand même utiliser l'index. C'est surtout interessant si par example le premier champ de l'index n'a que peu de valeurs: le moteur doit faire autant de recherches que le nombre de valeurs dans ce champ, mais ça peut quand même être plus efficace que de balayer toute la table.
Si une requête ne doit retourner que des champs de l'index, le systême n'a même pas à lire la table, donc ça peut être intéressant d'avoir les champs les plus utilisés directement dans l'index. Sa recommendation: créer des index avec d'abord les termes du WHERE, puis ceux du ORDER BY, puis ceux qui sont retournés (pas en PostgreSQL qui va lire la table quoi qu'il arrive).
Il nous montre comment un OUTER JOIN marche. L'ordre des tables est vraiment significatif. Le SGBD optimise l'ordre bien sûr, mais avec beaucoup de tables le nombre de combinaisons explose. Alors comment le SGBD choisit-il? Il doit s'arrêter, plus de temps! ARRRRGGGHHHH!
Un bon talk au final, grâce au fait que Richard Hipp fait vraiment participer le public. La présentation sera bientôt en ligne.
Il recommende d'utiliser perltidy sur le code. Ca évite de s'engueuler sur le format du code.
Code is always read more time that it is written : le public (target audience) du code n'est pas l'auteur 20 minute après l'avoir écrit. Son truc: il imagine toujours qu'il va devoir lire le code 1 an plus tard, à 2 heures du mat, aprés avoir été réveillé par un coup de fil de son boss qui hurle au bout du fil.
Ses principes de base:
tie
d variables...)
Il a un exemple ou il dit que s/foo/far/
est mieux que s{foo}{bar}
(je ne suis absolument pas d'accord,
j'utilise _toujours_ la deuxième syntaxe)
Il n'utilise _jamais_ les formats, les variables de ponctuations, les fonctions import qui n'importent pas
(genre use Catalyst qw/-Debug/;
), la vieille syntaxe d'appel des méthodes (new Class
), ajouter des
méthodes à UNIVERSAL, re-blesser des objets existants, filtre source, use constant
.
Il recommende aussi de s'en tenir aux objets basés sur des hash (curieux... tiens au passage je jette un oeil à Moose http://search.cpan.org/dist/Moose/ qui à l'air sympa).
Il essaye d'éviter: DESTROY
, AUTOLOAD
, wantarray
(je suis etie`rement d'accord avec celui là, je suis
pas assez fort pour toujours réaliser dans quel contexte j'appelle une fonction (si j'y pense).
Il évite de trop utiliser les closures, string eval
, sub attributes, coderefs, fonctions exportées par un
package (il préfère utiliser des classes), map/grep
enchaînés, opérateur ternaire (? :) pour lui c'est
juste un if/else plus court (Damian intervient pour dire que l'intérêt est que ça force à avoir un else).
Questions (de lui):
Est ce que ça rend la programmation chiante? Pour lui non, ça permet de se concentrer sur le niveau plus général, on peut s'amuser lors de la conception.
Mais AUTOLOAD est super-cool (awesome)! Ouaip, mais pas forcément dans un gros projet.
Pourquoi ne pas utiliser Java? Qui a laissé rentrer ce gars dans la salle?
A part le code: penser au contrôle de conf, utiliser les branches dans le systême de versionnement, écrire des tests.
Un talk un peu bizarre, qui me semble un peu "Perl Best Practices 2001". Il refuse pas mal des récents développements dans et autour du langage.
Et oui, c'est le talk annuel sur l'état de Perl6, pour la quoi, cinquième année consécutive.
A noter que pendant ce temps Eric et tous les contributeurs à mod_perl assistent au talk de Doug MacEachern, qui fait son grand retour aprés quelques années d'absence. Il semblent qu'ils ont préparé tout le marériel pour jouer les parfaits groupies. Si vous insistez un peu, et s'il a récupéré du repas de midi qui, scandaleusement, ne comprenait pas de confit de canard, Eric vous racontera peut-être tout ça.
Larry commence par nous faire un chameau (ok, un dromadaire) en ombres chinoises sur l'écran.
Damian pense que boulot sur la conception du coeur de Perl6 est quasiment finit. Il vont parler uniquement de cet aspect, pas de l'implémentation.
Au départ le design du langage etait annoyance-driven: répondre aux RFC, qui décrivaient pour la plupart les aspects de Perl5 qe les gens n'aimaient pas. Ensuite, vint la phase oû ils ont tenté de fondre tout ça dans un ensemble cohérent, d'extraire les concepts de base qui sous-tendraient Perl6. Maintenant le design est plus basé sur les implémentations. Ce sont plus des modifications mineures, sur des problèmes révélés par pugs par exemple.
Donc une liste de nouveautés dans le langage, principalement destinées a le rendre plus agréable à utiliser. Ca va vite, donc les titres vont pas forcément être traduits.
Exemples:
my $sub= sub { return "foo"; } # pas besoin de mettre un ; à la fin de la ligne
A tribute to python
repeat { ... } while condition(); repeat while condition() { ... }
A tribute to Pascal
!< ou !> ou !~~ ...
key => $value
peut aussi être écrit
:key($value)
avec pleins de ruses: on a pas besoin de virgules :key
est équivalent à key(1)
, :!key
est :key(0),
key<Damian
>> est key("Damian")
key<<Damian is $old>>
est key( "Damian is $old")
, et
:$age
est age($age)
(marche aussi avec tableaux et hash.
Une liste d'arguments, sans fonction: \($obj: $pos, $pos2, :opt2)
, qui est un vrai objet
my @range= $ok ..^ $trop_grand; # ^ marche avant, aprés ou avant et aprés le .. my@range = $min..$max :by(2); for ^4 { ... } # parcourt la boucle 4 fois
my $i=03; # n'est plus un nombre octal my $i= 0o05; # octal my $i= 2<101001>; # toute base est autorisée
On peut aussi mettre des fractions
Le sigil est *
my @endlessly_true = "true" xx * @positives = 1 .. *; # 1 .. infini @numbers= *..*; my( *, $file, *, $name)= func( $arg); # * au lieu de undef
indices séparés par des ;
Conclusion: on y est presque!
Un bon talk sur le design des UI pour le web. Malheureusement c'était complet et j'étais en dehors de la salle.
La présentation devrait être a http://www.slash7.com
Il va présenter 2 modules: List::Maker (http://search.cpan.org/dist/List-Maker) et Contextual::Return (http://search.cpan.org/dist/Contextual-Return)
Quelques exemples où l'utilisation des tableaux (ou listes) en Perl, n'est pas complètement naturelle. Bien sûr Perl 6 a des solutions pour tous ces cas.
Mais en attendant... List::Maker
En surchargeant la notation pour les file globing (< ... >) il offre la syntaxe de Perl 6 pour des listes... en Perl 5.
Plus quelques extras:@list= <4d6>;
jette 4 d6 et retourne la liste (en contexte scalaire ça
retourne le total des 4 jets).
On peut étendre la syntaxe pour ajouter ses propre délires. La seule limitation est que les 2 crochets
doivent être sur la même ligne.
Le module est sur CPAN, mais ne semble pas faire tout ça encore, il promet de poster une version complète dans les jours qui viennent.
Curieusement, Ingy et Audrey on aussi surchargé < ... > pour XML::Literal (http://search.cpan.org/dist/XML-Literal), qui semble aussi diabolique.
J'en ai déjà parle à l'occasion du tutorial sur les API, donc je vais pas trop insister.
Je suis pas sûr que ça soit vraiment utile en fait. C'est un peu trop rusé pour moi. Ca revient à avoir plusieurs fonctions différentes... mais avec le même nom. Donc ça veut dire qu'il faut se rappeler de ce que fait la fonction dans chaque contexte, sans que le nom ne soit une aide.
Uri (Guttman), officie à la vente aux enchères traditionelle de la Perl Foundation. C'est bien plus calme que celles de YAPC::Europe, des livres, pas de trucs stupides, c'est plié en 40 mn. =head1 Jeudi Soir
Ce soir petit repas dans un bar à vin, ou nous apprécions le magnifique slogan des tee-shirts de Best Practical (http://www.flickr.com/photos/mirod/200428767/), puis soirée Six Apart, ou j'utilise tout mon Japonais (en 20s), apprends qu'avec MySQL préparer les statements en fait diminue les performances dans beaucoup de cas (si on lit toujours les mêmes choses, le fait que la requête soit préparée invalide la mise en cache de résultats), que PostgreSQL est mieux que MySQL pour les données géographiques... entre autres.
On rigole bien de l'histoire d'un pauvre dévelopeur dont la boîte a été rachetée par une énorme boîte, qui veut leur imposer un langage différent de celui qu'ils utilisent habituellement et qui leur va trè bieng. On rigole parce que sa boite fait du Java, et qu'ils ont été rachetés par TicketMaster qui est à fond Perl. Ca change du schéma habituel. En plus le povre garçon ne reconnaît pas Nat, qui pourtant est sur scène tous les matins en tant que chair de la conf), ça fait bien rire les perleurs, nombreux à descendre les bières sixapartiennes.
Finalement vers 2 heures j'en ai marre qu'on se moque de ma françaiserie, en plus l'occupant de la suite nous mets dehors, donc au dodo.
Je me lève tard (cf plus haut), mais j'arrive juste à temps pour voir Damian Conway présenter une invraisemblable parodie de businessman vendant du faux Web 2.0 (sm), une ligne de produits (non-existants) tels que iCxap (prononcer "I crap"), un aggrégateur de brevets, un OS (cxapix), un site communautaire (cxapr, prononcé "crapper")... du grand Damian, extrêmement amusant et extrêmement dur à retranscrire!
C'est pas le vrai nom du talk, mais j'ai pas le programme sous les yeux. la salle est archi-comble.
Interfaces: le plus simple (quand on l'a encore): le port prallèle. Il est simple et demande peu d'infracstructure. Par contre il dit qu'il faut une librarie C pour y accéder, il nous code en direct live un petit programme qui fait ça. Bien sûr en Perl on a Device::ParallelPort (http://search.cpan.org/dist/Device-ParallelPort).
Il nous montre ensuite la grille de son jardin.
D'abord il nous montre la boîte au lettres: un contact l'informe quand le facteur dépose une lettre. Il invite quelqu'un à venir sur scène pour souder le circuit qui fait ça. Il a aussi divers senseurs pour lui dire si quelqu'un pousse la grille, comme ça il peut allumer la lumière si il fait sombre.
Il a aussi un radar RFID pour détecter les gens qui approchent la porte de la maison.
Il utilise un petit utilitaire, qui lit le port USB et le fait apparaître comme une socket sur le système. Là il peut utiliser PHP, Perl (il avoue ne pas trop connaître Perl, mais Larry est dans la salle (et dit qu'il y a sûrement un module sur CPAN pour faire ça)) ou Tcl (il nous montre les 3 bouts de code).
Il approche un transmetteur RFID (de la taille d'un grain de riz) du récepteur, qui l'identifie, yipee!
Dans la chambre de son fils il a un petit contrôleur qui lui permet d'ouvrir et fermer les rideaux avec une télécommande. Il a ajouté la télécommande lui même. Larry commente que pour ça il doit utiliser Ruby (on Rail... celui du rideau). Il nous montre comment faire, fer à souder en main.
Dans sa cuisine, un lecteur de code barre. Il suppose qu'il pourrait l'utiliser pour gérer ses courses.
Son système d'arrosage automatique est fait maison, pour 1/10 du prix d'un vrai.
Dans son bureau, un téléphone portable, relié à un ordinateur sur lequel il fait tourner un programme qui entre autre stocke les SMS dans une BD. Encore une fois il nous montre le code. Il envoie un sms a son portable, qui le notifie en faisant sonner un portable dans la salle! Yipee.
Sa conclusion: beaucoup hardware peut être détourné et utilisé de facon créative. Tous à vos fers à souder.
Un excellent talk pour le vendredi matin.
Je sèche le reste de la matinée, avec juste un passage par le talk de chromatic sur des "perl hacks that you did not know existed", mais je suis trop fatigué ce matin pour vraiment suivre quelque chose d'aussi avancé.
Au final une bonne conf, j'ai appris pas mal de chose, pas tant en Perl que sur des sujets annexes (le cours sur Vim est probablement le cours le plus utile que j'ai jamais pris). Web 2.0 et Ajax sont vraiment les 2 gros buzzwords du moment, ça tombe bien, j'aime bien javascript, a part le fait qu'il manque le foreach.
Le seul truc qui m'a un peu manqué c'est que comme la conf n'est pas dans un hotel, il n'y a pas d'endroit "naturel" ou rencontrer des gens le soir. Ca limite la possibilité de rencontrer des gens au hasard et d'aller manger ou boire un coup avec eux. A noter également que ça fait bientôt 10 ans que je participe à ces confs, et que je commence à voir les gens que je connais prendre de l'âge. C'est fini l'époque où on était tous des jeunes cons ;--( (faut dire aussi que je pense que les boites envoient moins de jeunes codeurs à Oscon, on est plus à l'âge d'or du Web 1.0).
Ciao
Copyright © Les Mongueurs de Perl, 2001-2011
pour le site.
Les auteurs conservent le copyright de leurs articles.