June 2006

A bit older

Thu 29 June 2006

So, an happy birthday to me (so original). 22 isn’t not that old. Keep believing.

Aujourd’hui, je suis un peu plus vieux. Et paf, 22 v’là l’vieux.

Digg it!, so del.icio.us, blogmarks, reddit.

More with queens

Sat 24 June 2006,

Following my last entry about a genetic algorithm, here’s a better way to solve this problem, with the min-conflict algorithm (see page 15).

░ ░ ♛ ░ ░ ░ ░ ░ ░ ░ 
 ░ ░ ░ ░ ░♛░ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ░ ░ ░ ░♛
 ░♛░ ░ ░ ░ ░ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ░ ░ ░ ♛ 
 ░ ░ ░ ░♛░ ░ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ♛ ░ ░ ░ 
 ░ ░ ░ ░ ░ ░ ░ ░ ♛ ░
░ ░ ░ ░ ░ ░ ░ ░♛░ ░ 
♛░ ░ ░ ░ ░ ░ ░ ░ ░ ░
░ ░ ░ ░♛░ ░ ░ ░ ░ ░ 
 ░ ░ ♛ ░ ░ ░ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ░ ♛ ░ ░ 
 ♛ ░ ░ ░ ░ ░ ░ ░ ░ ░
░ ░ ░ ♛ ░ ░ ░ ░ ░ ░ 
 ░ ░ ░ ░ ░ ░ ░ ░♛░ ░
░ ░♛░ ░ ░ ░ ░ ░ ░ ░ 
 ░ ░ ░ ░ ░ ░ ♛ ░ ░ ░
░ ░ ░ ░ ░ ░♛░ ░ ░ ░ 
 ░ ░ ░ ░ ♛ ░ ░ ░ ░ ░

A solution for the 20 queens problem. You can download the Python script to try it at home (nqueens.py is required).

Dans la série de l’entrée précédante, j’ai essayé avec l’algorithme du conflit minimum (voir page 15).

Même s’il faut parfois repartir à zéro, il est plus aisé d’obtenir des résultats sur de gros damiers (voir ci-dessus). Télécharger le script Python pour essayer ça vous même (nécessite le script précédant).

Related entries

Digg it!, so del.icio.us, blogmarks, reddit.

Playing with genetic

Sun 18 June 2006, ,

Since I’ve received my copy of Artificial Intelligence : A Modern Approach, I’m enhancing my knowledges in AI. My past school knowledges aren’t bad but I need to pratice on my own to learn better.

The problem of the 8 queens on a chessboard is a famous one. I’ve wrote a little Python script finding a solution using a genetic algorithm. I wanted to do it in LISP, but I’m not keen in it.

░ ░ ░ ░♛
 ░♛░ ░ ░
♛ ░ ░ ░ 
 ░ ░ ♛ ░
░♛░ ░ ░ 
 ░ ░♛░ ░
░ ░ ░ ♛ 
 ░ ♛ ░ ░

I find it funny but a min-conflict algorithm should do it better, keep trying.

Depuis que j’ai reçu Artificial Intelligence : A Modern Approach, je (ré)apprends, approfondis les notions qui nous ont été donné aux cours d’IA l’année dernière.

Nous n’avions pas touché aux algorithmes génétiques, c’est assez funky. Un des problème du livre est le célèbre problème des 8 dames où il s’agit de placer 8 dames (sur un échiquier) dans qu’aucune ne puisse en atteindre une autre, sachant une damme attaque en ligne et en diagonale.

La solution ci-dessus a été obtenu grâce à ce script Python. Il y a de quoi jouer avec le facteur de sélection naturelle et de taille de la population. Dans le livre il ne font pas de sélection naturelle mais prennent leurs qualités (fitness) influe sur la chance d’être choisit pour engendrer la prochaine génération.

Digg it!, so del.icio.us, blogmarks, reddit.

Fixing for IE

Sun 11 June 2006,

I’m proud of my tag cloud but MSIE wouldn’t deal with the JavaScript I’ve wrote for parsing this RDF/XML file.

The DOM way to get elements with a special namespace is the getElementsByTagNameNS(namespace, tagname). IE don’t know what is a namespace and you have to use the simple getElementsByTagName way with the XML notation namespace prefix:tag name. (Some examples bellow)

If it seems to be easier, it’s false in the XML sight. The namespace prefix isn’t absolute and anybody can call it like it want. Only URI are absolute.

Le tag cloud dont je suis assez fier ne fonctionnait pas avec MSIE car le script JavaScript lit un fichier RDF/XML contenant des namespaces (espace de noms) différents. La méthode avec Gecko (le moteur de rendu de Firefox) est celle-ci :

// les <p> d’un document XHTML
document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml','p');

// les <content:encoded> d’un fil RDF/RSS
document.getElementsByTagNameNS('http://purl.org/rss/1.0/modules/content/', 'encoded');

Internet Explorer ne sait pas connait pas les namespaces donc, il faut lui spécifier le nom réel de la balise.

// les <content:encoded> avec IE
document.getElementsByTagNameNS('content:encoded');
        

Cool, c’est vachement plus simple. Et bien non, si c’est plus simple, deux documents peuvent être exactement les mêmes (XML-ment parlant et où les namespace sont définis différemment.

// cet élément XML
<html xmlns="http://www.w3.org/1999/xhtml" />
// est équivalent à celui-ci
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml" />
        

NB : il existe également getAttributeNS qui se comporte de la même manière.

Digg it!, so del.icio.us, blogmarks, reddit.

Manipulating INI file

Mon 05 June 2006, ,

When you build a (web) application, you sometimes want to store user configuration (like password (sha1’d of course) or what else). What’s the nicest solution ?

Database ?
f**king hell, seriously ? Forget that.
XML file ?
100% geek but pain-in-the-arse to parse and maintain.
INI
So easy to understand, comment, diff.

I’m not very umpartial because I dislike database-usage-for-everything and because I’ve spent lot of time to build the following PHP class that parse and write ini file. Ini files are used in doContent for every things that are configurable (but there’s some XML too, because it rocks).

INI file

; A comment
[section1]

; variable A
var_a = toto

var_b = tata

Manipulating with PHP

<?php
include_once("ini.class.php");
$filename = "test.ini";

//--
header('Content-type:text/plain');

// =& for PHP 4 (avoid the object copy)
// true for processing section (default is false like parse_ini_file)
$data =& new ini($ini, true);

$data->setValue(pi(), 'var_a', 'section1');
$data->setValue('hello world!', 'var_b', 'section1');
$data->setValue('Lorem lipsum', 'var_c', 'section2');

// display the file (-->__toString() not necessary for PHP5)
echo $data->__toString();
?>

The result

; A comment
[section1]

; variable A
var_a = 3.14159265359

var_b = hello world

[section2]
var_c = Lorem lipsum

As you can see, all the comments are preserved, the values are modified and the new section section2 and its value var_c are correctly added.

Don’t forget to protect yourself

Don't autorize the direct access to these files. For example, you can do it with a traditionnal Apache .htaccess that contains :

<Files *.ini>
    Order deny,allow
    Deny from all
</Files>

Something that like this at the first line of your ini can avoid the php inclusion :

; <?php exit();?>

And a big hurray for Batiste, he’ll start his new job tommorrow.

Lors de la création d’application internet, il est souvent intéressant de pouvoir enregistrer des éléments de configuration, le bon vieux fichier ini. Ce que nous avons fait pour doContent, mais si ce sont des fichiers simples à lire avec PHP, il est plus difficile de les modifier. Voici une petite classe en PHP (4 ou 5) permettant de les manipuler avec aisance.

Lire l’exemple ci-dessus.

Le résultat final est un fichier ini dans lequel les commentaires existant ont été conservé, les modification répercutées et les ajouts de nouvelles valeurs appliqués. Et n’oubliez pas de protéger vos fichiers .ini, par exemple via un .htaccess pour Apache (voir ci-dessus).

Complétement hors sujet : Batiste s’est trouvé un job dans le petit milieu du développement web (avec des technos proprios, mais qui ne demandent qu’à être remplacées, non ? forcément !)

Digg it!, so del.icio.us, blogmarks, reddit.

Finding a job : my tag cloud

Sun 04 June 2006, , ,

After my first refuse for a job in Zürich, in my quest for finding a job where I can discover new cultures, countries and improve my german of english skills, I realised that my resume is not very clear. What I need is a tool that presents me globally of focused on some projects.

The idea is purely Web 2.0 : tags (inspired by the GUADEC 2006). So, I wrote my résumé in RDF, parse it with JavaScript and there is my tag cloud :

tagcloud

It’s not perfect but I think it’s pretty cool. If I could find a job where I can do some Python, XSL(T) with a little bit of Ajax, I buy !

Après avoir essuyé un premier non dans ma quête d’un futur emploi dans lequel je puisse découvrir un tout nouvel environnement tant culturel, linguistique que géographique. Je me suis rendu compte que mon CV n’était pas assez parlant et qu’il me serait utile d’avoir un moyen de me présenter de manière globale, mais également de manière plus spécifique en fonction des projets que j’ai (co-)réalisé.

Inspiré par la mouvance Web 2.0, tagging, etc. et par le nuage de tags du GUADEC 2006. Je me présente à vous taggé de partout (voir image ci-dessus). D’un point de vue technique, c’est un peu de RDF et de JavaScript et quelques heures de boulot.

C’est une première approche, qui est intéressante mais pas parfaite. Il est vrai que si je pouvais trouver un job où je ferais du Python, XSL(T) avec un peu d’Ajax pour que ça brille, j’achète.

Digg it!, so del.icio.us, blogmarks, reddit.