Blog de David MASCLET

Aller au contenu | Aller au menu | Aller à la recherche

lundi 1 mars 2010

Détecter et corriger les fuites mémoire java

Ceux qui ont déjà développé en C, puis en Java auront probablement apprécié la gestion de la mémoire par la JVM. En effet, Java masque la complexité de la gestion de la mémoire aux développeurs. Cette tache est déléguée au garbage Collector. Cependant même si cette gestion est dite 'automatique', cela ne permet pas de faire n'importe quoi. Que ce soit en C, Java, ou un autre langage, la mémoire est une ressource limitée ! En java lorsque la JVM n'a plus assez de mémoire pour s'exécuter, elle génère une Erreur java.lang.OutOfMemoryError.

Plusieurs cas sont alors possible :

  • Soit vous n'avez pas alloué assez de mémoire à la JVM
  • Soit votre code a ce qu'on appelle un fuite mémoire

Si vous êtes dans le premier cas, les choses se résolvent assez facilement : il vous suffit d'allouer plus de mémoire grâce aux paramètres -Xmx, -Xms et -XX:PermSize (ou de modifier le code pour qu'il gaspille moins de mémoire). Dans le deuxième cas vous allez devoir trouver où se situe la fuite mémoire. Si vous avez utilisé des logiciels pour vous y aider, vous avez peut être été perdu par toutes les possibilités qu'ils offrent et par la profusion d'informations qu'il fournissent.

Le but de ce billet est d'expliquer comment détecter et corriger les fuites mémoires avec Eclipse Memory Analyser Tool un outil gratuit et très utile qui aide vraiment à trouver les fuites mémoires. Nous allons voir comment extraire les informations pertinentes, les comprendre, et trouver les responsables des fuites mémoire en ayant une approche pragmatique. Je vous propose de nous appuyer sur du code simple (disponible en fichier attaché à ce billet) générant une fuite mémoire.

Lire la suite...

samedi 27 février 2010

Nouveau look aux idées larges !

Le blog à désormais un nouveau look. oh... pas très très différent. Je suis juste partie du thème précédent et j'ai changé le style pour l'adapter aux styles des billets : c'est-à-dire des articles techniques.

En effet en regardant les statistiques des résolutions d'écran des utilisateurs, J'ai remarqué que personne n'était en 800*600, alors que le thème était optimisé pour une résolution 800*600. J'ai donc augmenté la largeur de la colonne centrale en diminuant les marges de chaque coté, attribué plus de place à la colonne de contenu, et diminué la colonne avec les rubriques, qui me semblait moins importantes que le contenu. A mon sens, le texte est beaucoup plus lisible. Pour les zone de code, j'ai également opté pour une couleur jaune, plus sympathique que le gris. Faites moi part de vos impressions, et des éventuels problèmes rencontrés.

jeudi 4 février 2010

Tester du code en ligne

Certains connaissent peut être pastebin qui permet d'envoyer du code à quelqu'un (ou d'un PC à l'autre ;) ) en générant une shortURL. Il existe des sites qui vont plus loin en permettant de tester du code directement en ligne : http://codepad.org/. il suffit de copier / coller votre code, et le site vous le compile et vous l'interprète. c'est le cas de codepad

codepad

Il supporte les langages suivants :

  • C
  • C++
  • D
  • Haskell
  • Lua
  • OCaml
  • PHP
  • Perl
  • Plain Text
  • Python
  • Ruby
  • Scheme
  • Tcl

Vous pouvez mettre votre code "privé", ce qui est pratique, car j'ai déjà retrouvé du code, que je ne voulais pas partager publiquement, indexé par Google, après l'avoir envoyé via pastebin)

Dans la même lignée, il existe des sites plus spécialisés pour tester les interactions HTML<=>Javascript : http://jsbin.com/. Son utilisation est triviale : vous avez le code javascript à gauche et le code HTML à droite.

jsbin

Le site va beaucoup plus loin que pastebin, d'une part, car il est spécialisé dans un langage, mais aussi parce qu' il offre la possibilité :

  • De sauvegarder votre code.
  • D'inclure des librairies connues, comme Prototype, Jquery, Mootools, Dojo et de choisir parmi différentes versions
  • De générer une short URL de votre code (exemple : http://jsbin.com/ilomu3)
  • De modifier un code existant en cliquant sur ''Edit using JS Bin" en haut à droite (j'avoue c'est pas flagrant :) ).
  • De gérer plusieurs versions d'un même code

L'avantage est qu'il permet de tester du code avant de mettre à jour un librairie (exemple : passer de Prototype 1.6.03 à 1.6.1.0), de vous faire la main sur des librairies, ou de partager du code entre collègues.

lundi 1 février 2010

iPad nano

Pour faire suite à mon post Stratégie d'Apple vs stratégie Google, je vous propose une image qui m'a fait bien rire

ipadnano

Sinon, je vous conseille la lecture de ce billet sur l'ipad et son effet d'annonce manqué

mardi 26 janvier 2010

Tester le javascript : JSUnit, JSmock, Jstester (partie 2)

Après le billet consacré à JsUnit et celui qui expliquait comment mocker une requête Ajax, nous allons maintenant voir comment mocker en javascript. Pour cela je vous propose une courte présentation de JsMock. Les exemples de code sont en annexe de ce billet.

Lire la suite...

lundi 18 janvier 2010

Configurer et utiliser Google bot comme outil de tests

Lorsque l'on parle de Google bot, on pense souvent à "référencement", mais il existe une autre utilisation : les tests. Je ne parle pas de tests fonctionnels ou unitaires mais de tests pour améliorer la qualité de votre site, comme les tests de liens morts, de pages indisponibles, d'erreurs HTTP etc.

Il y a quelques semaines, je postais plusieurs billets sur comment gérer un serveur de download :

Mais cette configuration peut poser des problèmes pour les bots des moteurs de recherches. C'est pourquoi je voudrais expliquer comment mieux configurer les serveurs pour faciliter le travail des bots.

Lire la suite...

vendredi 8 janvier 2010

Tester le javascript : JSUnit, JSmock, Jstester (partie 1)

Beaucoup de développeurs Java sont familiers avec Junit, EasyMock,... ces librairies qui permettent de tester du code Java afin de rendre les programmes plus robustes. Javascript dispose également de frameworks équivalents. Avec l'apparition du Web 2.0, le Javascript et l'Ajax sont de plus en plus présents dans nos applications (j'avais d'ailleurs poster un billet sur comment mocker une requête Ajax,il y a quelques mois) et représente une part non négligeable de code.

Si vous utilisez GWT, qui permet d'écrire à partir de code écrit en Java, de générer une application en HTML / javascript, vous n'avez pas de problème pour tester votre code, puisque Junit suffit. En revanche, si vous avez du code javascript à tester, il existe des librairies qui permettent de simplifier les tests. Je vous propose de voir comment tester du Javascript au moyen de ces 3 frameworks :

  • JsUnit : Qui fournit des mécanismes d'assertions et d'exécutions de tests.
  • JsMock : Permet de simuler des comportements pour des objets Javascript,tout comme EasyMock le fait
  • JsTester : Permet d'executer du code Javascript en java grâce à Rhino.

les exemples de code sont disponibles en annexe de ce billet

Lire la suite...

lundi 4 janvier 2010

Google goggle

Il y a de cela quelques temps, Google lançait image labeler afin d'améliorer la recherche d'images Google. Tout laisse à penser que ce service a bien fonctionné, car Google expérimente Google goggle, un service disponible à partir d'android 1.6+, et qui permet de prendre une photo ou une vidéo et Google détectera de quoi il s'agit et lancer une recherche à partir de ce qu'il a détecté. Le geotagging devient quasi obsolète.

Le nom n'est pas choisi au hasard, au départ Google aurait du s'appeler Goggle, en référence au nombre gogol de Edward Kasner, mais une erreur de saisie a fait que Google s'appelle Google et non Goggle. c'est donc un moyen d'utiliser son nom initial.

Lire la suite...

Stratégie d'Apple vs stratégie Google

Après la folie commerciale de fin d'année je voudrais bloguer sur les différentes stratégies des sociétés dites "innovantes". je sais dors et déjà que je vais me faire des ennemis et que cette article ne fera pas l'unanimité, mais peu importe, ce post trouvera aussi des personnes allant dans le même sens que moi :)

C'est demain que sort le téléphone de Google : le Nexus One. Ceux qui me connaissent savent que je suis un fervent défenseur de Google. Ce n'est pas que j'aime tout ce qu'ils font (je n'aime pas chrome, par exemple), mais je trouve que leurs produits tapent souvent juste et fort. Et si certains sont frileux d'utiliser des applications et services d'une firme, il est vrai, un peu "big brother", on saluera tout de même leur stratégie qui leur a permis d'être le moteur de recherche utilisé par 90% des internautes et de sortir des produits innovant comme, Google Maps et Google documents, GWT, etc.

Je m'étonne encore de leur modèle économique basé sur la publicité. Pour mémoire, ce même modèle a causé, entre autre, la chute de la bulle internet. De très grosses sociétés (e.g : AOL) ont revu leur business modèle, en passant la publicité de "source de revenus" à "complément d'activité" ;). La stratégie de Google est de sortir des produits les plus complets possible, en sachant très bien ce qu'il amélioreront à la prochaine version, mais en visant un niveau de base déjà très élevé pour un effet "WHAOOOUU". Je voudrais (entre autre) comparer la différence de stratégie d'Apple et de Google pour leur téléphone pour montrer comment Apple est vraiment une société reine dans le marketing :

Lire la suite...

mercredi 23 décembre 2009

Différence entre un hard link et un lien symbolique

Lorsque j'ai voulu faire un système de sauvegarde pour les données de mon serveur, j'ai voulu créer un dossier par date, mais je me suis vite rendu compte que cela allait prendre beaucoup de place. alors j'ai utilisé un hard link pour faire une sauvegarde incrémentale.

Lire la suite...

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...

- page 1 de 3