Le ParisJUG organise chaque mois une réunion mensuelle, gratuite, qui permet à quelques 230 personnes de se retrouver. La soirée d’hier avait lieu dans les locaux de l’ESIEA. Le Paris JUG organisait pour la 2ème fois une soirée spéciale débutant. Plus exactement pour permettre à des personnes ayant peu ou pas présentées face à un public, de tenter l’aventure. Chaque orateur a 15 minutes pour présenter un sujet. Chacun était ensuite invité à voter en fin de soirée avec l’application MaVotation, de la société Innovation Box.
Sujet 1 : de la cryptographie dans le navigateur avec WebCrypto API, par Jean-Christophe Sirot
Jean-Christophe présente les possibilités de cryptographie dans le navigateur, et plus précisément Web Cryptography API. Supporté par les navigateurs les plus récents (comme il le montre sur le site CanIUse) cette API JS permet de faire des opérations basiques de crypto comme la signature, le hashing, le cryptage et décryptage. Cela permet la signature de documents, le stockage sécurisé dans le cloud, ou même la signature d’objets JSON échangés entre le navigateur et le serveur.
La présentation était péchue, avec une démo live-coding sympa. A l’issue de chaque présentation, Charles Sabourdin du ParisJUG remettait un diplôme souvenir à chaque participant.
Sujet 2 : Le Circuit Breaker Pattern, tolérances aux pannes par Mouhcine Moulou
Le Circuit Breaker s’apparente au disjoncteur différentiel de votre installation électrique. C’est un élément logiciel qui permet d’isoler une application d’un service externe qui ne marcherait plus, ou ne serait plus disponible. L’approche classique est de mettre en place des timeouts, afin de lever une exception si un service ou une base de données ne sont plus disponibles. Le Circuit Breaker Pattern permet de dissocier cette connexion directe, et de retourner immédiatement à l’application un message l’informant que le service n’est pas disponible. Ainsi votre appli ne mobilise pas du CPU ou de la mémoire inutilement en attendant une hypothétique réponse du serveur distant.
Mouhcine montre ensuite l’implémentation Java du Circuit Breaker Pattern dans le framework Akka.
Présentation intéressante sur le fond, qui permettait de découvrir en 15 mn un pattern de programmation particulièrement utile dans les architectures micro-services et les services Webs.
Sujet 3 : Faire tourner une JVM avec 4 To de mémoire : yes we can par Gaëlle Guimezanes
Gaëlle Guimezanes est ingénieur-développeur chez Quartet FS, et sa présentation va nous montrer comment et pourquoi nous pouvons faire tourner une application Java avec 4 To de mémoire.
Les cas d’usages sont essentiellement dans le cas où vous souhaitez recalculer très rapidement sur un ensemble de données qui peut attendre les 600 millions de lignes, comme elle l’expliquera en fin de présentation. Cette approche est utilisé pour le calcul de risques sur les produits dérivés et sur des pivots.
Il y a donc une forte contrainte de performance, que seul le mode in-memory permet de résoudre. La JVM est adapté car le modèle de programmation est simple. Cependant le Garbage Collector doit être contourné pour pouvoir stocker efficacement ces données. Pour cela, il faut écrire les données dans une zone non gérée par le GC, ce que l’on appelle la mémoire off-heap.
//Objet léger qui pointe vers la mémoire. ByteBuffer bb = ByteBuffer.allocateDirect(1024); bb.putInt(15); bb.putChar('a'); bb.rewind(); int myInt = bb.getInt(); char myChar = bb.getChar();
Elle explique que son équipe a tout d’abord refait une implémentation de la fonction allocateDirect afin d’optimiser l’allocation. En effet par défaut celle-ci est implémentée pour prendre en compte les différences d’architecture entre systeme little-endian et big-endian. Or cet overhead impacte les performances. En visant uniquement Linux, leur implémentation évite donc ce surcoût.
Il est ensuite possible de manipuler directement la mémoire en Java. Ces fonctions sont regroupées dans la classe sun.misc.Unsafe.
Après avoir expliqué l’approche classique dans les architectures multi-processeurs symétriques (SMP), elle présente un projet basé sur une architecture NUMA (Non Uniform Memory Access). Chaque processeur a sa mémoire, et l’adressage est cependant possible de l’ensemble des CPU. Mais pour tirer partie au mieux des performances, il devient alors nécessaire de co-localiser les données par zone mémoire. C’est ce que fait Active Pivot. Ainsi l’accès à une dimension et à une métrique s’effectue sur un CPU.
Un Bullion de la société Bull avec 4 méga-noeuds de 4 coeurs NUMA a permis de monter 3.6To de données avec leur système. Un full GC ne prend que 3 secondes, alors qu’il aurait pris plus de 10h avec une architecture classique. Leurs tests ont montré que le système pouvait gérer 600 millions de lignes, avec 50 metriques par lignes. Les temps de réponses sont inférieurs à la centaine de millisecondes.
En conclusion cette présentation originale montrait une approche Java, à un problème qui de prime abord, semblerait plus simple à résoudre en C. Mais le modèle de programmation de la JVM est plus puissant et permet au final de construire ce type d’application. On peut s’interroger sur l’utilisation de méthodes qui clairement, ne sont pas prévues pour être pérennes sur la JVM, ou d’autres alternatives comme Redis, qui est un serveur in-memory en C…
Sujet 4 : Booster vos développements avec Spring Boot par Julien Sadaoui
Sprint Boot est un sujet très populaire.C’est d’ailleurs l’un des thèmes les plus récurrents sur les propositions de sujets 2015 pour Devoxx France. La présentation porte sur ce framework, qui vient avec une approche que l’on aime, ou pas.
Historiquement, si Spring a fortement poussé l’injection de dépendances, il est aussi connu que cela peut entraîner une sur-abondance de fichiers XML. Que ce soit au niveau du build Maven, où parfois les versions ne sont pas cohérentes, jusqu’à la mise en place de briques, dans un fichier XML… qui n’est pas destiné à être compilé. Personnellement, je trouve dommage de retarder la vérification du câblage d’une application au moment du démarrage, voire de l’exécution.
Spring Boot est donc une brique logicielle qui vise entre autre, les débutants, pour les aider à démarrer et à écrire rapidement une application avec quelques annotations. C’est de l’AOP (Annotation oriented programming) très puissante, avec le choix d’utiliser la javadoc pour construire tout ou partie d’une application. Mais c’est aussi un ensemble de classes pour bootstraper rapidement une application Web par exemple. Et là, oui, on voit immédiatement le gain, en terme de bonnes pratiques, de code et de rapidité de démarrage.
Sujet 5 : Votre consommation électrique en temps réel, avec ActiveMQ, MongoDB et Docker par Cédric Finance
Cédric Finance, de Soat, présente un montage et une application de suivi de sa consommation électrique, que vous pouvez faire pour 70 euros. Tout est légal car il est autorisé de se connecter sur le bornier d’un compteur électronique EDF, afin de pouvoir récupérer vos données.
Sa présentation est vraiment sympa, avec une analogie à la série The Big Bang Theory. Mais pourquoi fait-il cela ? Parce que c’est fun. Pas forcément besoin de comprendre, mais c’est assez sympa.
Il présente sa démarche, de l’achat du matériel, jusqu’à l’implémentation d’une solution dans le Cloud, afin de pouvoir suivre sa conso. Dans cette aventure, il s’est rendu compte que son chauffe-eau électrique fonctionnait n’importe quand, au lieu d’attendre les heures creuses. Il l’a visualisé en voyant des pics de consommation électrique pendant la journée.
Sa démarche, à partir d’un Rasperry PI est inspirée du travail de Laurent Huet, qui est passé comme speaker plusieurs fois à Devoxx France et BDX.IO. Il a ensuite fait sa propre couche logiciel, afin de pouvoir suivre et afficher les courbes de conso de son installation. Sa solution est basée sur ActiveMQ, MongoDB, un connecteur ActiveMQ maison, le tout packagé dans des images Docker. Vous pouvez retrouver les liens en photos plus bas.
1. Se connecter au compteur électrique.
2. on reçoit des données
3. stocker et visualiser les données sur le site ThingSpeak
4. Analyser les données
J’ai beaucoup aimé cette présentation, c’était l’une de mes préférées, sur le fond comme sur la forme. On apprend pas mal de choses, on rigole et les 15 minutes passent vites. Dans les idées d’évolution, il cite le composant Photon de Spark, qui est un micro-contrôleur moins cher que le Rasperry PI.
Sujet 6 : Le pourquoi du comment du type Optional par Fabrice Sznajderman
Fabrice présente de façon très didactique le type Optional, introduit dans Java 8. Il permet de caractériser l’absence ou la présence de valeur, et ouvre la porte vers la programmation fonctionnelle. J’avais déjà écrit un article sur ce sujet, avec un exemple complet, et je vous invite à le lire si vous souhaitez en savoir plus sur Optional.
La présentation était animée par du live-coding, sans cependant exécuter le code. Et j’ai trouvé que cela marchait bien. Le premier réflexe aurait été d’écrire du code, de l’exécuter pour montrer le résultat, et de faire 15 mn dans ce mode. Le souci c’est que cela à mon avis aurait rendu la présentation trop compliquée. Fabrice a fait le choix d’écrire du code, de s’appuyer sur la complétion de l’IDE pour expliquer les idées. Et ça marchait plutôt bien.
Optional en Java 8 vise à revoir le pattern if-null, mais va plus loin. Ce n’est que la porte d’entrée, qui ouvre ensuite la voie à une autre façon de combiner et de coder. Le souci de Java8, en comparant avec Guava ou Scala, c’est que cette API ne va pas assez loin.
Petit Quizz : que fait ce code à votre avis ?
// Java Conference confRef = null ; Optional<Conference> c = Optional.of(confRef);
Et bien mes amis, cela lève une java.lang.NullPointerException… Et pas un Optional.empty.
Il faut utiliser Optional.ofNullable(…) afin d’avoir le comportement attendu… Si c’est pas contre-intuitif ça…
Sur la présentation, c’était bien et le sujet est assez pointu. Pas d’erreurs et très peu d’approximation, vraiment Fabrice avait bien préparé sa présentation.
Conclusion
Soirée sympa au Paris JUG. Au final, c’est Cédric Finance qui remporte le vote du public, et qui donc viendra présenter son Quickie à Devoxx France 2015. Toutes les présentations méritent de passer en Quickie, car les orateurs s’étaient bien préparés, avec l’aide de Guillaume Duquesnay.
Rendez-vous en février pour une soirée Cassandra.
Hello,
3) Pour Quartet FS n’y a-t-il pas eu de feedback sur Azul Zing? Ils sont partenaires pourtant d’apres le site d’Azul et c’est dans le sujet…
4) Je suis d’accord que c’est un peu dommage de vérifier le cablage IoC au runtime. J’ai ecrit un article pour expliquer le cake pattern de scala aux developpeurs Spring qui evoque le sujet, pour ceux qui seraient interessés: http://www.infoq.com/fr/articles/cake-pattern-scala-explique-developpeurs-spring
6) Je trouve que Java 8 apporte quand meme un petit plus par rapport a Guava qui n’offre pas d’implementation de flatMap, meme dans ses dernieres versions. C’est un pas de plus vers la programmation fonctionnelle.
Pour répondre à la question de Sebastien Lorber:
Azul Zing marche bien et permet de faire tourner des JVMs en pauseless jusqu’à 500 Go. Mais ça ne suffit pas pour nos plus gros projets qui demandent plusieurs téraoctets… d’où la présentation qui était tournée vers la solution off-heap.
Pour rebondir sur quelques points de l’article concernant ma présentation:
– Notre implémentation du off-heap ne vise pas que Linux : nous n’avons pas la problématique du little endian / big endian parce que tout reste sur la même machine et sera uniquement écrit et lu par notre programme. Si on conserve le même paradigme pour l’écriture et la lecture, on n’a pas à se préoccuper de celui choisi pour l’OS. C’est pour l’optimisation NUMA uniquement que nous visons Linux, le placement des processus sur un processeur donné n’étant pas disponible sous Windows.
– Certes l’usage d’Unsafe n’est pas réputé pérenne, mais nous avons pu nous en servir sur plusieurs version majeures de Java sans qu’il y ait eu de changement d’API, et lorsqu’Unsafe disparaîtra, les mêmes fonctionalités seront forcément disponibles d’une autre manière (ne serait-ce que parce que DirectByteBuffer, lui, fait partie de l’API « officielle » de Java). D’ailleurs nous avons une option de configuration nous permettant de switcher sur des DirectByteBuffer en cas de souci 🙂
– Redis, si je ne me trompe, est une base clef-valeur. Ce format n’est pas adapté pour l’analyse multidimensionnelle, qui constitue le métier de Quartet FS.
Redis n’est pas qu’une base clé-valeur. C’est un serveur de données structurées en mémoire avec des Lists, des Set, des SortedSet.
C’est le moteur utilisé pour le CFP de Devoxx France, pour le site d’inscription de Devoxx France entre autre.
Hello Nicolas,
Merci pour cet article 🙂
Fabrice