Blog

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.

Présentation des versions Web et Desktop de notre solution de GED Open Source

DocDoku est une solution open source de gestion collaborative de documents dont le rôle est d’aider les membres d’une même organisation à gérer, partager, rechercher et produire des documents. Parmi les principales fonctions de notre GED, nous retrouvons :

  • Contrôle de version
  • Réservation / libération des documents
  • Prise en charge des métadonnées
  • Organisation arborescente des documents
  • Recherche plein texte et multi-critères
  • Classification transverse par types de document et libellés
  • Génération automatique des références de document (selon un numéro chronologique par exemple)
  • Transformation des documents (génération PDF)
  • Visionneur Web supportant la plupart des formats

DocDoku est un outil simple, à l’ergonomie soignée dont la prise en main est très rapide.

En savoir plus sur la GED DocDoku.
Tester gratuitement la GED DocDoku.

La GED DocDoku est disponible en deux versions :

Version Web :


Version Desktop :

Interview d’Eric Descargues au salon de la Mêlée Numérique 14

Découvrez l’interview d’Eric Descargues donnée lors de 14ème Mêlée Numérique :

Merci à Claude Paichard pour l’interview et à l’équipe de Pinkanova pour la réalisation.

Démonstration de l’application Android de TableOnline

Dans le cadre de sa présence au salon de la Mêlée Numérique 14.0, DocDoku a présenté la version beta de l’application Android réalisée pour TableOnline, outil de recherche et de réservation de restaurants en temps réel.

Vous trouverez ci-dessous une démonstration de l’application, ainsi que les photos prises lors de notre atelier sur les « stratégies et développements mobiles multi-plates-formes »:

Merci à @Mallox pour les photos.

Présentation La Mêlée Numérique 14 : Stratégies et développements mobiles multi-plates-formes

Plus de présentations presentations de DocDoku.
Concernant les problématiques de compilation croisée, il est à noter qu’Apple a modifié récemment la licence d’utilisation que chaque développeur doit signer lors du téléchargement de l’iPhone OS 4 SDK :
3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).
Le risque de se voir refuser l’accès à l’Appstore pour une application conçue par cross compilation est donc bien réel.

JSF 2.0, enfin correct !

Voila quelques mois maintenant sortait dans sa version finalisée la spécification Java EE 6.
Dans la foulée la version 3 de glassfish était mise à disposition.

Globalement, la plateforme va vers plus de modularité et de simplicité avec notamment la généralisation des annotations ou encore l’apparition des profils qui servent à regrouper les API Java EE en plusieurs familles. Pour l’instant, il n’existe que deux profils, le profil complet et le profil Web.

Java EE a clairement atteint aujourd’hui l’âge de la maturité, le modèle de développement standard Java pour les applications d’entreprises n’a plus de véritables faiblesses comme par le passé avec les abominables EJB2. Malgré tout, parmi les nombreuses briques définies par la spécification, il en reste une que les développeurs auront tendance à substituer par une alternative open source ; je pense à JSF.

JSF n’a jamais été le framework brillant devant lequel on tombe en émerveillement le jour où on le découvre. Il n’a pas l’étoffe d’un Struts qui au début des années 2000 structura en MVC nos applications web ni la souplesse de Spring Ioc, la puissance de Spring AOP ou encore la simplicité de GWT. Toutefois la version 2 efface les principaux reproches qui étaient faits au framework en apportant :

  • Support de la méthode HTTP GET qui permet de faire des URLs « bookmarkable »
  • Support d’AJAX avec le rendu partiel de la vue
  • Moteur de templating
  • Navigation implicite entre les pages (<navigation-rules> n’est plus obligatoire)
  • Facelets préféré aux JSP

Ainsi aujourd’hui, il est possible de choisir JSF 2 pour implémenter la couche de présentation d’une application web sans forcément faire une erreur !

HTML 5, the next big thing

HTML 5 est assurément la prochaine révolution en matière de développement de sites internet et d’applications web. Grâce entre autres à WebGL (API 3D), WebSocket (connexions TCP full-duplex) ou encore Web Storage (stockage de données en local côté navigateur) il n’y a plus de frontière entre applications natives et applications web et cela sans plugin.

Pour se convaincre des possibilités, il suffit de voir le portage du jeu Quake 2 sur ces technologies.

DocDoku participe à la 14ème édition de la Mêlée Numérique à Toulouse Labège les 28 et 29 avril 2010

DocDoku aura le plaisir de vous accueillir sur son stand lors de la 14ème édition de la Mêlée Numérique à l’Espace Diagora de Toulouse Labège, les mercredi 28 et jeudi 29 avril 2010.

Le Salon des TIC numéro 1 sur le Sud Ouest rassemble tous les acteurs économiques des solutions de l’informatique, des nouvelles technologies, des télécoms et de l’innovation. Au programme : 160 exposants, 40 ateliers et conférences et plus de 5000 visiteurs attendus.

DocDoku : Conseil, Formation et Solutions innovantes IT

L’actualité de DocDoku

Cet évènement sera l’occasion pour DocDoku de vous présenter ses toutes dernières solutions collaboratives (GED en mode SaaS avec client web Ajax) et mobiles (applications Android et multiplateformes). Venez également découvrir notre savoir-faire dans le domaine du conseil et de la formation en Systèmes d’Information et Technologies de l’Information et de la Communication.

Animation sur le stand

Venez assister à une démonstration de l’application Tableonline pour Google Phone Android, outil pratique et ludique de recherche et de réservation de restaurant depuis votre mobile. Découvrez également la nouvelle version de notre interface web (Ajax-GWT) de notre solution de GED éponyme à l’origine de notre société.

Participation atelier

Notre directeur technique, Florent Garin, animera également un atelier sur les « Stratégies et développements mobiles multiplateformes» le jeudi 29 avril de 9h30 à 10h30 (à suivre sur le programme du salon).

A Propos de DocDoku

DocDoku est un cabinet de conseil et de formation composé d’experts dans le domaine des Technologies de l’Information et de la Communication. Notre savoir-faire se traduit également par l’édition et l’intégration de solutions professionnelles mobiles et collaboratives.

Nativement éditeur de la solution libre éponyme de gestion collaborative de documents (GED ou ECM), notre activité résolument tournée vers la recherche et développement nous permet d’apporter une réelle valeur ajoutée à nos prestations de conseil, d’expertise, de formation et de réalisation de projets dans le domaine IT.

Nos consultants sont très impliqués dans nos projets de recherche et développement essentiellement Open Source et assurent une veille technologique permanente.

Enfin, nous nous efforçons de créer et de proposer des prestations et solutions  adaptées sans jamais oublier que l’expertise n’a de sens que si elle est au service de la couverture de vos  besoins métiers.

Plus d’information sur le salon

Mercredi 28 et jeudi 29 avril 2010 à l’Espace Diagora de Toulouse Labège.

Entrée gratuite

Le site du salon : http://salon.meleenumerique.com/

Contact Presse

M. Eric Descargues

Email : eric.descargues@docdoku.com

Téléphone : 05 61 72 24 09

Mobile : 06 70 00 12 91

Mentions Légales

DocDoku SARL au capital de 20 000 euros

RCS Toulouse : 492 273 800 000 28

Code APE : 5829C

Buroplis – Bâtiment B – 150 rue Nicolas Louis Vauquelin

31100 Toulouse

http://www.docdoku.com

Notre livre sur Android publié sur Divvaroom

Dunod et la plateforme de feuilletage de nouvelle génération en ligne Divvaroom publient notre livre « Android – Développer des applications mobiles sur les Google Phone ».
L’outil de visualisation Flash est plutôt bien fait et le format DivvaBook fullmedia séduisant. Une belle invitation à la lecture non ?

Portail Liferay avec GWT intégré en SOA pour Pierre et Vacances

Aujourd’hui je viens vous faire partager une très belle expérience projet. Je vous parlerai donc d’un projet que nous avons réalisé pour notre client Pierre et Vacances, qui a su nous faire confiance jusqu’au bout pour le développement et l’infogérance de son extranet commercial.

Faire des choix en matière d’architecture logiciel en 2010 peut être un exercice difficile, c’est pourquoi l’approche de DocDoku en matière de choix techniques est basée sur les principes suivants :

  • pragmatisme, dans le choix des langages et des technologies,
  • ouverture d’esprit, nous effectuons une veille technologique permanente,
  • mise en contexte, chaque problème étant différent, les réponses à apporter doivent l’être également,
  • industrialisation, il ne s’agit pas de s’emparer de la toute dernière nouveauté mais de bâtir des solutions robustes, matures et maintenables,
  • respect des standards établis, pour garantir la pérennité des applications, et maximiser l’investissement consenti par nos clients, nous nous appuyons sur les standards unanimement reconnus.

Dans le cadre de l’extranet commercial développé pour Pierre et Vacances, les grands principes architecturaux retenus ont été les suivants :

  • utilisation du composant portail open source Liferay permettant un gain de productivité certain en particulier sur les modules génériques (droits d’accès, profils utilisateurs, agenda, publication de news…) mais respectant également la JSR 286, norme de communication entre le portail et les applications qui y sont hébergées, supportée par de nombreux éditeurs (IBM, Sun, Oracle, RedHat). Ceci permet de surcroît de limiter notre dépendance vis-à-vis d’une solution portail en particulier.
  • développement d’une architecture en couches permettant notamment de découpler les composants les uns des autres et de les faire évoluer indépendamment.  Une séparation en couches permet d’adapter en effet l’architecture physique en fonction des besoins de distribution pour une bonne capacité à monter en charge.  Une architecture n-Tiers en 4 couches distinctes a été choisie :
    • La couche d’accès aux données avec JPA-Hibernate dont le rôle est la connexion à la base de données, l’exécution des requêtes ou l’appel des procédures stockées.
    • La couche de service EJB3 et JAX-WS-Metro, ensemble des règles métiers et processus de l’application. Cette couche sera implémentée en Java via des composants transactionnels.
    • La couche métier POJO qui constitue le diagramme de classes des entités (le modèle objet).
    • La couche de présentation avec GWT et Portlet Liferay : l’interface utilisateur affiche les résultats traités par la couche métier.  Ici le framework Ajax GWT a été choisi pour à la fois offrir une ergonomie poussée et une forte maintenabilité.
  • mise en place d’une architecture de type SOA pour pouvoir exposer de façon universelle les fonctions de l’extranet pour les futures applications du SI.

Tout ceci est en production évidemment depuis la fin octobre 2009.

Agilement.

La référence sur GWT 2

J’ai eu le plaisir il y a quelques jours de recevoir, de la main même de l’auteur à l’occasion d’un déjeuner, le livre Programmation GWT 2.

J’ai préféré attendre d’avoir bien parcouru le livre avant d’écrire ce billet. J’aime autant le dire tout de suite : ce livre est LA référence sur GWT 2. Tout y est : les incontournables services RPC, l’intégration JEE, l’UiBinder, la communication avec le monde JavaScript mais aussi les Designs Patterns MVC (Model View Controller) ou MVP (Model View Presenter).

Au niveau de l’approche, la grande force du livre de Sami Jaber est qu’il est didactique et pointu à la fois, il convient donc aussi bien aux débutants qui veulent plonger dans le monde AJAX avec GWT qu’aux développeurs chevronnés. Un signe qui ne trompe pas sur la qualité de l’ouvrage : nos consultants qui ont près de 2 ans d’expériences sur GWT se l’arrachent !

Le cache d’entités JPA

Si le recours à un ORM (Object-Relational Mapping) permet des gains de productivité et facilite la maintenance des applications, ce type de framework introduit néanmoins des problématiques nouvelles, qui, pour être évitées, exigent une très bonne connaissance des mécanismes internes au moteur de mapping.

Parmi ces difficultés classiques, on peut citer la gestion du cache d’objets.

La validation finale de la spécification de JEE 1.6 (JSR 316) qui inclut la version 2 de JPA, intégrant des évolutions appréciables en matière de prise en compte du cache, est l’occasion de revenir ici un peu sur le sujet.

En réalité les ORM possèdent deux caches distincts :

jpa_caches

Cache de premier niveau (L1)

Le cache de premier niveau est rattaché à l’objet EntityManager, il s’agit en fait du « persistence context » qui lui est associé. Pour rappel, c’est à partir d’une instance d’EntityManager que les entités (les objets persistés en base de données) sont créés, récupérés ou encore supprimés. La classe EntityManager est définie par l’API standard JPA, elle est l’équivalente de la classe Session dans l’API native Hibernate.

Le contexte de persistance regroupe un ensemble d’entités en garantissant que pour une même entité il n’y aura qu’une seule instance d’objet. En prenant garde à ne pas dupliquer les objets de même identité, le contexte de persistance agit donc comme un cache d’objets : les recherches, qu’elles soient faites au travers d’une Query ou avec la méthode find(Class<T> entityClass, Object primaryKey), retourneront toujours les mêmes instances d’objets, piochées dans le cache, pour matérialiser un même enregistrement en base. Le contexte de persistance est lié à la transaction en cours, il sera vidé à la conclusion de celle-ci.

Le fonctionnement du contexte de persistance qui vient d’être décrit est celui qui est le plus couramment employé, il s’agit du mode PersistenceContextType.TRANSACTION. Néanmoins, il existe un autre mode dit « étendu », le paramétrage du contexte de persistance se fait dans le code Java, lors de l’injection de l’EntityManager :

@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager em;

Dans cette configuration, le PersistenceContext n’aura pas une durée de vie corrélée à la transaction mais au Stateful Session Bean dans lequel il est déclaré. Ainsi, le cache d’objets sera maintenu sur plusieurs transactions à la base de données. Ce type de contexte de persistance peut par exemple être utilisé pour alimenter en données une page web requêtant en AJAX.

Cache de deuxième niveau (L2)

En dessous de ce cache placé sous la direction des EntityManagers se trouve un autre cache dit de second niveau. Ce cache est global à la JVM ou plus exactement à l’EntityManagerFactory. Il peut aussi être configuré au niveau cluster, dans ce cas le cache sera répliqué sur chaque JVM. Le cache de second niveau est donc partagé entre les EntityManagers qui iront l’interroger, si l’entité recherché n’est pas présent dans leur propre contexte de persistance, avant de se résigner à taper dans la base de données.

Si les règles régissant le cache de premier niveau sont relativement limpides, celles gouvernant le cache de 2ème niveau le sont un peu moins et le développeur peut légitimement se poser de nombreuses questions :

  • Quelle est la durée de rétention des objets dans le cache ?
  • Que se passe t-il si la base de données est modifiée en dehors de l’application JPA ?
  • Peut-on contrôler par configuration ou par du code ce cache ?

De manière générale, les réponses à ces questions dépendent avant tout de l’implémentation JPA choisie. D’ailleurs, si EclipseLink et TopLink activent par défaut un cache de second niveau ce n’est pas le cas d’Hibernate. Ce dernier a par contre été très tôt pensé de façon modulaire et accepte divers « cache provider » comme EhCache, OS Cache ou encore JBoss Cache. Chaque système de cache vient avec ses options et ses fichiers de paramétrages, il est souvent possible de les spécifier dans le fichier persistence.xml entre la balise <properties> ou dans le code par la méthode Query.setHint(String hintName, Object value).

En ce qui concerne les changements opérés dans la base sans passer par les couches de persistance de l’ORM ; là le résultat est identique quelque soit le framework : le cache de niveau 2 se retrouve obsolète et cela tant que l’entité en question ne sera pas rechargé. La plupart des caches d’objets utilisant des SoftReferences ou des WeakReferences, l’éviction de l’objet se produira à un moment indéterminé, au gré des pérégrinations du garbage collector. Pour ceux ne pouvant se contenter du caractère aléatoire des références faibles et qui veulent expressément déclencher le rafraichissement des données la classe EntityManager propose heureusement la méthode refresh qui s’utilise habituellement ainsi :

MonEntity e = em.find(MonEntity.class, id);
try {
em.refresh(e);
} catch(EntityNotFoundException ex){
e = null;
}

Toutefois, ce n’est que depuis la version 2 de JPA que le cache L2 est officiellement mentionné dans la spécification. Dans cette API, une classe Cache accompagnée de ses méthodes « evict » a fait son apparition et certains points de configuration ont été standardisés.

En conclusion

Il y aurait encore beaucoup à dire sur les caches d’entités et plusieurs billets seraient nécessaires, c’est pourquoi je conclurai simplement en invitant tous les développeurs et architectes à regarder sous le capon de leur framework de persistance et à ne pas se laisser « endormir » par la simplicité trompeuse de l’API JPA.

VMware Serveur OVH avec Windows 2003 en guest

L’hébergeur bien connu OVH propose, sur ses serveurs dédiés, un large choix d’OS parmi lesquels figure une distribution Linux pré-conçue pour accueillir des environnements virtualisés. Il s’agit en fait d’une Debian Etch 4.0 32bit avec VMware server 1.08 configuré pour tourner au-dessus. Pour ceux désireux d’affecter leur machine à un usage exclusif de host VMware et voulant privilégier les performances il faudra plutôt choisir l’OS VMware ESXi qui lui est un hyperviseur natif.

J’ai très récemment eu à mettre en place un serveur virtualisé Windows 2003 sur la distribution « VMware server » d’OVH. A cette occasion, j’ai constaté que les guides de l’hébergeur manquaient quelques peu de précisions et, qui plus est, sur des éléments capitaux.

Les tutoriels en question sont les suivants :

http://guides.ovh.com/vmware
http://guides.ovh.com/AjouterAliasIp

OVH, pour des raisons de sécurité, interdit l’usage du « bridged networking », nous avons donc le choix entre le « NAT » et le « host-only » où grâce à une IP failover le guest aura pleinement accès au réseau.

Même si en principe le choix du mode de connexion peut être changé par la suite, sélectionner malencontreusement le mode « bridged networking » engendre des modifications dans plusieurs fichiers de configuration qui s’avèrent difficile à défaire même en corrigeant l’option réseau. Il faut donc bien veiller à ne jamais choisir le mode « bridged networking » sur un serveur OVH.

Le paramétrage de la machine host ne pose pas de difficulté particulière. Là où ça se corse, c’est au niveau du guest Windows 2003 Server. Le tutoriel OVH oublie de mentionner un paramètre essentiel : la passerelle de la machine guest doit être elle-même, c’est à dire, elle doit avoir pour valeur l’IP failover qui est également l’adresse de la machine guest ! Ainsi va la virtualisation, la machine guest se sert du host pour communiquer avec le monde extérieur, toutefois cette configuration qui peut sembler étrange dans un contexte plus classique aurait méritée d’être ici explicitement notifiée.

Interview de Florent par Frandroid

Découvrez l’interview de Florent réalisée par la communauté Frandroid :

[Frandroid] Interview Florent Garin Partie 2 : Android vu par un professionnel

[Frandroid] Interview Florent Garin partie 3 : Le livre

Un grand merci à Jorodan.