insideIT.fr : le blog des architectes IT de SFEIR

Aller au contenu | Aller au menu | Aller à la recherche

lundi 8 mars 2010

Révision Scrum : le backlog produit

Le backlog produit est la liste des fonctionnalités du produit à développer. Chaque élément de cette liste est composé au minimum de trois attributs :

La finalité du backlog produit est d'avoir de la visibilité sur l'état du projet et de prioriser les développements.

Le backlog produit est de la responsabilité du product owner.

Valeur métier

La valeur métier d'un item est estimée par le product owner.

C'est la valeur métier des items qui doit diriger la priorisation des développements. Pour aider à la mise en perspective entre l'accessoire et le fondamental, il est conseillé d'utiliser la suite de Fibonacci en s'efforçant d'utiliser des valeurs très disparates.

Effort ou complexité

L'effort nécessaire à la réalisation d'un item est estimé par les personnes qui seront en charge de la réalisation. Cette valeur est fixe dans le temps.

Plus un effort est important, plus son estimation est imprécise. C'est pourquoi il est conseillé d'utiliser la suite de Fibonnaci pour estimer les efforts.

Métriques

Les métriques issues des données du backlog produit donnent de la visibilité sur l'état actuel du projet et aide à définir les prochaines étapes.

Le backlog produit est un outil évolutif (ajout, suppression, modification d'items). Par conséquent, il est souvent intéressant de suivre ces métriques en points et en pourcentage.

Ci-dessous, deux exemples de métrique que nous pouvons extraire du backlog produit.

Vélocité

La vélocité est l'effort qu'une équipe peut adresser en un sprint. Cette mesure s'affine au fil des itérations.

La vélocité ne doit pas être utilisé pour assurer le suivi de la productivité d'une équipe mais pour réaliser des projections (e.g. estimer la date de fin du projet). Une mauvaise utilisation de cette métrique entraine une inflation des points d'effort et/ou une "course à la vélocité" au détriment de la qualité.

Il est également déconseillé de comparer les vélocités de deux équipes du fait des estimations réalisées sur des échelles différentes. Les estimations sont relatives, pas absolues.

Par contre, il est intéressant de suivre l'évolution de la vélocité d'une équipe. Une diminution de la vélocité traduit souvent un manque d'évolutivité du produit développé ou l'apparition de nombreux bugs.

Valeur métier acquise

Cette métrique détermine la valeur des développements réalisés.

Si le backlog est correctement priorisé, l'évolution de la valeur métier acquise doit diminuer au cours des itérations car les items de plus grande valeur sont traités en premier.

Quelques liens

Dans SCRUM mon backlog de produit est DEEP
Le backlog produit
Des user stories de qualité
Valeur métier en pratique
Comment mieux prioriser en agile
Suite de Fibonacci

vendredi 26 février 2010

Révision Agile : ScrumMaster ? C'est quoi déjà ?

La semaine prochaine, le ScrumMaster du projet sur lequel je travaille sera en vacance. Étant donné que je vais assurer son remplacement, j'en profite pour réviser le rôle du ScrumMaster.

Alors, qu'est-ce qu'un ScrumMaster ?

Un facilitateur

L'une des missions du ScrumMaster est de s'assurer que les autres membres de l'équipe restent concentrés sur le véritable objectif du projet : la livraison de valeur pour le client.
Il écarte les obstacles qui jonchent le parcours menant à la livraison et si possible avant même qu'ils ne surviennent.

Un coach

Dans le processus d'amélioration continue, le ScrumMaster joue le rôle du coach.
Il aide l'équipe à prendre conscience de ses qualités et faiblesses. Puis il fait en sorte de conserver les acquis tout en travaillant les points faibles.

Un animateur

Il organise et anime les activités Scrum tel que sprint planning, daily Scrum, sprint review et rétrospective.
Il fait en sorte que tous les membres de l'équipe se sentent impliqué et libre de s'exprimer.
Autant que faire se peut, le ScrumMaster s'assure que tous les membres de l'équipe sont contents de travailler.

Le garant des pratiques Scrum

Un ScumMaster, comme l'indique son nom, a une bonne connaissance de Scrum. De par cette connaissance, le ScrumMaster s'impose comme le garant de la bonne utilisation des pratiques de Scrum.

Quelques liens

Le rôle de ScrumMaster
Peut-on à la fois être ScrumMaster et développeur sur un même projet ?
Mon ScrumMaster en fait trop !

jeudi 4 février 2010

Le Paris JUG a 2 ans !

juggyannif02

Le Paris JUG fêtera son 2ème anniversaire mardi 9 février. Pour célébrer l'événement, l'équipe organise une soirée spéciale consacrée à l'Open-Source en France. Sacha Labourey, ancien CTO de JBoss fera la keynote. Jean-Michel Doudoux sera également présent afin de nous présenter les différentes licences permettant la diffusion libre de documentations.

Les inscriptions sont ouvertes, rendez-vous mardi au 108 boulevard Malesherbes !

Sfeir est sponsor de l'événement : c'est également l'occasion de venir nous rencontrer pendant la pause-buffet !

vendredi 15 janvier 2010

Evénement : Conférence "Jump Camp 4 IT" jeudi 21 janvier à 19h

Jeudi prochain aura lieu le premier opus du Jump Camp 4 IT.

Alors Jump Camp 4 IT, c'est quoi ?

Jump Camp 4 IT est une mini conférence en soirée sur Paris mêlant présentations et ateliers de coding, destinés aux passionnés des technologies de l'information.
Ainsi, ce qui est intéressant dans ce format, c'est que cela vous permet de mettre un premier pied à l'étrier sur le framework présenté, et non pas juste d'écouter une présentation théorique. Il est donc conseillé de venir avec son ordinateur portable pour profiter pleinement des présentations ;)

Ah, et petit détail qui ravira tout le monde : c'est gratuit.

Le premier opus de la série aura lieu jeudi prochain, soit le 21 janvier, de 19h à 21h.
Au programme, 6 présentations/séances de coding live autour des dernières technologies/tendances web du moment :

  • Surprise... : une présentation/annonce surprise par Didier Girard
  • Atmosphere :  un framework permettant de faire des applications web asynchrones (Comet) à partir de simples POJO (https://atmosphere.dev.java.net)
  • HTML5 : découverte de html5 step by step
  • Robots Wave et le WadRobotFramework : un framework qui simplifie énormément la création de robots pour Google Wave (http://goo.gl/6pOC)
  • Sisyphe version GWT : une interface à refaire ? reprogrammer ? Non, utilisez dès maintenant sisyphe.
  •  gwt-mvc : Framework pour GWT permettant de structurer le code client en suivant le design pattern MVC (http://code.google.com/p/gwt-mvc/

Si vous souhaitez vous inscrire, connaître le lieu exact de la conférence, ou avoir plus de détails sur les présentations, c'est par ici.

vendredi 18 décembre 2009

La communication, entre efficacité et complétude : L'échelle d'humanité

Communiquer pour le projet.

Dans des projets où parfois les acteurs sont distants, la communication est un facteur déterminant de succès ou d'échec. C'est même l'élément essentiel du projet. Mais de quelle communication parle-t-on ? Dans le cadre d'un projet, la communication doit couvrir :

  1. La Connaissance.
  2. Les Statuts.
  3. Le Ressenti.


Le formel et l'informel

Le DDD introduit la notion d'Ubiquitous Language, ce langage défini et partagé par les différents acteurs du projet. Je voudrais ici mettre l'accent sur l'optimisation des échanges. Comment fait-on pour être sûr que l'information est bien partagée, qu'elle l'est dans son entier et qu'elle l'est à temps ? Sachant que dans la communication, il y a des données intangibles, certes, mais aussi des données informelles où rentre le subjectif, le ressenti. Le daily scrum permet d'échanger cette seconde catégorie d'information. Et c'est indispensable. Par exemple, si on ne communique pas, on ne perçoit pas les frustrations à temps et on se retrouve face à des problèmes de turn-over.


L'acteur et son texte

Vous préférez voir un film ou lire son scénario ?

On est tous d'accord pour dire qu'un projet n'irait pas très loin si les gens se contentaient d'en discuter autour d'un café, sans jamais échanger autre chose que des impressions, des bons mots et des généralités. Mais à l'inverse, parieriez-vous sur l'avenir d'un projet, où les acteurs ne se voient jamais mais s'envoient des tonnes de fichiers Word ? Personnellement, je n'y mettrais pas un Euro.

La communication informelle, qui profite de la complicité s'installant entre l'émetteur d'une information et ceux auxquels elle s'adresse, passe par le visuel et l'auditif. Il y faut un peu de spectacle, pour que l'essentiel soit retenu. On parle alors du Body Language, on y retrouve les notions d'empathie, de synchronisation. Je préfère dix fois aller voir David Chappell dans sa présentation sur Azure et sur le Cloud, que lire son livre-blanc sur le même sujet. Je préfère aussi traverser le bâtiment, et aller échanger avec un collègue, de vive voix, plutôt que d'attendre sa réponse à mon mail. Pas un leader, aussi bon soit-il, ne fera passer sa vision dans un mail, un article, une news. Ce sont de bons supports, pour tracer et conserver mais ce ne sont que des supports. Et la communication sans le communiquant, c'est un peu le plat sans le cuisinier. C'est du Picard. Ce n'est pas forcément mauvais mais servi comme ça, c'est froid.


Entre trop et trop peu

Il y a quelque chose qui ressort de l'observation des échanges entre personnes, c'est la relative proportion inverse entre la quantité de données échangées et la perception qui en est faite. Si je vous dis : "Le projet est mort". Le message est clair, on aura tous compris qu'on peut rentrer à la maison. Si je vous envoie un document de 758 pages de diagrammes, de tableaux, de bilans, d'analyses d'experts et si dans un élan de professionnalisme rare, vous allez jusqu'à le lire, n'allons pas jusqu'à dire "en entier", vous en sortirez confus, désorienté, partagé, vous demandant si on a juste essayé de vous beurrer les lunettes ou si votre intelligence commence déjà à décliner. Voyez, rien que cette phrase. Il vous a fallu la lire deux fois, non ?


L'échelle d'humanité

Partant du constat de cette proportion inverse, je me suis amusé à essayer de situer sur un rapport entre la quantité de données échangée et leur perception, les différents médias utilisables dans le cadre d'un projet. Et voici de que ça donne :

HumanityScale

Reprenons le diagramme, dans l'ordre de lecture.

  • Le face à face a le meilleur degré de perception possible, de partage, avec un volume utile d'informations limité.
  • Le live-meeting (écran et web-cam interposés) perd juste un peu d'humanité.
  • Le téléphone est un peu en retrait car on perd l'information visuelle donc une bonne part de la communication informelle.
  • Le chat (IM) permet d'échanger plus de données puisqu'il est écrit, tout en restant "dans la discussion" donc de garder un fort aspect humain. Il offre aussi un bon équilibre entre rapidité et pertinence dans la réponse.
  • Le mail est plus factuel, il prend note, il prend date, il permet de tracer la transmission. Mais il perd en spontanéité. Il devrait être réservé soit à des réponses plus construites ou pour les aspects intentionnellement plus formels ou officiels, souvent nominatifs, comme un bon rappel à l'ordre ou une félicitation.
  • Le blog et son flux RSS restent vivants, tout en fournissant un somme importante d'informations actuelles, à jour. Ce sera le pouls du projet. Il peuvent donner l'état des builds, les infos générales de la vie du projet, ses grandes étapes, événements ou incidents.
  • Le Wiki, outil essentiel de tout projet, devrait contenir l'ensemble des informations du projet. Et comme il est collaboratif, il garde aussi un aspect humain encore perceptible. Il décrira les pratiques et les procédures du projet. Il garde en somme tous les sujets statiques du projet quand le Blog reçoit les sujets dynamiques.
  • La documentation classique elle, est au maximum pour le volume de données mais c'est le degré zéro de l'échange humain.


J'ai omis à dessein deux outils, pourtant très prometteurs, même au niveau projet, que sont Wave et Twitter. La raison est simple, je n'ai encore aucune idée de l'endroit où les placer. Mais je ferais une petite piqure de rappel, quand j'aurai soigné cet aspect de communication virale.


Voulez-vous réussir ?

Alors, lequel de ces médias utiliser ? Si vous voulez vraiment que votre projet avance, vous n'avez pas le choix, il-vous-les-faut-tous !

Chaque média a son objectif et son cycle de vie, chacun doit avoir son cadre d'utilisation et ses limites établies. Certains sont là pour aider à s'y retrouver, d'autres favorisent l'esprit d'équipe, d'autres encore permettent de guider la troupe. Vous voulez prendre le risque de vous passer de l'un de ces médias ?
Préférez-vous alors :

  1. Que les gens soient perdus ?
  2. Qu'ils se détestent ?
  3. Ou qu'ils ne sachent juste pas où aller ?

Un camionneur peut se passer de cartes, de CB (l'éméteur radio, pas le moyen de paiement) et de GPS. Mais entre nous, c'est une économie de courte vue ! Aujourd'hui, on a tous les outils pour organiser et optimiser un flux d'informations efficientes. Et là où certains y voient des gadgets, osons y voir le panel d'outils indispensables et sinon une garantie de succès, en tout cas des alliés sûrs et fidèles sur la route qui y mène.


Think Big, Start Small

En supposant que vous avez le téléphone et un ordinateur relié au réseau (sic), installer un wiki prend 5 minutes, un blog 5 de plus. S'abonner à un flux RSS prend 30 secondes. Installer un outil de Chat prend bien 10 minutes. Alors mis bout à bout, tout ça prend donc 20 minutes et 30 secondes. Ce qui est plus long, c'est le temps d'adoption par tous les acteurs des outils et de leurs avantages. Il y en a bien encore aujourd'hui qui résistent au téléphone portable ! Faites-vous l'évangéliste de vos outils. Les convertis seront nombreux.

Bien sûr, il faudra éviter la redondance, qui est source d'incohérence. Par exemple entre la documentation classique et le Wiki projet. Mais une fois encore, ces deux médias ne visant pas les mêmes acteurs, ils ne devraient pas contenir les mêmes informations et ce, de façon naturelle. Et puis la redondance, c'est déjà un problème de riche. J'ai l'impression de conseiller à un acheteur de bateau, de faire attention à la taille du mât pour passer sous les ponts ou que le bateau ne soit pas trop grand pour entrer dans le port, quand ce qu'il veut, c'est traverser la rivière. Il sera toujours temps quand les outils seront là et utilisés, de veiller à ne pas trop les utiliser (sic).

Et puis il ne faut pas hésiter à faire "signer" une charte de bon usage des médias de communications, pour mettre d'accord tout le monde sur le périmètre de chaque média, ce qui peut y être échangé, ce qui ne le peut pas. Ne cherchez pas trop, elle est juste au dessus.

Je ne sais pas si on est déjà dans le Web 4.0 ou encore dans le Web 3.0 mais ce que je sais, c'est que les outils du Web 2.0 peuvent vous aider dans vos projets. Alors, prêts à communiquer ?

mercredi 2 décembre 2009

Petite présentation de MooTools

Pour mon premier article sur ce blog, j'ai choisi de présenter MooTools, un framework Javascript open source orienté objet distribué sous licence MIT.
Après une rapide présentation des bases, je montrerai, grâce à quatre courts exemples, quelques unes des possibilités de MooTools, en espérant vous donner l'envie d'aller plus loin par vous-mêmes.

Récupération de la librairie MooTools

La version actuelle est la 1.2.4, le core est disponible sur le site officiel en version compressée (par YUI ou JSMin) et non compressée.
Il est également possible de définir sa propre version de MooTools en choisissant les modules à intégrer au moment du téléchargement, ce qui permet d'en optimiser la taille au maximum.
Les plugins officiels sont disponibles ici.

La classe Element

Element est la classe de base de MooTools, c'est par elle que l'on doit passer pour créer ou récupérer un noeud DOM.
Des getters et setters permettent de manipuler les attributs des noeuds, les styles et les événements :

 var myButton = new Element('button');
 myButton.set('text', 'Je suis un bouton');

Ci-dessous, un exemple de création d'un bouton plus complet utilisant la syntaxe JSON :

 var myOtherButton = new Element('button', {
   'class': 'BigButton',
   'html': 'Je suis un très gros bouton',
   'styles': { 'font-size': '14px', 'font-weight': 'bold' },
   'events': {
     'click': function(){ alert('Click'); },
     'mouseover': function(){ alert('Mouseover'); }
   }
 });

Le parcours de l'arborescence

La fonction $ permet de récupérer un Element unique :

 var buttonOK = $('btnOK'); // retourne l'Element ayant l'ID 'btnOK';

La fonction $$ permet de récupérer une collection d'Element :

 var forms = $$('form'); // retourne tous les formulaires
 var inputsWithValue = $$('input[value]'); // retourne tous les inputs ayant l'attribut 'value'
 var gifImages = $$('img[src$=.gif]'); // retourne toutes les images ayant l'extension '.gif'
 var buttons = $$('button', 'input[type=button]'); // retourne tous les boutons et les inputs de type bouton
 var bigInputs = $$('#form input.BigButton'); // retourne tous les inputs de classe 'BigButton' appartenant à l'élément ayant l'ID 'form'

A noter qu'il est possible de travailler directement à partir des noeuds DOM :

 var buttonOK = $(document.getElementById('btnOK'));
 var inputs = $$(document.getElementsByTagName('input'))

Pour les recherches qui doivent s'effectuer à partir d'un élément précis, il existe les fonctions getElement() et getElements() :

 var loginForm = $('loginForm');
 var loginInputs = loginForm.getElements('input');

Exemple 1 : création d'un bouton qui change le style de la page

Nous allons commencer par créer un bouton en HTML, avec un identifiant afin de le retrouver plus facilement.
Le code Javascript se résumera à l'ajout de l'évènement 'click' sur ce bouton et à la création de la fonction à appeler.
Cette dernière se contente ici de modifier la couleur du body et de la police, et d'ajouter un padding-left à tous les paragraphes.

Code HTML :

 <button id="btnStyle">Changer le style</button>

Code Javascript :

 window.addEvent('domready', function() {
   $('btnStyle').addEvent('click', changeStyle);
 }
 var changeStyle = function() {
   $(document.body).setStyles({ 'background-color': '#000000', 'color': '#ffffff' });
   $$('p').each(function(p) {
     p.setStyle('padding-left', '20px');
   });
 }

Les évènements

L'évènement 'domready' permet de lancer l'exécution d'une fonction lorsque le DOM est prêt, c'est-à-dire lorsque l'arborescence est prête à être lue et écrite.
La différence avec 'onload' est que la vérification ne se fait que sur le DOM et non sur les ressources annexes telles que CSS, images... etc...

 window.addEvent('domready', function() {
   alert('Traitement...');
 });

Les autres évènements sont les évènements Javascript traditionnels :
- boutons de la souris (click, dblclick, mouseup, mousedown, contextmenu, mousewheel, ...)
- mouvements de la souris (mousemove, mouseover, mouseout, ...)
- clavier (keypress, keydown, keyup, ...)
- fenêtre (load, unload, beforeunload, resize, move, ...)
- éléments (focus, blur, change, reset, ...)

Il est possible de créer un évènement personnalisé grâce à table Element.Events, puis de l'appeler comme un autre évènement.

Exemple 2 : création d'un évènement pour gérer le déplacement d'un conteneur

La première étape consiste à créer un container en position absolute et de lui donner un identifiant pour nous permettre de le récupérer rapidement.
A l'intérieur nous mettons une image, un avion qui va se déplacer lorsqu'on appuie sur la flèche de droite ou sur la touche D.
Puis, nous créons l'évènement, en lui fournissant un évènement de base, keydown, et une fonction précisant les conditions pour que l'évènement soit lancé.

Code HTML :

 <div id="plane" style="position: absolute"><img src="avion.png"/></div>

Code Javascript :

 Element.Events.planemove = {
   'base': 'keydown',
   'condition': function(event) {
     return event.key == "d" || event.key == "right";
   }
 };
 $(document).addEvent('planemove', function(event) {
   var image = $('plane');
   var pos = image.getPosition();
   pos.x++;
   image.setPosition({ 'x': pos.x, 'y': pos.y });
 });

Les classes

MooTools permet de créer ses propres classes.
L'héritage se définit par Extends et Implements, le premier permettant de redéfinir les variables et fonctions de la classe mère mais pas le second.
Le constructeur correspond à la fonction initialize.

Exemple 3 : création d'une classe Square pour dessiner des carrés sur la page

Afin de présenter l'héritage, commençons par créer une classe Shape.
Celle-ci ne définit qu'un constructeur, contenant les coordonnées du point d'origine de la forme à dessiner.
Puis nous créons la classe Square, qui hérite de Shape, et qui possède une largeur.
La fonction draw() nous permet de dessiner le carré dans le body, en utilisant un div correspondant aux positions et dimensions.

 var Shape = new Class({
   'initialize': function(options) {
     this.x = options.x;
     this.y = options.y;
   }
 });
 var Square = new Class({
   'Extends': Shape,
   'initialize': function(options) {
     this.parent(options)
     this.width = options.width;
   },
   'draw': function() {
     if (this.width) {
       var element = new Element('div', {
         'text': 'Carré',
         'styles': {
           'position': 'absolute',
           'top': this.x,
           'left': this.y,
           'height': this.width,
           'width': this.width,
           'background-color': '#AA0000'
         }
       }).inject(document.body);
     }
     return this;
   }
 });
 var square = new Square({ 'x': 300, 'y': 30, 'width': 100 });
 square.draw();

Les effets

La librairie utilisée est MooFX, disponible également pour Prototype.
Les effets utilisent des transitions, une transition pouvant être linéaire, cubique, élastique... etc...
Les effets présents dans le Core sont Tween et Morph, le premier permet d'appliquer une transition sur une valeur CSS, et le second de le faire sur plusieurs.

Exemple 4 : création d'un menu simple qui apparait lorsqu'on clique sur un bouton
Attention, cet exemple requiert un plugin disponible sur le site officiel, Fx.Slide.

Le menu ci-dessous se compose d'une liste de liens affichés en colonne, et masqués (barre de menu).
Ils apparaissent et disparaissent lorsqu'on clique sur un bouton (flèche), avec un effet de glissement.
Remarque : le style (couleurs, images, marges...) doit être codé en CSS et donc ne se trouve pas ci-dessous.

 // Menus à afficher
 var menuLabels = [['Menu 1', 'http://mootools.net'],
     ['Menu 2', 'http://www.sfeir.com'],
     ['Menu 3', 'http://www.google.fr']];
 // Barre de menu
 var menuBar;
 // Classe créée pour la barre de menu
 var MenuBar = new Class({
   'initialize': function(items) {
   // Menus à afficher
   this.items = items;
   // Element de l'arborescence
   this.rootElement = new Element('div');
   if (this.items) {
     var l = this.items.length;
       for (var i = 0; i < l; i++) {
         var a = new Element('a', {
           'text': this.items[i][0],
           'class': 'Menu',
           'href': this.items[i][1],
           'events': {
             // Petit effet de rollover
             'mouseover': function() { this.set('class', 'MenuOver'); },
             'mouseleave': function() { this.set('class', 'Menu'); }
           }
         }).inject(this.rootElement);
       }
     }
   },
   // Fonction permettant d'ajouter la barre de menu à un élément parent
   // Le slide hide permet de la masquer instantanément au démarrage
   'appendTo': function(parentElement) {
     this.rootElement.inject(parentElement).slide('hide');
   },
   // Ouverture de la barre : on fait apparaître les liens avec la transition Bounce
   'open': function() {
     this.rootElement.set('slide', {duration: 'long', transition: 'bounce:out'}).slide('in');
   },
   // Fermeture de la barre : on fait disparaître les liens avec la transition Pow
   'close': function() {
     this.rootElement.set('slide', {duration: 'long', transition: 'pow:out'}).slide('out');
   }
 });
 // Bouton pour ouvrir le menu
 var opacity = 0.4;
 var openArrow = new Element('div', {
   'html': '&#9660;',
   'class': 'Arrow',
   'styles': { 'opacity': opacity },
   'events': {
     'mouseover': function() {
       this.setStyle('text-decoration', 'underline');
       this.fade(1);
     },
     'mouseleave': function() {
       this.setStyle('text-decoration', 'none');
       this.fade(opacity);
     },
     'click': function() {
       openMenu();
     }
   }
 });
 // Bouton pour fermer le menu
 var closeArrow = new Element('div', {
   'html': '&#9650;',
   'class': 'Arrow',
   'events': {
     'click': function() { closeMenu(); }
   }
 });
 // Fonction d'ouverture du menu : on change de flèche et on ouvre la barre de menus
 function openMenu() {
   closeArrow.replaces(openArrow);
   menuBar.open();
 }
 // Fonction de fermeture du menu : on change de flèche et on ferme la barre de menus
 function closeMenu() {
   openArrow.replaces(closeArrow);
   menuBar.close();
 }
 window.addEvent('domready', function() {
   // Création d'un wrapper en position absolute
   var menuWrapper = new Element('div', {
     'styles': { 'position': 'absolute', 'width': '100%', 'top': '0px', 'left': '0px', 'text-align': 'center' }
   });
   menuWrapper.inject($(document.body));
   // Création de la barre de menu
   menuBar = new MenuBar(menuLabels);
   menuBar.appendTo(menuWrapper);
   // Ajout du bouton d'ouverture
   openArrow.inject(menuWrapper);
 }

Conclusion

Cet article a présenté les bases de MooTools, c'est-à-dire comment manipuler les éléments, créer des classes et des événements.
Le framework contient d'autres outils, par exemple pour gérer les cookies, les requêtes au format XML, HTML et JSON.

La spécificité de MooTools est qu'il dispose d'un ensemble de classes qui en fait quasiment un langage de programmation complet.
Là où avec jQuery par exemple, la création d'un élément se résume à une copie de code HTML, MooTools utilise une syntaxe plus naturelle au programmeur objet, plus structurée et plus simple à maintenir.

La contrepartie est la nécessité de connaître un minimum Javascript et la programmation objet, ce qui peut rebuter ceux qui ne se sentent pas particulièrement à l'aise et qui souhaitent simplement avoir rapidement du code qui tourne.

De plus, MooTools possède une communauté moins importante que ses concurrents les plus célèbres, les principaux inconvénients étant les plugins moins nombreux, et le fait qu'on peut avoir un peu plus de difficulté à trouver des réponses à ses questions lorsqu'on se trouve face à un problème.

Le Motorola Droid (Milestone) débarque en France

Ce soir, j'ai pu assister à la soirée de présentation officielle du tout nouveau Motorola Droid (nommé Milestone en Europe), à l'occasion de sa commercialisation en France, et ce, dès ce soir.

Ce smartphone est un des plus attendus parmi les andro-phones : beaucoup y voient (espèrent) le tant attendu iphone killer. Pour preuve de sa popularité, à sa sortie aux états-unis (le 6 novembre), 250 000 exemplaires ont été vendus la première semaine...
Autre facteur faisant que ce téléphone attire l'attention (et pas des moindres) : il s'agit du premier téléphone équipé de Android 2.0.

Trêve de teasing, passons aux faits !

La présentation est lancée par Jacques Rames, président de Motorola France, qui nous annonce que :

  • Motorola a fait le choix d'Android en 2008, pour simplifier le développement multi-plateformes en interne et pour la facilité de déploiement d'applications (comparé à l'App Store d'Apple bien entendu).
  • Le Milestone est le deuxième téléphone Android de la marque et le début d'une longue série : Motorola projète de sortir pas moins de 10 smartphones Android en 2010, et souhaite devenir leader dans le domaine des smartphones (comme beaucoup me direz-vous).
Suite à cela, rueducommerce, qui sera - pour au moins les quelques semaines à venir - le vendeur exclusif du Motorola Milestone en France, nous annonce les tarifs :
  • à partir de 89 euros avec un forfait chez Bouygues Telecom ou SFR
  • beaucoup plus cher chez Virgin Mobile ou Orange (à partir de 189 euros et 219 euros !)
  • 549 euros le téléphone nu, sans abonnement
  Pour ceux qui le souhaitent, vous pouvez dès maintenant réserver ce téléphone en pré-commande chez rueducommerce. On nous a annoncé le début des livraisons mi-décembre (pour que tout le monde puisse avoir un joli Milestone sous son sapin de Noël ;)
Soit dit en passant, et ça aussi c'est Noël, jusqu'à fin décembre, pour le même prix, rueducommerce offre 60 euros d'accessoires en plus : un support multimédia (pour servir de mini-chaine hi-fi), et un support voiture (pour servir de GPS). Voir photo ci-contre.


Bien, l'aspect marketing et commercial étant passé, passons au côté technique !
Alors, qu'a t-il dans le ventre ce fameux Milestone ? Voici ses principales caractéristiques :
  • un écran très grand de 3,7 pouces (tout en restant compact)
  • le support du multi-touch
  • un processeur puissant cortex A8
  • une mémoire vive conséquente de 256 Mo (comme l'iphone 3GS)
  • un clavier physique AZERTY coulissant (pas comme l'iphone ;)
  • un appareil photo 5 MegaPixels avec flash double LED et auto-focus
  • un enregistreur vidéo (annoncé de qualité DVD !)
  • un mémoire interne de 8 Go extensible à 32 Go
  • WIFI, Bluetooth, USB 2.0, Micro-SD
  • un GPS, et un logiciel GPS développé par Motorola (malheureusement valable que 60 jours. Après, il faut passer à la caisse)
  • équipé de Android 2.0
  • équipé d'un navigateur intégrant Flash 10 (on va en reparler...)
Vous l'aurez compris, la liste des caractéristiques est plutôt alléchante, et il me tardait d'essayer concrètement l'appareil, pour voir s'il était à la hauteur de son impressionnante plaquette. Vous allez le voir, j'ai eu des bonnes et des mauvaises surprises. Petit retour d'expérience :
  • Tout d'abord, l'esthétique (c'est le premier truc qu'on voit) : on appréciera son grand écran, ses 4 boutons tactiles assez jolis, et une épaisseur assez fine pour un smartphone embarquant un clavier. Néanmoins, je le trouve un peu trop rectangulaire (peu arrondi), et le clavier est assez austère en comparaison au dernier LG GW620.
  • L'écran : l'écran est assez grand, et réagit très bien (écran capactif).
  • Le multi-touch : très fonctionnel pour le zoom sur les photos, et sur les sites internet. Par contre, ne marche bizarrement pas sur les maps (contrairement à un iphone...). Pour cela, il faut double-cliquer.
  • Le clavier : si je ne le trouve pas très esthétique, il est pour autant très efficace, le toucher est agréable et réactif.
  • La rapidité/puissance : globalement, la navigation est fluide et précise (l'écran capacitif aidant). J'ai noté toutefois quelques ralentissements lorsqu'on est sur le slideshow de photos.
  • Les photos : très bonne qualité de photo, même dans un endroit sombre, le double-flash marche très bien, et pas de flou. Les photos sont ensuite partageables sur facebook, myspace, picasa, ...
  • Les vidéos : j'ai été bluffé par la qualité des vidéos prises ! De même pour le son. C'est fluide, de bonne résolution et il y a un stabilisateur d'image. J'ai vu notamment une vidéo d'une piscine où on voit tous les détails des vagues. Par ailleurs, les vidéos sont partageables sur Youtube d'un clic.

Mais, me direz-vous, on est sur un blog technique et orienté développement/technologies, non ? Alors parlons de la star de ce Milestone, Android 2.0 :
  • La recherche : première fonctionnalité testée, la recherche intégrée dans le système d'exploitation. Le test est faussé par le fait que le téléphone est pour ainsi dire vide, mais néanmoins c'est convaincant. En quelques lettres tapées, on retrouve les contacts, les applications, les musiques de notre téléphone. Puis on le voit, dans un deuxième temps, il va chercher sur internet pour compléter la liste. Les résultats sont rapides, très pratique !
  • MySign : voici typiquement l'application qui m'a beaucoup plu. On dessine une lettre au doigt (qui peut être en fait n'importe quel geste), et il ouvre l'application paramétrée ! Très rigolo, mais aussi très ingénieux comme système de raccourci. Ce qui est particulièrement intéressant, c'est qu'on peut définir nos propres gestes, et leurs applications associées.
  • Intégration de Flash 10 dans le navigateur : il s'agit là de ma grande déception. Annoncé partout sur les plaquettes de Motorola, lorsque l'on va avec le téléphone sur un site Flash comme http://beta.parleys.com, on obtient un joli message indiquant que Flash n'est pas supporté... J'ai essayé avec d'autres sites, même problème... C'était de loin la fonctionnalité que j'attendais le plus (notamment d'un point de vue performance), et là, j'ai été très surpris et déçu de constater que ce n'est même pas fonctionnel. Les commerciaux nous ont expliqué que ce n'était pas la bonne version, mais je n'ai pas trouvé leurs arguments très convaincants.
  • Vive GWT et l'HTML 5 : Par contre, une application GWT 2.0 et HTML 5, ça marche très bien ! La preuve avec cette superbe application développée par SFEIR (^^) et qui fonctionne très bien sur le Motorola Milestone.

samedi 28 novembre 2009

Vidéo de présentation de la conférence pour le Web organisée par GET (Efrei)

Nous en avons déjà parlé sur ce blog.
Voici la vidéo très réussie pour présenter cette conférence :
Au programme :
  • Android : par Ludovic Perrier
  • GWT/Google Wave : par Didier Girard
  • Standard du Web : par Patrick Chanezon
  • Cocktail à 17h00
  • Atelier Android par le GTUG (Google Technologie User Group) à partir de 19h30
Inscrivez-vous sur le sur g-e-t.fr.

mardi 24 novembre 2009

GWT, en francais dans le texte

Le premier livre, en français, sur GWT est disponible dans toutes les bonnes librairies. Ce livre a été rédigé par Olivier Gerardin, un collègue de SFEIR Benelux.

Ce livre est le premier ouvrage intégrant un chapitre sur la nouvelle version de GWT : GWT2.

Félicitations à Olivier !

GWT – Créer des applications web interactives avec Google Web Toolkit

image

SLF4J & LOGBack : simplifiez-vous les logs


Mercredi dernier, lors de la première journée de conférences du Devoxx, Ceki Gülcü, nous a présenté deux framework de logs complémentaires SLF4J et logback.


SLF4J

Ceki Gülcü a d'abord commencé sa présentation par la présentation de SFL4J (The Simple Logging Facade for Java), qui consiste en une API (slf4j-api.jar) permettant d'harmoniser les appels de log dans le code Java quelle que soit l'implémentation choisie (log4j ou JUL par exemple). Il explique au passage la possibilité de brancher sur son application utilisant SLF4J une implémentation noop (no operation performed).

Le speaker (et créateur de SLF4J) présente ce dernier comme un potentiel doublon de commons-logging à quelques différences prêt comme le choix de l'implémentation choisie par le framework qui se fait automatiquement (dynamiquement) dans commons-logging et de manière manuelle (statique) dans SLF4J en important le jar adéquat dans le classpath :  slf4j-logj12.jar pour log4j, slf4j-jdk14.jar pour JUL (java.util.logging) ou encore logback-classic.jar pour utiliser logback.

Le speaker est ensuite passé aux choses plus concrètes en montrant quelques exemple d'appel SLF4J, il a notamment mis l'accent sur la possibilité d'utiliser des messages paramétrés qui ne seront construits (i.e. qui ne consommeront de ressources) que s'il doivent être affichés. Pour démontrer son propos il a donné l'exemple suivant :

La vieille méthode La méthode moins naïve mais verbeuse La méthode SLF4J, intelligente et concise
logger.debug("Nom="+nom);
if(logger.isDebugEnabled()){
    logger.debug("Nom="+nom);
}
logger.debug("Nom={}",nom);

Il a ensuite abordé les autres fonctionnalités offertes par SLF4J, parmis lesquelles :

  • L'accès au MDC (Mapped Diagnostic Context) qui permet d'attacher des variables de log à un Thread comme par exemple le login de l'utilisateur ayant fait la requête permettant ainsi de suivre les logs de sa session de manière triviale même au sein de logs complètement entrelacés. Les informations stoquées dans le MDC sont ensuite utilisables directement dans les patterns de log utilisés dans la configuration de la couche de logging.

  • Les Markers hiérarchisés qui permettent en quelque sorte d'affecter des tags aux différents logs. Les applications sont évidemment nombreuses mais Ceki Gülcü a donné un exemple assez simple où les Marker sont utilisés pour marquer les logs "confidentiels" et ou les différents Appender encryptent ces logs "confidentiels". Grâce aux Markers il est donc possible de créer des comportements spécifiques quelle que soit l'origine du log.

SLF4J a ensuite été abordé toujours sous l'angle d'un framework d'uniformisation des logs applicatifs mais cette fois-ci en regardant l'intégration de ce dernier sur des projets utilisant déjà un pou plusieurs systèmes de logs. Il est aisin possible de créer une véritable passerelle entre commons-logging, log4j, JUL avec SLF4J afin de centraliser la gestion et la configuration des logs d'une application. Pour cela il suffit de remplacer les jar d'implémentation du (des) système(s) utilisés (comme commons-logging.jar ou log4j.jar) par des jar d'interception de logs (respectivement jcl-over-slf4j.jar et log4j-over-slf4j.jar). Dans le cas de JUL il faut cependant faire un petit effort de paramètrage (déclaration d'un logger dans le rootLogger).

Pour ceux qui auraient simplement envie de remplacer (et non pas aggreger) le système de logs de leur application, Ceki Gülcü a créé un utilitaire simple de migration vers SLF4J : le SLF4J Migrator

Logback

La créateur du framework nous a d'abord mis dans le bain en définissant LOGBack comme le successeur de Log4J, expliquant brièvement que LOGBack est simplement une évolution de ce dernier (par de rupture conceptuelle).

LogBack est divisé en 3 modules :
  • Logback Core : Module de base étendu par les deux autres modules
  • Logback Classic : Module de log des applications Java (implémente les API SLF4J décrites précédemment)
  • Logback Access : Module d'accès aux logs du conteneur de Servlet (Tomcat, Jetty)

Logback utilise Joran en ce qui concerne la configuration des logs, ce qui signifie qu'il est possible de décrire énormément de choses dans la configuration (contrairement aux configurations sous forme de XML répondant à une DTD statique ou de fichiers properties). il est par ailleurs possible de gérer les inclusions de morceaux de configurations et ainsi rendre le paramétrage des logs extrêmement modulaires au sein d'un projet de grande taille.

Durant sa démonstration des possibilité de logback, le speaker a aussi montrer qu'il est possible de publier des MBeans spécifiques à logback dans JMX et ainsi contrôler les logs dynamiquement via une console comme JConsole (c'est d'ailleurs comme ça qu'il rafraichissait son instance de logback lors des démos).

Filters

Logback offre, à l'instar de log4j, la possibilité d'utiliser des Filtres au sein de la configuration des logs, ce qui permet de prendre (ou non) des logs en fonction de leur correspondance à un filtre. Il est possible de créer des filtres sur des expressions Java complexes (grâce à Juanino qui compile les expression java contenues dans la configuration). On peut par exemple écrire une configuration comme celle-ci avec logback : 

<
appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
      
<evaluator name="myEval">
        
<expression>message.contains("contenu recherché")</expression>
      
</evaluator>
      
<OnMismatch>NEUTRAL</OnMismatch>
      
<OnMatch>DENY</OnMatch>
    
</filter>
    
<layout>
      
<pattern>
        %-4relative [%thread] %-5level %logger - %msg%n
      
</pattern>
    
</layout>
</appender>

Les expressions n'ont cependant à disposition que les informations contenues dans le LoggingEvent (dont par exemple le MDC, le timestamp de log, le logger, le marker racine ...). Pour plus d'informations sur l'utilisation des filtres, la doc se trouvent ici
Il existe aussi un tpe un peu particulier de Filtre dans logback qui sont les TurboFilter. ces filtres ne sont pas attachés à un appender particulier et sont donc appelés à chaque fois que le système doit créer une évènement de log (donc très tôt dans le processus de log). Il sont utilisés, comme leur nom l'indique, pour accélérer la prise de décision dans la gestion des filtres puisque si un appel au logger ne sera pas loggué à cause d'un TurboFilter (DENIED) alors aucun évènement ne sera diffusé dans le système. Les TurboFilter peuvent par exemple ressembler à ceci :

<
turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
    
<MDCKey>login</MDCKey>
    
<Value>bobby</Value>
    
<OnMatch>ACCEPT</OnMatch>
</turboFilter>

<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
    
<Marker>inutile</Marker>
    
<OnMatch>DENY</OnMatch>
</turboFilter>

Ceki Gülcü a poursuivi ses démonstrations avec le très intéressant SiftingAppender qui est capable d'encapsuler un appender paramétré (donc plusieurs appender différents au runtime) en fonction d'attributs qui peuvent provenir du MDC (ou d'une valeur par défaut). 
Grâce à ce dernier, il est par exemple possible de créer un appender par login ou par rôle dans une application de manière très simple et sans toucher ou presque au code Java. L'appender suivant définit par exemple un appender par rôle utilisateur en fonction de la valeur role (rôle de l'utilisateur exécutant la requête) contenue dans le MDC :

<configuration>
  
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
<discriminator>
      
<Key>role</Key>
      
<DefaultValue>ROLE_USER</DefaultValue>
    
</discriminator>
    
<sift>
      
<appender name="FILE-${role}" class="ch.qos.logback.core.FileAppender">
        
<File>${role}.log</File>
        
<Append>true</Append>
        
<layout class="ch.qos.logback.classic.PatternLayout">
          
<Pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</Pattern>
        
</layout>
      
</appender>
    
</sift>
  
</appender>

  
<root level="DEBUG">
    
<appender-ref ref="SIFT" />
  
</root>
</configuration>

Cette configuration stocke dans le fichier ROLE_USER.log les logs des utilisateurs n'ayant pas de rôle défini dans le MDC. On voit bien ici que plusieurs Appenders vont être instanciés avec chacun un nom différent (FILE-ROLE_USER pour l'Appender par défaut).

Ceki Gülcü a enfin terminé en soulignant une petite fonctionnalités tout à fait intéressante de logback qui permet de suffixer les lignes de logs d'une stacktrace d'erreur par le nom et la version du jar utilisé, ce qui permet lors du debug d'erreur de récupérer instantanément cette information cruciale. 

Exemple de log généré : 
java.lang.NullPointerException at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3] 
at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.5.0_06]
...

Synthèse

Pour terminer, nous pouvons dire que, étant nous mêmes utilisateurs de log4j sur nos projets quotidiens, Ceki Gülcü nous a convaincu que logback est bel et bien une évolution de Log4j (et non pas une révolution) et qu'il semble très attrayant de tenter de passer à ce nouveau framework (qui propose qui plus est nativement les API SLF4J) 
A essayer donc !

Ressources

Blog de Ceki Gulcu : http://ceki.blogspot.com/
Une présentation du Jazzon09 quasi-similaire à celle du Devoxx par le même speaker : http://beta.parleys.com/#id=357&st=5

lundi 23 novembre 2009

Silverlight 4...Encore une version?


Si Silverlight 2 était sans doute une révolution sérieuse devant Silverlight 1.0 (une révolution qui se présente dans l’utilisation du XAML, code managé, Expression Blend…), la version 3 de Silverlight reste une étape timide mais logique qui montre une certaine maturité et stabilité de cette technologie, Silverlight 3 est donc la version clé, graphiquement (avec ces nombreux contrôles rajoutées et l’amélioration de Blend) et au niveau logique (surtout avec le framework .NET RIA Services) du coup on peut finalement développer des applications riches, dignes de ce nom, avec une productivité très élevée…Mais la concurrence et la volonté de répondre par «Yes we can» à certain fonctionnalités basique comme l’impression, la gestion des photos, la webcam, etc. pousse Microsoft à « retoucher » légèrement la définition d’un principe majeur de Silverlight : La sandbox. La sandbox est l’environnement d’exécution sécurisé et sous SL2 et SL3 pas question de toucher au matériels, un idéal qui devient réalité. Et selon Laurent Ellerbach, directeur marketing de la division plate-forme et écosystème: « Silverlight reste exécuté dans une sandbox, mais pourra au besoin requérir des droits utilisateurs plus élevés pour certaines de ses actions ». Avec ce relooking on peut donc répondre « Yes we can », notamment à la partie multimédia : photos numériques, webcam, clé USB, GPU… Mais pas avant mai ou juin 2010, date de la sortie officiel le de Silverlight 4 (voir toutes les nouveautés).

Silverlight 4 ne représente pas seulement une version très puissante avec de nombreuses nouvelles fonctionnalités mais un virage intéressant dans la philosophie de cette technologie.

Site officiel Silverlight 4

Demonstration Silverlight 4 PDC 2009

La conférence "Innovation WEB" fait son retour

Le 4 décembre 2008, l'association GET (Google EFREI Technologies) organisait en association avec SFEIR une conférence sur les technologies Google.

Fort de son succès, une deuxième édition est programmée pour le 11 décembre 2009.

Cette année, il sera question d'Android, de Google App Engine, de GWT, de Google Wave et des standards du WEB (HTML5, CSS3, SVG).

Les intervenants de cette année seront Ludovic Perrier, Didier Girard et Patrick Chanezon.

Les conférences se tiendront de 13h30 à 16h30 dans les locaux de l'EFREI.


A la fin de la conférence aura lieu un cocktail, ce dernier sera suivi d'un atelier de développement Android organisé en association avec le Paris GTUG.

Pour plus d'informations, rendez vous sur le site de l'association.

Atmosphere, atmosphere


Au devoxx de cette année nous avons pu assister à la présentation du framework Atmosphere par Jean-François Arcand, créateur du framework et Paul Sandoz, contributeur sur le projet Jersey utilisé par Atmosphere en ce qui concerne les aspects REST.

Après une rapide présentation des concepts liés aux architectures PUSH pour les applications WEB. Les deux speakers sont rentrés dans le vif du sujet en développant en direct une petite application permettant de démontrer les possibilités offertes par Atmosphere.



Le PUSH ?

Dans les applications WEB, le PUSH correspond à l'utilisation des protocoles WEB pour permettre aux différents clients (navigateurs généralement) de se voir notifier des informations de la part du serveur sans avoir à faire des requêtes périodiques sur ce dernier. Comme son nom l'indique, les informations sont poussées du serveur vers le(s) client(s) et non plus tirées par chaque client désireux d'y avoir accès. L'intérêt d'une telle technique réside dans la possibilité de voir se propager rapidement une modification de l'état du serveur et atteindre ainsi un pseudo temps-réel tout en économisant des échanges réseaux inutiles. Avec le PUSH on peut par exemple dans le cas d'un tchat, propager les nouveaux messages d'une discussion du serveur vers les clients connectés de manière quasi instantanée.
Lors de cette conférence Jean-François nous a décrit les trois types de communications existantes dans les applications WEB à savoir :
  • Polling (technique traditionnelle)
  • Ajax PUSH  ou Long Polling : ce que propose Atmosphere
  • Http Streaming : Une technique idéale théoriquement mais qui souffre de problème d'intégration avec les proxys notamment.
Atmosphere est un framework (le premier) à base de POJO proposant aux développeurs d'applications PUSH une couche de programmation masquant la complexité des serveurs Java dans ce domaine.
Pour développer la partie serveur d'une application, le framework est utilisable sur de nombreux serveurs : des conteneurs legers (Tomcat, Jetty), certains serveurs d'applications comme Glassfish et Weblogic, il est même disponible pour le Google App Engine. Concernant ce dernier, on est en droit de se demander comment peut fonctionner le Long Polling avec des requêtes censées durer moins de 30s ? Jean-François nous a donné la solution en expliquant qu'Atmosphere implémente sont propre système de continuation permettant de passer outre cette contrainte. Il faut aussi noter la compatibilité d'Atmosphere avec les Servlets 3.0.

En ce qui concerne la partie cliente des applications, de nombreux frameworks sont supportés dont GWT et Wicket. 
Lors de la présentation, les speakers se sont focalisés sur une sous-partie du framework à savoir les annotations disponibles pour les POJOs et les aspects REST intégrés via Jersey.

Lors de la démo, les deux conférenciers ont pu nous démontrer la simplicité avec laquelle il est possible de créer une application WEB asynchrone utilisant le PUSH. Ils ont insisté sur le fait d'utiliser de simples POJO et de les rendre manipulables via REST. On obtient par exemple des classes ressemblant à ceci :

@Path("/{topic}")
@Produces("text/plain;charset=ISO-8859-1")
public class PubSub {
    private @PathParam("topic") Broadcaster topic;
    @GET
    @Suspend
    public Broadcastable subscribe() {
        return new Broadcastable("OK",topic);
    }
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Broadcast
    public Broadcastable publish(@FormParam("message") String message){
        return new Broadcastable(message,topic);
    }
}
L'idée principale de cette démo était d'utiliser Atmosphere pour suspendre la connection client lorsqu'il s'incrit à un topic "test" en appelant http://mon_serveur/test. Un autre client peut alors publier des messages qui seront diffusés à tous les clients connectés sur ce topic en soumettant un simple formulaire HTML contenant un paramètre "message" sous forme textuelle.

Ce que nous aurons retenu

Atmosphere simplifie effectivement le travail des développeurs en ce qui concerne la gestion du PUSH dans une application Java. Il n'est pas nécessaire de refondre entièrement une application existante pour y intégrer Atmosphere, la plupart des problèmes d'intégration sont adressés par le framework (gestion des proxys pour les connections HTTP, les limitations de chacun des navigateurs).

Resources:
Le site du projet : http://atmosphere.dev.java.net
Blogs :
Twitter : 
    @atmosphere_java 
    @jfarcand 

Ludovic Meurillon et Vincent Bostoen

Devoxx'09; un billet de plus!

Au lieu d'énumérer les présentations auxquelles j'ai assisté, je vais plutôt essayer d'en faire un petite synthèse. Pour commencer, j'aurais beaucoup aimé qu'il y ait eu quelques sujets en relation avec le mouvement 'NoSql' ou le 'Domain Driven Design', malheureusement ça pas été le cas, mais étant simultanée avec la QCon à San Fransisco, il suffirait alors de jeter un petit coup d'œil sur les speakers et le programme pour avoir la réponse (un autre coup d'œil sur les prix aussi :p).

En fait, le programme proposé traduit un peu l'année 2009 pour Java, mise a part EE6, trop peu de nouveautés et encore moins d'innovations; enfin, la encore si on considére que EE6 apporte de réelles nouveautés ou une quelconque innovation; j'aurais plutôt tendance a dire que c'est un re-mixage de quelques de-facto qui ont éclipsés la version précédente. Exception faite ce qui se passe du coté des 'NoSqlistes' avec des projets comme Hadoop et compagnie, qui n'étaient présent que par un petit BOF! Ce qui est a mon propre avis dommage car c'est un thème en pleine ébullition. Du coup, des sujets comme JDK7 ou Spring3 font encore et toujours l'actualité faute de relève mais aussi a cause du retard qu'ils ont eu par rapport a leur roadmap initiale. Seule l'annonce de adoption des 'closures' pour Java7 a créer un peu le buzz autour de ces sujets, quoi que personnellement j'en avais marre de cette histoire et la suivais plus depuis quelque temps. Autre chose qui a laissé sa trace sur cette édition, c'est la crise! Etant à ma première je pouvais pas vraiment m'en apercevoir, mais a en croire les habitués les traces sont assez flagrantes.

En ce qui concerne les présentations auxquelles j'ai assistés, j'en ai retenu spécialement celle de Cameron Puddy, intitulée 'Traditional Programming Models: Stone knives and Bearskins in the Google Age' dont je donne un aperçu a travers une citation tirée de ses slides :

« By 2021, there will be chips with 1024 cores on them. Is parallelism the tool that will make all these cores useful? John Hennessey has called it the biggest challenge Computer Science has every faced. He has credentials that might make you believe him. Allen says that it’s also the best opportunity that Computer Science has to improve user productivity, application performance and system integrity. - Phillip J. Windley ».

Je vous invite, d'ailleurs,a voir cette présentation sur Parleys soit dans les prochains jours en vous inscrivant à la chaine dédiée au Devoxx'09 ou gratuitement l'année prochaine.

Je citerais aussi le 'show' de Robert Martin dit oncle Bob pour la 2éme Keynote et vous invite de jeter un coup d'oeil sur le manifeste des 'artisants développeurs'. Et enfin, la présentation de iBeans, quoique la c'est plus le framework qui a retenu mon attention que la prestation de Ross Mason; En fait, je remarque que toutes les sessions durant lesquelles un framework était présenté par son 'créateur' étaient étrangement trop abstraites ou orientées tutoriel/document de référence, et il y avait un manque de mise en valeur des problématiques auxquelles répondait ou tentait de résoudre le produit en question.

En ce qui concerne le reste, je dirais pas qu'elles sont pas intéressantes mais plutôt que j'en espérais plus. Par exemple je suis resté sur ma faim sur un sujet qui m'intéresse beaucoup et qui était pourtant bien présent a travers trois ou quatre sessions et qui est la performance. En fait j'avais espérer retenir bien plus des Kirk Pepperdine, Dan Hardiker, Simon Ritter et Holly Cummins. Cela dit, comme mentionné par ces speakers ce problème est très difficile a présenté car trop liés aux cas concrets; la preuve, le peu d'ouvrages qui existent dessus.

Enfin, et pour conclure, je dirais que j'ai été globalement satisfait par cette participation et surtout par quelques discussions intéressantes avec d'autres participants, sans oublier les frites!

dimanche 22 novembre 2009

Paris Datageeks : premier meetup.

Cette semaine s'est déroulée la première rencontre Paris Datageeks (le 19 nov). Meeting informel qui prit place à La Karambole, convivial bar à DJ du 18ème arrondissement de Paris.

Paris Datageeks a été initié par Olivier Grisel, un passionné des technologies scientifiques touchant de près ou de loin aux données, à leur interprétation et leur compréhension. Par des machines.

Constatant un intérêt pour ces technologies autour de la capitale, Olivier Grisel prit l'initiative d'organiser cette rencontre, "juste pour voir". Un verre de vin pour les uns, une bière pour les autres, c'est de manière improvisée que se sont effectués les échanges entre les participants. "Qui fait quoi?", lance l'un d'entre nous. Le tour de table débute et la quinzaine se présente. Parmi nous, étudiants, chercheurs, ingénieurs de développement, gus de garage, entrepreneurs pour un nouveau monde numérique. Ou encore simples curieux.

On y parle linguistique appliquée, système d'information géographique (GIS), algorithmique, machine learning, intelligence artificielle, web sémantique. Très en vogue, les bases de données dites "NoSQL" sont évidemment de la partie. CouchDB, MongoDB, HBase, Redis. Traitement massif des données avec Hadoop/MapReduce. Les questions et retours d'expériences de chacun agitent les neurones d'une communauté de geeks passionnés.

Ces technologies sont encore jeunes, voir expérimentales. Parmi nous, peu ont osés les mettre en production. Mais la tendance du traitement des données en masse est belle et bien présente. Les géants de l'Internet comme Google ou Amazon ont fait leurs preuves avec ces technologies.

La soirée se passe, certains ont faim, d'autres repartent. Le meetup se termine dans un restaurant espagnol où tapas, paella et Rioja font bon ménage. J'ai vite été embarqué dans une conversation passionnée sur les Conditional Random Fields, la descente stochastique de gradient et la programmation vectorielle sur GPU.

Merci à Olivier Grisel pour l'initiative. En attendant de fixer le prochain meetup Paris Datageeks, rendez-vous à l'OpenDataCamp le 12 décembre 2009, à La Cantine.

vendredi 20 novembre 2009

Analyse de code avec maven

Intro

Maven, outil de build que l’on ne présente plus, nous rend encore un immense service en nous proposant de générer un site de présentation du projet.

J’aimerais dans cet article vous montrer les différents rapports de code que l’on peut ainsi  agréger et déployer, afin de présenter le projet ou pour en améliorer la qualité.

Je vous propose d’utiliser comme exemple un projet Open source hébergé sur googlecode, nommé gwt-mvc http://code.google.com/p/gwt-mvc/, choisi au hasard J

Voici le résultat : http://gwt-mvc.googlecode.com/svn/site/0.3/index.html


Rapports

 

Voici les différents plugins utilisés :

maven-project-info-reports-plugin http://maven.apache.org/plugins/maven-project-info-reports-plugin/

Plugin principal du site, permet de sélectionner les rapports de base

 

maven-javadoc-plugin http://maven.apache.org/plugins/maven-javadoc-plugin/

Génère la javadoc du projet.

 

maven-jxr-plugin http://maven.apache.org/plugins/maven-jxr-plugin/

Présente le code source avec des liens entre les classes, afin de pouvoir naviguer dans le code en dehors d’un IDE, pratique pour les projets Open Source.

 

maven-surefire-report-plugin http://maven.apache.org/plugins/maven-surefire-plugin/

Rapport de passage des tests unitaires.

 

maven-pmd-plugin http://maven.apache.org/plugins/maven-pmd-plugin/

Rapport de code avec PMD. Cela permet de vérifier la conformité du code avec des règles de codage prédéfinies. Ces règles peuvent être très poussées, mais la plus représentative est "Dans un  block catch, si une exception est relancées, elle doit être construite avec l'exception intiale en tant que cause". Inclus également le rapport Copy Past Duplication, mettant en avant les duplications de code. Il est même possible de bloquer le build en cas de non-respect de règle.

cobertura-maven-plugin http://mojo.codehaus.org/cobertura-maven-plugin/

Rapport de couverture de test.

 

maven-dependency-plugin http://maven.apache.org/plugins/maven-dependency-plugin/

Analyse des dépendances directes et indirectes, et distinction des dépendances : utilisée directement mais sans déclaration (directe), déclarées mais non utilisées.

 

versions-maven-plugin http://mojo.codehaus.org/versions-maven-plugin/

Rapport de mise à jour des dépendances et des plugins.

 

dashboard-maven-plugin http://mojo.codehaus.org/dashboard-maven-plugin/

Agrège les résultats de certains des rapports précédents, et les présente avec de jolis graphiques.

 

Intégration à Eclipse

Ces rapports étant éloignés de l’IDE, l’idéal est de pouvoir retrouver ces mêmes résultats au plus près du code, afin d’avoir deux outils complémentaires.

 

M2clipse http://m2eclipse.sonatype.org/ http://m2eclipse.sonatype.org/update/

Ce plugin permettra à Eclipse d’interpréter la configuration maven afin de compiler le projet.

 

JUnit

Intégré nativement à Eclipse, il vous permet de passer vos tests unitaires.

 

Eclemma  http://www.eclemma.org/ http://update.eclemma.org/

Eclemma vous permet d’obtenir votre couverture de test en utilisant emma. (Cobertura etait utilisé dans les rapports)

 

PMD http://pmd.sourceforge.net/ http://pmd.sourceforge.net/eclipse

Permet d’effectuer les contrôles du respect des règles de codage. Il est important de configurer ces outils avec le même ruleset, et de choisir avec précaution ces règles.

Ici, j’ai utilisé les règles proposées par le plugin PMD eclipse.

 

Conseils

Fixer les numéros de versions des plugins utilisés, afin d’avoir un build répétable.

Placer vos mots de passe dans les fichiers .settings, pas dans le pom, ou alors choisissez le mode interactif (vos identifiants vous seront demandés pendant l’execution).

 

Trucs et astuces

Pour afficher l’arbre des dependances de votre projet :

mvn dependency:tree

(Inclus dans le rapport « Dependencies » mais tellement pratique)

 

Pour savoir si vous utilisez la dernière version de vos plugins (y compris les rapports) :

mvn versions:display-plugin-updates

(Inclus dans le rapport « Plugin Updates Report »)

 

Problèmes rencontrés

J’aurais aimé pouvoir faire le site-deploy en une seule fois, mais wagon-svn ne fournit pas encore l’option qui permet de spécifier un fichier de configuration appellé auto-props, permettant d’associer un mime-type à une extension de fichier.

https://wagon-svn.dev.java.net/issues/show_bug.cgi?id=4

J’ai donc été obligé de générer le site dans un premier temps, puis de modifier les propriétés mime-type dans un second temps.

 

Recherche d’ artifact

Je vous conseille également les sites suivants pour « retrouver » des artifacts, leurs différentes versions, et sur quel repository ils sont disponibles.

http://merobase.com/

http://mvnrepository.com/

http://www.mvnbrowser.com/

 

Il existe des dizaines de sites proposant ce service, mais ceux-là ont un truc en plus, je vous laisse les découvrir.

 

Sources

http://beta.parleys.com/#sl=1&st=5&id=625

http://maven.apache.org/guides/mini/guide-site.html

http://blog.fastconnect.fr/?p=275

 

Bonne génératon de site.

 

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

 

            <modelVersion>4.0.0</modelVersion>

            <groupId>com.googlecode.gwt-mvc</groupId>

            <artifactId>gwt-mvc</artifactId>

            <version>0.3</version>

            <packaging>jar</packaging>

            <name>gwt-mvc</name>

            <description>

                        gwt-mvc Project, an MVC layer on Google Web Toolkit

            </description>

            <url>http://code.google.com/p/gwt-mvc/</url>

            <licenses>

                        <license>

                                   <name>The Apache Software License, Version 2.0</name>

                                   <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>

                                   <distribution>gwt-mvc-repository</distribution>

                        </license>

            </licenses>

 

            <repositories>

                        <repository>

                                   <id>maven2-repository.dev.java.net</id>

                                   <name>Java.net Repository for Maven</name>

                                   <url>http://download.java.net/maven/2/</url>

                        </repository>

                        <repository>

                                   <id>gwt-maven-repository</id>

                                   <url>

                                               http://gwt-maven.googlecode.com/svn/trunk/mavenrepo

                                   </url>

                        </repository>

            </repositories>

 

            <scm>

                        <!-- http://maven.apache.org/scm/subversion.html -->

                        <connection>

                                   scm:svn:http://gwt-mvc.googlecode.com/svn/trunk/gwt-mvc

                        </connection>

                        <developerConnection>

                                   scm:svn:https://${username}:${password}@gwt-mvc.googlecode.com/svn/trunk/gwt-mvc

                        </developerConnection>

                        <url>http://code.google.com/p/gwt-mvc/source/browse/</url>

            </scm>

 

            <distributionManagement>

                        <repository>

                                   <id>gwt-mvc-repository</id>

                                   <url>svn:https://gwt-mvc.googlecode.com/svn/repository</url>

                        </repository>

                        <site>

                                   <id>gwt-mvc-site</id>

                                   <url>

                                               svn:https://gwt-mvc.googlecode.com/svn/site/${version}

                                   </url>

                        </site>

            </distributionManagement>

 

            <build>

                        <extensions>

                                   <extension>

                                               <groupId>org.jvnet.wagon-svn</groupId>

                                               <artifactId>wagon-svn</artifactId>

                                               <version>1.9</version>

                                   </extension>

                        </extensions>

                        <plugins>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-compiler-plugin</artifactId>

 

                                               <configuration>

                                                           <source>1.5</source>

                                                           <target>1.5</target>

                                                           <compilerVersion>1.5</compilerVersion>

                                               </configuration>

                                   </plugin>

                        </plugins>

            </build>

 

            <dependencies>

 

                        <dependency>

                                   <groupId>com.google.gwt</groupId>

                                   <artifactId>gwt-user</artifactId>

                                   <version>1.6.4</version>

                                   <scope>provided</scope>

                        </dependency>

 

 

                        <!-- ControllerTestCase compilation -->

                        <dependency>

                                   <groupId>junit</groupId>

                                   <artifactId>junit</artifactId>

                                   <version>4.5</version>

                                   <scope>provided</scope>

                        </dependency>

                        <dependency>

                                   <groupId>org.jmock</groupId>

                                   <artifactId>jmock</artifactId>

                                   <version>2.5.0</version>

                                   <scope>provided</scope>

                        </dependency>

                        <dependency>

                                   <groupId>org.jmock</groupId>

                                   <artifactId>jmock-legacy</artifactId>

                                   <version>2.5.0</version>

                                   <scope>provided</scope>

                        </dependency>

 

            </dependencies>

 

            <reporting>

                        <plugins>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>

                                                           maven-project-info-reports-plugin

                                               </artifactId>

                                               <reportSets>

                                                           <reportSet>

                                                                       <reports>

                                                                                  <report>index</report>

                                                                                  <report>licence</report>

                                                                                  <report>dependencies</report>

                                                                                  <report>plugin-management</report>

                                                                                  <report>plugins</report>

                                                                                  <report>summary</report>

                                                                                   <report>scm</report>

                                                                       </reports>

                                                           </reportSet>

                                               </reportSets>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-javadoc-plugin</artifactId>

                                               <version>2.6</version>

                                               <reportSets>

                                                           <reportSet>

                                                                       <reports>

                                                                                  <report>javadoc</report>

                                                                                  <!-- <report>test-javadoc</report> -->

                                                                       </reports>

                                                           </reportSet>

                                               </reportSets>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-jxr-plugin</artifactId>

                                               <version>2.1</version>

                                               <reportSets>

                                                           <reportSet>

                                                                       <reports>

                                                                                  <report>jxr</report>

                                                                                  <!-- <report>test-jxr</report>-->

                                                                       </reports>

                                                           </reportSet>

                                               </reportSets>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-surefire-report-plugin</artifactId>

                                               <version>2.4.3</version>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-pmd-plugin</artifactId>

                                               <version>2.4</version>

                                               <configuration>

                                                           <targetJdk>1.5</targetJdk>

                                                           <rulesets>

                                                                       <ruleset>/pmd/pmd-plugin-rules.xml</ruleset>

                                                           </rulesets>

                                               </configuration>          

                                   </plugin>

                                   <plugin>

                                               <groupId>org.codehaus.mojo</groupId>

                                               <artifactId>cobertura-maven-plugin</artifactId>

                                               <version>2.3</version>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-dependency-plugin</artifactId>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.codehaus.mojo</groupId>

                                               <artifactId>versions-maven-plugin</artifactId>

                                               <version>1.1</version>

                                               <reportSets>

                                                           <reportSet>

                                                                       <reports>

                                                                                  <report>dependency-updates-report</report>

                                                                                  <report>plugin-updates-report</report>

                                                                                  <!--                     <report>property-updates-report</report>-->

                                                                       </reports>

                                                           </reportSet>

                                               </reportSets>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.codehaus.mojo</groupId>

                                               <artifactId>dashboard-maven-plugin</artifactId>

                                               <version>1.0.0-beta-1</version>

                                   </plugin>

                        </plugins>

 

            </reporting>

 

</project>

 

Unification reloaded

Deuxième journée de DEVOXX 2009, qui commence par une Keynote très attendue et à mon avis orientée BSBS "Be Simple Be Smart". Je m'explique : Ivar Jacobson , le père d'UML, est un personnage atypique qui n'a pas hésité pas à parler d'une réalité tout aussi controversée que la démultiplication des méthodologies où, selon ses termes, des pratiques qui ne cessent de fleurir régulièrement et qui génèrent beaucoup de problèmes d'apprentissage, de maîtrise, et bien évidemment de compréhension.

Lire la suite...

jeudi 19 novembre 2009

Devoxx 2009 : Agile Mythbusters

Scott W. Ambler, Chief Agile Methodologist chez IBM, a présenté les résultats des sondages réalisés par Ambysoft et Dr. Dobb's Journal pour faire ressortir les pratiques réelles des équipes agiles à ce jour.

Les conclusions qui ont retenu mon attention :

  • les pratiques agiles restent principalement concentrées sur la technique (Continuous Integration) ;
  • l'obtention de la certification "SCRUM Master" après seulement deux jours de formation est dépourvue de sens ;
  • des équipes de plus de 200 personnes pratiquent l'agilité ;
  • les pratiques agiles ne changent pas les besoins de chiffrage, de spécification, de modélisation, d'architecture durant l'initialisation d'un projet ;
  • la majorité des développeurs agiles suivent des conventions de codage même s'il reste une marge de progrès dans ce domaine ;
  • les équipes agiles et traditionnelles écrivent autant de documentation et cette documentation est de qualité similaire ;
  • les projets agiles connaissent plus de succès que les projets classiques.

L'intérêt principal de cette présentation a été de fournir des réponses chiffrées aux questions que peuvent se poser les personnes s'intéressant aux méthodes agiles. Cependant, il convient de considérer ces chiffres dans leur contexte avec les limitations que ça implique. Par exemple, les conditions de succès d'un projet restent sujet à discussion.

Pour la liste complète des "Mythes Agiles" et les résultats des sondages associés, se référer au post de Jevgeni Kabanov.

Pour la liste des sondages, suivre ce lien.

mercredi 18 novembre 2009

Flash Catalyst

  • Flex est un framework open source pour créer des applications web riches
  • Flash builder : Plugin eclipse pour construire des applications flex
  • Flash Catalyst : Logiciel pour faire le lien entre le designer et le developpeur flex.

Flash Player 10 est maintenant présent sur 93,5% des ordinateurs connectés dans le monde, en seulement 10 mois après sa sortie, et est disponible sur tous les navigateurs et systèmes d'exploitation.

Il possède une large communauté en s'ouvrant à elle de plus en plus (les spécifications FLV, SWF, AMF, RTMP sont ainsi disponibles).

Flex :

  • MXML : interface
  • Action Script 3 : code

Compilé en un fichier .SWF et exécuté par le Flash player ou packagé dans un fichier AIR et exécuté sur l'ordinateur.

Jusque-là, le designer visuel (qui utilise Photoshop et Illustrator) et le designer d'interactions (Flash) envoyaient leurs fichiers aux developpeurs qui s'occupaient d'intégrer tant bien que mal le tout dans l'application.

Flash Catalyst permet une interaction directe entre le designer graphique et le designer d'interaction mais aussi avec l'utilisateur qui peut tester le prototype et enfin le developpeur qui peut alors importer et utiliser tout ce travail directement dans Flash Builder.

Flash Catalyst permet de faire des interfaces en wireframes pour rapidement valider l'organisation d'une application. Des fonctionnalités de base pour dessiner des formes sont possibles mais le plus important est peut-être le fait de pouvoir créer les différents états (ou pages) de notre application et définir simplement les actions basiques possibles (clique sur un bouton et changement de page). Il est aussi possible de définir les effets entre les états de l'application.

Ce qui est vraiment le plus impressionnant est le moment où l'on importe un fichier photoshop (ou illustrator) créé par le graphiste qui contient alors tous les visuels de l'application dans des calques ou des éléments différents. Il suffit alors de sélectionner le cadre et le texte qui représente un champ de saisie pour indiquer à Flash Catalyst de le transformer en TextBox Flex qui prendra alors l'apparance définie par le graphiste.

On peut ensuite créer un composant personnalisé qui pourra être réutilisé dans une autre application.

Une fois l'interface définie, on peut directement prévisualiser le rendu directement dans le flash player.

Une fois la partie de design et d'intégration terminée, il suffit alors de générer un projet flex. En ouvrant le projet avec Flash Builder, on y retrouve tous les composants créés, mais aussi les images et tout ce qu'il faut pour faire fonctionner le projet. Une nouveauté dans Flash builder, la possibilité de configurer simplement l'accès aux données via de nombreux services (blazeDS, PHP, HTTP, etc.), des assistants nous permettent d'afficher les services disponibles sur le serveur et de les plugger aux composants de l'interface.

La démonstration est vraiment convainquante. 

DEVOXX 2009 - Conference Day 1 - Keynote

Premier jour à DEVOXX 2009 pour SFEIR, et premier jour de la partie "Conference" de DEVOXX.

Ca commence fort : Stephan JANSSEN (principal organisateur de DEVOXX) demande s'il y a des gens de SFEIR dans la salle, en précisant qu'on est venu à 24 au total ! Nous sommes surpris de notre popularité !







Stephan JANSSEN enchaine alors par quelques chiffres clés afin de se rendre compte de l'importance de l'événement :
- 8e édition
- plus de 2500 inscrits
- 737 entreprises
- 212 étudiants
- 132 sessions
- 120 speakers
- 56 JUGs
- 36 pays
- 19 partenaires

Il poursuit sur la présentation de Parleys.com V3, la plate-forme de e-learning dont il est le principal contributeur, et qui fête aujourd'hui ses 3 ans. Cette version est actuellement disponible sur : http://beta.parleys.com
Au programme des nouveautés de cette V3 :
- la possibilité de créer des espaces
- la possibilité de personnaliser son espace (par CSS)
- la possibilité d'avoir sa propre URL (monnom.parleys.com) pour son espace

Au programme de la version suivante (V4) :
- un client iphone (Stephan souligne que c'est à cause du système de validation de l'Apple Store que cette évolution n'est pas présente dans la V3)
- un système de pay-per-view, qui permet au visionneur de rémunérer le speaker de la session.

Il a également annoncé que comme l'an dernier, toutes les vidéos de DEVOXX 2009 seront publiées sur parleys.com tout au long de l'année (à hauteur de deux sessions par semaine) et disponibles gratuitement.
Pour ceux qui seraient pressés d'avoir accès à toutes les vidéos, une formule payante (49 euros pour 6 mois d'accès illimité) sera possible et permettra seulement une semaine après DEVOXX 2009 d'avoir un accès complet et illimité à toutes les vidéos des conférences.
Courage au passage à l'équipe DEVOXX, car à mon avis, la semaine après DEVOXX, ils auront du pain sur la planche...

Après Parleys, un speaker Oracle a expliqué sa vision du futur de la plate-forme java.
Une démonstration a été faite de Weblogic DM (pour Dynamic Modules), qui permet la modularisation en utilisant OSGI.
Je ne m'étendrai pas sur sa présentation qui, à mon sens, a peu apporté.



Puis Robert Chinicci (spec lead de Java EE 6) a présenté les grandes lignes de Java EE 6.
Il a annoncé que la date de version finale de Java EE 6 sera le 10 décembre 2009.
Il s'est attardé sur les principales nouveautés de Java EE 6 :
- JAX-RS : l'API pour développer des web services RESTfull, en utilisant uniquement des simples classes java (POJO) et des annotations.
- Bean Validation (JSR 303) : l'API pour définir des contraintes par annotation directement sur les entités métier.
Il sera intégré avec JSF et JPA pour que la validation soit automatique dans les frameworks associés. Par ailleurs, on pourra étendre les contraintes en créant ses propres annotations de contraintes.


- Web Profile : le premier sous-profil Java EE. Ce profil est en fait une sous-partie de Java EE 6, qui inclut les principales APIs utilisées pour développer des sites web. En plus de Servlet/JSP/JSTL/JSF, on pourra y retrouver des APIs plus poussées comme Managed Beans, EJB 3.1 lite, JPA et JTA. Ainsi, avec un serveur d'applications implémentant ce profil, on pourra réaliser des applications relativement complètes. Par contre, je vois mal Tomcat implémenter EJB 3.1 lite, JPA et JTA... On verra l'adoption de ce web profile par les serveurs d'applications.
- Servlet 3.0 :
Ont été ici cités : les web fragments, le fichier web.xml désormais optionnel, la configuration de servlets par annotation, la possibilité d'initialisation de librairies partagées, la registration de servlets par programmation (au démarrage), et la possibilité d'intégrer des ressources statiques dans les JARs des frameworks web.
Pour plus de détails sur cette API, vous pouvez lire notre compte-rendu de la soirée Servlet 3 & JSF 2 au Paris JUG.
- Dependency Injection : API permettant de standardiser l'injection de dépendance (JSR 299 et JSR 330).
En plus de l'annotation @Resource (existante dans Java EE 5), a été rajoutée l'annotation @Inject.
Les beans sont découverts au démarrage de l'application.
Possibilité de parcourir le métamodel d'injection, par l'API BeanManager
- EJB 3.1 :
ajout de l'annotation @Singleton (pour un EJB ayant une unique instance)
ajout de l'annotation @Startup (pour l'initialisation d'un EJB au démarrage de l'application)
ajout de l'annotation @Asynchronous (pour déclarer l'invocation d'un EJB comme asynchrone)
possibilité de définir un EJB directement dans un WAR
API EJBContainer pour pouvoir démarrer/exécuter un conteneur EJB dans une application Java SE ou pour les tests unitaires
- JSF 2.0 :
standardisation des facelets
définition de managed beans par annotation
intégration d'AJAX
et même une API JavaScript fournie
Tout comme Servlet 3.0, pour plus de détails sur cette API, vous pouvez lire notre compte-rendu de la soirée Servlet 3 & JSF 2 au Paris JUG.

Une démonstration a ensuite été faite de GlassFish V3, qui est l'implémentation de référence de Java EE 6.
On a alors appris qu'un plugin pour Eclipse existait et la démo en a attesté.
De la démo, on retiendra :
- un démarrage de Glassfish V3 en 3 secondes chrono (merci OSGi)
- une application web sans fichier web.xml (servlet définie par annotation uniquement)
- rechargement à chaud : on enregistre la modification dans Eclipse, on fait F5 dans son navigateur et ça marche ! Le tout en conservant la session utilisateur...
- démonstration de l'ajout simple d'un EJB directement dans l'application web : un EJB simple POJO avec l'annotation @Stateless, une servlet l'intégrant en variable d'instance (@EJB MonEJB monEJB), un appel à l'EJB dans la méthode doGet() de la servlet, hop, on rafraichit le navigateur et ça marche ! Bluffant de simplicité... au point que la salle applaudit
- démonstration de l'intégration d'un module OSGI dans la même servlet, toujours avec aussi peu d'étapes, et une intégration simple par annotation, on recharge le navigateur, et ça marche... Toujours pas de redémarrage du serveur d'applications, vraiment bluffant...


Enfin, Chet Haase (de Adobe) a montré l'ensemble de la gamme des produits d'Adobe, démo à l'appui.
On retiendra :
- Flash 10.1 optimisé pour être compatible avec des smartphones
- l'empreinte mémoire de la VM Flash 10.1 est globalement 2 fois inférieure à celle de la VM Flash 10.0
- une démo a par ailleurs été faite sur un smartphone de l'application parleys.com (qui fait du streaming vidéo), qui était particulièrement fluide.
- BlackBerry/RIM et Google Android sont en train d'intégrer Flash dans leur système
- Pour Apple/iPhone, ils ont indiqué qu'un outil permettait de convertir une application Flash en application iPhone SDK (démo à l'appui...)
- AIR 2.0 apporte plus de rapidité, et ouverture directe des fichiers dans le système d'exploitation
- une démo assez bluffante de Flash Catalyst : transformation de fichiers PhotoShop en une application Flash/Flex en quelques étapes (pour autant, il s'agissait grossomodo de la même démonstration que l'an dernier)

Ainsi se termine ce premier keynote, qui ma foi, fut assez intéressant !
 

- page 1 de 11