<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog Xebia France</title>
	<atom:link href="http://blog.xebia.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xebia.fr</link>
	<description>J2EE, Agilité et SOA</description>
	<lastBuildDate>Mon, 15 Mar 2010 17:49:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/</link>
		<comments>http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 17:43:45 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[SoapUI]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[SpringSource]]></category>
		<category><![CDATA[tc Server]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4198</guid>
		<description><![CDATA[

La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.
Actualité éditeurs / SSII

TC Server spécial printemps

Le coin de la technique

Html5 en action
soapUI ajout le test de JMS et AMF
Des tests unitaires expressifs grâce à Spock
JBoss simplifie les tests dans les conteneurs EJB

Evènements de notre communauté en France et à l'étranger

Salon "Solutions Linux Open Source"

La [...]]]></description>
			<content:encoded><![CDATA[
<p><img src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br />
<em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<p><strong>Actualité éditeurs / SSII</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#TCServerspcialprintemps">TC Server spécial printemps</a></li>
</ul>
<p><strong>Le coin de la technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#Htmlenaction">Html5 en action</a></li>
<li><a href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#soapUIajoutletestdeJMSetAMF">soapUI ajout le test de JMS et AMF</a></li>
<li><a href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#Destestsunitairesexpressifsgrc">Des tests unitaires expressifs grâce à Spock</a></li>
<li><a href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#JBosssimplifielestestsdanslesc">JBoss simplifie les tests dans les conteneurs EJB</a></li>
</ul>
<p><strong>Evènements de notre communauté en France et à l'étranger</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#SalonSolutionsLinuxOpenSource">Salon "Solutions Linux Open Source"</a></li>
</ul>
<p><em>La revue de presse de l'actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<h3><a name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3>
<h4><a name="TCServerspcialprintemps"></a>TC Server spécial printemps</h4>
<p>Plus besoin de vous présenter Spring TC Server dont nous avons déjà parlé plus d'une fois sur le blog. Pour mémoire, TC Server est un Tomcat intégré à la sauce Spring. La nouveauté de la semaine vient de l'annonce d'une édition spéciale du TC Server 2.0 pour le printemps. Le TC Server Spring Edition est <a href="http://www.springsource.org/node/2474" title="annoncé pour Avril" >annoncé pour Avril</a> et déjà mis à disposition des développeurs via la <a href="http://www.springsource.com/products/tcserver/devedition" title="Developer Edition" >Developer Edition</a>. L'offre TC Server se répartit donc maintenant en trois éditions différentes:</p>
<ul>
<li>L'édition <em>standard</em> qui intègre l'offre de base TC Server (Administration, Déploiement, Diagnostique par Thread et Heap dump).</li>
<li>L'édition <em>spring</em>, ajoute à la première offre, le monitoring automatique des applications déployées.</li>
<li>L'édition <em>developer</em>, intègre TC Server dans Spring Tool Suite pour que les développeurs puissent surveiller en temps réel les performances de leurs applications.</li>
</ul>
<p>C'est aussi l'occasion pour SpringSource de fournir une bonne intégration avec les solutions VMWare pour déployer et tester facilement sur des machines virtuelles. Pour notre bonheur à tous, SpringSource inscrit donc durablement son TC Server dans le paysage des serveurs J2EE et continue de participer activement au développement de Tomcat.</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la technique</h3>
<h4><a name="Htmlenaction"></a>Html5 en action</h4>
<p>Comme une suite logique à notre article <a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/" title="HTML5, les nouveaux éléments" >HTML5, les nouveaux éléments</a>, DevelopperWorks propose un <a href="https://www.ibm.com/developerworks/web/tutorials/wa-html5/section4.html" title="tutoriel HTML5 + CSS3" >tutoriel HTML5 + CSS3</a>. Après quelques rappels succincts sur ces deux standards, Joe Lennon propose de soumettre quelques unes de ces nouveautés à l'épreuve du feu. Un survol relativement complet, puisqu'il couvre la nouvelle structure de page, quelques nouvelles balises sémantiques, la vidéo, CSS3, les nouveaux formulaires et le <em>canvas</em>. Un complément intéressant pour tous ceux qui étaient impatients de découvrir ces nouvelles possibilités.</p>
<h4><a name="soapUIajoutletestdeJMSetAMF"></a>soapUI ajout le test de JMS et AMF</h4>
<p>Le célèbre outil de test de WebService, SoapUi, poursuit sa marche en avant, et ajoute de nouvelles cordes à son arc. <a href="http://www.soapui.org/new_and_noteworthy_3_5.html" title="La version 35" >La version 3.5</a> offre de nouvelles fonctionnalités particulièrement utiles aux développeurs travaillant sur des architectures web complexes, en particulier le test des ressources JMS.<br />
Les développeurs de chez EviWare n'ont pas réinventé la roue, et ont <em>seulement</em> intégré un <em>framework</em> robuste sur ce sujet, <a href="http://www.hermesjms.org/confluence/display/HJMS/Home" title="HermesJMS" >HermesJMS</a>. A vous les joies de poster / recevoir des messages JMS (texte ou xml), de manipuler les <em>headers</em>, de scripter vos files, et surtout d'automatiser vos tests d'intégration facilement.<br />
De manière plus anecdotique (à notre sens en tout cas), cette nouvelle version propose aussi un ensemble d'outils pour tester vos ressources JDBC.<br />
Enfin, dernière évolution majeure que nous n'avons pas eu l'occasion de tester, mais qui semble prometteuse, la possibilité de tester vos scripts AMF (Flash et Flex).<br />
Tous les tutoriels se trouvent dans la page de la <em>release</em> 3.5 (qui ne va bien sûr pas sans son lot de corrections de bugs).</p>
<h4><a name="Destestsunitairesexpressifsgrc"></a>Des tests unitaires expressifs grâce à Spock</h4>
<p><a href="http://code.google.com/p/spock/" title="Spock" >Spock</a> est une petite librairie de tests unitaires en Groovy permettant d'écrire un test sous le format spécification (le format given/when/then est aussi supporté) :</p>
<div class="syntax_hilite">
<div id="java-3">
<div class="java">def <span style="color: #ff0000;">"subscribers receive published events at least once"</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
      when: publisher.<span style="color: #006600;">send</span><span style="color: #66cc66;">&#40;</span>event<span style="color: #66cc66;">&#41;</span><br />
      then: <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>.._<span style="color: #66cc66;">&#41;</span> * subscriber.<span style="color: #006600;">receive</span><span style="color: #66cc66;">&#40;</span>event<span style="color: #66cc66;">&#41;</span><br />
      where: event &lt;&lt;<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">"started"</span>, <span style="color: #ff0000;">"paused"</span>, <span style="color: #ff0000;">"stopped"</span><span style="color: #66cc66;">&#93;</span><br />
    <span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
La <a href="http://pniederw.wordpress.com/2010/03/11/whats-new-in-spock-0-4-episode-1-data-tables/" title="version 0.4" >version 0.4</a> apporte la notion de "Data tables". On retrouve cette notion dans d'autres API (notamment <a href="http://testng.org/doc/documentation-main.html#parameters-dataproviders" title="testNG" >testNG</a>), cependant l'apport de Groovy rend le test vraiment très expressif :</p>
<div class="syntax_hilite">
<div id="java-4">
<div class="java">def <span style="color: #ff0000;">"maximum of two numbers"</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; expect:<br />
&nbsp; <a href="http://www.google.com/search?q=allinurl%3AMath+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Math</span></a>.<span style="color: #006600;">max</span><span style="color: #66cc66;">&#40;</span>a, b<span style="color: #66cc66;">&#41;</span> == c</p>
<p>&nbsp; where:<br />
&nbsp; a | b | c<br />
&nbsp; <span style="color: #cc66cc;">3</span> | <span style="color: #cc66cc;">7</span> | <span style="color: #cc66cc;">7</span><br />
&nbsp; <span style="color: #cc66cc;">5</span> | <span style="color: #cc66cc;">4</span> | <span style="color: #cc66cc;">5</span><br />
&nbsp; <span style="color: #cc66cc;">9</span> | <span style="color: #cc66cc;">9</span> | <span style="color: #cc66cc;">9</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Une petite librairie sympa à découvrir <a href="http://code.google.com/p/spock/wiki/SpockBasics" title="ici" >ici</a>.</p>
<h4><a name="JBosssimplifielestestsdanslesc"></a>JBoss simplifie les tests dans les conteneurs EJB</h4>
<p>JBoss vient <a href="http://in.relation.to/14773.lace" title="d'annoncer" >d'annoncer</a> une première version alpha d'un nouveau projet baptisé <a href="http://community.jboss.org/en/arquillian" title="Arquillian" >Arquillian</a>. Ce projet permet de simplifier l'écriture de tests unitaires qui doivent s'exécuter au sein d'un conteneur EJB. S'il est parfaitement possible de tester un <em>session bean</em> hors conteneur depuis l'arrivée de Pojos dans EJB 3.0, disposer d'un conteneur EJB permet de simplifier les injections de dépendance qui doivent être réalisées via l'annotation <code>@EJB</code> ainsi que les accès à des ressources propres au conteneur.</p>
<p>Conscient de cette problématique, pour laquelle l'univers Spring offre de nombreuses solutions, JBoss tente depuis plusieurs années d'apporter une réponse satisfaisante aux développeurs. Cette quête s'est engagée dès le développement des première versions de son conteneur EJB 3.0 avec le développement d'une déclinaison pouvant être démarrée depuis des tests et nommée Embeddable EJB (<a href="http://shrubbery.mynetgear.net/wiki/Embedded_JBoss_/_Embedded_EJB3" title="renommée" >renommée</a> depuis <a href="http://community.jboss.org/wiki/JBossEmbeddedAS" title="JBoss Embedded AS" >JBoss Embedded AS</a>) ; cette initiative avait par ailleurs permis d'embarquer un conteneur EJB 3.0 dans Tomcat. Aujourd'hui Arquillian va plus loin en proposant une API de plus haut niveau pour tester ses EJB : l'ensemble des fastidieuses tâches de démarrage du conteneur sont ainsi masquées et le développeur n'a plus qu'a décrire son besoin.</p>
<p>Le projet est pour le moment à un stade embryonnaire et il faudra probablement plusieurs mois avant que l'on dispose d'un ensemble cohérent pour l'utilisation au sein des projets EJB. Toutefois, le souhait affiché d'utiliser Arquillian  pour les tests internes de Seam 3 et pour les TCK de <a href="http://blog.xebia.fr/2009/10/05/revue-de-presse-xebia-128/#WebBeansestmortLonguevieaWeld" title="Weld" >Weld</a> permet d'espérer une rapide évolution pour cette API.</p>
<h3><a name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l'étranger</h3>
<h4><a name="SalonSolutionsLinuxOpenSource"></a>Salon "Solutions Linux Open Source"</h4>
<p>Le salon "<a href="http://www.solutionslinux.fr/" title="Solutions Linux Open Source" >Solutions Linux Open Source</a>" se déroulera cette semaine à la Porte de Versailles. De nombreux exposants y seront présents tels Oracle, Linagora, Alter Way, Canonical et <a href="http://www.solutionslinux.fr/exposants_154_291_p.html" title="bien dautres" >bien d'autres</a> encore... C'est l'occasion d'assister à de nombreuses conférences dont celles qui nous semblent les plus intéressantes sont:</p>
<ul>
<li><a href=" http://www.solutionslinux.fr/animation_4_168_169_p.html?cid=183" title="Oracle et lopen source" >Oracle et l'open source</a></li>
<li><a href="http://www.solutionslinux.fr/animation_8_168_170_p.html?cid=29" title="Progiciels le logiciel libre envahit le domaine fonctionnel" >Progiciels, le logiciel libre envahit le domaine fonctionnel</a></li>
<li><a href="http://www.solutionslinux.fr/animation_8_168_170_p.html?cid=30" title="Virtualisation retours sur investissement et bonnes pratiques de la virtualisation" >Virtualisation: retours sur investissement et bonnes pratiques de la virtualisation</a></li>
<li><a href="http://www.solutionslinux.fr/animation_8_168_170_p.html?cid=31" title="Mobilité: smartphones, le libre prépondérant ?" >Mobilité: smartphones, le libre prépondérant ?</a></li>
<li><a href="http://www.solutionslinux.fr/animation_2_168_172_p.html?cid=34" title="Dveloppement logiciel collaboratif  bonnes pratiques premiers bilans" >Développement logiciel collaboratif : bonnes pratiques, premiers bilans</a></li>
<li><a href="http://www.solutionslinux.fr/animation_2_168_172_p.html?cid=35" title="Meilleures pratiques pour lintgration continue et mthodes agiles avec  Subversion Ant Maven et CruiseControl" >Meilleures pratiques pour l'intégration continue et méthodes agiles avec : Subversion, Ant, Maven et CruiseControl</a></li>
</ul>
<p>De nombreuses <a href="http://www.solutionslinux.fr/animations_9_168_171_p.html" title="formations" >formations</a> seront aussi dispensées, mais par contre, elles sont payantes. L'an passé, c'est surtout l'omniprésence des solutions de virtualisation qui nous avait marqué. Quel sera le thème majeur du salon cette année ?</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une passion, la technologie</title>
		<link>http://blog.xebia.fr/2010/03/10/une-passion-la-technologie-2/</link>
		<comments>http://blog.xebia.fr/2010/03/10/une-passion-la-technologie-2/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 06:36:54 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Xebia recrute !]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4192</guid>
		<description><![CDATA[

Imaginez un environnement de travail qui valorise l'innovation technologique et la curiosité.
Imaginez un groupe où vous aurez l'opportunité de travailler et partager avec des gens parmi les plus talentueux.
Imaginez une culture et des valeurs en rupture avec les SSII.
Imaginez une société où vos talents et vos idées seront reconnus et encouragés.
Imaginez une organisation qui vous [...]]]></description>
			<content:encoded><![CDATA[
<ul>
<li>Imaginez un environnement de travail qui valorise l'innovation technologique et la curiosité.</li>
<li>Imaginez un groupe où vous aurez l'opportunité de travailler et partager avec des gens parmi les plus talentueux.</li>
<li>Imaginez une culture et des valeurs en rupture avec les SSII.</li>
<li>Imaginez une société où vos talents et vos idées seront reconnus et encouragés.</li>
<li>Imaginez une organisation qui vous donne les moyens réels de travailler, de progresser, de réaliser vos projets personnels.</li>
</ul>
<p><strong>N'imaginez plus, vivez-le !</strong></p>
<p>N'hésitez pas à nous contacter à travers le <a href="http://blog.xebia.fr/rejoignez-nous/">Formulaire de contact</a> ou directement à l'adresse <a href="mailto:recrutement@xebia.fr">recrutement@xebia.fr</a>.</p>
<p>Vous avez également la possibilité d’échanger librement avec un de nos consultants afin de mieux nous connaitre : <a href="http://blog.xebia.fr/contactez-un-consultant-xebia/">Rencontrer un consultant Xebia</a>.</p>
<p>&nbsp;</p>
<div align="center">
<table>
<tr>
<td><a href="http://blog.xebia.fr/contactez-un-consultant-xebia/"><img src="http://blog.xebia.fr/wp-content/uploads/2008/07/contactez-un-consultant.png" alt="contactez un consultant" title="contactez un consultant" width="213" height="69" class="size-full wp-image-480" /></a></td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td><a href="http://blog.xebia.fr/rejoignez-nous/"><img src="http://blog.xebia.fr/wp-content/uploads/2008/07/envoyez-cv.png" alt="envoyez votre cv" title="envoyez votre cv" width="213" height="69" class="size-full wp-image-479" /></a></td>
</tr>
</table>
</div>
<p>&nbsp;</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/03/10/une-passion-la-technologie-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/03/08/revue-de-presse-xebia-150/</link>
		<comments>http://blog.xebia.fr/2010/03/08/revue-de-presse-xebia-150/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 18:26:24 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSR-310]]></category>
		<category><![CDATA[Méthodes agiles]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[SproutCore]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4179</guid>
		<description><![CDATA[

La revue de presse de l'actualité Java/J2EE hebdomadaire proposée par Xebia.
Agilité

Convaincre votre MOA de passer aux méthodes Agiles

RIA

Sortie de SproutCore 1.0

Le coin de la technique

Commenter son code: jusqu'où aller ?
Où l'on reparle de la JSR-310

Agilité
Convaincre votre MOA de passer aux méthodes Agiles
Dans un récent article, Alexandre Boutin explique comment convaincre une MOA de s'intéresser à [...]]]></description>
			<content:encoded><![CDATA[
<p><img style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br />
<em>La revue de presse de l'actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<p><strong>Agilité</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/08/revue-de-presse-xebia-150/#ConvaincrevotreMOAdepasserauxm">Convaincre votre MOA de passer aux méthodes Agiles</a></li>
</ul>
<p><strong>RIA</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/08/revue-de-presse-xebia-150/#SortiedeSproutCore">Sortie de SproutCore 1.0</a></li>
</ul>
<p><strong>Le coin de la technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/08/revue-de-presse-xebia-150/#Commentersoncodejusquoaller">Commenter son code: jusqu'où aller ?</a></li>
<li><a href="http://blog.xebia.fr/2010/03/08/revue-de-presse-xebia-150/#OlonreparledelaJSR">Où l'on reparle de la JSR-310</a></li>
</ul>
<h3><a name="Agilit"></a>Agilité</h3>
<h4><a name="ConvaincrevotreMOAdepasserauxm"></a>Convaincre votre MOA de passer aux méthodes Agiles</h4>
<p>Dans un récent <a title="article" href="http://www.agilex.fr/2010/03/agilite-pour-moa/">article</a>, Alexandre Boutin explique comment convaincre une MOA de s'intéresser à l'agilité.<br />
La démarche d'Alexandre a été de demander à la MOA de répondre à un questionnaire reprenant les divers problèmes habituellement rencontrés :</p>
<ul>
<li>difficultés à définir le besoin fonctionnel et à maîtriser son évolution au cours du temps,</li>
<li>délais importants entre chaque version et effet tunnel pendant les périodes de développements,</li>
<li>les versions se terminent généralement avec du retard,</li>
<li>communication avec la MOE,</li>
<li>la productivité n'est pas au rendez-vous.</li>
</ul>
<p>Ce questionnaire ayant permis à la MOA de mettre le doigt sur des problèmes récurrents, Alexandre présente les avantages que vont apporter l'utilisation des méthodes agiles dans leur travail :</p>
<ul>
<li>meilleure communication et visibilité sur le travail de la MOE,</li>
<li>livraisons fréquentes à dates fixes d'un produit démontrable et fonctionnel,</li>
<li>amélioration de la productivité.</li>
</ul>
<p>Alexandre termine par préconiser un accompagnement pour se former et passer aux méthodes agiles le plus rapidement et le plus efficacement possible.</p>
<p>L'adoption d'une méthode de travail (agile ou non) par l'ensemble des acteurs d'un projet est fondamentale. Il est en effet compliqué pour une MOA de travailler avec des méthodes différentes de celles employées par la MOE. Cela génèrera immanquablement des problèmes de communication entre les deux parties.<br />
Convaincre une MOA de changer ses habitudes de travail n'est pas chose aisée, et le questionnaire proposé par Alexandre Boutin (potentiellement agrémenté en fonction des spécificités du contexte du projet) peut-être un bon moyen de déclencher le besoin de changement.<br />
L'adoption d'une méthode agile n'est pas sans contrainte, mais un bon coach agile saura mettre en avant les bénéfices de l'agilité pour combler les lacunes de l'ancienne méthode.</p>
<h3><a name="RIA"></a>RIA</h3>
<h4><a name="SortiedeSproutCore"></a>Sortie de SproutCore 1.0</h4>
<p>Les frameworks HTML5 continuent de se mettre à jour. Et après <a title="52framework" href="http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/#HTMLCSSframework">52framework</a>, c'est au tour de <a title="SproutCore" href="http://www.sproutcore.com/home/">SproutCore</a> de sortir en release majeure <em>(version 1.0, information relayée <a title="ici" href="http://itshala.com/2010/03/01/sproutcore-javascript-html5-application-framework/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sproutcore-javascript-html5-application-framework">ici</a>)</em>.</p>
<p><a title="InfoQ" href="http://www.infoq.com/">InfoQ</a> a récemment réalisé une <a title="interview de Charles Jolley" href="http://www.infoq.com/news/2009/09/sproutcore-1-0">interview de Charles Jolley</a> <em>(CEO de Sproutit)</em> concernant SproutCore.<br />
On y apprend ainsi que le framework gère certaines fonctionnalités d'HTML5 (comme l'<em>offline storage</em> ou le nouveau tag <code>video</code>) et qu'il est possible d'intégrer du code existant jQuery, ExtJS, YUI ou bien encore Prototype.<br />
Il explique aussi les raisons principales de la migration, côté vue, de Ruby à JavaScript. La première est l'arrivée prochaine d'un Drag &amp; Drop UI Designer <em>(facilitée par les APIs JavaScript)</em> et la seconde pour des raisons de performances <em>(jusqu'à 10 fois plus rapide que la version précédente !)</em>.</p>
<p>Rendez-vous sur cette <a title="page" href="http://demo.sproutcore.com/">page</a> pour une petite démonstration de SproutCore et sur <a title="celleci" href=" http://wiki.sproutcore.com/Abbot-Setting+Up">celle-ci</a> pour le téléchargement.</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la technique</h3>
<h4><a name="Commentersoncodejusquoaller"></a>Commenter son code: jusqu'où aller ?</h4>
<p>Rebondissant sur une discussion qu'ont eu <a title="des programmeurs .Net de  Seattle" href="http://groups.google.com/group/altnetseattle">des programmeurs .Net de  Seattle</a>, InfoQ publie <a title="un article sur l'intérêt de commenter (ou non) son code" href="http://www.infoq.com/news/2010/03/To-Comment-or-Not-to-Comment">un article sur l'intérêt de commenter (ou non) son code</a>. Le sujet, tel un éternel serpent de mer, donne toujours  matière à discussion. A tel point que les interventions des lecteurs, à la suite de l'article, sont des plus intéressantes !</p>
<p>Le consensus semble être que les commentaires sont à éviter au  maximum car le code se doit de s'auto-documenter: sans commentaires, et  seulement avec le nom des méthodes et des variables, nous devons être  capable de le comprendre. Ainsi, pour Thiébaut Champenier, il y  a 2 types de commentaires:</p>
<ul>
<li>Les commentaires documentant l'API (notés /** */ )</li>
<li>Les commentaires dans le code (notés /* */ ou // ) qui doivent  un maximum décrire <strong>pourquoi</strong> le code existe plutôt que <strong>comment</strong> le code agit.</li>
</ul>
<p>Alex Suvorov ajoute qu'une suite de plusieurs  opérations successives nécessitant un commentaire devrait plutôt être  extraite en une fonction nommée de manière explicite. Tim  Linquist, lui va même plus loin en souhaitant disposer d'une  fonctionnalité lui permettant de sortir les commentaires du code une  fois la documentation (javadoc) générée. Pour contrebalancer ces avis,  la palme du meilleur commentaire revient à Pete Haidinyak. Celui-ci  se permet une suggestion amusante destinée à toutes les personnes <em>"qui  ne commentent pas leur code ou qui pensent qu'un commentaire toutes les  10000 lignes est suffisant"</em>. Il leur demande de rajouter un  en-tête dans leur code spécifiant: <em>"A toute personne chargée de maintenir ce code:  si vous ne comprenez pas mon code ou êtes troublé par mon style,  n'hésitez pas à m'appeler à toute heure, nuit et jour, au numéro  suivant: { numéro_de_téléphone_du_développeur }. Je vous expliquerai ce que j'avais en tête  lorsque j'ai écrit ce code"</em>. L'idée est bonne,  avec un tel en-tête, les développeurs risqueraient de se soucier un peu  plus de la façon dont les autres peuvent comprendre leur code !</p>
<h4><a name="OlonreparledelaJSR"></a>Où l'on reparle de la JSR-310</h4>
<p>La <a title="JSR-310 (Date and Time API)" href="http://www.jcp.org/en/jsr/detail?id=310">JSR-310 (Date and Time API)</a> était initialement prévue pour le JDK 7 mais il y a un an, <a href="http://blog.xebia.fr/2009/03/30/revue-de-presse-xebia-102/#EnfinuneroadmapdtaillepourleJD">la <em>roadmap</em> de Sun l'en excluait</a>. Cette spécification était pourtant attendue par tous ceux qui étaient lassés par les défauts de <code>java.util.Date</code> et qui voyaient en <a title="Jodatime" href="http://joda-time.sourceforge.net/">Jodatime</a> (dont la JSR-310 est largement inspirée) une échappatoire tentante. L'API proposée par cette JSR est en effet beaucoup plus riche et permet de représenter tous les concepts d'instants et de durées.</p>
<p>Lors de <a title="l'annonce du report du JDK 7" href="http://blog.xebia.fr/2009/11/23/revue-de-presse-xebia-135/#JDKJEEetMavenlesannoncesdeDevo">l'annonce du report du JDK 7</a> en novembre dernier, Mark Reinhold avait laissé la porte ouverte aux fonctionnalités qui avaient été abandonnées faute de temps ; la JSR-310 en faisait partie. Courant février, questionné sur cette spécification par un spectateur d'un <em>webcast</em>, <a title="il disait regretter" href="http://java.dzone.com/articles/mark-reinhold-talks-about-jdk">il disait regretter</a> qu'elle n'ait pu être finalisée dans les temps. Dans le même temps, <a title="Stephen Colebourne" href="http://www.jroller.com/scolebourne/">Stephen Colebourne</a>, <em>spec lead</em> de la JSR-310, expliquait sur son blog qu'il disposait désormais de temps libre pour travailler sereinement sur cette spécification. Quelques semaines plus tard une <a title="&lt;i&gt;early draft review&lt;/i&gt;" href="http://wiki.java.net/bin/view/Projects/DateTimeEDR1"><em>early draft review</em></a> voyait le jour. Enfin, il y a quelques jours, Stephen Colebourne <a title="rpondait  un commentaire" href="http://www.theserverside.com/news/thread.tss?thread_id=59624#332934">répondait à un commentaire</a> en disant que l'inclusion de la JSR-310 dans le JDK 7 dépendrait de sa finalisation et de la volonté de Sun/Oracle.</p>
<p>La saga de la JSR-310 semble donc renaître de ses cendres et la possibilité de son intégration au prochain JDK est bien réelle. L'affaire est donc à suivre...</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/03/08/revue-de-presse-xebia-150/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Création de JDuchess en France</title>
		<link>http://blog.xebia.fr/2010/03/03/creation-de-jduchess-en-france/</link>
		<comments>http://blog.xebia.fr/2010/03/03/creation-de-jduchess-en-france/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 13:34:31 +0000</pubDate>
		<dc:creator>Ellène Dijoux</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDuchess]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JUG]]></category>
		<category><![CDATA[Paris JUG]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4171</guid>
		<description><![CDATA[

Un nouveau groupe vient de se créer sur Paris. Il est destiné à mettre en relation les femmes du monde Java.
A l'origine, JDuchess est un JUG féminin provenant des Pays Bas. Après avoir rencontré Clara Ko (JUG Leader de JDuchess), elles nous a proposé de représenter son JUG en France. Ce que nous souhaiterions pour [...]]]></description>
			<content:encoded><![CDATA[
<p><img src="http://blog.xebia.fr/wp-content/uploads/2010/03/duchess-france.jpg" alt="duchess-france" title="duchess-france" style="margin: 1em 1em 1em 1em; float: right;" /><br />
Un nouveau groupe vient de se créer sur Paris. Il est destiné à mettre en relation les femmes du monde Java.</p>
<p>A l'origine, JDuchess est un JUG féminin provenant des Pays Bas. Après avoir rencontré Clara Ko (JUG Leader de JDuchess), elles nous a proposé de représenter son JUG en France. Ce que nous souhaiterions pour JDuchess c'est de monter une communauté où les femmes faisant du Java peuvent se rencontrer et partager leurs expériences, leurs points de vue. Nous voudrions pouvoir monter un réseau social pour rendre les femmes plus visibles dans ce domaine, les inciter à participer à des événements comme le Paris JUG, et d'autres événements techniques ou conférences. Et pourquoi pas y faire une présentation.</p>
<p>Vous pouvez rester en contact avec les Duchess via <a href="http://twitter.com/duchessfr" title="Twitter" >Twitter</a> , notre <a href="http://groups.google.fr/group/duchessfr" title="Google Group" >Google Group</a> et <a href="http://www.linkedin.com/groups?gid=2750811" title="LinkedIn" >LinkedIn</a>.</p>
<p>Pour celles qui assisteront à la <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20100309">soirée Emmanuel Bernard du Paris JUG le 9 Mars</a> vous pourrez retrouver les Duchess pour l'Avant JUG qui se passera au Vavin Café (18, Rue Vavin, 75006 Paris) à partir de 18h30.</p>
<p>Lorsque vous serez inscrites au JUG, contactez ellene(dot)dijoux(at)jduchess(dot)org qui vous accueillera Mardi prochain.</p>
<p>J'y serai et je serai heureuse de vous y rencontrer.</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/03/03/creation-de-jduchess-en-france/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HTML5 &#8211; Les nouveaux éléments</title>
		<link>http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/</link>
		<comments>http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 13:30:10 +0000</pubDate>
		<dc:creator>Séven Le Mesle</dc:creator>
				<category><![CDATA[Mobilité]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Gears]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4127</guid>
		<description><![CDATA[
Comme évoqué dans une précédente revue de presse, voici le premier article de ma série sur HTML5. Plutôt que de faire du comptage de points entre Apple et Adobe, j'ai décidé de commencer par faire un tour d'horizon des nouveautés proposées par cette nouvelle spécification du W3C. Dans ce premier article, je vous propose donc [...]]]></description>
			<content:encoded><![CDATA[
<p>Comme évoqué dans une précédente revue de presse, voici le premier article de ma série sur HTML5. Plutôt que de faire du comptage de points entre Apple et Adobe, j'ai décidé de commencer par faire un tour d'horizon des nouveautés proposées par cette nouvelle spécification du W3C. Dans ce premier article, je vous propose donc de faire un voyage à la découverte des nouveautés du côté de HTML. ; pour connaître les nouvelles balises, et les nouveaux attributs que nous pouvons déjà ou pourrons bientôt utiliser dans nos navigateurs. Du layout au canvas en passant par les WebForms, le son et la vidéo, tout tout tout, je vous dirai tout sur HTML5. Commençons donc par le commencement: HTML5 qu'est-ce que c'est ?</p>
<h3>Sommaire</h3>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#HTML">HTML5 ?</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#Nouveaumodledecontenu">Nouveau modèle de contenu</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#Nouveauxlmentsdemiseenpage">Nouveaux éléments de mise en page</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#Elmentsinteractifs">Eléments interactifs</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#LesWebForms">Les WebForms</a>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#Nouveauxinput">Nouveaux input</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#Validationnative">Validation native</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#Autocompltion">Auto-complétion</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#Rptitions">Répétitions</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/#Etatdeslieux">Etat des lieux</a></li>
</ul>
</li>
<li><a href="http://blog.xebia.fr/2010/03/02/html5-les-nouveaux-elements/#Multimedia">Multimedia</a>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/02/html5-les-nouveaux-elements/#AudioetVideo">Audio et Video</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html5-les-nouveaux-elements/#LaguerredesCodecs">La guerre des Codecs</a></li>
<li><a href="http://blog.xebia.fr/2010/03/02/html5-les-nouveaux-elements/#LeCanvas">Le Canvas</a></li>
</ul>
</li>
<li><a href="http://blog.xebia.fr/2010/03/02/html5-les-nouveaux-elements/#Conclusion">Conclusion</a></li>
</ul>
<h3><a name="HTML"></a>HTML5 ?</h3>
<p>HTML5 est au départ la nouvelle version du langage HTML en cours de développement par le W3C. Pour le moment, il s'agit d'une recommandation en DRAFT, fruit du travail initial réalisé par le <a title="WHATWG" href="http://www.whatwg.org">WHATWG</a> depuis 2004. Le <a title="W3C" href="http://www.w3c.org">W3C</a> espère en faire un de ses standards libres aux alentours de 2022. De prime abord, ça nous laisse le temps de réfléchir au problème pendant les 10 prochaines années. L'idée d'une nouvelle version de HTML serait motivée par quelques constats simples :</p>
<ul>
<li>Les navigateurs ont besoin de plugins pour gérer le multimédia (flash et consorts)</li>
<li>La structure des documents n'est pas intuitive et rend l'accessibilité difficile</li>
<li>Les API JavaScript varient trop d'un navigateur à l'autre pour garantir la portabilité des documents</li>
<li>Les sites sont de plus en plus proches des applications de bureaux mais souffrent encore de limitations</li>
</ul>
<p>Pour répondre à ces problématiques et favoriser l'émergence du web sémantique, la spécification propose :</p>
<ul>
<li>Un nouveau modèle de contenu des éléments</li>
<li>Des éléments de mise en page</li>
<li>De nouveaux éléments pour les formulaires</li>
<li>Du contenu multimédia</li>
<li>Plus d'interactivité</li>
<li>Des APIs standards JavaScript</li>
</ul>
<p>Bien que la spécification soit encore en cours d'écriture, certaines parties sont déjà très avancées et les navigateurs ont tous commencé à les implémenter. Google Chrome est actuellement en tête. Il bénéficie nativement de Gears et respecte 87% de la spécification. Parmi les principaux supporters de ce standard en devenir, nous retrouvons Google, Mozilla, Opera, Apple et Palm, pour ne citer que les plus grands. Apparemment, les navigateurs qui ont le vent en poupe sont tous de la partie. Microsoft, de son côté, suit la tendance de très loin en intégrant des fonctionnalités au compte goutte dans son IE, qui supporte tout de même 28% du langage.</p>
<h3><a name="Nouveaumodledecontenu"></a>Nouveau modèle de contenu</h3>
<p>Bye, bye, les alignements hasardeux dus aux éléments de type bloc ou en ligne. Les éléments seront plutôt classés par catégories.</p>
<div><a href="http://blog.xebia.fr/wp-content/uploads/2010/03/contenthtml5.png"><img class="aligncenter size-full wp-image-4135" title="contenthtml5" src="http://blog.xebia.fr/wp-content/uploads/2010/03/contenthtml5.png" alt="contenthtml5" width="520" height="284" /></a></div>
<ul>
<li>La catégorie ancêtre <code>Flow</code> correspond à tous les éléments qui contiennent un flot de texte</li>
<li><code>Phrasing</code> correspond aux éléments qui apparaissent dans le texte (a, li)</li>
<li><code>Interactive</code> définit les éléments qui fournissent une interaction avec l'utilisateur</li>
<li><code>Embedded</code> affiche des ressource externes dans le document</li>
<li>Les <code>Metadata</code> représentent tout ce qui n'est pas affiché (style, script, ...)</li>
<li><code>Heading</code> définit les en-têtes d'une section</li>
<li><code>Sectioning</code> définit le scope des en-têtes et pieds de page</li>
</ul>
<p>Toutes ces catégories permettent de définir le contenu autorisé pour les éléments. Leur but est d'une part de fournir une grande souplesse de composition (par exemple la balise <code>a</code> peut maintenant contenir un paragraphe entier, une liste ou des headers (<code>h*</code>)), d'autre part ces catégories permettent aux navigateurs d'assimiler le contenu de la page, notamment pour les exports d'impression ou l'accessibilité.</p>
<h3><a name="Nouveauxlmentsdemiseenpage"></a>Nouveaux éléments de mise en page</h3>
<p>Jusqu'à maintenant, l'élément de mise en page par excellence était la balise <code>div</code>. La grande majorité des sites est construite sur un modèle d'empilement de ces boites avec des <code>id</code> différents pour finir par une grosse partie de styles <code>CSS</code> assurant le positionnement. Mais cela a quelques inconvénients:</p>
<ul>
<li>Ce n'est pas intuitif pour le développeur, vous en conviendrez.</li>
<li>Le navigateur ne peut pas connaître le rôle de chacune des parties de la mise en page, ce qui rend beaucoup plus difficile la génération de plan ou d'aide à la navigation.</li>
</ul>
<div>
<table border="0">
<tbody>
<tr>
<td><a href="http://blog.xebia.fr/wp-content/uploads/2010/03/layoutHTML4.png"><img title="layoutHTML4" src="http://blog.xebia.fr/wp-content/uploads/2010/03/layoutHTML4.png" alt="layoutHTML4" width="351" /></a></td>
<td><a href="http://blog.xebia.fr/wp-content/uploads/2010/03/layoutHTML5.png"><img title="layoutHTML5" src="http://blog.xebia.fr/wp-content/uploads/2010/03/layoutHTML5.png" alt="layoutHTML5" width="351" /></a></td>
</tr>
</tbody>
</table>
</div>
<p>Les balises <code>article</code>, <code>section</code>, <code>header</code> et <code>footer</code> indiquent clairement à quel type de texte elles correspondent et comment s'organise leur contenu. La balise <code>aside</code> définit un contenu lié au sujet principal, sans en faire partie pour autant. Reste le tag <code>nav</code> qui est prévu pour servir les liens de navigations de la page comme un menu par exemple. La mise en page proposée ci-dessus ne révèle pas la flexibilité d'utilisation de ces éléments. Notez bien que les <code>article</code> et <code>section</code> peuvent avoir leur propre <code>header</code> et <code>footer</code>.</p>
<p>Avec ces nouvelles balises, nous serons enfin capables de gérer l'organisation de nos documents de façon intuitive et les navigateurs pourront générer le plan des documents eux-mêmes. L'algorithme nécessaire est d'ailleurs décrit dans la spécification. Tous ces éléments sont déjà supportés nativement par les navigateurs avec l'exception habituelle de IE pour lequel il existe un <a title="workaround JavaScript" href="http://code.google.com/p/html5shiv/">workaround JavaScript</a>. Vous pouvez dès maintenant vous familiariser avec ces nouvelles balises sans avoir peur des problèmes de compatibilité.</p>
<h3><a name="Elmentsinteractifs"></a>Eléments interactifs</h3>
<p>Sous ce terme limpide se cachent les éléments qui fournissent de l'interaction utilisateur dans la page. Ce qui correspond aux <a title="Interactive elements" href="http://dev.w3.org/html5/spec/interactive-elements.html">Interactive elements</a> de la spécification. La grosse nouveauté ici est la définition d'une balise <code>menu</code> permettant de construire des barres de menu (<code>type="toolbar"</code>), des menus contextuels (<code>type="context"</code>) ou de simples listes de commandes. Un tag <code>menu</code> peut contenir des sous-menus et se compose d'éléments permettant de lancer des commandes.</p>
<div class="syntax_hilite">
<div id="html-11">
<div class="html"><span style="color: #009900;">&lt;menu <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"toolbar"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">&lt;li&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;">&lt;menu <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"File"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/button.html"><span style="color: #000000; font-weight: bold;">&lt;button</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"button"</span> <span style="color: #000066;">onclick</span>=<span style="color: #ff0000;">"fnew()"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span>New...<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/button&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/button.html"><span style="color: #000000; font-weight: bold;">&lt;button</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"button"</span> <span style="color: #000066;">onclick</span>=<span style="color: #ff0000;">"fopen()"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span>Open...<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/button&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/button.html"><span style="color: #000000; font-weight: bold;">&lt;button</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"button"</span> <span style="color: #000066;">onclick</span>=<span style="color: #ff0000;">"fsave()"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span>Save<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/button&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/menu&gt;</span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li&gt;</span></span><br />
&nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">&lt;li&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;">&lt;menu <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Edit"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/button.html"><span style="color: #000000; font-weight: bold;">&lt;button</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"button"</span> <span style="color: #000066;">onclick</span>=<span style="color: #ff0000;">"ecopy()"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span>Copy<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/button&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/button.html"><span style="color: #000000; font-weight: bold;">&lt;button</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"button"</span> <span style="color: #000066;">onclick</span>=<span style="color: #ff0000;">"epaste()"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span>Paste<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/button&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/menu&gt;</span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/menu&gt;</span></div>
</div>
</div>
<p></p>
<p>Pour les commandes, HTML5 propose directement un élément <code>command</code> qui permet d'associer un texte ou icône à une exécution JavaScript sur événement <code>onclick="alert('hello world')"</code>. Pour utiliser le menu contextuel, il suffit d'ajouter l'attribut <code>contextmenu="menu_id"</code>, sur l'élément qui doit utiliser le menu.</p>
<p>L'autre nouveauté parmi les éléments interactifs est la balise <code>details</code>. Le fonctionnement de ce tag est proche d'un menu en accordéon, avec une partie de texte toujours affichée et une partie cachée pouvant être rendue visible sur demande de l'utilisateur. Cela peut être utile, pour cacher des options avancées par exemple.</p>
<div class="syntax_hilite">
<div id="html-12">
<div class="html"><span style="color: #009900;">&lt;section <span style="color: #000066;">class</span>=<span style="color: #ff0000;">"progress window"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/h1.html"><span style="color: #000000; font-weight: bold;">&lt;h1&gt;</span></a></span>Copying &quot;Really Achieving Your Childhood Dreams&quot;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1&gt;</span></span><br />
&nbsp;<span style="color: #009900;">&lt;details&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;summary&gt;</span>Copying... <span style="color: #009900;">&lt;progress max=<span style="color: #ff0000;">"375505392"</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"97543282"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/progress&gt;</span> 25%<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/summary&gt;</span><br />
&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/dl.html"><span style="color: #000000; font-weight: bold;">&lt;dl&gt;</span></a></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/dt.html"><span style="color: #000000; font-weight: bold;">&lt;dt&gt;</span></a></span>Transfer rate:<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dt&gt;</span></span> <span style="color: #009900;"><a href="http://december.com/html/4/element/dd.html"><span style="color: #000000; font-weight: bold;">&lt;dd&gt;</span></a></span>452KB/s<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dd&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/dt.html"><span style="color: #000000; font-weight: bold;">&lt;dt&gt;</span></a></span>Local filename:<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dt&gt;</span></span> <span style="color: #009900;"><a href="http://december.com/html/4/element/dd.html"><span style="color: #000000; font-weight: bold;">&lt;dd&gt;</span></a></span>/home/rpausch/raycd.m4v<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dd&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/dt.html"><span style="color: #000000; font-weight: bold;">&lt;dt&gt;</span></a></span>Remote filename:<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dt&gt;</span></span> <span style="color: #009900;"><a href="http://december.com/html/4/element/dd.html"><span style="color: #000000; font-weight: bold;">&lt;dd&gt;</span></a></span>/var/www/lectures/raycd.m4v<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dd&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dl&gt;</span></span><br />
&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/details&gt;</span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/section&gt;</span></div>
</div>
</div>
<p></p>
<p>Ici, le tag <code>details</code> est utilisé pour cacher les informations techniques d'une copie. Vous noterez au passage l'utilisation d'une balise <code>progress</code>, pour afficher une barre d'avancement.</p>
<h3><a name="LesWebForms"></a>Les WebForms</h3>
<h4><a name="Nouveauxinput"></a>Nouveaux input</h4>
<p>Les formulaires aussi profitent de la mise à jour en reprenant en partie <a title="XForms" href="http://www.w3.org/TR/xforms11/">XForms</a> pour les connaisseurs. Le principe est de fournir des <code>input</code> fortement typés  ainsi qu'une API JavaScript de validation en plus d'une interactivité accrue. Parmi les nouveaux types d'input, il y a :</p>
<ul>
<li>Le support des saisies de dates et heure décliné sous plusieurs formes (<code>date</code>, <code>datetime</code>, <code>datetime-local</code>, <code>month</code>, <code>week</code>, <code>time</code>). Nous n'aurons donc plus besoin des widgets supplémentaires JavaScript pour générer des calendriers.</li>
<li>La saisie de formats numériques via les <code>number</code> et les <code>range</code> qui pourront prendre la forme d'un slider vertical ou horizontal</li>
<li>Différents types de chaînes formatées comme les <code>url</code>, les <code>email</code> et <code>tel</code></li>
<li>Le selecteur de couleur <code>color</code></li>
<li>Le champ de recherche <code>search</code></li>
</ul>
<p>Les anciens types sont maintenus. Ils bénéficient d'un bon lifting, tel le type <code>file</code> qui permettra désormais de sélectionner plusieurs fichiers d'un seul coup, tout en précisant le type mime accepté. Il y a aussi l'attribut <code>placeHolder</code> qui permet de fournir un texte descriptif affiché dans le champs si il n'est pas renseigné.</p>
<h4><a name="Validationnative"></a>Validation native</h4>
<p>Tous les <code>input</code> supportent de nouveaux attributs de validation qui permettent de contraindre les saisies de l'utilisateur, et peuvent interdire la soumission du formulaire, s'il n'est pas valide. Encore une fois, cela permettra de remplacer des solutions hétérogènes JavaScript par un standard nativement supporté par le navigateur. La validation s'accompagne aussi de nouveaux évènements DOM pour notifier les erreurs ou surcharger la validation avec son propre code JavaScript. Plus besoin non plus de jouer avec les classes CSS pour faire ressortir les champs en erreur grâce aux pseudo-formats (<code>:invalid</code>, <code>:valid</code>, <code>:Out-of-range</code>, ...).</p>
<p>Des validateurs par défaut sont fournis sous la forme de nouveaux attributs à placer sur les <code>input</code> :</p>
<ul>
<li><code>required</code> pour un champ requis</li>
<li><code>min</code> et <code>max</code> permettent de définir une valeur minimum et maximum sur les types numérique et date</li>
<li><code>pattern</code> fournit une expression régulière que la saisie doit respecter</li>
</ul>
<h4><a name="Autocompltion"></a>Auto-complétion</h4>
<p>Autre nouveauté inspirée des widgets JavaScript existant, les <code>datalist</code> sont des listes de valeurs construites à l'aide d'éléments de type liste (<code>li</code>, <code>option</code>, ...). La <code>datalist</code> est transparente par défaut mais elle peut-être liée à un ou plusieurs <code>input</code> avec l'attribut <code>list</code>. Une fois l'association établie avec un <code>input</code>, la liste est utilisée pour fournir des suggestions à la saisie. Les éléments à l'intérieur de la liste peuvent-être décorés par CSS directement.</p>
<div class="syntax_hilite">
<div id="html-13">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">&lt;input</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text"</span> list=<span style="color: #ff0000;">"roles"</span> autofocus /<span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
<span style="color: #009900;">&lt;datalist <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"roles"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">&lt;li&gt;</span></a></span>Designer<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">&lt;li&gt;</span></a></span>Integrateur<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">&lt;li&gt;</span></a></span>Programmeur<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/datalist&gt;</span></div>
</div>
</div>
<p></p>
<h4><a name="Rptitions"></a>Répétitions</h4>
<p>Une autre évolution sympathique est la création d'un système de template, facilitant la création de formulaire dynamique. Dans les applications de gestion, il est souvent utile de pouvoir ajouter et supprimer des lignes de saisie dans le formulaire. Le système de répétition est fait pour ça. Je peux définir un bloc comme étant mon template, et le contenu de cet élément pourra être dupliqué via une API JavaScript.</p>
<div class="syntax_hilite">
<div id="html-14">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/tr.html"><span style="color: #000000; font-weight: bold;">&lt;tr</span></a> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"order"</span> repeat=<span style="color: #ff0000;">"template"</span> repeat-<span style="color: #000066;">start</span>=<span style="color: #ff0000;">"3"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">&lt;td&gt;</span></a></span><span style="color: #009900;"><a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">&lt;input</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text"</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"row[order].product"</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">""</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">&lt;td&gt;</span></a></span><span style="color: #009900;"><a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">&lt;input</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text"</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"row[order].quantity"</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"1"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><a href="http://december.com/html/4/element/td.html"><span style="color: #000000; font-weight: bold;">&lt;td&gt;</span></a></span><span style="color: #009900;"><a href="http://december.com/html/4/element/button.html"><span style="color: #000000; font-weight: bold;">&lt;button</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"remove"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span>Remove This Row<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/button&gt;</span></span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr&gt;</span></span><br />
<span style="color: #009900;"><a href="http://december.com/html/4/element/p.html"><span style="color: #000000; font-weight: bold;">&lt;p&gt;</span></a></span><span style="color: #009900;"><a href="http://december.com/html/4/element/button.html"><span style="color: #000000; font-weight: bold;">&lt;button</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"add"</span> template=<span style="color: #ff0000;">"order"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span>Add Row<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/button&gt;</span></span><span style="color: #009900;"><a href="http://december.com/html/4/element/button.html"><span style="color: #000000; font-weight: bold;">&lt;button</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"submit"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span>Submit<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/button&gt;</span></span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p&gt;</span></span></div>
</div>
</div>
<p></p>
<p>C'est l'attribut <code>repeat</code> qui définit notre bloc de répétition, le <code>repeat-start</code> permet de gérer les aller-retour serveur, pour afficher la liste avec le nombre d'éléments précédemment soumis. Pour assurer l'ajout et la suppression de ligne, j'ai utilisé les boutons de type <code>add</code> et <code>remove</code> mais j'aurais aussi bien pu utiliser des méthodes JavaScript de l'élément template <code>addRepetitionBlock()</code>. Il y a aussi des solutions pour gérer l'ordre des répétitions permettant de monter et descendre les lignes répétées.</p>
<h4><a name="Etatdeslieux"></a>Etat des lieux</h4>
<p>Voilà la promesse d'un monde meilleur dans lequel nous aurons moins de travail à fournir (CSS, JS) pour obtenir des résultats simplement meilleurs. Notez une dernière chose, les input peuvent être liés à un ou plusieurs formulaires via le nouvel attribut <code>form</code>. En d'autres termes, il sera possible de placer nos <code>input</code> pour un formulaire à l'extérieur de ce dernier.</p>
<p>Comme vous l'avez remarqué, j'ai utilisé le futur dans ce paragraphe car pour le moment seul Opera 9 supporte nativement les WebForms. Pour permettre aux développeurs de s'y essayer et valider la spécification, le projet <a title="WebForms2" href="http://code.google.com/p/webforms2/">WebForms2</a> propose une implémentation partielle en JavaScript. La spécification au départ avait été séparée du langage HTML5, mais le W3C a décidé de la ré-intégrer en y apportant des modifications. Du coup la plupart des fonctions développées sont liées à une ancienne version des WebForms.</p>
<p>Pour les autres navigateurs, notez tout de même que les développements ont déjà commencé. Par exemple Chrome 5 devrait être livré avec le support des nouveaux <code>input</code> et l'API de validation(<a title="Chrome Web Platform Status" href="http://www.chromium.org/developers/web-platform-status">Chrome Web Platform Status</a>). Safari bénéficie du même support que chrome qui se limite aux types <code>search</code>, <code>range</code> et <code>file</code> multiple. Du côté de Firefox, les choses sont moins claires ; il existe bien un ensemble de <a title="bugs" href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=344614&amp;hide_resolved=0">bugs</a> pour le support des WebForms mais Mozilla communique peu sur le sujet. Actuellement, Internet Explorer 8 ne supporte aucune des ces nouveautés et il est impossible de connaître la roadmap de Microsoft sur le sujet. Tout ce que l'on sait, c'est que l'éditeur a décidé de mettre les bouchées doubles pour améliorer son support des travaux du W3C. Peut-être une bonne solution pour inverser la vapeur et en finir avec la descente aux enfers de son précieux navigateur.</p>
<p><a title="Page de dmonstration pour Chrome Safari et Opera" href="http://www.miketaylr.com/pres/html5/forms2.html">Page de démonstration pour Chrome, Safari et Opera</a>.</p>
<h3><a name="Multimedia"></a>Multimedia</h3>
<p>Il est temps de parler des nouveaux types de contenu poussés par HTML5. Les auteurs du whatwg se sont probablement demandé pourquoi doit-on installer des plugins dans nos navigateurs ? Nous savons a priori tous aujourd'hui que Flash est utilisé principalement pour 3 choses dans les applications :</p>
<ul>
<li>Pouvoir écouter de la musique</li>
<li>Pouvoir regarder des vidéos</li>
<li>Faire des animations de folies</li>
</ul>
<p>J'ai mis volontairement de côté Flex car il cible plutôt les applications d'entreprise, et les jeux Flash car le Boss ne veut pas en entendre parler <img src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Sachez, si vous êtes passé à côté de ça, que HTML5 adresse ces trois problématiques en sortant trois nouvelles balises de son chapeau :</p>
<ul>
<li><code>audio</code> permet de gérer la lecture de fichiers audio en streaming.</li>
<li><code>video</code> assure la lecture de vidéos en streaming toujours.</li>
<li><code>canvas</code> permet de dessiner et de faire des animations en JavaScript.</li>
</ul>
<h4><a name="AudioetVideo"></a>Audio et Video</h4>
<p>Jusqu'à maintenant, les gros avantages de la technologie d'Adobe sont la portabilité puisque Flash est disponible pour tous les navigateurs, et la performance en comparaison avec les moteurs JavaScript. Il est clair que ces trois balises viennent marcher sur les plate-bandes de Flash. Les éléments média disposent des attributs :</p>
<ul>
<li><code>controls</code> pour activer l'affichage de l'interface de contrôle du navigateur</li>
<li><code>autobuffer</code> pour activer le chargement automatique de la ressource en cache</li>
<li><code>autoplay</code> pour activer le lancement automatique de la lecture</li>
<li><code>loop</code> pour lire le ou les médias en boucle</li>
<li><code>src</code> pour fournir l'url du fichier média à lire</li>
</ul>
<p>La balise <code>source</code> placée à l'intérieure d'une balise <code>audio</code> ou <code>video</code> permet aussi de définir l'url (<code>@src</code>), le type mime et le codec (<code>@type</code>) d'une ressource média. Il suffit de mettre plusieurs <code>source</code> pour créer une playlist.</p>
<div class="syntax_hilite">
<div id="html-15">
<div class="html"><span style="color: #009900;">&lt;audio controls autobuffer autoplay loop&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;source <span style="color: #000066;">src</span>=<span style="color: #ff0000;">"elvis.ogg"</span> /<span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;">&lt;source <span style="color: #000066;">src</span>=<span style="color: #ff0000;">"elvis.mp3"</span> /<span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/audio&gt;</span><br />
<span style="color: #009900;">&lt;video <span style="color: #000066;">src</span>=<span style="color: #ff0000;">"video.ogg"</span> controls&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;source <span style="color: #000066;">src</span>=<span style="color: #ff0000;">'video.mp4'</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">'video/mp4; codecs=&quot;avc1.42E01E, mp4a.40.2&quot;'</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- Un texte alternatif pour les anciens navigateurs --&gt;</span></span><br />
&nbsp; Your browser does not support the <span style="color: #009900;"><a href="http://december.com/html/4/element/code.html"><span style="color: #000000; font-weight: bold;">&lt;code&gt;</span></a></span>video<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/code&gt;</span></span> element.&nbsp; <br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span></a>/video&gt;</span></div>
</div>
</div>
<p></p>
<p>Si le navigateurs n'arrivent pas à lire le fichier ogg, il tentera de lire le fichier H.264. De même, si le navigateur ne supporte pas l'élément <code>video</code>, il affichera le texte alternatif. Il suffit donc de placer un lecteur Flash à la place du texte pour que la vidéo reste lisible dans un ancien navigateur.</p>
<p>Si vous ne voulez pas utiliser l'interface native, ou que vous souhaitez simplement cacher le lecteur audio, vous pouvez utiliser l'API standard JavaScript pour créer un lecteur, et profiter des méthodes <code>play()</code>, <code>pause()</code>, et <code>load()</code> pour charger la prochaine ressource média. Une dernière méthode : <code>canPlayType(type)</code>, permet de demander au navigateur si il supporte le format vidéo ou audio fournit en paramètre. Cela sera très utile pour gérer les incompatibilités de format.</p>
<p>De plus l'interface <code>HTMLMediaElement</code> fournit quantité de propriétés allant du volume à l'état du buffer en passant par le temps de lecture courant. Le tout est, bien sûr, accompagné d'une batterie d'événements qui permettent de suivre l'avancement du chargement, l'état du lecteur, et les action lancées par l'utilisateur.</p>
<p>Pour plus de détail sur le sujet, je vous invite à lire la <a title="spécification W3C des éléments média" href="http://www.w3.org/TR/html5/video.html">spécification W3C des éléments média</a> et à tester la démo de <a title="jPlayer" href="http://www.happyworm.com/jquery/jplayer/latest/demos.htm">jPlayer</a> un lecteur audio pour jQuery.</p>
<h4><a name="LaguerredesCodecs"></a>La guerre des Codecs</h4>
<p>Venons en au problème des codecs. Le W3C se contente de citer un certain nombre de formats allant du H.264 au DIRAC pour la vidéo en passant par mpeg-4 et Theora; même chose pour l'audio avec AAC, FLAC, Vorbis, ... La spécification laisse le libre choix aux navigateurs et table sur la création d'extensions propres à ces derniers pour apporter le support de nouveaux formats. Si aujourd'hui <a title="YouTube" href="http://www.youtube.com/html5">YouTube</a> et <a title="Vimeo" href="http://vimeo.com/blog:268">Vimeo</a> ont choisi le H.264, <a title="DailyMotion" href="http://www.dailymotion.com/openvideodemo">DailyMotion</a> joue les fidèles Mozilla avec sa démo basée sur Ogg et ne supportant que Firefox.</p>
<p>Chrome et Safari poussent H.264 tandis que Mozilla le rejette totalement et pousse les formats libres Vorbis et Theora (Ogg). Le gros avantage d'H.264, à mon sens, tient au fait qu'il est parfaitement adapté à l'embarqué et beaucoup plus optimisé que Theora. Malgré le barrage de Firefox (25% de parts de marché), avec Apple et Google le codec H.264 semble avoir de beaux jours devant lui. Google qui est justement le plus gros contributeur de Mozilla, fournira peut-être une extension, sinon ce sera probablement du codec pack pour tous.</p>
<p>Codecs supportés par navigateurs</p>
<table style="border: 1px solid black" border="0" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td style="color: #ffffff; border: 1px solid black" bgcolor="#663366"><strong>Navigateur</strong></td>
<td style="color: #ffffff; border: 1px solid black" bgcolor="#663366"><strong>Ogg</strong></td>
<td style="color: #ffffff; border: 1px solid black" bgcolor="#663366"><strong>MP3</strong></td>
<td style="color: #ffffff; border: 1px solid black" bgcolor="#663366"><strong>WAV</strong></td>
<td style="color: #ffffff; border: 1px solid black" bgcolor="#663366"><strong>MP4</strong></td>
</tr>
<tr>
<td style="border: 1px solid black"><strong>Firefox 3.5</strong></td>
<td style="border: 1px solid black">Ok</td>
<td style="border: 1px solid black">-</td>
<td style="border: 1px solid black">Ok</td>
<td style="border: 1px solid black">-</td>
</tr>
<tr>
<td style="border: 1px solid black"><strong>Safari 4</strong></td>
<td style="border: 1px solid black">-</td>
<td style="border: 1px solid black">Ok</td>
<td style="border: 1px solid black">Ok</td>
<td style="border: 1px solid black">Ok</td>
</tr>
<tr>
<td style="border: 1px solid black"><strong>Chrome 3</strong></td>
<td style="border: 1px solid black">Ok</td>
<td style="border: 1px solid black">Ok</td>
<td style="border: 1px solid black">-</td>
<td style="border: 1px solid black">Ok</td>
</tr>
<tr>
<td style="border: 1px solid black"><strong>Opera 10</strong></td>
<td style="border: 1px solid black">-</td>
<td style="border: 1px solid black">-</td>
<td style="border: 1px solid black">Ok</td>
<td style="border: 1px solid black">-</td>
</tr>
<tr>
<td style="border: 1px solid black"><strong>IE</strong></td>
<td style="border: 1px solid black">-</td>
<td style="border: 1px solid black">-</td>
<td style="border: 1px solid black">-</td>
<td style="border: 1px solid black">-</td>
</tr>
</tbody>
</table>
<p>Internet Explorer est pour le moment hors-jeu, sauf si on installe <a title="Google Chrome Frame" href="http://code.google.com/intl/fr-FR/chrome/chromeframe/">Google Chrome Frame</a>. Mais il semblerait que Microsoft s'intéresse au sujet pour l'avenir et participe à la rédaction de la spécification. En attendant, Flash conserve une avance confortable et profite de sa très large base installée. Le changement arrive bizarrement par l'embarqué, iPhone et iPod Touch en tête, qui, d'une part, supportent pleinement les balises <code>audio</code>, et <code>video</code>, et d'autre part prouvent que les utilisateurs peuvent se passer de Flash sur le web.</p>
<h4><a name="LeCanvas"></a>Le Canvas</h4>
<p>Passons maintenant au <code>canvas</code>. Inventé par Apple pour le Dashboard d'OS X et ses widgets, le <code>canvas</code> fournit une API JavaScript pour le dessin 2D. La balise définit une aire de dessins avec sa hauteur et sa largeur. L'objet DOM donne accès au contexte graphique qui possède les primitives de dessins. Outre les formes géométriques standards, l'API permet de faire de la composition, des transformations, de manipuler des images et d'afficher du texte formaté. Avec un timeout ou un intervalle sur l'objet et un peu de JavaScript, il devient possible d'animer les dessins. Les implémentations ne sont pas encore très optimisées. Un simple gif animé reste pour le moment plus performant en terme d'animation. Il existe déjà un tas de librairie JS construites autour de l'élément <code>canvas</code> pour générer des graphes et des charts par exemple (<a title="Flotr" href="http://solutoire.com/flotr/">Flotr</a>, <a title="ProtoChart" href="http://www.deensoft.com/lab/protochart/">ProtoChart</a>, <a title="fgCharting" href="http://www.filamentgroup.com/lab/jquery_visualize_plugin_accessible_charts_graphs_from_tables_html5_canvas/">fgCharting</a>).</p>
<div class="syntax_hilite">
<div id="html-16">
<div class="html"><span style="color: #009900;">&lt;canvas <span style="color: #000066;">id</span>=firstCanvas<span style="color: #ff0000;">"&gt;</span>Browser does not support the canvas element.<span style="color: #009900;">&lt;/canvas&gt;</span><br />
<span style="color: #009900;">&lt;script type="</span><span style="color: #000066;">text</span>/JavaScript<span style="color: #ff0000;">"&gt;</span><br />
var canvas=document.getElementById('myCanvas');<br />
var ctx=canvas.getContext('2d');<br />
ctx.fillStyle='#FF0006';<br />
ctx.fillRect(0,0,80,120);<br />
<span style="color: #009900;">&lt;/script&gt;</span> </span></div>
</div>
</div>
<p></p>
<p>Les détracteurs déplorent l'utilisation d'une API procédurale, et l'absence d'éléments crées dans l'arbre DOM de la page comme le fait SVG. Autre inconvénient, <code>canvas</code> travaille la composition directement en pixels et non en calques. SVCKit a donc implémenté en grande partie SVG dans <code>canvas</code> dans <a title="SVGCanvas" href="http://svgkit.sourceforge.net/web/SVGCanvas.html">SVGCanvas</a>. Il existe déjà beaucoup de documentations et tutoriels autour de <code>canvas</code> qui rencontre, malgré ses défauts (de jeunesse ?), un grand succès. Mozilla a même développé un IDE en ligne basé sur <code>canvas</code>, nom de code : <a title="BeSpin" href="https://bespin.mozilla.com/">BeSpin</a>.</p>
<p>Voilà pour les domaines d'application, passons maintenant à la question des navigateurs. Avec Apple pour inventeur et Mozilla comme évangéliste, <code>canvas</code> est déjà supporté nativement sur Safari, Firefox, Chrome et Opéra. Comme d'habitude IE est à la traine, mais il existe des contournements comme le plugin <a title="IECanvas" href="http://hg.mozilla.org/users/vladimir_mozilla.com/iecanvas">IECanvas</a>, ou le portage Flash <a title="ExplorerCanvas" href="http://code.google.com/p/explorercanvas/">ExplorerCanvas</a>.</p>
<h3><a name="Conclusion"></a>Conclusion</h3>
<p>Nous voici à la fin de ce tour d'horizon des nouveautés d'HTML5, côté contenu du moins.<br />
Avec les grands du web dans la poche, HTML5 est déjà promis à un bel avenir, malgré son jeune age. La prochaine échéance du W3C devrait être le passage en recommandation dans le courant de cette année peut-être. Si les WebForms ne sont pas pour tout de suite, le multimédia et le canvas sont déjà suffisamment supportés pour être utilisés aujourd'hui. Il faudra attendre la sortie d'IE 9 pour connaître les plans concrets de Microsoft sur le sujet. A mon humble avis, Microsoft intégrera HTML5 au fur et à mesure qu'il s'imposera sur le web. Il faudra aussi regarder de près l'évolution du standard CSS car HTML5 ne va pas sans CSS3. De ce côté, pas de crainte à avoir puisque même IE est dans la course.</p>
<p>Il reste un problème d'outillage, car il n'existe pas pour le moment de WYSIWYG compatible HTML5. Et il ne faut sans doute pas compter sur Adobe pour le faire rapidement. Apple propose déjà DashCode pour créer des widgets ou des applications web iPhone avec un éditeur graphique bien monté. Mais l'export vers d'autres navigateurs est presque impossible tant les applications construites reposent sur des fonctionnalités spécifiques de Safari.</p>
<p>Dans le prochain article, je vous présenterai les nouveautés JavaScript poussées par HTML5 et leur état actuel d'implémentation.</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/</link>
		<comments>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 18:25:17 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[closures]]></category>
		<category><![CDATA[Hotspot]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDK]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Jigsaw]]></category>
		<category><![CDATA[JRockIt]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Méthodes agiles]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[OpenJDK]]></category>
		<category><![CDATA[Sonatype]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4116</guid>
		<description><![CDATA[

La revue de presse de l'actualité Java/J2EE hebdomadaire proposée par Xebia.
Actualité éditeurs / SSII

Sonatype ouvre son dépôt maven pour java.net
La fusion JRockIt / Hotspot pas pour demain

Agilité

Utilisez-vous des métriques intelligentes sur vos projets ?

Le coin de la technique

Jigsaw, les modules du pauvre ?
Comment les closures seront implémentées dans OpenJDK 7 ?
L'actualité des bases de données [...]]]></description>
			<content:encoded><![CDATA[
<p><img style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br />
<em>La revue de presse de l'actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<p><strong>Actualité éditeurs / SSII</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Sonatypeouvresondptmavenpourja">Sonatype ouvre son dépôt maven pour java.net</a></li>
<li><a href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#LafusionJRockItHotspotpaspourd">La fusion JRockIt / Hotspot pas pour demain</a></li>
</ul>
<p><strong>Agilité</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Utilisezvousdesmtriquesintelli">Utilisez-vous des métriques intelligentes sur vos projets ?</a></li>
</ul>
<p><strong>Le coin de la technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Jigsawlesmodulesdupauvre">Jigsaw, les modules du pauvre ?</a></li>
<li><a href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Commentlesclosuresserontimplme">Comment les <em>closures</em> seront implémentées dans OpenJDK 7 ?</a></li>
<li><a href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#LactualitdesbasesdedonnesNoSQL">L'actualité des bases de données NoSQL toujours aussi riche</a></li>
<li><a href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Astucedelasemainercuprezlalist">Astuce de la semaine, récupérez la liste complète des options de votre JVM</a></li>
</ul>
<h3><a name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3>
<h4><a name="Sonatypeouvresondptmavenpourja"></a>Sonatype ouvre son dépôt maven pour java.net</h4>
<p>L'idée est venue d'une quantité toujours grandissante de plaintes sur les dépôts Maven fournis par java.net. A l'heure de la fusion annoncée entre Kenai et java.net, Kenai n'a aucune solution pour gérer les dépôts et java.net fait mauvaise presse sur ce point. Il n'aura pas fallu longtemps à Sonatype pour saisir l'opportunité de mettre en avant sa solution Nexus. L'éditeur propose donc à tous les projets java.net de migrer vers leur instance Nexus OSS, allant même jusqu'à organiser le 5 mars une grande journée migration, avec la mise à disposition pour tous des services de conseil et d'ingénierie interne. Outre la performance et la stabilité du dépôt Maven maintenu par Sonatype, Nexus génère des fichiers d'index utilisés par nos IDE pour rechercher les dépendances de nos POM.</p>
<ul>
<li><a title="La nouvelle sur DZone" href="http://java.dzone.com/news/sonatype-free-maven-repo">La nouvelle sur DZone</a></li>
<li><a title="Lannonce sur le blog Sonatype" href="http://www.sonatype.com/people/2010/02/java-net-maven-repository-rescue-mission-on-march-5th/">L'annonce sur le blog Sonatype</a></li>
</ul>
<h4><a name="LafusionJRockItHotspotpaspourd"></a>La fusion JRockIt / Hotspot pas pour demain</h4>
<p><a title="Nous en parlions il y a quelques semaines" href="http://blog.xebia.fr/2010/02/01/revue-de-presse-xebia-145/">Nous en parlions il y a quelques semaines</a>, Oracle envisage de ne proposer à l'avenir qu'une seule JVM, qui tirerait le meilleur des deux que la firme s'est offert (JRockit via BEA, et Hotpsot via Sun). Dans un récent <a title="webcast" href="https://channelsun.sun.com/media/show/15028">webcast</a> (via InfoQ), Mark Reinhold s'est exprimé sur le sujet. Cette fusion n'est pas pour tout de suite : trop de clients utilisent les fonctionnalités spécifiques à l'une ou l'autre des JVMs en production, et il serait risqué de les forcer à migrer vers une version fusionnée bancale. Ce dernier se dit jaloux de certaines fonctionnalités de JRockIt et donc particulièrement excité d'avoir l'occasion de l'étudier en profondeur. Cependant, ce qui transparait dans son discours (et peut être via nos diverses expérience), c'est que la JVM de Sun est en avance sur celle de BEA. La prochaine version fusionnée devrait donc tendre plus vers Hotspot que vers JRockit. En résumé rapide, cette future VM Oracle devrait avoir les fonctionnalités <em>runtime</em> de Hotspot, et le <em>garbage collector</em> et la robustesse de JRockit. Finalement, à part l'ébauche d'une <em>timeline</em>, nous ne sommes pas beaucoup plus avancés.<br />
Coté nouveautés du JDK 7, Mark Reinhold se dit aussi particulièrement excité par l'intégration du projet Coin (au contraire de la grande majorité des consultants Xebia, qui trouvent que la plupart de ces évolutions syntaxiques confinent au gadget).<br />
Il reparle aussi des <em>closures</em>, principalement sous l'angle des raisons de la polémique, mais personne ne semble réellement savoir comment elles seront implémentées dans le JDK 7 (voir ci-dessous pour l'avancement du projet Lambda).<br />
Dernière annonce, pour ceux qui comme lui sont impatients de voir une JVM enfin modulaire (aka Jigsaw, prévu dans le JDK 7, voir ci-dessous), ils devraient en avoir un aperçu mi-mars, avec la <em>release</em> 88 de l'OpenJDK.</p>
<p>Certains noteront avec un certain amusement (ou une certaine nostalgie) quelques ratés : <em>"We, at Sun..."</em></p>
<h3><a name="Agilit"></a>Agilité</h3>
<h4><a name="Utilisezvousdesmtriquesintelli"></a>Utilisez-vous des métriques intelligentes sur vos projets ?</h4>
<p><a title="Mike Griffiths" href="http://leadinganswers.typepad.com/leading_answers/2010/02/smart-metrics-slides.html">Mike Griffiths</a>, agiliste expérimenté et bloggeur actif, nous présente sa réflexion sur l'utilisation des métriques dans un projet.<br />
Au préalable,  Mike nous prévient que :</p>
<ul>
<li>Toutes les observations ne sont pas utiles et d'une grande aide pour analyser et comprendre un phénomène. Elles peuvent même amener à de mauvaises conclusions.</li>
<li>Certaines mesures très utiles ne sont pas facilement observables.</li>
</ul>
<p>Une autre caractéristique à ne pas négliger est <strong>l'effet Hawthorne</strong> :  L'observateur influence la mesure. On retrouve d'ailleurs ce phénomène en physique quantique. Mike nous explique alors que le fait d'observer et donc d'influencer la mesure,  à un effet <strong>positif</strong>.</p>
<p>Pour lui, une métrique « intelligente » doit avoir les caractéristiques suivantes :</p>
<ul>
<li>Simple et auto-générée.</li>
<li>Influence de manière significative ce que l'on cherche à observer.</li>
<li>Permet de prendre des décisions et décrire des tendances pour le futur.</li>
</ul>
<p>Mike nous conseille de donner plus d'attention aux métriques  permettant d'observer des tendances futures et d'anticiper.</p>
<p>On peut ainsi opposer aux vieilles métriques :  nombres de lignes codées,  points de fonctions réalisés ou nombres d'heures travaillées ;  des métriques plus « intelligentes » : confiance des sponsors, satisfaction client, nombre de fonctionnalités réalisées,  ou encore temps passé à la correction de bugs.</p>
<p>Dans la dernière partie de l'article sont présentés un certain nombre de métriques plus ou moins connues des agilistes, comme : le <em>taskboard</em> de <em>Scrum</em> ou <em>Kanban</em>. L'utilisation de métriques intelligentes est indispensable pour mener à bien un projet. Elles permettent d'observer des tendances, d'identifier et d'anticiper des problèmes; et ainsi, de prendre les bonnes décisions.</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la technique</h3>
<h4><a name="Jigsawlesmodulesdupauvre"></a>Jigsaw, les modules du pauvre ?</h4>
<p><a title="Adam Bien" href="http://www.adam-bien.com/inhalte/about/index.htm">Adam Bien</a> est l'un des <a title="Java champions" href="https://java-champions.dev.java.net/">Java champions</a> les plus visibles et les plus lus d'internet. Il a publié cette semaine un petit article au titre accrocheur : « <a title="Jigsaw  JDK 17 sera une solution qui permettra  de rpondre  80 des besoins de modularit" href="http://www.adam-bien.com/roller/abien/entry/jigsaw_jdk_1_7_will">Jigsaw / JDK 1.7 sera une solution qui permettra de répondre à 80% des besoins de modularité</a> ». Vous avez probablement suivi les différents épisodes et rebondissements de la modularité dans le JDK 7. C'est peut-être l'occasion de faire le point sur ce que propose Jigsaw.</p>
<p>Le projet <a title="Jigsaw" href="http://openjdk.java.net/projects/jigsaw/">Jigsaw</a> proposera une implémentation permettant la mise en place d'un système de modules bas niveau pour vos projets. Il sera également utilisé en interne pour découper le JDK Oracle/Sun lui-même.</p>
<ul>
<li>Jigsaw vous permettra  de choisir <strong>tout ou partie</strong> du JDK tout en restant 100% rétro-compatible, d'améliorer les temps de démarrage de la JVM et son utilisation mémoire.</li>
<li>Jigsaw  pourra être utilisé <strong>directement</strong> sur vos projets si vous disposez d'une JVM reposant sur ce système. Jigsaw sera chargé avant <code>rt.jar</code> et sera donc disponible à quiconque désirant l'utiliser. Ce projet étant open source, il sera également possible de réutiliser celui-ci dans d'autres contextes.</li>
<li>Jigsaw vous permettra de rendre vos applications modulaires <strong>progressivement</strong>. Nul besoin de migrer vos applications dans leur ensemble pour tirer parti des bénéfices de la modularité. Un même <em>package</em> peut être éclaté dans plusieurs modules.</li>
<li>Contrairement à OSGi, Jigsaw ne vous permet pas le rechargement de modules à chaud. Vos modules sont chargés <strong>statiquement</strong> au démarrage de vos applications.</li>
<li>Tous vos modules sont chargés dans <strong>un même classloader</strong>, cela permet de simplifier grandement son utilisation. Du même coup, il vous sera probablement possible de 'tricher' en chargeant, au runtime,  des classes d'un module sans que vous en ayez réellement le droit.</li>
</ul>
<p>Si vous confondiez modularité du JDK avec OSGi, cette liste vous a certainement ouvert les yeux :  Jigsaw vous propose une solution beaucoup moins fournie qu'OSGi.</p>
<p>Dans les faits, ce projet a été créé, avant tout, pour casser  notre bon vieux JDK monolithique. Bon nombre de polémiques ont été faites sur ce choix. Pourquoi  se contenter d'aborder 80% des problématiques de la modularisation avec une nouvelle solution alors qu'OSGi en aborderait 90% ? La simplicité et la souplesse d'utilisation ont été préférées à une solution décrite comme lourde (nécessitant beaucoup de glue), vieillissante (datant de 1998) et difficile à maîtriser. Ce choix a été sans conteste difficile à effectuer, il s'est ailleurs attiré les foudres des défenseurs d'OSGi, mais reste complètement défendable.</p>
<h4><a name="Commentlesclosuresserontimplme"></a>Comment les <em>closures</em> seront implémentées dans OpenJDK 7 ?</h4>
<p>Fin 2009, le projet Lambda, dont le but est d'apporter les <em>closures</em> à la prochaine version de Java, <a title="apparaissait au sein d'OpenJDK" href="http://blog.xebia.fr/2009/12/14/revue-de-presse-xebia-138/#LeprojetLambdaapparatauseindOp">apparaissait au sein d'OpenJDK</a>. Le lancement du projet faisait suite <a title="aux rebondissements" href="http://blog.xebia.fr/2009/11/23/revue-de-presse-xebia-135/#JDKJEEetMavenlesannoncesdeDevo">aux rebondissements</a> dans l'actualité du JDK 7 lors de la conférence Devoxx un mois auparavant. Une <a title="documentation" href="http://cr.openjdk.java.net/~mr/lambda/straw-man/">documentation</a> montrant la syntaxe des <em>closures</em> avait accompagné la création du projet, plus tard, un <em>draft</em> d'une <a title="spcification plus formelle" href="http://mail.openjdk.java.net/pipermail/lambda-dev/attachments/20100212/af8d2cc5/attachment-0001.txt">spécification plus formelle</a> est apparue, mais <em>quid</em> de l'implémentation ?<br />
Rémi Forax, contributeur au projet Lambda, <a title="a mis à disposition" href="http://weblogs.java.net/blog/forax/archive/2010/02/22/fosdem-presentations">a mis à disposition</a> la présentation qu'il a faite au FOSDEM'10, dans laquelle il résume <a title="les discussions" href="http://mail.openjdk.java.net/pipermail/lambda-dev/2009-December/thread.html">les discussions</a> ayant eu lieu sur la <em>mailing list</em> du projet concernant les possibilités d'implémentation :</p>
<ul>
<li>Convertir les <em>closures</em> en classes anonymes. Cette solution présente l'inconvénient de produire beaucoup de classes et pose problème pour certaines constructions liées au <em>closures</em>.</li>
<li>Convertir les <em>closures</em> en invocations dynamiques telles que le permettra la <a title="JSR-292 (Supporting Dynamically Typed Languages on the Java Platform)" href="http://www.jcp.org/en/jsr/detail?id=292">JSR-292 (Supporting Dynamically Typed Languages on the Java Platform)</a>. Cette solution ne produit pas de classes supplémentaires et bénéficie de bonnes performances puisque l'invocation dynamique présentera un temps d'exécution similaire aux invocations de méthode classiques.</li>
</ul>
<p>Le reste de ses <em>slides</em> présente certaines des problématiques d'implémentations des <em>closures</em> liées à l'accès aux variables locales et aux champs de la classe hôte.</p>
<h4><a name="LactualitdesbasesdedonnesNoSQL"></a>L'actualité des bases de données NoSQL toujours aussi riche</h4>
<p>Depuis plusieurs mois maintenant le mouvement NoSQL <a title="s'est installé dans l'actualité" href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#LemouvementNoSQLdiviseetintrig">s'est installé dans l'actualité</a>. A Paris, le <a title="NoSQL User Group" href="https://sites.google.com/a/octo.com/nosql/home">NoSQL User Group</a> a attiré l'attention en réunissant une cinquantaine de personnes à chacune de ses 2 sessions jusqu'à présent.</p>
<p>D'un point de vue plus général, l'actualité des bases de données NoSQL est marquée par l'intérêt croissant qu'elles suscitent, et par leur évolution rapide grâce à l'effort soutenu de leurs développeurs. Ainsi on a pu noter récemment :</p>
<ul>
<li><a title="Neo4j" href="http://neo4j.org/">Neo4j</a>, une base de données orienté graphe, est maintenant <a title="disponible en version 10 finale" href="http://news.neo4j.org/2010/02/neo4j-10-released.html">disponible en version 1.0 finale</a>. L'intérêt de la représentation en graphe est la possibilité de modéliser les données relatives aux réseaux sociaux, mais également tout type d'objets qui seraient liés entre eux de manière arbitraire. De plus, il est possible d'appliquer à ces données divers algorithmes de graphe classiques tels que la détermination du plus court chemin entre deux objets ou de l'objet central/majeur dans un nuage d'élément.</li>
<li><a title="Cassandra" href="http://incubator.apache.org/cassandra/">Cassandra</a> vient pour sa part d'être publié en version 0.5.1, et connait un succès tout particulier puisque Twitter vient d'annoncer qu'il l'utiliserait désormais comme solution de persistance en remplacement de MySQL. Par ailleurs le projet <a href="http://github.com/tjake/Lucandra">Lucandra</a> a été créé récemment pour permettre d'utiliser Cassandra comme solution de persistance pour les indexes Lucene. Donné à la Fondation Apache par Facebook, Cassandra est pour rappel un hybride entre BigTable de Google et Dynamo d'Amazon.</li>
<li><a title="HBase" href="http://hadoop.apache.org/hbase/">HBase</a> profite d'une communauté très active et d'un intérêt important, renforcé par sa position de sous-projet du <a title="très populaire Hadoop" href="http://blog.xebia.fr/2009/06/15/revue-de-presse-xebia-113/#YahoodistribueHadoop">très populaire Hadoop</a>. Sematext vient de publier un <a title="&lt;i&gt;digest&lt;/i&gt; de l'actualité récente" href="http://blog.sematext.com/2010/02/28/hbase-digest-february-2010/"><em>digest</em> de l'actualité récente</a> de ce projet. Celle-ci est principalement marquée par le développement d'une <a title="réplication &lt;i&gt;multi datacenter&lt;/i&gt;" href="https://issues.apache.org/jira/browse/HBASE-1295">réplication <em>multi datacenter</em></a>, par l'arrivée d'un <a title="plugin DataNucleus pour HBase" href="http://www.datanucleus.org/plugins/store.hbase.html">plugin DataNucleus pour HBase</a> et par la disponibilité prochaine d'une solution de <a title="benchmark pour les cloud storages" href="http://www.brianfrankcooper.net/pubs/ycsb.pdf"><em>benchmark</em> pour les <em>cloud storages</em></a> développée par Yahoo!.</li>
</ul>
<p>Enfin, deux conférences entièrement dédiées au NoSQL sont à venir : <a title="NoSQL Live" href="http://nosqlboston.eventbrite.com/">NoSQL Live</a> le 11 mars à Boston et, plus proche de nous, <a title="NoSQL Europe" href="http://nosqleu.com/">NoSQL Europe</a> du 20 au 22 avril à Londres.</p>
<h4><a name="Astucedelasemainercuprezlalist"></a>Astuce de la semaine, récupérez la liste complète des options de votre JVM</h4>
<p>Cette astuce est complètement inutile, et donc également complètement indispensable. <a title="Cet article" href="http://representz.blogspot.com/2010/02/get-complete-list-of-all-possible-jvm.html">Cet article</a> nous propose une petite commande permettant de récupérer la liste complète des options de votre JVM Hotspot à partir de sa library native Linux, la voici :</p>
<div class="syntax_hilite">
<div id="java-18">
<div class="java">prompt$&nbsp; strings $JAVA_HOME/jre/lib/amd64/server/libjvm.<span style="color: #006600;">so</span> | grep -B646 assert_null$ | grep -v <span style="color: #ff0000;">'{'</span> | grep -v <span style="color: #ff0000;">'&amp;amp;'</span> | grep -v <span style="color: #ff0000;">'/'</span> | grep -v <span style="color: #ff0000;">'%'</span> | grep -v assert_null</div>
</div>
</div>
<p></p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Grails Spring Security Plugin, la sécurité facile</title>
		<link>http://blog.xebia.fr/2010/02/25/grails-spring-security-plugin-la-securite-facile/</link>
		<comments>http://blog.xebia.fr/2010/02/25/grails-spring-security-plugin-la-securite-facile/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 09:00:12 +0000</pubDate>
		<dc:creator>Aurélien Maury</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[productivité]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4091</guid>
		<description><![CDATA[
Le monde Grails a le vent en poupe ces temps-ci. Bien avant le printemps on peut voir fleurir des dizaines de tutoriaux sur le net pour prendre l'outil en main et créer sa première application. Mais un simple "Getting started" ne suffit pas toujours à bien prendre la mesure de la puissance de Grails. 
Je [...]]]></description>
			<content:encoded><![CDATA[
<p>Le monde Grails a le vent en poupe ces temps-ci. Bien avant le printemps on peut voir fleurir des dizaines de tutoriaux sur le net pour prendre l'outil en main et créer sa première application. Mais un simple "Getting started" ne suffit pas toujours à bien prendre la mesure de la puissance de Grails. </p>
<p>Je vous propose donc un petit tutoriel pour mettre en place une gestion des utilisateurs, avec gestion des rôles, filtres URL/Rôles, formulaire de souscription de compte. Pour cela, nous allons nous appuyer sur le Spring Security Plugin de Grails. C'est une étape incontournable de la création d'application, et nous allons pouvoir constater à quel point l'utilisation de Grails booste la productivité.</p>
<h3><a name="Bnisoitlescaffolding"></a>Béni soit le scaffolding</h3>
<p>Commençons par créer l'application <code>BookStore</code> qui nous servira de base, ainsi qu'une classe de domaine <code>Book</code>.</p>
<div class="syntax_hilite">
<div id="java-28">
<div class="java">grails create-app BookStore<br />
cd BookStore<br />
grail create-domain-<span style="color: #000000; font-weight: bold;">class</span> fr.<span style="color: #006600;">xebia</span>.<span style="color: #006600;">bookstore</span>.<span style="color: #006600;">common</span>.<a href="http://www.google.com/search?q=allinurl%3ABook+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Book</span></a></div>
</div>
</div>
<p></p>
<p>Apportons quelques modifications à notre classe pour qu'elle soit un peu plus parlante dans la suite des exemples :</p>
<p><strong>grails-app/domain/fr/xebia/bookstore/common/Book.groovy</strong></p>
<div class="syntax_hilite">
<div id="java-29">
<div class="java">package fr.<span style="color: #006600;">xebia</span>.<span style="color: #006600;">bookstore</span>.<span style="color: #006600;">common</span></p>
<p><span style="color: #000000; font-weight: bold;">class</span> <a href="http://www.google.com/search?q=allinurl%3ABook+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Book</span></a> <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> titre<br />
&nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> auteur<br />
&nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3ADate+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Date</span></a> premierePublication</p>
<p>&nbsp; &nbsp; <span style="color: #993333;">static</span> constraints = <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; titre<span style="color: #66cc66;">&#40;</span>nullable:<span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; auteur<span style="color: #66cc66;">&#40;</span>nullable:<span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Maintenant nous générons le CRUD autour de notre classe <code>Book</code>.</p>
<div class="syntax_hilite">
<div id="java-30">
<div class="java">grails generate-all fr.<span style="color: #006600;">xebia</span>.<span style="color: #006600;">bookstore</span>.<span style="color: #006600;">common</span>.<a href="http://www.google.com/search?q=allinurl%3ABook+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Book</span></a></div>
</div>
</div>
<p></p>
<p>Installation du plugin Spring Security. Pas de panique, <code>acegi</code> est toujours le nom du plugin, c'est un héritage de l'histoire</p>
<div class="syntax_hilite">
<div id="java-31">
<div class="java">grails install-plugin acegi</div>
</div>
</div>
<p></p>
<p>Creation des classes de domaines pour la gestion de la sécurité, Utilisateur, roles et mapping de security et génération des managers associés</p>
<div class="syntax_hilite">
<div id="java-32">
<div class="java">grails create-auth-domains&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; fr.<span style="color: #006600;">xebia</span>.<span style="color: #006600;">bookstore</span>.<span style="color: #006600;">security</span>.<span style="color: #006600;">User</span> <br />
&nbsp; &nbsp; &nbsp; fr.<span style="color: #006600;">xebia</span>.<span style="color: #006600;">bookstore</span>.<span style="color: #006600;">security</span>.<span style="color: #006600;">Role</span> <br />
&nbsp; &nbsp; &nbsp; fr.<span style="color: #006600;">xebia</span>.<span style="color: #006600;">bookstore</span>.<span style="color: #006600;">security</span>.<span style="color: #006600;">RequestMap</span><br />
grails generate-manager</div>
</div>
</div>
<p></p>
<p>Maintenant nous générons les composants nécessaires à la souscription d'un compte par un internaute.</p>
<div class="syntax_hilite">
<div id="java-33">
<div class="java">grails generate-registration</div>
</div>
</div>
<p></p>
<p>A ce stade, nous disposons des contrôleurs suivants (et des vues qui vont avec) :</p>
<ul>
<li><strong>CaptchaController</strong> : permet de générer des images captcha pour éviter que des robots ne viennent créer des comptes utilisateurs</li>
<li><strong>fr.xebia.bookstore.common.BookController</strong> : CRUD de gestion de la classe <code>Book</code></li>
<li><strong>LoginController</strong> : Contrôleur de connexion</li>
<li><strong>LogoutController</strong> : Contrôleur de déconnexion</li>
<li><strong>RegisterController</strong> : Contrôleur d'enregistrement d'un compte utilisateur par un internaute</li>
<li><strong>RequestMapController</strong> : CRUD de gestion des règles de sécurité</li>
<li><strong>RoleController</strong> : CRUD de gestion des rôles</li>
<li><strong>UserController</strong> : CRUD de gestion des utilisateurs, destiné à notre espace d'administration</li>
</ul>
<p>On peut déjà démarrer l'application avec un <code>grails run-app</code> et voir ce que ça donne :</p>
<div align="center">
<img src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_11.png" alt="grails_tuto_1" title="grails_tuto_1" width="620" height="468" class="aligncenter size-full wp-image-4102" />
</div>
<h3><a name="Configurationetscurisation"></a>Configuration et sécurisation</h3>
<p>Cela fait déjà beaucoup de matières à exploiter en un temps relativement court. Mais en l'état c'est encore un peu brut de fonderie pour ressembler à une <em>vraie</em> application. Nous allons donc faire un peu de configuration et de rangement autour de tout ce code parachuté par Grails. Pour atteindre notre objectif, nous allons maintenant procéder à la sécurisation des écrans de :</p>
<ul>
<li>CRUD complet des utilisateurs</li>
<li>CRUD complet des rôles</li>
<li>CRUD complet des mappings de sécurité</li>
<li>Création de <code>Book</code></li>
</ul>
<p>Tout est déjà en place pour cela grâce au code que nous avons généré. Commençons par utiliser le <strong><code>RoleController</code></strong> pour créer un rôle utilisateur et un rôle administrateur :</p>
<div align="center">
    <img src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_2.png" alt="grails_tuto_2" title="grails_tuto_2" width="620" height="361" class="aligncenter size-full wp-image-4105" />
</div>
<p>Maintenant que nous avons des rôles, il faut créer un compte utilisateur avec le rôle ROLE_ADMIN pour éviter de se retrouver bloqué quand on posera les mappings de sécurité. Cette fois, c'est du coté des écrans du <strong><code>UserController</code></strong> que ça se passe :</p>
<div align="center">
    <img src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_3.png" alt="grails_tuto_3" title="grails_tuto_3" width="620" height="431" class="aligncenter size-full wp-image-4106" />
</div>
<p>Et pour finir, on pose des mappings de sécurité sur les URL qui nous intéressent, avec la liste des rôles autorisés à accéder. Pour cela, nous utilisons le <strong><code>RequestMapController</code></strong> :</p>
<div align="center">
    <img src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_4.png" alt="grails_tuto_4" title="grails_tuto_4" width="620" height="331" class="aligncenter size-full wp-image-4107" />
</div>
<p>Et voilà ! Notre application répond déjà mieux à nos attentes en terme de sécurité :</p>
<ul>
<li>tout le monde peut voir la liste des <code>Book</code> présents en base.</li>
<li>seuls les utilisateur ayant le rôle ROLE_USER ou ROLE_ADMIN peuvent insérer de nouveaux <code>Book</code></li>
<li>seuls les utilisateur ayant le rôle ROLE_ADMIN peuvent créer des utilisateurs, des rôles et modifier les règles de sécurité</li>
</ul>
<p>Si un utilisateur non authentifié tente d'accéder à une URL protégée, il sera automatiquement redirigé vers un écran de login avant d'accéder à la page désirée.</p>
<h3><a name="Adaptationsdeconfort"></a>Adaptations de confort</h3>
<p>Par défaut, une application Grails utilise HSQLDB et démarre avec une base vierge à chaque lancement. Nous allons donc changer cela pour intégrer directement à chaque démarrage les rôles, mappings de sécurité et un compte administrateur :</p>
<p><strong>grails-app/conf/BootStrap.groovy</strong></p>
<div class="syntax_hilite">
<div id="java-34">
<div class="java"><span style="color: #a1a100;">import fr.xebia.bookstore.security.User</span><br />
<span style="color: #a1a100;">import fr.xebia.bookstore.security.Role</span><br />
<span style="color: #a1a100;">import fr.xebia.bookstore.security.RequestMap</span></p>
<p><span style="color: #000000; font-weight: bold;">class</span> BootStrap <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; def authenticateService<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; def init = <span style="color: #66cc66;">&#123;</span> servletContext -&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; def roleAdmin = <span style="color: #000000; font-weight: bold;">new</span> Role<span style="color: #66cc66;">&#40;</span>authority: <span style="color: #ff0000;">'ROLE_ADMIN'</span>, description: <span style="color: #ff0000;">'Administrateur'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; def roleUser = <span style="color: #000000; font-weight: bold;">new</span> Role<span style="color: #66cc66;">&#40;</span>authority: <span style="color: #ff0000;">'ROLE_USER'</span>, description: <span style="color: #ff0000;">'Utilisateur'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; def userAdmin = <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #66cc66;">&#40;</span>username: <span style="color: #ff0000;">'admin'</span>, userRealName: <span style="color: #ff0000;">'ATTAN Charles'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; passwd: authenticateService.<span style="color: #006600;">encodePassword</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'admin'</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; enabled: <span style="color: #000000; font-weight: bold;">true</span>, email: <span style="color: #ff0000;">'admin@bookstore.fr'</span><span style="color: #66cc66;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; userAdmin.<span style="color: #006600;">addToAuthorities</span><span style="color: #66cc66;">&#40;</span>roleAdmin<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; userAdmin.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; def protectBookCreation = <span style="color: #000000; font-weight: bold;">new</span> RequestMap<span style="color: #66cc66;">&#40;</span>url: <span style="color: #ff0000;">'/book/create*'</span>, configAttribute: <span style="color: #ff0000;">'ROLE_ADMIN,ROLE_USER'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; def protectUserManaging = <span style="color: #000000; font-weight: bold;">new</span> RequestMap<span style="color: #66cc66;">&#40;</span>url: <span style="color: #ff0000;">'/user/*'</span>, configAttribute: <span style="color: #ff0000;">'ROLE_ADMIN'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; def protectRoleManaging = <span style="color: #000000; font-weight: bold;">new</span> RequestMap<span style="color: #66cc66;">&#40;</span>url: <span style="color: #ff0000;">'/role/*'</span>, configAttribute: <span style="color: #ff0000;">'ROLE_ADMIN'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; def protectSecurityMappingManaging = <span style="color: #000000; font-weight: bold;">new</span> RequestMap<span style="color: #66cc66;">&#40;</span>url: <span style="color: #ff0000;">'/requestMap/*'</span>, configAttribute: <span style="color: #ff0000;">'ROLE_ADMIN'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; def destroy = <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Voilà, au prochain démarrage nous retrouverons toutes nos chères données directement en base. Ensuite, nous pouvons nous attaquer à l'enregistrement des internautes en tant qu'utilisateur standard. Par défaut, le formulaire lié au <strong><code>RegisterController</code></strong> crée des utilisateurs sans rôle, ce qui ne nous convient pas du tout. De plus, comme il serait agréable pour les nouveaux utilisateurs de recevoir un mail de confirmation de leur inscription, on va le mettre en place dans la foulée :</p>
<p><strong>grails-app/conf/SecurityConfig.groovy</strong></p>
<div class="syntax_hilite">
<div id="java-35">
<div class="java">security <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; active = <span style="color: #000000; font-weight: bold;">true</span></p>
<p>&nbsp; &nbsp; loginUserDomainClass&nbsp; &nbsp; = <span style="color: #ff0000;">"fr.xebia.bookstore.security.User"</span><br />
&nbsp; &nbsp; authorityDomainClass&nbsp; &nbsp; = <span style="color: #ff0000;">"fr.xebia.bookstore.security.Role"</span><br />
&nbsp; &nbsp; requestMapClass&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= <span style="color: #ff0000;">"fr.xebia.bookstore.security.RequestMap"</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; defaultRole&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= <span style="color: #ff0000;">'ROLE_USER'</span>&nbsp; &nbsp;<span style="color: #808080; font-style: italic;">// Role par defaut des nouveaux utilisateurs</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; useMail&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= <span style="color: #000000; font-weight: bold;">true</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// specifie d'envoyer un mail à l'enregistrement d'un compte</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; mailHost&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span style="color: #ff0000;">'localhost'</span>&nbsp; &nbsp;<span style="color: #808080; font-style: italic;">// serveur d'envoi de mails</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; mailProtocol&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span style="color: #ff0000;">'smtp'</span>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// nom du protocole JavaMail</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; mailFrom&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span style="color: #ff0000;">'no.reply@bookstore.fr'</span>&nbsp; &nbsp;<span style="color: #808080; font-style: italic;">// adresse de l'envoyeur du mail</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; mailPort&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span style="color: #cc66cc;">25</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// port de connexion au serveur de mail</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Avec ces modifications, tous les internautes qui créeront des comptes par le formulaire obtiendrons le rôle ROLE_USER et recevront un mail comme ceci :</p>
<div align="center">
    <img src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_5.png" alt="grails_tuto_5" title="grails_tuto_5" width="412" height="247" class="aligncenter size-full wp-image-4108" />
</div>
<p>Si vous souhaitez adapter un peu le format du mail, le code associé est situé vers la ligne 170 du code de <strong><code>RegisterController</code></strong> :</p>
<p><strong>extrait de grails-app/controllers/RegisterController.groovy</strong></p>
<div class="syntax_hilite">
<div id="java-36">
<div class="java"><span style="color: #66cc66;">&#91;</span>...<span style="color: #66cc66;">&#93;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>config.<span style="color: #006600;">security</span>.<span style="color: #006600;">useMail</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> emailContent = <span style="color: #ff0000;">""</span><span style="color: #ff0000;">"You have signed up for an account at:</p>
<p>&nbsp;${request.scheme}://${request.serverName}:${request.serverPort}${request.contextPath}</p>
<p>&nbsp;Here are the details of your account:<br />
&nbsp;-------------------------------------<br />
&nbsp;LoginName: ${person.username}<br />
&nbsp;Email: ${person.email}<br />
&nbsp;Full Name: ${person.userRealName}<br />
&nbsp;Password: ${params.passwd}<br />
"</span><span style="color: #ff0000;">""</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; def email = <span style="color: #66cc66;">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; to: <span style="color: #66cc66;">&#91;</span>person.<span style="color: #006600;">email</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #808080; font-style: italic;">// 'to' expects a List, NOT a single email address</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subject: <span style="color: #ff0000;">"[${request.contextPath}] Account Signed Up"</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text: emailContent <span style="color: #808080; font-style: italic;">// 'text' is the email body</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailerService.<span style="color: #006600;">sendEmails</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>email<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#91;</span>...<span style="color: #66cc66;">&#93;</span></div>
</div>
</div>
<p></p>
<p>Et voilà comment en quelques minutes on peut avoir une application, basique certes... mais sécurisée !</p>
<h3><a name="Pourallerplusloin"></a>Pour aller plus loin</h3>
<p>Le plugin Grails Spring Security possède de nombreuses autres options. Je n'ai développé ici que la stratégie de stockage des règles de sécurité dans la base, mais il est également possible de les définir directement dans le fichier <strong><code>SecurityConfig</code></strong>, ou par annotations des méthodes des contrôleurs.</p>
<p>On peut appuyer la sécurité sur <a href="http://fr.wikipedia.org/wiki/OpenID" title="OpenID" >OpenID</a>, <a href="http://fr.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol" title="LDAP" >LDAP</a>, <a href="http://fr.wikipedia.org/wiki/Central_Authentication_Service" title="CAS" >CAS</a>, <a href="http://fr.wikipedia.org/wiki/NT_Lan_Manager" title="NTLM" >NTLM</a> ou même utiliser une connexion <a href="http://developers.facebook.com/connect.php" title="FaceBook Connect" >FaceBook Connect</a>. On peut changer l'algorithme de cryptage des mots de passe, les possibilités sont assez étendues.</p>
<p>Et si vraiment Spring Security ne vous convient pas, il existe d'autres solutions de sécurité à base de plugins comme <a href="http://www.grails.org/plugin/shiro" title="Shiro" >Shiro</a> ou <a href="http://www.grails.org/plugin/stark-security" title="Stark" >Stark</a>, qui feront peut-être l'objet d'autres articles dans le futur.</p>
<h3><a name="Conclusion"></a>Conclusion</h3>
<p>L'utilisation du plugin Grails Spring Security permet de mettre le pied à l'étrier très rapidement, en s'appuyant sur un standard des frameworks de sécurité en Java. J'ai personnellement beaucoup apprécié la simplicité de prise en main et les exemples fournis dans la documentation officielle. Je vous invite d'ailleurs à la parcourir, elle contient d'autres tutoriels notamment pour l'utilisation de OpenID et LDAP.</p>
<p><em>Nota Bene : Cet article est fortement inspiré de <a href="http://www.grails.org/AcegiSecurity+Plugin+-+Basic+Tutorial" title="celuici" >celui-ci</a>, mais il méritait des précisions à mon goût.</em></p>
<p><strong>Ressources :</strong></p>
<ul>
<li><a href="http://www.grails.org" title="Le projet Grails" >Le projet Grails</a></li>
<li><a href="http://grails.org/plugin/acegi" title="Grails Spring Security Plugin" >Grails Spring Security Plugin</a></li>
<li><a href="http://www.grails.org/AcegiSecurity+Plugin+-+Tutorials" title="Tutoriels officiels Spring Security Plugin" >Tutoriels officiels Spring Security Plugin</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/02/25/grails-spring-security-plugin-la-securite-facile/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Catalogue Xebia Training</title>
		<link>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/</link>
		<comments>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 12:32:34 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Exploitation]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Méthodes agiles]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[eXtrem Programming]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4085</guid>
		<description><![CDATA[

Nous sommes heureux de vous proposer le nouveau catalogue de formation Xebia Traning :

Le catalogue numérique.
Le catalogue PDF.

Xebia Training se positionne logiquement dans la continuité de Xebia, tant sur la qualité de son offre de formation technique que méthodologique (méthodes agiles), en proposant des formations haut de gamme animées uniquement par les référents de leur [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://flipflashpages.uniflip.com/2/26742/50371/pub/"><img src="http://blog.xebia.fr/wp-content/uploads/2010/02/xebia-training.png" style="margin: 1em 1em 1em 1em; float: right;" /></a><br />
Nous sommes heureux de vous proposer le nouveau <a href="http://flipflashpages.uniflip.com/2/26742/50371/pub/">catalogue de formation Xebia Traning</a> :</p>
<ul>
<li>Le <a href="http://flipflashpages.uniflip.com/2/26742/50371/pub/">catalogue numérique</a>.</li>
<li>Le <a href="http://training.xebia.fr/wp-content/uploads/catalogue%20des%20formations%202010-xebia-training.pdf">catalogue PDF</a>.</li>
</ul>
<p><a href="http://training.xebia.fr">Xebia Training</a> se positionne logiquement dans la continuité de Xebia, tant sur la qualité de son offre de formation technique que méthodologique (méthodes agiles), en proposant des formations haut de gamme animées uniquement par les référents de leur domaine.</p>
<p>Avec pour principe premier le refus de tout compromis sur la qualité du formateur et du contenu, <a href="http://training.xebia.fr">Xebia Training</a> fait systématiquement intervenir des acteurs de références dans leurs domaines respectifs.</p>
<p>Nos formations, savant équilibre entre théorie et travaux pratiques, sont destinées à un large public soucieux d’acquérir les meilleures pratiques de notre industrie.</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AMQP, une alternative à JMS ?</title>
		<link>http://blog.xebia.fr/2010/02/23/amqp-une-alternative-a-jms/</link>
		<comments>http://blog.xebia.fr/2010/02/23/amqp-une-alternative-a-jms/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 13:32:48 +0000</pubDate>
		<dc:creator>Guillaume Arnaud</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[AMQP]]></category>
		<category><![CDATA[broker]]></category>
		<category><![CDATA[JMS]]></category>
		<category><![CDATA[qpid]]></category>
		<category><![CDATA[rabbitmq]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4067</guid>
		<description><![CDATA[
Vous avez une application Java qui doit envoyer et recevoir des messages à droite et à gauche pour des raisons qui n'appartiennent qu'à vous... Votre premier réflexe sera sûrement de contacter votre vieil ami JMS. Pour ça, vous aurez aussi besoin d'un broker de message, mais vous n'êtes pas très riche et des outils comme [...]]]></description>
			<content:encoded><![CDATA[
<p>Vous avez une application Java qui doit envoyer et recevoir des messages à droite et à gauche pour des raisons qui n'appartiennent qu'à vous... Votre premier réflexe sera sûrement de contacter votre vieil ami JMS. Pour ça, vous aurez aussi besoin d'un broker de message, mais vous n'êtes pas très riche et des outils comme WebSphere ou Tibco sont hors de portée... Vous aurez alors de <a title="fortes chances" href="http://www.google.com/insights/search/#cat=31&amp;q=activemq%2Copenjms%2Cjboss%20messaging%2Cjoram&amp;cmpt=q">fortes chances</a> de vous tourner vers votre autre vieil ami ActiveMQ. Bon d'accord, l'amitié ça compte, mais par ailleurs d'autres amis (des vrais !) vous signalent qu'ils ont eu quelques problèmes de blocage de file avec ActiveMQ et qu'ils ont eu du mal à identifier ces problèmes. En plus vous avez encore d'autres amis qui aimeraient bien communiquer avec vous sur ce même broker mais leurs applications tournent en ruby et C++ qui parlent mal le JMS... C'est le moment idéal de vous présenter un nouvel ami : AMQP !</p>
<p>AMQP (<a title="Advanced Message Queuing Protocol" href="http://jira.amqp.org/confluence/display/AMQP/Advanced+Message+Queuing+Protocol">Advanced Message Queuing Protocol</a>) est un protocole de messagerie créé à <a title="l'initiative" href="http://queue.acm.org/detail.cfm?id=1255424">l'initiative</a> de la banque JP Morgan Chase pour gérer la communication entre ses différents partenaires. Le but affiché était de fournir une solution alternative aux solutions payantes et relativement chères dans le domaine du MOM (Message-Oriented Middleware) dominé largement par Websphere MQ d'IBM et RendezVous de Tibco (<a title="93% du marché à eux deux en 2008" href="http://openenterprisenews.com/analysis/can-amqp-break-ibms-mom-monopoly-part-1.html">93% du marché à eux deux en 2008</a>). Un certain nombre de <a title="partenaires" href="http://jira.amqp.org/confluence/display/AMQP/AMQP+Working+Group">partenaires</a> se sont fédérés autour de ce projet pour aboutir à une première <a title="spcification" href="http://jira.amqp.org/confluence/display/AMQP/AMQP+Specification">spécification</a> en 2006. L'ambition avouée est qu'elle devienne l'équivalent du HTTP pour l'internet, ce qui explique qu'elle décrive aussi bien les différentes sémantiques liées au MOM que la partie plus bas niveau du transport de ces messages. Cette normalisation permet la multiplication des solutions clientes ou serveurs dont la compatibilité sera garantie par cette spécification. Par exemple, un broker de message écrit en Erlang comme RabbitMQ transférera de façon transparente un message d'un client ruby vers un autre client Java/JMS.</p>
<p>Notez bien qu'AMQP s'identifie clairement comme un protocole et non comme une API, contrairement à JMS. Donc un client Java basé sur JMS peut, moyennant des adaptations plus ou moins coûteuses, communiquer avec un broker AMQP.</p>
<h3><a name="Unnouveauprotocole"></a>Un nouveau protocole</h3>
<p>Les spécifications AMQP sont parties de cas d'utilisation très concrets pour aboutir à des spécifications essayant d'englober un maximum de typologies. Voici quelques unes d'entre elles (<a title="QPid" href="http://qpid.apache.org/faq.html#FAQ-WhatmessagingtopologiesaresupportedbyAMQPandQpid%253F">QPid</a> ou <a title="RabbitMQ" href="http://www.rabbitmq.com/faq.html#scenarios">RabbitMQ</a>) :</p>
<div><img src="http://blog.xebia.fr/wp-content/uploads/2010/02/topologies-amqp.png" border="0" alt="" /></div>
<ul>
<li><strong>Store-and-forward:</strong> les messages sont persistés puis récupérés par un seul client qui décidera s'il faut les supprimer.</li>
<li><strong>Point-to-point:</strong> une communication dédiée entre un émetteur et un receveur, éventuellement bidirectionnelle.</li>
<li><strong>One-to-many (ou fanout):</strong> un message est retransmis à toutes les queues d'une zone d'échange. Ceci permet de modéliser le multicast.</li>
<li><strong>Transaction (distribuée ou pas):</strong> l'émetteur peut englober un paquet de messages dans une transaction, ces messages ne pourront être lus que lorsque l'émetteur les aura acquittés.</li>
<li><strong>Publish-subscribe (pub-sub):</strong> plusieurs émetteurs postent des messages en fonction de mots clés (topics) auxquels s'abonnent plusieurs receveurs.</li>
<li><strong>Content-based routing:</strong> le routage des messages est déterminé selon le contenu du message ou par une fonction externe.</li>
<li><strong>Queued file transfer:</strong> on n'envoie plus de simples messages mais des fichiers, voire tout le contenu d'un répertoire.</li>
</ul>
<p>Ces différentes architectures se combinent bien sûr entre elles, je pense particulièrement aux transactions. Ces schémas de base un peu abstraits rejoignent des concepts ou des applications connus de tous. Un serveur de mail par exemple s'appuiera sur un "store-and-forward", un chat sur un "point-to-point" ou un streaming de fichier sur un "queued file transfer". Cette sémantique est un vrai plus pour la phase de conception d'un projet même si ensuite rien n'est figé dans la réalisation.</p>
<p>Derrière ces grands concepts se cachent des briques élémentaires très simples :</p>
<ul>
<li><strong>Queue de message (Message Queue):</strong> zone de stockage des messages (en mémoire ou sur le disque). Elle aura les propriétés privée/partagée, durable/transitoire, permanente/temporaire.</li>
<li><strong>Zone d'échange (Exchange):</strong> l'entité qui accepte les messages et les route vers les queues de messages. Les critères de routage peuvent se faire de plusieurs façons (inspection du contenu, du header, clés de routage...). Les zones d'échange peuvent être créées dynamiquement par les applications clientes.</li>
<li><strong>Zone virtuelle (Virtual Zone):</strong> ce concept est copié de celui des serveurs HTTP d'Apache. Cette zone crée un espace contenant différentes zones d'échange et de queues de message complètement étanches aux autres zones virtuelles. Donc une connexion au serveur ne pourra être associée qu'à une zone virtuelle. C'est très utile lorsqu'on veut mutualiser les ressources.</li>
</ul>
<div><img src="http://blog.xebia.fr/wp-content/uploads/2010/02/amqp-global.png" border="0" alt="" /></div>
<p>Pour le routage, la zone d'échange pourra implémenter différents algorithmes :</p>
<ul>
<li><strong>Direct:</strong> la clé de routage correspond exactement à l'adresse de la queue.</li>
<li><strong>Topic:</strong> la clé de routage correspond à un certain pattern (une expression régulière) de l'adresse de la queue.</li>
<li><strong>Routage par le header:</strong> analyse une table clé/valeur pour décider vers quelle queue aller.</li>
<li><strong>Système :</strong> appel à un service externe.</li>
</ul>
<p>De même les queues de message peuvent avoir des typologies assez variées: durables après un redémarrage de serveur, auto-suppression si plus utilisées, dépendant d'un souscripteur, partagées par plusieurs souscripteurs, répondant à un message particulier...</p>
<p>La gestion des transactions et des transactions distribuées est également spécifiée. Un message envoyé à l'intérieur d'une transaction ne sera récupéré par les souscripteurs qu'à partir du moment où l'émetteur acquittera la transaction. Cependant, cette gestion peut varier selon l'implémentation des serveurs car lors d'un rollback, seules les commandes de l'émetteur sont dépilées. Certains états du serveur peuvent donc être modifiés malgré tout (par exemple la déclaration d'une nouvelle queue de message).</p>
<h3><a name="Solutionsexistantes"></a>Solutions existantes :</h3>
<p><a title="RabbitMQ" href="http://www.rabbitmq.com/">RabbitMQ</a> (Mozilla Public License) est sans doute le broker AMQP le plus connu. Il est basé sur le langage Erlang et ses librairies OTP, développé par Ericsson et réputé pour sa haute-disponibilité et sa tolérance aux pannes (règle des "<a title="nine nines" href="http://en.wikipedia.org/wiki/Erlang_(programming_language)#History">nine nines</a>" : 99.9999999%  de disponibilité !). Au-delà de sa maturité, le point fort de ce produit est sa volonté de faciliter son intégration dans les systèmes existants. Par exemple, des distributions dédiées à Amazon EC2, avec intégration à EBS, sont proposées. La gestion du cluster est également très simple, en une commande on peut rattacher un broker à un autre. Toutes les zones d'échange, les queues de message ou les zones virtuelles seront alors partagées et répliquées. Côté client, une API Java est incluse dans la distribution, très simple et proche de l'API JMS. La communication avec un client JMS est possible grâce à une librairie proposée par <a title="OpenAMQ" href="http://github.com/pieterh/openamq-jms">OpenAMQ</a>.</p>
<p><a title="OpenAMQ" href="http://www.openamq.org/">OpenAMQ</a> propose lui-même un broker. Développé par iMatix, en C++, une API (WireAPI) est proposée. Sans doute plus complexe à appréhender, un effort particulier a néanmoins été apporté aux outils de développement (débogage, constructions de test...) et de monitoring (log, tuning...). Un langage XML (PAL) a été développé pour scripter des scénarios utiles pour les tests par exemple. Ou encore une console de monitoring pour serveur AMQP. Très pointu, OpenAMQ semble s'adresser à des experts confrontés à des projets soumis à de fortes contraintes. Il y a un côté un peu R&amp;D qui permet par ailleurs de jouer un rôle moteur dans la communauté. A noter également que la distribution linux vient avec une implémentation de RestMS.</p>
<p>Par ailleurs OpenAMQ a fait <a title="main basse" href="http://www.imatix.com/press:fastmq-acquisition">main basse</a> sur un autre broker AMQP : <a title="ZeroMQ" href="http://www.zeromq.org/">ZeroMQ</a>. Enfin plus précisément un broker qui implémente plusieurs protocoles dont AMQP. On est ici à la limite du sujet tant cette application s'attache moins à son intégration dans une application de gestion classique qu'à construire une bête de course aux performances affichées impressionnantes (13.4 microsecondes de latence end-to-end, 4.1 millions de messages à la seconde).</p>
<p>Avec <a title="Qpid" href="http://qpid.apache.org/">Qpid</a> on revient un peu sur terre. Ce broker est incubé chez Apache et ne semble a priori rien apporter de plus que ceux cités plus haut. Il vaut malgré tout le coup de s'y intéresser pour les différents frameworks et librairies auxquels il s'intègre et en premier lieu celles d'Apache (Axis2, Camel, Synapse). Il est également intégré à la distribution de <a title="Red Hat MRG" href="http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.1/html/MRG_Messaging_Qpid_C++_API_Reference/">Red Hat MRG</a> et est compatible avec l'outil de visualisation et de contrôle <a title="HermesJMS" href="http://www.hermesjms.com/confluence/display/HJMS/Home">HermesJMS</a>.</p>
<p>A noter également que le projet très en vue <a title="HornetQ" href="http://community.jboss.org/wiki/HornetQTechnicalFAQ">HornetQ</a> de JBoss <a title="prvoie" href="http://hornetq.sourceforge.net/docs/hornetq-2.0.0.GA/user-manual/en/html/messaging-concepts.html#d0e426">prévoit</a> également de supporter ce protocole dans une prochaine version.</p>
<h3><a name="Perspectivesetenjeux"></a>Perspectives et enjeux</h3>
<h4><a name="Unecommunaut"></a>Une communauté</h4>
<p>La capacité d'AMQP à s'imposer comme un standard sera liée à sa capacité à drainer une vraie communauté autour de lui. Cette communauté se divise en deux actuellement : les <a title="membres" href="http://www.amqp.org/confluence/display/AMQP/AMQP+Working+Group+Legal+Name+List">membres</a> du groupe de travail AMQP et la communauté open source.</p>
<p>Les membres du groupe de standardisation sont eux-mêmes divisés en trois familles : des fournisseurs de brokers AMQP (RabbitMQ, OpenAMQ...), les clients historiques (JPMorgan, Goldman Sachs...) qui poussent ces solutions et les fournisseurs de solutions matérielles (Cisco, Solace Systems Inc., Tervela Inc. ...). Ce mélange a le gros avantage de proposer d'ores et déjà des solutions implémentées et en production qui éprouvent ce standard et l'enrichissent en retour. La réalité du terrain guide largement les spécifications comme le montre leurs <a title="Business Requirements" href="http://www.amqp.org/confluence/display/AMQP/AMQP+1-0+Business+Requirements">Business Requirements</a>.</p>
<p>Du côté OpenSource par contre la communauté reste encore discrète. En faisant une recherche rapide sur internet on trouve tout de même une bonne quantité de projets, plus ou moins expérimentaux :</p>
<ul>
<li><a title="RestMS" href="http://www.restms.org/">RestMS</a> pour poster des messages directement en Rest.</li>
<li><a title="amqpjs" href="http://github.com/dansimpson/amqp-js">amqp-js</a> pour poster des messages en javascript.</li>
<li><a title="ici" href="http://blog.0x82.com/2009/12/28/twitter-amqp-websocket-example-no-polling">ici</a> une idée pour faire du twitter avec html5.</li>
<li><a title="rplication" href="https://launchpad.net/rabbitreplication">réplication</a> en base de données.</li>
<li><a title="des librairies spring" href="http://www.opencredo.com/technologies/opencredo-amq">des librairies spring</a> pour utiliser de façon transparente les brokers.</li>
</ul>
<p>Du chemin reste encore à faire, mais la diversité des projets prouve malgré tout qu'il y a une demande.</p>
<h4><a name="Uneversionderfrence"></a>Une version de référence</h4>
<p>Pour l'instant la version 0.10 est la dernière version officielle. Mais la plupart des brokers sont en version 0.8 ou 0.9. En effet, tout le monde attend la <em>vraie</em> version de référence, la 1.0. qui devrait sortir cette année. Elle devrait apporter de gros changements : un système d'adressage inspiré des mails (queue_message@my_server), le remplacement des zones d'échanges par deux nouvelles entités (une queue d'entrée et un <em>service</em> d'échange), la suppression des Virtual Hosts (conséquence de la suppression des zones d'échanges), l'amélioration de la partie administration du broker et l'ajout de support pour les services DNS.</p>
<p>Ces gros changements apportent sûrement des améliorations majeures à ce protocole. Il n'y a plus qu'à espérer que la migration se fera rapidement. Il est difficile de dire aujourd'hui si les clients sur les versions 0.x pourront se connecter à cette nouvelle version de façon transparente, mais si ce n'est pas le cas, cela risque de casser la dynamique autour d'AMQP.</p>
<h4><a name="Laconcurrence"></a>La concurrence</h4>
<p>La lutte est assez féroce dans le domaine du MOM. Si on met de côté Websphere MQ et Tibco, il existe de nombreuses solutions, parfois assez éloignées conceptuellement.</p>
<p>On peut s'en douter, ActiveMQ ne reste pas les bras croisés. Ils poussent entre autre une solution générique, <a title="STOMP" href="http://stomp.codehaus.org/Home">STOMP</a>, très simple d'utilisation mais moins complète et moins performante. Ils annoncent aussi une compatibilité AMQP, sans qu'on sache très bien comment.</p>
<p>Jusqu'à un certain point, ce protocole rentre également <a title="en concurrence" href="http://www.opensourcery.co.za/2009/04/19/to-amqp-or-to-xmpp-that-is-the-question/">en concurrence</a> avec XMPP, le protocole de messagerie instantanée.</p>
<p><a title="MuleMQ" href="http://www.mulesoft.org/display/MQ/Home">MuleMQ</a> est apparu également sur la scène et est proposé comme broker dans la nouvelle distribution de l'ESB Mule. C'est un broker JMS fourni avec quelques outils. Le "tout-intégré" de cette solution peut être assez attirant, par contre on peut regretter que MuleSoft <a title="sloigne" href="http://pzf.fremantle.org/2010/01/mule-no-longer-open-source-company.html">s'éloigne</a> de plus en plus de l'Open Source.</p>
<p>Au contraire, <a title="HornetQ" href="http://www.jboss.org/hornetq">HornetQ</a> joue le jeu de l'Open Source et peut profiter de la grande expérience de JBoss dans ce domaine. Mais cela reste du JMS... Cela sera sûrement la solution privilégiée pour les applications tournant sur JBoss mais difficile de dire si la solution <em>out of the box</em> aura du succès.</p>
<p>Au final JMS est le vrai <a title="concurrent" href="http://www.jroller.com/RickHigh/entry/amqp_versus_jms">concurrent</a> d'AMQP même si encore une fois les deux peuvent vivre ensemble. Un adaptateur JMS pour AMQP peut sembler intéressant pour des projets qui migrent vers un nouveau broker, mais il semble plus pertinent pour un nouveau projet de commencer directement dans ce nouveau standard. Par exemple l'utilisation de la librairie Java de RabbitMQ est vraiment très proche de l'API JMS et la vitesse d'apprentissage semble assez rapide pour un développeur Java.</p>
<p>Car un des problèmes de JMS c'est justement son manque d'interopérabilité avec d'autres langages. A cet égard il est intéressant de remarquer que Microsoft s'intéresse de près à AMQP. Depuis 2008 il participe au groupe de travail et a collaboré activement avec QPid pour la version C++ du broker. Etre agnostique vis-à-vis de l'environnement DotNet ou Java serait sûrement une carte majeure de ce standard.</p>
<h3><a name="Conclusion"></a>Conclusion</h3>
<p>Les solutions propriétaires comme IBM et Tibco ne sont pas réellement menacées par ce nouveau concurrent car leurs solutions sont très complètes, éprouvées et ils fournissent un support sérieux qui rassure les DSI. Le défi d'AMQP est moins de concurrencer ces leaders que de promouvoir l'architecture orientée message au sein de projets de taille moyenne et/ou open-source qui n'ont pas forcément un gros budget à investir. L'adoption massive de ce modèle de conception imposerait AMQP comme le protocole référent tant sa spécification est avancée et complète.</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/02/23/amqp-une-alternative-a-jms/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/</link>
		<comments>http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 17:32:23 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[G1]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Méthodes agiles]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4050</guid>
		<description><![CDATA[

La revue de presse de l'actualité Java/J2EE hebdomadaire proposée par Xebia.
Actualité éditeurs / SSII

Subversion devient un projet top-level Apache

Agilité

Sortie du livre "SCRUM : Le guide pratique de la méthode agile la plus populaire"

RIA

HTML5 + CSS3 = 52framework

Le coin de la technique

Les nulls, c'est nul !
G1 pas à la hauteur des espérances ?

Actualité éditeurs / SSII
Subversion [...]]]></description>
			<content:encoded><![CDATA[
<p><img src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br />
<em>La revue de presse de l'actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<p><strong>Actualité éditeurs / SSII</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/#Subversiondevientunprojettople">Subversion devient un projet top-level Apache</a></li>
</ul>
<p><strong>Agilité</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/#Sortiedulivrenbspahrefhttpwwwd">Sortie du livre <a href="http://www.dunod.com/livre-dunod-9782100540181-scrum-le-guide-pratique-de-la-methode-agile-la-plus-populaire.html" title="SCRUM  Le guide pratique de la mthode agile la plus populaire" >"SCRUM : Le guide pratique de la méthode agile la plus populaire"</a></a></li>
</ul>
<p><strong>RIA</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/#HTMLCSSframework">HTML5 + CSS3 = 52framework</a></li>
</ul>
<p><strong>Le coin de la technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/#Lesnullscestnul">Les nulls, c'est nul !</a></li>
<li><a href="http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/#Gpaslahauteurdesesprances">G1 pas à la hauteur des espérances ?</a></li>
</ul>
<h3><a name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3>
<h4><a name="Subversiondevientunprojettople"></a>Subversion devient un projet top-level Apache</h4>
<p>Après seulement <a href="http://java.dzone.com/news/subversion-graduates-only-3" title="3 mois d'incubation" >3 mois d'incubation</a> (mais sur le point de fêter ses 10 ans, <a href="http://www.collab.net/" title="Collabnet" >Collabnet</a> ayant sorti la première version en 2000), Subversion est <a href="http://subversion.wandisco.com/component/content/article/1/43.html" title="maintenant" >maintenant</a> projet <em>top-level</em> Apache. Pour ce faire, le projet a du se plier aux règles strictes édictées par la fondation Apache, qui touchent à la fois au code source du logiciel, à la provenance des différents codes, à leur licence, au site internet du projet, au processus de <em>release</em> des nouvelles versions... C'est un <a href="http://www.apache.org/foundation/how-it-works.html" title="gros travail" >gros travail</a> mais il permet ensuite aux projets de bénéficier de toute l'infrastructure ainsi que de l'aura de la fondation Apache.<br />
Subversion s'assure donc pour la suite une stabilité et une plus grande visibilité, élargit sa communauté et s'octroit plus de crédibilité vis à vis des entreprises. En effet, être projet top-level Apache est gage de pérennité.<br />
Le projet en aura besoin, étant fortement concurrencé par les outils de gestion de version distribués comme <a href="http://git-scm.com/" title="Git" >Git</a> ou <a href="http://mercurial.selenic.com/" title="Mercurial" >Mercurial</a>. Martin Fowler <a href="http://martinfowler.com/bliki/VersionControlTools.html" title="notait ainsi rcemment" >notait ainsi récemment</a> plusieurs points négatifs de SVN :</p>
<ul>
<li>l'absence de copie locale du <em>repository</em> d'où des problèmes de performance et l'impossibilité de travailler <em>offline</em> sur ce repository.</li>
<li>le fait que les branches aient une visibilité globale est un frein à l'innovation: les développeurs sont moins enclins à créer une branche pour expérimenter diverses innovations.</li>
</ul>
<p>Néanmoins, SVN reste pour lui le meilleur des outils non distribué, et est largement recommandable. D'autant que c'est un outil plus simple à appréhender et son ancienneté fait que <a href="http://lsimons.wordpress.com/2010/02/19/using-long-lived-stable-branches/" title="les bonnes pratiques" >les bonnes pratiques</a> sont largement répandues. D'autre part, ajoutons que les développeurs semblent ne pas se reposer sur leurs récents lauriers, et <a href="http://subversion.wandisco.com/component/content/article/1/44.html" title="annoncent" >annoncent</a> la disponibilité dans la version 1.7 de la fonctionnalité de <em>offline commit</em>. Comme d'habitude, nous bénéficions encore de la concurrence pour avoir à notre disposition les meilleurs outils. Chouette <img src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  !</p>
<h3><a name="Agilit"></a>Agilité</h3>
<h4><a name="Sortiedulivrenbspahrefhttpwwwd"></a>Sortie du livre <a href="http://www.dunod.com/livre-dunod-9782100540181-scrum-le-guide-pratique-de-la-methode-agile-la-plus-populaire.html" title="SCRUM  Le guide pratique de la mthode agile la plus populaire" >"SCRUM : Le guide pratique de la méthode agile la plus populaire"</a></h4>
<p>Claude Aubry, auteur du bien connu blog <a href="http://www.aubryconseil.com/" title="Scrum Agilit et Rockn roll" >Scrum, Agilité et Rock'n roll</a> nous délivre dans ce livre un condensé de son expérience sur la mise en place de Scrum. Très pragmatique, ce livre traite point par point les différentes composantes de Scrum en les expliquant et en détaillant pour chacune les pratiques qui fonctionnent et celles à ne pas tenter. Après avoir dévoré les 5 premiers chapitres nous ne pouvons que vous engager à lire cet ouvrage qui fera office de référence pour vous accompagner sur vos projets Scrum.<br />
C'est comme d'avoir un peu de Claude Aubry avec soi sur son projet, mais sans l'accent <img src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3><a name="RIA"></a>RIA</h3>
<h4><a name="HTMLCSSframework"></a>HTML5 + CSS3 = 52framework</h4>
<p>Même si c'est en très bonne voie, les navigateurs Web du marché ne sont pas entièrement compatibles HTML5 et CSS3. Néanmoins, plusieurs librairies JavaScript permettent de rendre votre navigateur 100% compatible avec ces 2 technologies et <a href="http://www.52framework.com/" title="52framework" >52framework</a> en fait partie.</p>
<p>Au menu, la librairie nous propose d'utiliser les différentes nouvelles balises HTML5 telles que <code>aside</code>, <code>nav</code>, <code>section</code> ou bien encore <code>article</code>. Les nouveaux <code>input type='email'</code> et <code>input type='url'</code> sont aussi de la partie. La balise <code>script</code> contenant du JavaScript n'a plus besoin de l'attribut <code>type='text/javascript'</code>. Côté CSS3, il est possible d'utiliser les coins arrondis, les <em>text-shadow</em> et les <em>box-shadow</em>.<br />
La démo se trouve <a href="http://www.52framework.com/demo/?normalText=normal+text+field&#038;email=ema&#038;url=url.com&#038;required=required" title="ici" >ici</a>, le plus intéressant étant son code source où l'on retrouve les nouveaux éléments cités ci-dessus.</p>
<p>Pour le téléchargement, rendez-vous est pris sur le <a href="http://code.google.com/p/52framework/" title="Google Code" >Google Code</a> du projet section <a href="http://code.google.com/p/52framework/downloads/list" title="Downloads" >Downloads</a>.</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la technique</h3>
<h4><a name="Lesnullscestnul"></a>Les nulls, c'est nul !</h4>
<p>C'est en tout cas ce que beaucoup d'entre nous ressentent en tombant sur certaines <code>NullPointerExceptions</code>. Et suivent les premières questions : Où sont les tests unitaires ? Quel paramètre n'a pas été testé ? Mais, ressenti de plus en plus grandissant avec les derniers langages alternatifs pour la JVM, pourquoi laisser passer des valeurs <code>nulls</code> en paramètre ?</p>
<p>Pour ne prendre qu'un seul exemple, Scala permet d'éviter ce genre de désagrément grâce à la classe <a href="http://www.scala-lang.org/docu/files/api/scala/Option.html" title="Option" >Option</a> <em>(<a href=" http://www.ilyasterin.com/blog/2010/02/avoid-using-nulls-in-scala-at-any-costs.html" title="Avoid using nulls in Scala" >Avoid using nulls in Scala</a>)</em>. Dans le cas d'une valeur définie, il suffit d'utiliser <code>Some(something)</code> qui est l'option avec valeur. Et pour le <code>null</code>, il faudra se tourner vers <code>None</code> qui est l'option sans valeur. Le code est ainsi réduit et ne contient plus de test <code>if(obj !=null)</code> (englobé dans l'option <code>None</code>) :</p>
<div class="syntax_hilite">
<div id="java-38">
<div class="java"><span style="color: #808080; font-style: italic;">// possible parameters</span><br />
var anObject = Some<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><br />
var nullObject = None</p>
<p><span style="color: #808080; font-style: italic;">// our code that do not care about nulls</span><br />
val doubleFunc = <span style="color: #66cc66;">&#40;</span>option:<a href="http://www.google.com/search?q=allinurl%3AOption+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Option</span></a><span style="color: #66cc66;">&#91;</span>Int<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> =&gt; print<span style="color: #66cc66;">&#40;</span>option.<span style="color: #006600;">map</span><span style="color: #66cc66;">&#40;</span>_*<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
doubleFunc<span style="color: #66cc66;">&#40;</span>anObject<span style="color: #66cc66;">&#41;</span><br />
doubleFunc<span style="color: #66cc66;">&#40;</span>nullObject<span style="color: #66cc66;">&#41;</span></p>
<p><span style="color: #808080; font-style: italic;">// prints</span><br />
Some<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">// values has been doubled</span><br />
None <span style="color: #808080; font-style: italic;">// does nothing </span></div>
</div>
</div>
<p>
Mais pour Java ? Une petite piqure de rappel ne faisant pas de mal, cet <a href="http://thetechcandy.wordpress.com/2010/01/28/avoid-null/" title="article" >article</a> nous présente une solution possible avec en citation Martin Fowler et le pattern <a href="http://martinfowler.com/eaaCatalog/specialCase.html" title="Special Case" >Special Case</a>.</p>
<p>L'idée est la même que pour l'option Scala. On commence par définir une classe abstraite ou une interface avec une méthode spécifique qui sera appelée par notre code. Et de là seront créés 2 objets : un objet réel et un objet <code>null</code>. Ce dernier implémentera la méthode demandée mais ne fera rien alors que l'objet réel exécutera son code métier. Ainsi, plus de test de nullité, notre code lancera directement la méthode sur l'objet et ne se souciera plus de savoir si l'objet est <code>null</code> ou non.</p>
<p>Ce pattern anti <code>NPE</code> est une solution possible mais elle n'est pas la seule. Si vous avez suivi l'actualité, vous êtes malheureusement au courant que les operateurs <em>null-safe</em> et <em>elvis</em> ne seront pas implémentés par l'ambitieux <a href=" http://blogs.sun.com/darcy/entry/project_coin_final_five" title="Project Coin" >Project Coin</a>. Le sucre syntaxique ne viendra donc pas directement dans nos appels de fonctions mais par les annotations de <a href="http://www.infoq.com/news/2008/06/jsr-305-update" title="JSR305" >JSR-305</a> dont <code>@NonNull</code>. Bien sûr, cette spécification a pour cible FindBugs, Intellij IDEA, Checkstyle ou bien encore PMD. On aurait préféré une intégration <em>au Project Coin</em> mais c'est déjà mieux que rien...</p>
<h4><a name="Gpaslahauteurdesesprances"></a>G1 pas à la hauteur des espérances ?</h4>
<p>G1 (Garbage First) est un nouvel algorithme pour votre Garbage Collector. Il est destiné à remplacer l'implémentation par défaut lors de l'arrivée de la prochaine JVM. Celui-ci apporte un certain nombre d'avancées significatives dont des performances annoncées (quasi) compatibles avec le temps réel. Pour cela, G1 relève le défi de la maitrise des temps de pause des collections <em>stop the world</em> grâce à une gestion innovante de la mémoire (reposant sur beaucoup plus de 'petites' zones). </p>
<p>Nous n'allons pas détailler son fonctionnement ici. Si le sujet  vous intéresse, nous vous encourageons à consulter l'un de nos articles sur le sujet. Il date un peu, mais son contenu reste tout à fait d'actualité : <a href="http://blog.xebia.fr/2008/03/12/gc-generationnels-traditionnels-jdk6-vs-gc-garbage-first-jdk7/" title="GC générationnels traditionnels (jdk6) VS GC Garbage First (jdk7)" >GC générationnels traditionnels (jdk6) VS GC Garbage First (jdk7)</a>.</p>
<p>Si les fonctionnalités de ce nouvel algorithme sont alléchantes, on retrouve <a href="http://www.jroller.com/broneill/entry/g1_garbage_collector_experiences" title="ici et l " >ici et là </a> quelques retours frileux suite à son usage.  L'auteur de ce billet annonce des performances moins bonnes qu'avec le garbage collector par défaut lors de l'utilisation de LinkedHashMap. Faut-il s'en inquiéter pour autant ? Non !  Vu la criticité de ce genre de fonctionnalité, il est tout à fait normal que quelques ajustements soient faits lors des premiers retours d'utilisation terrain. C'est d'ailleurs le but recherché suite à l'intégration à Java 6 update 14 (via les options  <code>-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC</code>), même s'il est vrai qu'il n'est plus flagué 'expérimental' depuis peu sur les derniers build  du jdk 7.</p>
<p>En revanche, en plus de la mise en doute des performances de G1 relayée sur le internet, nous pensons qu'un élément bloque effectivement son adoption en production : le monitoring. Celui-ci est aujourd'hui insuffisant, ni jstat ni VisualGC ne remontent d'informations comme le montrent les captures d'écran ci-dessous. <img src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>jstat et VisualGC ne sont pas encore prêts pour G1</strong><br />
<code><br />
$ jstat -gccause 30572 5s<br />
Warning: Unresolved Symbol: sun.gc.generation.0.space.1.capacity substituted NaN<br />
Warning: Unresolved Symbol: sun.gc.generation.0.space.1.used substituted NaN<br />
...<br />
Warning: Unresolved Symbol: sun.gc.collector.0.invocations substituted NaN<br />
Warning: Unresolved Symbol: sun.gc.collector.0.time substituted NaN<br />
...<br />
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC<br />
     ?      ?      ?      ?  79.96      ?        ?     ?        ?        ? unknown GCCause      No GC<br />
     ?      ?      ?      ?  79.96      ?        ?     ?        ?        ? unknown GCCause      No GC<br />
</code></p>
<div align="center">
<a href="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-visualgc-g1.png"><img src="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-visualgc-g1-300x179.png" alt="screenshot-visualgc-g1" title="screenshot-visualgc-g1" width="300" height="179" class="alignnone size-medium wp-image-4053" /></a>
</div>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/02/22/revue-de-presse-xebia-148/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
