18 août 2008

GPL : la license des pros

La licence GPL a fait couler beaucoup d'encre, et canalisé quelques frayeurs - auxquelles j'ai moi aussi participé - sur son aspect "viral". Symbole d'un idéalisme du libre, elle s'est longtemps heurtée à la réalité du monde économique purement guidé par des considérations lucratives.

Aujourd'hui, retournement de situation, la GPL devient l'arme numéro 1 de l'entreprise désireuse de porter son outil fétiche. Quelques exemples au hasard :
  • L'excellent librairie EXT-JS
  • SpringSource Application Platform
  • Le framework de Lyria
  • et plein d'autres que je vous laisse découvrir...
L'idée derrière tout ça ? Fàce aux géants du logiciel et à des développeurs Java qui misent beaucoup sur l'opensource, la licence GPL assure à une société de ne pas se voir canibaliser son code (et ses bonnes idées) tout en touchant un public aussi large que possible.

S'il s'avère que SpringSource à raison avec sa "plateforme", à mi-chemin entre OSGi et JEE, IBM ne pourra pas lui piquer - même par morceaux - pour l'intégrer à Websphere 9.

Retournement amusant de situation pour cette licence pas comme les autres ;-)

des Logs pour GWT

Lors d'un développement GWT, le mode Hosted permet de deboguer à loisir depuis Eclipse, ce qui est extrêmement puissant si on compare aux solutions existantes pour le développement JavaScript.

Mais le debogueur ne fait pas tout, et l'utilisation de logs est un complément indispensable.

Petit coup de pub donc pour la librairie gwt-log, qui propose une interface de type log4j pour produire des logs.

Premier point, le code des logs sera totalement supprimé lors de la compilation par GWT pour la combinaison log_level=OFF. Ceci permet donc de ne pas pourrir l'application de production avec des logs. Une "variante" peut être compilée en mode log_level=DEBUG pour le développement, et l'ajout d'un simple paramètre à l'URL permet de la sélectionner - merci la gestion combinatoire du compilo GWT !

Second point, gwt-log sait envoyer ses logs vers à peut près tout ce qu'il est possible d'imaginer :
un [div] de debug, le shell du mode Hosted, la sortie standard (i.e. la console d'Eclipse), ou la console de Firebug pour les amateurs ... Chacun prendra ce qui lui convient le mieux !

En attendant que le projet log4gwt du même auteur murisse, c'est une solution simple, utilisant le mécanisme de compilation de GWT avec intelligence.

13 août 2008

GWT et JPA, main dans la main ?

J'ai raté la sortie d'Hibernate4Gwt en version 1.1. En plus de corriger quelques bugs, cette version est une mise à niveau pour GWT 1.5.

Pour ceux qui ne connaissent pas, H4GWT permet d'utiliser les entités Hibernate/JPA comme données dans une application GWT, ce qui comporte pas mal de complications techniques, habilement résolues par Bruno Marchesson.

Avec le support de Java5 dans GWT, et une "émulation" des annotations JPA, il devient possible d'utiliser le même modèle métier depuis la couche de persistance jusqu'à l'IHM web. Tout le code de type "contrôles et validation" peut alors être placé dans les setters du modèle, c'est à dire là ou il est finalement le plus logique de le placer !

Je n'ai pas pu tester personnellement (mon projet actuel ne s'y prête pas) mais l'idée me plaît beaucoup et me fait définitivement apprécier le concept phare derrière GWT : un langage et une plateforme pour toute la chaîne de développement.

inutile, donc indispensable


Je viens de découvrir le dernier jeux en Flash, très bien réalisé : labrute.

On s'y combat entre avatars, en mode "spectateur", autant dire un combat de lancé de dés. C'est donc totalement inutile mais absolument incontournable. Si vous avez deux minutes à perdre, venez vous frotter à mon avatar http://cyberloof.labrute.com/

Originalité du jeu (tout de même), la possibilité de revoir les combats passés, ce qui nous offre quelques perles, comme un Microsoft vs Apple.

Je regrette juste de ne pas pouvoir coller mon chocobo préféré comme personnage...
A quand un Final Fantasy en flash ?

31 juillet 2008

Sprechen sie Deutsch ?


Je pars en congé pour une semaine en Allemagne.

Sachant que j'ai fait Allemand première langue, avec 7 années de cours pendant lesquels mes profs se sont acharnés pour me faire comprendre le gérondif, ai-je une petite chance de savoir aligner deux mots ?

Déjà à l'époque j'étais très mauvais en Allemand (j'ai préféré présenter l'option "dessin" au bac), alors aujourd'hui il n'en reste plus grand chose.

Une pub pour des cours de langue dit "il vaut mieux apprendre le français que chercher à comprendre un Français qui parle anglais", j'ai peur de ne pas faire entorse à la règle :-/

update :

De retour d'Allemagne, après une semaine formidable, accueilli dans une famille d'une gentillesse inouïe, j'ai quelques kilos à perdre - la bière Allemande est vraiment excellente - et le retour à la dure réalité est un peu rude ...

Ce jumelage a été une expérience géniale, que je vous recommande si votre ville en propose un, et les 14h de car (!) sont vite oubliées.

règlement à l'amiable

Hier soir j'ai passé deux heures dans les locaux de l'Ordre des Architecte pour négocier une résolution à l'amiable du conflit qui m'oppose à Mme B... sur la rénovation de ma maison.

De mon point de vue, 11% de dépassement du budget, un retard conséquent (2 ans depuis le lancement du projet), une méthode purement pifométrique, une comptabilité pitoyable, et enfin une communication minable pour une transparence nulle.

Le médiateur qui s'est chargé du dossier a été très bon, ramenant le calme et ne cherchant pas à enfoncer l'un ou l'autre tout en soulignant les torts respectifs. On s'en sort donc avec une sorte de "50/50" de marchand de tapis, mais au moins l'affaire est close.

Heureusement que ce genre de situation ne nous arrive jamais à nous, Architectes Java ;-)

30 juillet 2008

Didier Girard vous invite à déjeuner

Didier ne se contente pas de faire des présentations sur GWT, il fait aussi des applications avec ;-)

Il lance aujourd'hui un projet sur googlecode : NouvelleCuisine. Il s'agit d'un portail web dans l'esprit d'un Netvibes ou d'un iGoogle, mais développé en GWT et uniquement basé sur des ressources statiques : pas de serveur au sens traditionnel ! Même la configuration se fait via une feuille Google SpreadSheet...

Un portail web pour 0€, infrastructure comprise, qui dit mieux ?
Que va t-il rester aux bon gros serveurs de Portlets ?

Si vous cherchez comme Didier un moyen rapide, élégant et moderne pour classer vos fiches de cuisine, c'est l'une des solutions à tester. Ca marche d'ailleurs pour plein d'autres utilisations ;-)

Amusant aussi de découvrir sur ongwt.com le compte rendu du commité de revue de l'architecture technique - comprendre le coin de nappe en papier de la cafet'.

28 juillet 2008

Didier Girard accepte l'invitation du BreizhJug

Didier Girard (application-servers, onGwt... c'est lui !) accepte l'invitation du BreizhJug pour venir animer la réunion d'inauguration, dont la date est fixée au 15/09.

Une excelente nouvelle pour le JUG, qui s'offre ainsi une inauguration en grande pompe avec un conférentier de talent sur un sujet "chaud". Si Google avait le bon gout de finalier GWT 1.5 pour cette date ce serait le top ;-)

27 juillet 2008

Google à la rescousse de Struts ?

Google utilise pour plusieurs de ses applications phare (addSense entre autre) WebWork2 ou Struts2. Mais pour faire fàce au problème de montée en charge de Struts2 - de nombreuses limitations ayant été trouvées dans OGNL puis dans les templates Freemarker - Google utilise son moteur de template maison.


La bonne nouvelle, est que ce moteur vient d'être ouvert en opensource : Google XML Pages

Ce moteur est largement éprouvé (après des années d'utilisation par Google sur des applications critiques), et bénéficie d'une compilation validant complètement la syntaxe, par opposition aux JSP basées sur des expressions EL qui ne peuvent être vérifiées qu'au runtime.


Les développeurs Struts n'ont pas attendu pour proposer l'abandon de FreeMarker au profit de GXP... Google va t-il sauver Struts2 de ses problèmes de performances ? Il faudra alors revoir le logo de Stuts2 :

09 juillet 2008

Un Java User Group pour Rennes


J'ai le plaisir de vous annoncer le lancement d'un Java User Group sur Rennes !

2008 sera l'année des JUGs en france, avec le lancement réussi du ParisJug et du ToursJug, et bientôt des initiatives sur Nantes et Bordeaux, mais on parle aussi de Toulouse, Metz, Brest ...

J'ai le plaisir de présider le BreizhJug et en conséquence de rechercher activement sponsors et conférenciers. Si l'aventure vous intéresse, que vous voulez présenter votre travail lors d'une de nos réunion, ou que vous connaissez quelqu'un que ça pourrait intéresser, ou encore que votre société cherche à promouvoir une image "techno-innovante" et est prète à nous épauler, n'hésitez surtout pas à faire connaitre notre email : team@breizhjug.org

04 juillet 2008

GWT, tests junit et MVC


Lors de la réalisation d'un prototype basé sur GWT, je me suis intéressé à la testabilité du framework. GWTTestCase est très décevant car il utilise un navigateur "hosted mode" caché et lance tout le module GWT. C'est donc un bon support pour des tests d'intégration mais nettement trop lourd (et particulièrement lent) pour des tests unitaires.

Je reprend donc mes marque-pages, et je relis cet article et celui-ci.

Avec GWT 1.5, l'utilisation des types génériques permet de créer un modèle simple pour la mise en oeuvre du pattern "Supervising Controller" :

D'abord la notion d'événement, dédié à un composant donné (nb: à cause d'un bug de blogger, j'ai mis des crochets pour la déclaration des types génériques) :

  1. public abstract class Event[T]
  2. {
  3. private T source;
  4. public Event( T source ) {..}
  5. }

..la source qui produit ces événements :

  1. public interface EventSource[T]
  2. {
  3. void addListerner( Listener[Event[T]] listener );
  4. void removeListerner( Listener[Event[T]] listener );
  5. }

..et une classe abstraite pour construire nos SupervisingControllers :

  1. public abstract class SupervisingController
  2. implements Listener[Event[T]]
  3. {
  4. protected T view;
  5. public abstract Object getModel();
  6. public void setView( T view )
  7. {
  8. this.view = view;
  9. view.addListerner( this );
  10. }
  11. }

Il suffit ensuite de définir la "vue" par une interface, comme dans cet exemple ma pop-up de login :

  1. public interface LoginDialog extends EventSource[LoginDialog]
  2. {
  3. String getLogin();
  4. String getPassword();
  5. void hide();
  6. }

Le contrôleur, lui, étend notre SupervisingController en le typant avec l'interface de la vue "supervisée".

  1. public class LoginController
  2. extends SupervisingController[LoginDialog]
  3. {
  4. private LoginService service;
  5. ...

.. et sur réception d'un événement de type 'validation du formulaire de login', il n'a plus qu'à invoquer le service RPC de connexion, mettre à jour les éléments visuels qui vont bien, et fermer la popup :

  1. public void on( Event e )
  2. {
  3. loginService.login( view.getLogin(), view.getPassword(),
  4. new AsyncCallback[Utilisateur]()
  5. {
  6. public void onSuccess( Utilisateur result )
  7. {
  8. view.hide();
  9. }
  10. } );
  11. }


Gràce au génériques, il n'y a pas de cast à déclarer et le code reste donc plutôt simple.

Qu'est ce que ça change ? Et bien maintenant, avec un simple Mock pour mon interface LoginDialog, et un service RPC de test, je peux tester dans un test jUnit classique la logique IHM de mon contrôleur. Elle est triviale dans l'exemple, mais vous devinez que la gestion d'un formulaire de 20 champs avec des controles croisés peut devenir un enfer sans un bon mécanisme de test.

Ce qu'il manque pour faire "encore mieux" :
  • un mécanisme de data-binding entre les widgets et un "modèle". Il existe quelques initiatives opensource, dont le succés et la pérennité sont à évaluer.
  • un spring-gwt, qui permettrait de déclarer dans l'exemple ci-dessus l'injection de la vue et du service RPC via une annotation @Resource. Dis Monsier Rod Johnson, tu peux m'inclure ça dans la roadmap spring 3.0 ;-)

02 juillet 2008

c'est quoi ce poussin ?

Suite à la demande de quelques un d'entre vous, je vous informe que le "poussin" qui apparaît en haut à droite de ce blog est en fait un (bébé) Chocobo, personnage issu du jeu Final Fantasy 7, l'un des rares jeu vidéo (avec Doom) auquel j'ai joué assidument.

21 juin 2008

mieux que l'eXtrem Progamming ?


Via le site perso d'un collègue je suis tombé sur cette méthode de développement, tout à fait dans la tendance "agile", et qui mériterait d'être mieux connue : la RACHE

En fait, je pense qu'elle est déjà très répendue, mais qu'on a pas forcément mis un nom dessus jusqu'ici. Un grand bravo aux créateurs de ce site !

20 juin 2008

Google App Engine : simple comme un coup de fil ?

Pour ceux qui ont raté le début, Google a lancé un service d'hébergement d'applications web basé sur son infrastructure massivement distribuée (on parle de cloud-computing). Autrement dit, même l'application web de votre club de fans de star treck peut potentiellement supporter un pic de traffic temporaire, gràce aux ressources énormes du "cloud", ce que ne permet pas un hébergement sur serveurs dédiés.

Lors du lancement, Google a offert 10000 clés au premiers inscrits. Intile de dire qu'elles sont vites parties et que comme beaucoup je suis arrivé après la bataille.

Google a changé sa stratégie, et on peut désormais obtenir une clé depuis un compte google par une simple procédure de vérification, qui consiste à donner son numéro de mobile pour recevoir la clé par SMS.

Premier point, c'est super : on va pouvoir tester G.A.E !

Deuxième point, d'où Google sort-il cette procédure d'enregistrement ?

Je suppute que Google prépare une attaque en règle du marché mobile, et profite de GAE pour se faire une base de donnée des n° de portable des développeurs web du monde entier... Faut il faire un rapprochement avec les téléphone basés sur androïd (l'OS google pour mobile), qui sont attendus en fin d'année ?
"We will use your phone number to send an invitation code in a SMS message to your phone. In accordance with the Google App Engine Privacy Policy, we will not use your phone number in any other way."
Vais-je recevoir d'autres "invitations" pour tester les nouveaux services mobiles de Google ???

Atelier RIA : Gwt vs SilverLight vs Flex

Valtech organisait jeudi une journée atelier RIA, une formule originale permettant de comparer sur le terrain Gwt, Flex et SilverLight. Ces trois noms dominent en effet (pour l’instant ?) le monde très actif des Rich Internet Applications.

Petite mise au point pour commencer : une Application Internet Riche n’est pas juste une application web bourrée d'effets visuels. Ce n’est pas non plus une application utilisant Ajax pour en améliorer l’ergonomie ou la réactivité.

Une RIA c’est une application qui a été conçue pour déporter sur le client la couche présentation, tout en conservant sur le serveur des services métier de haut niveau, autant que possible sans état. C’est donc à mis chemin entre le client lourd + serveur de données et le client léger + serveur web de présentation. Le serveur devient alors un conteneur de services métier, ce qui permet de converger avec l'approche SOA.Un exemple parmis d'autres, parleys.com (en version Flex ou Gwt) : le serveur héberge les vidéos et les indexes, toutes la mise en page étant gérée sur le client.

Bien sur, cela s’accompagne souvent d’effets graphiques haut de gamme pour se démarquer des applications web devenues trop statiques. Il faut bien un moyen d'accrocher l'internaute !


Quelle est la difficulté sur ce type d'applications ?

  1. la mutliplicité des technologies qu'on doit couvrir pour une même application : HTML + CSS + DOM + JavaScript + HTTP/Ajax + JSP + Java + ...
  2. les exigences de multi-plateforme, en particulier si on vise le monde mobile
  3. le delta qui existe entre un "hello world" et une application de 100 écrans, en particulier pour venir ajouter de nouvelles fonctionnalités

SilverLight est la solution RIA proposée par Microsoft, nécessitant un runtime encore peu répandu, mais qui pourrait rapidement se généraliser via le meilleur outil de promotion : Windows Update ;-)

La présentation SilverLight était assez décevante, trop orientée design pour un public de purs programmeurs, et ne connaissant pas l'outil Blend la première heure a quasiment été perdue. Nous sommes nombreux à en avoir eu une image négative, sans doute fausse par rapport à cette technologie. J’en retiens trois points majeurs :

  • SilverLight et les outils qui l’accompagnent manquent encore de maturité (nous avons utilisé des versions beta, avec de nombreux bugs). Nous n’avons pas utilisé Visual Studio, aussi c’est donc peut-être une fausse impression.
  • Le choix de Microsoft de séparer les outils de Design (Expression) de ceux de développement est discutable. Même en confiant ces rôles à deux personnes, on peut être amené à jongler entre les deux.
  • SilverLight a l’avantage d’être très homogène, client et serveur se programmant en C#, notion que l’on retrouve dans Gwt.


Flex utilise le runtime Flash 9, déjà installé sur de très nombreux postes.

La présentation Flex était très démonstrative, mettant en avant les capacités graphiques du format Flash. L’environnement FlexBuilder est très appréciable (175€), même si de nombreuses fonctionnalités habituelles en Java manquent (formateur de code, refactoring…). Flex permet de laisser aux graphistes le soin de préparer les objets Flash avec toute la puissance de cet environnement. La programmation nécessite cependant de se familiariser avec ActiveScript, pas infaisable mais pas immédiat non plus. Se pose aussi la question du débogage sur des applications ambitieuses. Flexbuilder est très aboutit et probablement indispensable pour envisager ce type de développement.

Pour ces deux premiers candidats, se pose la question de la disponibilité d’un runtime sur toutes les plateformes, en particulier sur mobiles, marché d’avenir pour ces applications.


GWT est un peu l’intrus dans cette journée. Il se positionne fonctionnellement très en dessous de ses concurrents, sans support pour des effets 3D ou vidéo. Par contre, il est le seul à ne nécessiter aucune installation de runtime.

La présentation GWT était plus une visite guidée d’une application GWT, mettant en évidence les principes clé. Le très gros point fort est le développement 100% Java, qui permet ainsi de coder/tester/deboguer sous Eclipse, par simples « save + refresh », et de bénéficier de l’environnement JDT pour « découvrir » l’API GWT. La programmation GWT est donc assez naturelle pour des développeurs Swing.


Absent de cet atelier, JavaFX, pour lequel je me pose pas mal de questions. Ne se programmant pas en Java, on ne retrouve pas les avantages de Gwt ou Silverlight. Générant une application type Swing, quelle différence de fond par rapport à Java Web Start ?


J’ai été impressionné par la facilité de construction d’une IHM Flex, et surtout par le très bon niveau de FlexBuilder, qui malgré la filiation du langage ActiveScript avec JavaScript propose un éditeur riche et assez proche de celui d’Eclipse pour Java. Je n’ai pas accroché sur SilverLight, ne serait-ce qu’à cause du langage C# qui m’est peu familier, mais c’est clairement une plateforme avec laquelle il faudra compter. Enfin, GWT a été très bien vendu par Sami ;-). Il reste tout de même un besoin de compétence pour la mise au point des CSS, tout aussi peu homogène au niveau des navigateurs, point qui n'est pas abordé par Gwt - domage.

Mes conclusions ?

  • Spring MVC + Spring JS pour des applications web classiques avec un bonus ergonomique, comme expliqué dans mon précédent post, cela permet une migraiton "en douceur" depuis Struts.
  • GWT pour des applications RIA de type « gestion », manipulant plus des données que des vidéos ou des effets 3D. Il faut cependant développer une culture "layout" des IHM.
  • Flex pour les applications « flashy » (c’est le cas de le dire), avec l’aide inconditionnelle de FlexBuilder.

17 juin 2008

Je vote Spring @MVC


Depuis X mois, je tergiverse sur le framework web que je compte "pousser" pour remplacer le vieillissant Struts 1.x.

Suite à SpringOne08 où j'ai suivi la session de Keith Donald sur Spring MVC 2.5 (rebaptise "@MVC"), WebFlow et spring JS, je penche nettement vers cette solution.

Certes, le produit n'est pas révolutionnaire - on reste dans du MVC classique. Mais ...
  • Son principe général, comparable à Struts (MVC oblige), facilite l'apprentissage pour les développeurs Struts : on peut expliquer chaque notion en se référant à l'équivalent Struts, par exemple pour la librairie de tags.
  • Les conventions et annotations permettent de réduire très sensiblement la configuration, ce qui est très appréciable
  • Le mécanisme proposé par Web Flow est un très net avantage, permettant de faire des IHM robustes
  • La documentation est de bonne qualité, avec de nombreux exemples
  • La pérennité de l'outil ne fait pas de doute
  • L'intégration Ajax et le support des widgets Dojo permettent de faire une appli raisonnablement sympathique, sans nécessiter des développeurs JavaScript / web 2.0.
Pour des besoins plus "sexy", je pencherais pour GWT, ou Flex, mais pour mon appli actuelle, plus que classique dans son approche, mais destinée à durer (...), je préfère miser sur un cheval fiable et qui sera toujours d'actualité dans X années.

download day

Download Day 2008
L'équipe chargée de la promotion de Firefox 3 propose de créer un record du logiciel le plus téléchargé en 24h.

Ca commence ce soir, alors jetez vous sur votre connexion ASDL préférée, en espérant que l'équipe de Mozilla à préparé une infrastructure réseau digne de ce challenge !

update :
C'est parti... et le site est difficilement joignable pour l'instant ... mais je réussi tout de même à lancer le download (7ko/s) - côté infrastructure, le pari est donc apparemment bien relevé.

A quoi sert cette opération ?
  • A attirer de nouveaux utilisateurs ? La grande majorité des "téléchargeurs" sont déjà utilisateurs de Firefox 2, voir d'une beta de la v3.
  • A faire parler de Firefox ... peut être, mais dans ce cas le sujet est mal posé. La comparaison avec les autres navigateurs n'est pas mise en avant par cette technique de vendeur de lessive

Alors ? A mon humble avis, le but est de faire parler de Firefox dans des médias qui n'ont rien a voir avec le sujet, genre "l'image du jour" à la fin de la météo, on le dernier titre du 20h qui aborde des sujets insolites. En effet, de très nombreux utilisateurs de Windows n'y connaissent vraiment rien en informatique et se contente de IE, sans même savoir qu'il existe autre chose. En faisant passer le nom "FireFox" dans des médias très grand public, on peut espérer pénétrer ce "marché".

C'est un peu comme le succès de MSN chez les jeunes. Un moins de 16 ans n'a aucune idée de ce qu'est une messagerie instantanée, par contre il se connecte tous les soirs sur MSN ...

10 juin 2008

en direct de SpringOne

Je vais consigner mes notes concernant la conférence SpringOne sur google docs

J'espère que cela servira à ceux qui n'ont pas pu s'y rendre pour X raison, et que ça donnera envie à ceux qui ne connaissent pas.

Je vais essayer de transcrire l'atmosphère à la fois chaleureuse et studieuse de ces conférences. Pour ma part j'y ai appris beaucoup de choses lors des précédentes éditions, bien plus que des formations "encadrées" si on sait suivre les pointeurs proposés par les intervenants.

09 juin 2008

springOne J-2



Encore deux jour avant l'édition 2008 de SpringOne.

Mes deux sujets cible : AOP et OSGi

AOP parce que je suis convaincu qu'on peut faire de grande chose avec les principes de programmation par aspects, mais qu'on en sous-estime la puissance au profit d'une approche plus procédurale.

OSGi parce que c'est un ovni pour moi : j'ai du mal à voir ce qu'il peut m'apporter, par contre je vois bien les contraintes qui l'accompagnent (gestion des "bundles", librairies qui ne marche plus à cause d'un Class.forName(x)...). Peut être des débuts de réponse au cours de ces deux jours.

Mon programme - sauf modification au fil de l'annimation locale :

day 1:
Spring 2.5 on the Way to 3.0
OSGi Programming Model
Spring Dynamic Modules for OSGi
Five Aspects You Don't Know About
dernière session ?

day 2:
Open Forum with Rod Johnson
Applying the Spring Frameworks for Model-Driven Architecture ou What's new in Spring MVC 2.5 and beyond
Inside SpringSource Application Platform
Making Sense of AOP Choices ou Classloading in OSGi - mince, c'est en même temps :-/
Spring Architecture and Best Practices ou Spring Web Flow 2.0 Deep Dive

Je me suis rapidement rendu compte qu'il fallait choisir sa session en fonction de l'interlocuteur : mon niveau d'anglais assez pittoyable m'oblige à sélectionner les "BBC-english-compliant-speakers". Un sujet apparement allèchant, si on ne comprend pas grand chose, n'apporte rien. Et pusi le but de ces conférences c'est aussi de voir autre chose. En fin de journée, quand le cerveau commence à fumer, on a parfois envie d'un sujet un peu différent, pourquoi pas RESTful Web Services in Spring ?

Si l'un de vous est également présent à cette édition, fait moi signe - je serais reconnaissable à mon joli sac Spring-one ... comment ça tout le monde en a un ? Bon alors, un petit mail et on partagera nos avis autour d'une barguette de frites ?

04 juin 2008

du javascript ... compilé ?

Les applications "web 2.0" utilisent de grandes quantités de JavaScript. Les librairies écrites dans ce langage font preuve de beaucoup d'effort pour obtenir les meilleurs résultats sans sacrifier une bonne structuration, mais les performances reposent toujours sur l'interpréteur JS du navigateur.

Si sur un PC "moderne" cela pose relativement peu de problème, c'est loin d'être le cas pour le marché du web mobile. Il est hors de question de faire ingurgiter des centaines de ko de script à un navigateur mobile en espérant des performances de haut niveau.

Or c'est le marché le plus porteur du web de demain ! Certains site orientés mobiles observent déjà une avalanche de requêtes "iPhone". Non pas qu'il y ait des millions d'utilisateurs du joujou d'Apple, mais plutôt que ceux-ci utilisent leur mobile comme station web, connectée en permanence, et donc ont un comportement très différent de l'utilisateur classique qui garde un oeil sur son forfait WAP 1h ;-)

Les développeurs de WebKit (le moteur commun des navigateurs KDE et Safari) annoncent leur projet SquirrelFish - comment peut on trouver des noms pareils ;-)
Il s'agit d'un moteur JavaScript utilisant un mode "compilé" des scripts sous forme de bytecode, ce qui permet d'excellentes performances.

Ils proposent également un benchmark qui permet de se faire sa propre opinion
http://webkit.org/perf/sunspider-0.9/sunspider-driver.html

Pour moi, ça donne sur mon PC (windows XP) :

IE7 : 46 172 ms
IE8 beta : ne s'installe pas chez moi, problème d'update invalide :-( il faut une version US ?
Firefox 2 : 34 946 ms
Firefox 3 rc1 : 5 256 ms
Safari 3 : 6 690ms
Safari + Webkit "nightly build" : 4 859ms -- soit presque 10fois mieux que IE7 !!

Bien sur, comme toujours, ce bench est probablement discutable et les résultats sur un seul PC ne sont pas représentatifs ...

OK, donc il suffit d'attendre la mise à jour du navigateur de mon mobile préféré pour lancer mon application "web 2.0" basé sur XYZ.js avec plein de plugins et qui en jette un max ?

Ce serait aller un peu vite... les ressources mémoire, bande passante et autres spécificités de l'Internet mobile sont peu considérées par les développeurs, peut être un peu trop habitués aux centaines de Mo d'un PC et au GHz de son processeur.

On trouve par exemple les recommandations de Yahoo sur le sujet. Une grande partie du temps de réponse apparent d'une application est imputable à l'ordre de chargement des fichiers qui composent la page web. En regroupant les scripts, images et les CSS, en les ordonnant et en comprenant le chargement d'une page on peu nettement améliorer sa réactivité.

Les premiers à bien mettre en pratique le web mobile occuperont le terrain ! Rien de tel qu'une application qui rame pour jeter le doute sur une technologie.

29 mai 2008

m2eclipse vs Q4e

m2eclipse et q4e ont tous deux vu leur proposition auprès de la fondation Eclipse acceptée. Voila qui ne nous avance pas beaucoup dans le choix d'une solution !

mon point de vue :

  • m2eclipse utilise des icônes plus sympa. C'est con mais c'est INDISPENSABLE pour une adoption par les utilisateur !
  • m2eclipse 0.9.4 apporte quelque changements qui le rend plus conforme à l'utilisation de maven en ligne de commande. On a donc moins de "surprises" lors de son utilisation
  • m2eclipse 0.9.4 supporte le plugin sysdeo-tomcat ! la réactivité de l'équipe de dev à mes demande sur ce sujet a été très bonne.
  • q4e inclut un outil d'analyse des dépendance, particulièrement attendu par les utilisateurs de maven : une version graphique et dynamique du "mvn dependency:tree", super pratique
  • q4e utilise par défaut les noms de répertoire physiques comme nom de project eclipse, et pas l'artifactId. m2eclipse propose un "pattern" qui permet par exemple d'avoir plusieurs versions du même module sous eclipse, très pratique pour reporter des corrections entre versions
  • le menu "import > existing project" de m2eclipse est au premier niveau, ce qui le met plus en valeur (il est visible par défaut) que celui de q4e (maven > maven project). C'est du détail mais ça participe à l'image de bonne intégration sous eclipse.

Espérons (on peut rêver) que l'intégration dans la fondation Eclipse fera peu a peu apparaître des points communs entre ces plugins, et pourquoi pas le début du premier pas vers un développement commun. C'est dommage toute cette déperdition d'énergie...

Il semblerait (à confirmer) que la fondation eclipse ait pour principe de ne laisser sortir qu'un seul plugin du processus d'incubation. On aura donc soit une fusion des plugins, soit l'élimination de l'un des deux. Reste a savoir dans quel délai...



Update :

J'ai raté ce message, double-posté sur les forums q4e et m2eclipse :

http://www.eclipse.org/newsportal/article.php?id=88&group=eclipse.technology.iam#88

On y vois le début d'une collaboration entre ces deux projets, quelques petites traces de règlement de compte - "nous aussi on l'a fait" - et des explications sur les incompatibilités techniques.

C'est donc un grand pas entre ces deux communautés, qui me laissent espérer un plugin de qualité pour dans pas si longtemps que ça ;-)


Update (07/2008) :

La version 0.9.5 de m2eclipse comporte désormais un éditeur de POM très propre et un analyseur de dépendance (arbre et graphe) très pratique. La dynamique semble être plus du côté de m2eclipse, mais de là à deviner ce qui va sortir de l'incubateur d'Eclipse ...


17 mai 2008

JBoss viole t-il la GPL ?

Le serveur d'application J2ee JBOSS est sous license LGPL.

Les librairies SUN pour les API Java sont pour la pluspart distribuées sous des licenses non compatibles avec la GPL, comme par exemple la CDDL (http://www.sun.com/cddl/).


Alors Jboss est-il hors la loi ?


Théoriquement, tout le code embarqué dans JBoss devrait être GPL-isé (c'est le principe de cette license "virale", qui envahit tout ce qui l'entoure). Le "L" de la LGPL permet juste aux utilisateurs de Jboss de développer des applications qui ne seront pas nécessairement sous license GPL.


Or les licenses des API Java SUN sont soit propriétaires (pour les plus anciennes), soit CDDL - license qui IMPOSE de conserver cette license pour le code. Le code des API ne peut donc pas devenir GPL.


Cas d'école me direz-vous, mais tout de même un bel exemple des effets de bord que peut avoir le choix d'une license... Voir par exemple le passage récent de LGPL vers GPL pour la librairie Javascript ExtJS. Une appli web qui l'utilise ne pourra donc pas suivre ses évolutions sans devenir elle même GPL ... sympa !

07 mai 2008

Maven et Eclipse

Maven est fondamentalement un outil en ligne de commande. Ceci n'empêche pas que de nombreux utilisateurs réclament une intégration sous Eclipse.

La communauté des développeurs Maven subit alors un schisme :
d'un côté, m2Eclipse (développé par Sonatype), de l'autre q4e (développé par Devzug)

Dans les deux cas, le code a été passé sous license EPL et proposé comme contribution à la fondation Eclipse. On est donc pas très avancé pour savoir lequel sera officiellement soutenu.

La co...erie dans l'histoire c'est que ces deux plugins sont très comparables :

  • import de projets maven (gestion multi-modules, téléchargement des jar et sources.jar, lancement des générateurs de code ...)
  • édition plus ou moins avancée des POM.xml (assistance à l'identification des dépendances)
  • lancement de maven "à la souris" - ça n'apporte pas grand chose
  • des jolis wizards, par exemple pour utiliser les archetypes
+ m2eclispe utilise des icônes plus sympas
- m2eclipse n'utilise pas les répertoires standard de maven : il compile dans "target-eclipse" et ne mappe pas les répertoires de ressources vers "classes".
+ q4e propose une vue d'analyse des dépendance très sympa

La principale fonction qui m'intéresse est l'import direct de projets maven. Et c'est la fonction la plus obscure et la moins configurable. Dans les deux cas, aucune idée de ce que le "embedded maven" exécute durant cet import, et en particulier, difficile de venir y ajouter sa conf ou ses plugins maison.

J'utilise par exemple le plugin sysdeo-tomcat-maven-plugin pour configurer tomcat :
  • pour q4e ... aucune idée (je n'ai pas trop cherché) mais ça doit être équivalent.
Je pense donc que je ne vais pas tout de suite renoncer au bon vieux mvn eclipse:eclipse

01 mai 2008

Spring-JS

Après Spring, Spring-MVC, Spring-WebFlow, Spring-batch, Spring-DM, etc, auras t-on bientôt droit à un Spring-JavaScript ?

--> http://jira.springframework.org/browse/SWF-451

En marge du projet Spring-WebFlow (dans la version 2.0), une couche d'abstraction semble développée pour permettre un accès aux librairies JS (Dojo et Ext pour l'instant) selon une logique "à la Spring".

"

The factoring out of a Javascript abstraction layer called "Spring Javascript" from Web Flow's JSF support. Currently, Dojo and Ext based implementations of this layer are provided. Spring.js provides:

  • A common interface for Ajax, regardless of which toolkit is being used under the covers
  • An aspect-oriented-like API for decorating HTML DOM nodes with behaviors, including client-side validation behaviors.
"

Le portage des idées de l'AOP dans le monde HTML/Javascript est intéressant. Après tout, les sélecteurs CSS sont un bon exemple de langage pour définir des "points de coupe".

Je n'ai pas creusé l'investigation plus loin, mais ce serait un très bon point, vu la prolifération de librairies JavaScript comparables sur de nombreux points, mais pas forcément facile d'accès, surtout pour un développeur 100% Java qui n'y connais pas grand chose aux (très nombreux) raffinements de JavaScript.

Plus d'infos sur http://static.springframework.org/spring-webflow/docs/2.0.x/reference/html/ch10.html

OSGi vs JEE


Pour ceux qui n'en aurait pas entendu parler, OSGi est (pour faire court) une architecture Java qui héberge à des applications décomposées en "bundles". Chaque bundle expose une interface "publique", la seule accessible aux autres bundles - d'où une sparation très propre. OSGi permet un redéploiement à chaud des bundles, des versions concurrentes, des mises à niveau "à chaud" ... bref plein de fonctionnalités alléchantes.

De son côté, JEE n'offre absolument rien de comparable (en standard : Weblogic permet par exemple une mise à niveau N+1 sans interrruption de service). Java en général n'offre pas de séparation "stricte" entre modules, bien que quelques JSR tentent de ratrapper le retard.

SpringSource - décidément très actif ce printemps - lance "SpringSource Application Platform". Pour faire très schématique, vous prener un conteneur OSGi (celui qui est au coeur d'Eclipse et de ses plugins), vous ajouter Spring-Dynamic-Modules (aka "Spring-osgi"), puis vous placez au dessus un Tomcat retravaillé pour l'occasion et vous déployez vos application web dessus.

Dans un premier temps ça ne change pas grand chose.

Maintenant vous remplacez votre WEB-INF/lib par des déclarations de bundles OSGi. Le war ne fait plus que quelques ko et toutes les librairies sont mutualisées. Une mise à niveau d'une seule librairie se fait sans interruption du service.
Bonus complémentaire, OSGi vous assure que vous n'utilisez pas "par mégarde" des classes interne d'une librairie, qui risque de changer ou disparaître dans une version N+1.

Et on peut aller plus loin en utilisant un packaging dédié ".par" pour construire l'application en bundles OSGi, tout en bénéficiant d'un des meilleurs moteur de servlet et de l'API servlet/JSP complète.

Personne ne sera surpris de voir les prochaines versions de Websphere, Weblogic, Jboss et autres proposer des passerelles vers les fonctionnalités OSGi.

Faut il passer sous SpringSource Application Platform ?

Dans ma vie à moi, je n'ai pas mon mot a dire et je me coltine toujours un Websphere 5.0.2. Le sujet n'est pas là. L'intérêt est que SpringSource propose une solution JEE + OSGi qui donne un apperçu de ce que seront les serveurs d'application dans quelques années.

Spring-DM de son côté propose un modèle de développement typiquement Spring (100% POJO) qui permet de passer à OSGi sans douleur - ce qui n'est pas gagné a priori vu les restrictions que cela implique sur la manipulation du ClassPath.

Autrement dit, jettez un oeil à la doc Spring-DM, apprenez les ficelles d'OSGi, comme ça dans quelques années, quand il faudra migrer dynosaure-2.1 sous Websphere-12-Adanced-OSGi, vous aurez déjà préparé le terrain.

Et pour ceux qui peuvent se le permettre, surfez sur la vague OSGi !

11 avril 2008

Hébergeurs ... tous aux abris !


Google vient de lancer la pré-version béta limitée (donc "web 2.0" ;-p) de son tout nouveau service d'hébergement d'application.


L'idée est simple : vous développez votre petite application web en utilisant toutes les ressources des API Google (BigTable, Google File System, ...) et Google se propose d'héberger l'application sur son infrastructure - y compris la promesse d'un réseau hautement fiabilisé, capable d'absorber sans broncher les pointes de traffic, et de supporter l'incompréhensible engouement des internautes pour votre site "mon-chien.net".

Google App Engine s'accompagne de son SDK pour aider au développement. Les applications sont écrites en Python, seul runtime supporté pour l'instant. L'architecture est prévue pour permettre à l'avenir d'autres langages/runtimes.

Quelle différence avec l'offre existante ?

Pour de "petits sites", PHP+MySQL est l'offre courante, mais généralement accompagnée de restrictions de traffic / bande passante / charge CPU. Aussi, vous devez être capable d'évaluer vos objectifs de traffic au plus juste, tout en n'étant pas à l'abris de rencontrer le succès. Rien de plus déplaisant que de voir son site préféré - devenu indispensable - "déménager" vers un autre hébergeur et être indisponible pendant plusieurs longues journées...

Pour les "gros sites d'entreprise", J2EE ou .Net, il faut maîtriser toute la chaîne d'hébergement - serveur, base de données, sécurisation, déploiement, monitoring ...

D'ou la question : quelle techno retenir pour mon site de vente de chewing-gums d'occasion ? Sans hésiter Google App Engine :
  1. Gratuit, dans la limite de restrictions très raisonnables (500Mo stockage, 5Mon pages/mois)
  2. Prométeur : le SDK va probablement s'enrichir pour faciliter l'accès aux services Google.
  3. Cool : c'est encoure tout chaud !

Seule limitations, bloquantes :

  1. je n'y connais strictement rien en Python
  2. Je ne fais pas partie des 10000 chanceux qui ont obtenu les ID de test de cette pré-version béta ;-(
Le bug n°1 dans la gestion googleAppEngine réclame le support de Java. Pas étonnant vu l'absence (presque) totale d'offre d'hébergement Java. Les PHP-iste se feront sans doute égallement entendre, mais ils n'en sont pas réduit à lancer tomcat sur leur PC perso accessible d'Internet par la ligne ADSL, eux !

Comme quoi, J2EE a raté quelque chose ! Ce n'est qu'une bonne grosse norme bien compliquée, bien vendue par les grands éditeurs, rapidement dénigrée (qui fait encore de l'EJB2 CMP ?), et inadaptée à l'hébergement mutualisé - vu l'absence d'offre.
La cause (à mon avis) étant l'impossibilité de :
  • limiter les ressources attribués à une application web (un while(true) {} et tout le serveur est bloqué) - sauf extension propriétaire ...
  • l'impossibilité de recharger les classes à chaud (c'est si simple de remplacer un .php)
  • le packaging inutilement compliquée (seul Axis2 fait pire)

Je pense qu'il y a une place à prendre pour les applications Groovy : sue la base d'une structure WAR (explosée), incluant les jars de librairies utilitaires, Chaque fichier .java peut être interprété comme un script Groovy. On pourrait donc modifier un .java et observer les effets immédiatement. -- juste une idée, si quelqu'un à du temps devant lui...

22 mars 2008

Google Web Toolkit

J'ai (enfin) expérimenté sérieusement GWT. Je suis assez bluffé par ce framework.

Mes essais précédents en terme de technos JavaScript se sont tous terminé sur la conclusion : "il va falloir sacrément former les développeurs". Aussi riche que soit une librairie JavaScript, il faut déjà quelques notions pour s'y attaquer. Par ailleurs, tester du code JS, même avec jsUnit, reste un point délicat - surtout si on veut l'effectuer sur un serveur d'intégration continue (en mode console).

GWT a l'énorme avantage qu'on oublie vite qu'on fait en réalité du code JavaScript. J'ai ainsi pu apliquer une jolie décomposition MVC (voir sur le sujet http://blog.springsource.com/main/2008/02/19/enabling-test-driven-development-in-gwt-client-code) sans gros efforts.

Paradoxalement, c'est peut être la plus grande difficulté de GWT : ne pas oublier qu'on développe du code qui sera sur le client : pas de commons-* sous le coude, ni de bean Hibernate !

J'en ai profité pour revoir le plugin gwt pour maven du projet Mojo, qui était plus ou moins à l'abandon (le compilateur GWT ayant le mauvais gout de faire un System.exit() !). Je compte lui ajouter un outil de génération de DTO à partir de beans JPA/Hibernate, à utiliser avec hibernate4Gwt. Mais je ne promet rien, c'est juste un élément de plus dans ma todo-list ;-)

Pour ce qui est de la richesse visuelle des widgets, GWT-ext ou myGWT fournissent une base déjà très intéressante pour faire de jolies applications.

12 mars 2008

formation : couper la branche sur laquelle on est assi ...

Je suis cette semaine en formation "architecture d'entreprise". Un mot clé (entre autres), la "souplesse", avec derrière la tête l'externalisation et tout ce qui va avec. Les workshops sont édifiants : réduction des couts, rationalisation, recentrage sur le coeur de métier, ... collaboration avec l'Inde...


L'exemple utilisé est très parlant : la major du service informatique qui sert de support aux exercices a une étrange ressemblance avec ma boîte, les mêmes objectifs et la même stratégie. Ce parallèle est parfois amusant mais aussi inquiétant si on considère que l' "exercice" est en cours d'application depuis deux ans. Elément rassurant (?), les "architectes" restent relativement bien placés dans les plans de délocalisation (appelons un chat un chat). La pyramide des postes en fance ressemble cependant dans les scénarios "full-india" à un arbre : un fin tronc et quelques feuilles plus touffues en haut.

Question : comment formera t-on à l'avenir les futurs ingénieurs si aucun poste de début de carrière n'est proposé en occident ???


Un billet un peu politique je l'avoue, mais après 8h de formation à "isoler" puis "externaliser" (quel joli mot) les services de l'entreprise "Lonely Heart", on se rapelle tout d'un coup que la branche sur laquelle on est assi n'est pas plus solide que celle du voisin...

09 mars 2008

[updated] quel framework web pour l'avenir ?








Suite à un commentaire de TeMs@ sur ce blog, je dois ajouter dans ma todo-list déjà bien remplie d'aller éplucher le site http://archetypejs.org/ pour évaluer la pertinence de cette solution comme remplaçant pour le bon vieux Struts, désormais à bout de souffle et mis à mal par les annonces de productivité des Ruby-on-rails et assimilés.
Après une première conclusion mettant struts 2 en avant, et quelques espoirs que je place dans les plugins "Convetion" pour rendre ce framework vraiment efficace, j'ai fait une courte expérimentation de Wicket. Je dois admettre que le changement profond de logique que propose ce framework est assez déroutant (par reflexe on cherche toujours le HttpServletRequest...) mais égallement très intéressant en terme de structuration forte des composants de l'IHM. On a enfin l'impression de faire du développement, et plus juste du bricolage.

Ce qui m'amène naturellement à ajouter GWT à la liste, dans le sens ou le développement en Java, le test en environnement émulé, puis le déploiement "100% javascript" sont des mécanismes extrêmenet innovants et rassurants pour des développeurs très orientés Java comme moi.

La liste de candidats risque donc d'avoir du mal à se réduire...

Ajouter à cela que j'ai essayé avec de bonne surprises jQuery et que je dois donc faire un choix de plus quand à mon environnement JS préféré ... je vais avoir de l'occupation cette année ;-p

08 mars 2008

CI : Hudson vs Continuum

La fondation apache héberge pour ses projets un serveur Continuum ET un serveur Hudson
(http://vmbuild.apache.org/continuum, http://hudson.zones.apache.org/hudson). Continuum étant développé en marge de Maven2, son intégration des projets Maven se doit (dervait?) d'être exemplaire.

Or le serveur Continuum est régulièrement dans les choux. Pas forcément à cause de Continuum bien sur, peut être aussi un peu à cause du serveur HTTP Jetty ou de la "zone" d'hébergement... mais en tout cas une migration sous Hudson est envisagée, au moins à titre expérimental dans un premier temps. Un sérieux revers pour Continuum !

J'utilise moi aussi continnum, tout simplement parce qu'il propose depuis le début la fonction "envoyer un mail à ceux qui on cassé le build", et surtout l'ajout automatique d'un domaine email aux IDs subversion pour identifier les fautifs. Et le rythme de développement d'Hudson est impressionnant !

01 mars 2008

Mon commutateur passe en Adsl2+. PErdu a fin fond de la campagne rennaise, je vais donc pouvoir dépasser le mégabit. Sauf que la migration ne se fait pas sans douleur... depuis mardi la freebox est bloquée et la console free m'indique un glorieux "Votre ligne est cours de cablage chez France Telecom".

Ma chère et tendre Delphine me maudit car elle devait profiter des vacances scolaires pour réviser son anglais sur le site de la BBC, afin de préparer son habilitation à l'enseignement de la lange de shakespeare...

Heureusement qu'il me reste le bon vieux modem 56k et la "connexion de secours Free". C'est pas vraiment du mégabit, mais ça permet tout de même de lire ses mails... et d'ouvrir en seulement 47 secondes la page d'édition de blogger.com !

spring france embauche !

Julien Dubois -- co-auteur de "Spring par la pratique" qui traine toujours sur mon bureau à côté de "Development without EJBs" de Rod Johson -- est sur le point de passer du côté obscur : "Directeur régional france", ça en jette ! Félicitations Julien (lecteur fidèle de ce blog - et oui, il y a des gens qui lisent mon blog !).


D'ici un ou deux ans, après un fort développement en terre francophone, on peut donc tabler sur la création d'un centre de développement SpringSource à Rennes, renommé pour l'occasion "printemps-framework" (suite à un gros investissement du groupe PPR ?). Je me permet donc de proposer d'avance mon CV si ça se confirme ;-)


Bon vent Julien !

26 février 2008

archiva passe sous Spring

Comme tous les outils de la communauté maven, Archiva (Maven Repoistory Manager) a été construit sur le conteneur Plexus. Qu'on aime ou pas sa philosophie assez spécifique, il faut constater que cet outil manque cruellement de documentation et est méconnu de nombreux développeurs, ce qui n'est pas le cas de Spring.

La liste de développement d'Archiva a réagit avec enthousiasme à la proposition de migrer sous Spring, malgré le gros effort que cela représente (il y a du plexus-* un peut partout).

Je développe un outil de transition, sous le doux nom de "plexus-spring", qui vise à exécuter des composants plexus dans un contexte Spring, en traduisant les fichiers de configuration plexus et les interfaces d'initialisation/destruction dans le vocabulaire Spring.

Après quelques errements dans les circonvolutions du code Spring, j'en suis venu à
  • Une transformation XSLT des descripteurs plexus en contextes spring
  • un namespace spécifique qui reprend dans spring les déclarations plexus.
  • une BeanFactory qui se charge de construire le composant plexus, en gérant l'injection directe dans les attributs.
  • Un BeanPostPorcessor vient compléter le tout pour gérer l'initialisation/destruction.
Et en bonus, une classe de test PlexusInSpringTestCase pour remplacer sans modification du code les PlexusTestCase.

Une idée apparemment bonne car on m'a tout de suite demandé le niveau de maturité de ce code pour l'appliquer sur Continuum ! Comme quoi plexus n'a pas vraiment que des admirateurs.

Udate 29/02 :
Je viens de démarrer pour la première fois mon application web Archiva, de la configurer et d'obtenir un premier Jar , tout ça avec Spring comme conteneur ! Il y aura probablement encore quelques ajustements à faire mais c'est très prometteur : grâce à plexus-spring, je n'ai eu aucune adaptation à faire au code d'Archiva !

02 février 2008

commons-monitoring - 2ème


A quoi sert System.nanoTime() en Java ? Qui a VRAIMENT besoin d'une précision en nanosecondes ?

Premier élément de réponse, System.nanoTime() ne fournit pas un compteur en ns, mais le meilleur compteur disponible sur le système. La précision réellement obtenue est donc ... indéterminée.

C'est d'ailleurs également le cas de System.currentTimeMillis(), qui sous Windows repose sur un compteurs standard de l'OS, ce qui permet à cette méthode d'être extrèmement rapide ... au prix d'une imprécision de 10 à 15ms ! Ennuyeux pour évaluer le temps de traitement des méthodes Java, qui sont régulièrement de l'ordre de quelques ms...

Sur le même Windows, System.nanoTime() est environ 100x plus lent, mais fournit une précisionde l'ordre de la microseconde (selon le hardware, la version Windows, le service pack et la conf système !) .

En résumé, System.nanoTime() fournit ce qu'il y a de plus précis sur le système hôte, et System.currentTimeMillis() un timestamp qui peut parfois être imprécis de 15ms.

"Write once, run anywhere" qu'ils disaient ! Si vous cherchez un compteur en secondes ça devrait aller. Pour faire plus fin, ... ça dépend. Donc dans le doute, on prend les nanosecondes et on ajoute un joli warning dans la doc :

"la précision des mesures peut varier de 1 à 10.000.000"

29 janvier 2008

commons-monitoring

Après une première expérience sur http://www.jmonit.org/, je reprend "from scratch" ma tentative de créer un toolkit de monitoring qui soit à la fois aussi simple que JamonAPI, aussi élégant que Moskito et aussi bien supporté que commons.apache.org.


Voici donc l'acte de naissance de commons-monitoring, largement inspiré de jMonit avec quelques ajustements. Et pour partir sur de bonnes bases, il sera utilisé sur un projet actuellement en production et qui nécessite de l'outillage pour justifier quelques soucis de fiabilité. De quoi être tout de suite confronté au "monde réel" et à ses exigences, plutôt que de batir un bel ensemble théorique pas vraiment utile.
Toute suggestion / remarque / contribution est évidement la bienvenue, ce qui est l'objectif de la démarche commons.apache.org "community-driven".

19 janvier 2008

Ma nouvelle vie sans Windows

Je peste a longueur de journée contre ce #%£@!! PC qui n'avance à rien, qui se fige dés que je supprime un répertoire dans un interminable "10 secondes restantes".

La cause ? Pour pouvoir utiliser Windows "raisonnablement" (installer quelques softs de base) on a besoin des droits d'administration, et on s'expose donc aux trop nombreux problèmes de sécurité, d'où la panoplie habituelle d'antivirus, scripts de sécurité, filtres en tout genre et firewalls réseau. Et comme la "politique de sécurité" est gérée au niveau "groupe", impossible de juste dire à l'antivirus de ne pas scanner mes .jar à tour de bras.

Il faut dire que la suite McAffee est particulièrement consommatrice en performances (en tout cas, telle qu'elle est configurée sur nos PC de bureau).

Je tente donc un passage sous Linux, en dual-boot. Non pas que je sois un défenseur du libre absolu, ou un extremiste du pinguoin, mais il faut reconnaitre que la très bonne sécurité et la (relative) confidentialité de linux sur les postes bureautique élimine de fait les risques de virus et Compagnie.

1er essai avec Ubuntu 7.10 :


  • tout mon matériel est reconnu
  • je peux accéder aux disques samba de mon domaine Windows
  • l'imprimante réseau est supportée

cool !

J'installe java6 et je lance un "java -version". La réponse est tellement immédiate que je ne la vois pas au premier coup, habitué à une certaine latence au lancement de java sous Windows...

J'installe Eclipse "de base", le démarrage est incroyablement rapide (en fait, le démarrage sous Windows est incroyablement lent).

C'est plus qu'encourageant !

Il me reste à installer tous mes plugins Eclipse habituels, importer les projets Java et faire un test "d'égal à égal".

Il faudra encore régler l'installation d'Office 2003 (via l'émulateur Wine) et la configuration d'evolution ou thinderbird pour Exchange... mais ça semble valoir le coup de quelques efforts.

Au pire, je demanderais un vieux PIII 500 pour consulter outlook et la doc projet, et je mettrais un petit KVM pour partager le clavier/souris.

J'ai aussi tenté le "ubuntu sous VirtualBox" mais ce n'est pas super concluant pour l'instant. Les perfs sont sensiblement aussi mauvaise que sous Windows, soit que l'émulation coute trop cher, soit que les "ralentissement" dus à Windows ne soient pas éliminés par l'émulateur.


NB : Mon Windows @Home est tout à fait performant, protégé par Avast, et Eclipse y est stable et rapide. Il ne s'agit donc pas de casser du sucre sur Bill, mais plutôt sur mon Responsable Informatique qui met en place une super-sécurité, mais pourrit notre productivité !


Update 24/01

Tout fonctionne sous Linux, ... sauf la bureautique.
  1. Je suis "emprisonné" dans les réflexes MS Office et j'ai bien du mal à me faire à OpenOffice
  2. L'émulation avec Wine permet de lancer Office mais je ne peux pas me permettre le risque de véroller la documentation projet
  3. Les "macros" et autres modèles nécessitent des montages Samba, pas super simples à mettre en oeuvre sous Linux.
  4. L'édition d'un fichier .pwt sous OpenOffice une fois ré-enregistrer en format "office" n'est plus utilisable ... compatbilité pas tout à fait au rendez-vous.

Je vais peut-être tenter le KVM avec un petit P800 pour conserver mon environnement de dev sous Linux et l'édition bureautique sous Windows ...

17 janvier 2008

journée chômée


Ce midi était programmé un contrôle électrique des installations, prévu "entre 12h30 et 13h30". Tous les serveurs, bases de données, etc sont arrêtés 'proprement' dès 11h30 et redémarrés progressivement en début d'après midi, provoquant une gène non négligeable pour tout le monde.

...Mais je suppose qu'effectuer ces tests le samedi coute plus cher que de demander à chacun un "coup de collier" pour compenser une ou deux heures de boulot perdues !

Sauf que cette année, ça a merdé : impossible de rétablir le jus à 13h.

Une après midi à jouer au flechettes, à discuter du dernier jeu pour la Wii, ou a improviser un basquet-corbeille à papier, ça doit pas être très bon pour les comptes ... en espérant du mieux pour demain .

A 17h, nous recevons la consigne pour le lendemain : se renseigner avant de venir ! Et le comble, une adresse web pour obtenir l'info ... hébergée sur le site perso d'un de mes collègues.

Pour une multinationale de l'informatique ça frise le ridicule le plus complet. Mais bon, on est tellement content d'avoir fait de belles économies sur le coût du contrôle électrique.

23 décembre 2007

services-web : Metro vs CXF vs Axis2

J'ai utilisé depuis X années Axis1 comme pile Soap, parfois avec douleur quand il a fallu rentrer dans le code pour identifier un problème de sérialisation... le code n'étant pas vraiment limpide !

Avec la norme Jax-WS et les "nouvelles" piles SOAP, d'autres solutions sont possibles. J'ai eu l'occasion sur un projet qui démare de faire une rapide évaluation :
  • Metro (implémentation de référence de Jax-WS, faisant partir du projet Glassfish)

A priori attractif, en raison de l'aspect "respect des standard". L'essai n'a pas été très concluant :

  1. la gestion des dépendances Maven est délicate, car on fait référence à un grand nombre de jars javax.* et com.sun.* qui sont dans le repository maven1 de dev.java.net. On doit donc jongler avec les repositories
  2. le plugin wsdl -> service, basé sur jaxb2.1 ne fonctionne pas sous Java6. Merci à Sun d'avoir pensé son API de manière si évolutive !
  3. le plugin plante sur mon WSDL, qui utilise des imports.
  4. le support pour Spring utilise un repository TRES surprenant : http://ndeloof.free.fr, mon site perso à moi que j'ai ! Celui sur lequel j'ai placé les -sources des jars Spring à tritre temporaire...
  • Axis2

Après le succes de fait de Axis 1 (faute d'alternative ?), axis2 semble la solution à suivre.

  1. D'après ce que j'ai pu lire, les premières versions ont été une calamité en terme de bugs
  2. Le plugin wsdl2java plante sur mon WSDL avec un joli NullPointerException
  3. Le POM.xml du projet fait référence à repo1.maven.org/maven1 + repo1.maven.org/maven2. Non seulement ce sont les repository par défaut, mais le premier est une redirection vers le second. Détail, mais qui montre le niveau de support pour maven2
  4. Le principe de packages un "aar" pour le déployer dans la webapp est hyper lourd. Je n'ai JAMAIS eu besoin de déployer à chaud un service web, sans avoir à relivrer toute l'application qui va avec. Je suppose qu'il y en a à qui ça sert, mais ça devrait n'être qu'une option.
  • Apache CXF (ex apache Cletix + codehaus Xfire fusionnés)

J'ai déjà entendu pas mal de bien de XFire, qu'en est-il de sa fusion avec Celtix ?

  1. La génération Wsdl -> service fonctionne. C'est déjà bien
  2. Les méta données Maven2 sont bonnes, via le repository de l'incubateur apache
  3. L'intégration avec Spring est triviale, via un namespace dédié et trois lignes de XML
  4. Un transport "local" permet de tester le service web (sérialisation SOAP incluse) sans déployer de serveur HTTP. Super pratique pour écrire des tests unitaires.
  5. Possibilité de tracer facilement les messages SOAP dans les logs : pratique

Pour ce qui me concerne, CXF est donc vainqueur par KO. J'ai pu développer et écrire un test unitaire pour mon service en quelques heures, en ne connaissant rien à l'outil à priori. La doc est claire et correspond à ce qu'on obtient réellement (ce qui est rare ;-p). L'intégration avec maven2 et Spring est très bonne, critère qui n'est pas forcément celui de tout le monde mais qui a son importance pour moi.

Mon second choix irait à Metro si les "petits problèmes" sont corrigés

Quand à Axis2 - "pourquoi faire simple ..." - moi qui cherche un moyen de faire du service web via juste quelques fichiers de conf, voila qu'il faut faire un projet dédié, packager un "aar", le déployer, créer des modules et je ne sais quoi... tout ça pour un "hello world" ?

20 décembre 2007

encore une boulette de SUN

J'ai voulu essayer la pile jax-WS Metro...

Si on met de côté le manque de support pour maven2 lorsqu'il s'agit de diffuser les Jars des API Java (il faut jongler avec les repository de dev.java.net), je suis tombé sur une de ces boulettes auquel Java nous a habitué :

Lancé sur Java6, la génération JaxB plante ... car l'API jaxb2 fait partie de java6 et metro utilise Jaxb2.1 - incompatible bien entendu.

Cette sale habitude de fourrer toutes les API dans le JRE sans possibilité de modularisation est pénible (qui n'a pas galèré avec les API XML ?). A croire que le terme "compatibilité ascendante" n'existe pas chez les membres du JCP ?

Pourquoi ne pas laisser au soft le soin de définir ses dépendances ?
J'ai besoin de JAXB ? Je précise dans mon MANIFEST ce dont j'ai besoin, et la JVM me fournit le classpath "qui va bien".
La JSR-277 apportera t-elle une solution de ce type ? A quand une généralisation d'OSGi ? Pourquoi aura t-il fallu attendre Java 7 pour que ce problème soit enfin pris en considération ?

update :

d'après ce lien, le dernier "update" de la JVM 6 de SUN intègre JAXB 2.1 en remplacement de 2.0. Comme quoi un petit update n'est pas forcément anodin !

Je trouve très domageable qu'une version mineure intègre une mise à jour d'API, avec le risque que deux applications "java6" ne fonctionnent pas pour cause d'update insuffisant.
J'ented déjà les problèmes arriver :
"
- je n'arrive pas à compiler le projet : j'ai une erreur xxx
- quelle version du JDK tu utilises ?
- la 6 !
- quel update ?
- quel quoi ?
"

15 décembre 2007

mvn eclipse:eclipse

En passant de maven 1 à maven 2, on corrige (entre autre) un défaut de maven 1 : on peut faire un "clean" sur un projet qui n'a encore jamais été compilé. Quel intérêt ? sur un serveur d'intégration continue, le tout premier build ne pouvait pas être du type "maven clean jar:install" !


Un autre bug gênant : pour configurer son IDE préféré (Eclipse dans mon cas, tout simplement parce que je n'ai pas pris le temps de tester Idea ni Netbeans !), on lance "mvn eclipse:eclipse". Et la, crac, la simple présence d'un projet EAR fait planter le build. La faute aux plugin eclipse qui exécute la phase generate-sources, seul moyen d'identifier tous les répertoires de code généré. On doit donc faire un "mvn install" avant de pouvoir bosser sous Eclipse. Mais alors, si le code sous SVN est buggé et ne compile pas ?... reste le bloc note pour corriger !

Je cherche un moyen de fixer ce problème. Deux options :
  • trouver une astuce pour que la résolution des dépendances n'échoue pas. Par exemple, enregistrer chaque module comme "artifact virtuel" pour qu'il ne soit pas recherché sur le repository. Seulement les composants interne de Maven sont un peu obscurs et pas trop ouverts à ce genre de "hack".
  • faire évouler l'API des plugins maven ("mojo") pour que le plugin eclipse puisse identifier les plugins générateur et le répertoire qu'ils créent. Pourquoi pas profiter du passage à maven 2.1, mais encore faut-il convaincre la communauté :-/

J'aurais peut-être du commencer par quelque chose de plus simple...

quel framework web pour l'avenir ?





Le constat est clair : fàce aux alternatives "modernes", Struts fait office de mammouth, au sens "pachiderme" du terme. Top de configuration et de classes à développer, même pour un simple hello world, alors pour coder une transaction de prise de commande étalée sur 5 écrans...

Problème, la relève s'avère un peu trop prolifique. Faut-il suivre Struts², Spring MVC - selon une approche assez classique - faire le pari des "Ruby-on-Rails-like" (Grails, Sails, Trails et j'en passe) ou encore passer à tout autre chose (Wicket ?). Sans évoquer l'option JSF, avec ou sans jboss Seam, ou Google Web Toolkit. Et pourquoi pas du pur HTML + JavaScript + services REST ?



Alors ? J'ai du mal a me faire une opinion tranchée, surtout que je n'ai mis en oeuvre aucun de ses frameworks à une échelle significative.

Un constat cependant : en tant que prestataire de service, je dois convaincre mon client du bien fondé d'un choix. Sails (au hasard) est peut être très bien, mais quel dirigeant en a entendu parler ?

Deuxième aspect, la taille de la communauté et/ou la documentation disponible. De ce point de vue, Struts2 et Spring MVC sont les plus vendeurs, avec Seam et GWT.

Troisième point, la capacité d'adaptation des développeurs. Exemple de Grails : même si Groovy n'est pas bien compliqué, ça fait un langage de plus à connaître, et de nombreux mécanismes "auto-magiques" à apprendre. De ce point de vue le duck-typing est sans doute super pour les cracks, mais surtout source de bugs et de difficultés pour les autres, qui préfèrent le bon vieux "ctrl+Expace" pour obtenir la liste des méthodes disponibles.

Enfin, les possiblités de sortie. Si le framework ne suffit pas, comment faire ?

De cette réflexion, de mon point de vue Struts2 sort grand vainqueur :
  • le simple nom "struts" est définitivement vendeur. Peut importe que le code n'ait rien à voir avec Struts 1, je sais que je n'aurais pas à batailler pour le vendre, ni à mon chef, no à mon client. Deux de mes plus gros soucis en moins ;-p
  • la communauté webwork était assez limitée, celle de Struts est énorme, même si une grande partie reste utilisatrice de la première mouture. La doc et les bouquins sur le sujet commence à s'étoffer, et devrait atteindre le seuil critique.
  • pour le développeurs lambda, passer à Struts2 va nécessiter de "désapprendre" Struts 1, mais comme struts 1 était trop souvent mal employé, ça ne sera pas si difficile ;-p. Le principe de base reste de type MVC, donc le fossé à franchir est raisonnable. Grails, JSF ou GWT nécessitent de revoir complètement les notions sur l'architecture d'une application web.
  • quand à dépasser les limites de Struts2, le nombre impressionnant de "plugins" qui viennent le compléter parle de lui-même. Déjà, smartURL (futur codebehind) nous promet de réduire au strict minimum la conf nécessaire. Scope nous apporte du Seam-like, avec le support des conversations et la "bijection" des données manipulés. REST permet de coder facilement des service web léger (je n'ai rien vu pour SOAP), GWT permet de s'intégrer avec une IHM GWT, etc.
L'avenir me donnera peut-être tort (je viendrais alors éditer cet article pour effacer toute preuve), mais parier sur Struts2 n'est probablement pas le pire des choix, même si ce n'est pas non plus le plus courageux.

Et JSF ? Un standard, ça devrait rassurer ! D'une part j'ai du mal à rentrer dans la logique de JSF (un peu compliqué tout ça), d'autre part je n'aime pas du tout les JSP "à la JSF", totalement illisibles à mon gout. Et avec Facelets ? Pour être honête, Facelets + Seam serait mon second choix, disons plus "engagé" que le très sage "passons de Struts 1 à Struts 2".

Pas simple tout ça ... d'un autre côté, on ne pourra pas se plaindre d'être forcé à utiliser une solution, comme c'était le cas avec ces magnifiques EJBs 1.x qui m'ont tant fait râler.

14 décembre 2007

premiers commits

J'ai effectué mes premiers commits sur Archiva, afin d'intégrer un meilleur support de Maven1.

Comme toute première fois qui se respecte, j'ai généreusement merdé :
  • commit "mis à l'index" faute de commentaire @since dans le code
  • build Continuum planté, suite à un cafouillage sur archiva-configuration

Heureusement mes petits camarades sont tolérants et m'ont gentiment remis dans le droit chemin, avec quelques indications sur les bonnes pratiques @Apache.org.