LRA Long Running Action

Principe général

Long Running Action (LRA) est un module de la stack Eclipse MicroProfile comme peuvent l’être « Health », « Fault Tolerance » ou « GraphQL ». Son objectif est de permettre la coordination des microservices concourant à implémenter une même activité métier. Sur le plan théorique ce pattern est référencé sous le nom de SAGA.

Bien sûr l’idée n’est pas de revenir au mode de fonctionnement centralisé et fortement couplé dont l’architecture microservices essaie de s’éloigner. Il n’est donc pas question d’opérer des transactions SQL distribuées comme on a pu le faire il y a quelques années, chaque microservice reste seul responsable de son système de stockage qui n’est pas partagé.

Le but ici est d’atteindre l’eventual consistency. Attention pour ceux qui ne maîtriseraient pas l’anglais, eventual est un faux amis, il ne s’agit pas de dire que le système sera éventuellement cohérent mais qu’il le sera forcément tôt ou tard.
Ce concept est familier aux utilisateurs des bases de données de nouvelle génération qui l’exploitent pour offrir une bonne montée en charge.

Examinons maintenant plus concrètement comment déployer cela au sein d’une architecture microservices.

Le coordinateur

L’implémentation de Long Running Actions requière la coopération d’un service additionnel à nos microservices métier. Son rôle sera d’orchestrer les transactions, c’est à dire d’informer nos services pour leur demander de compenser (défaire) leurs actions ou au contraire de les valider définitivement.

Ainsi la première étape consiste à lancer ce fameux coordinateur. Nous utiliserons ici l’implémentation issue du projet Narayana, packagée dans un microservice Quarkus:
docker run -d -p 8080:8080 quay.io/jbosstm/lra-coordinator

Pour vérifier qu’il tourne correctement:
curl -i localhost:8080/lra-coordinator
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
content-length: 2
Narayana-LRA-API-version: 1.1

[]

D’autres alternatives à Narayana existent et il est possible de les utiliser sans impact sur le reste de notre architecture car les interactions s’appuient sur un protocole HTTP REST normalisé.

Sur les microservices

Au niveau du code de nos microservices, les _endpoints_ participant à une transaction métier longue doivent être annotés @LRA, par exemple:

@LRA(value = LRA.Type.REQUIRED, end=false)
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Path("/book")
public Response bookFlight(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId, String destination) {
  if (destination.equals("Toulouse") || destination.equals("Paris")) {
    System.out.println("Succès");
    return Response.ok().build();
  }
  else {
    System.out.println("Echec");
    return Response.serverError().build();
  }
}

L’annotation @LRA présente des similitudes avec une autre annotation largement utilisée : @Transactional. En effet, elles partagent toutes deux des paramètres pour spécifier le périmètre de la transaction, qui se ressemblent beaucoup. Par défaut, l’attribut value est égal à « REQUIRED », ce qui indique que si une transaction est déjà en cours, la méthode sera exécutée dans son contexte. La propagation de l’id de la LRA se fait au travers de l’entête HTTP « Long-Running-Action ». C’est ainsi la présence de cette information dans la requête entrante qui détermine s’il faut créer une LRA ou pas. Dans la réponse HTTP nous retrouverons également cette entête. Elle devra être réutilisée par le client dans les requêtes successives. Pour fixer les idées la valeur de cette entête pourrait être par exemple :

http://localhost:8080/lra-coordinator/0_ffffc0c5100f_f355_6113bebe_22

L’id de la LRA prend la forme de son URL canonique. La création de la LRA se fait sur demande par l’appel de l’API REST du coordinateur depuis notre microservice.
Nous n’avons pas à coder cette interaction, cela se fait automatiquement par la librairie LRA.
Les appels aux microservices suivants, lorsque ceux-ci sont annotés avec @LRA et que l’entête est bien fournie, se voient donc inclus dans la même transaction tant que la propriété end=true n’est pas fixée. Quand ce sera le cas, la transaction LRA sera fermée après l’exécution de la méthode et le coordinateur appellera pour chaque microservice son point de terminaison d’API annoté @Complete.

@Complete
@Path("/complete")
@PUT
public Response completeFlight(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId, String userData) {
  String message = "Flight Booking completed with LRA with id: " + lraId;
  System.out.println(message);
  return Response.ok(ParticipantStatus.Completed.name()).build();
}

Si au contraire, une des méthodes des microservices annotées @LRA avait été en erreur, la LRA dans son ensemble aurait été annulée. Les méthodes callback invoquées auraient alors été celles annotées @Compensate.

@Compensate
@Path("/compensate")
@PUT
public Response compensateFlight(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId, String userData) {
  String message = "Flight Booking compensated with LRA with id: " + lraId;
  System.out.println(message);
  return Response.ok(ParticipantStatus.Compensated.name()).build();
}

Conclusion

Comme nous venons de le voir, le module LRA fournit un cadre d’implémentation du pattern SAGA.
Si des points communs avec les transactions JPA (Java Persistence API) peuvent être relevés, le fonctionnement des LRAs est cependant largement plus découplé et repose sur un système de compensation. C’est en effet à nous d’implémenter le rollback en fonction bien sûr de la technologie sous-jacente. Même principe pour la méthode @Complete c’est à nous qu’incombe de coder la logique de « commit« . Ce terme est à considérer avec des guillemets car même si le système de stockage du microservice est construit sur une base traditionnelle, sa transaction SQL locale sera déjà véritablement commitée (il est inenvisageable de conserver des verrous base de données sur plusieurs requêtes HTTP). La plupart du temps la tâche de la méthode @Complete se résume à nettoyer les ressources ou informations conservées dans l’optique de pouvoir compenser la LRA si finalement elle devait être annulée.

Ainsi l’essentiel du framework consiste à mettre en œuvre une série de notifications pour informer les microservices des résultats des opérations des uns des autres. Cette synchronisation se fait avec un décalage qui peut être plus ou moins long, certains microservices pouvant échouer à compenser, mais le coordinateur insistera et les notifiera à nouveau. L’objectif final n’étant pas de garantir une consistence instantanée des données mais juste de permettre d’y arriver à un moment donnée.

Pour plus de détails encore dans le protocole LRA, voici sa javadoc, bien sûr n’hésitez pas à expérimenter avec Quarkus par exemple:
https://download.eclipse.org/microprofile/microprofile-lra-2.0/apidocs/

Quarkus : le framework Cloud Native révolutionnaire

L’écosystème Java est en plein renouveau. Oracle a officiellement acté son désengagement de Java EE (renommé Jakarta EE), les spécifications et leur implémentation de référence se font désormais sous l’égide de la fondation Eclipse et non plus au JCP (Java Community Process). Si ce chamboulement a pu générer quelques craintes et appréhensions quant au futur de la plateforme, aujourd’hui les conditions de passation de témoin entre Oracle et Eclipse semblent dorénavant établies (voir ici pour plus de détails sur l’imbroglio au sujet de l’utilisation du nom de package javax).

Place donc à la technique et je dois dire, pour vivre les choses de l’intérieur (nous sommes membres du consortium Jakarta) que la dynamique Jakarta est bien réelle. Le tournant micro-service a été pris avec conviction (il était temps), l’axe Cloud Native est clairement une priorité pour le consortium.

Jakarta poursuit l’oeuvre de standardisation de Java EE et offre aux développeurs le choix de l’implémentation. Nous avons toujours la filière traditionnelle avec un modèle basé sur le serveur d’applications. Mais surtout nous avons désormais la déclinaison Microprofile du standard. L’application ne nécessite alors plus de serveur pour fonctionner mais est packagée sous la forme d’une application autonome taillée pour les containers Dockers et les clusters Kubernetes. L’approche prise par la spécification Microprofile est particulièrement intéressante : conserver tels quels les modules Jakarta EE (CDI, JAX-RS, JPA…) et y adjoindre de nouveaux composants dédiés aux nouvelles problématiques découlant des architectures microservices. Notamment sont couverts les sujets liés à la tolérance à la panne, l’authentification par token JWT, la documentation Open API, les métriques et les traces, le Health Check, la génération de clients REST, l’intégration aux services de messaging… Bien sûr pour chacun de ces thèmes, il y a d’un côté la spécification des API et de l’autres les implémentations.

Cela nous amène à Quarkus qui est la nouvelle proposition Microprofile de Red Hat. Je dis nouvelle parce qu’il y a déjà Thorntail qui est la déclinaison Microprofile du serveur d’application WildFly. Quarkus lui, est une réécriture pensée véritablement pour l’approche Cloud Native. En effet, l’objectif ultime de Quarkus est de permettre la compilation native des applications grâce à GraalVM et ainsi corriger les deux faiblesses historiques de Java que sont l’empreinte mémoire et le temps de démarrage. A une époque pas si lointaine où le modèle d’exécution était le gros serveur d’applications pas ou peu redondé qui devait être redémarré le moins souvent possible, ces deux lacunes posaient peu de problème. Aujourd’hui le paradigme a changé, les applications sont découpées en plusieurs unités d’exécution (microservices) qui sont démarrées, répliquées, déplacées sur un cluster Kubernetes de nombreuses fois par jour (potentiellement tout du moins). Il est ainsi crucial que nos processus soient faiblement gourmands en ressources et puissent être lancés juste en une fraction de seconde.

Quarkus est encore jeune, la compilation native échoue plus souvent qu’elle ne réussit, mais ce n’est pas bloquant, il suffit alors de se rabattre sur une exécution classique JVM qui reste bien plus performante que n’importe quel serveur d’applications ou que Thorntail. Quarkus nous montre le futur des applications Java d’entreprise orientées Cloud Native. Si vous êtes intéressés, n’hésitez pas à échanger avec nous ou à vous inscrire à une de nos sessions de formation.

 

Oculus Rift (Positional Tracker)

2015 est bien parti pour être l’année de la réalité virtuelle et augmentée. A l’image de Microsoft qui a dévoilé ses HoloLens la semaine dernière, de nombreux constructeurs travaillent sur le sujet.
Nous aussi, en tant que fournisseur de solutions digitales métier, nous regardons de très près ces dispositifs pour lesquels nous avons identifié plusieurs usages professionnels prometteurs.
L’objet de ce billet n’est pas de faire un retour sur nos activités de R&D concernant la réalité virtuelle et augmentée mais de décrire la résolution (une des résolutions) technique au problème de disponibilité de la caméra sur le casque Oculus Rift DK2, le périphérique de réalité virtuelle de Facebook.

Au vu du nombre de messages sur les forums traitant de ce problème, on peut en conclure qu’il est très fréquemment rencontré. De quoi s’agit-il exactement ? L’anomalie concerne la non reconnaissance de la webcam de l’Oculus Rift. Elle se matérialise dans l’outil de configuration par la mention « Waiting for camera » au lieu et place du numéro de série.

Le champ "Camera Serial" ne doit pas afficher "Waiting for camera"

Le champ « Camera Serial » ne doit pas afficher « Waiting for camera », ici il n’y pas de problème.

La webcam n’a pas un usage classique dans le sens où elle ne filme pas mais sert à tracer la position de l’utilisateur. Pour revenir au fameux bug, il se produit lorsque pour diverses raisons, comme par exemple suite à une mise à jour de l’Oculus Runtime, le driver utilisé par la webcam n’est pas celui fourni spécialement par Oculus mais un driver générique de Microsoft.

oculus_device_manager

Sous « Imaging devices » (« Périphérique d’acquisition d’images » en français), la webcam doit apparaître avec le libellé « Oculus Positional Tracker » et non « Camera DK2 »

La désinstallation et réinstallation du Runtime Oculus ne règle pas le problème, ce qu’il faut faire c’est supprimer les drivers pour les réinstaller dans la version correspondant au Runtime. Pour cela il faut se rendre dans l’utilitaire Windows et désinstaller expressément « Oculus Positional Tracker Driver ».

Il faut supprimer les anciens drivers.

Il faut supprimer les anciens drivers, avant de les réinstaller.

Là aussi, cela peut coincer. Nous avons constaté que si les drivers étaient bien supprimés du système ils continuaient à figurer dans le « Panneau de configuration » ce qui a le fâcheux inconvénient d’empêcher leur réinstallation. Il faut donc éditer la base de registre avec regedit et supprimer les enregistrement contenant « Positional Tracker Driver ». Une fois ceci fait, on peut procéder à l’installation.

Pour cela, il faut éditer le ficher « ovr_install.txt » se trouvant dans le répertoire d’installation du Runtime, par exemple :
C:\Program Files (x86)\Oculus\Logs/ovr_install.txt

Dans ce fichier la ligne suivante, indique l’emplacement du fichier MSI des drivers :
Unpacking C:\Users\Stagiaire\AppData\Local\Temp\Oculus Inc\OculusMSI_x64.msi
Il suffit alors de l’installer (sur un système 32bit, il faut exécuter OculusMSI_x86.msi).

Et voilà, un petit tour dans l’utilitaire de configuration Oculus devrait confirmer que la caméra est dorénavant correctement reconnue.

Quel éditeur JavaScript ?

JavaScript est devenu, qu’on le veuille ou non, un langage incontournable. Indispensable sur le poste client et plus précisément sur le navigateur, il prend sa place, peu à peu, sur le serveur avec notamment nodejs.

Bon nombre de développeurs sont donc amenés à écrire de plus en plus de JavaScript, pour cela il convient de s’équiper et de choisir un IDE adapté. Essayons de balayer les choix possibles.

Les IDE Java vétérans que sont Eclipse ou Netbeans supportent plus ou moins bien le JavaScript. On peut attribuer sur ce terrain un avantage à Netbeans qui s’en sort mieux que son rival de toujours. Dans la catégorie des environnements de développement généralistes, IntelliJ IDEA demeure un poids lourd. Il sait tout faire : du JEE, Android, Spring, Grails…et donc forcément aussi du JavaScript. JetBrains, l’éditeur, propose d’ailleurs une déclinaison de son logiciel phare, dénommé WebStorm, uniquement centré sur le JS, HTML et CSS. C’est un choix intéressant car moins onéreux qu’IDEA Ultimate Edition.

Au delà des outils historiques du développeur Java, d’autres éditeurs « pure player » ont fait leur apparition. Parmi ceux-ci Sublime Text tient le haut du pavé. Léger, performant, multiplateforme Sublime Text présente de nombreux avantages. Toutefois il pourrait dérouter les aficionados d’IDE traditionnels ; pour tirer la pleine puissance de Sublime il faut faire l’effort d’apprendre ses raccourcis clavier, de se plonger dans ses options de configuration et de parcourir la liste des plugins disponibles. Enfin, il faut savoir que si une version gratuite est disponible Sublime reste un logiciel propriétaire dont la licence coûte $70.

Pour ceux ne pouvant concevoir utiliser autre chose que des logiciels open source, je recommanderais d’essayer Brackets.

brackets

Il est proposé par Adobe et est développé lui même en JavaScript (il tourne sur WebKit). Assez jeune, il est néanmoins prometteur, il semble s’inspirer de Sublime avec sa barre latérale très ressemblante et son architecture modulaire visant à promouvoir un riche écosystème de plugins. L’édition de CSS avec une prévisualisation intégrée est particulièrement réussie. Une fonctionnalité intéressante de Brackets est son « Aperçu en direct » qui permet d’héberger les ressources du projet (fichiers JS, HTML, CSS…) sur un serveur embarqué (nodejs). Chaque modification est alors automatiquement prise en compte par le navigateur web sans devoir rafraîchir la page. En plus du gain de productivité que cela procure, servir les scripts JavaScript par HTTP évite les erreurs que l’on peut rencontrer en utilisant des URLs de type fichier.

Enfin, comment terminer notre petite liste d’outils sans parler des Chrome dev Tools. Connus de tous les développeurs web et disponible directement depuis le navigateur de Google, les dev Tools servent à examiner l’arbre DOM, le trafic réseau, positionner des points d’arrêt dans le code JavaScript…Bref, on ne présente plus ces fonctionnalités, essentielles à l’implémentation de clients HTML. Néanmoins depuis récemment Chrome s’est enrichi d’une nouvelle option le rapprochant encore un peu plus d’un éditeur de code. Effet depuis l’onglet « Sources », un simple clic droit permet de relier les ressources délivrer par le serveur à une arborescence locale de fichiers.

add-folder-to-workspace

select-folder

Une fois ce mapping établi, tout changement fait dans un source JavaScript ou CSS se persiste durablement par un rapide « Ctrl-s ». Plus besoin de copier/coller les modifications opérées dans Chrome pour les reporter dans le code.

Web 3D 2013

Cette année nous étions invités par Christophe Mouton, expert PLM chez EDF, à participer à la fameuse conférence web 3D. Après Las Vegas en 2012, l’édition 2013 se déroulait en Espagne à San Sebastian au Miramar Palace. Le cadre était donc vraiment très agréable, seul le temps, comme en témoigne la photo ci-dessous, n’était pas au beau fixe.

image

En plus de la rédaction d’un poster, j’ai pu présenter pendant près de 40mn un cas d’usage de notre solution DocDokuPLM. « Web 3D » oblige j’ai concentré mon discours sur la partie visualisation 3D de la maquette numérique. J’ai notamment expliqué les nombreuses optimisations que nous avons faites pour s’affranchir des limites intrinsèques des moteurs JavaScript des navigateurs.

Par exemple Chrome ne pouvant allouer plus de 1,4 Go de mémoire, nous devons enlever de la scène les objets non visibles dans le champ de la caméra. Nous avons également implémenté un système de type LOD (Level Of Detail) où chaque pièce d’un assemblage existe en différentes qualités de représentation, plus l’objet étant proche de la caméra meilleur sera son affichage.

Par ailleurs, j’ai moi même assisté à quelques belles sessions, notamment une sur le format XML3D concurrent du X3DOM qui par son héritage de X3D et VRML traine les lacunes inévitables de toutes technologies legacy. XML3D, conçu lui à partir de la feuille blanche, entend devenir le standard pour la 3D déclarative du web. Enfin, j’ai bien apprécié la démonstration de réalité augmentée s’appuyant sur WebRTC, domaine très prometteur que nous explorons déjà !

Solutions Linux 2013

Le salon Solutions Linux 2013 vient tout juste de s’achever, j’en profite donc pour faire un retour à chaud de cet évènement majeur de la communauté open source française.
Cette année, la superficie allouée au salon a quelque peu réduit et la manifestation ne s’étale plus que sur 2 jours au lieu des 3 jadis. Toutefois, c’est finalement un mal pour un bien car du coup les rencontres de qualité s’enchainent à un rythme soutenu.
PHP - Drupal

Si la dénomination est restée la même depuis les toutes premières éditions, le lien avec linux n’est pas exclusif. Aujourd’hui les exposants présentent majoritairement, comme nous, des solutions métier. Cela va de la business intelligence à l’ERP en passant par les CMS et bien sûr le PLM !

A côté des stands des entreprises, comme d’habitude, se trouvait le village associatif. Ce genre de salon est l’occasion d’entrer en contact avec de futurs prospects, de rencontrer des clients (j’ai longuement conversé avec un responsable de l’afpa), des partenaires et confrères ; j’ai notamment discuté avec Gaël d’Obeo et l’équipe de BlueMind.

Côté échange, j’ai eu le plaisir de participer à la série de présentations d’OW2 et à une interview Plateau TV orchestrée par Philippe Scoffoni. En parlant d’OW2 d’ailleurs, la traditionnelle Wine & Cheese Party est toujours aussi réussie, félicitation à Catherine pour son organisation.

Enfin, comment ne pas finir ma rétrospective avec un moment assez cocasse où un concurrent que j’avais démasqué (éditeur propriétaire faisant plus de cent millions d’euros de chiffre d’affaire) est venu s’enquérir de notre logiciel, indubitablement impressionné par les performances et la richesse fonctionnelle. L’open source est un concept étrange pour la plupart des éditeurs PLM qui sont extrêmement fermés et verrouillent au maximum, au détriment de l’intérêt de leurs clients, les données de leurs logiciels.

Nous, au contraire, nous travaillons dans la transparence, notre seule obsession est la qualité de nos logiciels sans aucune stratégie de lock-in. Tout le monde a accès au code source, y compris ce concurrent, et peut l’utiliser librement en respectant le copyright et la licence AGPL.

 

Charte pour l’emploi

Charte libre emploi job and floss

Nous sommes signataires de la charte pour l’emploi. Cette initiative vise à promouvoir l’apprentissage et favoriser la diffusion des connaissances du logiciel libre.

C’est une belle démarche, qui plus est contribue à fortifier le dynamisme de la France en la matière. N’hésitez donc pas à rejoindre le mouvement.

 

Les micro services peuvent-ils remplacer les serveurs d’applications ?

Un concept en fin de vie ?

Durant ces dix dernières années, particulièrement dans l’écosystème Java, le serveur d’applications fut le roi. Tout bout de code « server side » finissait fatalement déployé sur cet élément hautement important du système d’information. Comme nous l’enseignons nous-mêmes en formation son rôle est de fournir les services techniques aux applications (connexions aux bases de données, gestion du cycle de vie des composants, module d’authentification, supervision des transactions…) déchargeant ainsi les développeurs de l’implémentation de cette tuyauterie ; tâche critique et souvent difficile.

Cette séparation des responsabilités est au cœur de la philosophie Java EE, la spécification de la plateforme distingue en permanence les activités incombant aux développeurs d’applications de celles prises en charge par les administrateurs gérant l’infrastructure ou encore justement les fonctionnalités devant être assurées par le serveur d’applications.

Si on peut comprendre cette logique, pensée pour les environnements complexes des grandes organisations où le SI est géré de manière centralisée, cette approche souffre néanmoins d’une rigidité et d’une lourdeur certaine, chaque application nécessite avant d’être déployée que l’on paramètre son environnement technique sur son conteneur.

Les micro services

Les micro services s’inscrivent dans une démarche opposée : la notion de serveur d’applications (conteneur) gouvernant l’exécution des composants d’application déployés en son sein n’existe plus. Chaque micro service est une application « standalone » tournant dans son propre processus. Ces applications communiquent entre elles au travers de web services de type REST sans l’intermédiation d’un middleware devenu encombrant, à la manière des commandes Unix qui s’agrègent avec un simple pipe. Leur périmètre est généralement réduit, elles font une chose et s’attachent à bien le faire, ainsi on pourra les réécrire si nécessaire complètement en limitant les coûts.

REST a montré qu’il était néfaste de chercher à s’abstraire coûte que coûte du protocole HTTP, les micro services nous enseignent qu’il n’est sans doute pas optimal de chercher à effacer le système d’exploitation comme les serveurs d’applications Java se sont évertués à le faire, en voulant recréer un OS dans l’OS.

Les frameworks

Qui dit nouveaux paradigmes dit nouveaux frameworks. Toujours dans l’univers Java, il y a bien sûr le presque déjà vieux Playframework qui adopte une stratégie résolument de rupture en proposant une pile logicielle avant-gardiste et encourageant fortement l’usage du langage Scala, même si Java est également supporté. Un autre framework, bien que moins audacieux, mérite tout autant que l’on s’y intéresse, il s’agit de Dropwizard. Ce framework possède l’avantage de capitaliser sur des technologies matures, bien connues des développeurs Java EE comme Jersey, Jackson, Jetty ou encore Hibernate validator. La courbe d’apprentissage sera donc douce.

Allez bonne année et RDV en 2013 pour mettre tout ceci en pratique !

DocDokuPLM winner of the Open World Forum Demo Cup 2012

That’s with a great pleasure that we received an Innovation Award for the demo cup at the Open World Forum which took place the 11, 12 and 13th october 2012.

The demo cup consisted of presenting our open source software in a time boxed format of 7 minutes! That was a very funny and challenging exercise, especially with a jury composed of experts and an audience hard to impress.

So, I made a live demo of DocDokuPLM.

DocDokuPLM - Digital MockUp inside your browser

I started with the classical login screen, then quickly went through the document management module. I didn’t take much time on this part of the software as document management is becoming a commodity nowadays. However I explained that our DM is not as classical as it seems in the sense that it follows the PLM industry terminologies and definitions, especially those defined in the « OMG PLM services » and the STEP standards.

After that, I came to what was the heart of my presentation: the DMU (Digital Mock-Up) inside the browser without any plugin. I demonstrated how we can rotate, zoom in or out and move the product model. I showed how to hide/display specific assembly parts just by clicking on checkboxes.

Then I played with the layers and markers functions of our tool that allow to pin notes directly on the model.

At last, I finished my demo with an impressive mashup feature that permits to publish the whole model in any blog, wiki, forum exactly like what we can do with youtube or dailymotion videos.

Finally we were the first team to be called on stage to receive our prize quickly followed by Blue Mind that proposes a messaging and calendar solution and by Hippo with their HippoCMS which is a context sensitive CMS system.

DocDokuPLM - OWF2012 democup winner

 

Gestion des réserves

Dans le secteur de la construction, la gestion des réserves, c’est à dire le recensement des malfaçons aux différentes étapes des travaux, est une activité essentielle qui peut s’avérer compliquée en raison du volume d’anomalies qui peut dépasser la dizaine de milliers sur certains gros chantiers.

Aujourd’hui grace aux tablettes tactiles il est possible d’outiller cette tâche et dégager ainsi d’importants gains de productivité. C’est ce que nous avons fait en développant pour notre client Wapp6, éditeur spécialisé dans la construction, l’application iOS et Android Opr6 (gestion des réserves).

Opr6 iPad

 

L’implémentation du client Opr6 a été réalisée grâce au framework Titanium qui permet d’obtenir deux versions de l’application : une pour iPad/iOS et une pour Android et cela avec un rendu visuel natif. L’application fonctionne en mode déconnecté, une synchronisation est faite une première fois avant de faire la visite de chantier pour rapatrier les données du projet (plans, réserves existantes, punchlists, listes des intervenants…) et une seconde fois à la fin de la visite pour consolider les saisies effectuées sur la tablette sur le cloud (serveur python/django pour les initiés). Un rapport est alors automatiquement généré et envoyé aux personnes concernées.

La fiabilité des informations de suivi, le gain de temps, l’efficacité générale s’en retrouvent énormément améliorés.

 

GWT est-il toujours pertinent ?

Il y a 3 ans, lorsqu’il s’agissait de définir le socle technique d’une nouvelle application web, en l’absence de contraintes exogènes, GWT (Google Web Toolkit) était pour nous un choix naturel pour le développement de la partie « front web ». Les arguments massue de l’époque étaient le manque de portabilité de JavaScript, son faible niveau d’outillage par rapport à Java et aussi la grande difficulté que l’on peut rencontrer à développer une large application avec un langage aussi dynamique et faiblement typé que JavaScript. Face à ces écueils, GWT représentait le rempart absolu, la solution ultime.

Aujourd’hui toutefois, les choses ont de mon point de vue quelque peu évolué.
Tout d’abord, le support de navigateurs obsolètes, comme Internet Explorer 6 par exemple, n’est plus l’obsession des DSI qui par contre tiennent de plus en plus à ce que leurs applications offrent également un bon rendu sur les dispositifs mobiles et tactiles.

Ensuite, l’écosystème JavaScript a progressé. Si les jQuery et autres Prototype existaient déjà il y a 3-4 ans, des frameworks de plus haut niveau tels que Backbone.js, JavaScriptMVC, s’appuyant d’ailleurs sur jQuery, ont fait leur apparition. Ceux-ci aident à fournir un cadre à la structuration des applications de grandes tailles, point délicat lorsque le volume de JavaScript devient important. Des moteurs de templates côté client comme mustache ou des starter kits, à l’instar de bootstrap twitter, sont également venus enrichir l’offre JavaScript.

Côté GWT aussi les lignes ont bougé, passés les premiers instants d’émerveillement, quelques défauts se sont fait sentir. Le premier d’entre eux est l’absence d’une vraie bibliothèque de widgets solide et pérenne. GWT étant avant tout un socle technique, Google laisse à la communauté ou aux éditeurs tiers le soin de bâtir sur son framework. Ainsi Ex GWT, SmartGWT, Vaadin pour ne citer qu’eux disposent de composants de plus haut niveau, prêt à l’emploi. Malheureusement ces bibliothèques n’ont jamais donné pleinement satisfaction : licence peu « business friendly », adhérence importante, problème de qualité. Au final, la sagesse recommande de se contenter de GWT et de tout développer soi-même…
Par ailleurs, GWT, au fil des versions, a gagné en complexité, le pattern « activities/places » pour être correctement employé exige que les développeurs soient bien formés ; RequestFactory, CellWidget sont des nouveautés qu’il conviendra à nouveau d’assimiler et qui contraindront la migration d’un bon nombre d’applications.
En outre, si GWT parvient à éloigner complètement JavaScript du développeur, il ne le préserve pas de CSS qui tend à prendre de plus en plus d’importance et devient une nouvelle source d’incompatibilité entre les navigateurs. On touche finalement au coeur du problème : GWT est une abstraction imparfaite ; cette encapsulation des technologies web ne dispense pas les développeurs d’en comprendre les arcanes.

Conclusion
Pour répondre très concrètement à la question posée par ce billet : oui GWT est toujours pertinent surtout s’il s’agit d’implémenter une grosse application de gestion avec des développeurs de niveau hétérogène. Par contre, pour une application innovante, faisant un usage prononcé des dernières fonctionnalités HTML5 (3D, communication temps réel) il est avantageux d’être en prise directe avec le browser (bare metal).
Quoi qu’il en soit, ce qui était annoncé à la sortie du framework de Google ne s’est pas produit : JavaScript n’est pas devenu l’assembleur du web. Qu’on le déplore ou non, ce langage est aujourd’hui incontournable, son champ d’application dépasse d’ailleurs largement le cadre du navigateur (CommonJS). Aucun développeur IT ne peut continuer à le bouder.

OW2Con 2011

La conférence annuelle du consortium OW2 s’est tenue la semaine dernière chez Orange dans son Orange Labs’ Innovation Gardens. Au delà du côté convivial de cette manifestation, j’ai pu d’une part échanger avec beaucoup d’acteurs de l’open source et de la recherche et d’autre part cela a été l’occasion de présenter notre projet de développement d’une solution PLM open source :

Par ailleurs, des sessions que j’ai pues voir et de mes discussions informelles avec les autres participants j’en retire que le cloud computing, sous toutes ses formes (IaaS, PaaS, SaaS), est le sujet brûlant des DSI aujourd’hui. Dans ce cadre là, deux projets présentés à ow2con sont à suivre de près : CompatibleOne et OpenNebula.

Agile Tour 2011

Agile Tour Toulouse

L’agile tour s’est achevé il y a quelques jours déjà, prenons ici un peu de temps pour revenir sur cette belle cuvée.

Tout d’abord l’édition de 2011 est selon moi celle de la maturité. Cela se voit clairement aux thèmes des présentations, il n’est plus question d’expliquer les principes de base des méthodes agiles mais de faire part de ses retours d’expériences, du déploiement de l’agilité à grande échelle, des rapports entre les méthodes agiles et CMMI, lean ou kanban…

Pour ma part, notre session, j’étais accompagné de Thomas van de Velde de Webinage et de David Brocard, concernait l’application de l’agilité dans le cadre d’un projet de startup. Notre intervention a été particulièrement interactive, nous avons pu débattre sans ambages des concepts agiles que nous appliquons avec succès et de ceux qui nous posent un peu plus de difficultés. Par exemple, il nous est difficile d’adopter une démarche TDD (Test Driven Development), en effet comment définir des tests de non-régression pour un logiciel où une bonne partie de la complexité est logée dans l’interface graphique voir pire dans des algorithmes audio de voix sur IP !

Enfin, les discussions ont également porté sur la contractualisation agile, vaste et récurrent sujet !

Pour télécharger la présentation, c’est ici.

merci à Antoine Vernois pour la photo.

 

 

Formation HTML5

Une nouvelle formation vient de faire son entrée à notre catalogue : « Développer des applications HTML 5 ». Destinée aux développeurs, elle est la synthèse de notre pratique quotidienne depuis plus d’un an de cette technologie conjuguée à l’étude approfondie des normes et spécifications la constituant.

Cette formation s’étale sur 3 jours, l’ensemble des nouveautés d’HTML5 et de CSS3 sera expliqué, nous prendrons également du recul pour traiter des problématiques de conception technique et échanger sur les perspectives qu’ouvrent la plateforme pour les applications métier ou digitales.

La première session inter-entreprises est planifiée du 24 au 26 octobre 2011 à Toulouse au centre ville dans nos nouveaux locaux entièrement rénovés. Thé, café, jus de fruits, viennoiseries et les déjeuners seront offerts aux stagiaires.

Programme complet de la formation HTML5 :
http://www.docdoku.com/formation/html-5/

Inscription et demande d’information :
http://www.docdoku.com/identite/contact/

Open Data

Voilà quelques semaines déjà l’application mobile CheckMyMetro était la cible de la RATP qui exigeait que celle-ci soit retirée de l’App Store. L’argumentation avancée par la régie est que l’application incriminée se contenterait d’encapsuler le site internet de la RATP reprenant ainsi les horaires et la carte du réseau de transport. La RATP aurait préféré que l’application fasse une redirection vers son site.

Cette querelle regrettable aura au moins eu l’intérêt de médiatiser le sujet de « l’open data ». La libération des données publiques est un enjeu stratégique à plus d’un titre.

Tout d’abord sur le plan économique, la mise à disposition gratuite et sans restriction par le secteur public de ses données brutes et structurées serait une formidable source de croissance. En effet, des informations de type météorologique, environnementales, cadastrales, sur les transports, pour ne citer que ces quelques exemples, valent de l’or, mais pour l’instant ce trésor est peu exploité ! Pour y remédier il faut ouvrir les données pour permettre à de nouvelles applications, de nouveaux usages innovants d’émerger.

D’autre part, l’open data n’est pas qu’une affaire de business c’est aussi un vecteur de démocratie qui favorise la participation citoyenne, et améliore la transparence sur le fonctionnement de nos institutions publiques. On comprend donc que cela puisse faire peur…

Concevoir et développer des applications mobiles et tactiles (2ème édition)

Voila quelques mois déjà que la seconde édition de mon livre consacrée à Android est sortie. 

Cette nouvelle version intègre d’une part une mise à jour du contenu vers les dernières moutures d’Android mais également de nouveaux chapitres qui élargissent quelque peu le propos de l’ouvrage.

Je traite en effet dans la nouvelle édition des problématiques du développement mobile multi-plates-formes et des tablettes tactiles.

Ces deux sujets sont d’ailleurs au centre des préoccupations de beaucoup de nos clients.

 

Concevoir et développer des applications mobiles et tactiles

Android (Florent Garin - 2ème édition)

 

Ubuntu Party

Avec un peu de retard, voici la présentation que j’ai faite à l’occasion de l’Ubuntu Party. Il y est question d’Android ; abordé sur le plan technique mais aussi sous l’angle « écosystème » : les liens entre Google, les utilisateurs, les développeurs et les constructeurs.

Au cours de nos missions de formations ou de conseil chez ces derniers (nous avons travaillé pour Motorola, NEC et LG) j’ai pu entre-apercevoir que les relations Google-Constructeurs peuvent être plus complexes que ce qu’on pourrait penser.

De plus, le simple fait qu’Android soit disponible sous une licence libre (GPL ou Apache selon les composants) est très insuffisant pour garantir que son développement se fasse en toute transparence et en respectant les intérêts des divers protagonistes. Ceci étant, on peut dire la même chose d’autres projets open source.

Ubuntu Party – Android et son écosystème (Florent Garin – DocDoku)

Hibernate dirty checking

Les ORM (Object-Relational Mapping) sont aujourd’hui des technologies matures ; l’essentiel d’Hibernate a été versé au standard Java EE au travers de la spécification JPA qui en est maintenant à sa deuxième version.
Les réfractaires à la technologie, qui préfèrent encore utiliser directement l’API JDBC ou (moindre mal) les templates JDBC de Spring, sont aujourd’hui de moins en moins nombreux. Malgré tout, s’il est donc vrai qu’un ORM apporte une solution élégante à la problématique de persistance de nos applications, il faut aussi admettre qu’en déléguant une partie du travail d’interaction avec la base de données à ces outils nous perdons un peu en contrôle ce qui introduit de nouvelles difficultés. Parmi celles-ci il y a la bonne prise en compte du « dirty checking ».

Le « dirty checking » est un mécanisme d’Hibernate qui consiste à lister parmi les objets attachés ceux qui ont été modifiés pour ensuite propager ces modifications en base. Ce comportement du framework doit être bien compris car il peut être source d’effets secondaires indésirables.

Hibernate peut lancer une opération de « dirty checking » à plusieurs occasions :

  • Lors d’un flush, qui intervient au moment du commit de la transaction ou d’un appel explicite par EntityManager.flush(),
  • Juste avant l’exécution d’une requête de type « select ». Ce cas de figure peut sembler moins évident que le premier mais la raison est relativement simple : la requête sera exécutée au niveau de la base de données, il est par conséquent capital que les données modifiées dans la transaction en cours qui peuvent influencer le résultat de la requête soient « flushées ».

Si la plupart du temps, le « dirty checking » se fait dans la plus grande transparence sans que le développeur n’ait à s’en soucier, il arrive aussi que son déclenchement soit gênant. Par exemple dans le cas de traitement de masse où le nombre d’objets attachés est très important cette opération peut pénaliser fortement les performances. Par ailleurs, si l’on souhaite avoir la main sur l’ordonnancement des requêtes SQL, il est embêtant qu’une simple recherche JPQL déclenche une série de requêtes de type « update » à la suite d’un « dirty checking ».

Comment faire alors pour maîtriser la propagation des modifications dans la base et éviter les traitements de « dirty checking » intempestifs ?

Hibernate étant un framework souple et paramétrable, il offre pas mal de possibilités au développeur pour gérer cela : on peut travailler dans un mode « read only », on peut aussi utiliser la classe StatelessSession qui est spécialement pensée pour dérouler des opérations en bloc (sans « dirty checking » automatique). Si l’on préfère, probablement à raison, rester sur le standard JPA, il suffit de positionner le « flush mode » comme ceci :

EntityManager.setFlushMode(FlushModeType.COMMIT);

Ainsi les objets ne seront synchronisés avec la base de données qu’à la fin de la transaction, au moment du commit. Évidemment, il faut là aussi être sûr de son coup, il convient de bien vérifier qu’aucune requête de sélection ne sera perturbée par ce flush tardif.