<?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 &#187; jazoon</title>
	<atom:link href="http://blog.xebia.fr/tag/jazoon/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xebia.fr</link>
	<description>J2EE, Agilité et SOA</description>
	<lastBuildDate>Thu, 09 Sep 2010 07:48:35 +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>Jazoon&#8217;10 &#8211; Jour 2</title>
		<link>http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/</link>
		<comments>http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 12:57:07 +0000</pubDate>
		<dc:creator>Aurélien Maury</dc:creator>
				<category><![CDATA[Java / JEE]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4877</guid>
		<description><![CDATA[
Deuxième journée de la réunion annuelle des Java-holic européens. Le programme est chargé :

Total cost of ownership
Unleash your processor(s)
What's new in hibernate
iPhone/Ipad development from Java perspective
Harnessing the power of HTML5 Web Sockets to create scalable real-time applications
GPars: Parallel programming concepts for the JVM in Groovy
Cloud Computing with Scala and GridGain
How Java powers large online retail [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2010/06/jazoon_10_peluche.jpg" alt="Jazoon 2010" /></p>
<p>Deuxième journée de la réunion annuelle des Java-holic européens. Le programme est chargé :</p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#Totalcostofownership">Total cost of ownership</a></li>
<li><a href="http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#Unleashyourprocessors">Unleash your processor(s)</a></li>
<li><a href="http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#Whatsnewinhibernate">What's new in hibernate</a></li>
<li><a href="http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#IphoneiPaddevfromJavaperspecti">iPhone/Ipad development from Java perspective</a></li>
<li><a href="http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#HarnessingthepowerofHTMLWebSoc">Harnessing the power of HTML5 Web Sockets to create scalable real-time applications</a></li>
<li><a href="http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#GParsParallelprogrammingconcep">GPars: Parallel programming concepts for the JVM in Groovy</a></li>
<li><a href="http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#CloudComputingwithScalaandGrid">Cloud Computing with Scala and GridGain</a></li>
<li><a href="http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/#HowJavapowerslargeonlineretail">How Java powers large online retail sites</a></li>
</ul>
<p>Suivez le guide ...</p>
<h3><a name="Totalcostofownership"></a>Total cost of ownership</h3>
<p>La keynote de la seconde journée est tenue par Ken Schwaber, le co-fondateur de Scrum. Il revient sur les bénéfices à tirer de Scrum. Le message n'est pas très neuf pour la communauté des agilistes mais il est toujours bon de se rappeler pourquoi nous essayons de changer les façons de faire. Dans un style très posé, il nous expose quelques axes pour inviter les spectateurs à s'améliorer.</p>
<ul>
<li>Les gens ne sont pas des ressources</li>
<li>Il est important de définir la notion de tâche "terminé" pour chaque projet (<em>Definition of Done</em>)</li>
</ul>
<p>Si votre définition de <em>Done</em> laisse de côté des points importants comme l'écriture de tests ou l'intégration aux autres composants, l'équipe accumule rapidement une grande quantité de tâches non réellement finies. Cette dette devra être prise en compte en mettant en place des sprints dédiés à la stabilisation. Cette solution est bien souvent beaucoup plus coûteuse que de correctement définir et de respecter la <code>definition of done</code> au fil des développements. </p>
<p>Il annonce également le lancement d'une formation de 5 jours spécialement adaptée aux développeurs destinés à travailler en équipe Scrum : <em>Professional Scrum Developper Program</em>.</p>
<h3><a name="Unleashyourprocessors"></a>Unleash your processor(s)</h3>
<p><a href="http://www.jroller.com/vaclav/" title="Vclav Pech" >Václav Pech</a> nous fait ensuite une présentation sur différents patterns de programmation concurrente. Selon lui, pratiquement aucune application ne profite des architectures multicore et celles qui en profitent ne le font que par hasard.<br />
Václav présente ensuite un ensemble de patterns notamment : </p>
<ul>
<li><strong>Parallel Arrays</strong> qui permet d'effectuer des opérations comme du filtrage ou du calcul sur des éléments stockés dans une collection en parallèle. Tout ce qu'il y a à faire, c'est de définir les opérations qui seront appliquées à la collection. Ceci de facon simple sans manipuler de thread, ni gérer de moniteur transactionnel.</li>
</ul>
<div class="syntax_hilite">
<div id="java-6">
<div class="java"><span style="color: #808080; font-style: italic;">//create a thread pool and store the collection in a Parallel Array</span><br />
<span style="color: #000000; font-weight: bold;">final</span> ForkJoinPool pool = <span style="color: #000000; font-weight: bold;">new</span> ForkJoinPool<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000000; font-weight: bold;">final</span> ParallelArray people = ParallelArray.<span style="color: #006600;">createFromCopy</span><span style="color: #66cc66;">&#40;</span>friends, pool<span style="color: #66cc66;">&#41;</span>;</p>
<p><span style="color: #808080; font-style: italic;">//Create a predicate for filtering</span><br />
<span style="color: #000000; font-weight: bold;">final</span> Ops.<span style="color: #006600;">Predicate</span> aWoman = <span style="color: #000000; font-weight: bold;">new</span> Ops.<span style="color: #006600;">Predicate</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">boolean</span> op<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Person friend<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> !friend.<span style="color: #006600;">isMale</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span>;</p>
<p><span style="color: #808080; font-style: italic;">//Create an operation to retrieve the name from an element</span><br />
<span style="color: #000000; font-weight: bold;">final</span> Ops.<span style="color: #006600;">Op</span> retrieveName = <span style="color: #000000; font-weight: bold;">new</span> Ops.<span style="color: #006600;">Op</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AObject+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Object</span></a> op<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Person friend<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> friend.<span style="color: #006600;">getName</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span>;</p>
<p><span style="color: #808080; font-style: italic;">//Perform filtering and mapping concurrently on all elements of the collection</span><br />
<span style="color: #000000; font-weight: bold;">final</span> ParallelArray namesOfWomen =<br />
&nbsp; &nbsp;people.<span style="color: #006600;">withFilter</span><span style="color: #66cc66;">&#40;</span>aWoman<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">withMapping</span><span style="color: #66cc66;">&#40;</span>retrieveName<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">all</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<a href="http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"namesOfWomen = "</span> + namesOfWomen<span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p></p>
<ul>
<li><strong>Fork and join</strong> A partir du JDK 7, une nouvelle API du package java.util.concurrency va permettre de définir des tâches et de gérer leur exécution. Le principe de base est de diviser les données à traiter en petites unités de travail et de traiter ces unités en parallèle. Les résultats obtenus en retour seront ensuite agrégés. </li>
</ul>
<p>Václav présente ensuite d'autres patterns tels que le <code>dataflow concurrency</code>, les <code>actors</code>, les <code>agents</code>, le principe de <code>Shared Mutable State</code> et de <code>Persistent data structures</code>. Ces patterns seront présentés plus en détail dans un futur article dédié à la programmation concurrente.</p>
<h3><a name="Whatsnewinhibernate"></a>What's new in hibernate</h3>
<p>Emmanuel Bernard présente les principales évolutions intégrées dans la dernière version d'Hibernate. Le but principal de la version 3.5 était d'implémenter la spécification JPA2. Il revient sur quelques fonctionnalités de la spécification. Notamment :</p>
<ul>
<li><strong>Packaging</strong></li>
</ul>
<p>Hibernate Annotations et Hibernate Entity Manager sont maintenant dans le même projet que Hibernate Core. Les releases sont maintenant toutes synchronisées, ce qui met fin à la complexe matrice de compatibilité. Les releases du projet d'audit et de gestion de version Envers seront également synchronisées avec le core.</p>
<ul>
<li><strong>Application de formule</strong></li>
</ul>
<p>Il est désormais possible d'appliquer des fonctions avant la lecture ou l'écriture dans une colonne par la base de données. Un des cas possibles peut être l'utilisation des fonctions d'encryption native d'un SGBD.</p>
<div class="syntax_hilite">
<div id="xml-7">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"password"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;column</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"PASSWORD"</span> <span style="color: #000066;">not-null</span>=<span style="color: #ff0000;">"true"</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">write</span>=<span style="color: #ff0000;">"encrypt(?)"</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">read</span>=<span style="color: #ff0000;">"decrypt(PASSWORD)"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></p>
<ul>
<li><strong>Fetch profile</strong></li>
</ul>
<p>Pour éviter de générer un trop grand nombre de requêtes, il est possible de charger un arbre d'entités lors du chargement par clé primaire. On paramètre alors dans le fichier de mapping la stratégie de chargement.</p>
<div class="syntax_hilite">
<div id="xml-8">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;hibernate</span>-mapping<span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;class</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"Client"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;set</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"factures"</span> <span style="color: #000066;">inverse</span>=<span style="color: #ff0000;">"true"</span> <span style="color: #000066;">fetch</span>=<span style="color: #ff0000;">"join"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;key</span> <span style="color: #000066;">column</span>=<span style="color: #ff0000;">"client_id"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;one</span>-to-many <span style="color: #000066;">class</span>=<span style="color: #ff0000;">"Facture"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/set<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/class<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/hibernate</span>-mapping<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</div>
</div>
<p></p>
<p>La stratégie sera statique et appliquée que l'on charge les entités par la méthode <code>get</code>, les <code>Criteria</code> ou le chargement implicite durant la navigation à travers une association. Une des solutions était de créer un ensemble de méthodes, du type <code>loadCustomer</code>, <code>loadCustomerWithAddress</code>, <code>loadCustomerWithOrders</code>, et d'utiliser une requête HQL pour dynamiquement appliquer une stratégie de chargement (en HQL : <code>inner join fetch</code>). Mais ceci ne permet pas de définir des stratégies dynamiques pour les chargements implicites.</p>
<p>Hibernate propose maintenant une manière plus simple de gérer les stratégies de chargements. On peut désormais définir dans le fichier de mapping plusieurs stratégies pour une association.</p>
<div class="syntax_hilite">
<div id="xml-9">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;hibernate</span>-mapping<span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;class</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"Client"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; ...<br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fetch</span>-profile <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"clientAvecFacture"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fetch</span> <span style="color: #000066;">association</span>=<span style="color: #ff0000;">"factures"</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">"join"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/fetch</span>-profile<span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/class<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/hibernate</span>-mapping<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</div>
</div>
<p></p>
<p>et définir la stratégie à utiliser pour chacune des sessions avec la méthode suivante : </p>
<div class="syntax_hilite">
<div id="java-10">
<div class="java">Session session = ...;<br />
session.<span style="color: #006600;">enableFetchProfile</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">"clientAvecFacture"</span> <span style="color: #66cc66;">&#41;</span>;<br />
Client client = <span style="color: #66cc66;">&#40;</span>Client<span style="color: #66cc66;">&#41;</span> session.<span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span> Client.<span style="color: #000000; font-weight: bold;">class</span>, clientId <span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p></p>
<h3><a name="IphoneiPaddevfromJavaperspecti"></a>iPhone/iPad dev from Java perspective</h3>
<p><a href="http://twitter.com/ognenivanovski" title="Ognen Ivanovski" >Ognen Ivanovski</a>, de la société Netcetera, nous présente son retour d'expérience sur les développements pour l'iPhone (et donc pour l'iPad). Étant développeur Java à la base, il nous expose les écueils auxquels risquent de se heurter les développeurs Java en arrivant sur cette plateforme, ainsi que les points importants à garder en tête pour le design.</p>
<p>N'espérez donc pas voir apparaitre une méthode magique pour développer en Java pour l'iPhone. Comme Ognen l'a rappelé, Apple n'autorise dans AppStore que les applications <em>rédigées</em> en Objective-C. Il commence par un petit rappel sur l'environnement de développement sanctifié par Apple, à savoir : XCode, Interface Builder, iPhone Simulator et Instruments (pour le profiling).</p>
<p>Voici, d'après lui, les facteurs clés à garder en tête lors d'un développement pour cette plateforme :</p>
<ul>
<li><strong>Le hardware est limité, en mémoire comme en CPU :</strong> Cependant la performance est cruciale. Il faut donc designer ses applications pour la vitesse et les tester sur de vrais appareils. L'émulateur fourni dans le kit de développement ne rend pas compte des performances réelles. Pensez donc à gérer votre mémoire: ici, pas de Garbage Collector. Et si par hasard le SDK ne vous fourni pas ce que vous voulez, vous pouvez toujours embarquer des librairies en C pur.</li>
<li><strong>La résolution est différente :</strong> Là encore, un test sur un device réel ne saurait être remplacé par un test sur l'émulateur, des changements subtils peuvent impacter fortement l'effet obtenu, à cause de la taille et de la résolution de l'écran.</li>
<li><strong>Le mode d'utilisation change :</strong> En développement web on suppose l'utilisateur assis avec clavier, souris, etc. Mais en mobile, il sera plutôt en déplacement, ou dans un canapé avec l'iPad. Ceci doit être pris en compte dans le design. L'interface multitouch, la taille des doigts, etc., tous ces paramètres doivent être exploités intelligemment.</li>
<li><strong>Les barrières posées par Apple :</strong> Le <a href="http://www.eff.org/files/20100302_iphone_dev_agr.pdf" title="iPhone Developer License Agreement" >iPhone Developer License Agreement</a> est fluctuant et contraignant. Il existe une constante inquiétude de la censure quand on développe. La médaille de ce revers est que, si votre application passe la censure, les utilisateurs feront confiance à l'AppStore et n'auront aucune réticence à l'installer sur leur iPhone/iPad.</li>
<li><strong>Chaque application est partie intégrante de l'appareil :</strong> D'après les retours d 'Apple, les utilisateurs d'iPhones ne se servent que marginalement de la fonction de <em>recherche</em>. Ils trouvent une application qui leur récolte et présente les données d'un domaine particulier. Il faut donc penser une application comme partie intégrante du device physique et travailler au mieux son intégration.</li>
</ul>
<p>Il enchaîne sur un rapide exposé des API disponibles, puis met en garde son auditoire sur les méfaits du <em>hype</em>. En effet, le positionnement marketing peut amener à se lancer dans un développement iPhone mais il faut faire les choses bien. Une application médiocre, même si elle offre une visibilité sur l'AppStore, sera mal notée par les utilisateurs et occasionnera donc une perte d'image.</p>
<p>Une présentation avec très peu de technique mais qui donne une bonne idée des contraintes à considérer pour ne pas perdre son temps lors d'un premier développement.</p>
<h3><a name="HarnessingthepowerofHTMLWebSoc"></a>Harnessing the power of HTML5 Web Sockets to create scalable real-time applications</h3>
<p>Peter Lubbers, de chez Kaazing Corporation, nous présente les avantages à tirer d'une communication full-duplex entre navigateurs et serveurs web. Il commence par rappeler les besoins de réactivité des pages web et les problèmes des solutions actuelles :</p>
<ul>
<li><strong>polling :</strong> Basé sur des requêtes AJAX périodiques pour récupérer les données. Le martelage du serveur par des requêtes AJAX en provenance de tous les clients connectés pose des problèmes de charge et d'occupation de la bande passante (chaque requête arrive avec ses headers HTTP). De plus cette solution ne fait que fournir du <em>presque temps réel</em> et scale très mal.</li>
<li><strong>long polling :</strong> Technique des architectures Comet. Cela permet d'éviter de marteler le réseau pendant les périodes où il n'y a pas de données à fournir, mais dès que le flux est continu, la fréquence des polling augmente et revient au même que le polling classique.</li>
<li><strong>streaming :</strong> fonctionne bien mais la conservation d'une connexion ouverte trop longtemps peut poser des problèmes avec les proxies et firewall sur la route.</li>
</ul>
<p>Peter enchaîne sur une démonstration de Comet et de son occupation du réseau en capturant les trames réseau avec WireShark, et nous présente enfin la solution d'avenir : les WebSockets de HTML5.</p>
<p>Nous avions parlé il y a quelques temps des <a href="http://blog.xebia.fr/2010/03/18/html5-les-api-javascript/#WebSocket" title="API Javascripts qui y sont lies" >API Javascripts qui y sont liées</a>. Un autre point mis en avant est qu'une fois établi, les communications passant par une WebSocket se passent de header HTTP (871 octet en moyenne) et sont remplacées par 2 octets qui encadrent chaque message, diminuant d'autant l'occupation de la bande passante.</p>
<p>Il détaille un peu l'aspect sécurité de la chose, les WebSockets sont également disponibles en version sécurisé, basé sur TLS (comme HTTPS) et s'établissent simplement par une poignée de main (<a href="http://en.wikipedia.org/wiki/Handshaking" title="Handshaking" >Handshaking</a>) sur HTTP. Actuellement les WebSockets du coté browser ne sont supportés que par Chrome 4.0+, et les <em>nightly builds</em> de WebKit. Opera et Firefox promettent de le supporter bientôt.</p>
<p>Il termine par la démonstration d'une application de Poker, avec WebSockets liés à un <a href="http://www.kaazing.org" title="Kaazing Gateway" >Kaazing Gateway</a> et nous montre les trames réseau.</p>
<p>On peut regretter tout de même que Peter ne fasse aucun autre commentaire sur la partie serveur que d'évoquer le Kaazing WebSockets Gateway. A aucun moment la spécification Servlet 3.0, ni GlassFish, ni Jetty, ne sont évoqués.</p>
<h3><a name="GParsParallelprogrammingconcep"></a>GPars: Parallel programming concepts for the JVM in Groovy</h3>
<p>Dans une session presque purement technique, <a href="http://twitter.com/mittie" title="Dierk Knig" >Dierk König</a> nous présente la librairie GPars, destinée à apporter la facilité à la gestion de la concurrence dans Groovy. Il commence par un rappel reprenant les concepts déjà exposés par Václav Pech dans sa session du matin, puis enchaîne sur une session de <em>live coding</em> pour démontrer la simplicité d'usage de la librairie.</p>
<p>Parmi les exemples codés devant nos yeux ébahis, on trouve notamment :</p>
<ul>
<li>la <a href="http://gpars.codehaus.org/Parallelizer" title="paralllisation doprations" >parallélisation d'opérations</a> sur des collections</li>
<li>les <a href="http://gpars.codehaus.org/Asynchronizer" title="oprations asynchrones" >opérations asynchrones</a> avec pool de thread</li>
<li>les <a href="http://gpars.codehaus.org/Actor" title="Actors" >Actors</a> inspiré de Scala</li>
<li>les <a href="http://gpars.codehaus.org/Agent" title="Agents" >Agents</a> inspirés de Clojure, destinés à protéger des ressources non <em>thread-safe</em></li>
</ul>
<p>Il est pratiquement impossible de coucher un live-coding dans un article, mais la vidéo devrait sortir en même temps que les autres tournées dans la salle 5 de Jazoon. Vous les retrouverez dans la revue de presse, dès leur sortie.</p>
<p>A noter qu'un problème avec son IDE favori l'a forcé à utiliser uniquement la Groovy Console, exercice mené donc sans filet, et avec brio.</p>
<h3><a name="CloudComputingwithScalaandGrid"></a>Cloud Computing with Scala and GridGain</h3>
<p>Nikita Ivanov, de chez GridGain Technologies, vient nous exposer les travaux de sa société autour de Scala. Il commence par nous rappeler le contexte en revenant de façon synthétique sur certaines définitions :</p>
<ul>
<li><strong>Grid :</strong> 2 ordinateurs ou plus fonctionnant en parallèle sur des parties distinctes d'une tâche commune</li>
<li><strong>Grid Computing :</strong> Grid de calcul et data Grid fonctionnant de concert</li>
<li><strong>Cloud :</strong> Virtualisation de Data Center</li>
<li><strong>Cloud Computing :</strong> Cloud et Grid Computing</li>
</ul>
<p>GridGain Technologies a choisi d'adopter un langage plus simple pour exploiter leur architecture de Cloud Computing. Nikita nous explique que Groovy a été écarté à cause de ses performances, que JRuby a été écarté pour des problèmes d'intégrations et que Scala remplissait tous les critères de choix de GridGain :</p>
<ul>
<li>Scalable</li>
<li>Post fonctionnel</li>
<li>Performances égales à Java</li>
<li>Statiquement typé</li>
<li>Pleinement compatible Java</li>
</ul>
<p>Ils ont donc développé un DSL nommé <a href="http://www.jroller.com/nivanov/entry/introducing_scalar_scala_based_dsl" title="ScalaR" >ScalaR</a>, qui permet de créer des programmes à lancer dans un Cloud GridGain en quelques lignes. S'en suit une nouvelle session de <em>live coding</em>, comparant l'approche traditionnelle de l'API GridGain, et l'utilisation de ScalaR. On devine assez bien quelle version a remporté la manche. DSL intéressant, dommage que le manque de temps a forcé Nikita à écourter un peu la démonstration.</p>
<h3><a name="HowJavapowerslargeonlineretail"></a>How Java powers large online retail sites</h3>
<p>Notre journée se conclut par une présentation de Robert Brazile, CTO chez ATG, qui rend hommage à l'apport des technologies Java au monde du commerce en ligne. Il revient sur la place grandissante de la vente sur internet dans l'ensemble des ventes sur le territoire américain, puis nous expose les problématiques générales des sociétés de vente :</p>
<ul>
<li><strong>haute disponibilité :</strong> les sites de vente en ligne doivent rester disponibles malgré les pics d'affluence. Les travaux sur le load balancing ont beaucoup apporté.</li>
<li><strong>la vitesse avant tout :</strong> bien plus que le design graphique, c'est la performance d'une application qui est cruciale. Un peu trop d'attente, trop de clic à faire, et la vente est perdu.</li>
<li><strong>la couche de présentation séparée :</strong> pour pouvoir déléguer les manipulations de présentation et de gestion des backend à des équipes séparées. Cela évite que les développeurs soient pris par des tâches "subalternes" alors qu'ils doivent réfléchir à des problèmes complexes comme la charge ou la récupération des données.</li>
<li><strong>éviter de payer l'infrastructure nécessaire aux pics de charge pendant les creux :</strong> grâce aux avancées dans le Cloud computing, les vendeurs en ligne ont pu faire beaucoup d'économies.</li>
</ul>
<p>Robert a multiplié les anecdotes sur les ratés de l'automatisation, comme ce moteur de recherche qui a mal réglé son moteur de suggestion :</p>
<p>search for : abortion => Did you mean <em>adoption</em> ?<br />
<em>(trad. : rechercher : avortement => Vous voulez dire adoption ?)</em></p>
<p>Son expérience encyclopédique du monde des systèmes d'informations pour les sites de vente en ligne lui a servi à illustrer à quel point le langage Java a permis la percée des techniques de vente en lignes modernes. Il prévoit d'ailleurs que cela continue dans les années à venir avec certains sujets qui animent déjà la communauté Java :</p>
<ul>
<li><strong>Virtualisation et Cloud Computing :</strong> pour toujours plus de scalabilité</li>
<li><strong>Bases de données NoSQL :</strong> pour un meilleur accès aux données, chaque archi répondant à des besoins spécifiques</li>
<li><strong>Scripting :</strong> PHP, Ruby, Groovy et autres, pour des modifications rapides sur les sites publics</li>
<li><strong>Frameworks :</strong> Rails, Grails, Lift et autres, pour concevoir et déployer rapidement des sites vitrines à faible durée de vie</li>
<li><strong>Parallélisme et concurence :</strong> Pour exploiter de façon efficace les architecture multi-core et le Cloud</li>
</ul>
<p>Java est mature donc, mais certainement pas proche de la retraite.</p>
<h3><a name="Epilogue"></a>Epilogue</h3>
<p>Nous avons dû choisir entre les sessions Jazoon Rookie et notre avion. Vous devinez sûrement ce que nous avons décidé <img src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Dans l'ensemble, Jazoon est toujours une conférence très intéressante, les orateurs sont de très bon niveau et très accessibles pour discuter en dehors des présentations. </p>
<p>Un grand merci aux organisateurs et aux orateurs. Nous attendons avec impatience les vidéos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/06/07/jazoon10-jour-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jazoon&#8217;10 &#8211; Jour 1</title>
		<link>http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/</link>
		<comments>http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 08:07:06 +0000</pubDate>
		<dc:creator>Aurélien Maury</dc:creator>
				<category><![CDATA[Java / JEE]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4860</guid>
		<description><![CDATA[
Comme nous vous l'avions annoncé, Xebia était présent aux deux premières journées de la conférence annuelle Jazoon. Des soucis d'ubiquité nous ont évidemment empêché de suivre toutes les sessions, tenues dans 4 salles différentes en même temps. Nous avons dû faire des choix, parfois difficiles, pour vous relater le meilleur de cet évènement. 
Premières observations [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2010/06/welcome_jazoon_10.jpg" alt="Jazoon 2010" /><br />
Comme nous vous l'avions annoncé, Xebia était présent aux deux premières journées de la conférence annuelle Jazoon. Des soucis d'ubiquité nous ont évidemment empêché de suivre toutes les sessions, tenues dans 4 salles différentes en même temps. Nous avons dû faire des choix, parfois difficiles, pour vous relater le meilleur de cet évènement. </p>
<p>Premières observations :</p>
<ul>
<li>légère baisse d'affluence par rapport à l'année dernière,</li>
<li>forte présence de JavaFX avec pas moins de six sessions, ainsi que d'OSGi,</li>
<li>très bonne ambiance et organisation,</li>
<li>excellents speakers, merci à eux.</li>
</ul>
<p>Nous allons vous rendre compte des sessions suivantes :</p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/#JavaSEandJavaFXTheRoadAhead">Java SE and JavaFX: The Road Ahead</a></li>
<li><a href="http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/#ClientServerwithJavaandFlex">Client / Server 2.0 with Java and Flex</a></li>
<li><a href="http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/#Frameworksandsecurityhowtheyki">Frameworks and security : how they kill your security scanning</a></li>
<li><a href="http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/#Objectofvalue">Object of value</a></li>
<li><a href="http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/#Constructiontechniquesfordomai">Construction techniques for domain specific languages</a></li>
<li><a href="http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/#Servlet">Servlet 3.0</a></li>
<li><a href="http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/#faitsquetoutprogrammeurdevrait">97 things every programmer should know</a></li>
</ul>
<h3><a name="JavaSEandJavaFXTheRoadAhead"></a>Java SE and JavaFX: The Road Ahead</h3>
<p>Jazoon 2010 commence par une keynote de Danny Coward sur l'évolution du langage java. Danny revient sur l'évolution de Java depuis le début du langage (Java a 15 ans depuis le 24 mai). Il y a désormais plus de 7 millions de développeurs Java à travers la planète, près d'un milliard de JVM déployées, et plus de 2 milliards de téléphones mobiles avec une JME. </p>
<p>Il nous montre également une <a href="http://www.youtube.com/watch?v=Ahg8OBYixL0" title="vido" >vidéo</a> de 1995, avec James Gosling présentant un prototype de PDA avec des interactions proches des smartphones récents, notamment la navigation dans les menus, l'écran tactile, un véritable iPhone préhistorique.</p>
<p>Danny insiste fortement sur l'effort de modularisation de la JVM, illustré par le projet <a href="http://blogs.sun.com/theplanetarium/entry/project_jigsaw_modularizing_jdk_7" title="Jigsaw" >Jigsaw</a>, pour améliorer la taille de la JVM et sa rapidité de démarrage. Il nous parle également de la gestion du parallélisme avec le récent travail sur le garbage collector G1, mais aussi de l'API fork/join et ParallelArray sur laquelle nous reviendrons en détails.</p>
<p>Danny nous parle également du grand nombre de langages qui tournent sur la JVM : près de 200. Il met en lumière le projet <a href="http://openjdk.java.net/projects/mlvm/" title="Da Vinci Machine" >Da Vinci Machine</a>, destiné à fournir des optimisations bas niveau aux langages tiers pour obtenir des performances proches de Java sur tous les langages tournant sur la JVM.</p>
<p>Puis viennent toutes les nouveautés du langage attendues prochainement :</p>
<ul>
<li>nouvelles annotations,</li>
<li>amélioration de l'<a href="http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000009.html" title="infrence de type" >inférence de type</a> pour les Generics (mieux connu sous le nom de 'diamond operator')</li>
<li>possibilité de catcher plusieurs exceptions à la fois,</li>
<li>supports des chaines de caractères pour les commandes switch/case,</li>
<li>support des closures à travers le projet <a href="http://openjdk.java.net/projects/lambda/" title="Lambda" >Lambda</a>.</li>
</ul>
<p>Danny consacre également beaucoup de temps pour nous parler de <a href="http://javafx.com/" title="JavaFX" >JavaFX</a>. Il a tenu à rappeler que JavaFX est bien vivant, la preuve en est qu'il y a eu 4 releases en 18 mois. Parmi les nouveautés de la version 1.3 on peut noter :</p>
<ul>
<li>l'arrivée de nouveaux composants graphiques plus scalables,</li>
<li>la nouvelle stack graphique nommée Prism,</li>
<li>des optimisations : il annonce un démarrage 2 à 3 fois plus rapide sur un Java SE 6 update 18,</li>
<li>JavaFX TV : annoncé comme nouveauté mais déjà présent dans la version 1.2, avec son émulateur de TV.</li>
</ul>
<p>Et pour finir cette keynote de lancement, il nous fait la démonstration d'une partie du site des <a href="http://www.vancouver2010.com/olympic-medals/geo-view/" title="JO de Vancouver 2010" >JO de Vancouver 2010</a>, écrite avec JavaFX. </p>
<p>Si l'on se replonge dans les sessions de l'année dernière, il est troublant de voir que les sujets abordés dans cette keynote sont exactement les mêmes que ceux abordés par James Gosling et Danny Coward l'an passé, au même endroit (si l'on omet l'omniprésence de JEE6 en 2009). Si nous étions taquins, on pourrait presque dire que cette keynote d'ouverture est un copier / coller de celle de l'année dernière. Et si nous étions  vraiment irrévérencieux, nous dirions que depuis un an, Sun / Oracle n'a pas grand chose à annoncer concernant Java.</p>
<h3><a name="ClientServerwithJavaandFlex"></a>Client / Server 2.0 with Java and Flex</h3>
<p><a href="http://www.jamesward.com/" title="James Ward" >James Ward</a> nous présente les interactions entre le monde Flex et le monde Java. James revient sur toutes les méthodes de communication, d'une jsp renvoyant du contenu en xml, en passant par les appels SOAP, jusqu'à l'utilisation des annotations fournies dans spring-blazeds. </p>
<p>L'annotation <code>@RemotingDestination</code> permet d'exposer automatiquement un service Java vers le monde Flex en utilisant le protocole AMF.</p>
<p>Il insiste également sur le coût du parsing de chacun des formats. AMF est peu coûteux en CPU et en mémoire comparé au parseur XML. Ce point peut être important dans le cadre de clients Flash sur mobile, ne possédant pas la même puissance de calcul et de mémoire qu'un desktop. Pour conclure, James nous présente Flash sur un téléphone Android.</p>
<h3><a name="Frameworksandsecurityhowtheyki"></a>Frameworks and security : how they kill your security scanning</h3>
<p>Christian Hang, de chez Armorize Technologies, nous fait part de son point de vue sur les problèmes d'audit de sécurité posés par l'utilisation des frameworks. Il commence par un rappel assez complet sur la sécurité en général et les méthodes de détection de failles :</p>
<ul>
<li>black box testing : simulation d'attaques extérieures</li>
<li>white box testing : analyse statique de code pour trouver des failles potentielles (ou SCA : Static Code Analysis)</li>
<li>analyse dynamique : mise en place d'agents ou de moniteurs sur une application en fonctionnement pour tracer les failles</li>
</ul>
<p>Il expose rapidement les risques de détection de faux positifs et faux négatifs et leurs conséquences avant d'approfondir sur l'analyse statique de code et ses limites. C'est là qu'arrivent les frameworks et le défi lancé aux outils de SCA. En effet, la forte utilisation de fichiers configuration casse la chaine d'invocation que tentent de suivre les outils de SCA. Comme chaque framework possède ses propres normes de configuration, il est très complexe de poser une méthode générique. De plus comme les frameworks sont des librairies tierces, la chaine d'invocation va se perdre au sein d'un jar et oblige à inspecter le framework en lui-même et non l'application seule. Il nous fait la démonstration de son propos avec le déroulement d'une requête dans Struts.</p>
<p>Christian termine en exposant les solutions qu'il entrevoit à ces problèmes, à savoir la génération de code source 'glue', basée sur les fichiers de configuration, qui permette aux outils actuels de SCA de continuer à suivre la chaine d'invocation jusqu'au bout. Ce code 'glue' serait injecté avant le passage de l'analyse de code et évidemment pas committé sur l'application.</p>
<p>Avec ses propositions, Christian nous ouvre de nouvelles perspectives d'améliorations pour les outils de SCA. Il y a du chemin à faire mais le gain en détection automatique de failles est potentiellement énorme.</p>
<h3><a name="Objectofvalue"></a>Object of value</h3>
<p>Première présentation de la journée pour Kevlin Henney. Il revient sur le concept de Value Object en insistant beaucoup sur la différence fondamentale qui existe entre une Valeur et son implémentation. </p>
<p>L'exemple le plus parlant qu'il donne est celui d'un md5 de fichier. Pour être manipulé, nous aurons sûrement tendance à le stocker dans un <code>String</code>, mais fondamentalement, ce n'est pas une quelconque chaîne de caractères, c'est un <code>MD5</code> qu'on souhaite manipuler. Ce qui devrait se traduire par la création d'un Value Object <code>MD5</code>.</p>
<p>Pour un rappel sur ce concept, vous pouvez vous pencher sur <a href="http://blog.abdennebi.com/2007/03/le-value-object.html" title="ce blog" >ce blog</a>.</p>
<p>Kevlin Henney nous invite à réfléchir à la meilleure façon de manipuler des Valeurs dans nos programmes et non un énorme assemblage de String et de numériques.</p>
<p>Nous reparlerons prochainement de ses idées sur la question. </p>
<h3><a name="Constructiontechniquesfordomai"></a>Construction techniques for domain specific languages</h3>
<p><a href="http://www.nealford.com/my/bio.htm" title="Neal Ford" >Neal Ford</a>, de ThoughtWorks, nous parle de l'élaboration de <a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="DSL" >DSL</a> et des outils les plus adaptés à cela. Après un rappel sur les motivations de l'écriture de DSL et la différence fondamentale entre une API et un DSL, il nous livre ses cinq clés pour l'élaboration de DSL :</p>
<ul>
<li>langage de programmation</li>
<li>langage naturel, proche d'un langage oral</li>
<li>focalisé sur un aspect particulier du domaine</li>
<li>expressivité limitée</li>
<li>ne doit pas être <a href="http://fr.wikipedia.org/wiki/Turing-complet" title="Turingcomplet" >Turing-complet</a></li>
</ul>
<p>Il tente alors une approche des principes exposés en Java, code à l'appui. De son point de vue, il n'est pas possible de réaliser de vrais DSL en Java pur. Ce qui s'en rapproche le plus est le method chaining, qui consiste à retourner <code>this</code> à la fin de chaque méthode pour pouvoir enchainer les appels. Un bon exemple illustrant ce principe est l'API Criteria d'Hibernate :</p>
<div class="syntax_hilite">
<div id="java-17">
<div class="java"><a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">List</span></a> cats = sess.<span style="color: #006600;">createCriteria</span><span style="color: #66cc66;">&#40;</span>Cat.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; .<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span> Restrictions.<span style="color: #006600;">like</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"name"</span>, <span style="color: #ff0000;">"Fritz%"</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; .<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span> Restrictions.<span style="color: #006600;">between</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"weight"</span>, minWeight, maxWeight<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; .<span style="color: #006600;">list</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Puis il passe au langage Groovy, qui lui semble bien plus adapté que Java pour ce cas de figure. Certains aspects de Groovy facilitent la tâche :</p>
<ul>
<li>le typage dynamique</li>
<li>les closures</li>
<li>2 techniques de classes ouvertes : les <a href="http://communitymapbuilder.osgeo.org/display/GROOVY/Groovy+Categories" title="Categories" >Categories</a>, et les <a href="http://groovy.codehaus.org/api/groovy/lang/MetaClass.html" title="MetaClasses" >MetaClasses</a></li>
</ul>
<p>Ce qui amène Neal a parler de EasyB, projet codé en Groovy pour rédiger des spécifications en <a href="http://fr.wikipedia.org/wiki/Behavior_Driven_Development" title="BDD" >BDD</a>, de la forme :</p>
<div class="syntax_hilite">
<div id="java-18">
<div class="java">given <span style="color: #ff0000;">"an invalid zip code"</span>, <span style="color: #66cc66;">&#123;</span><br />
&nbsp; invalidzipcode = <span style="color: #ff0000;">"221o1"</span><br />
<span style="color: #66cc66;">&#125;</span></p>
<p>and <span style="color: #ff0000;">"given the zipcodevalidator is initialized"</span>, <span style="color: #66cc66;">&#123;</span><br />
&nbsp; zipvalidate = <span style="color: #000000; font-weight: bold;">new</span> ZipCodeValidator<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#125;</span></p>
<p>when <span style="color: #ff0000;">"validate is invoked with the invalid zip code"</span>, <span style="color: #66cc66;">&#123;</span><br />
&nbsp; value = zipvalidate.<span style="color: #006600;">validate</span><span style="color: #66cc66;">&#40;</span>invalidzipcode<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#125;</span></p>
<p>then <span style="color: #ff0000;">"the validator instance should return false"</span>, <span style="color: #66cc66;">&#123;</span><br />
&nbsp; value.<span style="color: #006600;">shouldBe</span> <span style="color: #000000; font-weight: bold;">false</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>EasyB étant basé sur RSpec, un projet BDD pour Ruby, Neal enchaîne naturellement sur les avantages de ce langage pour la rédaction de DSL, à savoir :</p>
<ul>
<li>classes ouvertes</li>
<li>aliasing de méthodes</li>
<li>polishing, méthodes de nettoyage de code 'presque' Ruby en 'vrai' Ruby.</li>
</ul>
<p>Pour information, il est tout à fait possible de réaliser ses DSL en Ruby et de les faire exécuter en Java, grâce à <a href="http://jruby.org/" title="JRuby" >JRuby</a>. Neal nous livre donc son choix pour les DSL : Ruby. Et il termine sa présentation en rappelant les éléments indispensables à conserver en tête lors de la rédaction de DSL :</p>
<ul>
<li>c'est un langage de programmation limité à un aspect du domaine.</li>
<li>construire par composition et non par élaboration : il vaut mieux faire beaucoup d'opérateurs simples qu'on composera en utilisant le DSL.</li>
<li>démarrer par la fin : il faut poser la syntaxe que l'on souhaite obtenir dès le début et créer le DSL de façon à respecter cette syntaxe.</li>
<li>évolution, pas révolution : un DSL se construit petit à petit, il ne faut pas espérer penser tous les opérateurs dès le début, les besoins apparaitront à l'usage.</li>
</ul>
<h3><a name="Servlet"></a>Servlet 3.0</h3>
<p>Ravij Mordani présente la spécification Servlet 3.0, introduite dans la plateforme JEE6. Il nous présente les améliorations selon quatre axes qui reflètent le nouveau visage des Servlets.</p>
<h4><a name="Facilitdedveloppement"></a>Facilité de développement</h4>
<p>Profite des améliorations de Java 5, comme les annotations.<br />
On peut directement annoter une servlet plutôt que de devoir la configurer dans le fichier web.xml. Le très verbeux</p>
<div class="syntax_hilite">
<div id="xml-19">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;servlet<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;servlet</span>-class<span style="font-weight: bold; color: black;">&gt;</span></span>com.servlet.HelloWorldServlet<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/servlet</span>-class<span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;servlet</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span>HelloWorld<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/servlet</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/servlet<span style="font-weight: bold; color: black;">&gt;</span></span></span></p>
<p><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;servlet</span>-mapping<span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;servlet</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span>HelloWorld<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/servlet</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;url</span>-pattern<span style="font-weight: bold; color: black;">&gt;</span></span>/hello-world<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/url</span>-pattern<span style="font-weight: bold; color: black;">&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/servlet</span>-mapping<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</div>
</div>
<p> </p>
<p>devient donc </p>
<div class="syntax_hilite">
<div id="java-20">
<div class="java">@WebServlet<span style="color: #66cc66;">&#40;</span>urlPatterns=<span style="color: #ff0000;">"/hello-world"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HelloWorldServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet</div>
</div>
</div>
<p></p>
<p>On notera qu'il est toujours obligatoire d'étendre <code>HttpServlet</code> et de fournir une implémentation aux méthodes <code>doGet</code>, <code>doPost</code>, etc.</p>
<p>De la même manière, on peut définir des <code>Filter</code> ou des <code>ContextListener</code> directement par annotations. Le fichier de configuration web.xml devient optionnel, les annotations suffisent. Si toutefois vous le voulez, vous pouvez écrire un fichier web.xml, qui surchargera alors les directives des annotations.</p>
<p>La configuration peut également être faite de façon programmatique, grâce à une nouvelle API, mais uniquement au chargement du contexte.</p>
<div class="syntax_hilite">
<div id="java-21">
<div class="java">context.<span style="color: #006600;">addServlet</span><span style="color: #66cc66;">&#40;</span><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> servletName<span style="color: #66cc66;">&#41;</span><br />
context.<span style="color: #006600;">addServlet</span><span style="color: #66cc66;">&#40;</span><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> className<span style="color: #66cc66;">&#41;</span><br />
context.<span style="color: #006600;">addServlet</span><span style="color: #66cc66;">&#40;</span>Class&lt;?&gt; servletClass<span style="color: #66cc66;">&#41;</span><br />
context.<span style="color: #006600;">addServlet</span><span style="color: #66cc66;">&#40;</span>Servlet servlet<span style="color: #66cc66;">&#41;</span><br />
...</div>
</div>
</div>
<p></p>
<h4><a name="Pluggabilit"></a>Pluggabilité</h4>
<p>La notion de web-fragment fournit un moyen de partitionner le descripteur de déploiement. On peut directement fournir de la configuration dans un jar, en plaçant un fichier nommé web-fragment.xml dans META-INF. De la même manière on peut intégrer des JSP dans les jars dans le répertoire META-INF/resources/.</p>
<p>La notion de plug-in de container apparait également. Elle est déjà utilisée notamment par les implémentations de référence JSF (Mojora) et JAX-RS (Jersey). </p>
<h4><a name="Excutionasynchrone"></a>Exécution asynchrone</h4>
<p>L'exécution asynchrone de servlet permet de s'affranchir du pattern <em>Thread by request</em>. Les requêtes demandant un traitement long au back-end, telles que des requêtes bases de données couteuses ou les appels à des systèmes externes de type webservice, peuvent désormais être facilement exécutées de manière asynchrone. Cela permet de rendre le thread disponible pour le traitement des autres requêtes.<br />
Cette fonctionnalité est également très utile pour le développement de fonctionnalités poussant des données vers le client. Le thread n'est plus en permanence bloqué pour un client, mais uniquement lors de l'arrivée d'un évènement.<br />
Pour que le mode asynchrone fonctionne, il faut que toute la chaîne de traitement soit effectivement compatible (filtres, servlets...).</p>
<h4><a name="Scurit"></a>Sécurité</h4>
<p>Un ensemble d'annotations permet désormais de gérer le contrôle d'accès à une servlet. On peut également obliger l'utilisation d'un protocole sécurisé (HTTPS) pour l'appel à la servlet. Les 4 annotations suivantes : <code>@DenyAll</code>, <code>@PermitAll</code>, <code>@RolesAllowed</code>, <code>@TransportProtected</code> pourront être utilisées sur les méthodes traitant les requêtes dans <code>HttpServlet</code> (<code>doGet</code>, <code>doPost</code> et les autres) ou bien directement sur la classe.</p>
<div class="syntax_hilite">
<div id="java-22">
<div class="java">@WebServlet<span style="color: #66cc66;">&#40;</span>urlPatterns=<span style="color: #ff0000;">"/secure/hello-world"</span><span style="color: #66cc66;">&#41;</span><br />
@RolesAllowed<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"authentified"</span><span style="color: #66cc66;">&#41;</span><br />
@TransportProtected<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HelloWorldServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet</div>
</div>
</div>
<p></p>
<p>Il est aussi possible d'implémenter directement la méthode d'authentification <code>HttpServletRequest.login(String username, String password)</code>;</p>
<h3><a name="faitsquetoutprogrammeurdevrait"></a>97 faits que tout programmeur devrait connaître</h3>
<p>Pour clore la journée, tout le monde se regroupe dans la salle 5 (la plus grande) pour écouter <a href="http://www.two-sdg.demon.co.uk/curbralan/kevlin.htm" title="Kevlin Henney" >Kevlin Henney</a> présenter quelques conseils extraits du livre publié par O'Reilly <a href="http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book" title="97 things every programmer should know" >97 things every programmer should know</a></p>
<p>Le livre étant très conséquent, il a choisi de se focaliser sur : </p>
<ul>
<li>Apprenez à estimer : <a href="http://programmer.97things.oreilly.com/wiki/index.php/Learn_to_Estimate" title="Learn to estimate" >Learn to estimate</a></li>
<li>Ne commentez que ce que le code ne dit pas : <a href="http://programmer.97things.oreilly.com/wiki/index.php/Comment_Only_What_the_Code_Cannot_Say" title="Comment only What the code cannot say" >Comment only What the code cannot say</a></li>
<li>Encaspulez un comportement, pas seulement un état : <a href="http://programmer.97things.oreilly.com/wiki/index.php/Encapsulate_Behavior%2C_not_Just_State" title="Encapsulate behavior not just state" >Encapsulate behavior not just state</a></li>
<li>La règle du boyscout : <a href="http://programmer.97things.oreilly.com/wiki/index.php/The_Boy_Scout_Rule" title="The boy scout rule" >The boy scout rule</a> (Try to leave this world a litte better than you found it...)</li>
<li>Le test est la rigueur professionnelle du développement logiciel : <a href="http://programmer.97things.oreilly.com/wiki/index.php/Testing_Is_the_Engineering_Rigor_of_Software_Development" title="Testing is the Engineering rigor of software development" >Testing is the Engineering rigor of software development</a></li>
<li>Écrivez des tests accessibles aux autres  : <a href="http://programmer.97things.oreilly.com/wiki/index.php/Write_Tests_for_People" title="Write test for people" >Write test for people</a></li>
</ul>
<p>Les anecdotes et la verve de Kevlin nous font passer un très bon moment, avant de nous rendre au Jazoon Networking Event, où tous les participants peuvent souffler un peu autour d'un verre, partager leurs impressions sur les différentes sessions de la journée, ou discuter avec les speakers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/06/04/jazoon10-jour-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>En route pour Jazoon&#8217;10</title>
		<link>http://blog.xebia.fr/2010/05/27/en-route-pour-jazoon10/</link>
		<comments>http://blog.xebia.fr/2010/05/27/en-route-pour-jazoon10/#comments</comments>
		<pubDate>Thu, 27 May 2010 15:45:04 +0000</pubDate>
		<dc:creator>Aurélien Maury</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Java / JEE]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[jazoon]]></category>
		<category><![CDATA[Xebia]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4801</guid>
		<description><![CDATA[
La semaine prochaine se tiendra à Zurich l'une des plus grandes conférences Java en Europe : Jazoon. Xebia France y sera représenté.
Le programme s'annonce chargé et diversifié, choisir entre les conférences en parallèle risque d'être très dur. Voici quelques-uns des sujets principaux :

JEE6
RESTful SOA
OSGi
Security patterns
Scala in the cloud
JavaFX
Parallel programming with Groovy
Maven 3.0
Hibernate from JPA2 perspective

Le [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2010/05/jazoon_logo.png" alt="Jazoon 2010" /><br />
La semaine prochaine se tiendra à Zurich l'une des plus grandes conférences Java en Europe : Jazoon. Xebia France y sera représenté.</p>
<p>Le programme s'annonce chargé et diversifié, choisir entre les conférences en parallèle risque d'être très dur. Voici quelques-uns des sujets principaux :</p>
<ul>
<li>JEE6</li>
<li>RESTful SOA</li>
<li>OSGi</li>
<li>Security patterns</li>
<li>Scala in the cloud</li>
<li>JavaFX</li>
<li>Parallel programming with Groovy</li>
<li>Maven 3.0</li>
<li>Hibernate from JPA2 perspective</li>
</ul>
<p>Le tout sera porté par des acteurs J2EE de renommée mondiale : Danny Coward, Ken Schwaber, Dan Allen, Emmanuel Bernard ...</p>
<p>Les journées risquent d'être denses et nous espérons y collecter un maximum d'informations que nous vous relayerons ! Nous avons décidé de ne couvrir que les deux premières journées, qui nous ont semblé être les plus attrayantes au niveau du programme.</p>
<p>Vous pourrez vivre Jazoon en direct, <a href="http://jazoon.com/Conference/Tuesday" title="mardi" >mardi</a> et <a href="http://jazoon.com/Conference/Wednesday" title="mercredi" >mercredi</a> prochain, en nous suivant sur Twitter.</p>
<div style="text-align:center">
<strong>Xebia France :</strong><br />
<a href="http://twitter.com/xebiafr"><img src="http://blog.xebia.fr/wp-content/uploads/2010/04/twitter4.png" alt="twitter4" title="twitter4" width="201" height="74" class="aligncenter size-full wp-image-4438" /></a></p>
<p><strong>Julien Buret :</strong><br />
<a href="http://twitter.com/julienburet"><img src="http://blog.xebia.fr/wp-content/uploads/2010/04/twitter4.png" alt="twitter4" title="twitter4" width="201" height="74" class="aligncenter size-full wp-image-4438" /></a></p>
<p><strong>Aurélien Maury :</strong><br />
<a href="http://twitter.com/aurelienmaury"><img src="http://blog.xebia.fr/wp-content/uploads/2010/04/twitter4.png" alt="twitter4" title="twitter4" width="201" height="74" class="aligncenter size-full wp-image-4438" /></a>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/05/27/en-route-pour-jazoon10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2009/06/29/revue-de-presse-xebia-115/</link>
		<comments>http://blog.xebia.fr/2009/06/29/revue-de-presse-xebia-115/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 16:32:10 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[CEP]]></category>
		<category><![CDATA[Complex Event Processing]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Eclipse Galileo]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java / JEE]]></category>
		<category><![CDATA[jazoon]]></category>
		<category><![CDATA[JMX 2]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[SpringSource Slices]]></category>
		<category><![CDATA[StreamBase]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=2449</guid>
		<description><![CDATA[
La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.
Actualité éditeurs / SSII

StreamBase lie le Complex Event Processing à Twitter
Atlassian Summit : le présent et l'avenir des outils Atlassian

Le coin de la technique

Sortie d'Eclipse Galileo
Des applications Web modulaires avec SpringSource Slices
Que devient JMX 2 ?

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

Retour sur [...]]]></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/2009/06/29/revue-de-presse-xebia-115/#StreamBaselieleComplexEventPro">StreamBase lie le Complex Event Processing à Twitter</a></li>
<li><a href="http://blog.xebia.fr/2009/06/29/revue-de-presse-xebia-115/#AtlassianSummitleprsentetlaven">Atlassian Summit : le présent et l'avenir des outils Atlassian</a></li>
</ul>
<p><strong>Le coin de la technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2009/06/29/revue-de-presse-xebia-115/#SortiedEclipseGalileo">Sortie d'Eclipse Galileo</a></li>
<li><a href="http://blog.xebia.fr/2009/06/29/revue-de-presse-xebia-115/#DesapplicationsWebmodulairesav">Des applications Web modulaires avec SpringSource Slices</a></li>
<li><a href="http://blog.xebia.fr/2009/06/29/revue-de-presse-xebia-115/#QuedevientJMX">Que devient JMX 2 ?</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/2009/06/29/revue-de-presse-xebia-115/#RetoursurlaconfrenceJazoon">Retour sur la conférence Jazoon</a></li>
</ul>
<h3><a name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3>
<h4><a name="StreamBaselieleComplexEventPro"></a>StreamBase lie le Complex Event Processing à Twitter</h4>
<p><a href="http://www.streambase.com/">StreamBase</a> est un éditeur qui fournit une solution de <a href="http://en.wikipedia.org/wiki/Complex_event_processing" title="Complex Event Processing (CEP)" ><em>Complex Event Processing</em> (CEP)</a> très populaire dans le monde de la finance. Il s'agit d'un <em>middleware</em> capable d'analyser un flux de messages en temps réel pour y reconnaître des évènements complexes. </p>
<p>Dans <a href="http://www.streambase.com/9bd00b4c-a8b1-4260-9751-65d5abad13c5/press-release-detail.htm" title="un communique de presse" >un communiqué de presse</a>, l'entreprise annonce proposer un connecteur <a href="http://www.twitter.com">Twitter</a> pour sa solution de CEP. Il devient ainsi possible pour les systèmes d'information du monde de la finance d'analyser les messages Twitter pour en extraire un sentiment global en temps réel pouvant être utilisé dans un système de <em>trading</em> ou d'analyse <em>marketing</em>.</p>
<p>John Davies, directeur technique d'une société américaine spécialisée dans ce type de traitements financiers, <a href="http://www.theserverside.com/news/thread.tss?thread_id=55060" title="analyse cette annonce" >analyse cette annonce</a> et avoue qu'après avoir été sceptique quant à cette idée au premier abord, il y voit désormais une opportunité d'améliorer la réactivité des systèmes par rapport à l'utilisation de simples flux Reuteurs apportant l'information plus tardivement.</p>
<p>Ce type d'annonce permet surtout de réaliser le potentiel de la technologie CEP appliquée à l'exploitation de sources diverses provenant de l'intérieur comme de l'extérieur du système d'information de l'entreprise.</p>
<h4><a name="AtlassianSummitleprsentetlaven"></a>Atlassian Summit : le présent et l'avenir des outils Atlassian</h4>
<p>Au début du mois de juin s'est déroulé l'<a href="http://www.atlassian.com/summit/presentations/" title="Atlassian Summit" >Atlassian Summit</a> à San Fransico. Il s'agissait de la première conférence du genre pour l'éditeur et a pu profiter de l'occasion pour présenter toutes ses nouveautés à venir et revenir sur les dernières évolutions de ses produits. L'ensemble des sessions de cette conférence sont maintenant <a href="http://www.atlassian.com/summit/presentations/keynote.jsp" title="accessibles librement en ligne" >accessibles librement en ligne</a>.</p>
<p>Nous nous attarderons principalement sur le <a href="http://www.atlassian.com/summit/presentations/keynote.jsp" title="keynote de Mike CannonBrookes" >keynote de Mike Cannon-Brookes</a>, CEO et co-fondateur d'Atlassian, qui résume la majorité des éléments à retenir.</p>
<p><strong>Confluence</strong></p>
<p>La version 3.0 de <a href="http://www.atlassian.com/software/confluence/" title="Confluence" >Confluence</a> a été finalisée il y a peu. Elle apporte principalement :</p>
<ul>
<li>Ajout d'un <em>macro browser</em> permettant de naviguer facilement parmi les macros disponibles</li>
<li>Apport de nombreuses extensions de nature "sociale" avec une gestion de réseaux, un <em>microblogging</em> de type Twitter, un espace personnel repensé</li>
<li>Gain significatif de performance lors de la navigation et de l'édition</li>
</ul>
<p><strong>Jira et GreenHopper</strong></p>
<p>Jira 4.0 n'est pas encore finalisé, mais est dors et déjà <a href="http://www.atlassian.com/software/jira/beta/" title="disponible en version beta" >disponible en version beta</a>. Il apporte quelques nouveautés intéressantes&nbsp;:</p>
<ul>
<li>Refonte du <em>dashboard</em> de Jira. Il devient largement personnalisable grâce à l'ajout de <em>gadgets</em> à l'image d'<a href="http://www.igoogle.fr" title="iGoogle" >iGoogle</a></li>
<li>Introduction du <em>Jira Query Language</em> (JQL) permettant de faire des recherches avancées simplement grâce à un système de complétion. Les résultats des requêtes peuvent alors être ajoutés au <em>dashboard</em></li>
<li>Le plugin GreenHopper, permettant d'exploiter le moteur de tâches de Jira pour gérer un projet agile (gestion d'itérations, production de <em>burndown charts</em>, ...), devient un produit Atlassian. L'éditeur en ayant annoncé l'acquisition lors du Summit.</li>
</ul>
<p><strong>Open Social</strong> </p>
<p>La généralisation de l'utilisation de l'API <a href="http://code.google.com/intl/fr/apis/opensocial/" title="Open Social" >Open Social</a> au sein des produits Atlassian est probablement ce qui restera le plus marquant. Ainsi la plupart des produits Atlassian proposeront des gadgets Open Social pouvant être intégrés à n'importe quel conteneur Web s'appuyant sur cette technologie.</p>
<p>Concrètement, il est alors possible d'intégrer un gadget Jira au sein de l'interface de Gmail afin de simplifier la saisie d'une nouvelle anomalie suite à la réception d'un mail décrivant un problème. De même, le <em>dashboard</em> de Jira 4.0 devenant un conteneur Open Social, il est possible d'intégrer un gadget indiquant l'état des derniers <em>builds</em> de Bamboo conjointement aux gadgets indiquant l'état des anomalies et tâches Jira actives. Open Social devient ainsi le vecteur d'intégration des produits Atlassian.</p>
<p><strong>Fisheye, Crucible et Eclipse Connector</strong></p>
<p><a href="http://www.atlassian.com/software/fisheye/beta/" title="Fisheye 2.0" >Fisheye 2.0</a> et <a href="http://www.atlassian.com/software/crucible/beta/" title="Crucible 20" >Crucible 2.0</a> ne sont également pas encore finalisés mais accessibles en beta. Ils apporteront tous deux une meilleure intégration à Jira, une interface utilisateur refondue et une vue permettant de visualiser l'activité des développeurs sur les différents projets.</p>
<p>Atlassian a également publié fin mai <a href="http://blogs.atlassian.com/news/2009/05/atlassian_eclip.html" title="la version finale de lEclipse Connector" >la version finale de l'Eclipse Connector</a>, un plugin permettant d'intégrer certaines fonctionnalités des produits Atlassian au sein d'Eclipse :</p>
<ul>
<li>Jira est un <em>task repository</em> pour Mylyn, la gestion de tâches s'intègre donc à tous les niveaux dans l'IDE. Il est par exemple possible avec un clic d'ajouter, en pièce jointe de l'anomalie Jira, le <em>context</em> Mylyn et, dans un autre environnement, de le restituer d'un autre clic.</li>
<li>Une vue est dédiée à Bamboo et permet d'observer et d'interagir avec les <em>builds</em> du serveur d'intégration continue de l'éditeur</li>
<li>Il devient possible d'effectuer les <em>code reviews</em> Crucible directement depuis Eclipse</li>
<li>Il est possible de lancer l'affichage de la page Fisheye correspondant à un fichier spécifique par simple clic droit</li>
</ul>
<p>Ces fonctionnalités étaient déjà <a href="http://confluence.atlassian.com/display/IDEPLUGIN/Atlassian+IntelliJ+Connector" title="disponibles pour IntelliJ" >disponibles pour IntelliJ</a>, elles le sont maintenant également pour l'IDE Java le plus populaire.</p>
<p>Atlassian continue de se montrer très innovant en apportant un lot intéressant de nouvelles fonctionnalités sur ses produits déjà très populaires. L'acquisition de GreenHopper lui permet quant à elle de se positionner sur le créneau des applications de gestion de projets agiles que <a href="http://studios.thoughtworks.com/" title="Thoughtworks Studios" >Thoughtworks Studios</a> commençait à investir avec <a href="http://studios.thoughtworks.com/mingle-agile-project-management" title="Mingle" >Mingle</a>.</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la technique</h3>
<h4><a name="SortiedEclipseGalileo"></a>Sortie d'Eclipse Galileo</h4>
<p>Comme <a href="http://eclipsesource.com/blogs/2009/06/23/eclipse-osgi-galileo-and-release-trains/" title="chaque année depuis 2004" >chaque année depuis 2004</a>, fin juin sera marquée par la sortie d'une nouvelle version d'<a href="http://www.eclipse.org/home/" title="Eclipse IDE" >Eclipse IDE</a>. </p>
<p>Après Callisto, Europa et Ganymède, voici venu <a href="http://www.eclipse.org/galileo/" title="Galileo" >Galileo</a> (ou Eclipse 3.5).</p>
<p>Difficile de faire un résumé des <a href="http://www.eclipse.org/org/press-release/20090624_galileo.php" title="24 millions de lignes de codes" >24 millions de lignes de codes</a> ni même de la <a href="http://www.eclipse.org/galileo/projects.php" title="trentaine de projets" >trentaine de projets</a> qui le compose, cependant plusieurs nouvelles fonctionnalités ressortent. A signaler qu'un <a href="http://eclipsesource.com/blogs/2009/06/24/eclipse-galileo-feature-top-10-list-number-1/" title="top 10 de ces nouveautés" >top 10 de ces nouveautés</a> a d'ailleurs été publié par <a href="http://eclipsesource.com/blogs/author/irbull/" title="Ian Bull" >Ian Bull</a> sur le site d'<a href="http://eclipsesource.com/blogs/" title="Eclipse Source" >Eclipse Source</a> (série de 10 billets).</p>
<p>On notera ainsi :</p>
<ul>
<li>Compatibilité avec Mac OS X (portage SWT vers Cocoa).</li>
<li>Memory Analyzer Tool (<a href="http://eclipse.org/mat/" title="MAT" >MAT</a>), un outil d'analyse de <em>heap</em> (consommation, fuite mémoire ...).</li>
<li>Mylyn (gestion de tâches, synchronisation...) qui n'est pas nouveau mais qui devient de plus en plus populaire avec le support entre autre de Jira.</li>
<li>XText qui permet la création de DSL (auto-complétion, coloration syntaxique ...).</li>
<li>Rich Ajax Platform (<a href="http://eclipse.org/rap/" title="RAP" >RAP</a>) qui permet de déployer son application en tant que WebApp.</li>
<li>SWT Browser qui gère le <a href="http://eclipsesource.com/blogs/2009/06/16/eclipse-galileo-feature-top-10-list-number-9/" title="pont entre Java et Javascript dans les 2 sens" >pont entre Java et Javascript dans les 2 sens</a>.</li>
<li>Mylyn <a href="http://wiki.eclipse.org/Mylyn/Incubator/WikiText" title="WikiText" >WikiText</a>, un éditeur de fichier wiki.</li>
<li>Plateforme (p2 avec update manager revu, target platform, deploy into self pour tester ses plugins ...).</li>
</ul>
<p>Le téléchargement se passe par <a href="http://www.eclipse.org/downloads/" title="ici" >ici</a> avec comme d'habitude plusieurs packages disponibles qui vont de la version <em>classique</em> à la version <em>Java</em>, <em>JEE</em> ou <em>RCP</em> sans oublier, pour les non javaistes, les versions <em>C++</em> et <em>PHP</em>. D'autres packages ciblant le <em>reporting</em> ou la <em>modélisation</em> sont aussi disponibles.</p>
<p>Et bien sûr, rendez-vous est pris l'année prochaine même date (par <a href="http://eclipsesource.com/blogs/2009/06/23/eclipse-osgi-galileo-and-release-trains/" title="Chris Aniszczyk" >Chris Aniszczyk</a>) pour la <em>release</em> d'Eclipse 3.6 qui se nommera Helios !</p>
<h4><a name="DesapplicationsWebmodulairesav"></a>Des applications Web modulaires avec SpringSource Slices</h4>
<p>Rob Harrop <a href="http://blog.springsource.com/2009/06/22/modular-web-applications-with-springsource-slices/" title="a prsent" >a présenté</a> une ébauche d'un nouveau projet SpringSource appelé Slices.</p>
<p>Il s'agit d'un framework basé sur <a href="http://www.springsource.org/dmserver" title="dm Server 20" >dm Server 2.0</a> et permettant le développement d'applications Web modulaires. Cette modularité est bien sûr offerte par OSGi, ce qui lui en apporte les caractéristiques particulières : gestion de dépendance versionnées et chargement et arrêt des modules à chaud.</p>
<p>Concrètement une application utilisant Slices offrira un module Web <em>host</em> et un ensemble de modules fils appelés <em>slices</em>. Chaque module apporte du code applicatif et un ensemble de ressources Web (CSS, JavaScript, JSP, images). Le framework offre alors une couche d'abstraction aux <em>slices</em> leur permettant de posséder leur propre session et <em>servlet mappings</em>. Il offre également l'infrastructure nécessaire pour rendre les ressources du module <em>host</em> visibles par tous les autres et pour permettre aux modules de se détecter les uns les autres et ainsi d'opérer des altérations visuelles et comportementales en conséquence.</p>
<p>Dans son état actuel, Slices n'offre qu'une infrastructure de base, la version finale devrait apporter en supplément :</p>
<ul>
<li>Un framework de composition d'UI. On imagine que celui-ci apportera des tags permettant l'affichage conditionnel en fonction de la présence ou non de certains modules. Cette fonctionnalité est actuellement gérée manuellement par des EL dans l'application d'exemple</li>
<li>Le support des <em>servlet filters</em></li>
<li>Une intégration à <a href="http://tiles.apache.org/" title="Tiles 2" >Tiles 2</a></li>
<li>L'intégration à <a href="http://www.springsource.com/products/sts" title="SpringSource Tool Suite" >SpringSource Tool Suite</a></li>
</ul>
<p>Slices apportera donc de nouvelles possibilités en apportant la modularité jusqu'à la couche Web. Ainsi, parallèlement à son offre tc Server, résolument orienté vers le marché actuel, SpringSource continue d'innover en apportant des fonctionnalités supplémentaires à son offre modulaire centrée autour de dm Server. </p>
<h4><a name="QuedevientJMX"></a>Que devient JMX 2 ?</h4>
<p>JMX est une API standard Java permettant le <em>monitoring</em> et le <em>management</em> d'applications, elle est définie par la <a href="http://www.jcp.org/en/jsr/detail?id=003" title="JSR-3" >JSR-3</a> et étendue par la <a href="http://www.jcp.org/en/jsr/detail?id=160" title="JSR-160 (Remote JMX)" >JSR-160 (Remote JMX)</a>. Depuis sa création en 1998, l'API a évoluée au fil des <em>maintenance releases</em> de sa JSR, incrémentant au passage sa version depuis 1.0 jusqu'à 1.4. Au départ disponible sous forme de librairie externe, JMX a finalement été intégré au JDK 5.0 <a href="http://marxsoftware.blogspot.com/2008/01/java-se-6-and-jmx.html" title="puis mis  jour dans le JDK 60" >puis mis à jour dans le JDK 6.0</a>, fin 2006, pour s'aligner avec sa dernière version.</p>
<p>La prochaine évolution majeure de JMX est la version 2.0, cette fois-ci définie dans une nouvelle JSR, la <a href="http://www.jcp.org/en/jsr/detail?id=255" title="JSR-255 (JMX 2.0)" >JSR-255 (JMX 2.0)</a>. Actuellement en statut <em>early draft review</em>, il est dors et déjà possible de se rendre compte des chantiers prévus :</p>
<ul>
<li>Des <em>namespaces</em> permettant de préfixer les noms des MBeans afin d'offrir une meilleure scalabilité lors que de très nombreux MBeans sont manipulés.</li>
<li>Le <em>cascading</em> permettant de fédérer un ensemble de MBeans situés sur des serveurs différents.</li>
<li>Définition de MBeans standards par annotations (<code>@MBean</code>, <code>@ManagedAttribute</code> et <code>@ManagedOperation</code>) et de leur injecter des ressources telles qu'un <code>MBeanServer</code> ou un <code>ObjectName</code>. Ce principe de définition de MBeans par annotations est calqué sur ce que <a href="http://static.springframework.org/spring/docs/2.5.x/reference/jmx.html" title="Spring permet actuellement" >Spring permet actuellement</a>.</li>
<li>Un nouveau langage de requête permettant d'accéder facilement à tous les MBeans dont les propriétés se conforment à certains prédicats.</li>
</ul>
<p>JMX 2.0 était initialement prévue pour être intégrée au prochain JDK, l'API avait fait son apparition au sein de la <a href="http://download.java.net/jdk7/docs/api/javax/management/package-summary.html" title="Javadoc des previews du JDK 7" >Javadoc des previews du JDK 7</a> mais restait absent de <a href="http://openjdk.java.net/projects/jdk7/features/" title="sa liste de features" >sa liste de features</a>. Eamonn McManus a clarifié cette situation <a href="http://weblogs.java.net/blog/emcmanus/archive/2009/06/jsr_255_jmx_api.html" title="en annonant sur son blog" >en annonçant sur son blog</a> que JMX 2.0 ne serait pas intégré au JDK 7 tel qu'initialement prévu, qu'il n'était pas pour autant annulé mais reporté ... au JDK 8. L'officialisation de ce report est une mauvaise nouvelle, car cette nouvelle mouture de JMX serait arrivée à temps pour apporter un renouveau à cette API, qui bien que très puissante, souffre parfois de lourdeurs à l'usage.</p>
<h3><a name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l'étranger</h3>
<h4><a name="RetoursurlaconfrenceJazoon"></a>Retour sur la conférence Jazoon</h4>
<p>La semaine dernière se tenait à Zürich la conférence <em>où les Javaistes se rencontrent</em>. Xebia était présent à cette conférence et en a publié des résumés quotidiens :</p>
<ul>
<li>Jour 1 : <a href="http://blog.xebia.fr/2009/06/24/jazoon-jour-1-jee6-et-glassfish-v3/" title="JEE6 et Glassfish v3" >JEE6 et Glassfish v3</a></li>
<li>Jour 1 : <a href="http://blog.xebia.fr/2009/06/24/jazoon-jour-1-groovy/" title="Groovy" >Groovy</a></li>
<li>Jour 1 : <a href="http://blog.xebia.fr/2009/06/24/jazoon-jour-1-developpement-mobile/" title="Dveloppement mobile" >Développement mobile</a></li>
<li>Jour 1 : <a href="http://blog.xebia.fr/2009/06/24/jazoon-jour-1-prospective/" title="Prospective" >Prospective</a></li>
<li>Jour 2 : <a href="http://blog.xebia.fr/2009/06/24/jazoon-jour-2-jdk-7/" title="JDK 7" >JDK 7</a></li>
<li>Jour 2 : <a href="http://blog.xebia.fr/2009/06/24/jazoon-jour-2-ddd-et-value-objects/" title="DDD et Value Objects" >DDD et Value Objects</a></li>
<li>Jour 2 : <a href="http://blog.xebia.fr/2009/06/25/jazoon-jour-2-javafx/" title="Java FX" >Java FX</a></li>
<li>Jour 3 : <a href="http://blog.xebia.fr/2009/06/26/jazoon-jour-3-un-arbre-est-tombe/" title="Un arbre est tomb" >Un arbre est tombé</a></li>
<li>Jour 3 : <a href="http://blog.xebia.fr/2009/06/26/jazoon-jour-3-les-secrets-des-programmeurs-rockstars/" title="Les secrets des programmeurs Rockstars" >Les secrets des programmeurs Rockstars</a></li>
<li>Jour 3 : <a href="http://blog.xebia.fr/2009/06/28/jazoon-jour-3-hibernate-search/" title="Hibernate Search" >Hibernate Search</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2009/06/29/revue-de-presse-xebia-115/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jazoon &#8211; Jour 3 &#8211; Hibernate Search</title>
		<link>http://blog.xebia.fr/2009/06/28/jazoon-jour-3-hibernate-search/</link>
		<comments>http://blog.xebia.fr/2009/06/28/jazoon-jour-3-hibernate-search/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 15:31:29 +0000</pubDate>
		<dc:creator>Guillaume Mathias</dc:creator>
				<category><![CDATA[Java / JEE]]></category>
		<category><![CDATA[full text]]></category>
		<category><![CDATA[Hibernate Search]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=2421</guid>
		<description><![CDATA[Nous avons assisté à la présentation de Hibernate Search par Emmanuel Bernard (project leader). Pour faire simple Hibernate Search est une API qui permet de "googler" votre modèle en s'appuyant sur Apache Lucene. Nous en avions déjà parlé dans cette introduction à Hibernate Search.
Néanmoins c'est l'occasion de revenir sur certains concepts et problématiques abordés par [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons assisté à la présentation de <a href="https://www.hibernate.org/410.html">Hibernate Search</a> par Emmanuel Bernard (<i>project leader</i>). Pour faire simple Hibernate Search est une API qui permet de "googler" votre modèle en s'appuyant sur <a href="http://lucene.apache.org/">Apache Lucene</a>. Nous en avions déjà parlé dans cette <a href="http://blog.xebia.fr/2008/03/06/introduction-a-hibernate-search-googling-your-persistent-domain-model/">introduction à Hibernate Search</a>.<br />
Néanmoins c'est l'occasion de revenir sur certains concepts et problématiques abordés par les recherches full-text, très bien expliqués par Emmanuel :</p>
<ul>
<li>Trier les résultats par <b>pertinence</b></li>
<li>Extraire la <b>quintessence</b> : "le Blog de XEbia" -> "blog xebia"</li>
<li><b>Approximation</b> : "xeiba" -> "xebia"</li>
<li>Recherche <b>phonétique</b></li>
<li><b>Synonymes</b></li>
<li>Même <b>famille/racine</b> : "opérer, opération, opérez"</li>
</ul>
<h3>Pertinence</h3>
<p>La pertinence est déterminée par le nombre d'occurences trouvées :
<ul>
<li>Nombre d'occurences par document pour un mot-clef.</li>
<li>Nombre d'occurences de nombre de mots-clefs pour un document.</li>
</ul>
<p>La pertinence dépend aussi des champs dans lesquels on effectue la recherche. On peut "prioriser" certains champs par rapport à d'autres. Par exemple on peut affecter un poids plus important au titre d'un livre qu'à sa description.</p>
<h3>Extraire la quintessence</h3>
<p>Le moteur de recherche <em>tokenize</em> la "requête" pour découper et récupérer tous les mots, puis il applique des filtres. Il peut notamment mettre tous les mots en minuscules ou retirer les mots trop courants, sans interêt ("le", "un", "de", etc).</p>
<h3>Approximation</h3>
<p>L'approximation permet de compenser notamment les fautes de frappe.<br />
Une première approche est de mesurer la similarité entre les mots (<a href="http://fr.wikipedia.org/wiki/Distance_de_Levenshtein">distance de Levenshtein</a>/d'édition) mais cela est coûteux niveau performance.</p>
<p>L'autre approche est le <a href="http://fr.wikipedia.org/wiki/N-gramme">N-grammes</a>. Cela consiste à découper les mots en morceaux de n caractères puis d'indexer ces morceaux.<br />
Exemple d'utilisation d'un tri-grammes :
<ul>
<li>On découpe et indexe <code>"Hibernate" -> [hib, ibe, ber, ern, rna, nat, ate]</code>
<li>L'utilisateur tape <code>"ybernat" -> [ybe, ber, ern, rna, nat]</code>
<li>On compare les morceaux en communs : <code>[ber, ern, rna, nat]</code>.
</ul>
<h3>Recherche phonétique</h3>
<p>Des algorithmes (<a href="http://fr.wikipedia.org/wiki/Soundex">Soundex</a>, ou plus évolué <a href="http://fr.wikipedia.org/wiki/Metaphone">Metaphone</a>) permettent de calculer des codes phonétiques qui sont stockés dans un index. Mais ce type de recherche n'est pas le plus courant.</p>
<h3>Synonymes</h3>
<p>La recherche de synonymes se base sur un dictionnaire qui indexe tous les synonymes de chaque mot.<br />
Ce dictionnaire est évidemment propre à chaque domaine métier, chaque application, et c'est pour cela qu'il a une réelle valeur ajoutée car même Google ne peut connaitre votre métier aussi bien que vous.<br />
Pour chaque groupe de synonymes il est conseillé d'avoir un mot de référence, qui sera celui indexé. Ainsi les mots saisis par l'utilisateur sont traduits en mots de référence avant d'être comparés à ceux de l'index.</p>
<h3>Même famille</h3>
<p>L'approche brutale consiste à indexer toutes les variations d'un mot. Plus subtil, on peut supprimer certains suffixes pour ne garder que la racine.<br />
Il existe ensuite des algorithmes avancés (mais majoritairement pour l'anglais), comme celui de <a href="http://en.wikipedia.org/wiki/Martin_Porter">Martin Porter</a> avec son langage <a href="http://en.wikipedia.org/wiki/Snowball_programming_language">Snowball</a>.</p>
<h3>En pratique</h3>
<p>Si vous voulez savoir comment mettre en pratique ces fonctionnalités avec Hibernate Search, (re)lisez ce <a href="http://blog.xebia.fr/2008/03/28/hands-on-hibernate-search-recherche-full-text/">hands-on</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2009/06/28/jazoon-jour-3-hibernate-search/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
