Faire marcher un class decorator Python avec self

Pour un projet Python, je dois benchmarker plusieurs éléments et une de ces mesures est de chronométrer le temps mis pour avoir une réponse. Dans mon code, cela se traduit par chronométrer combien de temps se passe entre deux appels de deux méthodes différentes d’un même objet. Apprenant le Python en même temps, je me suis dit qu’une façon élégante de le faire serait de faire un class decorator.

Je ne sais pas si vous savez ce qu’est et comment fonctionne un class decorator, si non je vous conseille le chapitre 38.4 « Coding Class Decorators » du livre Learning Python par Mark Lutz et si vous ne savez même pas ce qu’est un decorator, honte à vous è_é! Ahah, non, aucune honte bien sur, dans ce cas lisez simplement le chaptire 38.2.

En bref, un decorator permet de remplacer une fonction (ou une classe) par une autre en écrivant simplement l’annotation @nomDuDecorator avant cette fonction/classe. Dans ma situation, en ajoutant l’annotation @TwoMethodsTimer(« requestMedia », « startPlayback ») juste avant la déclaration de ma classe, je vais récolter des statistiques sur le temps que met un média à commencer sa lecture après avoir été demandé. Voila une première version du decorator faite après avoir lu le chapitre 38.4 en plus de quelques blogs et fils sur Stack Overflow:

Pour l’utiliser sur n’importe quelle classe, voila un exemple:

Dans cet exemple, on mesure combien de temps s’écoule entre l’appel de methodA e methodB, ce qui sera environ 2 secondes. Ça marche, on est content, jusqu’à essayer quelque chose de nouveau:

On peut observer ici un appel interne à methodB (self.methodB()) et que cet appel ne déclenche pas stopTimer! Après enquête, il s’avère que l’appel de méthodes sur self, donc à l’intérieur d’un objet, ne fait pas appel à __getattr__ pour récupérer la méthode. J’ai donc essayé d’intercepter l’appel dans __getattribute__ mais cela s’avère difficile et quand je ne finis pas par des appels récursifs infinis, impossible de voir passer la méthode qui m’intéresse et donc de déclencher mon timer.

Pour résoudre ce problème, à la place de déterminer quelle méthode a été appelée en interceptant __getattr__, je modifie les attributs de l’objet juste après sa création. Voila le code:

Juste après l’instanciation de l’objet, on modifie l’association des deux méthodes qui nous intéressent pour que ces méthodes « pointent » vers nos propres méthodes. On stock les anciennes méthodes quelque part pour pouvoir s’en resservir par la suite. Cette astuce permet le fonctionnement du decorator à la fois sur les appels externes et internes.

De Google Reader à TinyTinyRSS avec OVH

Vous n’êtes sans doute pas passé à coté de ça, cette semaine Google à annoncé la fermeture de Reader, ce qui me donne une bonne occasion de passer à une solution auto-hébergée, comme Tiny Tiny RSS! Voici comment procéder, dans mon cas avec un hébergement mutualisé OVH.

  1. Téléchargez et décompressez TT RSS dans le dossier de votre choix sur votre serveur.
  2. Dans le dossier « schema » de l’archive, chopez le script de création de la BDD approprié à votre cas (pour moi, du MySQL). Dans le cas d’un hébergement OVH mutualisé (ou pas), dans PHPMyAdmin, cliquez sur votre base de données, puis sur l’onglet SQL et collez le texte du script dans la case « Run SQL query/queries on database XXX » puis « Go ». Pas de panique pour ceux qui n’ont droit qu’à une seule base de données, toutes les tables sont préfixées par « ttrss », il ne devrait pas y avoir de conflit avec vos tables existantes.
  3. Sur le serveur, copier ou renommer le fichier « config.php-dist » en « config.php" et l'éditer de la manière suivante:
    1. Changer le DB_TYPE en mysql si nécessaire dans le premier define.
    2. Entrez l’adresse, le nom d’utilisateur, le nom et mot de passe de la BDD dans les define suivants. Fin de la config de la BDD
    3. Config du serveur: l’adresse à laquelle vous avez placé TT RSS avec « SELF_URL_PATH » (c’est également l’adresse par laquelle vous allez accéder à TT RSS). Vous pouvez également éditer « REG_NOTIFY_ADDRESS » et « SMTP_FROM_ADDRESS » pour le mails de notifications et résumés qui seront envoyés.
  4. Accédez à l’adresse de votre installation (par exemple: votredomaine.com/tt-rss), si vous avez une erreur du type

    Fatal Error: PHP version 5.3.0 or newer required.

    alors créer un fichier .htaccess dans le dossier principal de TT RSS contenant cette ligne:

    SetEnv PHP_VER 5_3

    Cela devrait corriger le problème.

  5. Se connecter avec ceci: « admin »/ »password ». N’oubliez pas de changez le mot de passe ou supprimer le compte pour créer le votre dans les préférences (en haut à droite).
  6. Mettre en place la stratégie de mise à jour des flux. Pour ma part, je suis allé dans le manager OVH, puis dans mon hébergement je suis allé dans « Planificateur de tâches » et j’ai créé une tâche s’exécutant tous les jours et toutes les heures avec ce script à exécuter:

    www/chemindevotrettrss/ttrss/backend.php?op=globalUpdateFeeds&daemon=1

    Je n’ai pas encore testé si c’était la bonne chose à faire.

Deuxième partie: Import/export de Google Reader. Pour cette partie pensez à vous connecter avec votre compte et pas celui de l’administrateur.

  1. Allez sur votre Google Reader et cliquer sur la petite roue en haut à droite pour aller dans les paramètres, puis Importer/Exporter, puis « Download your data through Takeout ».
  2. Créez l’archive, téléchargez la, dézippez la.
  3. Dans les paramètres de tiny tiny rss, (actions > preferences) dans Feeds, puis OPML, sélectionnez le fichier « subscriptions.xml » situé dans le dossier « Google Reader » de votre archive. Cliquez sur « Import »
  4. Enjoy! Vos flux Google Reader sont à l’abris sur Tiny Tiny RSS.

Suppléments:
Des applications android pour lire vos flux.

Glassfish 2.x et OpenJDK

Et maintenant, un article sur le serveur d’application Glassfish et OpenJDK, étant donné que j’ai rencontré un problème dont je n’ai trouvé la solution nulle part ailleurs.

En essayant d’installer Glassfish 2.2 sous Linux, j’ai rencontré cette erreur :

/opt/glassfish/setup-cluster.xml:160: Glassfish requires JDK 1.5 or higher, you have java version "1.7.0_03-icedtea"

Cette erreur apparaît au moment d’exécuter cette commande :

sudo ant -f setup-cluster.xml

Après un peu trop d’heures de recherches, j’ai vu que dans le xml qu’il vérifiait mal la version de Java, étant donné que j’ai la version 1.7 du JDK. J’ai rajouté la ligne pour la version 1.7 dans la fichier xml:

<condition property="java.version.acceptable"> 
  <or>
    <contains string="${targeted.java.version}" substring="1.5"/>
    <contains string="${targeted.java.version}" substring="1.6"/>
    <contains string="${targeted.java.version}" substring="1.7"/>
  </or> 
</condition>

Je suis arrivé à cette solution en lisant cet article : http://www.ensode.net/java_fedora_8_icedtea.html et apparemment, glassfish-installer-v2-b58g ne fonctionne pas avec OpenJDK même avec cette astuce, cependant j’ai testé avec glassfish 2.1.1_b31g-1 (le dernier dans les dépos AUR d’ArchLinux) et aucun problème jusqu’à présent.

PS: pour ceux sous Archlinux, il est possible que la commande ant ne fonctionne même pas, elle se situe dans /usr/share/java/apache-ant/bin/ .

CakePHP 2, OVH et htaccess

En essayant d’envoyer un projet utilisant CakePHP sur mon hébergement mutualisé OVH, je me suis rendu compte que ce même projet en CakePHP 1.3 fonctionnait parfaitement mais je l’avais depuis porté sur Cake 2.0. Avec cette dernière version, le mod_rewrite semblait complètement divaguer. J’ai envoyé ce projet dans un sous dossier du serveur (du genre www/projects/mycakeapp) et cake interprétait mycakeapp comme si c’était un controller (alors que c’était la racine du site cake), donc j’obtenais un message d’erreur comme quoi MycakeappController était introuvable.

Lire la suite