Hello, I’m Vinch

And this is my blog.

La qualité de l’air en Belgique

06/14/11

This post is more than 3 years old. It might not reflect my current skills and convictions.

Cela peut paraître bizarre, mais pour un projet obscur et personnel, j’avais besoin de connaître, plus ou moins en temps réel, la qualité de l’air de quelques villes belges importantes.

Los Angeles smog

En regardant la météo de Tatiana Silva, j’ai remarqué qu’il semblait y avoir une autorité compétente pour ce genre de données en Belgique : la Cellule Interrégionale de l’Environnement ! (remarquez au passage le site Web qui semble ne pas avoir bougé depuis 1999)

J’ai découvert qu’ils disposaient des indices de qualité de l’air de plusieurs villes (Bruxelles, Anvers, Gand, Liège et Charleroi) ainsi que d’indices plus généraux (zones et régions). Tout est disponible sur cette page. L’indice de qualité de l’air est exprimé dans la dernière colonne, sous la forme d’une barrette colorée. L’indice peut varier de 1 (tout est génial) à 10 (on va tous mourir). En règle générale, il se situe entre 3 et 5.

Juste pour le sport, je leur ai envoyé un email pour leur demander s’ils disposaient d’un web service qui renvoyait du XML, ou mieux, du JSON. Juste pour le sport car je savais très bien que :

  • Ils ne disposaient certainement pas de web service public
  • Ils ne répondraient jamais à mon email

Je ne me suis pas abattu pour autant et j’ai décidé de le faire moi-même en utilisant la technique du Web scraping sur la page précédemment linkée. J’avais déjà parlé du scraping dans un précédent post sur les hackers. Pour rappel, il s’agit d’une technique qui consiste à parcourir le code source HTML d’une page pour en extraire les informations qui nous intéressent. En soi, ce n’est pas un truc ultra légal, et c’est donc à utiliser en dernier recours.

Pour réaliser mon scraping, j’ai utilisé la librairie Goutte de Fabien Potencier (encore lui). En quelques lignes de code, j’ai réussi à obtenir les informations qui m’intéressaient. Pour être tout à fait clean, j’ai mis en place un système de cache qui fait en sorte que le scraping n’aura lieu qu’au maximum 24 fois par jour (ou une fois par heure si vous préférez) vu que l’indice est mis à jour toutes les heures. Donc, cela limite les risques de trop abimer les serveurs de irceline.be !

Le code source du web service est sur Github et est disponible en ligne à l’URL suivante :

http://v1n.ch/air/data.php

En l’appelant sans paramètres, il renverra l’indice pour toutes les villes. Vous pouvez également cibler une ville particulière via le paramètre city qui prend comme valeur le LOCODE de la ville en question :

  • BRU = Bruxelles
  • ANR = Anvers
  • GNE = Gand
  • LGG = Liège
  • CRL = Charleroi

Par exemple :

http://v1n.ch/air/data.php?city=CRL

Et comme certains préjugés tenaces pourraient le laisser penser, la qualité de l’air à Charleroi n’est pas systématiquement plus mauvaise qu’ailleurs !

J’ai également mis à disposition deux exemples d’utilisation du web service.

Le premier exemple (code source) va utiliser la fonction de géolocalisation de votre navigateur (navigator.geolocation) pour afficher l’indice de la ville la plus proche d’où vous vous trouvez. Evidemment, c’est un peu débile dans le cas où vous testez le truc depuis un pays lointain ! Par exemple, depuis Tokyo, on vous donnera l’indice de Liège, mais bon… (soyez tolérants)

Le second exemple (code source) affiche simplement une carte (Google Maps) un peu moche avec les indices. Rien de fortement original mais je ne pouvais pas passer à côte ! D’ailleurs, si quelqu’un trouve un moyen simple d’afficher directement l’indice dans l’icône pour ne pas être obligé d’afficher l’infobulle, je suis preneur ! (en évitant aussi de devoir créer 10 icônes en PNG)

N’hésitez pas à forker sur GitHub pour ajouter vos exemples et faire vos correctifs. Tenez moi également au courant si vous utilisez le Web service dans un projet de fou !

A la prochaine et bon vent !

La programmation devient sociale !

06/05/11

This post is more than 3 years old. It might not reflect my current skills and convictions.

Je brise mon silence pour vous parler de deux services auxquels je m’étais inscrit il y a relativement longtemps, mais que je commence seulement à utiliser intensivement depuis quelques semaines.

Ils ont tout les deux en commun de faire de la programmation une activité sociale, même pour un développeur freelance qui ne sort jamais de chez lui.

Le premier s’appelle Forrst et on peut considérer que c’est l’équivalent de Dribbble pour les développeurs. A vrai dire, Forrst est à destination aussi bien des designers que des développeurs mais c’est évidemment ce dernier aspect qui m’intéresse le plus. Forrst permet de partager des snippets (c’est-à-dire des petits morceaux de code — mais il n’existe pas vraiment de traduction française pour ce terme) afin de les mettre à disposition de la communauté.

Au départ, j’étais réticent et je me disais que c’était sans doute un outil uniquement destiné à faire de l’autopromotion et de la branlette collective à grands coups de « Amazing work » et de « You rock » (à l’image de Dribbble → ceci est un troll) mais je me trompais. En effet, dès mes premiers posts, force fut de constater que la communauté est très active et qu’elle n’hésite pas à vous corriger si vous faites une erreur ou si vous ne faites pas une chose de la façon la plus simple et la plus efficace possible. J’ai trouvé ces échanges très enrichissants, et je les ai d’autant plus apprécié que j’ai appris de nombreuses choses grâce aux conseils et commentaires avisés des membres de Forrst. Je vous invite fortement à m’y rejoindre !

L’autre outil dont je vais vous parler, vous le connaissez sans doute déjà, et vous l’utilisez sans doute déjà depuis longtemps. Il s’agit de GitHub, la célèbre plate-forme d’hébergement et de gestion de développement de logiciels. Comme son nom l’indique, GitHub est basé sur Git, le logiciel de gestion de versions inventé par Linus Torvald, un équivalent (mais sans doute en mieux) de SVN ou MercurialJ’ai l’impression que le devéloppeur de 2011 est presque obligé d’être sur GitHub. La plupart des projets open source, qu’on pouvait autrefois trouver sur SourceForge ou Google Code, semblent désormais avoir trouvé leur place sur GitHub. Cette plate-forme dispose en effet d’un aspect social que je trouve très intéressant. En effet, outre observer (watch) des projets et suivre (follow) des programmeurs, la fonctionnalité la plus intéressante de GitHub consiste à pouvoir « forker » un projet, c’est-à-dire en créer une branche (pour améliorer un aspect du code ou pour corriger un bug) qui pourra ensuite être fusionnée avec le projet principal (je vulgarise à peine, n’hésitez pas à corriger mes propos).

A noter que GitHub peut également servir à héberger des projets propriétaires de façon sécurisée, moyennant paiement. Via Gist, il permet également de partager des snippets avec vos amis programmeurs (plus ou moins de la même façon que Forrst). Une dernière fonctionnalité que je trouve également relativement intéressante est Pages qui vous donne la possibilité d’héberger les pages Web de vos projets directement sur GitHub (via un sous-domaine).

Vous trouverez mes modestes premiers projets GitHub par ici. Je vous invite aussi (surtout) à aller voir les projets de Fabien Potencier (l’homme à l’origine du framework PHP Symfony), qui m’a indirectement motivé à utiliser plus intensivement GitHub. Ses lignes de code sont de la pure poésie et vont sans doute en réconcilier plus d’un avec le PHP !

Savez-vous compter en hexatridécimal ?

02/03/11

This post is more than 3 years old. It might not reflect my current skills and convictions.

Le système hexatridécimal est un système de numération positionnel en base 36. Il utilise 36 symboles, généralement les chiffres arabes + les 26 lettres de l’alphabet. Dans le même ordre d’idées, les informaticiens du monde entier connaissent depuis leur plus jeune âge le système binaire (base 2 avec uniquement 0 et 1 comme symboles) ainsi que le système hexadécimal (base 16, utilisé notamment pour exprimer les codes de couleurs). Le système le plus courant (et le plus naturel pour le commun des mortels) est bien entendu le système décimal (en base 10).

Le système hexatridécimal (parfois également nommé alphadécimal, hexatrigésimal ou encore sexatrigésimal) est moins connu et moins répandu. Pourtant, il a trouvé récemment une utilisation tout à fait pratique depuis l’apparition des raccourcisseurs d’URL (URL shorteners) qu’on trouve partout sur le Web aujourd’hui, grâce notamment à l’explosion de Twitter (qui a d’ailleurs son propre raccourcisseur d’URL).

36

En 2009, nous avions lancé un raccourcisseur d’URL pour smart, la célèbre marque de voitures compactes. Vous pouvez encore le trouver sur oym.be. Pour créer une URL courte, une chaîne de caractère de 6 caractères (qu’on appelle hash et qui est composé de chiffres et de lettres) était générée et ensuite concaténée au domaine pour obtenir une URL finale de ce genre oym.be/7zrgiq (20 caractères au total en comptant « http:// »). Le fait d’utiliser 6 caractères permettait de générer plus de deux milliards d’URL (36^6). Néanmoins, s’il fallait le refaire, il serait sans doute plus pertinent d’utiliser un système d’URL basé sur les nombres exprimés en base 36.

En effet, en générant nos hashes dans l’ordre en base 36, nos premières URL générées seront très courtes et se rallongeront au fur et à mesure.

En considérant que le nom de domaine de notre raccourcisseur d’URL est sho.rt, nous pourrons constater les cas de figure suivants :

  • http://sho.rt/1 sera notre première URL générée (1 en base 36 reste 1)
  • http://sho.rt/a sera notre dixième URL générée (10 en base 36 vaut a)
  • http://sho.rt/2s sera notre centième URL générée
  • http://sho.rt/rs sera notre millième URL générée
  • http://sho.rt/7ps sera notre dix millième URL générée
  • etc.

On remarque que le nombre de caractères du hash reste assez bas (à peine trois caractères après une dizaine de milliers d’URL), malgré le nombre relativement élevé d’URL déjà générées. Peu de raccourcisseurs d’URL pourront prétendre atteindre une taille de hash plus élevée que 5, ce qui correspondrait à un nombre total de plus de soixante millions d’URL générées ! Il y a donc énormément de chances que nos URL soient toujours plus courtes que celles générées de façon aléatoire sur oym.be !

Comment mettre tout ça en pratique ?

PHP nous fournit la fonction base_convert() qui est fort pratique car elle permet de convertir un nombre d’une base à une autre. Par exemple, base_convert('10', 36, 10) donne 36 comme résultat (1*36^1 + 0*36^0). Le premier paramètre est le nombre à convertir, le second est la base du nombre à convertir et le troisième est la base dans laquelle le convertir.

Du côté de la DB, il vous suffit de créer une table avec les champs (minimum) suivants :

  • id (entier non signé, auto increment, clé primaire)
  • long_url (chaîne de caractère)

Pour générer le hash d’une URL courte, il vous suffit de faire un INSERT de l’URL longue dans la table, de récupérer l’id venant d’être générée (via la fonction mysql_insert_id() par exemple) et de le transformer en base 36 via la fonction base_convert().

Pour récupérer l’URL longue correspondant à votre hash, vous devrez convertir celui-ci en base 10, effectuer un SELECT dans votre table sur cet identifiant, récupérer l’URL longue et finalement faire votre redirection.

Ce n’est finalement pas plus compliqué que ça ! Grâce à ces quelques conseils, vous devriez désormais être capable de mettre rapidement en place un raccourcisseur d’URL efficace.

Et n’oubliez pas que la taille compte, plus que jamais !

---

UPDATE 03/02/2011 – 10:26

Comme me le suggèrent @_pakal_ et @jkbockstael sur Twitter, j’aurais très bien pu utiliser un système en base 62 (chiffres arabes + les 26 lettres de l’alphabet en minuscule et en majuscule). J’avoue ne pas l’avoir fait car les URL sensibles à la casse m’ont toujours fait un peu peur. Je sais que les serveurs Windows ne les gèrent pas bien. Et il faut également s’assurer que la DB MySQL soit case sensitive. A priori, en étant méticuleux, ça ne posera pas de soucis majeurs. La démarche générale reste la même que celle expliquée plus haut et nos URL raccourcies seront encore plus courtes ! Quelques exemples par ici.