Jb in a nutshell

Open Sourcier
posts - 66, comments - 11, trackbacks - 0

dimanche 10 juillet 2005

Migration

Le temps est au changement ici.
Je migre. Je vais quitter Paris à la fin de l'été, dans une ville où il n'y a pas de métro.
Demain, je vais recevoir mon PowerBouquetin que j'ai commandé il y a quelques semaines. Fini Windows comme OS principal.
Aujourd'hui, mes deux blogs, anglais et français, déménagent chez moi: http://evain.net/blog/

Let's keep moving!

posted @ 18:02 | Feedback (22)

vendredi 10 juin 2005

GreaseMonkey. Appropriez vous le web !

Mark Pilgrim, personnage du web reconnu en particulier pour ses ouvrages en ligne, souvenez vous, le fameux Dive Into Python vient de publier un nouveau bouquin en ligne. Il s'attaque ici à un add-on de FireFox, qui commence à faire pas mal de bruit: GreaseMonkey. Bien évidemment, l'ouvrage se nomme Dive Into GreaseMonkey

Cette extension vous permet tout simplement de modifier à loisir les pages que vous visitez à l'aide de ce bon vieux JavaScript. Vous allez donc pouvoir, en utilisant le standard W3C DOM modifier les pages de vos sites préférés. Des tas de scripts existent déjà, vous pouvez jeter un coup d'oeil sur ce listing, vous verrez des modifications de Google, de GMail, d'Amazon, et autres sites qui font parti du quotidien que nous Geeks, adorons.

Alors pour regarder un peu, j'ai réfléchi, et j'me suis dis, qu'est ce que je pourrais bien faire pour améliorer mon quotidien. Il y a un site que je visite pas mal, c'est le DotNetLogue. Mais sur cet aggrégateur, tous les posts ne m'intéressent pas, en particulier ceux qui sont mal formatés. Alors j'ai retroussé mes manches, et hop, j'ai décidé d'essayer.

Comme un bon code vaut mieux que deux tu l'auras, jettons y tout de suite un coup d'oeil:

/*
 * DotNetLogue cleaner
 * Copyright 2005 Jb Evain  <jbevain@gmail.com>
 * This script is licensed under the GNU GPL 2.
 * See: http://www.gnu.org/copyleft/gpl.html
 */

// ==UserScript==
// @name          DotNetLogue cleaner
// @namespace     http://evain.net
// @description   Read only the feeds you're interested in
// @include       http://www.labo-dotnet.com/dotnetlogue*
// ==/UserScript==

(function () {

    var black_list = ["http://www.c2i.fr"];
    
    function isBlackListed (entry) {
        var href = entry.previousSibling.previousSibling.firstChild.getAttribute ("href");
        for (var i = 0; i < black_list.length; i++)
            if (href.indexOf (black_list [i]) > -1)
                return true;
        return false;
    }

    var divs = document.getElementsByTagName ("div");
    for (var i = 0; i < divs.length; i++) {
        var entry = divs [i];

        if (entry.className == "blogentry" && isBlackListed (entry)) {
            entry.previousSibling.previousSibling.style.display =
                entry.style.display = "none";
        }
    }
}) ();

N'est ce pas tout simple ? Il n'a suffit qu'un peu de reverse engineering sur le code HTML pour savoir quoi cacher, et c'était bon. Une fois GreaseMonkey installé, il ne reste plus qu'a enregistrer ce bout de code, et à visiter tranquillement le DotNetLogue. Bien sur, vous pouvez ajoutez des éléments à la liste 'black_list'.

Pour les plus incrédules, voici deux screenshots, l'un avant d'avoir activé mon script, l'autre après. Notez la mine réjouie du singe en bas à droite.

Nous vivons une époque formidable :)
Télécharger FireFox, GreaseMonkey.

posted @ 01:05 | Feedback (23)

jeudi 19 mai 2005

Pourquoi Ruby ?

Mon ami et collègue Patrice Lamarche a été l'autre fois fort impressioné devant des statistiques où il était question de développeurs, et de leur préférences pour les langages de programmation. Il croyait en effet, malgré que je lui assurais le contraire, que j'étais le seul européen à connaitre, et surtout à utiliser, le langage Ruby

Non seulement il avait tord, mais en plus, j'ai ici de quoi faire en sorte que sa pensée soit de plus en plus fausse. Alors si vous vous demandez pourquoi par exemple, dans un élan de pragmatisme, j'ai créer mon propre générateur de code pour Mono.Cecil en utilisant ce langage, pourquoi je m'en sers dès que j'ai une tâche scriptable à réaliser, j'ai ici le lien qu'il vous faut !

En espérant seulement que vous pratiquez assez bien l'anglais pour bien vous poiler, et surtout, pour apprendre à aimer ce petit bijou qu'est le Ruby !

posted @ 22:45 | Feedback (24)

mardi 19 avril 2005

Un paquet de Caml

Depuis un moment, on entend pas mal parler de Caml par ci, Caml par là chez les chers pointeurs.

Oh mais oh !, c'est un peu vite oublier nous français, ce que c'est que le vrai Caml ! C'est d'abord et avant tout un petit bijou national, développé par l'INRIA, et un excellent langage de programmation fonctionnel. Son implémentation la plus utilisée est l'Objective Caml, qui intègre les paradigmes objets. C'est un langage qui peut aussi bien être interprété que compilé, et extremement rapide, avec des performances proches voir supérieures aux C/C++ pour la même utilisation, tout en gardant à l'esprit qu'il gère tout seul la mémoire par exemple..

Un petit exemple quand même pour voir à quoi ça ressemble, un calcul simple de factorielle, j'espère que tout le monde se souvient comment ça se calcule :

(*
 * O'Caml Example
 * fact.ml
 *)
 
let rec fact = function
    0 -> 1
  | n -> n * fact (n - 1);;
  
let main () =
    if (Array.length (Sys.argv) > 1) then
        let arg = int_of_string (Sys.argv.(1)) in
        print_string("resultat: ");
        print_int(fact (arg));
        print_newline();;

main ();;

(* ocamlc -o fact.exe fact.ml *)

N'est ce pas formidable ? L'exemple est par trop simpliste, et ne montre pas vraiment la puissance et les possibilités du langage, cela dit, je vous laisse creuser, ça mérite son coup d'oeil.

[UPDATE] : Ah oui tiens, si vous voulez vous faire les mains sur un langage fonctionnel tout en restant sur .net, vous pouvez toujours le faire sur les langages suivants :

  • Nemerle : volontairement proche du C# dans sa syntaxe, marche aussi bien sous Mono que sous .net
  • F# : Une implémentation de l'Objective Caml cité plus haut par MSR
  • SML.NET : Une implémentation du Standard ML, sponsorié par MSR
Vous n'avez plus aucune raison pour ne pas se pencher la dessus maintenant :)

posted @ 21:40 | Feedback (33)

dimanche 17 avril 2005

Pendant ce temps, à Vera Cruz

x-develop Pendant que le monde entier retient son souffle et attend la beta 2 de Visual Studio 2005, cet engin de 2 gigots 8 pour sa version standard, et de 3 gigots 7 pour la version Team System, la version 1.0 de l'IDE d'Omnicore X-Develop a sorti ses babines depuis une bonne semaine. Pour information, j'utilise cet outil depuis sa première version publique, et elle me convient parfaitement, moi qui ne fais que de la manipulation de texte, d'autant plus que c'est le seul IDE multi plateforme, ce qui me permet de me retrouver aussi bien sous Linux que sous Windows dans mon IDE favori, et de cibler aussi bien Mono que le Framework .net.

La grande classe quand même, d'autant plus qu'il gère aussi bien le Java 5.0 que .net 2. The Server Side .net a une news la dessus, tous les détails ici : Sortie de X-develop 1.0

Bon évidemment, ce n'est pas gratuit, et il vous faudra débourser quelques 300$ pour une version entreprise, et 50$ pour une version estudiantine. Quant à moi, pour me remercier de mes bons et loyaux services en tant que reporter de bugs, Omnicore a eu la gentillesse de m'offrir une licence. Donc tout va bien, je peux utiliser mon outil sans payer un sou de ma poche.

posted @ 20:09 | Feedback (32)

Ajax, le web plus blanc que blanc

Depuis quelques mois, un mot est dans la bouche de tous les développeurs web : Ajax. Popularisé par les outils Google Mail et Maps, et d'autres frameworks, on rencontre de plus en plus de sites offrant des fonctionnalités dynamiques, sans pour cela que l'on change de page. La version 2 d'ASP.NET intègre en standard ces fonctionnalités, qui sont par exemple utilisées pour peupler dynamiquement un TreeView, sans changer de page à chaque ouverture d'un noeud. Le terme Ajax est un terme générique pour ces techniques dynamiques.

J'avais ouvert une catégorie Ruby, en espérant prendre le temps de vous parler de ce langage et de tous les outils qu'on trouve autour, je ne l'ai jamais fais. Pas très grave, il faut juste savoir qu'un outil commence à faire du buzz, et que les grandes gens en parlent. Il n'en faut pas plus en général pour que les gens commencent à s'y intéresser. Cet outil c'est Ruby on Rails, un framework léger de développement web, entièrement écrit en Ruby, qui offre une rapidité et une puissance de développement assez impressionante, tout en gardant le côté script qui plait tant aux développeurs php. Un bon compromis pour des applications ne nécessitant pas de dégainer les outils lourds comme les Tapestry, Struts, JSF de chez Java, ou encore de l'ASP.NET. En tout cas, c'est un framework qui mérite qu'on y jete un coup d'oeil !

Il y a quelques temps, Ruby on Rails s'est dotée d'une librairie JavaScript à la pointe, pour pouvoir bénéficier de fonctionnalités Ajax : Prototype. Cette librairie écrite dans un excellent JavaScript, est disponible gratuitement dans une license proche de la MIT, ce qui signifie que vous pouvez tout à fait l'intégrer dans tous vos développements, aussi bien libres que commerciaux, tant que vous laissez le copyright. Nous allons tout de suite en voir un petit exemple.

Imaginons un tout début de lecteur RSS en mode web. C'est un besoin où une utilisation de la méthodologie Ajax est tout à fait appliquable : pas besoin de réferencer le contenu de l'aggrégateur, besoin d'une interface sympa et réactive, bref, allons-y.

Tout d'abord la partie serveur, simpliste, qui renvoie sous forme de document XML un item d'un flux RSS. On passe un indice, et hop, l'élement est extrait avant d'être renvoyé au client. Cette partie a été réalisée en Ruby, parce que je le vaux bien. La source se passe de commentaire et est disponible ici : la source du serveur Ruby.

Ce qui nous intéresse c'est bien sur le client, voyons un peu ce qu'il s'y passe, quand on demande au serveur un item en particulier :

var url = "http://evain.net/ajax/item.rbx";

function setArticle(id) {
    var opts = { method : "get",
                 parameters : "id=" + id,
                 onComplete : receivedHandler,
                 asynchronous : true };
    var req = new Ajax.Request(url, opts);
}

Le code est simpliste, on ne fait qu'utiliser un objet Ajax.Request, fourni par la libraire Prototype. La partie intéressante se situe dans la déclaration des options, où l'on spécifie une fonction qui sera déclenchée quand le flux aura été téléchargé entièrement : receivedHandler. Regardons son implémentation :

function nodeValue(node, name) {
    var childs = node.getElementsByTagName(name);
    if (childs.length > 0 && childs.item(0).childNodes.length > 0)
        return childs.item(0).childNodes.item(0).nodeValue;
    return "";
}

function receivedHandler(remote) {
    var doc = remote.responseXML.documentElement;
    if (doc) {
        $("auteur").innerHTML = nodeValue(doc, "author");
        $("article").innerHTML = "<a href=\"" + nodeValue(doc, "link") +
                "\">" + nodeValue(doc, "title") + "</" + "a>";
        $("date").innerHTML = nodeValue(doc, "pubDate");
        $("desc").innerHTML = nodeValue(doc, "description");
    }
}

Ici, tout simplement, on récupère le flux de retour sous forme d'un document XML manipulable selon le standard DOM, terrain connu donc. Tricky, la librairie Prototype nous fourni une fonction $ pour récupérer directement un élement en fonction de son id, ensuite on va chercher le corps d'un noeud, pour l'attribuer comme corps des éléments correspondants. Easy :)

Bon, si on voyait un résultat "fini" qui marche ? C'est par ici : la démonstration finale. Normalement ça devrait marcher sous IE6, FireFox et Safari, donc bonne démo. Il reste que bien que trivial, l'exemple de la démo je pense, représente un marché d'avenir, gageons qu'un ponte comme Google, muni de moyens éprouvés pour la recherche, améliore bientôt son GMail, ou nous fasse un GFeed, où nous pourrions se balader simplement dans nos feeds préférés, rechercher dedans, et le tout, avec une interface de "killer app".

Voila, nous avons vu rapidement comment mettre en place d'une manière simpliste une méthodologie Ajax dans une page internet, libre à vous de l'implémenter maintenant dans vos applications.

posted @ 17:14 | Feedback (76)

mercredi 23 mars 2005

Journées Académiques 2005

J'ai particulièrement regretté de ne pas avoir pu assister à cet évenement l'année dernière, je me rattrape donc cette année, en ayant de surcroit, l'honneur d'avoir une session à moi, pour pouvoir exposer devant des chercheurs et des enseignants, ma vision de "La programmation orientée aspect sur le framework .net". Vu la masse de matière grise qui sera alors accumulée, je suis sur d'avoir des retours et des discussions passionantes !

Je suis d'autant plus impressioné, que pendant les trois jours que durent ces journées MSR, les personnes présentes auront l'occasion d'assister aux sessions de personnes comme John Lefor, responsable du projet Phoenix, ou encore Serge Lidin, auteur de l'ouvrage Inside .net IL Assembler, et auteur des outils ilasm, ildasm, peverify, etc. Bref, tout ce qui m'intéresse, et que j'écris avec les développeurs du projet Mono.

Le planning et les inscriptions ici !

posted @ 23:38 | Feedback (18)

mercredi 2 mars 2005

DevDays & Evangelisme

Je serais si tout va bien aux DevDays de, dans l'ordre, Strasbourg, Lille, Lyon et Paris.
Certains le savent, j'ai rejoins la petite équipe des développeurs Mono il y a quelques mois.
Donc si le sujet de Mono vous passionne ou vous intrigue, bref, si vous avez la moindre question, n'hésitez pas à venir me la poser.

Je devrais tourner aux alentours du stand Laboratoire .net, et si par hasard je n'y suis pas, hurlez mon nom, je viendrais !

A bientôt.

PS: Hé, les gentils organisateurs, si avez des questions sur Mono pendant les Q&R, je serais bien sur ravi de venir répondre. Voir faire en sorte de dire aux gens qu'ils peuvent poser des questions sur Mono, ça pourrait rendre le truc encore plus intéressant non ?

posted @ 10:58 | Feedback (28)

dimanche 13 février 2005

Antitrust, le film, les sources

Ce soir, j'ai re-revu ce film qui s'appelle Antitrust.

Le genre de film qu'on va voir pendant la fête du cinéma, en été, et qui laisse un petit souvenir sympa. Surtout que ça parle de petits génies de l'informatique, de grosses boites, d'open source. Bref c'est marrant, surtout si on veut pas se prendre la tête. Et puis c'est toujours sympa dans un film où on voit ne serait-ce qu'un tout petit bout de votre métier. Oui parce que je ne compte plus les films où les gens programment en manipulant des figures géométriques, pondent du code à la vitesse de la pensée, où trouvent des mots de passe par petits bouts... Donc dans, ce film, on peut voir à plusieurs moments du code, du vrai, si si... Et puis comme j'avais que ça à faire (je ments effrontément), j'ai cherché sur Google si le code qu'on voyait, correspondait bien à quelque chose. Et la, surprise, pas mal de code provient de vrais projets, allez comme, je suis sympa, je vous passe tout ça :
Il y a deux autres moments où on voit du C++, la première fois ça ressemble à une appli Qt, et la seconde, on dirait l'implémentation d'une décompression Zip, mais pas moyen de retrouver la source.
Bon allez, si on retournait bosser sérieusement !

posted @ 02:40 | Feedback (22)

jeudi 10 février 2005

IE l'invincible

Purée,

Le buzz fait rage. Une faille de sécurité dans le nouveau naviguateur à la mode, c'est la panique, heureusement, notre bon vieux bastion des butineurs n'est pas touché par la dite faille. Pour en avoir lu des tartines, je vais donc prendre mon pot de culture informatique, et en étaler une bonne tranche (et oui, un, il en reste qu'un fond).

Donc du coup, posons nous la question, qu'est ce que c'est que cette faille tant déclamée ? Cette dernière permet de faire croire à l'utilisateur qu'il clique sur un lien x, tout en le dirigeant sur y. Mais comment cela se faisse (droite ou gauche, à vous de choisir, bien que les deux soit une option) ? C'est très simple. Les gens qui utilisent un navigateur tapent leurs adresses en ASCII, oui, cette bonne vieille table des symboles. Cela ce n'est pas suffisant, pour bien des gens, alors les gens bien pensant de ce monde on fait l'IDN, pour international domain name, qui permet tout simplement d'écrire des URL en UTF-8. Simple non ? Le problème, c'est dans la conception même de l'engin, il peut y avoir des parties qui ont la même représentation, sans avoir la même valeur (code dans la table en fait). Et donc du coup (deuxième), on clique sur un lien, en ayant l'impression de butiner X, tout en butinant Y. C'est un peu comme sortir avec des jumelles vous voyez ?

Alors ce qui fait crier haut et fort les gens, c'est que IE n'est pas touché par cette faille, tandis que le browser tant déclamé, et grignotant des parts de marché l'est. Etonnant non. Cela dit, FireFox est sujet à cette faille, tout comme tous les navigateurs implémentant l'IDN, comme Opera, Konqueror, etc. Oui, nous l'avons vu, c'est un problème de conception au niveau même du protocole. Alors pourquoi ce bon vieux IE n'est pas sensible ? Tout simplement parce qu'il n'implémente pas IDN. Pour ce faire, téléchargez un plugin IDN pour IE, et vous aurez, comme pour le reste des gens, un naviguateur sensible à cette faille.

Pour la petite comparaison, c'est comme dire qu'un navigateur est sécure, car il n'est pas connecté à une JVM, ne lit pas les CSS, ne comprend pas l'ECMAScript, et si possible, préfere afficher seulement du texte. J'exagère ? Bien sur, cependant, comparons, s'il vous plait, les choses avec leurs équivalent.

Alors pourquoi ce buzz ? Parce que beaucoup de gens ont annoncés que FireFox était très sécurisé, et à la moindre faille, les gens déchantent. Et les pro IE de se frotter les mains. Prenons par exemple un site que Mr Kimmerlin aime à présenter, Secunia, vous y trouverez le détail des failles pour IE et pour FireFox, voir d'autres navigateurs, et vous pourrez comparez de vous même le nombre de failles et la gravités de celles-ci. Bien sur qu'il y a des failles dans FireFox, et plus il sera utilisé, plus on en trouvera, nulle part il n'y a de code parfait. Allez Messieurs Dames, un peu de bonne foi et d'objectivité, ça ne ferait pas de mal.

Allons, utilisez donc le navigateur qui a votre préférence, mais ne criez pas au feu à la moindre étincelle chez le voisin... Libre à vous d'utiliser un browser en paille par contre.

EDIT: Ce n'est pas vérifié, mais il semblerait que le GBrowser, le navigateur du futur, soit aussi sensible à cette faille.

posted @ 00:52 | Feedback (18)

samedi 8 janvier 2005

Il me pousse des poils


posted @ 14:06 | Feedback (20)

mercredi 29 décembre 2004

Fonctions anonymes, Pointeurs de fonctions, Closures, JavaScript

Etant donné l'actualité mouvementée, un petit post pour se reveiller.

J'ai mis à jour ma petite librairie JavaScript, toujours disponible ici.
Les petites nouveautés, c'est des petites fonctions inspirées du monde ruby, qui permettent de travailler avec ce que l'on pourrait appeller des closures. Un petit exemple :

var ppj = new Array("Pierre", "Paul", "Jacques");
ppj.each(function(elem) {
    document.write(elem + "<br />");
});

Très simple à implémenter en JavaScript cette fonction each, surtout quand on sait qu'en JavaScript une fonction est un type comme un autre :

/**
* Appelle une fonction pour chaque element
* du tableau
*/
Array.prototype.each = function(functor) {
    for (var i = 0 ; i < this.length ; i++) {
        functor(this[i]);
    }
}

Franchement, c'est classe non ? Si on a besoin de travailler impérativement avec les index, on peut utiliser cette fonction :

var ppj = new Array("Pierre", "Paul", "Jacques");
ppj.eachWithIndex(function(elem, i) {
    document.write("at " + i + " : " + elem + "<br />");
});

Bien pratique, j'ai rajouté cette fonctionnalité sur ma Hashtable, du coup, ça donne ça :

var ht = new Hashtable();
ht.put("jbe", 21);
ht.put("pvb", 24); // et toujours pas marié

ht.each(function(key, value) {
    document.write(key + " is " + value + "<br />");
});

Alors, qui a dit que le JavaScript était un "sous" langage. C'est d'autant plus appréciable qu'on le retrouve un petit peu partout, bref, comment professionaliser le développement XUL par exemple hein ?

posted @ 14:45 | Feedback (28)

lundi 20 décembre 2004

Un nouvel IDE a vu le jour !

Il y a peu je me plaignais du manque de caractère de SharpDevelop.
Ce matin, Hans Fratz sur la liste de Mono a annoncé la preview d'un nouvel IDE très prometteur : x-develop.


Hey, good work !

posted @ 14:15 | Feedback (16)

vendredi 10 décembre 2004

Google & IntelliSense

Google, des gens qui n'ont pas fini de nous surprendre.
Tout droit sorti des labs, la dernière petite nouveauté, c'est la complétion de votre requête.
C'est assez impressionnant, petit exemple :


Pour essayer vous même :

lundi 22 novembre 2004

Ubuntu

Pour des raisons que le monde entier découvrira un jour, je viens d'installer un Linux sur mon ordinateur. J'ai choisi comme distribution Ubuntu, car la philosophie du produit est sympa, et tout tourne à merveille. Ubuntu pour les gens qui ne connaissent pas, c'est une Debian un petit peu retouchée, je vous invite à aller voir le lien que vous trouverez ci-dessous. Deuxième lien bien pratique, un LiveCD Linux, basé sur une Gentoo, qui m'a permis de resizer mes partoches NTFS, sans rien perdre, sans douleur, sans chemise, ni pantalon. Et puis vu le nom je suis sur que ça peut servire à des tas d'autres trucs.

posted @ 07:24 | Feedback (44)