Quelques retours au feeling sur Mix-IT

J’ai assisté à Mix-IT la semaine passée.

Une conférence très conviviale, impeccablement organisée grâce à la dizaine de personnes du JUG Lyon et du CARA (le Club Agile Rhône Alpes) qui y ont mis toute leur énergie, mais aussi à l’impressionnant soutien des étudiants de l’Epitech présents à tous les étages.

Et à la présence du soleil 😉

Cette première édition présentait 25 sessions organisées en 5 tracks parallèles

  • Techy : Java et son écosystème,
  • Agility : Agilité pour débutants et passionnés,
  • Trendy : Tendances novatrices et avant-gardistes,
  • Mixy : Le meilleur de l’agilité et des technologies Java,
  • Gamy : jeux agiles et coding dojos

Avec la préparation de l’anniversaire de Duchess France je n’ai pas le temps de faire un retour très documenté, mais voici quelques retours au feeling sur les diverses sessions que j’ai suivies.

Les tests du futur

Mathilde Lemée nous a présenté Spock, un framework de test basé sur Groovy qui permet de clarifier l’écriture des tests unitaires. Grâce aux labels Java, les tests peuvent être écrits selon un formalisme given / when / then explicite. Elle a également rapidement présenté Geb un outil de test fonctionnel.

Comme Mathilde a fait plusieurs articles sur Spock, le plus simple est d’aller voir ça sur son site directement : http://www.java-freelance.fr/tag/spok

Grails from scratch to production

Pour la deuxième session, j’avais déjà vu la présentation HTML5 de Cédric Beurtheret et Alain Duval déjà jouée au Paris JUG.

J’ai donc opté pour la session Grails. Grails n’est pas tout nouveau. J’ai déjà un peu joué avec le tutoriel Grails, mais je me disais qu’il y aurait peut être quelques informations sur le « en production ». En fait, la présentation d’Aurélien Maury était surtout sur le « from scratch ».

J’ai quand même eu la réponse à une question qui m’intriguait en voyant les exemples de configuration Grails. La configuration a toujours l’air en dur et quand ça part dans un war ça ne doit pas être très pratique. En fait, la réponse était déjà écrite par l’intervenant. Elle est là : Grails Tips Externalise la-configuration.

Introduction à Clojure

Après le repas, un des sujets qui me motivait le plus, Clojure. Laurent Petit nous a présenté ce langage dynamique tournant dans la JVM,   simple, fiable, performant et ultra-expressif !

Les speakers avait quand même ajouté :

Le truc ? Facile : sortez de votre zone de confort et pensez simple, le jeu en vaut la chandelle !

Et il faut vraiment sortir de sa zone de confort, car c’est quand même très différent de ce qu’on manipule tous les jours. Pour ceux qui ont fait du LISP, il y a un air de famille, mais pour les autres ça doit être proche du Vulcain. La présentation était très claire, mais très technique car elle faisait appel à des notions sur la théorie des langages.

(defn read-file [file]
    (with-input-stream (new FileInputStream file)
        (fn [is]... corps de la methode)))

A vrai dire, c’est plus facile lorsque l’on a une motivation. J’ai depuis longtemps dans mon GTD le projet d’utiliser Incanter pour quelques scripts que j’utilise pour analyser mes résultats de test de performance pluôt que R. R et Incanter sont des outils d’analyse statistique. R est inspiré de Scheme. C’est un environnement très complet mais assez loin de Java. Incanter est un outil plus récent  implémenté en Clojure. Il tourne dans une JVM et serait plus facile à interfacer avec d’autres programmes en Java.

Clojure est un langage à base  fonctionnelle avec des données immuables et des structures de données persistantes. Un mécanisme permet de gérer des changements d’états contrôlés sur un mode transactionnel si nécessaire.

Je n’ai pas trouvé la présentation de cette session, mais si Clojure vous intéresse vous pouvez lire l’interview donné par les speakers sur le site de Duchess France http://jduchess.org/duchess-france/blog/session-clojure-a-mix-it/ et la retranscription par Olivier Croisier d’une conférence sur Clojure à Paris avec une discussion en Google Wave qui compare Clojure et Scala http://thecodersbreakfast.net/index.php?post/2010/02/08/Conf%C3%A9rence-Clojure-chez-Zenika-%3A-le-compte-rendu

Félicitations à Laurent Petit qui a assumé tout seul 2 sessions à la suite et bon rétablissement à Christophe Grand absent pour un problème de santé.

Intelligence collective avec Apache Mahout

Mahout est un outil d’apprentissage automatique et d’analyse de données. C’est le type d’outil qui est utilisé pour faire de la catégorisation de textes dans les moteurs de recherche par exemple ou pour les systèmes de recommandation des sites sociaux ou de commerce. A noter ce projet Apache est co-dirigé par une femme, Isabel Drost.

La présentation de Michaël Figuière a présenté les usages que l’ont pouvait faire de ce framework et les bases de l’utilisation de l’API. ça a l’air très simple à mettre en oeuvre. a essayer un jour.

Le mouvement devops

Bien sûr je n’y suis pas allée pour découvrir le concept. J’assiste au sessions du devops group à Paris depuis la première édition. C’était l’occasion de rencontrer Gildas Le Nadan le leader de devops Lille.

Pour ceux qui n’en auraient pas entendu parler devops est un mouvement émergeant qui vise à rapprocher les équipes de développement et les opérations (la production en français) pour mieux résoudre les problèmes de déploiement et de suivi de production.

La présentation était plutôt destinée à la cible Agile de Mix-IT. Mais les imitations de sysadmin bougon de Gildas sont franchement très réalistes. A ne rater sous aucun prétexte !

La présentation de Mix-IT se trouve ici http://devops.fr/mixit/slides.pdf

Vous trouverez des ressources sur devops en français sur le site de devops Paris http://parisdevops.fr/ et des pointeurs sur les sites en anglais sur le site de Gildas http://devops.fr

Pour les gens qui habitent Lille ou Paris, vous pouvez vous rapprocher des groupes ci-dessous

A quand un groupe devops en Rhône Alpes ?

Mix-IT Lyon c’est fini pour cette année.

On attend impatiemment l’année prochaine. Mais dans l’intervalle d’autres manifestations en province s’organisent : le BreizhCamp à Rennes le 17 juin, le JUG Summer Camp à La Rochelle le 16 septembre, et j’ai même entendu parler d’une idée de Mix-IT au Luxembourg.

Sonar against a non-maven multi-modules project

I’ve explained a few monthes ago how to run Sonar against a non-maven project.

The workaround is to create a POM with an explicit source directory and set the Sonar property sonar.dynamicAnalysis to false.

What if the project has many source folders ?

For instance a WebSphere Commerce Server project with 3 sub-projects:

  • Stores which sources are in JavaSources
  • WebSphereCommerceServerExtensionsLogic which sources are in src
  • WebSphereCommerceServerExtensionsData which sources are in ejbModule

It looks like a Maven project with 3 modules, each module having a non standard source folder.

Step 1: The main POM

First of all, make a new directory besides the project root folder and create the main POM file.

Your directories now looks like

  • Project
    • Stores
    • WebSphereCommerceServerExtensionsLogic
    • WebSphereCommerceServerExtensionsData
  • MavenProject
    • pom.xml


pom.xml


<project xmlns= »http://maven.apache.org/POM/4.0.0&Prime;
xmlns:xsi= »http://www.w3.org/2001/XMLSchema-instance &raquo;
xsi:schemaLocation= »http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd »&gt;

<modelVersion>4.0.0</modelVersion>

<!–  project information –>

<groupId>my-commerce-web-site</groupId>
<artifactId>my-commerce-web-site</artifactId>
<name>My Commerce Site Project</name>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<build>

<!– Setup compiler options Java 1.4 –>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.4</source>
<target>1.4</target>
</configuration>
</plugin>
</plugins>

</build>

<modules>

<module>ExtensionsData</module>
<module>ExtensionsLogic</module>
<module>Stores</module>

</modules>

<properties>

<sonar.dynamicAnalysis>false</sonar.dynamicAnalysis>

</properties>

<pluginRepositories>

<!– Sonar may not be found on some repositories –>
<pluginRepository>
<id>Codehaus repository</id>
<url>http://repository.codehaus.org/</url&gt;
</pluginRepository>

</pluginRepositories>

</project>


Step 2: Modules directories

Create a directory  for each modules with respect to the module’s  names  in the main  pom.xml

Your directories now looks like

  • MavenProject
    • pom.xml
    • Stores
    • ExtensionsLogic
    • ExtensionsData

Step 3: Module’s POMs

Create the module’s pom.xml for each module.

Stores/pom.xml


<project xmlns= »http://maven.apache.org/POM/4.0.0&Prime;
xmlns:xsi= »http://www.w3.org/2001/XMLSchema-instance &raquo;
xsi:schemaLocation= »http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd »&gt;

<modelVersion>4.0.0</modelVersion>

<!–  project information –>
<groupId>my-commerce-web-site</groupId>
<artifactId>my-commerce-web-site-stores</artifactId>
<name>MyCommerceSite Stores</name>
<version>0.0.1-SNAPSHOT</version>
<parent>

<groupId>my-commerce-web-site</groupId>
<artifactId>my-commerce-web-site</artifactId>
<version>0.0.1-SNAPSHOT</version>

</parent>

<build>

<sourceDirectory>../../Project/Stores/JavaSource</sourceDirectory>
<outputDirectory>target/classes</outputDirector>

</build>

</project>


Parent’s groupId and artifactId should match the main pom’s groupId and artifactId.

Your directories now looks like

  • MavenProject
    • pom.xml
    • Stores
      • pom.xml
    • ExtensionsLogic
    • ExtensionsData


Similar posts:

Appeler Curl depuis un program Python 3.1

Curl (un client HTTP en ligne de commande) est très pratique à utiliser pour tester manuellement les requêtes Rest. Il permet en particulier de manipuler les headers ou les méthodes HTTP.

Par exemple :

# envoi des données en JSON en paramétrant le header
curl -i -H 'Content-Type: application/json'
-d '{"items":[{"title": "AAA AAA", "description": "aaa aaa aaa",
"link": "http:AAA.com"}]}'  http://${SERVER}/rest/messages

# suppression du message avec la methode DELETE
curl -X DELETE http://${SERVER}/rest/messages/1

J’ai fait un petit programme Python pour faciliter la construction des différentes requêtes Rest. Le programme Python permet de sélectionner le server GAE local/remote, le type d’opération, le variant pour l’input, l’output demandé et saisir les données à envoyer.

 

Appeler Curl m’a posé quelques problèmes.

Pycurl (une intégration curl/python) n’existe pas pour python 3.1. J’ai donc implémenté les appels de commande externes directement en Python. Mais j’ai eu un peu de mal à trouver les informations car les I/O Python ont pas mal changées au cours du temps. Voici le code qui permet d’appeler une commande et récupérer la sortie standard en Python 3.1.

runCommand

On utilise Popen du module subprocess. La méthode communicate() crée un tableau où 0 contient la sortie standard et 1 la sortie erreur.
Si vous voulez rediriger la sortie erreur sur la sortie standard, utilisez stderr=STDOUT.
Pour une raison qui m’échappe le passage de la commande en tableau a cessé de fonctionner, mais la concaténation de chaînes à résolu ce problème.

Running Sonar against a GAE Java project

The GAE SDK generates a project that is not Maven enabled. Namely, source and target directories does not follow Maven conventions.
Sonar may be run against such a project by using Sonar light mode configuration.

  • We will write a minimal POM project and instruct Sonar to run only static analysis (code violations, complexity).
  • For the time being, we will put dynamic analysis (unit test results and code coverage) aside as it requires code to be executed, therefore dependencies configuration. Sonar may actually report dynamic analysis if surefire and cobertura reports are available.
But let’s start with some simple configuration.
You will need Sonar (1.8 minimum) and Maven 2.

Write a POM

Open the Eclipse project generated by GAE SDK and create a pom.xml file at the project’s root.
Add your project’s information (replace cirrus in the snapshot below by your project’s information)
projet
Add GAE build information. You should not have to change these lines.
build
Add some Sonar configuration to skip dynamic analysis. You should not have to change these lines.
sonaroptions
Depending on your repository and mirror, you may have to download sonar jars from the Codehaus repository.
fin

Run Sonar

Now run sonar from the shell command line or configure an Eclipse launcher. As the Sonar maven plugin will send out data to Sonar during the build, the Sonar server must be running.
runsonar
It may take a while the first time, as maven will download tons of libraries and plugins.
runsonarfin
When it’s done, Sonar’s analysis report is available at http://localhost:9000.
sonarpage
You may find usefull information about Sonar configuration including « Non-Maven » projects in Analyzing Java Projects

Générer un rapport PDF Sonar

Depuis Sonar 1.8, il existe un plugin de génération de rapport PDF.

La mise en oeuvre est très très simple.
Lancez la commande ci-dessous depuis un shell de commande ou l’IDE :

>mvn org.codehaus.sonar-plugins:pdf-report:0.1:generate -Dsonar.base.url=http://nommachine:9000

L’option -Dsonar.base.url n’est pas obligatoire, mais il se trouve que je ne peux pas faire tourner Sonar sur le port standard 9000. Attention, pas de / à la fin de l’url sinon l’url générée contient un // au début du path et il ne parviendra pas à lire les données.

Il n’est pas nécessaire de télécharger le plugin, il automatiquement téléchargé et mis en place via maven.

Le rapport en PDF est généré dans le répertoire target du projet maven racine.
Il contient pour le projet et chaque module, les ratios du dashboard (voir image ci-dessous), les valeurs du radar par catégorie (Efficiency, Maintainability, Portability, Reliability, Usability) et les hotspots Most violated rules et Most violated files.

rapport-sonar

La page du plugin se trouve là Sonar PDF Plugin.

Sonar 1.8 et la Sonar Plugin Library

sonar posterPour ceux qui auraient raté les épisodes précédents, Sonar est un produit open source de qualimétrie pour le monde Java.

Cet outil pilote l’exécution des outils d’analyse de code (PMD, Checkstyle, Findbugs) et de test unitaire sous Maven, historise et fait la synthèse de toutes ces informations. Il peut être étendu par plugins (par exemple PL/SQL ou l’intégration Hudson).

Il se montre particulièrement indispensable sur des projets multi-modules où il est difficile d’avoir une vue d’ensemble de la qualité en utilisant chacun de ces outils et Maven Dashboard.
Sonar agrège ces informations selon les catégories ISO (Efficiency, Maintenability, Portability, Reliablity, Usability) et permet une identification rapide du type d’impact sur un radar. La navigation projet / module / package permet d’avoir ces informations à différentes granularités.

Plusieurs systèmes permettent de localiser facilement la classe et la portion de code où il faut agir en priorité pour améliorer la qualité :
– un pavage qui permet de visualiser à chaque niveau l’importance des éléments et leur niveau de qualité
– un nuage qui met en évidence les classes qu’il est facile d’améliorer et celles qui présentent le plus de risque
– depuis la version 1.8, Sonar a ajouté les hotspots, des top5 des classes les plus indisciplinées, les plus longues à tester, les plus complexes, les moins testées …

En plus des hotSpots, la version 1.8 ajoute en particulier le paramétrage de Findbugs, l’affichage des duplications sur le code source et le support de maven 2.1.

Vous cherchez encore des excuses pour ne pas évaluer la qualité de votre code ?
Allez le voir fonctionner sur Nemo et on en rediscute après.