vendredi 24 octobre 2014

Tester avec Maven un processeur d'annotation

Générer du code est une pratique courante en Java qui permet d'éviter de se répéter : il faut reconnaître que c'est une pratique bien pratique.

Mais lorsqu'il s'agit de créer un projet sous Maven avec un générateur de code (et de ressources) basé sur des annotations et qu'on envisage de tester le code généré (et les ressources), c'est une toute autre paire de manche : j'ai suffisamment lutté avec Maven pour trouver la configuration simple mais qui marche, que j'ai la joie de partager avec toi, ami lecteur.


Nous allons voir pas à pas dans cet article comment configurer notre POM pour que notre processeur d'annotation que nous développons puisse être testé sans heurts.

jeudi 25 septembre 2014

10 trucs à éviter en Java

Rangez votre crème solaire et vos tongues : c'est la fin de l'été !
Après une pause estivale, il est normal de tout oublier, aussi, une piqûre de rappel sur quelques mauvaises pratiques en Java ne peut pas faire de mal. Et puis c'est moins désagréable qu'une piqûre de moustique.


Je livre ici 10 trucs à éviter en vrac ; il n'y a pas de classement du pire truc à faire, ni du plus dangereux, ni du plus important, il s'agit juste un choix arbitraire de pratiques à éviter ou carrément à proscrire. Evidemment, au delà de ces 10 là, il y en a des dizaines d'autres...

jeudi 24 juillet 2014

Lazy Stream Generation with Java 8

Avant, pour produire les items à consommer dans une boucle for-each en Java, on pouvait utiliser un itérateur. Mais ça, c'était avant...

Depuis Java 8, le tant attendu, il y a les lambdas et l'API stream : Java rattrape enfin son retard sur nombre de langages qui offrent déjà depuis bien longtemps des mécanismes de programmation fonctionnelle. Il était temps.

Alors, comme tout Javaman qui se respecte, je me suis attelé à la tâche : essayer de domestiquer ces nouveaux compagnons. Il y a tout un tas de fonctionnalités géniales prêtes à l'emploi : on peut générer des streams à partir de tout et n'importe quoi, on peut obtenir des stream bornés ou infinis, séquentiels ou parallélisables, et on les consomme dans un mode "lazy", c'est à dire que chaque étape dans un pipeline demande à l'étape précédente la donnée à traiter qui lui-même fournira à l'étape suivante la donnée utile, ni plus ni moins : c'est du pur pull-pipeline bourrin, économe et efficace.

Mais comment produire des données dans un mode "lazy" ? Pratiquement dès le début, je me suis retrouvé comme une poule devant un violon face à cette épineuse question.

Voyons de quoi il s'agit dans un exemple concret.


Produire juste ce qu'il faut : un enjeu de chaque instant

jeudi 26 juin 2014

Jouons à cache-cache avec Java (seconde partie)

Mettre en cache un objet signifie qu'on espère le réutiliser à court ou moyen terme en s'épargnant le coût de sa reconstruction. Cet article est le second d'une série (de deux articles) dédié à la mise en œuvre d'une mauvaise stratégie de cache.

Dans le précédent article, nous avons vu comment mettre en oeuvre une telle stratégie apparemment viable.
Dans celui-ci nous verrons d'abord comment notre cache se comporte, puis si les adaptations apportées améliorent les résultats. Pour finir, nous aborderons un cas d'utilisation dans lequel une petite modification des conditions de départ peuvent rendre ce cache enfin utilisable (ce serait dommage de rester sur un échec !).


vendredi 18 avril 2014

Association de malfaiteurs dans GWT

...ou comment gérer une structure composite multiple dans les cellules d'un tableau.

A la façon d'un tutoriel, je vous propose étape par étape comment réaliser un tableau sophistiqué avec GWT et Sencha GXT, les problèmes rencontrés et les solutions adoptées. Un prérequis raisonnable pour la lecture de cet article est une connaissance de GWT, même de niveau débutant ; quant à Sencha GXT ce n'est pas nécessaire : on va découvrir cette librairie ensemble.

Effet souhaité

Plutôt qu'un long discours, l'idée est d'obtenir ceci :

Un casse réussi, c'est un casse bien préparé !

Ce tableau permet d'ajouter plusieurs items (de la liste de gauche) dans une cellule de grille (partie à droite), avec plusieurs mécanismes d'ajouts dont le Drag N Drop.

mercredi 26 mars 2014

Jouons à cache-cache avec Java (première partie)

Mettre en cache un objet signifie qu'on espère le réutiliser à court ou moyen terme en s'épargnant le coût de sa reconstruction. Nous allons voir dans cet article une solution au demeurant louable visant à élaborer une stratégie d'éviction qui s'avère désastreuse : surtout, ne l'utilisez pas en production !

Principe et stratégie

Utiliser un cache est monnaie courante dans une application. Un cache permet de stocker en mémoire un objet susceptible d'être réutilisé, ce qui apporte son lot d'inconvénients : si on veut un cache efficace, il faut stocker suffisamment d'objets, mais si on stocke trop d'objets, on risque de saturer la mémoire. Le gain escompté doit être à la hauteur des sacrifices consentis en terme de volume de mémoire alloué mais aussi en terme de gestion du cache (l'objet mis en cache n'est-il pas périmé ? quelle clé utiliser pour le retrouver ? etc).
Toute la question réside dans l'adoption d'une sorte de compromis entre la taille du cache, la durée de rétention des objets, et dans l'application d'une politique d'éviction.

Parmi les stratégies les plus conventionnelles, on peut fixer une durée de rétention sur les objets, ou fixer un nombre maximum d'objets, ou de taille des objets à stocker, en supprimant les plus anciens une fois le quota atteint. Simple mais très souvent efficace. Google Guava est une librairie Java assez complète qui offre ce type de fonctionnalités, et permet également d'être notifié des entrées supprimées du cache.


Cache-sexe utilisé jadis dans l'île de Java
- Peut contenir un nombre limité d'objets -

mercredi 5 mars 2014

Semantic Mismatch : quoi donc est-ce ?

"Semantic Mismatch" ? C'est simplement le nom de ce blog.

Comme les articles porteront essentiellement sur l'IT, l'ingénierie des développements, le Web, les technologies et langages de programmation, les architectures, et tout le toutim, il me fallait un nom accrocheur en rapport.


Semantic Mismatch
ERR-01 : IncompatibleTypesException
Unable to cast VESSIE to LANTERNE
-- See log for details


J'ai d'abord songé à "Syntax Error", étant de la vieille école, mais je me suis dit que ce nom pouvait déjà être utilisé, et une rapide recherche avec mon moteur de recherche préféré m'a montré que je n'avais pas tort... Soit dit en passant que les blogs concernés n'ont rien à voir avec l'informatique...



Semantic Mismatch
ERR-03 : IllegalSizeException
YEUX cannot be bigger than VENTRE
-- See log for details


"Syntax Error" doit donc être modernisé, il me faut une autre idée... voyons, "Stack Overflow" c'est déjà pris (même si ce n'est pas un blog), il va falloir se démarquer ; allez, le Web sémantique est à la mode, avec le SPARQL, RDF et autres ontologies, il y a la moitié du titre. J'ai quand même aussi envie de rester sur la première idée véhiculée par "Syntax Error", à savoir le second terme : les problèmes, erreurs, et autres incompatibilités diverses étant bien ancrées dans l'informatique, il me faut un terme lié à cela. Il me vient à l'esprit une vieille querelle entre les partisans et les détracteurs de l'ORM, ces derniers utilisant un qualificatif spécifique pour montrer que le Mapping Objet-Relationnel est une aberration : c'est l'Impédance Mismatch !



Semantic Mismatch
ERR-02 : NoSuchMethodException
Unable to extract PENDULE
-- See log for details


Allez, on prend les deux termes et voilà : "Semantic Mismatch".
L'idée derrière laquelle la sémantique nous promet de joyeuses mésinterprétations ne me déplaît pas : voyez les résultats obtenus par vos outils de traduction préférés...

Vendu ! "Semantic Mismatch" est né !


Semantic Mismatch
ERR-04 : IncompatibleTimeZoneException
MIDI not found at 2PM
-- See log for details

vendredi 21 février 2014

"Hello World" revisité

Dans le monde du Software Engineering, une pratique courante quand on conçoit une librairie est d'exposer le fameux exemple "Hello World" qui montre aux programmeurs une utilisation minimaliste de ladite librairie.

Là, clairement, c'est un blog, pas une librairie, alors je n'en ai pas sous la main, mais je ne vais pas déroger à la tradition, et comme c'est un blog, je vais utiliser un "Hello World" venu d'ailleurs : ce joli dessin s'appelle "Map Of The Internet", par Jay Simons. Prenez le temps de zoomer vous y retrouverez quelques uns de vos sites préférés et les autres, ainsi que diverses entreprises et organisations qui ont marqué le Web.

Foin de blabla ! Voici l'objet en question :

Map Of The Internet, by Jay Simons