mardi 22 décembre 2009

Mais qui a comité ça ?!

Lorsque vous développez, Vous pouvez avoir envie de savoir qui a comité un bout de code, pas forcément parce qu'il vous parait mauvais (soyons constructif !), mais peut être pour comprendre certains choix, parce que vous trouvez le code particulièrement beau, ou simplement par curiosité. La plupart des outils de gestion de versions fournissent des moyens de le faire grâce à la commande blame. Même si la commande peut porter à confusion, ce post, n'est pas à placer dans la rubrique "délation" mais plutôt "travail en équipe" : )

Lire la suite...

lundi 21 décembre 2009

Améliorer les performances de like et recherche partielle de mots dans Postgres

Lorsque j'ai voulu faire un système d'auto-complétion pour un champs de recherche sur une page web, j'ai pensé à utiliser un moteur de recherche fulltext, malheureusement, les recherches fulltext ne se font que sur des mots entiers. j'ai donc pensé à utiliser la fonction like de Postgres. Malheureusement, like n'utilisent les indexes, seulement si '%' est placé en fin de chaine, et cela ne correspondait pas à mon besoin. De plus il fallait absolument que les requêtes soit rapides, pour que l'auto-complétion soit utilisable. Après avoir écumé le web à la recherche d'une solution, et n'ayant rien trouvé de concluant, j'ai décidé de faire un peu de R & D et d'implémenter une solution maison qui utilise les indexes. L'astuce réside dans l'utilisation d'un algorithme Edge n-gram et d'une recherche fulltext qui, elle, utilise les indexes. Voici la solution pour utiliser les indexes dans les différents cas suivants :

  • tous les mots commençant par
  • tous les mots finissant par
  • tous les mots contenant

Lire la suite...

vendredi 18 décembre 2009

Différence entre Bohr bug, Schrödinbug, Heisenbug, Mandelbug

Pendant plusieurs années, j'ai travaillé dans une équipe QA (Quality Assurance), où mon rôle était de trouver les causes et de corriger les bugs que d'autres équipes avaient faits: il y avait les développeurs qui implémentaient les fonctionnalités, les testeurs / bêta-testeurs, et mon équipe qui prenait en charge les bugs un peu retords. J'avoue avoir eu des fois beaucoup de mal à reproduire certains bugs.

J'ai appris par expérience que certains bugs pouvaient apparaitre seulement dans des cas de tests et ne se seraient jamais reproduits dans une utilisation normale, d'autres n'apparaissent plus lorsqu'on tente de les observer. C'est là, la différence entre les Bohr bugs, Schrödinbugs, Heisenbugs, et Mandelbugs. Toutes ses catégories de bugs tirent leurs noms de physiciens. Voici les différences fondamentales :

Lire la suite...

mercredi 16 décembre 2009

Encoding et alphabets internationaux : comprendre et debugger (2e partie)

Après le premier post où j'expliquais ce qu'était l'encoding, je vais, cette fois, aborder comment gérer l'encoding en Java. mon but étant de faire un article qui se veut complet, quitte à être un peu long. Je donnerai, à chaque fois des exemples de code pour illustrer. Sommaire :

  • Comment gérer et débugger les problèmes d'encoding en Java
  • La représentation interne des Strings en Java
  • Encoding du fichier source
  • Manipulation de Strings
  • Ecriture dans un fichier
  • Connaitre et modifier l'encoding de votre JVM
  • Comprendre ce qu'est input method et inputContext
  • Affichage dans un logiciel (navigateur,éditeur,...)
  • Comment gérer l'encoding dans un environnement Web (Apache, Tomcat, ModJK, framework MVC, base de données, navigateurs).

tous les exemples de code sont réunis dans une classe que j'ai appelé 'EncodingProblemsRepairKit', disponible en annexe à la fin du post. Le code n'est pas blindé (pas de tests, pas de vérification des paramètres d'entrée,etc) et n'est donné qu'a titre d'illustration et fournit quelques méthodes pour débugger plus facilement

Lire la suite...

vendredi 11 décembre 2009

Encoding et alphabets internationaux : comprendre et debugger (1ere partie)

Lors de l'affichage de pages avec des mots dans des alphabets différents il peux arriver que des problèmes d'affichages apparaissent avec des � et des é

Dans le cas de Gisgraphy (exemple pour Pékin), j'ai voulu vérifier que tout s'affiche correctement et que ce qui est affiché correspond bien à l'équivalent ASCII.

Je me suis donc rendu sur cette page et j'ai testé 北京, ce qui m'a donne 'bei jing'.ouah ça marche! et mon navigateur affiche le japonais! essayons en arabe avec بكين , cela me donne "bkyn" qui se rapproche de Beijing et Pékin en phonétique, et là aussi ça s'affiche correctement.

Cela m'a donné l'idée d'un post pour démystifier l'encoding par une suite de questions-réponses. (Finalement je le ferai en deux posts car c'est un peu long, et je risque de perdre et décourager pas mal de lecteurs si je n'en fais qu'un). Le premier expliquera ce qu'est l'encoding :

  • Qu'est ce qu'Unicode ?
  • Qu'est-ce que l'encoding, le BOM, le Little et le Big Endian
  • Quel est le meilleur encoding ?
  • Comment fonctionne une police de caractère ?
  • Comment gérer les sens d'écriture différents (par exemple, l'arabe qui s'écrit de droite à gauche)

Le second expliquera comment résoudre les problèmes fréquents avec de cas concrets et des extraits de code :

  • Comment gérer l'encoding dans un environnement web en java (Java, Apache, Tomcat, ModJK, base de données, navigateurs)
  • Comment gérer et débugger des problèmes d'encoding en java

Après ces deux posts vous ne devriez plus jamais voir ça : � sur vos sites, ou si c'est le cas vous saurez comment résoudre le problème :)

Lire la suite...

mardi 8 décembre 2009

10 minutes pour...comprendre OSGI

En regardant les statistiques du blog, j'ai vu que les visiteurs passaient environ 5 minutes sur le blog. Cela m'a donné l'idée de créer une rubrique qui s'appellerait '10 minutes pour...' et dans laquelle je publierai des posts un peu plus long où je traiterai d'un sujet un peu plus en profondeur. Pour inaugurer cette rubrique, je vous propose '1O minutes pour...comprendre OSGI'.

Lire la suite...

lundi 7 décembre 2009

Untar en java

Autant trouver un bout de code pour de-zipper un fichier est assez facile, autant en trouver un pour de-tarrer est déjà un peu plus complexe. Ayant eu à le coder, Je vous propose (ça évitera peut être des galères à certains ;) ) une classe qui permet de le faire. Elle permet de décompresser les fichiers tar, tar.gzip, tar.gz, tar.bz2, et tar.bzip2, le choix du traitement se fait selon l'extension.

Lire la suite...

mardi 24 novembre 2009

Ouvrir l'implémentation d'une méthode plutot que son interface.

Pour ceux qui inlassablement tente d'ouvrir l'implémentation d'une méthode en cliquant sur F3 (open Declaration), puis CTRL+T, et sélectionne l'implémentation, sachez qui existe un plugin implementor. qui permet de le faire plus facilement. Ce plugin est fourni par défaut dans galiléo.

Il ajoute une option "Open Implementation / open Declaration" lorsque vous passez votre souris au dessus de l'appel d'une méthode en maintenant CTRL enfoncé. S'il n'y a qu'une implémentation, il l'ouvre directement , sinon il vous donne le choix.

Pour ceux qui veulent en savoir plus sur les nouvelles fonctionnalités de Galileo, je vous conseille ce lien qui peut vraiment simplifier la vie du développeur.

Liens : HomePage du plugin | Eclipse update site

lundi 23 novembre 2009

Oeuf de pâques (easter egg)

Connaissez vous les œuf de Pâques (ou easter egg en anglais). Les œufs de paques (dixit Wikipedia) sont des fonctions cachées au sein d'un programme accessible à partir d'un mot clé ou d'une combinaison de touches et de clics (ils peuvent aussi désigner des données erronées mis dans des bases de données payantes pour vérifier qu'elle n'est pas utilisée sans autorisation, il suffit alors de démontrer que les données utilisées illégalement contiennent ces œufs de pâques pour mettre à mal l'honnêteté de ceux qui l'utilisent, mais ce n'est pas l'objet de ce post) En voici quelque uns :

Lire la suite...

Retenter l'execution d'une fonction plusieurs fois en Java

Certains d'entre vous connaissent peut être la fonction javascript Try.these de Prototype.

Elle permet d'exécuter plusieurs fonctions et de retourner la valeur de la première fonction qui ne génère pas d'exception. Cela permet d'essayer plusieurs façons de faire, mais aussi de retenter l'exécution d'une fonction, si on lui passe plusieurs fois la même fonction.

Je vous propose un code qui permet de faire l'équivalent en java. Pour cela J'ai utilisé le patron de conception 'template' et les génériques Java 5. J'ai eu besoin de coder cela afin d'être plus tolérant aux erreurs (retenter plusieurs fois une requête HTTP qui pouvait aboutir à un timeout serveur). Je vous conseille de restreindre le catch de la fonction retry() afin de de ne retenter l'exécution, uniquement pour une exception donnée et de propager les autres exceptions le cas échéant.

Lire la suite...

vendredi 20 novembre 2009

Gisgraphy a 2 ans !

Il y a deux ans, j'envisageais de créer un projet de géolocalisation opensource sous licence LGPL : Gisgraphy . Mon but était de créer un framework permettant d'utiliser les données géographiques gratuites sur le Net. Actuellement il gère les données de Geonames et Openstreetmap, ce qui représente 34 millions d'entrées.

Petit bilan de deux ans de développement :

Les 3 webservices disponibles

Liste des fonctionnalités

  • Serveur de téléchargement gratuit avec 28 millions de noms de rue et 8 millions de lieux en CSV.
  • Serveur fournissant les services gratuitement (pour utilisation non commerciale).

Lire la suite...

jeudi 19 novembre 2009

Faire des tests combinatoires avec les theories JUnit (partie2)

Lors du précédent post je vous parlais des Theories. Aujourd'hui je vous propose d'aller un peu plus loin dans la définition du jeu de données en faisant de la combinatoire et en définissant un jeu de données dynamiquement.

Lire la suite...

mardi 17 novembre 2009

Faire des tests combinatoires avec les theories JUnit

Il arrive parfois que l'on ait à faire des tests avec des jeux de données combinatoires. Par exemple, on a un jeu de données A : disons {A1,A2}, et un jeu de données B : {B1,B2}, et on voudrait faire un test où toutes les combinaisons A * B soit testées :

  • testMethode(A1,B1)
  • testMethode(A1,B2)
  • testMethode(A2,B1)
  • testMethode(A2,B2)

Il est possible dans ce cas d'utiliser les theories. Il s'agit d'une technique, pour l'instant expérimentale (cf : nom du package), disponible à partir de JUnit 4.4.

Lire la suite...

vendredi 13 novembre 2009

Bloquer les spammers / hackers avec Apache et mod_spamhaus

Lorsque j'avais des spams sur mon forum, je prenais l'adresse IP de l'utilisateur et j'empêchais l'accès au serveur avec iptables, mais j'ai vite vu la limitation de ce système correctif manuel. Il me fallait un système préventif et automatisé :

mod_spamhaus est un module Apache qui utilise DNSBL pour empêcher les spammeurs et les personnes passant par des proxys un peu douteux, d'accéder à votre site. Il permet de limiter les attaques des bots et de le protéger des utilisateurs ayant une adresse IP connue pour être une IP 'douteuse'

Lire la suite...

jeudi 12 novembre 2009

Limiter la bande passante d'un serveur de download

Lorsque j'ai voulu offrir la possibilité de pouvoir télécharger les données de OpenstreetMap en CSV, je me suis dit que je devais préserver les ressources de mon serveur (car les webservices et le serveur de téléchargement allait être sur la même machine). Je me suis alors demandé comment limiter la bande passante pour un host en particulier. Il existe un module apache pour faire cela : mod_bandwith.

Lire la suite...

Humour : grippe porcine

Aujourd'hui j'avais envie de bloguer sur un autre thème que l'informatique, alors pourquoi pas un peu d'humour.

grippe

Moi ! ça me fait rire :)

mardi 10 novembre 2009

Coloration syntaxique de code dans une page HTML

En regardant les extraits de code de mon blog, je me suis dit que cela serait plus fun, si j'y mettait de la coloration syntaxique.
Ne voulant pas réinventer la roue, je me suis mis à la recherche d'une solution "out of the box", et je suis tombé sur syntaxhighlighter qui me semble vraiment utile au vue du nombre de langages supportés : Bash, Cpp, CSharp, Css, Delphi, Diff, Groovy, Java, JScript, Php, Plain, Python, Ruby, Perl, Scala, Sql, Vb, Xml, AS3, JavaFX, PowerShell, Erlang, ColdFusion.

Lire la suite...

jeudi 5 novembre 2009

Réparer les boutons d'Eclipse qui ne sont plus clicables dans Karmic Koala

Certains d'entre vous ont peut être constaté que l'on ne pouvait plus cliquer sur les boutons d'Eclipse après la Mise à jour en 9.10 (karmic Koala). Ceci est dû à la nouvelle version de GTK 2.18 qui introduit une nouvelle façon d'interagir avec GdkWindows.

Pour corriger le problème, ajouter cette ligne dans votre .bash_profile :

export GDK_NATIVE_WINDOWS=true

et exécutez la commande

. ~/.bash_profile

Et lancez Eclipse à partir de ce shell

Cela devrait résoudre le problème

Limiter l'accès à un site / service pour un certain nombre de requêtes par IP

Il m'est arrivé de devoir limiter l'accès aux webservices de Gisgraphy en raison d'utilisateurs peu scrupuleux qui récupérent les données directement via le webservice. J'ai utilisé pour cela un module Apache appelé mod_evasive.

Lire la suite...

mercredi 4 novembre 2009

Limiter son débit sous linux

Il existe un utilitaire très pratique permettant de limiter son débit. cela peut s'avérer pratique pour faire des simulations ou des tests selon le débit. l'utilitaire s'appelle 'tc' aka traffic control.

Lire la suite...

- page 2 de 3 -