dimanche 2 novembre 2014

Un jour, un storage : Redis

     Une autre structure de stockage de données in memory dont on entend régulièrement parler : Redis.

     Je l'ai rencontré lors d'une conférence au Devoxx Paris 2014 suite à une présentation "Tools in action" de Nicolas Martignole "Redis, une base Not Only NoSQL" :

Redis c'est quoi


     Redis signifie "REmote DIctionary Server" avec un jeu de mot sur Redistribute (http://redis.io/topics/faq)

     Si l'on retient les classifications actuelles, on pourrait la qualifier de base NoSQL clé/valeur. C'est une base in memory qui communique en TCP. Elle est écrite en C ANSI et tourne sur la majeur partie des systèmes dit POSIX, Linux est recommandé (http://redis.io/topics/introduction) mais il existe un portage windows https://github.com/MSOpenTech/redis.

     Afin de pouvoir requêter cette base de nombreux de clients ont été développés dans différents langages (Java, C, C#, Go Perl, Haskell, Lua, ...).
     Les principaux clients Java :

     Redis, construit sur la base d'un manifeste, lettre d'intention sur ce qu'il doit être, a une approche qui colle aux structures de données manipulées. Pour preuve son API et la documentation qui donne le Time Complexity (en notation O) des différents points d'API :

     Quand aux utilisations possibles : cache dynamique, base in memory (persistence possible en dump ou journalisation), messaging. Attention à vos contraintes et au CAP théorème.

L'historique


     Redis a été créé par Salvatore Sanfilippo et Pieter Noordhuis en 2009 (voir http://redis.io/topics/license).

     Avant Mai 2013 le projet était sponsorisé par VMWare, il l'est maintenant par Pivotal.

     La version actuelle est la 2.8.17, une version 3.0.0 est en release candidate. L'historique des versions depuis 2009 est accessible via Google Code

Redis est utilisé par quelques grands noms du web :

Et la concurrence ... Redis est régulièrement comparé à memcached

Les URLS


Le Site : http://redis.io/
Sous GitHub : https://github.com/antirez/redis
Les download : http://redis.io/download
Benchmarks : http://redis.io/topics/benchmarks

Du côté des développeurs :

Participer aux développements


Pour contribuer à Redis : http://redis.io/community
La mailing : https://groups.google.com/forum/#!forum/redis-db

Pour finir quelques tutoriaux pour s'y essayer :

dimanche 12 octobre 2014

L'open JDK

L'open JDK c'est quoi


Projet Java open source, débuté en 2006 par Sun visant à ouvrir le code de la JVM et des classes du JDK. A partir de l'open JDK vous pouvez builder et utiliser un jdk complet.

L'une des explications la plus claire que j'ai pu trouver est celle donnée par Rémi Forax sur cette thread des CastCodeurs : https://groups.google.com/forum/#!topic/lescastcodeurs/2067DUGyP20

Un blog post sur le passage à l'openJDK : la transition
https://blogs.oracle.com/henrik/entry/moving_to_openjdk_as_the

OpenJDK par ses URLs officielles


Le site OpenJdk : http://openjdk.java.net/
Le wiki : https://wiki.openjdk.java.net/dashboard.action

L'open JDK c'est aussi une communauté ouverte avec ses règles, sa gouvernance :

OpenJDK au JavaOne 2014


Plusieurs présentations lors du JavaOne 2014 en octobre dernier ont parlé de l'OpenJDK.

Exemple d'une JEP active : "Shenandoah: An Open Source Garbage Collector (JEP 189) with an Ultralow Pause Time [CON5216]"

Une présentation des sources de la JVM dans l'openJDK : "Introduction to HotSpot Internals [CON3294]"
https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=3294&tclass=popup

"The OpenJDK Project: Your Java. Our Java."
https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=9755

"Troubleshooting with Serviceability and the New Runtime Monitoring Tool HeapStats [BOF3108]"
https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=3108

En complément technique


Deux présentations RedHat de l'openJDK et son architecture :

Le projet "Adopt a JDK" du London Java Community visant à démocratiser son utilisation

Comment builder l'OpenJDK :

Pour finir OpenJDK et Docker

Les JVM sur la base de l'OpenJDK


Une présentation générale d'Oracle sur la JVM et son futur : "Evolving the JVM: Principles and Directions"
http://www.oracle.com/technetwork/java/jvmls2014goetzrose-2265201.pdf

IcedTea, la JVM de Redhat

La Zing d'Azul System

Zulu, également d'Azul system
Et si vous vous y perdez un peu : la différence entre Zulu et Zing

Pour finir les deux classiques Hotspot et JRockit maintenant toutes deux chez Oracle avec leur projet de convergence : https://blogs.oracle.com/henrik/entry/oracles_jvm_strategy

Bon, cette fois vraiment pour finir, une dernière qui a été abandonnée en 2011 : Apache Harmony

dimanche 5 octobre 2014

Revue de press du développeur Java


     Quelques news déjà plus si nouvelles que cela (et oui notre monde va vite) mais assez intéressantes pour être notée

Les slides et vidéos du JVM Language Summit 2014 qui s'est déroulé du 28 au 30 juillet dernier
http://www.oracle.com/technetwork/java/javase/community/jlssessions-2255337.html

En lien avec la JVM : Graal
http://www.javaworld.com/article/2691233/scripting-jvm-languages/oracles-graal-project-empowers-language-creation-on-the-jvm.html

Java 9 et open JDK
http://www.javaworld.com/article/2689365/java-platform/openjdk-project-opens-up-java-9-to-collaboration-experimentation.html
http://www.infoworld.com/article/2608801/java/why-developers-should-get-excited-about-java-9.html

Les élections 2014 au JCP (Java Community Process) pour les EC (Executive Committee) :
https://jcp.org/ja/whatsnew/elections

Parce que l'IT ce sont des modèles aussi qui se cherchent il y a aussi des projets qui s'arrêtent :

EOL (EndOfLife) pour LiveRebel
http://zeroturnaround.com/blog/goodbye-liverebel/
http://zeroturnaround.com/rebellabs/the-5-inconvenient-truths-indicating-the-market-still-isnt-ready-for-release-automation/

CloudBees arrête le Paas et se recentre sur Jenkins
http://www.lemondeinformatique.fr/actualites/lire-cloudbees-ferme-son-paas-et-s-allie-avec-pivotal-58603.html
http://www.infoq.com/news/2014/09/CloudbeesExitPAASResignEC

Un jour, un storage : Cassandra

     L'objet de ces billets "un jour, un storage" est de parcourir les différentes structures de stockage de données qui fleurissent ces derniers temps (NoSQL ou pas).

     La plus part ne sont pas forcément jeunes et ont des ancêtres qui remontent à bien plus longtemps encore mais les besoins de technologies face aux flux de données actuels, les tendances buzz ("big data") aidant ont les croise de plus en plus régulièrement.

     Je ne vais pas détailler leurs architectures, fonctionnement, utilisation ... mais plutot donner quelques points d'entré qui permettront d'avoir un aperçu et pour ceux qui le souhaitent creuser plus en avant la technologie.

     Première structure de cette série : Cassandra

Cassandra c'est quoi


     C'est un système de stockage de donnée distribué open source. Il adresse les problématiques de scalabilité, destiné à gérer des volumes important de donnés en gardant de bonnes performances et en étant tolérant aux pannes.

     Cassandra est développé en java, considéré comme hybride dans les familles NoSQL : entre clé/valeur et orienté colonnes.

Architecture interne :

Introduction Cassandra :

Quelques tutoriaux :

L'historique


     Comme on le disait tout à l'heure même si ces projets semblent récent, ils ont démarré il y a quelques temps déjà. Quelques dates concernant Cassandra.

     A l'origine Cassandra est un projet réalisé sur un modèle open source par deux développeurs de FaceBook (Avinash Lakshman et Prashant Malik), mis à disposition en juillet 2008 sous google code.

Quelques présentations aux débuts de Cassandra :

     En Mars 2009 Cassandra rejoint Apache Incubator

     Puis Mars 2010 il devient Apache Top Level Project

     Depuis les développements continuent sous l'aile de la fondation Apache :
  • octobre 2011 la version 1.0
  • Septembre 2013 la version 2.0

     Dernière version stable : 2.1.0 (releasé en septembre 2014)

     Les branches encore accessibles :
  • 2.0.10 (aout 2014)
  • 1.2.19 (septembre 2014)

La liste des commiters participants aux développements : http://wiki.apache.org/cassandra/Committers

Les URLS


Le projet : http://cassandra.apache.org/
Download : http://cassandra.apache.org/download/
Wiki du projet : http://wiki.apache.org/cassandra/
Wikipedia : http://en.wikipedia.org/wiki/Apache_Cassandra

DataStax Société commerciale avec expertise Cassandra : http://www.datastax.com/
Communauté Cassandra/Datastax : http://planetcassandra.org/

Un meetup Cassandra sur Paris : http://www.meetup.com/Cassandra-Paris-Meetup/

Participer aux développements


Comment contribuer : http://wiki.apache.org/cassandra/HowToContribute

Les mailing :
User : user-subscribe@cassandra.apache.org
Developer : dev-subscribe@cassandra.apache.org
Notifications de Commits : commits-subscribe@cassandra.apache.org
API cliente : client-dev-subscribe@cassandra.apache.org

Le JIRA Cassandra
https://issues.apache.org/jira/browse/CASSANDRA/?selectedTab=com.atlassian.jira.jira-projects-plugin:summary-panel

Repo Git : https://git-wip-us.apache.org/repos/asf?p=cassandra.git
Règle de coding : http://wiki.apache.org/cassandra/CodeStyle

lundi 25 août 2014

Rien à voir avec le dev (quoique ...)

Pour changer un peu, en dehors du monde du développement quelques artistes que j'apprécie

Littérature : Alain Damasio 
http://fr.wikipedia.org/wiki/Alain_Damasio

J'ai beaucoup aimé "La zone du dehors" en anticipation sur nos sociétés, "Aucun souvenir assez solide" en recueil de nouvelles, dont une très intéressante "Les hauts parleurs" sur la privatisation et commercialisation du vocabulaire (et un langage parlé ou informatique c'est un assemblage selon une grammaire de mots). Et encore dans un autre genre "La horde du contrevent" plus fantasy, sur l'histoire d'une équipe, là où les mots, les rythmes, la ponctuation ont leur importance.

D'Alain Damasio, toujours sur nos sociétés, j'ai beaucoup aimé la nouvelle "La rage du sage" (http://crep.strasbourg.free.fr/IMG/pdf/brochure-damasio-laragedusage.pdf), petit extrait :
"Chacun ses choix. Ben ouais.Be yourself, comme tout le monde. Alpha blondit et Carla brunit. Hugo Boss. Il a bien de la chance."

Pour finir 2 artistes plus plastiques rencontrés par hasard :

Jacques Degand pour ses tableaux (http://www.artistescontemporains.net/artiste/Jacques-Degand-8), je ne sais pas pourquoi mais cela me parle, les pattern ... allez savoir ...

Marc Sparza pour ses sculptures (http://peupledepapier.blogspot.fr/2014/01/marc-sparza.html), une idée représentée de manière simple ce qui a forcément demandé du travail, simple c'est compliqué mais c'est d'autant plus fort comme en développement.

vendredi 15 août 2014

Le monde du développement au travers ses acteurs

     Il y a différentes manières de faire sa veille technologique. On peut suivre les articles techniques, voir comment s'orientent les nouvelles versions des frameworks, assister aux conférences ou les retrouver à posteriori sur le web, pratiquer en faisant des poc ou en réalisant des projets personnels, suivre des formations, ...

     Une autre manière que je trouve pertinente c'est observer, suivre, comprendre comment travail les acteurs du domaine, voir les outils que eux utilisent, les choix qu'ils ont fait et les raisons de ces choix.

     Parallèlement aux aspects technologiques comprendre également les choix organisationnels d'autant plus intéressant que certains de ces acteurs de par leur nature travaillent de plus en plus avec des équipes composées de développeurs world wide, je pense, entre autres, à la fondation Eclipse et le cadre qu'elle met en place afin de permettre ceci (http://wiki.eclipse.org/Development_Resources).

Quelques articles qui dans cette ligne m'ont intéressé :

La fondation Eclipse, un peu d'histoire :
http://www.infoq.com/news/2011/11/eclipse-10

Le changement de release process chez Mozilla Firefox :
http://www.infoq.com/news/2014/07/release-process-mozilla-firefox

How Google works, l'article date un peu (2006) :
http://www.baselinemag.com/c/a/Infrastructure/How-Google-Works-1/

How GitHub works, avec un point de vue intéressant sur le travail asynchrone et la "Zone" :



Historique des SCM chez Apache OpenOffice, de CVS à Git :



lundi 11 août 2014

Work is in progress : Java 9

     Les travaux ont commencé pour la next release : Java 9. Les core développeurs se mettent en ordre de bataille et commencent à lancer les discussions sur les mailings, les premiers développements ont été commit (une early est dès à présent disponible).

     Dans les grandes lignes des changements en profondeur (JMM, typage, modularisation ne sont pas une mince affaire) tout en gardant en tête la compatibilité avec les précédentes versions.

     Jettons un oeil dans l'atelier pour voir ce qu'il se prépare.

En introduction


     Les préparations des nouvelles versions de jdk passent maintenant par openjdk et les JEP (JDK Enhancement-Proposal). Les jep permettent d'avancer les développements dans un cadre moins formalisé que les JSR, facilitant ainsi le début des travaux.

La jep 0 liste l'ensemble des jep (et les target release) : http://openjdk.java.net/jeps/0
La jep 1 détail le processus qui ne remplace pas celui des jsr (restant les spécifications officielles) mais vient plutôt en amont : http://openjdk.java.net/jeps/1

Un article de Stephen Colebourne concernant les jep : http://blog.joda.org/2011/11/future-is-in-jeps.html
La mailing dédiée aux jep : http://mail.openjdk.java.net/mailman/listinfo/jep-changes

Quelques généralités

Articles sur le sujet :

     Une présentation qui s'est déroulée au jvm language summit de juillet 2014. Présentation lors de laquelle John Rose et Brian Goetz donne les grandes lignes des orientations concernant l'évolution de la JVM, une runtime qui ne se destine pas uniquement à Java :
http://cr.openjdk.java.net/~jrose/pres/201407-JVMEvolution.pdf

Evolution du Java Memory Model (JMM)

Une présentation de Aleksey Shipilev (spécialiste de Java Performance chez Oracle) sur le JMM

     Le lancement de Doug Lea pour les évolutions JMM 9

     Dans la continuité, forcément des impacts sur les aspects concurrence : http://cs.oswego.edu/pipermail/concurrency-interest/2014-January/012169.html

Projet Panama

     Annoncé par John Rose, le projet Panama dont l'objectif est une meilleur connectivité entre la JVM et les API non java. Ce projet vise à mettre en place les FFI (Foreign Function Interface) en tant qu'alternative aux JNI (Java Native Interface), JNA (Java Native Access). FFi devrait être basé sur Java Native Runtime (JNR)


Articles :

Blog de John Rose : https://blogs.oracle.com/jrose/

Charles Oliver Nutter :

Projet Valhalla


     Initié par Brian Goetz, ce projet vise à faire évoluer le langage et son typage. Quelques exemples pouvant entrer dans ce domaine les value type, Spécialisation des generics et ici ou encore amélioration des volatiles


Articles liés :

Projet Jigsaw


     Initialement prévue en Java8 mais finalement retardé, il est annoncé pour Java 9 par par Mark Reinhold. Jigsaw vise à amliorer la modularité de Java afin de faciliter la scalabilité, améliorer la sécurité, améliorer les performances et faciliter les développements et la maintenance des librairies.

Retard de Jigsaw pour Java 8 :

L'annonce de la phase 2 : http://mreinhold.org/blog/jigsaw-phase-two
Jigsaw : http://openjdk.java.net/projects/jigsaw/goals-reqs/03
Présentation générale : http://cr.openjdk.java.net/~mr/jigsaw/notes/jigsaw-big-picture-01

Les JEP liées à Jigsaw :
jep 161 : http://openjdk.java.net/jeps/161
jep 162 : http://openjdk.java.net/jeps/162




Quelques présentations sur le sujet :

Article :

Les ressources Java 9


     Après avoir parcouru les grandes lignes si vous voulez entrer dans le détail et voir par vous même :

En early access on en est déjà au build 25, les changes de ce dernier build.:
http://download.java.net/jdk9/changes/jdk9-b25.html

Et si vous souhaitez contribuer, ce que vous pouvez faire et comment le faire :
http://openjdk.java.net/contribute/



Pour finir



Petite url bonus, rien à voir (enfin si c'est de la jvm) : jvm, performance et network de Norman Maurer

dimanche 27 juillet 2014

Investigation au niveau de la JVM

Introduction


     La JVM est un système complexe (JIT, GC, ...), pouvant être optimisé dans son utilisation. Il faut cependant faire attention à ne pas optimiser trop tôt car ce faisant on spécialise son utilisation et si cela répond bien aux use cases d'aujourd'hui, rien ne garantie que cela ne dégradera pas les performances pour les use cases de demain. Quoi qu'il en soit l'optimisation passe par de l'observation et des tests pour étudier les impacts. Et bien souvent les settings de base suffisent.

     A savoir la JVM via JIT est un système intelligent qui s'optimise (et se désoptimise) lui même à la volée (paramétrable également par jvm argument). Conclusion on peut observer un comportement localement qui ne sera pas le comportement une fois en production si l'on a pas pris les bonnes précautions.

     De même faire attention à l'implémentation de la JVM utilisée, les trois principalement rencontrées sont :
  • Hotspot d'Oracle (anciennement Sun)
  • JRockit d'Oracle (anciennement BEA), on la trouve sur serveurs applicatifs Weblogic
  • J9 d'IBM, on la trouve sur serveur applicatifs Websphere

     Ces 3 JVM peuvent avoir des comportements différents, des paramètres (jvm args) différents comme pour l'activation de la compression des références d'objets pour les jvm 64bit, voir OOPS. Suite aux différents rachats Oracle possède maintenant deux de ces JVM et met en place un projet de convergence, voir les liens suivant sur le sujet :

     Une dernière JVM apparait régulièrement, beaucoup plus spécifique c'est la Zing d'Azul System (http://www.azulsystems.com/products/zing/whatisit), je ne développerais pas ici.

     Dernier point les JVM, jdk sont des choses dynamiques, terrain encore en évolutions sur lesquels une communauté active et les éditeurs travaillent. Il est toujours bien de savoir sur quelle version on est, les différences qu'elles apportent, ... Quelques exemples d'évolutions récentes qui ont un impact :

     Il existe un certain nombre de produits sur le marché (software, services) facilitant l'étude du comportement d'une JVM :
  • en se basant sur les api, services de la jvm qui permettent de collecter des métriques et propose une interface pour les exploiter. La collecte des métriques est souvent réalisée par des agents développés et attachés à la jvm que l'on veut suivre, voir cet article.
  • en fournissant des services interprétant les logs de GC et donnant un rendu plus visuel
  • en instrumentant le code par différentes techniques (aop, introspection, ....)

     Dans ce billet je ne parlerais pas de ces solutions mais il est toujours bon de savoir que cela existe, ce qu'elles permettent de faire et comment elle le font. Quelques un de ceux ci :

Les plus connu :

Des projets plus développeurs :

Queqlues produits plus spécifique :

     Pour finir cette introduction, une url présentant une vision assez complète des JVM arguments que l'on peut utiliser : JVM Arguments card

Observation de la JVM


     Dans la partie qui va suivre on va discuter d'un certain nombre de JVM arguments (flags activant certaine options, comportement, traces). Pour au démarrage de votre process java avoir connaissance des jvm args, il existe un jvm arg : -XX:+PrintFlagsFinal qui permettra d'avoir une sortie console du type
[Global flags]
...        
    uintx AdaptiveSizeThroughPutPolicy              = 0               {product}          
    uintx AdaptiveTimeWeight                        = 25              {product}          
     bool AdjustConcurrency                         = false           {product}          
     bool AggressiveOpts                            = false           {product}          
     intx AliasLevel                                = 3               {product}          
     intx AllocateInstancePrefetchLines             = 1               {product} 
...

   

Observation via les logs


     La jvm effectue un certain nombre de tâches techniques depuis son démarrage jusqu'à son arrêt. Il peut être utile pour comprendre son comportement d'avoir une visibilité concernant ces opérations. Pour ce faire il est possible d'activer des logs techniques.

Les Logs GC (Garbage Collector)


     Il est recommandé de les activer systématiquement en environnement de développement, voir même en production (l'overhead reste léger, juste faire attention au volume de log généré sur le filesystem) car les informations fournies peuvent être précieuses et un évènement survenu ne sera pas toujours reproductible.

  • Activation des logs Garbage collector : -XX:+PrintGC 
  • Activation logs détaillé : -XX:+PrintGCDetails (recommandé)
  • Activation du timestamp pour savoir quand l'évènement a eu lieu : -XX:+PrintGCTimeStamps (nombre de seconde depuis le démarrage de la jvm) ou -XX:+PrintGCDateStamps (format date)
  • Spécifier les fichiers de log destination : -Xloggc:<file> 

A partir des jdk 1.6_34 et 1.7_2, possibilité de spécifier un roll sur les fichiers de configuration :
  • Activation : -XX:+UseGCLogFileRotation 
  • Obligatoire en cas d'activation de la rotation, nombre de fichier à garder : -XX:NumberOfGCLogFiles=<number of files>  
  • Obligatoire en cas d'activation de la rotation, taille de chaque fichier (possibilité d'utiliser la notation K (Kilo), m (mega)) : -XX:GCLogFileSize=<size>
Trois autres flags pouvant être utiles : -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime

     De plus -XX:+PrintGC et -XX:+PrintGCDetails sont dit "Manageable", c'est à dire qu'ils peuvent être activés runtime. Pour se faire deux manière
  • via le MBean com.sun.management:type=HotSpotDiagnostic, l'operation setVMOption (les parametres sont nom et valeur, voir javadoc pour plus de détail)
  • via le command line tool jinfo (fourni avec le jdk) "-flag <name>=<value> to set the named VM flag to the given value"
     Les jvm argument "manageable" sont indiqués dans la liste fournie par Oracle : http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

     Ces logs permettent de savoir quand tourne le Garbage Collector, combien de temps cela dure, ce qu'il fait. Le format de logs étant standard, un certain nombre d'outils permettent d'en avoir une visualisation graphique.

Logs Classloading


     Plus que pour de l'optimisation, ces logs permettent surtout de savoir quelle classe a été chargée depuis quelle librairie. Très pratique quand par dépendance transitive on tire plusieurs versions d'une même librairie (les parsers XML par exemple).

     Le jvm arg est "-verbose:class" à ajouter au lancement. Il permettra d'avoir tout le class loading (classe technique, jdk, librairies utilisées) sous la forme :
...
[Loaded java.util.HashMap from shared objects file]
[Loaded sun.misc.Hashing from D:\jdk1.7.0_25\jre\lib\rt.jar]
....
[Loaded org.junit.internal.runners.model.ReflectiveCallable from file:/C:/Users/Toto/.m2/repository/junit/junit/4.11/junit-4.11.jar]
....


    C'est une sortie console, on ne peut pas spécifier de fichier de sortie contrairement aux logs GC.

Logs JIT


     Un autre aspect dynamique de la jvm, que l'on aborde moins souvent au quotidien et qui je pense nécessite d'être outillé pour analyser : les logs du JIT (JustInTime) qui pratique les optimisations et désoptimisation du code à la volée.

Un outil : JITWatch (https://github.com/AdoptOpenJDK/jitwatch)
Article à son sujet :
     Pour se faire une idée de ces optimisations pratiquées runtime JIT est l'une des raison pour lesquels en Java un benchmark n'est pas toujours fiable 100%.

Observation via les dumps


     Un dump est une photo à moment donné de l'état de notre JVM. Il existe principalement deux types de dump. Le heap dump qui donne le contenu de la mémoire et le thread dump qui liste les thread en vie, leur état et leur stack d'appel afin de savoir ce qu'elles sont en train de faire au moment du dump.

HeapDump


     Il est possible de générer un heapdump à la demande mais également de le générer systématiquement sur un OutOfMemory. Il faut bien avoir conscience que la taille du fichier dump sera au moins égale à la taille du heap.

Jvm args pour avoir un heap dump sur les OOM :
  • -XX:+HeapDumpOnOutOfMemoryError  
  • -XX:HeapDumpPath=<path to dump file>
HeapDump à la demande (fonction des jdk et versions) :
  • depuis Java 6, via l'appel d'un MBean : com.sun.management:type=HotSpotDiagnostic, l'operation dumpHeap (parametre sont outputfile et onlyLiveObject, voir javadoc)
  • via l'outil ligne de commande jmap : jmap -dump:file=D:\mon\filepath\dump.bin javaProcessPid

     Pour récupérer le pid d'un process java, le command line tool jps les liste, sous windows on peut également les retrouver via le task manager et sous linux "ps -eaf | grep java" permet généralement de s'en sortir.

     Si l'on veut faire une génération en programmatique il est facile d'effectuer le code suivant :

            //get my process pid
            String name = ManagementFactory.getRuntimeMXBean().getName();
            String pid = name.substring(0, name.indexOf("@"));
           
            //prepare launch
            String[] cmd = { "jmap", "-dump:file=D:\\dump.bin", pid };
            try {
                //exec jmap process
                Process p = Runtime.getRuntime().exec(cmd);
            } catch (IOException e) {
                System.out.println("InterruptedException " + e);
            }


     Une fois le dump généré, il y a la deuxième partie, sa lecture. Pour ce faire (en dehors des outils du marché, on ne les a pas toujours à disposition) :
  • MAT : Memory Analyzer d'Eclipse (http://www.eclipse.org/mat/)
  • jhat en command line tool fourni avec le jdk. "jhat dump.bin", il ouvre un petit serveur http présentant les résultat, accessible via http://localhost:7000/

     Ce dernier donne un résultat peu enrichie mais il facilement accessible étant dans le jdk. A noter aussi que jhat peut faire une comparaison basé sur un baseline dump et ainsi marquer les nouveaux objets (http://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html).

     Jmap (http://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html) présente également quelques options intéressantes qui sans aller jusqu'au dump complet fournissent des informations utiles (toujours en command line tool donc facilement accessible) :
  • "jmap -histo:live javaPid" : sort l'histogramme du heap (liste des classes et nombre d'instances)
  • "jmap -permstat javaPid" : donne les indication concernant le permgen space
  • "jmap -heap javaPid" : permet d'avoir la composition du heap

     A savoir pour -histo et -dump, jmap dispose d'un mode forcé (-F) qui même lorsque la jvm ne répond permet d'avoir une sortie d'information. Il m'ai déjà arriver avant que ma jvm ne tombe de ne plus pouvoir accéder via JConsole, ... et de quand même pouvoir sortir un minimum d'information grâce à ce mode Force.

ThreadDump


     La encore un thread dump peut être généré runtime de différentes manière :

     L'analyse des stacks, lock et monitor permet de comprendre ce que l'application était en train de faire au moment de la génération du dump. Pour comprendre la composition d'un threaddump voir l'article

     Un outil intéressant pour faciliter l'analyse des threaddump mjprof. Il s'utilise conjointement avec jstack et permet de filtrer, trier, manipuler les stacks.

Observation Runtime


     Tout les éléments précédemment abordés permettent de collecter des données figées (logs, dump, ....) mais il est aussi intéressant de suivre en temps réel l'évolution. Ce peut être fait en rapprochant les photos (dump) et comparant leurs valeurs. Mais il existe d'autres alternatives.

     Entre deux modes, un outil jstat (http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html) qui permet de produire quelques métriques avec un affichage continu rafraîchi sur une périodicité donnée.

     Sinon pour suivre en temps réel ce qui se passe deux outils très bien, fourni de base avec le jdk :

     A noter également, qui se rapproche plus des Yourkit et JProfiler, Java Mission Control disponible à partir des jdk7u40. A tester et voir ce que cela va donner avec le temps (http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html)






En résumé


     Sans outillage complexe, pour avoir de l'information sur une JVM qui tourne :
  • Bilan des flags (jvm args) activés, positionnés, les settings de heap initiales, la GCPolicy en place
  • Des logs à activer (GC, classloading, JIT)
  • Dans le suivi runtime, deux aspects importants : la mémoire et les threads (consommation CPU)
  • On peut les dumper ou interroger la jvm pour avoir des informations (command line tools sont nombreux et documentés) ou encore les suivre via des consoles (JConsole, VisualVM)
  • Un mode force (-F) pour jstack et jmap, pratique quand une jvm ne répond plus

Quelques Références


Une présentation concernant les outils ligne de commande "Tout ce que vous avez toujours voulu savoir de la JVM sans jamais oser lui demander en ligne de commande" de Brice Leporini

Documentation OpenJDK

Tuto Oracle sur les command line tools : http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/JavaJCMD/index.html

Pour compléter un point que je n'ai pas abordé, la JVM ouvre des points d'API permettant de l'interroger directement (souvent utiliser par les outils de monitoring)

Et après avoir investigué, observé ...


     Fort de toutes ces métriques récoltées il est maintenant possible de passer à l'optimisation (et regarder leur impact) mais cela fera l'objet d'un autre billet.

     La première "optimisation" si ce n'est pas fait est de bien sizer ses variables initiales :
  • Taille du heap au démarrage et taille maximale : -Xms, -Xmx (il existe un débat concernant ce point, moi j'aime bien fixer à la même valeur pour éviter de resizer en cours d'utilisation)
  • Taille max du permgen space : -XX:MaxPermSize qui vient en addition du Xmx et dont la valeur par défaut est 64 Mb

     Un "jmap -heap" permettra de faire un bilan concernant les valeurs actuelles et la garbage policy utilisée.

     Aller pour finir une dernière url concernant les optimisations : http://fr.slideshare.net/leonjchen/java-optimization-twjug

lundi 21 juillet 2014

Survol de la fonderie à application : Forge2 de JBoss

Pourquoi Forge2


     Pour la petite histoire je ne suis pas un grand fan du code généré. Les théories et outils autour des DSL (Domain Specific Language), DDD (Domain Driven Design) bien qu'intéressant ont peu croisés ma route de manière directe lors de mes projets. Par contre j'ai bien croisé quelques outils UML liés à du code généré mais je m'en suis très rapidement écarté (trop lourd à faire tourner, peu maintenable, difficulté à faire évoluer sur des problématiques orthogonales).

J'en garde tout de même deux en tête  :
     Donc sans grande conviction j'ai assisté à une présentation du produit Forge2 de JBoss. Au final après la présentation, je suis passé de "sans conviction" à "A tester, pourrait bien répondre à quelques use cases".

Pourquoi à tester ? 


  • Forge2 reste un outil et ne se veut pas la solution à tous les problèmes : il génère du code et des structures projets
  • Forge2 est ouvert et extensible par addOn. Il peut donc ainsi bénéficier des apports d'une communauté de développeurs et c'est bien souvent éléments clé.
  • Forge2 est scriptable (fichier .fsh) et il ouvre une API permettant d'interagir avec le moteur via du code Java.
  • Forge2 reste basé sur les standards JEE, Maven (pas de configuration propriétaire, pas de systèmes runtime en surcouche, ...)

Pour quelles utilisations


     Java est au delà un langage orienté objet un langage orienté Framework, comme le notait Neal Ford dans son article :
"in the Java world that I've started saying that we should stop referring to Java programming as an object-oriented language and should call it a framework-oriented language".

     L'écosystème Java foisonne de Frameworks pour divers besoins, dont certains finissent par être intégrés dans les specs (JSR) et deviennent des standards. Bien que rendant l'écosystème très riche (voir le nombre de frameworks forkés dans d'autre langages) il reste que le ticket d'entré pour se ballader au sein de cette galaxie d'API, normes, ... est parfois un peu chère.

     Un exemple concret de cette difficulté : commencer un projet Web from scratch avec du JPA, du REST, ... peut s'avérer compliqué si l'on ne maîtrise pas bien toutes ces spécifications (où si l'on ne s'est pas mis à jour récemment).

     Ainsi un use case que l'on rencontre régulièrement : initialiser un projet

Quelques manières de faire :
  • Tâtonner en jonglant avec plusieurs tutoriaux (pas toujours à jour). Ceci peut être long.
  • Reprendre une ossature de projet faisant sensiblement la même choses pour avoir les charnières qui vont bien. On trouve pas toujours le pattern idéal.
  • Utiliser les wizards à disposition. Pas toujours la solution la plus heureuse en raison de l'interprétation/implémentation du context assez spécifique au wizard.
  • Enfin une de mes préférées : utiliser un maven archetype (http://maven.apache.org/guides/introduction/introduction-to-archetypes.html)
Forge2 peut être vue comme une alternative aux solutions précédemment citées.

     Rapidement d'autre use cases pouvant être rempli en utilisant Forge2 :
  • Réalisation d'un poc
  • Toute application CRUD simple
  • Reprise d'une base de données existante pour voir ce qu'elle a dans le ventre
  • Définir des templates de projet via les scripts fsh permettant d'encore accélérer le démarrage d'un projet et d'avoir des structures un peu normées.

Premiers pas avec Forge2


Récupérer un Eclipse Luna (4.4)
https://www.eclipse.org/downloads/

Récupérer un jdk8 (8u5 last release)
http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=otnjp

Installer les plugin Eclipse (update site) qui vont bien
JBoss Tools Usage Reporting plugin : http://download.jboss.org/jbosstools/updates/development/luna/
La dernière version de Forge2 (pour aller avec Luna et jdk8) : http://download.jboss.org/jbosstools/builds/staging/jbosstools-forge_master/all/repo/

Si l'on ne souhaite pas rester dans Eclipse, on peut aussi récupérer le Zip Forge2 et l'utiliser en dehors de tout EDI.

Premier projet avec Forge2 et Eclipse


  • Ouvrir la view console Forge (disponible grâce au plugin)
  •  Start de la console
  • A partir de là on peut utiliser les lignes de commande (TAB pour avoir les commandes disponibles et arguments nécessaires). 
  • Un premier projet commencera par exemple par "[LunaWorkspace]$ project-new --named ForgeDemo --topLevelPackage org.test.forge.demo --type war"

Quelques liens de référence


La présentation à laquelle j'ai assisté (présenté par Antonio Goncalves)
"30 minutes pour développer une appli Java EE ?"
http://www.parleys.com/play/535e1643e4b03397a8eee8ce/chapter0/about

Le site Forge : http://forge.jboss.org/
Le gitHub : https://github.com/forge

posts et tutos sur le sujet

Les sujets pour aller plus loin



Ma conclusion


     Assez intéressé pour avancer sur le sujet au travers les use cases décrit plus haut si ils se présentent mais quand même un peu de pratique nécessaire pour bien connaitre les lignes de commandes et les possibilités de l'outil.

     Encore un petit manque de documentation sur le web et pas toujours facile de voir si le tuto concerne Forge ou Forge2. J'ai essayé d'approfondir sur Furnace, mais je pense qu'il va falloir mettre les mains dans le code pour bien comprendre le container, les API et le fonctionnement des addOn.

     Pas pour toute les utilisations, je ne me vois pas définir tous mes attributs un à un avec l'outil pour tout le code de mon projet (en même temps c'est là que le scripting intervient).

     Pas l'impression que je puisse adresser du refactoring ou prendre facilement la main sur un projet existant, l'expérience me le dira.

dimanche 29 juin 2014

Pour les développeurs en dehors des sentiers battus

     Au delà des outils, frameworks and so on maintenant devenu des standards (voir le mind map faisant suite à un récent sondage de JRebel), l'article suivant de RebelLabs propose quelques alternatives ou compléments :

http://zeroturnaround.com/rebellabs/beyond-the-commit-6-developer-tools-technologies-you-should-know/

Repository pour vos sources


Bitbucket plutôt que GitHub pour la possibilité d'avoir des repo privés dans l'offre sans paiement
https://bitbucket.org/

Intégration Continu As Service


Des services de build plutôt qu'un serveur (tel Hudson ou Jenkins) afin d'éviter le temps de configuration, maintenance, ...

Travis CI pour les utilisateurs de GitHUb
https://travis-ci.org/

Lorsque l'on est utilisateur de BitBucket ou GitHub
Shippable (basé sur Docker) : https://www.shippable.com/
Drone.io : https://drone.io/

Vos binaires publiés/versionnés sans Maven


Enfin pour la publication des binaires, gestion version, ... pour ceux n'étant pas sous un repo Maven officiel
Bintray : https://bintray.com/

Choisir sa solution pour son blog technique

     A l'époque, avant de retenir Blogspot (maintenant Blogger), j'avais recherché un peu de littérature sur le sujet sans grand succès en dehors des classiques top10 et compagnie effectuant des comparatifs (utile tout de même). La faute au moteur de recherche ou vraiment peu d'articles ... je ne sais pas.

     Cette semaine je tombe coup sur coup sur deux posts avec un peu plus de fond, l'occasion de creuser de nouveau le sujet.

Les choix possibles


Sans lister toutes possibilités, les principales me semblent être :
  • Aller sur une plateforme proposant la solution et l'hébergement (exemple Blogger de Google)
  • Composer sa solution en prenant un CMS (Content Management System) et la déployer sur un serveur
  • Trouver un hébergeur de CMS du type choisi
  • Profiter d'un service d'édition de contenu autour d'un service que l'on utilise déjà (par exemple SourceForge, Google Developper, ...)
  • Tout développer (et oui cela reste une possibilité)

     Comme vous le constatez j'ai opté pour Blogger après avoir fait le tour de quelques blogs. Le temps passé à mettre la solution en place étant très faible, cela m'a permis de rapidement commencer à écrire.

Quelques unes de ces solutions


Les classiques :

WordPress
https://fr.wordpress.com/
http://fr.wikipedia.org/wiki/Wordpress
Drupal
https://www.drupal.org/
http://fr.wikipedia.org/wiki/Drupal
Blogger
http://fr.wikipedia.org/wiki/Blogger

Un peu moins connu Ghost :
https://ghost.org/about/
http://en.wikipedia.org/wiki/Ghost_%28blogging_platform%29

A creuser : GitHub pages
https://pages.github.com/

Un feed back de migration avec jekyll, GitHub page et pool :
http://joshualande.com/jekyll-github-pages-poole/
http://jekyllrb.com/
https://github.com/poole/poole

Les articles en question


Évoqué en introduction, ci dessous les articles en question

Le premier est de Bruce Eckel, auteur de "Thinking in Java" et blogger :
http://www.artima.com/weblogs/viewpost.jsp?thread=361740

Le deuxième porte plus sur le contenu des articles techniques
http://emptysqua.re/blog/write-an-excellent-programming-blog/

Un autre cas intéressant, un billet sur la migration de Trisha (développeuse, conférencière, membre du London Java Community)
http://mechanitis.blogspot.fr/2014/03/moving-from-blogger-to-hugo.html
http://trishagee.github.io/project/atom-to-hugo/
http://hugo.spf13.com/

Bonus


Un article sur les acronymes utilisés par les développeurs
http://javarevisited.blogspot.fr/2014/06/20-fancy-acronyms-programmers-should.html

jeudi 26 juin 2014

lundi 16 juin 2014

R&D java et jvm : Graal, Maxine, Truffle

     Derrière ces noms étranges que l'on rencontre peu, avancent des projets de recherche dans les couches basses du langage Java et ses jvm. Pour celles et ceux qui veulent se faire plaisir les sources et outils sont accessible via les sites des projets.

Les projets


Graal & Truffle

"Graal is an extensible, dynamic compiler using Java"
"Truffle a language abstract syntax tree interpreter" (allow to implements languages on top of graal)


Maxine VM

"Java Virtual Machines written entirely in Java in a meta-circular style"


Quelques présentations sur le sujet


"Graal - A Bytecode Agnostic Compiler for the JVM"
http://medianetwork.oracle.com/video/player/1113230360001

"Graal: A quest for the JVM to leverage its own J"
http://wiki.jvmlangsummit.com/images/c/c4/Simon_Graal_Presentation.pdf

"Maxine: A JVM Written in Java", slide 45 donne un aperçu intéressant
http://www.jugsaxony.org/wp-content/uploads/2012/05/Maxine-A_JVM_in_Java.pdf

"Graal and Truffle : one VM to rule them all"
http://fr.slideshare.net/ThomasWuerthinger/graal-truffle-ethdec2013
https://www.cs.purdue.edu/homes/gkrichar/papers/onward2013-wuerthinger-truffle.pdf

"Maxine: A Virtual Machine For, and In, Java" (Jun 15, 2012)
https://wikis.oracle.com/download/attachments/41846038/ECOOPSummerSchool2012.pdf?version=1&modificationDate=1340845232000

Status sur Graal (juillet 2013) et travail sur le GPU d'AMD
http://www.oracle.com/technetwork/java/jvmls2913wuerth-2013918.pdf

Quelques ressources (slide et vidéo) sur Graal et d'autre sujet R&D : les ressources du JVM Language Summit 2013
http://www.oracle.com/technetwork/java/javase/community/jvmls2013-2013900.html

dimanche 15 juin 2014

Docker en urls

A l'occasion de la sortie 1.0 de Docker (Prod ready), une série d'articles et liens sur le sujet

Docker, les urls officielles



La sortie de la 1.0



Around Docker



Technical docker




Mais en fait docker c'est quoi



Docker et quelques applications



samedi 3 mai 2014

Open Data et Big Data


     Deux concepts d'actualité, il est rare de trouver un domaine métier où l'on en parle pas. La recherche, le médical, l'économie, la finance, les transports, la téléphonie, bien sûr informatique et bien d'autres encore.

     Pour certains ce sont des arguments marketing utilisés pour vendre des applications et du service, comme cela a été fait à une époque avec un autre buzz word cloud.

     Pour d'autres passionés de veille technos ce sont des concepts à définir, suivre et  expliquer avec plus ou moins de succès. Les trois V du BigData  (Volume, Vitesse et Variété) ou encore dans cet article du Guardian.

     Pour d'autres encore, au coeur du sujet, c'est leur travail d'évoluer dans ce champs technologique. Parce que leur métier bénéficie de ces changements ou par ce qu'ils créent des services, des briques technologiques liés à ces concepts.

     Quelques uns conduisent le changement, partagent leur vision du futur et agissent pour que ces virages technologiques amènent plus de positif que de négatif (l'outil est neutre, c'est l'utilisation que l'on en fait qui a des effets de bords dans un sens ou dans l'autre et ceci fonction de l'appreciation de tout un chacun ... bref c'est un autre débat). La plus part d'entre nous vivont les retombés de ces changements dans notre quotidien sans forcément s'en apercevoir.

     Dans les deux cas ce sont des concepts rendus possibles par les avancées technologiques. Dans les deux cas ce sont des petites révolutions qui auront un impact fort sur nos manières d'aborder le quotidien.

Big Data


BigData est plus de l'ordre de la technologie, une manière de traiter l'information devenu possible par
  • les evolutions technologiques (augmentation de la RAM des serveurs, baisse des couts des serveurs, ....). 
  • Des briques applicatives permettant de traiter
    • de manière intelligente des volumes de données plus important (Hadoop, Olap, ...)
    • et/ou d'une manière différente (courant NoSQL : Not Only SQL) 
  • Une évolution dans la manière de penser les applications, les systèmes d'information et leur design. Orientation flux de données plutôt que traitement par batch, on doit être capable de traiter chaque information au moment où elle arrive, visualiser son impact au sein d'un ensemble déjà existant.

Open Data


     Le concept d'Open data est lui est plus une considération rapport à la données qui devient le cœur des enjeux. Afin de la rendre accessible, elle doit être ouverte à tous et ce dans un format facilitant son acquisition et son traitement de manière informatique.

L'une des personnalités fer de lance sur cette thématique Tim Berners Lee :

     A l'open data je vois principalement deux raisons :

     Considération sur la notion de la propriété : ces données nous concernant, dont nous avons facilité l'acquisition (l'individu devenu sonde/capteur de son environnement) nous appartiennent tout autant que les sociétés qui les utilisent et en font commerce. Quand aux données de services publiques, elles doivent également être accessible par soucis de transparence.

     Considération économique, de part l'émulsion positive que cela peut générer. En effet, à travers l'ouverture de ces données, nombre de personnes, startup, sociétés peuvent tester, proposer des utilisations, créer de la valeur. Créant ainsi un formidable et gigantesque laboratoire R&D constitué de ces consommateurs de données ouvertes avec lesquels il est intéressant d'échanger, suivre leurs créations, leurs utilisations.

     Un exemple d'initiative pour illuster ce dernier point : Etalab (http://www.etalab.gouv.fr/) qui était présent à la conférence IT devoxx Paris :
     L'open data est une problématique que se posent aussi bien les entreprises que les états. Quelques états ont commencé à proposer des accès à ces données "ouvertes" :

     Monde interconnecté oblige, il existe une initiative internationale que la France a rejoint en avril dernier (64e pays à le faire) nommé Open Government Partnership :

dimanche 6 avril 2014

Quelques mots sur les MOOC (Massive OnLine Open Course)

A la source


Stephen Downes et Georges Siemens en 2008

Présentation 2008 : http://fr.slideshare.net/Downes/mooc-and-mookiesthe-connectivism-connective-knowledge-online-course-presentation
Présentation de 2009 : http://fr.slideshare.net/Downes/the-connectivism-and-connective-knowledge-course
Le site de Stephen Downes : http://www.downes.ca/mooc_posts.htm
La page wikipedia de George Siemens : http://fr.wikipedia.org/wiki/George_Siemens
La page wikipedia de Stephen Downes : http://fr.wikipedia.org/wiki/Stephen_Downes

De nos jours


Il y a principalement 3 plateformes qui regroupent les MOOC les plus suivis.

  • Coursera créé en avril 2012 par Daphne Koller et Andrew Ng 
  • Edx créé en mai 2012 par le MIT et Harvard
  • Plus minoritaire udacity créé en juin 2011.

En France


Une plateforme s'est mise en place : https://www.france-universite-numerique-mooc.fr/

Sinon les écoles francaises (Centrale, ENS, Polytechnique) ont commencées à intégrer des plateformes existantes (comme coursera, voir liste des institutions partenaires) en y dispensant leurs mooc.

Quelques articles sur le sujet :
http://www.nature.com/news/online-learning-campus-2-0-1.12590
http://www.nature.com/news/education-online-the-virtual-lab-1.13383
http://www.nature.com/nature/journal/v499/n7458/full/499275a.html

mercredi 19 mars 2014

Java 8 tout chaud sorti du four

     Je ne pouvais pas ne pas mettre un petit mot, ca y est Java 8 GA (General Availability) est sortie. Un certain nombre de développeurs se sont déjà fait la main (et on blogués) sur les milestone mais cette fois c'est la version officielle.

Le mot de Mark Reinhold : http://mreinhold.org/blog/jdk8-ga
Download depuis chez Oracle : http://www.oracle.com/technetwork/java/javase/downloads/index.html


Quelques réactions à la sortie :

Les outils suivent et supportent Java 8

     Et du coup des comparaisons qui peuvent être amusantes, les deux étant du bytecode quelles sont les différences entre scala et lambda Java 8.

     Alors pour le meilleur et pour le pire (je suis sûr qu'il existe des manières très tordues d'utiliser les lambda, default method, ...) avançons, essayons, testons, hackons et regardons ce que cela va donner.