Mon premier plugin pour roundcube

Je viens de créer un petit plugin pour l’excellent webmail RoundCube.

Il se content d’imprimer par dessus l’icône du site (favicon) le nombre de messages non lus.

Bon, il y a surement plein de chose à corriger, notamment, sur le choix de la couleur, ou encore trouver un moyen de rendre le chiffre plus lisible, mais pour un truc torché en 20 minutes, je trouve que c’est déjà pas mal 😉

Comment ça marche : Premièrement, pour obtenir le nombre de messages non lu, je surcharge la méthode set_pagetitle. Cela me permet, en analysant le titre, de trouver le nombre de messages non lu. Ensuite, grâce à un canvas, je dessine l’icône actuelle, puis le nombre de message non lu. Enfin, je génère une URL « data: » à partir de ce canvas et j’insère (ou remplace) des balises <link rel= »icon »> et <link rel= »shortcut icon »> avec cette url. Enfin, je prends soin d’appeler la méthode set_pagetitle originale…

Voilà le code :

Et pour ceux que ça intéressent, vous pouvez le télécharger ici : roundcubemail_plugin_favicon_0.1.tar.gz

Réparation de la prise jack de mon Palm Pré Plus

Il y avait un faux contact sur la prise de jack de mon Palm Pré Plus… Le téléphone avait des difficultés à détecter l’absence du casque. Ce qui avait pour effet de rendre impossible l’écoute de musique sur le haut parleur ou encore de passer des communications sans casque ou sans mettre le haut parleur…

J’ai donc entrepris de démonter le téléphone pour régler le problème. J’ai trouvé un gros mouton de poussière qui bloquait la lame de la prise casque. J’en ai aussi profité pour la redresser un peu pour que le contact se fasse bien… Et voilà, après remontage, j’ai un téléphone avec une prise casque à nouveau fonctionnelle…

Serialize object instances in Mojo WebOS

Mojo, the javascript framework in HP WebOS offer convenient ways to save data like Mojo.Model.Cookie…

Cookies can save javascript objects. Unfortunately, as this API is based on a JSON serialization, it can’t naturally deserialize all objects.
JSON can only serialize numbers, strings, booleans, arrays and objects. But when it serialize objects, obviously, only the object properties that can be serialized are serialized. Functions and prototype are not saved, and as a consequence not restored… In fact, arrays are the only objects that truly can be serialized…

For example, we can’t save Date instances… In fact, by default Date instance are serialized into ISO 8601 strings…

Mojo is based on the prototype javascript framework. To serialize an object in JSON, we just call the Object.toJSON function. When we look at the source code, we can see that this function call, if exists, a _toJSON method of the current serialized object (toJSON without underscore, in the real prototype framework, with underscore in Mojo). So if we implement a Date#toJSON method, we can change the way Date are serialized…

We can implement something like this :

This will broke the JSON specification, but if the string is deserialized in javascript with an eval(), this will create a new Date instance with the right parameters… But, prototype offer a String#evalJSON method. This method check the validity of the JSON string before evaluating it. The check is done with the String#isJSON method. And this method will broke on serialized date… We must update it to allow our new way to serialize dates…

So now, we can serialize date objects :

And the deserialization is automagically done with a :

That’s it… And this can be done with any objects…
Of course, this can also be done in non Mojo javascript environment…

Commentaires sur le DevCast Palmpre-France #4

Marc Aurélien de Palm Pré France continue sa série d’article sur le développement sur HP WebOS…

Je viens de voir les articles 3 et 4 et j’ai quelques commentaires à faire sur son code… Le code, c’est un art, il y a toujours une meilleur façon de faire, et il y a autant de façons de faire que de développeurs ;-). Le code de Marc Aurélien n’est pas mauvais, c’est juste que j’ai envie de donner mon avis 😉

Les variables :

Mon premier conseil est qu’il ne faut jamais utiliser des variables globales… Des variables globales ? Quezako ? Et bien, il faut un petit cour sur les variables et surtout sur leur visibilité… En fonction de l’endroit où l’on crée une variable et de la façon dont on la déclare, sa visibilité peut varier… Il y a 2 types de variables : les variables locales et les variables globales

Une variable locale se déclare avec le mot clef var… Sa visibilité est limitée au sein de la fonction courante et de toutes les sous fonctions qui peuvent avoir été crées dans la fonction courante (on appelle cela une closure)…
Par contre, une variable globale n’a pas besoin d’être déclarée avec un mot clef. Sa visibilité n’est pas restreinte. Tout code dans l’application peut utiliser cette variable, même en dehors de la fonction qui l’a déclarée.


Mais pourquoi ne faut-il pas les utiliser ?
Premièrement, car c’est souvent une source de bugs… On utilise une variable dans une fonction, mais on à oublié que cette variable est aussi utilisée dans une autre… On se retrouve avec un jolie bug… Même si l’on a une mémoire infaillible, il faut toujours se dire qu’un jour, quelqu’un d’autre sera peut être amené à travailler sur votre code, et lui, il sera peut être faillible 😉
Deuxièmement, dans un environnement objet comme le javascript, utiliser des variables globales veut dire que l’on ne pourra pas avoir plusieurs instances du même objet… L’objet dont je parle, dans le cas qui nous intéresse, c’est l’assistant de la carte actuelle (fenêtre / écran dans WebOS). Si l’on veut pouvoir avoir plusieurs cartes simultanément, on se retrouvera avec plusieurs assistant qui tenteront tous d’utiliser les mêmes variables… Aie, on se retrouve encore avec un bug 😉

Donc, moralité : il ne faut jamais utiliser des variables globales… Point. Comment faire ? C’est simple, il faut toujours déclarer ses variables avec le mot clef var !

Mais comment faire pour avoir des variables qui doivent être partagées entre les différentes fonctions de l’assistant, mais qui ne doivent pas partagées entre les différentes instances de l’assistant ? Et bien c’est simple, on n’utilise pas de variable 😉 On utilise les propriétés que l’on ajoute à l’assistant courant… En javascript, on peut accéder aux propriétés d’un objet de deux façon : en nommant l’objet, suivi d’un point (.) et du nom de la propriété, ou en nommant l’objet, puis en ajoutant une chaine de caractères entre crochets ( [ et ] )…

Mais comment accéder à l’objet courant ? Grâce à la variable spéciale thisthis est une variable locale qui dépend de la façon dont la fonction est appelée… Ce qu’il faut retenir, c’est qu’en générale, elle pointe sur l’objet courant…

Donc, voici comment définir des propriétés dans un objet :


Dans l’application de Marc Aurélien, les variables globales que j’ai recensées sont au nombre de 4 (vent, nuage, meteo et meteophrase)…
Les deux dernières sont strictement locales à la fonction meteo… Par contre, les deux premières sont des candidates idéales pour être des propriétés de l’assistant.

Simplification du code

Marc Aurélien utilise un événement propertyChanged sur chaque sélecteur pour la logique de son application. Chaque sélecteur commence par convertir la valeur, enregistre le résultat dans la variable globale, puis lance la fonction métier, qui va se charger d’afficher le résultat du calcul.

1 – la conversion de valeur :
Pourquoi ne pas mettre directement la bonne valeur dans les champs value des listes de choix des sélecteurs… Mettre directement l’entier correspondant à la valeur plutôt qu’une chaine de caractères intermédiaire… Par contre, en faisant mes essais, je me suis rendu compte que Mojo retournait une chaine de caractères plutôt que la valeur qui était définie dans les attributs de l’objet… Je pense que je vais me fendre d’un petit rapport de bug sur le sujet 😉 Qu’a cela ne tienne, il suffit d’appliquer un petit parseFloat pour obtenir une valeur numérique…

2 – l’enregistrement de la valeur :
Les widgets de Mojo se chargent tout seul d’enregistrer la valeur comme une propriété de l’objet qui est passée en troisième argument de la fonction setupWidget… Le nom de la propriété est par défaut ‘value’, mais il peut être changé grâce au paramètre modelProperty… Plusieurs widgets peuvent ainsi se partager le même modèle en utilisant des propriétés différentes…

Ces deux points permettent de factoriser le code et de ne garder qu’un seul gestionnaire d’événement commun aux deux sélecteurs… Ce gestionnaire d’événement se contentera juste de lancer la fonction meteo qui s’occupe du traitement des données.

Voici maintenant à quoi va ressembler le code tel que je l’aurais écrit :

Et voilà… Il y a surement plein de chose à redire sur ce code, mais voilà ma vision des choses 😉

Installer le SDK HP WebOS sous Linux

Marc-Aurelien de PalmPré-France.com à commencer une série d’articles sur le développement pour HP WebOS avec le SDK.

Dans son premier article, il dit ne pas savoir comment installer le SDK sous Linux… Et bien c’est facile :


Télécharger au format OGG/Théora
Télécharger au format WebM

C’était pas si compliqué que ça 😉

Les temps changent…

Je viens de me faire alpaguer par XPHCTOC sur palmpre-france :


Il a raison !
Mais c’est peut être grâce à des gens qui comme moi, militent depuis des années pour que le web ne soit pas le MSWeb ! Les temps changent… Enfin !

Promis, dès que IE9 sort, je vais enlever mon mesage ! 😉

En 10 ans, on aurra réussi à faire plier Microsoft… Mais ce n’est pas pour ça que le combat est fini… Dans le fond, tout ce que l’on a eu peur que Microsoft ne fasse contre nos libertés, Apple l’a fait (DRM, trusted computing, fermeture, etc)… Heureusement, Apple n’a pas l’égémonie de Microsoft…

Installer XBMC sur une Ubuntu Maverick (10.10)

Voici la procédure pour installer XBMC sur une Ubuntu 10.0 Maverick depuis le dépôt PPA de la team XBMC SVN (versions expérimentales).

La team XBMC ne propose pas encore de version pour maverick dans ses dépôts. Hors, à cause d’un problème de dépendance, il est impossible d’installer la version pour Ubuntu 10.04 (Lucid).

En creusant un peu, il semble que ce soit la bibliothèque modplug qui soit en cause. Voici comment j’ai procédé :

  • J’ai commencer par installer les dépôts PPA, puis en les modifiant pour utiliser la version lucid au lieu de maverick :
  • Ensuite, j’ai pu constater que l’installation est bloquée par la dépendance insatisfaite :
  • Un petit tour sur cette page nous informe que ce paquet peut être installé sans tout casser. Donc, il suffit de télécharger ce paquet en version lucid, de l’installer puis d’installer xbmc :
  • Et voilà :
  • Bon, bah j’ai plus qu’a tout configurer maintenant ! 😉

Vélo Partage

Depuis quelques mois, j’ai développé une application pour utiliser les services de vélo en libre service pour Palm Pré.

Ce logiciel permet de :

  • Trouver les stations à proximité de votre position ou d’un lieu arbitraire.
  • Connaitre instantanément le nombre de vélo / places libre sur chaque stations.
  • Gagner du temps en trouvant la meilleur station pour retourner votre vélo (places disponibles)
  • Voir les stations et les disponibilités sur une carte
  • Enregistrer vos stations favorites pour y accéder rapidement.
  • Sélectionner votre ville parmi les villes supportées et trouver votre vélo !

Bien sur, ce logiciel est disponible en GPL v3
Le site
L’application dans l’app catalog de Palm

Le truc de l’année

Ce qui est énervant avec les prise RJ45 que l’on trouve sur les câbles ethernet, c’est que le petit picot en plastique qui sert à bloquer le câble a la très mauvaise habitude de venir se coincer dans les autres câbles et finit très vite pas se casser… Ensuite, on se retrouve avec un câble qui a toujours tendance à vouloir s’extraire de la prise où on l’avait confortablement installé, ce qui bien sûr occasionne de nombreuses pertes de connexion… Grrr…

Heureusement, il y a des gens astucieux sur terre… Des MacGyver, qui avec trois fois rien, peuvent vous sauver la vie :

Vous trouverez les instructions étape par étape pour réparer une prise ethernet sur le ce site.

Comment éviter une division par zéro en perl

Je travail sur un logiciel écrit en Perl par des gens qui visiblement ne maîtrisaient complètement leur art… J’en veux pour preuve un petit extrait dudit logiciel :


Bravo, le développeur à penser à gérer le cas de la division par zéro… Ce qui me gêne le plus, c’est la façon dont il détecte cette division par 0… Avec une expression régulière qui teste si il n’y a pas de chiffre autre que 0 dans ce nombre !

Les moins tordus d’entre nous aurait peut être préféré écrire « $i != 0 », mais s’eu été beaucoup trop simple 😉

Moi, j’aurai même été tenté d’écrire juste :