Romeo ne s'est pas fait en un jour


A toutes mes groupies, l'url de ce blog a été changée en :

http://blogs.labo-dotnet.com/blogs/jbevain

Et les feeds :

http://blogs.labo-dotnet.com/blogs/jbevain/rss.aspx

Mon blog sérieux, lui, est toujours ici :

http://www.dotnetguru2.org/jbevain/

Bonne fin de week-end!

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 ?

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 !

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.

Il me pousse des poils


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 ?

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 !

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 :

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.

Un jour, oui un jour le ferai !

Je suis tombé amoureux d'un nouveau projet, oui, un de plus.

Ca fait un tiers d'année que je suis au labo.net, et le Java me manque. Ce soir, au lieu de bosser comme je devrais le faire, et suite à un post sur la ML développeur de Mono, je me suis a butiner frénétiquement l'Internet multimédia, jusqu'à tomber la dessus : JNode. Qu'est ce que JNode, c'est tout simplement un OS écrit à plus de 90% en Java. Seule la couche basse est écrite spécifiquement pour la plateforme (seul les x86 sont supportés pour le moment). Et tout le reste est écrit en Java, et mes amis, quel Java. Tout est très propre, très bien écris, avec une magnifique architecture ouverte, où l'on peut se brancher un peu partout. Mon rêve en fait. Ca n'utilise que du bon, Ant, Eclipse, Jakarta-commons, et tous plein de projets tous aussi géniaux les un que les autres.

Imaginez un peu un OS où l'on pourrait choisir ses composants très facilement, se brancher de manière sécurisée n'importe où ou presque dans l'OS, que ce dernier soit portable partout, qu'il bénéficie d'un formidable existant. C'est tout ça JNode. C'est quand même impressionant. Je dois avouer je suis bluffé quand même. C'est triste je n'ai pas réussi à le faire fonctionner sur Virtual PC, même avec le SP1, qui malgré deux erreurs, s'est installé (il est quand même fort ce SP1), il va falloir que je retrouve où j'ai mis ma licence VMWare...
EDIT : J'ai quand même réussi à le faire tourner avec QEMU, après avoir compilé le machin, c'est marrant, pas très rapide, mais c'est quand même fort, mais pas très rapide.

Quand je pense à toutes les possibilitées que ça ouvre, c'est dingue. Imaginez une FS type Unix où l'on pourrait accrocher ses propres méta données, oui, comme pour WinFS (un beau jour peut-être), ou comme BeOS le faisait si bien. Dans vos programmes vous les retrouvez ni une ni deux. Ensuite imaginez ça combiner avec tous les petits plus du langage en 5.0, comme ils refont une VM, on peut très bien espérer un support des générics pour de vrai. Ca rentre tout à fait dans mes fantasmes technologiques, il y a des millions de choses à faire.

Un jour, il faudra le faire en C# quand même, on va pas laisser ces c*ns d'intellos nous empêcher de devenir CRS !!!

Je redonne le lien, au cas ou j'ai réussi à vous donner (au moins) envie d'aller voir :

Ruby, état du lard

De bon matin, et parce que j'ai été ammené il y a peu à utiliser un de mes langages favoris, le Ruby, je vais me fendre au fil de quelques articlets à venir de divers points comme :
  • La découverte du Ruby
  • Tous ces petits plus qui vous changent la vie en Ruby
  • LE framework ultime pour le développement web en Ruby
  • Et surement d'autres choses...
En attendant, et comme il serait dommage de ne pas vous appater avec un petit peu de code, voila un lien fort sympathique : Comme vous pouvez le constater en rafraichissant la page, la liste de lien est aléatoire.
Vous pouvez par exemple regarder sa source première (qui n'est pas de mon fait), ici :

require 'sqlite'

db = SQLite::Database.new ( "../sample4.db", 0 )
rs = db.execute ( "SELECT id FROM sample4;" )

na = []

def rebuild ( arr )
    arr2 = []
    arr.each { |row|
        if ( !row.nil? )
            arr2.push ( row )
        end
    }
    return arr2
end

def setValue ( arr, arr2 )
    if ( arr.size > 0 )
        r = rand ( arr.size )
        arr2.push ( arr[ r ] )
        arr[ r ] = nil
        arr = rebuild ( arr )
        return setValue ( arr, arr2 )
    end
    return arr2
end

na = setValue ( rs, na )

na.each { |id|
    db.execute ( "SELECT title, url FROM sample4 WHERE id=#{id['id']};" ) { |lien|
        puts "<a href=\"#{lien['url']}\">#{lien['title']}</a>"
        if ( id != na.last )
            puts "<span class=\"separator\"> | </span>\n"
        end
    }
}

Et la version actuelle (que j'ai écrite) :

require 'sqlite'

db = SQLite::Database.new( "../sample4.db", 0 )
rs = db.execute( "select title, url from sample4;" )
ar = [ -1, 1 ]
res = rs.sort { |x,y|
    ar[ rand( 2 ) ]
}

res.each { |record|
    puts( "<a href=\"#{record[ 'url' ]}\">#{record[ 'title' ]}</a>" )
    puts( "<span class=\"separator\"> | </span>" ) if( record != res.last )
}

Comme vous pouvez le constater, le SGBD utilisé est sqlite.
Oui, les ruby-istes n'ont pas attendu php5 pour découvrir sqlite.

puts("Stay tuned !")

Maître Renard

The Daily WTF !

Après avoir modifié un peu Rail, et bien pesté, je suis tombé sur un site magique :
Les archives, c'est là qu'il faut aller !
Mon dieu, mais je connais tellement de développeurs dont le code pourrait être ainsi mis en valeur...

Oui, moi, compris...

[EDIT] Un que j'adore :

AspectDNG on Mono step 1

Grand petit pas pour AspectDNG ce soir, j'ai réussi à bidouiller Rail pour passer outre certains bugs de Mono. Du coup, premier round-trip réussi sous Mono.
Qu'est ce qu'un round-trip ? C'est tout simplement le fait de passer une assembly à la moulinette ILML, et ré-assembler l'assembly à partir de l'ILML.

D:\temporary\ilml>hello.exe
Hello World !

D:\temporary\ilml>il2ilml hello.exe hello.exe.xml
D:\temporary\ilml>ilml2il hello.exe.xml hello.new.exe
D:\temporary\ilml>hello.new.exe
Hello World !

D:\temporary\ilml>mono il2ilml.exe hello.exe hello.exe.xml
D:\temporary\ilml>mono ilml2il.exe hello.exe.xml hello.new.exe
D:\temporary\ilml>mono hello.new.exe
Hello World !

D:\temporary\ilml>

On va y arriver !

Mono Summit

Les gens qui font Mono se sont réunis autour d'une table, le compte rendu est disponible ici :

Summit Notes

Important, si vous voulez savoir de quoi sera fait le futur proche de Mono.