Maven : assurance qualité du code en JAVA

Depuis que j’ai découvert le blog de Frederic Hardy et son outil Atoum pour les tests unitaires en PHP, je m’intéresse beaucoup à l’assurance qualité dans les codes.

Dans le cadre d’un projet scolaire, j’utilise le langage Java pour créer un outil qui fait tourner des algorithmes génétiques à la manière de jgap. Pour ce projet, nous avons à disposition un ensemble d’outils tels que redmine (voir comment intégrer Redmine à Netbeans) ou bien Maven. Au départ nous utilisions Maven surtout pour la gestion des dépendances. En effet, nous avons eu besoin des bibliothèques externes (JFreeChart par exemple) et cela était nécessaire de ne pas se perdre dans nos dossiers avec des classpath locaux.

Ensuite, nous utilisions aussi JUnit pour les tests unitaires. L’avantage alors c’est que Maven, à chaque compilation, exécute les tests : nombreuses heures de débug économisées.

Mais d’ici peu, la deadline arrivera, et comme notre nombre de lignes de code à la minute ne cesse d’augmenter, on s’est rendu compte que parfois nos codes étaient… douteux. J’ai donc pris quelques minutes pour chercher des outils d’analyse du code, j’ai trouvé PMD et FindBugs qui sont très performants. Je les ai fait tourner en parallèle à mon code et finalement, je ne faisais que perdre du temps. Les rapports étaient sur deux logiciels différents, l’ordinateur avait même fini par ralentir (bon, OK, il vieillit quand même). J’ai donc décidé qu’il fallait absolument intégrer ça à Netbeans, ou au moins à Maven. Et j’ai réussi. J’ai par la même découvert des fonctionnalités que je n’attendais pas sur Maven.
Continue reading

Utiliser JFreeChart pour représenter une fonction

Actuellement sur un projet d’optimisation par algorithme génétique, j’ai décidé d’utiliser JFreeChart, un outil de création de diagramme en Java.Cet outil est gratuit mais les tutoriels exemples sont payants, rendant difficile le mimétisme de code, sauf à explorer pendant pas mal de temps stackoverflow.

Le cas d’utilisation que je donne ici est le rendu qui ressemble à celui-ci :

Résultat de l'optimisation

Résultat de l’optimisation

La fonction de base doit être dessinée en continue, puis, les points correspondant aux meilleurs résultats de l’algorithme sous forme de point.

I L’organisation de JFreeChart

Avant de pouvoir dessiner des fonctions avec JFreeChart, il faut comprendre comment un tel dessin est mis en place. Cela permet surtout de savoir dans quelle ordre il faut construire les différents objets.

diagramme UML de JFreeChart

diagramme UML de JFreeChart

Ainsi, il faut commencer par construire les “Series”. Ce sont les ensembles des couples “(t, f(t))”.

  1. XYSeries baseFunction = new XYSeries("Base function");
  2. XYSeries population = new XYSeries("Population");
  3. for(double i = -12; i<12.99;i+=0.005){
  4.     double vars = i;
  5.     baseFunction.add(i, f(vars));//en supposant que votre fonction s'appelle "f"
  6. }
  7. for(double i = -12; i<12.99;i+=1){
  8.     double vars = i;
  9.     population.add(i, f(vars));//en supposant que votre fonction s'appelle "f"
  10. }

Une fois ces Series créées, il faut les ajouter dans une XYSeriesCollection qui doit contenir toutes les séries de données qu’on veut afficher sur le Plot.

Ensuite, la théorie voudrait qu’on crée un Plot puis une Chart. Heureusement, JFreeChart possède des Factory qui prennent en paramètre des XYSeriesCollection :

  1. JfreeChart chart = ChartFactory.createXYLineChart("Studied function","X" ,"Y",
  2.                 collection, PlotOrientation.VERTICAL,
  3.                 true, true, true);
  4. ChartPanel panel = new ChartPanel(chart);

Le mieux est de créer un ChartPanel, qui étend de JPanel et qui surcharge certaines méthodes afin de mieux redessiner la chart.

Un clic droit sur l’image générée vous permettra de l’enregistrer sous format PNG.

Changer le rendu

Actuellement, nous avons les deux séries qui sont rendues de la même manière.
Nous, ils nous faut un rendu différent selon les séries. Dans notre cas : soit des points soit des lignes.
La configuration à changer dans notre cas, c’est celle du Renderer. Par défaut, les XYChart ont un LineRenderer. Nous, nous allons utiliser le XYLineAndShapeRenderer.

  1. XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, false);//on n'affiche par défaut que des lignes
  2. renderer.setSeriesLinesVisible(0,true);
  3. chart.getXYPlot().setRenderer(renderer);
  4. renderer.setSeriesLinesVisible(1,false);//on enlève les lignes pour la série des points
  5. renderer.setSeriesShapesVisible(1,true);//et on active les points

Suivi du projet intégré à Netbeans

Les IDE savent tout faire aujourd’hui. Leur architecture qui permettent l’ajout de plugin leur permettent de concentrer en un seul logiciel tous les outils du développement.

Le principal inconvénient de cette évolution, c’est la lenteur au démarrage voire parfois à la compilation. Mais bon quand un logiciel permet d’ajouter aux fonctionnalités habituelles telles que l’autocomplétion, la vérification syntaxique… des outils plus orientés “projets”, ça peut devenir un sacré bonheur d’avoir ces logiciels.

Grand habitué de Netbeans j’utiliserai cet IDE pour la suite du billet, mais sachez que tous les IDE ont ce genres de possibilités, à condition que la communauté (ou l’entreprise) ait développé le plug-in. Ainsi, si vous êtes fan de visual studio, d’éclipse… Un détour sur sourceforge.net vous permettra de découvrir pas mal de plugins open source.

Ce qui m’intéresse dans mon exemple c’est le support d’un gestionnaire de projet, ici redmine. Ce dernier, comme beaucoup d’autres, utilise une interface web pour tout administrer, lier, comprendre. Quand on ne développe pas un site web, c’est parfois frustrant de devoir switcher sur le navigateur pour obtenir l’information qu’on veut, ou pire pour lier un commit à une issue.

Sur redmine, pour lier un commit à un problème, puis clore ledit problème, il faut :

  1. connaître le titre ou l’identifiant de l’issue.
  2. Aller dans Repository=>sélectionner le commit=>cliquer sur “add” en dessous de “related issue”. (c’est petit en plus)
  3. retourner dans issues
  4. ouvrir l’issue
  5. changer le statut
  6. valider.

Quand on est sur netbeans, qui utilise le bugtracker bugzilla, en bas de la fenêtre de commit, on trouve une petite invitation à “mettre à jour l’anomalie”. Preuve que l’IDE a déjà prévu une telle fonctionnalité.

Pour redmine, il faudra aller chercher un plugin qui est pour l’instant en version bêta en entrant ces coordonnées dans le centre de mise à jour (Tools=>Plugin:update center) :

url : http://kenai.com/projects/redminenb/sources/redminenb/content/trunk/dist/updates/updates.xml?raw=true
update

 

Ensuite, plus qu’à installer le plugin. Une fois cela fait, il faudra ajouter le bugtracker à votre projet. Pour cela, ouvrez votre projet et assurez vous que c’est celui qui est sélectionné. Puis dans Team->Report Issue (signaler une anomalie) cliquez sur “new”.

Il vous proposera tous les bugtracker qu’il connait dans le premier menu déroulant. Sélectionnez redmine. Puis ensuite entrez les coordonnées.

Attention, il faudra que l’API REST soit activée pour que ça marche.

Un petit aperçu :

commit new_issue Il ne vous reste plus qu’à configurer vos raccourcis pour que l’accession à ce système soit encore plus rapide. N’hésitez pas aussi à leur faire des retours http://kenai.com/jira/browse/REDMINENB.

Mysql va arriver en version 5.6

Dans un précédent article, j’annonçais que PHP dépréciait l’API mysql_ de manière officielle pour ne laisser que PDO et Mysqli. Une des forces de ces deux API, c’est que contrairement à leur ancêtre, elles prennent en compte les nouveautés apparues dans mysql 5.1+. Il y a une deux semaines, Oracle -qui possède désormais Mysql- a annoncé la version 5.6, et vue les nouvelles fonctionnalités, ça serait vraiment dommage de se passer de tout ça non?

Des optimisations à gogo

Oracle aime bien faire évoluer très rapidement les technos qu’il rachète. Ainsi en plus de casser Java ils ont décidé d’améliorer grandement MySQL, n’en déplaise à son créateur qui a forké le tout pour créer MariaDB. Et pour le coup ce sont des optimisations qui sont à l’oeuvre principalement.

On le sait, Mysql a un certain retard sur PgSQL en matière de rapidité, et ce ne sont pas les moteurs alternatifs à InnoDB comme MyISAM qui vont mettre en péril la domination de ce SGBDR là. Pourtant Oracle, petit à petit travaille sur les caches SQL -notamment pour les requêtes préparées du côté du serveur Mysql-, l’optimisation des index etc.

En effet dans les premières versions de Mysql 5, qui ont permis à PDO et mysqli de s’envoler, Oracle comme PHP était obligés de déconseiller l’utilisation de requêtes préparées natives car Mysql ne les mettait pas en cache.
Cela signifiait que nous devions nécessairement passer par de l’émulation de la préparation par PDO/mysqli. La doc de PHP nous déconseillant d’écrire [icc lang="php"]$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARE,false);[/icc].

Dans cette nouvelle mouture, l’optimisateur de requête est amélioré et reçoit notamment l’option « Index condition pushdown » pour les requêtes avec une clause WHERE sur des champs Index.

L’optimisation marche de cette manière :

  • Sans le Index condition pushdown :
    1. Va chercher la ligne suivante puis en utilisant les index il va localiser et lire la ligne entière
    2. Applique la clause WHERE qui correspond à la table et filtre la ligne en fonction du résultat.
  • Avec le Index condition pushdown :
    1. Va chercher le tuple d’index de la ligne suivante
    2. Regarde les conditions qui sont liées à l’index. Si le filtrage exclus la ligne, on passe à la suivante à partir de l’étape 1.
    3. Si le filtrage a accepté les index, la ligne entière est localisée et lue
    4. Enfin le reste de la clause WHERE (sans les index donc) est exécutée

     

Profilage facilité : nouvelle mise en forme pour la sortie EXPLAIN

La sorite EXPLAIN est utile lorsqu’on désire optimiser les requêtes les plus lourdes. Elle nous permet de mieux dimensionner nos colonnes (les VARCHAR entre autre), et surtout de mieux choisir nos index (unique, texte…).

Cette sortie est souvent utilisée en console lors du développement, mais avec la quantité de profiler intégrés aux IDE ou aux barre d’outil des versions de développement des applications (comme sur Symfony), opter pour un format léger, reconnu de tous, dans tous les langages et facile à parser est important. La montée en puissance de JavaSript et de Node.js aura sûrement été un argument supplémentaire lorsqu’Oracle a choisi d’utiliser JSON pour faire ça.

Un peu de NoSQL dans MySQL :

Une API expérimentale fait son apparition dans MySQL qui a pour but d’être utilisée avec Memcached afin d’accélérer les recherches en base de données.  Une piste d’amélioration sûrement conséquente non?

Astuce chrome : utiliser un autre moteur de recherche à la demande

Le gros avantage de passer le plus clair de son temps à coder c’est qu’on apprend à se servir des raccourcis. Cela va des astuces style Alt+Insert pour générer du code dans netbeans à la configuration du clavier pour que nos applications favorites répondent sans avoir à faire un retour bureau puis double clic.

Il y a quelque temps je découvrais un superbe raccourcis sur chrome qui me permettait de rechercher un produit sur materiel.net sans avoir à aller sur le site puis saisir ma recherche dans leur moteur. Sur chrome, il suffit d’entrer materiel.net + espace + produit recherché pour faire cela rapidement.

C’est une nouvelle fois chrome qui m’amène à écrire ce petit article. Il y a peu une entreprise française a lancé son moteur de recherche : qwant. Ce moteur de recherche, même s’il parait un peu charché au départ (j’avoue la vue colonne est horrible, la vue mosaïc peut être un peu moins…) a une particularité toute à fait géniale : il intègre par défaut les réseaux sociaux. Ce qui permet de trouver rapidement tout ce qui a rapport à l’actualité. Le pire c’est que ça marche et que c’est plus rapide que google car grâce aux réseaux sociaux, le référencement est plus rapide que celui de google !

Alors voici une astuce pour changer de moteur de recherche à la volée, c’est à dire pour que vous puissiez, le temps d’une recherche, choisir un autre moteur que celui que vous aimez le plus.

Dans chrome

  • Aller dans les paramètres de Chrome
  • Sélectionner “gérer les moteurs de recherche”
  • Tout en bas de la liste des moteurs de recherche, ajouter ces paramètres personnalisés dans les champs de saisie
  • Dans l’ordre, mettez : Qwant – qw – http://www.qwant.com/multi?q=%s
Entrez votre nouveau moteur de recherche

Entrez votre nouveau moteur de recherche

Le “qw” est le fameux raccourcis équivalent à materiel.net. Ainsi en tappant qw G20 vous aurez les actualités concernant le G20 (et même une belle vidéo au milieu).

Je continue de chercher pour les autres navigateurs, mais il sembleraient que beaucoup aient choisi de mettre des extensions pour faire ça. C’est dommage.