Ceci est le weblog personnel de

Raphaël Rougeron

A propos de PHP, Python, le web, et 42

De retour de PHPQuébec 2009

Je suis de retour à Toulouse après une conférence PHPQuébec très réussie. Je n'ai hélas pas pu profiter cette année du ski trip proposé aux conférenciers, mais apparemment bien m'en a pris car la conjugaison de fortes pluies et d'un froid intense avaient transformé les pistes en véritables patinoires :( Il convient de saluer encore une fois le formidable travail des organisateurs : Anna, Sylvain, Yann, et tous les bénévoles, merci pour tout, c'était vraiment parfait !

Mes 2 conférences se sont bien passées, beaucoup de questions et des retours très positifs. J'ai malheureusement été victime du fameux "effet démo" (ou de la loi de Murphy, c'est selon) : la petite appli de démo que j'avais écrite pour illustrer les services web RESTful n'a pas voulu fonctionner pendant la conférence, alors qu'elle marchait parfaitement 5 minutes avant et 5 minutes après ! Le pire c'est que je n'ai pas réussi à reproduire le problème, je ne sais donc pas ce qui s'est passé ce qui est particulièrement frustrant... J'ai donc fait un petit screencast avec quelques annotations pour ceux qui sont intéressés. Le code de cette petite appli réalisée à l'aide de mon framework Stato est bien sûr consultable. Enfin, les slides sont téléchargeables :

Réinventer la roue

Il est une tradition dans le monde du développement de clamer haut et fort qu'il ne faut pas réinventer la roue. Que lorsqu'une librairie existe et qu'elle répond au moins partiellement à nos besoins, il est stupide de vouloir écrire sa propre librairie. Mais comme l'a souligné Jeff Atwood dans un récent billet, il faudrait plutôt dire qu'il ne faut pas réinventer la roue, à moins que votre intention est d'en apprendre plus sur les roues. Prenons le cas de Stato, mon framework PHP sur lequel je m'acharne depuis maintenant 5 ans. On pourrait tout à fait me dire (et d'ailleurs on ne s'est pas privé de le faire) : pourquoi fais-tu ça ? Il y a des dizaines de frameworks PHP, pourquoi réinventer la roue ? La réponse est pourtant simple : parce que cela m'a permis d'apprendre énormément, de devenir un bien meilleur programmeur. Et parce qu'aucun outil au monde ne sera jamais parfait, il est toujours possible de faire mieux, ou au moins d'apprendre en essayant. En fait, le seul cas où il vaut mieux ne pas chercher à réinventer la roue, c'est lorsque vous avez des dealines, c'est tout. Et cela s'appelle le pragmatisme. Mais s'il vous vient l'envie le soir au coin du feu de coder quelque chose qui a déjà été fait des millions de fois, juste pour le plaisir de coder ou de chercher à faire un peu mieux que l'existant, pourquoi vous en empêcher ?

Sortie de Songbird 1.0

Il y a quelques jours est sortie la version 1.0 finale de Songbird, un lecteur de musique cross-platform basé sur les technologies Mozilla. Décrit par certains comme le futur Firefox des lecteurs de média, il s'agit certainement d'un des projets les plus aboutis de l'écosystème Mozilla. Songbird se base bien sûr sur xulrunner, un runtime XUL et XPCOM qui constitue en quelque sorte le "framework" de Firefox. Ceux qui ont pu assister à mes conférences sur les Rich Desktop Applications savent à quel point je suis fan des technos Mozilla, aussi je suis très heureux de voir Songbird passer enfin en version stable.

Ayant déjà testé plusieurs versions 0.x qui s'étaient révélées lentes et instables (un peu normal cependant), j'étais quelque peu inquiet à l'idée de tester cette version 1.0, et j'ai été très agréablement surpris : les performances sont bien meilleures, aucun crash jusqu'à maintenant, et les fonctionnalités proposées sont très intéressantes. J'ai notamment beaucoup aimé l'extension mashTape qui vous donnent de nombreuses informations tirées du web sur l'artiste que vous êtes en train d'écouter. Le support des iPods, bien qu'encore expérimental, est déjà très au point, et l'import d'une librairie iTunes se fait sans problèmes. Que du bonheur donc, et même si certaines fonctionnalités importantes pour moi manquent encore à l'appel (comme le rip de CDs, prévu pour avril 2009), je tiens à féliciter chaleureusement les développeurs de Songbird, qui ont vraiment fait du très bon boulot. Souhaitons donc longue vie à ce logiciel, qui mérite désormais de partager les couvertures des magazines spécialisés avec Firefox et Thunderbird.

Compiler PHP 5.3 sous Debian avec mysqlnd

Là encore, je ne vais pas décrire toute la procédure, car Pascal Martin, toujours lui, l'a déjà fait ;) Je tiens par contre à attirer votre attention sur un problème qui peut se poser lors de la compilation si vous souhaitez utiliser le driver mysqlnd. Avec une Debian Etch (et je pense que cela est valable aussi pour Ubuntu, j'attends la confirmation), la compilation se fera sans histoire, mais l'exécution des tests (make test) échouera pour tous les tests des 3 extension MySQL (No such file or directory unix:////tmp/mysql.sock), et vous ne pourrez donc pas utiliser MySQL depuis PHP. Le problème est connu, mais pour l'instant non résolu. La seule solution que j'ai trouvé (et que je trouve particulièrement inélégante) est de remplacer toutes les instances de /var/run/mysqld/mysqld.sock par /tmp/mysql.sock dans les fichiers /etc/mysql/my.cnf et /etc/mysql/debian.cnf (pensez d'abord à arrêter MySQL bien sûr). J'aimerais bien savoir si ce problème ne touche que les distribs type Debian, donc si quelqu'un a des infos...

Les nouveautés de PHP 5.3

Eh non, je ne vais pas écrire de billets sur ce sujet, car quelqu'un d'autre s'en est déjà chargé, et avec brio (avec qui ?). Je vous laisse donc découvrir le blog de Pascal Martin, qui décortique toutes les nouveautés de la prochaine version de PHP, notamment les namespaces dont la syntaxe a beaucoup évolué depuis mon article sur ce sujet dans PHPSolutions (article téléchargeable gratuitement d'ailleurs, mais qui je le répète, n'est plus tellement à jour sur certains points).

Conférence PHP Québec 2009

Je présenterais 2 sessions à la prochaine conférence PHP Québec en mars 2009 :

Git et le renouveau du contrôle de versions

Git est un système de contrôle de versions décentralisé créé par Linus Torvalds, le créateur du noyau Linux. Simple et très performant, il résout de nombreux problèmes posés par les systèmes classiques comme CVS ou Subversion. Cette session présentera les principes de base de Git, puis comment l'utiliser au quotidien à travers de nombreux exemples concrets, notamment son interfaçage avec un serveur central Subversion.

Services web RESTful en PHP

Pourquoi utiliser des protocoles complexes comme SOAP alors que HTTP n'est toujours pas utilisé à son plein potentiel ? Cette session mettra l'accent sur les capacités de HTTP et des URIs et introduira le concept de l'architecture orientée ressources. Nous découvrirons les bonnes pratiques de conception de services web à travers des exemples concrets tels que le service S3 d'Amazon ou le protocole Atom et la création de notre propre service web. Enfin, nous verrons comment implémenter ces services web à l'aide des outils PHP existants, notamment le Zend Framework.

En dehors du plaisir de revoir Montréal et de pouvoir discuter à bâtons rompus avec quelques-uns des plus illustres représentants de la communauté PHP, je suis très heureux de pouvoir traiter de ces 2 sujets qui me tiennent particulièrement à coeur.

Back

Oui je sais, 6 mois sans billet, ça fait long, en même temps c'est pas comme si j'avais des milliers de lecteurs ;)

Tout ça pour dire que je travaille maintenant à Toulouse, chez Linagora Grand Sud-Ouest, et que je vais m'efforcer de trouver un rythme de publication plus soutenu...

Un jour à marquer d'une pierre blanche

David Heinemeier Hansson (le créateur de Ruby On Rails) qui rend hommage aux possibilités de PHP, je ne pensais pas lire ça un jour !

Poissons de l'année

Eh oui, encore un 1er avril riche en fausses annonces !

Mon best of :

Moralité : si vous avez une annonce importante à faire en tant que développeur, attendez le 2 avril !

PHP TestFest

php_testfest

update : Le TestFest vient d'être annoncé officiellement sur php.net.

Si vous avez toujours rêvé de contribuer au bon développement de PHP, mais que le C vous intimide, voici une occasion à ne pas rater. En effet, la communauté PHP organise au mois de mai le TestFest 2008, un évènement visant à améliorer la panoplie de tests unitaires de PHP. Ecrire des tests est à la portée de n'importe quel développeur PHP, et de nombreux User Groups vont organiser des réunions pour vous assister dans cette démarche. Plus de détails très bientôt !

Slides PHPQuébec 2008

Après un ski trip extraordinaire grâce à un enneigement particulièrement généreux et des organisateurs très sympathiques, je suis actuellement à Montréal pour la conférence annuelle de PHPQuébec. J'ai une nouvelle fois parlé des Rich Desktop Applications, et vous pouvez télécharger mes slides si le sujet vous intéresse. Je profite de l'occasion pour remercier chaleureusement les organisateurs, dont la gentillesse et l'efficacité font de cette conférence un grand moment !

Type hinting en PHP et SPLTypes

Il y a en ce moment une discussion animée sur la mailing list PHP-DEV à propos du type hinting. Plus précisément, s'il est aujourd'hui possible en PHP5 de forcer un paramètre d'une fonction ou méthode à être une instance d'une classe particulière, le seul type scalaire accepté pour le type hinting est le type tableau :

class Foo {
    public function bar(MyObject $param) { // OK
        ...
    }
 
    public function bas(array $param) { // OK
        ...
    }
 
    public function bat(float $param) { // PAS OK
        ...
    }
}

Certains voudraient étendre le type hinting à tous les types scalaires de PHP (integer, float, string, etc...), mais bien sûr d'autres ne sont pas d'accord, souvent parce qu'ils n'en voient pas l'intérêt ou parce qu'ils trouvent cela contraire à la philosophie de PHP (qui se veut un langage dynamique). Pour ma part, je vois au moins un intérêt au type hinting : la génération automatique d'un fichier WSDL à partir du code PHP d'un service web. En effet, l'API de Réflexion de PHP vous permet d'ores et déjà de récupérer le type des arguments d'une méthode, comme l'illustre l'exemple suivant :

class MyObject {}
 
class Foo {
    public function bar(MyObject $param) {}
}
 
$ref = new ReflectionClass('Foo');
$params = $ref->getMethod('bar')->getParameters();
 
foreach ($params as $param) {
    echo "parameter $".$param->getName()." (".$param->getClass()->getName().")
";
}

Mais sans support des types scalaires dans le type hinting, cette technique n'est pas idéale. Si une méthode prend comme argument un entier, cela vous oblige à créer une classe Integer, qui mapperait vers le type XML Schema xs:integer. Le framework de WSO2, qui permet la génération automatique de fichiers WSDL, utilise le principe des annotations de Java pour résoudre le problème. L'idée est de décrire le type des arguments dans un commentaire, qui sera parsé par le framework :

/** 
 * The purchaseOrder function
 * @param int $itemNo ID of the item to be purchased
 * (maps to the xs:int XML schema type )
 * @param string $date Date that the purchase order was done
 * (maps to the xs:gDate XML schema type)
 * @return int $price tolal price
 * (maps to the xs:nonNegativeInteger schema type )
 */
 function purchaseOrder ($itemNo, $date)
 {
    // some logic
    return $Price;
 }

L'idée est bonne, mais une solution en PHP pur me satisferait plus. Pour cette raison, un support des types scalaires dans le type hinting me parait intéressant, d'autant plus que le type hinting reste optionnel en PHP, alors pourquoi ne pas l'implémenter jusqu'au bout. En attendant que cela se fasse, une autre solution pourrait bientôt être possible. En effet, Marcus Börger et David Coallier travaillent actuellement sur une extension de SPL nommée SPLTypes. Pas de manuel pour l'instant, juste une petite description par l'un des auteurs. Plutôt que de créer vos propres classes Integer, Float, etc... pour le type hinting, il vous suffirait alors d'utiliser les types SPL : SPLInt, SPLFloat, etc... A suivre de près !

Des graphiques avec jQuery

Après avoir longtemps utilisé le couple Prototype / Scriptaculous, je suis récemment tombé amoureux de jQuery. Deux raisons à cela : c'est un poids plume (14 Ko une fois minifié et gzippé) contrairement à Prototype qui prend de plus en plus d'embonpoint, et j'adore sa syntaxe (spécialement le chaînage de méthodes). La communauté jQuery est également très active, en témoigne le nombre de plugins disponibles. Mais attention, le plugin que j'ai découvert ce matin via je ne sais plus qui est une vraie merveille : il s'agit de Flot, qui vous permet de tracer des graphiques magnifiques en exploitant la balise canvas introduite par Apple dans Webkit et aujourd'hui reprise par Firefox et Opéra. La version minifiée pèse seulement 20 Ko, et quand on voit le résultat, on ne peut qu'applaudir. Encore un outil à mettre sous le code pour le jour où...

flot.png

Vector Magic : un bel exemple d'application Flex

Les RIAs utilisant Flex sont de plus en plus courantes aujourd'hui, mais trop souvent des solutions type AJAX auraient très bien pu faire l'affaire. Aussi suis-je heureux de pouvoir vous présenter une application très réussie qui exploite vraiment les capacités de Flex : il s'agit de Vector Magic, créé par le laboratoire d'intelligence artificielle de l'université de Stanford. Cet outil vous permet de vectoriser n'importe quelle image bitmap, il peut donc vous être très utile si comme moi vous ne disposez pas d'une licence Illustrator. J'ai tout d'abord été bluffé par la qualité de leur algorithme : certes je ne suis absolument pas un expert en algorithme de traitement d'images, mais j'ai été très impressionné de voir le logo de Stato reconnu automatiquement comme étant un logo (voir l'image ci-contre).

vector_magic_1.jpg

De plus, la qualité de la vectorisation obtenue avec les réglages par défaut est remarquable. Mais si cela ne vous suffit pas, Vector Magic vous propose un outil pour réparer les erreurs de segmentation de l'image vectorielle. Et c'est en l'utilisant que l'on comprend l'intérêt de Flex : pour des UI aussi "riches", Flex est encore aujourd'hui la meilleure (et la seule ?) solution. En résumé, un outil très pratique, et une interface très bien conçue, je vous le recommande !

vector_magic_2.jpg

WampServer 2 et PHP 6

Romain Bourdon a profité du Forum PHP 2007 pour nous présenter en avant-première sa nouvelle version de Wamp, désormais appellé WampServer, et force est de constater qu'il a mis au point ce qui est certainement la meilleure plateforme de dev PHP sous Windows à l'heure actuelle. Comme beaucoup d'entre vous, j'ai longtemps utilisé EasyPHP avant de migrer sous xampp lorsque je me suis mis à PHP 5. Mais WampServer apporte une fonctionnalité de premier ordre : la possibilité d'installer différentes versions de PHP, Apache et MySQL. 25 versions différentes de PHP sont ainsi proposées, de la 4.1.2 à la 5.2.5. L'intérêt de la chose est évident : cela vous permet de tester votre code sous différents environnements de production. Les développeurs de librairies, ou ceux qui cherchent à migrer du code PHP 4 vers PHP 5 pourront ainsi être beaucoup plus productifs. En dehors de cette fonctionnalité majeure, WampServer vous permet de gérer la configuration de votre serveur très simplement : l'activation d'une extension PHP se fait par exemple par le menu de WampServer, pas besoin d'éditer le php.ini ! Bref, WampServer est une vraie réussite, et je remercie Romain de nous avoir donné un si bel outil.

Mais bien sûr, il m'en fallait plus ;) Cela faisait longtemps que j'avais envie de faire mumuse avec les prochaines versions de PHP (5.3 et 6), et en testant WampServer, j'ai immédiatement pensé à essayer d'installer un snapshot de PHP 6. Et j'y suis parvenu très facilement, preuve que WampServer est très bien conçu. Voici la recette : commencez par télécharger un snapshot de PHP 6. En admettant que WampServer est installé dans C:\wamp, créez un nouveau dossier C:\wamp\bin\php\php6.0.0 et placez-y le contenu dézippé du snapshot. Créez 2 copies du fichier php.ini-dist, que vous nommerez php.ini et phpForApache.ini. Enfin, créez un fichier wampserver.conf avec le contenu suivant :

<?php

$phpConf['phpIniDir'] = '.';
$phpConf['phpExeDir'] = '.';
$phpConf['phpConfFile'] = 'php.ini';

$phpConf['apache']['2.0']['LoadModuleName'] = 'php6_module';
$phpConf['apache']['2.0']['LoadModuleFile'] = 'php6apache2.dll';
$phpConf['apache']['2.0']['AddModule'] =  '';

$phpConf['apache']['2.2']['LoadModuleName'] = 'php6_module';
$phpConf['apache']['2.2']['LoadModuleFile'] = 'php6apache2_2.dll';
$phpConf['apache']['2.2']['AddModule'] =  '';

?>

Démarrez WampServer, vous devriez voir votre nouvelle version 6.0.0 dans PHP > Version. Cliquez dessus, laisser les services redémarrer et cliquez sur PHP > php.ini. Cherchez la directive extension_dir qui se trouve dans la section "Paths and Directories" et indiquez l'emplacement du répertoire contenant les extensions, par exemple :

extension_dir = "c:/wamp/bin/php/php6.0.0/ext/"

Redémarrez les services, et c'est terminé, vous disposez maintenant d'une installation de PHP 6 fonctionnelle, ce que vous pouvez vérifier à l'aide d'un phpinfo() !

php6.png

Stato 0.9

Une nouvelle release pour mon framework Stato. Pas de nouveauté majeure, plutôt de nombreuses petites améliorations, ainsi qu'une réorganisation en 3 paquetages distincts : Mercury pour l'ORM, Gemini pour le middleware (View-Controller) et un paquetage de composants dans lequel j'ai placé entre autre le Mailer, les Services Web, les helpers Prototype, etc... Il me reste quelques améliorations et bugfixes à faire pour la version 1.0, qui ne devrait pas tarder.

Télécharger Stato v.0.9

Slides Forum PHP 2007

Malgré les grèves, un forum très réussi ! Merci encore aux Gentils Organisateurs de l'AFUP, à la fois pour l'organisation exemplaire et pour m'avoir offert l'opportunité de faire mes premières armes de conférencier ! Mes slides sont disponibles sur leur site ainsi qu'ici même :

Du Chaos à l'Agilité

Rich Desktop Applications et architectures côté serveur

Google pour craquer des mots de passe MD5

Pas besoin de Rainbow table (dans certains cas) pour craquer un mot de passe haché en MD5 : il suffit de faire une recherche dans Google avec le MD5 et on peut parfois trouver le mot de passe correspondant !

http://www.lightbluetouchpaper.org/2007/11/16/google-as-a-password-cracker/

Source : /.

A propos d'HTML, du DOM et des éditeurs WYSIWYG...

L'un de mes projets en cours consiste à améliorer l'interface d'administration d'un CMS que je compte publier sous la forme d'un "engine" pour Stato. Ce CMS étant destiné à des utilisateurs lambda (c'est à dire inaptes à utiliser une syntaxe wiki et encore moins à coder du HTML à la main dans un textarea), j'avais dû me résoudre à intégrer un éditeur WYSIWYG écrit en Javascript. Mon choix à l'époque avait été d'utiliser TinyMCE. J'avais pu le customiser suffisamment pour bien l'intégrer dans le CMS, et mes utilisateurs étaient satisfaits.

En remaniant l'interface, j'ai décidé de cesser d'utiliser prototype et de le remplacer par extjs, qui propose notamment un composant tree très efficace. Séduit par les possibilités de cette librairie, et bien décidé à compenser son poids (463 Ko en version "minifiée") par une utilisation maximale de ses capacités, j'ai souhaité remplacer TinyMCE par l'éditeur HTML de extjs. Seulement voilà, cet éditeur est très léger, et beaucoup de fonctionnalités manquent par rapport à TinyMCE. J'ai donc créé une extension de cet éditeur, qui commence à vraiment prendre tournure. A ce sujet, créer une extension d'un composant de extjs est un jeu d'enfant...

Croyez-moi, travailler sur l'implémentation d'un éditeur HTML en Javascript est vraiment très formateur, j'ai appris beaucoup de choses sur le DOM, et notamment sur les différences d'implémentation du DOM et de CSS dans les navigateurs. Ce qui m'amène à vous faire part de la pensée suivante : en l'état actuel des spécifications HTML et CSS du W3C, il me parait impossible d'arriver à une implémentation "standard" dans tous les navigateurs. Les balises proposées par HTML sont de trop bas niveau, et le modèle de boîte est flou. Il faudrait s'inspirer du modèle de boîte de XUL pour en faciliter l'implémentation.