A propos Pierre

Etudiant à l'INSA de Lyon en Informatique, j'aime tous les jours encore plus de choses donc je ne vais pas tout énumérer ici.

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.

Ne migrez pas vers le nouveau Firefox Sync

Récemment, Firefox a intégré un remplaçant pour Sync, un outil permettant de synchroniser vos mots de passe, favoris, onglets, historique et extensions entre vos navigateurs et appareils. Pour plus d’informations, vous pouvez vous rendre ici: http://www.mozilla.org/en-US/firefox/sync/

Cependant, quelle a été ma double déception en voyant lors de ma migration que:

  • On ne peut plus synchroniser ses mots de passe si l’on utilise un mot de passe principal (ce qui me semble indispensable)
  • On ne peut pas revenir en arrière sur une l’ancienne version de sync, qui continue bien de fonctionner

Je suis donc coincé avec des mots de passe que je vais devoir recopier à la main entre mes appareils. Très pratique, surtout quand j’ai besoin d’accéder rapidement à un site sur mon smartphone et que je n’ai pas mon ordinateur avec moi. Un seul conseil, si ça marche, ne touchez à rien, ne tentez pas de migrer.

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.

Continuer la lecture

Clavier bluetooth Microsoft

Je sais, Microsoft = evil (haha), mais ça c’est surtout pour le logiciel. Pour le matériel ils sont plutôt cool, du coup je ne me suis pas privé d’acheter un Microsoft Bluetooth Mobile Keyboard 5000!

Microsoft bluetooth mobile keyboard 5000Pourquoi? Déjà, étant donné que j’utilise mon ordinateur portable principalement sur un écran externe (l’écran interne ne marche pas très souvent) j’en avais marre des torticolis et maux de dos à force de taper tordu au clavier et ne pas être en face de l’écran. Deuxième raison, sans doute la meilleure, l’offre de remboursement de 20€ de la part de Microsoft, avec le coupon a renvoyer dispo ici, cela marche également sur d’autres produits, essentiellement des souris. Si on prend donc le clavier chez Amazon à 40€ ça fait un joli clavier Bluetooth à 20€ FDP in! Personnellement j’ai pris ça dans la boutique Welcome Informatique, très rapide, commandé lundi reçu mercredi matin. Une bonne alternative au clavier Apple qui coûte quand même trois fois plus cher.

Venons en au clavier en lui même. Je l’ai testé sous Windows, Archlinux, iPad et aucun problème pour ces plate-formes. Je ne m’attendais à rien de spécial mais la forme incurvée le rend bien plus confortable que mes claviers de portables, même si l’on fait quelques typos au début à cause de certaines touches qui sont plus grandes. A propos de touches, il y a 3 touches pour contrôler le volume, c’est bien, mais pas de touches début, fin, inser et impr écran, il faut passer par une touche Fn pour ça. Aussi il n’y a aucune touche « menu contextuel ». Le confort de frappe reste similaire à un clavier de portable, avec une course plus longue que ce que l’on retrouve sur les claviers mac ou des ordinateurs avec clavier « chicklet ». Les touches « rebondissent » de façon agréable, le clavier ne fait pas plus de bruit que ça.

(léger) Problème: avec mon dongle bluetooth, quelque soit l’OS, quand le clavier est censé se reconnecter (genre après la veille par exemple), il ne le fait pas, obligé de supprimer le clavier dans les paramètres puis de refaire l’association. Mais ça ne fait ça qu’avec le dongle, pas de problème sur iPad par exemple, j’essaierais avec un autre.

Conclusion: si vous hésitiez à vous prendre un clavier confortable quand vous branchez votre laptop sur votre écran géant, prenez le. Si vous voulez vous faire un HTPC pour surfer depuis votre canapé sur votre TV, prenez le. Si, tout simplement, il vous faut un clavier sans fil pour votre PC, prenez le également.