Devoxx France 2013 – Posez vos conventions Java sur le divan de Freud

Parmi les quickies de Devoxx France 2013, j'ai assisté à la présentation intitulée « Posez vos conventions Java sur le divan de Freud » présentée par Raphael Brugier.

Freud est un outil d'analyse statique qui permet de forcer l'application de certaines conventions et interdire l'utilisation de certaines librairies ou API.

Dans les projets classiques, ces conventions sont écrites dans un document ou sur un wiki. C'est juste une documentation qui ne force pas réellement son application. Une autre alternative est l'utilisation de Checkstyle mais celui-ci n'est pas toujours facile à adapter aux besoins et surtout l'analyse du code est tardive (après la compilation).

Freud fournit un DSL (langage spécifique au domaine) du code java, utilisable pour des assertions dans les tests JUnit. Son analyse peut se faire à différents niveaux : code source, classe (par l'API reflection), bytecode ...

D'autres types de fichier sont également supportés : fichier de propriétés, CSS, texte ...

Pour l'utilisation, il faut faire un fork du projet sur github et construire le projet soi-même car il n'existe pas d'artefact maven.

Au niveau des outils d'analyse statique, Freud est plus proche de Checkstyle que de FindBugs car l'analyse poussée est difficile.

Devoxx France 2013 – Déminage d’une application avec JRockit Mission Control

A l'occasion de Devoxx France 2013, j'ai assisté à la conférence intitulée « Déminage d'une application avec JRockit Mission Control » présentée par François Ostyn.

JRockit Mission Control est un outil pour la JVM JRockit comprenant :

  • une console JMX
  • un enregistreur d'événements se produisant dans la JVM : Flight recorder
  • un analyseur de mémoire pour aider à localiser les fuites mémoire : Memleak analyser

Afin de ne maintenir qu'une seule JVM, Oracle a créé le projet HotRockit dans le but de fusionner JRockit et Hotspot. Ses résultats seront progressivement intégrés dans Hotspot.

Depuis Java SE 7 update 4, Hotspot a les même mesures (metrics) que JRockit, ce qui permet d'utiliser JRockit Mission Control avec Hotspot. Celui-ci peut être utilisé de 2 manières : avec le plugin eclipse ou en ligne de commande.

Grâce au plugin eclipse, Memleak analyser détecte l'accroissement du nombre d'instances d'une classe et permet la visualisation de la pile d'appel. Flight recorder peut récupérer à postériori la liste des événements, ce qui permet de visualiser l'utilisation du tas, du processeur ... En mode déconnecté, le plugin permet aussi de voir les fuites mémoire mais pas le graphe d'appel (visible uniquement en mode connecté).

La commande jcmd (appelée jrcmd dans JRockit) permet de faire les même requêtes qu'avec le plugin eclipse. Celle-ci permet aussi de récupérer un fichier .jfr visualisable avec le plugin eclipse.

Pour terminer, il faut noter que JRockit Mission Control est gratuit en développement mais pas en production et, d'après François, il est plus rapide que des outils de profilage tels que Yourkit car les mesures (metrics) sont codées en natif dans la JVM.

Devoxx France 2013 – Simplifiez vos tests avec les assertions AssertJ !

Parmi les quickies de Devoxx France 2013, j'ai assisté à la présentation intitulée « Simplifiez vos tests avec les assertions AssertJ ! » présentée par Joel Costigliola (compte github).

Joel était contributeur du projet FEST Assertions, dont la prochaine version contiendra moins d'assertions. Pensant qu'il faut au contraire rajouter plus d'assertions, il a fait un fork du projet sous le nom AssertJ.

Les principaux modules d'AssertJ sont :

De plus, un outil en ligne de commande permet de créer des assertions spécifiques au métier de l'utilisateur. Celui-ci s'intègre aux outils existants à l'aide d'un plugin maven et d'un plugin eclipse (prévu pour avril). Du code est généré à partir du code source des classes métier.

Exemple

Avec la classe suivante :


public class Person {

private String name;

}

On obtient du code permettant d'écrire l'assertion :

assertThat(person).hasName("pierre");

En plus du code généré, l'outil crée la javadoc et documente l'implémentation des méthodes.

Devoxx France 2013 – Implémenter la qualité sur un projet Java

A l'occasion de Devoxx France 2013, j'ai assisté à la conférence intitulée « Implémenter la qualité sur un projet Java » présentée par Vincent Massol (profil github), contributeur du projet XWiki.

Vincent nous parle des bonnes pratiques dans la gestion d'un projet Java, en prenant comme modèle son expérience sur XWiki.

Stabilité de l'API

Il faut faire attention aux utilisateurs et même aux développeurs du framework.

Clirr est un outil qui casse la construction d'un projet s'il y a un changement dans une API. La comparaison peut se faire au niveau binaire ou au niveau du code source. Lorsque l'on a intentionnellement changé l'API, il faut documenter le changement pour qu'il soit ignoré par l'outil, qui signalera cela dans son rapport.

Voici quelques pratiques mise en place sur le projet XWiki pour la gestion de ses API :

  • Création d'un package 'internal' : Les classes/méthodes/attributs présents dans ce paquetage peuvent être visibles au sens Java mais le développeur ne doit pas les utiliser. S'il le fait quand même, il prend le risque que son code ne compile plus ou ne s'execute plus lors d'une nouvelle version de la librairie. Il ne faut pas oublier d'exclure ce paquetage de la javadoc et de l'analyse Clirr.
  • Gestion de la dépréciation dans l'API
    • Version courante : Utiliser l'annotation @Deprecated dans le code et le tag @deprecated dans la javadoc (voir aussi la documentation Oracle sur le sujet).
    • Future version : Déplacer le code déprécié vers des artefacts dont le nom se termine par "-legacy". Les classes dépréciées sont déplacées. Les méthodes dépréciées sont déplacées en utilisant AspectJ.
  • Gestion des nouvelles API : Celles-ci sont potentiellement instables. Il faut utiliser l'annotation @Unstable et préciser une limite de validité.

Attention à l'ajout de méthodes dans une interface ! Mais cela ne sera plus un problème à partir du jdk8, qui permet d'ajouter une implémentation par défaut sur une interface.

L'enfer des jars

Il arrive parfois que certaines classes soient dupliquées à l'exécution (même classes dans 2 jars présents dans le classpath). Lorsque les classes sont différentes, cela constitue un véritable problème qui peut être résolu en utilisant les plugins maven suivants :

  • duplicate-finder pour détecter les classes dupliquées.
  • enforcer pour forcer l'application de certaines règles (version du jdk, version des artefacts ...).

Tests de couverture

La librairie JaCoCo mesure la couverture des tests et, si la valeur est en dessous d'un certain seuil, la construction du projet échoue.

Attention : Certains tests peuvent être non déterministes et le taux de couverture peut varier d'une exécution à l'autre, sans modification du code. C'est notamment le cas lorsqu'on utilise la classe ConcurrentHashMap avec plusieurs threads. Vincent propose de rajouter un paramètre nommé threshold (voir la discussion sur le projet github de JaCoCo) pour définir une marge de tolérance par rapport au seuil.

Faux positif/négatif

Un faux positif correspond à un test qui passe alors qu'il aurait dû échouer. A l'opposé, un faux négatif correspond à un test qui ne passe pas alors qu'il aurait dû passer. Exemple de faux négatif : crash, lenteur du système. Voici quelques plugins Jenkins qui peuvent servir dans ces situations :

  • Groovy Postbuild : Ce plugin permet de contrôler le résultat d'un build et éventuellement rajouter un badge sur le sommaire du build et/ou l'historique des builds. Dans notre cas, il peut rechercher du texte dans les logs afin de vérifier qu'un test passe réellement.
  • Email-ext : Ce plugin permet d'étendre la fonctionnalité de notification par email. On pourrait, par exemple, annuler l'envoi d'email lorsque le système est lent (mais l'interface web de jenkins continuerait de montrer le problème).
  • Scriptler : Ce plugin permet de centraliser les scripts Groovy d'une instance Jenkins. On peut aussi jouer un script sur tous les jobs jenkins ou sur tous les noeuds/esclaves. Remarque : le plugin gère 2 sites de partage de scripts : jenkins-scripts ou scriptlerweb.

Bug tracking

Avec le temps, les courbes de bugs ouverts et bugs corrigés tendent à diverger. Pour atténuer cette divergence, le jeudi a été déclaré jour de correction des bugs par les contributeurs du projet XWiki. Afin de diminuer rapidement les bugs ouverts, ceux-ci commencent par fermer les bugs corrigés et les bugs en doublon. Ensuite, ils corrigent les bugs faciles et requalifient certains bugs en évolution. Pour voir le résultat, consulter le tableau de bord du projet XWiki.

Pour terminer, Vincent souligne qu'il faut paramétrer les outils afin qu'ils fassent échouer un build lorsqu'une mesure est mauvaise. Sans cela (paramétrage pour émettre un simple avertissement), on va avoir tendance à ignorer le message, puis laisser le problème empirer et finalement ne jamais le corriger.

Devoxx France 2013 – SARAH une maison intelligente pour connecter les objets

A l'occasion de Devoxx France 2013, j'ai assisté à la conférence intitulée « SARAH une maison Intelligente pour connecter les objets » présentée par Jean-philippe Encausse.

Le projet SARAH (abréviation de Self Actuated Residential Automated Habitat) est inspiré de la série de science fiction américaine EURᵉKA. Son but est de créer une maison "intelligente" où tous les objets sont connectés entre eux ainsi qu'à internet. La première chose qui m'a marqué est la manière dont Jean-philippe passait d'une diapositive à une autre :

  • un mouvement de bras vers la gauche pour passer à la diapositive suivante
  • un mouvement de bras vers la droite pour retourner à la diapositive précédente

Cela est rendu possible grâce aux API C# de la Kinect, qui permettent notamment de faire de la reconnaissance faciale et gestuelle. L'inconvénient de cette technologie est qu'elle ne fonctionne que sous Windows (mais je viens de découvrir le projet libre OpenKinect, dont le but est de permettre son utilisation sous Windows, Linux et Mac).

De nombreux autres périphériques disposent déjà d'une API http publique. C'est le cas, par exemple, de la télécommande freebox (v5 ou v6). Voici quelques liens sur le sujet :

Du point de vue implémentation, le projet SARAH est composé d'un serveur basé sur le framework Javascript Node.js (présentation sur wikipedia), auquel on associe un connecteur http pour chaque appareil. Pour rajouter des connecteurs, il faut aller sur le dépôt du projet. La configuration de SARAH est décrite dans un fichier JSON et l'animation est gérée par un moteur de règles permettant de chainer les modules (si ... alors ....).

Pour plus de détails sur le projet SARAH, vous pouvez consulter le site dédié

Devoxx France 2013 – No(Geo)SQL

A l'occasion de Devoxx France 2013, j'ai assisté à la conférence intitulée « No(Geo)SQL » présentée par Nicolas Helleringer.

La modélisation géographique (aussi appelée spatiale) est possible dans les SGBD depuis longtemps mais ne fait toujours pas partie des fonctions de base. Les systèmes d'information géographiques (SIG) fournissent des services basés sur la localisation (en anglais, on dit LBS pour Location Based Services). La représentation du monde physique et le Géomarketing sont des utilisations typiques qui nécessitent un fond de carte associé à des informations spécifiques au système.

Il est difficile de représenter un polygone dans une colonne de SGBD car celui-ci est défini par des points et des vertex, en 2 ou 3 dimensions et souvent de manière dense.

L'OpenGIS Consortium a créé une surcouche complexe pour SQL, spécifiée par plus de 50 normes sur les SIG !

Parmi les plateformes LBS, la plus connue est Google Maps qui fourni une abstraction du format des adresses (l'europe, l'amérique et la ville de tokyo n'utilisent pas les même formats). Celui-ci gère la localisation des adresses, l'affichage des rues, du fond de carte, la prise en compte du navigateur. Il ne reste plus au client qu'à gérer ses données spécifiques sur son propre serveur. Celles-ci sont modélisées en SQL avec une latitude et une longitude. Cela présente des inconvénients, même sur un petit interval, car il faut un index sur la longitude et la latitude, ce qui peut être assez lourd.

Il existe différents algorithmes permettant de rechercher des données géographiques de manière optimale : arbre équilibré (en anglais B-tree), Quadtree (partitionnement d'un espace bidimensionnel), R-tree. En NoSQL, certaines bases de données gèrent les données spatiales : Neo4j (R-tree et Quadtree), mongoDB (B-tree).

Hibernate Search Spatial est une extension Hibernate ajoutant la gestion des données spatiales. L'indexation utilise l'algorithme Quadtree pour répartir l'ensemble des valeurs sur un maillage plus ou moins serré afin d'encadrer rapidement le secteur recherché. Cette extension introduit l'annotation @Spatial, à placer sur une classe (entité), ainsi que les annotations @Longitude et @Latitude à placer sur les champs de l'entité qui définissent un emplacement.

Pour terminer, Nicolas nous parle de la base de données libre GeoNames, qui contient les noms de nombreux lieux dans tous les pays (ville, rue, lac ...). Comme exemple d'utilisation, il suggère une application pour mobile qui utilise la position GPS courante pour trouver un coiffeur à proximité.

Devoxx France 2013 – De compiletout.bat à l’Usine Logicielle pour Java

A l'occasion de Devoxx France 2013, j'ai assisté à la conférence intitulée « De compiletout.bat à l'Usine Logicielle pour Java » présentée par Guillaume Rams.

Voici quelques outils qui peuvent servir dans le cycle de vie d'un projet :

  • crap4j analyse les risques lors d'un changement du code
  • Sonar / Checkstyle / pmd :
    Au lieu d'utiliser directement pmd et checkstyle, il vaut mieux utiliser Sonar, un outil de collecte générant des rapports sur la qualité d'un logiciel. Il ne fait pas de mesures par lui-même mais délègue cela à des outils spécifiques.

Le terme "Smoke Tests" désigne les tests minimaux qui soient automatisables pour une version déployée. Guillaume conseille de mettre en place ce genre de test, ce qui sera toujours mieux que rien du tout. Pour une application web, cela pourrait se traduire par "afficher la page d'accueil".

Pour terminer, Guillaume parle de Clinker, un écosystème comprenant une usine logicielle complète pour Java. Il existe en 2 versions : Clinker Cloud pour un hébergement payant dans le cloud et Clinker Virtual Appliance, une machine virtuelle à télécharger gratuitement et à faire tourner dans VMWare ou VirtualBox.