samedi, 30 décembre 2006

Surchages de méthodes statiques en PHP

Un tout petit exemple pour exposer le problème :

class A {
  public static function f() {
    echo get_class();
  }
}

class B extends A {}

A::f();
B::f();


A::f() va afficher A, par contre B::f() va aussi afficher A, alors que la réponse attendue serait B.

Ce comportement est connu des développeurs OO, peut s'avérer ennuyeux dès qu'on utilise des fonctions statiques surchargées, car les appels à self::une_fonction() (une_fonction est donc une méthode statique) dans le parent résulteront toujours à un appel de la méthode du parent, et non pas celle surchargée dans le fils. La raison est que self dans la classe parente représente le parent, comme c'est aussi le cas dans d'autres langages OO.
Illustrons les limites de ce comportement avec la mise en place d'une factory toute simple :

class A {
  ...
  public static function create($params) {
    $class = get_class();
    return new $class($params);
  }
}
class B extends A {}
$b = B::create($myparams);


$b contiendra toujours un objet de classe A, car get_class retournera toujours A.

L'idée pour palier à cette limitation est donc simplement d'ajouter un argument à la fonction create de A, qui sera la classe à instancer :

class A {
  ...
  public static function create($params, $class = __CLASS__) {
    return new $class();
  }
}
class B extends A {
  public static function create($params, $class = __CLASS__) {
  return parent::create($params, $class);
  }
}
$b = B::create($myparams);


Avec cette petite adaptation, $b sera bien un objet B.

De manière plus général, si on envisage d'utiliser des fonctions statiques surchargées, PHP nous permet de gérer l'héritage en passant la classe en argument et en appelant la fonction statique au moyen de la macro call_user_func :

class A {
  protected static une_fonction($arg) { return $arg + 1; }
  ...
  public static function create($params, $class = __CLASS__) {
    $res = call_user_func(array($class, 'une_fonction'), $args);
  ...
  }
}
class B extends A {
  protected static une_fonction($arg) { return $arg + 2; }
  public static function create($params, $class = __CLASS__) {
  return parent::create($params, $class);
  }
}
$b = B::create($myparams);


Grâce à cette macro call_user_func, B::create appellera donc bien B::une_fonction.

jeudi, 21 décembre 2006

Spam image

Selon une analyse menée par une société spécialisée dans la sécurité informatique, le spam image a augmenté de façon impressionnante en un an, passant de 4,8 % du spam global en octobre 2005 à 25 % un an plus tard. Loin d'être en recul, le volume global du spam est passé de 31 milliards de messages par jour à 61 milliards sur la même période. De plus la taille moyenne des messages a elle aussi augmenté, passant de 8,9 Ko à 13 Ko. Le spam consomme donc désormais 819 téraoctets de bande passante par jour !

En attendant que d'efficaces techniques de prévention du spam image soient mises au point, n'hésitons pas à désactiver l'affichage automatique des images dans notre gestionnaire de courrier, ce sera déjà une première défense. Et ayons toujours en tête que le but des spammeurs est moins de vous vendre quelque chose que de vous arnaquer purement et simplement...

mardi, 19 décembre 2006

Ryzom, un MMORPG désormais libre

Un fait peu habituel secoue l'univers du libre ces derniers jours : le rachat de la propriété intellectuelle (code source, monde, ...) du jeu de type MMORPG nommé Ryzom afin de la libérer.

Cette initiative, soutenue par la FSF elle-même qui y joue un important rôle de mécène, montre à quel point l'univers du libre est réactif et motivé, mais pointe le doigt sur un fondement de notre société capitaliste :

La liberté a un prix.


On peut donc en déduire comme corolaire qu'il faut gagner de l'argent pour rester libre.

Et tout le paradoxe du serpent qui se mort la queue apparait quand on prend le cas la Fondation Mozilla, qui gagne de l'argent grâce a des partenariats avec notamment Google, faits incompris et fortement critiqués par beaucoup de monde (actualité sur par exemple 1 et 2, critiques dans la blogoshpère).

Une petite illustration logique pour toutes les personnes qui n'auraient pas compris l'intérêt de la Fondation Mozilla :

Il faut gagner de l'argent pour être libre.
La fondation Mozilla gagne de l'argent.
Donc la fondation Mozilla est libre.

lundi, 18 décembre 2006

Reverse MD5

La fonction MD5 est une fonction dit à sens unique, c'est-à-dire que ne connaissant que la sortie, il est difficile de trouver l'entrée qui a produit cette sortie.

C'est pourquoi des reverse md5 databases sont apparues sur Internet. Leur principe est tout simple : c'est une grande base de données contenant la pair (texte, hash). Ainsi on peut la questionner du hash recherché et elle nous retourne le texte correspondant si il est connu.

La base de données doit donc être remplie avant de pouvoir produire des réponses, mais une fois qu'elle contient suffisamment de données, les recherches peuvent commencer à être intéressantes. Les techniques des remplissages sont simples, elles vont du parcours de pages web ou de dictionnaires pour rechercher des mots quelconques à l'ajout manuel par des utilisateurs.

J'ai rapidement fait une petite application qui questionne plusieurs des ces reverse md5 databases, qui elle est disponible à l'addresse http://md5.noisette.ch/form.php

Elle se base sur la toute petite API suivante : http://md5.noisette.ch/?hash=<le_hash_en_hex> qui retourne du XML

<md5lookup>
  <hash><!--[CDATA[2a0231531bc1a7fc29e2fa8d64352ae9]]--></hash>
  <string><!--[CDATA[noisette]]--></string>
</md5lookup>


L'approche est très alléchante car une fois le hash dans la base de données, les réponses sont fournies en O(1). Les mots de passe stockés en md5 peuvent donc être retrouvés extrèmenent rapidement.
La contre-partie de cette approche est qu'elle nécessite beaucoup de hash précalculé avant d'être utilisable, et donc produira une énorme base de données :
Le md5 étant sur 128 bits, on pourrait avoir une table de 2^^128 entrées, pour peu qu'on ne prenne pas en compte les doublons. Donc rien que pour les hash, il nous faudrait ~5*10^^39 bytes de stockage = ~5000 téra de téra de téra bytes. Enfin juste pas possible quoi. Si on fait le raisonnement inversion on se dit que notre serveur a 200Gb d'espace disque, on peut donc stocker 12.5 milliards de hash, donc 12.5 milliards de possibilités de mots de passe = un peu plus de 2^^33 possibilités. On est loin des 2^^128...

En résumé, c'est une approchoe time / memory tradoff 100% mémory :)

jeudi, 7 décembre 2006

Gentoo sur la PS3

Dans la famille "Tchötégik", voici un petit cookbook sur "Comment installer une Gentoo sur sa PS3" :


http://whitesanjuro.googlepages.com/


L'intérêt, en plus d'être purement académique car les jeux ne tournent pas (encore) sur cet OS et d'étudier le hardware contenu dans la console, est plutôt de démontrer la flexibilité de Gentoo à s'adapter à n'importe quel type d'environnement.

mercredi, 6 décembre 2006

Une nouvelle bulle internet en formation ?

Cette question défraie la chronique ces jours, et j'ai trouvé qu'elle méritait un petit article. Non pas pour en expliquer les raisons ou essayer de deviner la date de son éclatement, d'autre le font mieux que moi, mais parce que je suis tombé sur la citation suivante :

L’avantage avec les bulles [économique], c’est qu’elles peuvent toujours se dégonfler avant d’éclater.
Mais l’inconvénient avec les bulles, c’est que les gens croient vraiment qu’elles peuvent se dégonfler avant d’éclater...


Qui, bien qu'amusante, a le mérite d'être entièrement fondée à l'heure ou les entreprises 2.0 sont formées sur une base de levée de fonds dans le seul but d'être revendue dès l'ombre du début d'un éventuel profit à l'horizon.

mercredi, 29 novembre 2006

Recrutement Google, étape #2

Mardi 28 novembre je me suis rendu dans les locaux de Google à Zürich afin de procéder à la suite du processus de recrutement. L'heure de rendez-vous, fixée à 10h00, n'étant pas trop contraignante, j'ai pris le train à Neyruz à 07h45 pour arriver à 09h38 à Zürich, et finalement 9h45 à Freigutstrasse 12, 8002 Zurich.

Le bâtiment est une ancienne banque privée, de couleur rosé et dont le style s'apparenterait au début du 20ème siècle. La porte d'entrée est fermée à clé, et il faut s'annoncer avant de pouvoir entrer. Puis une fois à l'intérieur, il faut s'inscrire sur un terminal et signer sur une tablette, et un badge autocollant est directement imprimé.

L'intérieur du bâtiment est plutôt blanc, avec du parquet sur le sol, mais ce qui frappe c'est les accessoires (poufs, ballons, coussins) de couleurs vives disposés un peu partout. On se croirait en plein jardin d'enfants. Seul les 2 écrans 20 pouces par place de travail rappellent qu'on est bien dans une entreprise de services.

Ma journée s'est composée de 4 entretiens techniques et d'un repas avec Peter, un des deux ingénieurs qui m'avait interviewé à l'EPFL.

Les questions posées étaient de nouveau très algorithmiques, principalement axées sur l'organisation des données en arbre ou table de hashage, tout en tenant compte de l'ordre de complexité des fonctions proposées.

Un exercice a retenu mon attention et je souhaite vous en faire partager mon expérience :

La donnée est simple : un personne se tient en bas d'un escalier de N marches. A chaque pas, il peut monter une ou deux marches. Combien de possibilités de configuration de trajets différents a-t-il pour monter l'escalier ?

L'illustration ci-dessous schématise le problème.


Le raisonnement approprié pour ce problème est de se dire que pour atteindre une marche n, la seule possibilité est d'être passé par la marche n-1 ou n-2, et donc le nombre de chemin pour arriver sur la marche n est la somme des possibilités d'arriver sur les cases n-1 et n-2.
On a donc la formule de récurrence suivante :
Fn = Fn − 1 + Fn − 2
qui devrait nous faire penser à la suite de Fibonacci.

La suite de la question est simplement : comment peut-on calculer de manière efficace une telle suite ?

Il est possible de calculer une suite de Fibonacci de manière itérative, et donc d'une complexité de O(n), mais ce que je ne savais pas c'est qu'il existe une manière encore plus efficace pour calculer en O(log(n)) !

Cette solution repose sur deux propriétés : l'expression matricielle du problème, et le calcul de puissance.

La suite de Fibonacci peut donc s'exprimer sous la forme matricielle suivante :


Ce qui nous amène à l'expression suivante :



On voit apparaitre un matrice 2x2 élevée à la puissance n. On peut donc utiliser l'algorithme square-and-multiply (donné ci-dessou) pour la calculée, qui lui est en O(log(n)).



CQFD. Des questions ? Des remarques ?

Je suis reparti vers 15h30, fatigué mais content. Je devrais avoir une réponse dans le courant de la semaine prochaine quant à leur envie de m'engager ou pas.

Suite au prochain (et peut-être dernier) épisode...

vendredi, 24 novembre 2006

I'm the 58,920,569 richest person on earth!

Avec mon revenu actuel tout à fait moyen pour la Suisse (un peu moins de 4000.- brut / mois), je fais partie des 1% personnes les plus riches du monde, d'après le site GlobalRichList.

Imaginez ce que ça sera quand je toucherai mon salaire de ministre ;)

Plus sérieusement, voici une preuve criante que les richesses sont mal réparties.

Arriverons-nous à faire en sorte que la fossé qui sépare les riches des autres ne s'élargisse pas trop ? Un défi pour l'avenir autant important que l'environnement...

mercredi, 22 novembre 2006

Bug de l'an 2038

Le format Unix pour les dates, c'est-à-dire le nombre de secondes depuis le 1er janvier 1970, est une très bonne chose car ça représentation est très compact, on peut facilement comparer 2 dates, calculer des intervalles, etc.

Le seul problème qui en découle est que son implémentation sous forme d'entier, 32 bits sur la majorité des systèmes actuels, et condamné à subir un integer overflow, et ce dans un peu plus de (2^^32 / 3600 / 24 / 365 =) 136 ans à partir de la date de référence si la date est codée en entier non signé, (2^^31 / 3600 / 24 / 365 =) 68 ans si le codage est signé, c'est-à-dire vers l'an 2106 ou 2038 respectivement.
Il nous reste de beaux jours devant nous, mais cela montre à quel point on est incapable de ne pas reproduire le bug de l'an 2000...

vendredi, 17 novembre 2006

Quand Internet remplace les systèmes experts

Un article paru dans Info-du-net parlant de l'élaboration de diagnostiques pour des maladies montre à quel point la base de données "Internet" peut devenir utile en cas d'utilisation judicieuse :

Un système expert est une base de données de règles et de conditions qui nous amène, en posant des questions sur les symptômes, à un diagnostique précis du problème. C'est donc une base de données contenant tous les symptômes possibles, avec des relations entre eux, que l'on peut questionner. Un système expert n'est utile que si il contient une liste exhaustive des symptômes.

On remarque donc directement une ressemblance frappante avec Internet (ou du moins un moteur de recherche tel que Google) : une base de données que l'on peut questionner.

Internet devient donc un système expert grâce à la contribution des gens dans leurs domaines d'application. Toutefois la différence entre un système expert et Internet, c'est que la base du premier est constituée par des spécialistes et, si elle n'est pas exhaustive, elle est au moins fiable, alors que n'importe bien que la base Internet se met à jour en temps réel, n'importe qui peut y contribuer, même ceux qui n'y connaissent rien au domaine...

jeudi, 16 novembre 2006

Entretien d'embauche avec Google

Les RH de Google m'ont contacté il y a maintenant 3 semaines afin de me faire passer la première étape de leur entretien d'embauche.

L'interview, technique, c'est déroulé en 2 parties de 45 minutes chacune, durant lesquelles un ingénieur Google m'a posé des questions techniques. Apparemment il n'y avait pas un nombre défini de questions, mais tant qu'une réponse jugé satisfaisante était trouvée, on passait à une autre, inventée on the fly mais en relation avec notre CV.

Voici un petit aperçu des 10 questions auxquelles j'ai réussi à répondre. Elles sont traduites en franglais_geek1 pour les besoins du billet, et je n'y fait figurer que celles que j'ai trouvé intéressantes ou qui sont faciles d'exposer sur un blog :

  1. Implémentez en C la fonction assert(i > 0) de manière à ce que la condition "i > 0" soit affichée en cas d'erreur
  2. Même chose en C++, afin que le code suivant soit bien formé :
    assert(i > 0) << "message" << i ;
  3. Triez un tableau d'un million d'entier (int sur 4 bytes) stockée sur un disque dur en ne disposant qu'une mémoire de 2 MB. Comment vous y prenez vous ?
  4. Implémentez une classe qui contient 3 méthodes :
    - void push(int)
    - int pop()
    - int minimum()
    dont les 3 méthodes s'exécute avec une complexité en O(1)
  5. Trouvez une méthode efficace qui permet de détecter une boucle dans une liste chainée, sans pouvoir modifier les éléments de la liste ni recopier en entier la liste.
Les questions sont posées sans temps de préparation, ni ordinateur ou autres documents d'aide. On remarquera que les réponses, une fois connue, ne sont pas si compliquées qu'elles en auraient l'air.

1. Première hypothèse, avant que l'expert ne précise que la condition "i > 0" doit être affichée :

void assert (int cond) {
  if (cond == 0) {
    printf("Erreur");
    exit(1);
  }
}

Le problème se corse quand il s'agit d'afficher textuellement "i > 0", car en passant par un argument, il sera évalué avant d'être passer par valeur, donc on perd toute chance de pouvoir l'afficher. Ma deuxième version en passant un pointeur de fonction en paramètre s'est vite avérée fastidieuse, et l'idée d'utiliser par une marco et ses possibilités de manipulation de strings m'a soudain frappée, pour finalement donner quelque chose :

#define assert(cond) if ((cond) == 0) { \
  printf("Erreur "); \
  printf(#(cond)); \
  exit(1); \
}

2. Une fois la première question complétée, la deuxième est devenue triviale : il suffit d'ajouter cout à la fin de la macro pour que si la condition était différente de 0, on continue avec cout.

#define assert(cond) if ((cond) == 0) { \
  printf("Erreur "); \
  printf(#(cond)); \
  exit(1); \
} \
cout

3. 1 million d'entiers sur 4 bytes nous fait 4MB, donc trop pour tenir en entier dans la mémoire. Il faut donc partager le tableau en 2, trier chaque partie en utilisant n'importe quel algorithme de tri, puis fusionner les 2 tableaux à l'aide d'un tri par fusion.

4. La complexité en O(1) nous suggère directement l'utilisation d'une liste chainée. Push et pop deviennent donc trivial, push ajoute l'élément à en tête de liste, pop retourne en enlève le premier élément de la liste.
Le problème se pose maintenant pour la méthode qui retourne le minimum, qui est doit aussi se faire en O(1). Il est donc impossible de faire une recherche, car aucune méthode de recherche n'est en O(1). L'idée est donc de maintenir une deuxième liste chainée qui contiendra ces minimums. Donc on modifie push pour tester si la valeur à ajouter est plus petite OU EGALE au minimum, et si c'est le cas on ajoute aussi l'élément dans la liste des minimums, et pop pour enlever l'élément de la liste des minimums si cet élément est le minimum.

En pseudo Java ça nous donne quelque chose du style :

LinkedList l;
LinkedList m;
void push (int e) {
  if (e <= m.top()) {
    m.push(e);
  }
  l.push(e);
}
int pop() {
  int e = l.pop();
  if (e == l.top()) {
    l.pop();
  }
  return e;
}
int minimum() {
  return m.top();
}

5. La solution trivial qui est de marquer les noeuds parcourus n'est pas envisageable, car elle sous-entendrait de modifier le contenu des noeuds, ce qui n'est justement pas possible.
Une bonne solution est donc d'inverser les liens en parcourant la liste, et si on revient au noeud initial on sera sûr d'avoir une boucle. En parcourant la liste dans l'ordre inverse et en réinversant les liens, il est possible de remettre la liste dans l'état qu'on avait avant de débuter la recherche. A noter qu'il est impératif de s'assurer qu'un seul processus n'accède à la liste en simultané, car durant la recherche la liste est modifiée.

2 entretiens sur 6, prochain épisode pour bientôt j'espère...

mercredi, 8 novembre 2006

PHP Multithread

Non, faire tourner PHP en multithread n'est pas un mythe !
C'est possible de lancer des processus fils grâce au module pcntl, et à les synchroniser avec le module sémaphore, de préférence en ligne de commande (la doc précise que leur utilisation en module apache peut amener à des résultats erronés).

Voici donc un petit article qui démontre par un exemple comment implémenter un démon multithread en PHP.

mercredi, 11 octobre 2006

Covoiturage

Premier jour de covoiturage. Tout c’est bien passé, à part une petite frayeur dans un bouchon.

Je ne peux pas encore me prononcer sur les effets à long terme du covoiturage, mais j’ai déjà trouvé que c’était plus sympa le trajet à 2. L'heure de trajet est passée bien plus vite, et suivant les personnes qui accompagnent, les échanges peuvent être intéressants et constructifs.

Dès la semaine prochaine on charge 2 personnes supplémentaires.

On a l’air vachement moins égoïste à 2-3 dans une voiture…

Un serveur en overload

Quels sont les signes qu'un serveur est en overload ?

La réponse est relativement simple un outil de monitoring tel que mrtg ou maintenant rrdtool est installé sur le serveur.

Considérons le graphique suivant :



Il représente la charge d'un serveur sur une moyenne journalière, avec en y le % de charge. Dès juillet, l'augmentation de la charge non négligeable que subit le serveur est un signe qu'il faut envisager rapidement un remplacement par une machine plus puissante. L'augmentation est linéaire, elle nous permet donc une bonne projection et donc une bonne prévision de quand le serveur arrivera à une charge moyenne de 100%.

mardi, 10 octobre 2006

Les billets de mon ancien blog

Comme je l'ai dit ici, je compte utiliser régulièrement ce blog. Et en fonction du temps disponible, je vais faire revivre d'ancien billet qui sont partis aux oubliettes en même temps que mon ancien blog.

Ne soyez donc pas surpris de voir des billets qui commencent par "Initialement posté sur Noisette.ch", ce billet vont s'entremêler aux nouveaux.

lundi, 2 octobre 2006

Linked In

Après avoir reçu plusieurs invitations d'amis et collègues, j'ai finalement rejoins la grande famille de LinkdeIn, sur lequel vous pouvez consulter mon profile et mes connexions : http://www.linkedin.com/in/benoitperroud

Je ne sais pas encore si ce site va me servir pour trouver un futur emploi, mais j'ai trouvé le concept intéressant, et je compte bien arriver à plus de 90% dans toutes les options :)

vendredi, 29 septembre 2006

Les algorithmes de recherche binaire et par fusion sont bogués

C'est la constatation alarmante qu'a fait Joshua Bloch, Software développeur chez Google, dans son article Nearly All Binary Searches and Mergesorts are Broken (Presque tous les algorithme de recherche binaire et par fusion sont bogués) et il en explique précisément la cause.

Il cite en exemple la méthode binarySearch de la librairie java.util.Arrays, qu'il a lui même écrit avant de quitter Sun.

La ligne contenant ce bug est la suivante :

int mid = (low + high) / 2;


Le bug en question est un "bête" integer overflow qui peut apparaître si on manipule un tableau de l'ordre de plus de 2^30 éléments.

Le plus dérangeant dans cette histoire banale est que ce genre de bug, pourtant trouvé dans une routine de peu de lignes, est passé inaperçu pendant près de 60 ans.

Cet exemple démontre très précisément qu'il est impossible d'écrire du code sans bugs, et que donc les prochaines améliorations seront plus d'en limiter les conséquences que de les éradiquer.

mardi, 26 septembre 2006

Gentoo avec Apache2 + PHP5 + Suexec + FastCGI (dynamic)

FastCGI est un concept tout à fait intéressant qui permet, dans le cadre de PHP, d'allier rapidité et sécurité. Il permet conjointement d'avoir la rapidité de mod_php avec la sécurité de PHP/CGI, notemment en terme de droits d'utilisateurs.
Je ne vais pas vous refaire une série de benchmark comme c'est le cas sur beaucoup d'autre site, mais je viens de réaliser un article explicant en détail l'installation, la configuration et surtout les problèmes qu'on peut rencontrer avec la mise en place PHP, FastCGI dynamique et Suexec :

Pourquoi les mots "Chers Concitoyens"

Je ne souhaite pas vraiment m'étendre sur des discours politiques car ceux-ci ne sont pas ma tasse de thé, et encore moins dans l'esprit que je compte tenir sur mon blog.

Mais au lendemain des votations fédérales sur le durcissement du droit d'asile, le préfix "con" du terme concitoyens retrouve tout son sens.

La question est donc lancée : « Mais qu’avez-vous donc fait ? ». Seul l’avenir nous le dira...

jeudi, 21 septembre 2006

Mes cours de Master : terminés

Alors que mon travail de diplôme est déjà bien entamé, je voulais juste m'arrêter un peu sur mes résultats du Master à l'EPFL.

Le détail des notes peut être trouvé sur mon site : Mes notes de Master, et il y a 2 choses importantes à relever : 5.57 de moyenne (sur 6) sur l'année, et aucune note en dessous de 5.

Ce que j'aimerais montrer par là, ce n'est pas combien je suis fort et tout, loin de moi cette idée narcissique, mais plutôt qu'avec de la motivation et de la persévérance, on arrive à nos fins (et en passant faire un clin d'oeil à certains détracteurs du redoublement dans les universités, mais une réponse plus complète viendra peut-être dans un autre billet, intitulé quelque chose comme "L'apprentissage par l'échec").

La motivation est une capacité merveilleuse dont nous a dotés mère Nature, grâce à laquelle on peut bouger des montagnes. La motivation donne des ailes, décuple les forces, mais ne serait qu'un feu de paille si la persévérance ne prenait pas la relève. La persévérance, elle, est plutôt une discipline de vie, une force mentale qui, si elle est utilisée à outrance, se transforme rapidement en obstination.

J'ai appris, après deux échecs, à dompter ma motivation, puis j'ai cultivé ma persévérance pour finalement arriver là ou j'en suis aujourd'hui, en train de faire mon travail de diplôme dans le groupe Kudelski. Et je suis convaincu que refaire la deuxième année était pour moi la meilleure chose, tant cette année est importante sur le plan théorique. Finir une branche avec juste la moyenne, c'est suffisant, mais à mes yeux actuels ça n'est pas assez pour prétendre avoir compris les finesses de la matière et pouvoir tisser des liens avec d'autres branches. J'ai réussi à le faire grâce au travail, et ça se ressent à beaucoup de niveaux.

Le travail n'est pas une source de frustration, bien au contraire. Et la recette en est bien simple :

  • Immergez-vous dans un projet,
  • Adoptez un état d'esprit positif et la motivation grandira d'elle-même,
  • Fixez-vous des objectifs à court et moyen terme pour favoriser la persévérance.

mercredi, 20 septembre 2006

Système de réécriture d'URL (URL Rewriting)

Les systèmes de réécriture d'URL posent rapidement des problèmes de scalabilité pour un site générant un trafic respectable (genre dès 1000 visiteurs uniques par jour). Je l'ai déjà exprimé dans un précédent article : Mambo 404 SEF, et souhaite maintenant apporter un design de solution.

Une technique relativement simple pour palier à ce problème de VARCHAR non- ou mal -indexable est d'introduire une variable aléatoire dans l'URL, variable à partir de laquelle la vrai URL sera chargée : www.domaine.com/14523623423/news/ma_premiere_news.html
L'important dans cet URL est donc la variable 14523623423, alors que ce qui se situe après n'a aucune importance et peut être modifié à souhait (on remarque aussi ici que cette technique permet rapidement de mettre un place de l'URL flooding, utilisants des URLs de toute sorte pour pointer sur la même page. Attention à ne pas en abuser, car on risque de voir son site se faire bannir des moteurs de recherche).

La requête SQL devient donc

SELECT realurl FROM redirections WHERE urlid = 14523623423

Mieux ça non ? Le problème évoqué ici est en fait global à tout design de base de données : les champs utilisés sans intervention d'un utilisateur dans une condition devraient toujours être de type entier ou un dérivé. Car même si les chaines de caractères sont relativement rapide lors des tests, la réaction à haute charge est très souvent mauvaise...

samedi, 16 septembre 2006

La vie d'un Troll

Un Troll, en informatique, est une polémique acharnée et sans fin (souvent sur un forum ou une mailing liste). La nature du Troll n'est jamais constructive , et, comme le disait Tristan Nitot, le Troll ne grossit que si on le nourrit. Si on l'ignore il se meurt de lui-même.

Le nom Troll vient d'analogies aux mondes fantatstiques, notamment Donjon et Dragon dans lequel les Trolls ont une grande capacité de régénération.

Si vous voyez un Troll, partez en courant. Au mieux il ne vous fera que perdre du temps...

Explication du Troll en DB.

vendredi, 15 septembre 2006

Les quinze jours décisifs des cours à option

Texte à paraître dans la brochure de valorisation du Collège des Humanités de l'EPFL

Le processus de décision qui conduit les étudiants à choisir tel ou tel cours à option, au terme des deux semaines qui précèdent l’inscription définitive, est loin d’être aussi anecdotique qu’il n’y paraît. En effet, de tels libres choix ont souvent une influence décisive sur l’orientation future d’une carrière.

Un sérieux instrument statistique à l’appui, les six auteurs de l’étude ont interpellé leurs camarades sur la perception de leurs propres compétences face au cours envisagé, l’intérêt suscité, l’utilité estimée, les qualités du professeur, la difficulté du cours, le degré d’autonomie et les liens sociaux entretenus entre étudiants. 62 personnes, soit 43 hommes et 19 femmes, ont répondu. Cette enquête devrait éclairer les processus de décision mais aussi offrir aux enseignants un outil de réflexion sur les moyens à leur disposition pour stimuler la motivation intrinsèque des étudiants, sans laquelle il n’y a pas d’apprentissage optimal.

La première bonne nouvelle qui se dégage des résultats obtenus repose sur le fait que les étudiants opèrent majoritairement des choix qui épousent au mieux leur plaisir et leur intérêt. Les chiffres sont éloquents : la volonté de maîtriser un nouveau domaine qui séduit, donc de relever un nouveau défi, passe nettement avant des objectifs de performance liés à des critères de type utilitaire.

Mais l’un des points les plus intéressants que l’étude met au jour concerne les étudiants dits « faiblement auto-efficaces », c’est-à-dire ceux qui doutent de leur capacité à maîtriser une branche. Face à ce « public réticent », les professeurs sont capables de renverser la vapeur et de convaincre durant ces deux semaines cruciales, mais à trois conditions : qu’ils clarifient les buts du cours, favorisent le comportement autonome de leurs étudiants et privilégient l’écoute de leurs besoins personnels. C’est effectivement autour de ces trois axes que s’articule l’auto-détermination des étudiants, caractérisée par le goût du risque, une ouverture plus grande à l’apprentissage, et donc une motivation plus élevée.

Tiré de : L’influence des deux premières semaines de cours, avant l’inscription définitive, sur la motivation autonome des étudiants à choisir un cours et le rôle de l’auto-efficacité dans ce choix

Auteurs : Loana Chatelain,Benoît Perroud, étudiant en informatique
Laura Derksen, Sarah Emery, François-Xavier Meuwly, étudiants en mathématiques
Guillaume Schmit, étudiant en microtechnique

Sous la direction de Fabrizio Butera et Régis Scheidegger, faculté des sciences sociales et politiques, Université de Lausanne

Comment gagner à l'Euromillion

Ou plutôt : Quels numéros jouer à la loterie ?

Si j'étais un joueur de loterie assidu, mon principal problème serait de trouver chaque semaine des numéros différents pour compléter mon année de naissance et celle de ma copine. Cette semaine, je serais tenté de jouer des numéros comme le 2, 4, 21 ou 37, car le Pape est mort le 2 du 4 à 21h37.

Mais l'idée d'utiliser random.org m'est apparue en écrivant un autre article (Un espace d'administration par email).

Quoi de mieux que de se faire générer ses numéros par un vrai générateur aléatoire ?

Pour l'Euromillion par exemple, essayez :

Bon jeu et bonne chance !

Réflexion sur le comportement des gens sur la route

Un accident sur l'autoroute provoque deux bouchons. C'est du moins l'expérience que j'ai vécu hier en rentrant du travail.

Oui j'ai bien dit deux bouchons, un naturellement du côté où la circulation est perturbée, mais c'est là que la problématique se pose, il provoque aussi un bouchon en sens inverse...

La raison en est aussi simple que malheureuse, c'est que les gens, dans leur immense indélicatesse, freinent pour regarder ce qu'il s'est passé (en l'occurrence une voiture carbonisée sur le toit, vu qu'on roulait au pas j'ai aussi tourné la tête), et pour se dire :

Oh il n'a pas de chance celui-là, mais il devait certainement mal conduire, ce qui n'est pas mon cas.


Mais ils ne se sont pas rendu compte que ceux de derrière ont dû planter sur les freins afin de ne pas les emboutir, et qu'en l'état de surcharge de trafic actuel, le moindre ralentissement peut devenir un danger redoutable.

Mais tout ce complique quand d'autres personnes, encore moins intéressés par le malheureux sort de conducteur de la voiture accidentée et ses éventuels passagers, commence à dépasser par la droit. Et je ne ferai aucun commentaire sur les voitures, de taille inversement proportionnelle à leur capacités sociales, dans lesquelles ces gens roulent.

En l'espace de quelques secondes, c'est donc un tableau tout à fait représentatif de notre société qui s'est peint de lui-même sur une autoroute...

jeudi, 14 septembre 2006

Envoyer un mail pour créer automatiquement un message

Voilà une petite fonction intégrée au sein du site qui va faire au moins un heureux. Car mes idées de billets surviennent forcément à des moments où je n'ai pas de connexion internet. Et comme il est impossible de rédiger un billet hors-ligne avec blogger (Quelqu'un me souffle que des plugins ont été fait pour palier à ce problème), l'envoie de mails est pour moi une facilité appréciée.

Pourquoi un blog sur blogger.com et pas sur noisette.ch ?

La question est simple : avec tous les moyens que j'ai à disposition pour héberger mon propre blog, pourquoi est-ce que je l'héberge sur blogger.com ?

La réponse ne l'est certes un peu moins, mais voici quelques points important de ma décision :

  • L'indexation du blog est plus rapide et meilleure sur blogger.com, et donc mon Wiki de 2 noisettes en bénéficiera des retombées
  • La manipulation des données, notamment des dates est impossible sur blogger.com, les articles ici postés témoignent d'une plus grande crédibilité
  • La curiosité de tester ce qui pousse autant de personne de se tourner vers blogger.com
J'espère simplement que ce choix nous (les lecteurs de mes tickets intéressants et moi-même) sera effectivement profitable, et dans le cas contraire un remaniement de mon blog est toujours possible.

Après le pull, le blog

Ca fait maintenant plus d'une année que j'ai acheté un pull blogger.com, alors je fête ça en me créant un vrai blog. Ca risque de déplaire à ma maman qui n'est pas pour ce genre de pratique, mais quand je lui aurai démontré le bienfondé des blogs, peut-être approuvera-t-elle au moins celui-ci...

mardi, 6 juin 2006

L'union fait la force

Initialement posté sur Noisette.ch par KillerWhile le 05.06.2005

Si on en croit le sens commun, plus on est de personne pour tirer à une corde, plus on tire fort sur la corde.

Cette constatation est vrai dans le sens ou si une personne tire sur une corde et lève 120 kilos, deux personnes n'auront aucun problème à lever plus.

Là où le dicton atteint ces limites, c'est quand on prédit que si une personne lève 120 kilos, 2 personnes en lèvent 240 kilos, 3 personnes 360 kilos, et ainsi de suite.

Un expérience menée initialement par Ringelmann en 1913 puis par Ingham et al. en 1974 montrent qu'une personne en groupe lève 20% de moins que seul.

En résumé, 2 personnes soulèvent plus qu'une, mais proportionnellement, un personne soulève plus que 2.

(Mon colloque (the economist) me souffle que ça s'appelle un rendement décroissant. En psychologie sociale, on parle de paresse sociale...)

mardi, 25 avril 2006

404 SEF, un mode Mambo génial ... en apparence

Initialement posté sur Noisette.ch par KillerWhile le 29.04.2006

404 SEF est un composant de Mambo/Joomla qui a pour but de permettre de disposer d'adresses amicales (userfriendly) pour afficher les pages. Sur le papier, c'est vraiment super utile car ça permet une bonne indexation auprès des moteurs de recherche. En pratique, c'est un calvaire pour les administrateurs des serveurs sur lesquelles tourne ce composant.

Explication : un page www.domaine.com/news/ma_premiere_news.html va devoir faire une requête dans la base de données pour savoir vers quelle url réelle news/ma_premiere_news.html pointe. Ca signifie une requête du style

SELECT realurl from jos_redirection WHERE fakeurl = 'news/ma_premiere_news.html'

Cette requête, qui recherche donc une valeur dans un champs VARCHAR et donc ne peut pas utiliser d'index, est vraiment sous-optimale et devient un syphon en terme de ressources sql.

Une chose à faire donc : changer de composant de réécriture d'url (je n'en ai malheureusement pas encore de nouveau à proposer) ou s'en passer.

vendredi, 20 janvier 2006

Diffusion pour du pognon

Initialement posté sur Noisette.ch par KillerWhile le 19.01.2006

Sous ce terme quelque peu familier je cherche à informer et mettre en garde les internautes contre les '''ventes pyramidales'''.

Cette pratique a trouvé comme nouveau filon de diffusion les réseaux peer-to-peer, par lequel une grande masse de personne peut être rapidement touchée. Ainsi de nombreux fichiers contiennent des messages publicitaire évocateur qui promettent de gagner beaucoup en ne faisant pas grand chose.

Cette pratique, pratiquée depuis le siècle passé avec les célèbres chaines de lettre, en plus d'être illégale en vertu des lois sur le commerce, n'est jamais gagnante pour l'utilisateur final.

Le problème (ou l'avantage, ça dépend d'où on se place) de ce concept, c'est qu'il est très simple d'en comprendre le principe, qui théoriquement fonctionne à merveille (Si on doit versé 1€ à 6 personnes, puis se placer en 6ème position, qu'on envoie cette liste à 10 personnes qui eux l'enverrons à 10 autres, on gagne 10€ au premier niveau, puis 100€, puis 1000€, etc jusqu'au 6ème niveau ou vous toucheriez 1'000'000€. Alléchant, non), mais qu'il est plus dur d'en percevoir les limitations.

  • Il y a un nombre limité de participants potentiel (le 1'000'000 de personne qui vous donne 1€ va vouloir à son tour touver 1'000'000 de personnes chacune, ce qui nous fait 1'000'000'000'000 (il faudrait donc 1'000 milliards de personnes, sachant que la terre en compte 7, il faut trouver 993 milliards d'extra-terrestres). Donc tôt ou tard (mais plutôt tôt que tard), il n'y aura plus suffisamment de monde pour participer à la chaine, qui s'arrêtera et toute la base de la pyramide n'aura pas reçu 1 seul €.
  • Tout l'argent que vous gagner, quelqu'un d'autre l'a perdu. Si vous gagner 1000€, 1000 personnes ont perdu 1€. Même si les montants des pertes ne sont pas importants, le montant total peut représenter de lourdes pertes économiquement parlant.
Référence sur Wikipedia (en anglais) :
Et une autre très bonne référence : http://members.impulse.net/~thebob/Pyramid.html