Il y a des stations de vélib partout

Mais là, je suis pas sûr de pouvoir y aller déposer mon vélo en moins de 30 minutes !

D’après le site des Vélib, la station 12151 est situé au beau milieu du Sahara ! Plus exactement par 27.140973374539° de latitute et -3.4045606242531° de longitude !

Gna!


Je ne suis pas sûr que je puisse aller à Solution Linux avec ce badge !

Pour ceux qui ne voient pas pourquoi, il y a juste un joli message d’ereur à la place du code barre !

Build a call tree in Javascript

Disclaimer: This is my first post in english (or at least, the first that try to). So if my writings makes your eyes bleed, please leave a comment about it !

Yesterday, at work, i had to debug an old Internet Explorer only javascript application. This software was made by dumb monkeys who had no clue about how to write maintainable code. I had to go through something close to two thousand line of code and more than an hundred of carefully nested functions… In less than an hour, I was completely lost !
This application was carefully designed to run only under Internet Explorer. There’s no hope to be able to used a decent debugger like Firebug. So as usual with this project, i decided to start to build my own tool.

I made a little script that fetches all functions to wrap them in a new function that log the function name, the caller name, the current time, the arguments and the returned value… I hoped this was enough to help me debug the code !

I wrote and test this code in Firefox. But when i tried to test it in IE, it didn’t worked…

I found that in IE, global objects (those who aren’t declared in the scope of a function) are not attached to the window object. I found a good article that describes the problem.
So I can’t iterate through the window object in order to get all the functions. Again, this an IE bug ! The only solution I found is to parse all the js files to extract all the functions names. Crazy, inefficient, and error prone ! Isn’t that a good description of IE ?

So i gave up, walked through the code manually, took some paracetamol, and after several hours, find the bug ! But, i want to publish the code above to think that i didn’t wrote it for nothing.

Open Wifi Auto Connect

Je ne sais pas si vous utilisez souvent des réseaux wifi qui filtrent l’accès en utilisant un portail de capture web pour vous authentifier ? Personnellement, j’utilise régulièrement le service FreeWifi de Free…

Le principe de ces services est que le pare-feu bloque toutes les connexions qui ne sont pas authentifiés. Pour s’authentifier, il faut utiliser un navigateur Web, tenter de naviguer vers un site quelconque pour se faire rediriger vers la page d’authentification puis y entrer ses identifiants…

Comme je suis toujours plus fainéant, je viens de faire un petit script qui se charge de faire toutes ses étapes automatiquement. Le principe est de surveiller les connexions aux différents réseaux sans fils, et dès qu’un réseau est reconnu (que son nom est dans une liste), il se charge tout seul de récupérer la page du portail, puis de la renvoyer accompagnée des identifiants de connexion.

Utilisation :

  1. Téléchargez le fichier.
  2. Copiez le dans le dossier de votre choix.
  3. Créez le fichier de configuration. Il se nomme .OpenWifiAutoConnect, doit être placer dans votre dossier personnel (~) et est au format .ini. Les sections correspondent aux nom des réseaux. Les clefs correspondent au champs du formulaire ou il faut entrer une valeur. Par exemple:
  4. Ajoutez le programme au démarrage de votre session.
  5. Vérifier que les paquets (ubuntu / debian) suivant sont installé : python-dbus, python-notify et python-beautifulsoup
  6. Redémarrer votre session pour que le programme se lance
  7. Connectez vous à un réseau wifi et attendez que la magie s’opère. Une popup de notification vous préviendra du succès de l’authentification.

Comment ça marche ?

Avant tout, voici le code :

Le programme utilise D-Bus pour demander au NetworkManager de lui signaler chaque changement au niveau du réseau. A chaque changement, il tente de déterminer, toujours grâce à D-Bus, si ce reseau est un réseau Wifi et quel est son SSID. Si le réseau est dans le fichier de configuration, il attend que que le réseau soit correctement connecté pour lancer la fonction login avec les paramètres de connexion.

Cette fonction commence par mettre en place un client HTTP supportant les cookies (il est possible (FreeWifi le fait) que le portail nous envoie des cookies). Il tente d’ouvrir une page vers un site quelconque (en l’occurrence perdu.com. Le client supporte les redirections HTTP, il teste donc si la requette a été redirigé. Si c’est le cas, le HTML est analysé avec Beautiful Soup pour récupérer toutes les informations sur le formulaire. Elle sont modifiées avec les informations de connexion provenant du fichier de configuration. Puis, le formulaire est envoyé. Enfin, il vérifie si l’authentification à réussi en tentant de joindre à nouveau perdu.com…

Limitations :

  • Ce programme ne fonctionnera pas si le SSID du réseau n’est pas toujours le même. J’ai cru comprendre que les réseaux Fon n’avait pas tous le même nom, si c’est le cas, ça ne fonctionnera pas (enfin, pas pour tous les réseau Fon, mais juste pour ceux dont on a donner les noms.
  • Ce programme ne fonctionnera pas non plus si les noms des champs à remplire dans le formulaire sont variables.
  • Enfin, ça ne fonctionnera pas non plus si il y a un captcha (une joli image où l’on doit jouer à Champolion pour deviner ce qu’il ya d’inscrit).

Voilà, j’espère que ça va servir à quelqu’un (d’autre que moi)… Si il y a un problème, n’hésitez pas à laisser un commentaire… Et si il n’y a pas de problème, vous pouvez aussi laisser un commentaire 😉

J’aime pas le perl

Mais je suis obligé de bosser dessus…

J’ai horreur cette syntaxe si particulière qui donne l’impression que Larry Wall a absolument tenu à utiliser les 94 symboles de la table ASCII
Pourquoi diable se faire chier à différentier les variables en fonction de leur type avec des $, @ et autre % ?
Qui a besoin de systématiquement aplatir les tableaux imbriqué et les arguments ?
Pourquoi emmerder les développeurs avec une distinction entre référence et variable ? Peut être par nostalgie du C…
Et surtout, voici un petit exemple qui montre à quel point ce langage est tordu :

Il y a une erreur dans ce code. J’ai utilisé des () au lieu des {} pour le deuxième hash. Ce qui fait que je n’ai pas une référence vers mon deuxième hash… N’importe quel langage aurai levé une exception devant une tel erreur… Au lieu de cela, Perl affiche tout fièrement :

Il a aplatit le hash en décalant tout ! Hallucinant ! Qui peut bien avoir besoin d’une telle « fonctionnalité » ?

La bonne solution est :

Ce qui donne :


Je ne vois aucune raison pour justifier une telle complexité !

Microsoft supporte la vidéo sur iPhone "grace à SilverLight"

dixit PC Inpact

Mais comment font-ils alors même qu’Apple refuse à Adobe de porter sa technologie flash sur l’iPhone ? Apple aurait autorisé Microsoft à adapter SilverLight (qui est un technologie concurrente de Flash) ?

Et bien non, Microsoft joue juste sur les mots :
Microsoft utilise simplement la balise HTML 5 <video />, déjà supporté par la version de WebKit intégré à l’iPhone… Et Silverlight dans l’affaire ? Et bien on en a tout simplement pas besoin pour faire tourner une vidéo dans une page Web sur un iPhone. Il suffit d’utiliser la balise <video />. En fait, la démonstration faite par Microsoft montre tout simplement que SilverLight est capable de s’adapter automatiquement à l’iPhone. Ou, que SilverLight est capable automatiquement d’utiliser les standards Web à la place du plugin SilverLight quand celui n’est pas disponible… En gros que SilverLight est inutile dans un navigateur Web qui respecte les standards !

C’est tout de même assez ironique car Microsoft tente depuis quelques années d’imposer sa technologie SilverLight dans les navigateurs, pour concurrencer le flash, et de plus, n’implémente pas la balise <video /> dans Internet Explorer alors que tous ses concurrents (Firefox, Safari, Chrome) la supporte déjà. Jusqu’à peu, Microsoft refusait même de participer au travaux sur le HTML5 (sans doute pour ne pas concurrencer sa technologie SilverLight)… Je trouve cela amusant que Microsoft fasse lui même la preuve que sa technologie propriétaire SilverLight est inutile !

Allez Microsoft, la prochaine étape, c’est de prouver que Linux est mieux que Windows… Tu peux le faire 😉

Apple’s mistake

Et non, je ne suis pas mort, il va falloir patienter encore un peu…

Pas mal de changements dans ma vie (nouveau boulot, déménagement, etc.) m’ont empêchés de continuer à écrire sur ce blog… Mais promis, je vais essayer de m’y remettre.

Aujourd’hui, j’ai lu un billet de Paul Graham intitulé « Apple’s mistake ». Ce document résume assez bien mon sentiment vis à vis d’Apple depuis quelques années. Je regrette même d’avoir acheté mon dernier Macbook Pro (d’ailleurs, il ne me sert quasiment plus).

Voici quelques morceaux choisis :

Défillement à deux doigts sous Ubuntu

Ceux qui on déjà utilisé un portable sous Mac OS X savent de quoi je parle. Pour les autres, il s’agit en fait de pouvoir faire un défilement horizontal ou vertical sur le touchpad d’un portable en utilisant deux doigts sur toutes la surface du touchpad au lieu d’un seul doigt sur les bords. A l’usage, c’est tout simplement génial ! L’essayer c’est l’adopter 😉

Donc , comment qu’on fait donc ? Il faut créer un fichier /etc/hal/fdi/policy/shmconfig.fdi contenant :

Ensuite, redémarrer hal :

Et l’interface graphique en tapant Ctrl + Alt + Backspace.

C’est tout !

Un peu de tri dans mes mail

Salut à tous, je ne suis pas mort…

Ma boîte mail commençait à être bien encombrée… Pour faire un peu de ménage, j’ai commencé par utiliser les règles de filtrage de Thunderbird pour trier les mails par dossiers selon certains critères (mailing list, newsletter). Mais ma boite de réception commençait à être sacrement engorgée avec plus de 5 ans d’archives. J’ai donc décidé de me faire des dossiers d’archives pour stocker les vieux mails. Comme les règles de filtrages ne permetent pas de faire ce genre de chose, j’ai écrit un petit script python. Je le met à disposition ici. Faites en ce que vous voulez, il est sous licence GPLv3.

Le script commence par ranger les email de plus de 45 jours dans un dossiers en fonction de l’année et le trimestre. Ensuite, il copie les emails envoyés dans un sous dossier toujours par année et trimestre. Enfin, il supprime les mails de plus de 45 jours dans listes de diffusions, et ceux de plus de 10 jours pour les newsletters…

Le script est téléchargeable ici

Fabriquer un NAS et plus encore…

Je voulais acheter un NAS pour centraliser les sauvegardes des ordinateurs de ma mère…

Comme les ordinateurs à sauvegarder sont des Mac, je me suis d’abord intéressé à TimeCapsule d’Apple. Mais j’ai vite écarté cette solution. La principale raison est le fait qu’il n’y ai pas de RAID 1. Je ne conçois pas une solution de sauvegarde sur disque dur sans RAID miroir ! La seconde raison, c’est le prix : 499€ pour 1To, c’est cher…

Ensuite, j’ai regardé les NAS d’autre marques. Mais je n’ai rien trouvé de très intéressant. Soit c’est abordable et peu performant, soit c’est cher…

J’ai donc décidé de faire un NAS à partir d’un PC.
Les objectifs à atteindre :

  • 1To en RAID 1
  • Prix plancher
  • Faible consommation électrique
  • Peu bruyant

Le matériel :

J’ai acheté pour moins de 300€ :

  • Une carte mère VIA PC 2500E équipé d’un C7 à 1.5GHz
  • 1 Go de RAM
  • 2 disque de 1To SATA
  • 1 clef USB de 8Go (pour l’OS)

J’avais déjà un petit boîtier Micro ATX qui trainait, c’est déjà ça d’économisé.

Pourquoi ces composants : J’ai prix cette carte mère car elle coûte très peu et consomme aussi très peu. J’ai choisi de mettre l’OS sur un clef USB pour pouvoir éteindre les disques lorsqu’il ne servent pas. Cela permet donc de moins les user et d’économiser l’énergie pas la même occasion.

J’ai choisi d’installer un Ubuntu. Je l’ai installé depuis une clef USB (la même que celle que j’ai utilisé pour installer mon Acer Aspire One).

Configuration :

J’ai commencé par installer le serveur ssh, puis les paquets permettant de gérer le RAID et de surveiller le statuts des disques en SMART.

J’ai configuré postfix en smarthost (il fait suivre les mails a mon serveur SMTP). Il va servir à envoyer les mails d’alertes du système.
Denyhosts est un script qui permet de sécuriser le serveur ssh contre les attaques de type brut force (essayer de tous les mots de passe possible de façon automatique) en bloquant l’accès au bout d’un nombre déterminé d’erreur de connexion.
Ensuite, j’ai configuré les alias pour recevoir les mails d’alertes envoyé à root/puyb :

Maintenant, passons à l’étape de la configuration des disques.
Première étape, avec fdisk, j’ai fait une partition sur chaque disque, puis j’ai assemblé, formaté, et monté l’array RAID.

Maintenant, il faut attendre que l’array se construise avant d’éteindre la machine… La dernière commande permet de suivre l’avancement… Bien sur, ça n’empêche pas de continuer à configurer la machine, il suffit juste de ne pas l’éteindre…
Pour information, la commande echo 50000 > /proc/sys/dev/raid/speed_limit_min fixe la vitesse de reconstruction à 50Mo par secondes minimum…

Installation de netatalk

Netaltalk permet de faire des partages AFP (pour les backup Time Machine). Malheureusement, la version fournie avec Ubuntu ne supporte pas le SSL. Il faut donc le recompiler avec le support SSL.


Le script de démarrage de Netatalk fournit avec Ubuntu ne fonctionne pas si la carte réseau est configuiré en mode itinérant. Il faut donc lui assigner une adresse IP fixe.

Ensuite, après avoir configuré les partage que je souhaite dans /etc/netatalk/AppleVolumes.default, j’ai configuré avahi pour annoncé les services disponible sur ce NAS. J’ai déjà détaillé la façon de le faire dans ce billet. J’ai configuré le SSH comme dans le billet, mais j’ai aussi ajouté l’AFP.
/etc/avahi/services/afpd.service


A ce niveau, je dispose donc d’un NAS permettant de faire de l’AFP, du SFTP et du SSH… Ça me permet de me connecter depuis Linux et MacOSX… Mais il n’y a pas que ces deux OS… J’ai aussi des copains qui utilise des OS alternatifs comme Windows…J’ai donc installé samba pour faire des partage SMB/CIFS.


Pour économiser l’energie, j’ai reglé les disque pour s’éteindre au bout de 5 min.

Configuration de Time Machine

Pour faire fonctionner ce NAS avec Time Machine, il faut bidouiller un peu. Et oui, Apple ne vas pas si facilement vous laisser acheter autre chose qu’un disque Time Capsule… Première étape, il faut créer un fichier vide à la racine du partage réservé pour Time Machine :

Ensuite, il faut, dans un terminal dur le mac, taper la commande suivante, qui va empêcher Time Machine de cacher les disques qui ne sont pas « supportés » :

Ensuite, il faut lancer une première sauvegarde. Elle va échouer, mais avant quelle échoue, il faut aller copier le nom du dossier qui est créé dans le partage Time Machine. Il doit avoir un nom qui ressemble à « NomMachine_0123456789ab.sparsebundle »… Il faut recopier ce nom, et créer une image disque (via l’utilitaire de disque) de type SparseBundle, Format HFS+, aucun chiffrement, aucune partition, portant le nom que vous avez copié, et de la taille maximale que vous souhaiter allouer au backup (j’ai mis 900Go). Enregistrer cette image sur le volume TimeMachine (toujours sous le même nom), puis relancer une sauvegarde, elle devrais marcher…

Performances

Consommation :

Avec mon wattmettre, j’ai mesuré environ 60W quand les disques sont allumé et 35W quand ils sont éteint… Ça me semble pas mal vu que d’après ce que j’ai lu, la plupart des NAS consomme environs 30W à 45W…
Je devrais pouvoir encore améliorer la consommation en remplacement l’alimentation bas de gamme actuelle par une alimentation avec un meilleur rendement (une alimentation certifié 80+ devrais faire l’affaire).

Acces disques :

Lecture : 85Mo/s
Écriture : 75Mo/s

Dans tous les cas, c’est bien plus que ce que peu supporté la carte ethernet 100MBps dont est équipé le serveur… De plus, il sera utilisé le plus souvent en Wifi ! Bref, les performances du RAID sont très bonnes…

Bruit

Aie, c’est là que le bas blesse. La carte mère est pourvu d’un petit ventilateur de 4 cm de diamètre qui fait bruit aigue assez désagréable. Je pense qu’a terme, je vais remplacer le radiateur par un grand modèle prévu pour dissiper la chaleur émise par gros processeur. Le tout, sans ventillateur, en utilisant juste le flux d’air du ventilateur de l’alimentation électrique.

Conclusion

Voila comment se faire un NAS haute performance pour un budget faible… Evolutions possibles : D’un point de vue logiciel, vu la puissance disponible, quasiment tout est envisageable, on verra selon les besoins qui se présenteront… Au niveau matériel, la carte mère possède un port PCI express 1X et 2 PCI… Je pourrais donc ajouter une carte réseau gigabit, ou encore un contrôleur SATA et quelques disques suplémentaires si les 1To ne suffisent plus…