<?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/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; Divers</title> <atom:link href="http://blog.xebia.fr/category/divers/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Web sémantique pratique, les microformats</title><link>http://blog.xebia.fr/2011/12/19/web-semantique-pratique-les-microformats/</link> <comments>http://blog.xebia.fr/2011/12/19/web-semantique-pratique-les-microformats/#comments</comments> <pubDate>Mon, 19 Dec 2011 06:20:00 +0000</pubDate> <dc:creator>Bertrand Dechoux</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Microformat]]></category> <category><![CDATA[Web sémantique]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9894</guid> <description><![CDATA[Le web évolue. Initialement, il s&#8217;agissait essentiellement d&#8217;une plate-forme de publication. Tout le monde pouvait lire les informations mais seule une minorité produisait le contenu. Sous le terme web 2.0, on désigne un renversement des habitudes. Tout le monde est maintenant à même d&#8217;échanger de l&#8217;information. Le contenu généré par les utilisateurs est d&#8217;ailleurs devenu [...]]]></description> <content:encoded><![CDATA[<p>Le web évolue. Initialement, il s&#8217;agissait essentiellement d&#8217;une plate-forme de publication. Tout le monde pouvait lire les informations mais seule une minorité produisait le contenu. Sous le terme web 2.0, on désigne un renversement des habitudes. Tout le monde est maintenant à même d&#8217;échanger de l&#8217;information. Le contenu généré par les utilisateurs est d&#8217;ailleurs devenu la matière première de nombreux business ; Twitter en est un excellent exemple. C&#8217;est pour cela que le web 2.0 est également nommé web social.</p><p>L&#8217;évolution ne s’arrête pas là et un nouveau buzzword est apparu : le web 3.0, qui serait pour certains le web sémantique. On est en effet passé d&#8217;une plate-forme de publication à une plate-forme de communication. Mais les échanges restent essentiellement entre humains. Quand vous lisez <em>Paris</em>, vous pensez soit à la tour Eiffel soit à une jet setteuse américaine mais vous êtes capable de faire la différence. Et vous pouvez ensuite affiner vos recherches en vous basant sur la confiance que vous accordez aux différentes sources.</p><p>Pour un agent automatisé, un robot, c&#8217;est plus compliqué. Le web sémantique décrit la stack nécessaire pour franchir le pas.</p><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/12/semantic-web-stack-1-274x300.png" height="300" style="border: 1px dotted #653A71; padding: 10px;" /></span></p><p>Les termes en gras désignent les technologies choisies. Sans rentrer dans les détails, la stack est loin d&#8217;être complètement opérationnelle mais les bases sont déjà utilisables. Ce qui nous intéresse maintenant est l&#8217;échange de données et plus particulièrement les <a
href="http://microformats.org" rel="nofollow">microformats</a>, un format d&#8217;échange alternatif permettant de structurer les données au sein de vos pages web.</p><p>L&#8217;intérêt est de rendre ces informations intelligibles sans intervention humaine. Cela peut donc aider votre <a
href="http://microformats.org/2010/04/28/google-adds-support-for-hcalendar-and-hrecipe-rich-snippets" rel="nofollow">SEO</a> mais également permettre à vos visiteurs d&#8217;enregistrer vos coordonnées en un seul clic. Vous pouvez visualiser ces informations en utilisant <a
href="http://www.google.com/webmasters/tools/richsnippets" rel="nofollow">Rich Snippets Testing Tools </a>de Google. Le plugin firefox <a
href="https://addons.mozilla.org/en-US/firefox/addon/operator/" rel="nofollow">Operator</a> permet également de détecter ces informations au sein de ce navigateur. Sur la page que vous êtes en train de lire, l&#8217;auteur, les personnes ayant laissé un commentaire et les tags sont décrits à l&#8217;aide de microformats. LinkedIn, Viadeo, Flickr ou YouTube font de même pour les profils utilisateurs.</p><p>Les <a
href="http://microformats.org/wiki/hcard" rel="nofollow">cartes de visites</a> sont surement le premier format à exploiter. Un <a
href="http://microformats.org/code/hcard/creator" rel="nofollow">outil de conversion</a> peut vous aider pour vos premières réalisations.</p><p>Voici, un exemple pour Xebia :</p><div
style="font-size:small"><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;div class=&quot;vcard&quot;&gt;
     &lt;a class=&quot;url fn org&quot; href=&quot;http://www.xebia.fr/&quot;&gt;Xebia&lt;/a&gt;
     &lt;a class=&quot;email&quot; href=&quot;mailto:info@xebia.fr&quot;&gt;info@xebia.fr&lt;/a&gt;
     &lt;div class=&quot;adr&quot;&gt;
          &lt;div class=&quot;street-address&quot;&gt;10/12 Avenue de L'Arche&lt;/div&gt;
          &lt;span class=&quot;locality&quot;&gt;Courbevoie&lt;/span&gt;,
          &lt;span class=&quot;postal-code&quot;&gt;92419&lt;/span&gt;
          &lt;span class=&quot;country-name&quot;&gt;France&lt;/span&gt;
     &lt;/div&gt;
     &lt;div class=&quot;tel&quot;&gt;
          &lt;span class=&quot;type&quot;&gt;Work&lt;/span&gt;+33 (0)1 53 89 99 99
     &lt;/div&gt;
     &lt;div class=&quot;tel&quot;&gt;
          &lt;span class=&quot;type&quot;&gt;Fax&lt;/span&gt;+33 (0)1 53 89 99 97
     &lt;/div&gt;
     &lt;a rel=&quot;me&quot; class=&quot;url&quot; href=&quot;http://fr.twitter.com/#!/XebiaFr&quot;&gt;Twitter&lt;/a&gt;
     &lt;a rel=&quot;me&quot; class=&quot;url&quot; href=&quot;https://github.com/xebia-france&quot;&gt;Github&lt;/a&gt;
&lt;/div&gt;
</pre></div><p>Les microformats sont simples d&#8217;utilisation. Avec une connaissance rudimentaire d&#8217;un langage de balisage comme le HTML, l&#8217;exemple doit être en lui-même suffisamment descriptif. Afin d&#8217;identifier les propriétés, il suffit d&#8217;ajouter une classe CSS sur les balises. La contrainte sémantique pour les hcards est que l&#8217;élément parent doit être marqué par la classe CSS <em>vcard</em>.</p><p>Ce bloc décrit une organisation (org) nommée (fn) Xebia et visible (url) sur son site institutionnel. Elle possède une adresse (adr) définie par la rue (street-adress), la ville (locality), le code postal (postal-code) et enfin le pays (country-name). On peut la joindre par email (email) ou encore par téléphone et fax (tel). D&#8217;autres profils sont disponibles en ligne (url), comme par exemple sur Twitter ou Github.</p><p>Une fois cet exemple assimilé et appliqué, il ne reste plus qu&#8217;à piocher dans la liste des formats, stables ou non, pour structurer d&#8217;avantage les informations que vous exposez. Il est ainsi possible par exemple de décrire des <a
href="http://microformats.org/wiki/hcalendar" rel="nofollow">événements</a>, la <a
href="http://microformats.org/wiki/rel-license" rel="nofollow">licence d&#8217;un contenu</a> ou encore des <a
href="http://microformats.org/wiki/rel-tag" rel="nofollow">tags</a>.</p><p>Les microformats, par leur simplicité, constituent un premier pas vers la démocratisation du web sémantique et sont <a
href="http://blog.8thlight.com/billy-whited/2011/10/17/expressive-html.html" rel="nofollow">un des outils du software craftsman</a>. Mais comme vous avez pu le constater, RDF est le format d&#8217;échange choisi pour la stack du web sémantique. Nous verrons dans un prochain article ce que RDF apporte.</p><p
style="font-size:x-small">NB : Le schéma de la stack du web sémantique appartient au <a
href="http://en.wikipedia.org/wiki/File:Semantic-web-stack.png">domain publique</a>.</p><div
class="shr-publisher-9894"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F19%2Fweb-semantique-pratique-les-microformats%2F' data-shr_title='Web+s%C3%A9mantique+pratique%2C+les+microformats'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F19%2Fweb-semantique-pratique-les-microformats%2F' data-shr_title='Web+s%C3%A9mantique+pratique%2C+les+microformats'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/12/19/web-semantique-pratique-les-microformats/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Xebia accueille la 18ème soirée du Paris Scala User Group</title><link>http://blog.xebia.fr/2011/12/16/xebia-accueille-la-18eme-soiree-du-paris-scala-user-group/</link> <comments>http://blog.xebia.fr/2011/12/16/xebia-accueille-la-18eme-soiree-du-paris-scala-user-group/#comments</comments> <pubDate>Fri, 16 Dec 2011 12:09:14 +0000</pubDate> <dc:creator>David Galichet</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Paris Scala User Group]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9913</guid> <description><![CDATA[La prochaine session du Paris Scala User Group aura lieu lundi 19 Décembre à 19h30 dans les locaux de Xebia. À cette occasion, Jean-Luc Canela nous proposera une présentation sur specs2. specs2 est un framework de tests écrit en scala permettant d&#8217;écrire vos tests unitaires ainsi que vos tests d&#8217;acceptance (en mode BDD) avec une [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/12/scala-logo.png" alt="" title="scala-logo.png" width="198" height="59" style="padding: 5px; padding-left: 20px; float: right;" class="size-full wp-image-9912" /><br
/> La prochaine session du <a
href="http://groups.google.com/group/paris-scala-user-group" rel="nofollow">Paris Scala User Group</a> aura lieu <b>lundi 19 Décembre à 19h30</b> dans les locaux de <b>Xebia</b>.</p><p>À cette occasion, Jean-Luc Canela nous proposera une présentation sur <a
href="http://etorreborre.github.com/specs2/" rel="nofollow">specs2</a>. <em>specs2</em> est un framework de tests écrit en <em>scala</em> permettant d&#8217;écrire vos tests unitaires ainsi que vos tests d&#8217;acceptance (en mode <a
href="http://en.wikipedia.org/wiki/Behavior_Driven_Development" rel="nofollow">BDD</a>) avec une approche fonctionnelle.</p><p>Il reste encore des places, si vous souhaitez y assister, pensez à vous <a
href="http://www.doodle.com/52aawfbvdadtfn3v" rel="nofollow">inscrire</a> pour la logistique.</p><p>Notez bien l&#8217;adresse :<br
/> <b>Xebia</b><br
/> <b>156 boulevard Haussmann à Paris</b><br
/> <b>Immeuble A &#8211; 7e étage</b></p><div
class="shr-publisher-9913"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F16%2Fxebia-accueille-la-18eme-soiree-du-paris-scala-user-group%2F' data-shr_title='Xebia+accueille+la+18%C3%A8me+soir%C3%A9e+du+Paris+Scala+User+Group'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F16%2Fxebia-accueille-la-18eme-soiree-du-paris-scala-user-group%2F' data-shr_title='Xebia+accueille+la+18%C3%A8me+soir%C3%A9e+du+Paris+Scala+User+Group'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/12/16/xebia-accueille-la-18eme-soiree-du-paris-scala-user-group/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Catalogue Xebia Training 2012</title><link>http://blog.xebia.fr/2011/12/09/catalogue-xebia-training-2012/</link> <comments>http://blog.xebia.fr/2011/12/09/catalogue-xebia-training-2012/#comments</comments> <pubDate>Fri, 09 Dec 2011 07:58:00 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Training]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9725</guid> <description><![CDATA[Xebia-training a le plaisir de vous faire découvrir son catalogue de formations 2012 (consultez ici).  Quelques nouveautés&#8230; Formations agiles Formations « Kanban » avec David Anderson Formations « Architectures Lean » avec James Coplien Formations « Software Craftsmanship » avec Jean-Laurent de Morlhon Formations « Agile for Management » avec Mac Adams Formations « Product [...]]]></description> <content:encoded><![CDATA[<p><span
color="#000000" style=";font-family=;font-size=;">Xebia-training a le plaisir de vous faire découvrir son catalogue de formations 2012 (</span><a
href="http://training.xebia.fr/wp-content/uploads/catalogue-2012.pdf" rel="nofollow">consultez ici</a><span
color="#000000" style=";font-family=;font-size=;">). </span></p><p><span
color="#000000" style=";font-family=;font-size=;">Quelques nouveautés&#8230;</span></p><h1><a
name="DRAFT-CatalogueXebiaTraining2012-"></a><span
color="#000000" style=";font-family=;font-size=;">Formations agiles</span></h1><ul><li><span
color="#000000" style=";font-family=;font-size=;">Formations « Kanban » avec David Anderson</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « Architectures Lean » avec James Coplien</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « Software Craftsmanship » avec Jean-Laurent de Morlhon</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « Agile for Management » avec Mac Adams</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « Product Owner et User Story Mapping » toujours avec Mac Adams.</span></li></ul><h1><a
name="DRAFT-CatalogueXebiaTraining2012-"></a><span
color="#000000" style=";font-family=;font-size=;"><b>Formations techniques</b></span></h1><ul><li><span
color="#000000" style=";font-family=;font-size=;">Formations « MongoDB » en partenariat avec 10Gen pour développeurs et pour administrateurs</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations </span><span
color="#000000" style=";font-family=;font-size=;"><b>certifiantes </b></span><span
color="#000000" style=";font-family=;font-size=;">Cloudera pour développeurs et pour administrateurs pour Hadoop Apache</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « HTML 5 » avec Seven Lemesle</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « Android » avec Pascal Ognibene</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « TDD » avec Simon Caplette</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « DevOps pour Java » avec Cyrille Le Clerc</span></li><li><span
color="#000000" style=";font-family=;font-size=;">Formations « Cloud Computing » toujours avec Cyrille Le Clerc.</span></li></ul><p><span
color="#000000" style=";font-family=;font-size=;">Pour plus d&#8217;informations, n&#8217;hésitez pas à nous contacter  au 01 53 89 99 99 ou visitez notre site en suivant </span><a
href="http://training.xebia.fr/" rel="nofollow">ce lien</a><span
color="#000000" style=";font-family=;font-size=;">.</span></p><div
class="shr-publisher-9725"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F09%2Fcatalogue-xebia-training-2012%2F' data-shr_title='Catalogue+Xebia+Training+2012'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F09%2Fcatalogue-xebia-training-2012%2F' data-shr_title='Catalogue+Xebia+Training+2012'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/12/09/catalogue-xebia-training-2012/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx &#8211; Rules for Good UI Design</title><link>http://blog.xebia.fr/2011/11/18/devoxx-rules-for-good-ui-design/</link> <comments>http://blog.xebia.fr/2011/11/18/devoxx-rules-for-good-ui-design/#comments</comments> <pubDate>Fri, 18 Nov 2011 12:34:15 +0000</pubDate> <dc:creator>Olivier Michallat</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Devoxx]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9263</guid> <description><![CDATA[La conception des interfaces utilisateur tient une place importante, même dans une conférence très technique comme Devoxx. En témoigne l&#8217;affluence à cette session où Joe Nuxoll, principalement connu en tant que membre du célèbre Java Posse, se propose d&#8217;inculquer aux développeurs quelques notions issues du monde du design. Joe a débuté sa carrière comme architecte logiciel, mais [...]]]></description> <content:encoded><![CDATA[<p>La conception des interfaces utilisateur tient une place importante, même dans une conférence très technique comme Devoxx. En témoigne l&#8217;affluence à cette session où <a
href="http://www.devoxx.com/display/DV11/Joe+Nuxoll" rel="nofollow">Joe Nuxoll</a>, principalement connu en tant que membre du célèbre <a
href="http://javaposse.com" rel="nofollow">Java Posse</a>, se propose d&#8217;inculquer aux développeurs quelques notions issues du monde du design.</p><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/IMG_4055_2.jpg" style="border: 0px solid black" /></span></p><p>Joe a débuté sa carrière comme architecte logiciel, mais nous explique avec enthousiasme qu&#8217;il a découvert sa passion pour les interfaces utilisateur en travaillant sur des toolkits graphiques. Adepte de course automobile, il occupe aujourd&#8217;hui le poste de ses rêves : <a
href="http://www.teslamotors.com" rel="nofollow">Tesla motors</a> l&#8217;a chargé de concevoir le panneau de contrôle intérieur du futur <a
href="http://www.teslamotors.com/models" rel="nofollow">Modèle S</a>.</p><p>Comme on pouvait s&#8217;y attendre, sa présentation est très professionnelle, avec des diapositives minimalistes mais efficaces, qui rappellent <a
href="http://www.presentationzen.com" rel="nofollow">Presentation Zen</a>. Il s&#8217;attache surtout à définir des principes directeurs, à la façon de <a
href="http://en.wikipedia.org/wiki/Don&#39;t_Make_Me_Think" rel="nofollow">Don&#8217;t make me think</a>, qu&#8217;il citera d&#8217;ailleurs comme référence.</p><p>Avant <em>l&#8217;interface</em> utilisateur, il faut s&#8217;intéresser à <em>l&#8217;expérience</em> utilisateur : peaufiner l&#8217;interface est la dernière étape. Il faut avant tout définir ce que fait le produit, comment il rend service à une personne. Le processus de design suit les étapes suivantes :</p><ul><li>L&#8217;expression du concept, c&#8217;est à dire du besoin métier ;</li><li>L&#8217;architecture de l&#8217;information et la conception des interactions, qui se caractérisent par des itérations sur des prototypes de bas niveau (diagrammes de flux ou modèles en &laquo;&nbsp;fil de fer&nbsp;&raquo;) ;</li><li>La conception visuelle, qui itère cette fois-ci sur des <em>mockups</em> très fidèles au rendu final ;</li><li>Enfin, le plan de mise en production.</li></ul><p>Le design est subjectif : il n&#8217;y a pas de réponse objectivement correcte à un problème donné. Cependant, l&#8217;interaction homme-machine repose sur quelques principes de base, qu&#8217;il faut respecter. Pour Joe, le design par comité ne marche pas : les discussions sont bénéfiques dans les phases d&#8217;itération, mais une seule personne doit prendre la décision finale. De même, il estime que le design par heuristique (mesurer les temps de réflexion, le nombre de clics&#8230;) fonctionne mais ne donne pas de bons résultats visuels (&laquo;&nbsp;looks assy&nbsp;&raquo; selon ses propres termes).</p><p>La seconde partie de la présentation est plus pratique, Joe nous livre ses &laquo;&nbsp;règles d&#8217;or&nbsp;&raquo; du design :</p><ol><li><b>La structure des données sous-jacentes ne doivent pas influencer l&#8217;interface utilisateur.</b> Inversement, l&#8217;interface ne doit pas non plus influencer l&#8217;implémentation.  Souvent, une bonne interface évite ces problèmes grâce à une couche de transformation de données.</li><li><b>Le besoin doit primer sur la technologie.</b> Il faut résister à la tentation de se &laquo;&nbsp;faire plaisir&nbsp;&raquo; sur la technique. Idéalement, les choix techniques doivent être repoussés le plus tard possible, une fois que le besoin est bien cerné.</li><li><b>Démarrer le processus avec de</b> <b><em>vrais</em></b> <b>cas d&#8217;utilisation</b>. Voir comment les utilisateurs répondaient au besoin précédemment, ce qui marchait et ne marchait pas.</li><li><b>Identifier les catégories d&#8217;utilisateurs qui vont utiliser le produit.</b> Les incarner sous forme de <em>personnages</em> avec un nom, une photo, qui aidera à les identifier. Envisager de leur proposer des interfaces différentes.</li><li><b>Penser en terme de</b> <b><em>flux</em></b><b>, pas de fonctionnalités.</b> Une interface est vivante, en mouvement. Par exemple, ne pas penser en terme d&#8217;écran de connexion, mais de processus de connexion. Ceci facilitera les retours des utilisateurs dès les premières itérations.</li><li><b>Prototyper souvent, jeter les prototypes souvent.</b> Ne pas trop investir, construire rapidement et jeter sans regret.</li><li><b>Rendre la prochaine étape évidente.</b> Joe nous donne l&#8217;exemple de la page principale de Google, où les boutons &laquo;&nbsp;Recherche&nbsp;&raquo; et &laquo;&nbsp;J&#8217;ai de la chance&nbsp;&raquo; sont côte à côte et ont exactement le même style. Si vous découvriez cette page pour la première fois, la différence entre ces deux boutons serait-elle évidente ?</li><li><b>Réduire le nombre d&#8217;éléments perçus.</b> Face à un écran, le cerveau perçoit une charge cognitive, sur laquelle il se base pour estimer le travail nécessaire pour &laquo;&nbsp;gagner&nbsp;&raquo; l&#8217;écran. Il évalue dans l&#8217;ordre :<ul><li>les formes négatives et l&#8217;esthétique, qui produisent une réponse émotionnelle ;</li><li>le nombre d&#8217;éléments, qui détermine la charge de travail perçue ;</li><li>et enfin l&#8217;emplacement du premier élément, qui déclenche l&#8217;exécution.<br
/>  Joe montre un exemple avec les mêmes champs organisés de deux manières différentes, le résultat est frappant : le premier écran, avec tous ses champs en colonne, est complètement rébarbatif ; le second, utilisant quelques regroupements et des titres de section, paraît beaucoup plus simple à remplir.</li></ul></li><li><b>Utiliser la mémoire musculaire, être consistant.</b></li><li><b>Penser à ce qui peut être fait sans rechargement de page.</b> Par exemple, une liste chargée progressivement en AJAX peut être plus efficace qu&#8217;une liste paginée : l&#8217;utilisateur se souviendra mieux de la position approximative d&#8217;un élément que d&#8217;un numéro exact de page.</li><li><b>Utiliser des transitions pour changer d&#8217;état.</b> Montrer à l&#8217;utilisateur où il va, et comment revenir. Joe nous montre la <a
href="http://www.teslamotors.com/models/features" rel="nofollow">page descriptive de la Tesla Modèle S</a>, où la transition vers les sections se fait avec un défilement automatique vers le bas.</li><li><b>Itérer et raffiner, itérer et raffiner.</b> Joe valorise les designers qui cherchent continuellement à améliorer leur produit.</li><li><b>Et avant tout, fournir une expérience de qualité à l&#8217;utilisateur.</b> Ne pas juste &laquo;&nbsp;livrer cette fichue interface&nbsp;&raquo;.</li></ol><p>Une présentation remarquable par la qualité de son orateur, et fourmillant de conseils utiles.</p><div
class="shr-publisher-9263"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F11%2F18%2Fdevoxx-rules-for-good-ui-design%2F' data-shr_title='Devoxx+-+Rules+for+Good+UI+Design'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F11%2F18%2Fdevoxx-rules-for-good-ui-design%2F' data-shr_title='Devoxx+-+Rules+for+Good+UI+Design'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/18/devoxx-rules-for-good-ui-design/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Introduction à la théorie des langages par Steve Klouvi</title><link>http://blog.xebia.fr/2011/07/13/introduction-a-la-theorie-des-langages-par-steve-klouvi/</link> <comments>http://blog.xebia.fr/2011/07/13/introduction-a-la-theorie-des-langages-par-steve-klouvi/#comments</comments> <pubDate>Wed, 13 Jul 2011 10:10:21 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[ANTLR]]></category> <category><![CDATA[vidéo]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8142</guid> <description><![CDATA[Retrouvez dans cet article la vidéo d&#8217;une introduction détaillée à la théorie des langages et à son application directe par ANTLR. Cette présentation a précédé un hands on mené par Steve Klouvi lors de notre XKE de juin. Introduction à la théorie des langages par Steve Klouvi Tous les podcasts Xebia France :]]></description> <content:encoded><![CDATA[<p>Retrouvez dans cet article la vidéo d&#8217;une introduction détaillée à la théorie des langages et à son application directe par ANTLR. Cette présentation a précédé un <em>hands on</em> mené par <a
href="http://blog.xebia.fr/author/sklouvi/" title="Steve Klouvi" >Steve Klouvi</a> lors de notre <a
href="http://blog.xebia.fr/tag/xke/" title="XKE" >XKE</a> de juin.</p><div
id="player-theorie-des-langages" align='center'>Introduction à  la théorie des langages par Steve Klouvi</div><p> <br
/> <script type="text/javascript">jwplayer('player-theorie-des-langages').setup({
			flashplayer: '/videos/player.swf',
			image: '/videos/theorie-des-langages.jpg',
			file: 'http://xebia-video.s3-website-eu-west-1.amazonaws.com/2011-07-theorie-des-langages.mov',
			width: 720,
			height: 386,
			plugins: {
				'slidesync-1': {
				'position': 'right',
				'size': 300,
				'xmlPath': '/videos/theorie-des-langages-slidesync.xml'
				},
				'slidescroller-1': {
				'position': 'bottom',
				'size': 150,
				'xmlPath': '/videos/theorie-des-langages-slidesync.xml'
				}
			}
		});</script></p><hr/> <strong>Tous les podcasts Xebia France :</strong></p><ul><li><a
href="itpc://blog.xebia.fr/feed/podcast/" title="Subscribe to the Podcast Feed with iTunes"><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/itunes.png" class="podpress_feed_buttons" alt="Subscribe with iTunes"></a></li><li><a
href="http://blog.xebia.fr/feed/podcast/" title="Les podcasts de Xebia France vous permettent de suivre l'actualité autour de Java, de l'agilité, des technologies Web et bien d'autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile."><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/feed_button-rss-podcast.png" class="podpress_feed_buttons" alt="Xebia France Podcast Feed"></a></li></ul><div
class="shr-publisher-8142"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F07%2F13%2Fintroduction-a-la-theorie-des-langages-par-steve-klouvi%2F' data-shr_title='Introduction+%C3%A0+la+th%C3%A9orie+des+langages+par+Steve+Klouvi'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F07%2F13%2Fintroduction-a-la-theorie-des-langages-par-steve-klouvi%2F' data-shr_title='Introduction+%C3%A0+la+th%C3%A9orie+des+langages+par+Steve+Klouvi'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/07/13/introduction-a-la-theorie-des-langages-par-steve-klouvi/feed/</wfw:commentRss> <slash:comments>3</slash:comments> <enclosure
url="http://xebia-video.s3-website-eu-west-1.amazonaws.com/2011-07-theorie-des-langages.mov" length="42626672" type="video/quicktime" /> <itunes:duration>0:41:06</itunes:duration> <itunes:subtitle>Retrouvez dans cet article la vidéo d&#8217;une introduction détaillée à la théorie des langages et à son application directe par ANTLR. Cette présentation a précédé un hands on mené par Steve Klouvi lors de notre XKE de juin.
Introduction à  la thé[...]</itunes:subtitle> <itunes:summary>Retrouvez dans cet article la vidéo d&#8217;une introduction détaillée à la théorie des langages et à son application directe par ANTLR. Cette présentation a précédé un hands on mené par Steve Klouvi lors de notre XKE de juin.
Introduction à  la théorie des langages par Steve Klouvi
Tous les podcasts Xebia France : </itunes:summary> <itunes:keywords>ANTLR, vidéo, XKE</itunes:keywords> <itunes:author>Xebia France</itunes:author> <itunes:explicit>no</itunes:explicit> <itunes:block>no</itunes:block> </item> <item><title>Rapport sur LA conférence Groovy européenne : la GR8Conf</title><link>http://blog.xebia.fr/2011/05/30/rapport-sur-la-conference-groovy-europeenne-la-gr8conf/</link> <comments>http://blog.xebia.fr/2011/05/30/rapport-sur-la-conference-groovy-europeenne-la-gr8conf/#comments</comments> <pubDate>Mon, 30 May 2011 16:07:59 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[GR8Conf]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[webflow]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7900</guid> <description><![CDATA[Comme annoncé, Xebia était présent pour la 3e édition du plus important rassemblement européen de la communauté Groovy : la GR8Conf de Copenhague (prononcez &#171;&#160;Great Conf&#160;&#187;). Pour tous ceux qui auraient voulu y être et n&#8217;ont pas pu, je vais tenter de vous résumer les sessions auxquelles j&#8217;ai assisté et vous donner la tendance du [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/gr8conf_logo.jpg" alt="gr8conf_logo" title="gr8conf_logo" width="130" style="margin: 1em 1em 1em 1em; float: right;"/></p><p>Comme annoncé, Xebia était présent pour la 3e édition du plus important rassemblement européen de la communauté Groovy : la GR8Conf de Copenhague (prononcez &laquo;&nbsp;Great Conf&nbsp;&raquo;). Pour tous ceux qui auraient voulu y être et n&#8217;ont pas pu, je vais tenter de vous résumer les sessions auxquelles j&#8217;ai assisté et vous donner la tendance du clan Groovy (en Europe tout du moins). Commençons par quelques chiffres :</p><ul><li>3 jours</li><li>25 speakers</li><li>plus de 100 participants</li><li>4 workshops</li><li>28 sessions</li><li>2421305344 octets de technologie Groovy sur clé USB (dans le pack de bienvenue)</li></ul><p>La conférence s&#8217;est tenue dans les locaux de la IT University of Copenhagen, qui a prêté un amphithéâtre et une grande salle de cours pour l&#8217;occasion.</p><p>Toutes les sessions ont été filmées (je vous donnerai les liens dès qu&#8217;ils seront publiés). Je n&#8217;ai malheureusement pas pu assister à la première journée : &laquo;&nbsp;l&#8217;université&nbsp;&raquo;. Ce premier jour, les participants ont eu droit à une mise à niveau sur le langage Groovy et le framework Grails, puis ont enchaîné une après-midi de code pour apporter des contributions à certains projets open-source. Certaines features codées pendant ces workshops ont même été intégrées le soir même et utilisées pour les démonstrations des 2 jours de conférence qui ont suivis.</p><h3><a
name="Groovyupdate"></a>Groovy update</h3><p>Après un rapide accueil de <a
href="https://twitter.com/#!/sbglasius" title="Søren Berg Glasius" >Søren Berg Glasius</a>, la première journée de conférence commence par un retour sur les dernières nouveautés du langage Groovy, par <a
href="https://twitter.com/#!/glaforge" title="Guillaume Laforge" >Guillaume Laforge</a>. Il ouvre la session avec quelques statistiques sur Groovy 1.7 :</p><ul><li>185 000 téléchargements le premier mois suivant la sortie,</li><li>177 000 pour le 2e mois,</li><li>une communauté de développeurs estimée à 362 000 (sans doute sous estimée puisque les téléchargements via le repository maven ne sont pas monitorés).</li></ul><p>Puis il enchaîne en revenant en détail sur les principales nouveautés de Groovy 1.8 :</p><ul><li><em>command chain expression</em> : pour des DSL plus proches du langage naturel. À utiliser avec rigueur pour ne pas se perdre entre ce qu&#8217;on passe comme paramètre et l&#8217;appel de la méthode suivante,</li><li>GPars fait maintenant partie du core de Groovy, ce qui offre de façon directe actors, fork-join, dataflow et autres joyeusetés,</li><li>Le support de JSON par défaut dans le langage.</li></ul><p>Il y a également beaucoup d&#8217;annotations très pratiques comme @Log, @Singleton, @WithReadLock, @WithWriteLock. Pour le détail complet, rendez vous <a
href="http://www.slideshare.net/glaforge/groovy-18-update-guillaume-laforge-gr8conf-europe-2011" title="sur Slideshare" >sur Slideshare</a>.</p><p>Enfin, une perspective sur les chantiers prévus pour la prochaine version majeure :</p><ul><li>Utilisation de InvokeDynamic du JDK7,</li><li>Amélioration de la modularité de Groovy pour permettre de n&#8217;embarquer que les modules utiles,</li><li>Réécriture de la grammaire antlr3, prévue pendant le prochain Google Summer of Code,</li><li>Remplacement du compilateur Joint par celui d&#8217;Eclipse,</li><li>Multicatch (IOException | NullPointer e),</li><li>et d&#8217;autres apports de syntaxe, comme l&#8217;intégration du projet Coin et le support des séparateurs pour améliorer la lisibilité des grands nombres.</li></ul><h3><a
name="Grailsupdate"></a>Grails update</h3><p>Dans la foulée des nouvelles, <a
href="https://twitter.com/#!/pledbrook" title="Peter Ledbrook" >Peter Ledbrook</a> nous a dressé le bilan de la branche 1.3 de Grails, avant de faire miroiter à l&#8217;auditoire les nouveautés qui se préparent pour la version 1.4. L&#8217;année écoulée a été celle de la version 1.3, avec énormément de nouveaux plugins, notamment pour fournir à l&#8217;abstraction GORM des implémentations sur NoSQL (comme Redis, MongoDB, Riak, Neo4j et d&#8217;autres). Il a également cité quelques gros comptes utilisant Grails comme framework de premier ordre dans leurs projets, comme Vodafone Music, par exemple.</p><p>La version 1.4 de Grails donne vraiment envie. Parmi les nombreuses améliorations attendues, on peut noter :</p><ul><li>Groovy 1.8,</li><li>Mise à jour de Spring vers la 3.1,</li><li>Mise à jour de Hibernate vers la 3.6,</li><li>L&#8217;utilisation de Tomcat 7 en mode développement,</li><li>Baptême de JQuery comme librairie Javascript de base,</li><li>Améliorations des templates par défaut lors de génération de pages GSP, appliquant les bonnes pratiques HTML5.</li></ul><p>Le but premier de cette version est d&#8217;améliorer encore l&#8217;expérience utilisateur (c&#8217;est à dire celle des développeurs). Ceux qui l&#8217;ont essayé peuvent en témoigner : Grails est déjà un framework très agréable. Espérons qu&#8217;ils arrivent à faire encore mieux. Il y aura également un système de feedbacks pour que, si les développeurs l&#8217;acceptent, leur installation de Grails puisse remonter chez SpringSource des données sur la version utilisée, les plugins installés, etc. Ces statistiques devraient permettre d&#8217;y voir plus clair dans le portail de plugins (qui a passé les 600 plugins), et ainsi connaître ceux qui servent et ceux qui dorment.</p><h3><a
name="AdopterGrails"></a>Adopter Grails</h3><p>Après cela, <a
href="https://twitter.com/#!/KlausBaumecker" title="Klaus Baumecker" >Klaus Baumecker</a>, architecte chez HP, est venu nous parler de l&#8217;adoption de Grails dans une équipe de développement interne.<br
/> Le cadre du projet :</p><ul><li>2 équipes qui développent la prochaine version d&#8217;un produit, l&#8217;une en Grails, l&#8217;autre en J2EE standard,</li><li>Modèle de données commun géré par Hibernate,</li><li>Approche agile (SCRUM-like),</li><li>Frontal Flex.</li></ul><p>Le speaker nous a énuméré les principaux obstacles techniques qui se sont dressés sur la route, notamment l&#8217;intégration de BlazeDS, qui s&#8217;est révélée moins triviale qu&#8217;au premier coup d&#8217;œil. Mais chaque obstacle a trouvé sa solution et le projet a été une réussite. Il a terminé en résumant l&#8217;expérience tirée sous forme de bonnes pratiques pour l&#8217;adoption de Grails :</p><ul><li>Parlez des bénéfices techniques du framework, pas seulement des &laquo;&nbsp;cool stuff&nbsp;&raquo;. Il a notamment insisté sur la flexibilité de Grails, qui a permis de contourner rapidement beaucoup de contraintes techniques,</li><li>Ne soyez pas trop enthousiaste : ça peut donner un aspect &laquo;&nbsp;fanboy&nbsp;&raquo; à votre argumentaire, là où vous voudriez être pris au sérieux,</li><li>Créez une communauté locale, en convaincant en premier lieu vos collègues avant d&#8217;aller voir vos responsables,</li><li>Appuyez vous sur la communauté Grails et aidez les gens autour de vous grâce à elle : se référer aux mailing lists, forums, IRC et autres blogs permet de fournir des points d&#8217;entrée utiles sur le long terme aux débutants,</li><li>Apportez vos outils : parlez des plugins, des outils d&#8217;analyse statique, des IDE,</li><li>Trouvez des situations dans lesquelles Grails fait une vrai différence : notamment quand on compare un &#8216;grails run-app&#8217; par rapport à un redéploiement d&#8217;application classique,</li><li>Restez dans la zone de confort du framework : même si le framework est flexible, rester dans les conventions permet aux débutants de s&#8217;y retrouver plus facilement en se référant aux ressources du web,</li><li>Soyez disponible : si vous tentez d&#8217;introduire Grails, c&#8217;est surement que vous avez un peu plus de connaissance que le reste de votre équipe. Apportez votre aide autant que possible, proposez de faire des revues de code, du pair programming, tout pour accompagner vos collègues sur le chemin de la lumière.</li></ul><p>Je ne saurais trop vous conseiller d&#8217;appliquer ces conseils pour tenter d&#8217;implanter Grails dans vos projets.</p><h3><a
name="Grailsenentreprise"></a>Grails en entreprise</h3><p>Peter Ledbrook a assuré une 2e session sur l&#8217;intégration de Grails dans le monde de l&#8217;entreprise, plus précisément dans les processus de développement logiciel déjà en place. Il a débuté en nous parlant des 2 outils de build les plus implantés dans l&#8217;écosystème Java : Ant et Maven. Pour pouvoir dire que Grails s&#8217;intègre correctement à l&#8217;existant, il est indispensable de pouvoir construire un projet Grails avec ces 2 outils.</p><p>Pour Ant, le problème est assez simple, dans la mesure où le système de build propre à Grails est Gant, c&#8217;est à dire Ant, manipulé grâce à Groovy. Une commande Grails permet de générer <em>build.xml</em> et <em>ivy.xml</em> : <code>grails integrate-with --ant</code>. De cette façon, on peut construire son projet directement avec Ant.</p><p>Pour Maven, des plugins existent pour brancher les scripts Grails dans les phases d&#8217;un build Maven standard. Cependant, l&#8217;intégration avec Maven pose plus de problèmes. De base Grails gère ses dépendances grâce à Ivy, alors que Maven le fait lui même. De plus, le côté rigide d&#8217;un build Maven provoque des frictions avec  celui, très flexible, des build Gant. Si vous pouvez vous le permettre, utilisez Gant et les conventions Grails.</p><p>À noter que pour la roadmap Grails 2.0, il est prévu de passer à Gradle, tout en conservant et améliorant les intégration Ant et Maven.</p><p>Peter a également axé une partie de sa présentation sur l&#8217;adaptabilité d&#8217;une application Grails à une base de données existante. Il est tout à fait possible de reprendre une base de données existante, par plusieurs stratégies:</p><ul><li>utilisation directe de fichiers de mapping Hibernate existant</li><li>mapping fin (table, colonnes, clé primaire, &#8230;) d&#8217;entités définies dans l&#8217;application</li><li>mixer les deux en fonction des besoins</li></ul><p>Pour finir, il nous a parlé de déploiement. les mécanismes de <a
href="http://grails.org/doc/latest/guide/17.%20Deployment.html" title="customisation du contenu du war" >customisation du contenu du war</a> permettent de satisfaire toutes les fantaisies des différents <a
href="http://grails.org/Deployment" title="serveurs d'application" >serveurs d&#8217;application</a>. Pour la production, il conseille fortement de s&#8217;appuyer sur les datasources JNDI et sur les mécanismes permettant d&#8217;externaliser la configuration (voir <a
href="http://blog.xebia.fr/2011/02/10/grails-tips-externaliser-la-configuration/" title="ce tips" >ce tips</a>).</p><p>Puis il a terminé son exposé par quelques conseils d&#8217;ordre général sur les projets Grails :</p><ul><li>N&#8217;oubliez pas que Grails, c&#8217;est du Spring. Par conséquent, on bénéficie de tous les connecteurs du monde Spring, notamment JMS, ESB, AMQP, etc.</li><li>Utilisez le plugin <a
href="http://www.grails.org/plugin/app-info" title="appinfo" >app-info</a>, qui vous donnera des vues sur les entrailles de votre application. De la configuration de la datasource à l&#8217;utilisation mémoire en live.</li><li>Réutilisez vos classes de domaines au maximum. Si une classe de domaine peut servir à plusieurs applications, mettez la dans un plugin et utilisez le.</li></ul><p>La somme de toutes ces pistes et de tous ces conseils, c&#8217;est que Grails est intégrable à, virtuellement, tous les processus de développement logiciel en place. Il faut se donner un peu de peine, mais les outils sont là pour vous faciliter la tâche (à l&#8217;extrême).</p><div
style="text-align:center;"> <img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/IT_univ.jpg" alt="IT_univ" title="IT_univ" width="500" border="0" /></div><h3><a
name="CodeNarcGMetrics"></a>CodeNarc &#038; GMetrics</h3><p>Tandis que se tenait la session de mise à niveau sur Griffon, j&#8217;ai assisté à une présentation de <a
href="https://twitter.com/#!/mrhaki" title="Hubert Klein Ikkink alias MrHaKi" >Hubert Klein Ikkink alias MrHaKi</a>, l&#8217;auteur de billets <a
href="http://mrhaki.blogspot.com/search/label/Groovy%3AGoodness" title="Groovy Goodness" >Groovy Goodness</a> sur son blog, véritable mine d&#8217;or de trucs et astuces techniques.</p><p>Il est venu parler de CodeNarc et de GMetrics, 2 outils d&#8217;analyse statique de code Groovy. Le premier permet de détecter les mauvaises pratiques d&#8217;utilisation du langage, comme des appels explicites là où Groovy ferait implicitement le travail. Au total,174 autres règles sont fournies. Quant à GMetrics, son domaine concerne le calcul de la complexité cyclomatique de votre code.</p><p>CodeNarc a été cité dans beaucoup d&#8217;autres sessions pendant la GR8Conf, voici ce qu&#8217;il faut en retenir :</p><ul><li>Utilisez le !</li><li>Configurez le pour coller à vos bonnes pratiques maisons.</li><li>Ecrivez vos propres règles, et si elles sont génériques, reversez les au projet.</li></ul><p>Pour les détails techniques, je vous encourage à vous pencher sur les documentations respectives de <a
href="http://codenarc.sourceforge.net/" title="CodeNarc" >CodeNarc</a> et <a
href="http://gmetrics.sourceforge.net/" title="GMetrics" >GMetrics</a>.</p><h3><a
name="GrailsApplicationTuning"></a>Grails Application Tuning</h3><p>Voilà l&#8217;une des sessions pour lesquelles j&#8217;ai eu envie de faire le déplacement jusqu&#8217;au Danemark&#8230; Je n&#8217;ai pas été déçu. En une heure, Peter Ledbrook, dans sa 3ème prestation de la journée, a peiné à faire tenir tous les conseils sur l&#8217;optimisation en Grails. La plupart des aspect d&#8217;optimisation sont d&#8217;ailleurs communs à toute application web Java.</p><p>Premier conseil à graver au dessus de votre écran :</p><pre class="brush: java; title: ; notranslate">
Evitez toute optimisation prématurée : Profilez, optimisez, répétez.
</pre><p>Grails est basé sur une stack très classique, donc tous les outils de profiling fonctionnent.</p><h4><a
name="Outilsctserveur"></a>Outils côté serveur</h4><p>Voici quelques outils pour profilez le fonctionnement de votre application côté serveur :</p><ul><li><a
href="http://www.youtube.com/watch?v=yJzERMXophM" title="Spring Insight" >Spring Insight</a> : avec STS, vous pouvez démarrer votre application Grails dans un tcServer et bénéficier de l&#8217;analyse live de chaque requête sur votre application.</li><li>Le <a
href="http://www.grails.org/Profiler+Plugin" title="plugin profiler" >plugin profiler</a> : qui facilite la collecte de temps d&#8217;exécution sur votre code.</li><li>Le <a
href="http://www.grails.org/p6spy+plugin" title="plugin p6spy" >plugin p6spy</a> : installe un proxy JDBC qui vous donnera la détail de toutes les requêtes en base.</li><li>Les plugins <a
href="http://www.grails.org/plugin/app-info" title="app-info" >app-info</a> et <a
href="http://www.grails.org/plugin/hibernate-stats" title="hibernatestats" >hibernate-stats</a> : qui vous donneront beaucoup d&#8217;informations sur les fonctionnements internes de votre application.</li></ul><p>Tout cela devrait vous permettre de trouver plus rapidement les goulots d&#8217;étranglement dans votre code.</p><p>En vrac, voici un ensemble de pistes exploitables pour optimiser vos application Grails (ou autre d&#8217;ailleurs).</p><h4><a
name="Outilsnavigateurs"></a>Outils navigateurs</h4><ul><li><a
href="http://code.google.com/webtoolkit/speedtracer/" title="Google Spring Tracer" >Google Spring Tracer</a>, qui peut également s&#8217;intégrer à Spring Insight.</li><li><a
href="http://developer.yahoo.com/yslow/" title="YSlow" >YSlow</a>, il nécessite Firebug donc l&#8217;utilisation de Firefox, mais il est très pratique.</li></ul><h4><a
name="Performancebasededonnes"></a>Performance base de données</h4><ul><li>Réduire le nombre de requête</li><li>Analyser les requêtes et ajouter les index utiles</li><li>Optimiser vos requêtes, notamment en utilisant des requêtes Criteria nommées.</li><li>Faire attention aux stratégies de fetching</li><li>N&#8217;hésitez pas à changer le modèle pour gagner en performance de requêtage.</li><li>Dans certains cas, le chargement Eager peut être avantageux, n&#8217;hésitez pas à vous en servir (à bon escient).</li><li>Utiliser un cache, surtout dans le cas où il y a plus de lecture que d&#8217;écriture. Pour info, <a
href="http://ehcache.org/documentation/grails.html" title="Ehcache est disponible" >Ehcache est disponible</a> dans la stack Grails.</li></ul><h4><a
name="Performancesurlestraitementsmt"></a>Performance sur les traitements métier</h4><ul><li>Cachez les appels de méthodes de service idempotentes avec le <a
href="http://www.grails.org/plugin/springcache" title="plugin Springcache" >plugin Springcache</a>.</li><li>Faites de l&#8217;asynchrone partout où c&#8217;est possible, par exemple en utilisant le <a
href="http://www.grails.org/plugin/spring-events" title="plugin Spring Events" >plugin Spring Events</a>.</li><li>Utilisez le <a
href="http://www.grails.org/plugin/routing" title="plugin Routing" >plugin Routing</a> pour le messaging</li><li>Utilisez Groovy++ pour vous affranchir du surcoût du dynamisme de Groovy quand c&#8217;est possible.</li><li>Pour les tâches qui font beaucoup de calcul numérique, préférez le Java pur.</li></ul><h4><a
name="Optimisationrseauetnavigateurw"></a>Optimisation réseau et navigateur web</h4><ul><li>Utiliser les capacités de caching de contenu du <a
href="http://www.grails.org/plugin/springcache" title="plugin Springcache" >plugin Springcache</a> partout où c&#8217;est possible, pour éviter de recalculer les pages qui ne changent pas souvent.</li><li>Définissez correctement vos header <a
href="http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/" title="HTTP Expires" >HTTP Expires</a>.</li><li>Packager vos css et votre javascript, un fichier unique pour chaque permet de diminuer le nombre de requête.</li><li>Utiliser le <a
href="http://www.alsacreations.com/tuto/lire/1068-sprites-css-background-position.html" title="spriting CSS" >spriting CSS</a> plutôt que de multiples images.</li><li>Minifier votre Javascript.</li><li>Compresser vos données.</li></ul><p>L&#8217;utilisation du <a
href="http://grails.org/plugin/resources" title="plugin resources" >plugin resources</a> permet d&#8217;automatiser beaucoup de choses. Ce plugin très prometteur fera partie intégrante de Grails dès la version 1.4. Il permet notamment :</p><ul><li>de modulariser les ressources statiques.</li><li>de les packager par type.</li><li>définir les header HTTP Expires et de changer le nom des packages de ressources en cas de modification, ce qui forcera le rechargement par les navigateurs.</li><li>de placer le Javascript toujours en bas de page pour un chargement plus rapide des éléments visuels.</li></ul><p>Ciblez en priorité les victoires faciles. Il faut bien faire attention de ne pas investir trop de temps sur une petite optimisation. On ne vise pas les économies de bouts de chandelle. Une session très chargée et très intéressante. Peter a revendiqué le droit à une sieste après ce 3ème slot de la journée.</p><h3><a
name="EffectiveGroovy"></a>Effective Groovy</h3><p>Pour clore la journée, <a
href="https://twitter.com/#!/HamletDRC" title="Hamlet DArcy" >Hamlet D&#8217;Arcy</a> a présenté ses conseils pour être efficace dans l&#8217;usage du langage Groovy. Sa session était organisée autour d&#8217;une sélection de conseils tirés du livre culte <em>Effective Java</em> et appliqué au monde Groovy. Le speaker est à l&#8217;aise et captive son auditoire. Certaines vagues sur Twitter pendant sa présentation ont émis l&#8217;idée d&#8217;écrire un livre &laquo;&nbsp;Effective Groovy&nbsp;&raquo;. Parmi les conseils les plus utiles, vous pouvez noter :</p><ul><li>Utilisez Codenarc : pour détecter les erreurs les plus courantes, mais aussi pour écrire vos propres règles et les faire respecter au sein de votre équipe.</li><li>Dans le cas où vous avez des appels de constructeurs avec un grand nombre de paramètres, utilisez des arguments nommés pour garder un code lisible.</li><li>Utiliser GPars pour toute programmation conccurente.</li><li>Apprendre à utilise Grab pour gérer les dépendances Groovy de ses scripts.</li></ul><div
style="float:left; margin-right:20px;"> <img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/biere_gr8conf.jpg" alt="biere_gr8conf" title="biere_gr8conf" width="150" height="435" border="0" class="alignleft size-full" /></div><p>Les conseils prodigués ont tous été très bien justifiés mais il faudrait un article entier pour tout restranscrire ici. La racine commune à toutes ces bonnes pratiques est : utiliser le langage. Cela peut paraître simpliste mais c&#8217;est très vrai. Toute cette présentation ciblait les pratiques héritées du langage Java pur. Groovy, et à plus fort titre avec la version 1.8, fourni de nombreuses syntaxes et annotations permettant de gagner beaucoup de temps et de rendre le code plus lisible. Il faut s&#8217;en servir, à fond.</p><ul><li><a
href="http://dl.dropbox.com/u/138156/effectivegroovy_gr82011.pdf" title="Les slides complet ici" >Les slides complet ici</a>.</li></ul><h3><a
name="ConclusiondelapremirejourneMee"></a>Conclusion de la première journée : Meet &#038; Greet</h3><p>Après cette journée bien remplie, tous les participants, speakers et spectateurs, se sont retrouvés autour de bières belges et danoises aux couleurs de la conférence. Ce temps de détente a été l&#8217;occasion de discuter des outils, de l&#8217;adoption de Groovy dans les entreprises de chacun, de la qualité de la bière danoise&#8230;  Certains ont même réussi à coincer Peter Ledbrook dans un coin pour une séance de pair programming sur un bug dans le plugin Maven pour Grails. Pendant ce temps d&#8217;échange, j&#8217;ai eu le plaisir de faire la connaissance de <a
href="https://twitter.com/#!/ticetime" title="Franck Silvestre" >Franck Silvestre</a>, qui participe à la réalisation de l&#8217;un des plus gros projet Grails en France : <a
href="http://www.lilie.org/" title="Lilie" >Lilie</a>. C&#8217;est un projet destiné au secteur de l&#8217;enseignement et sous licence open-source, à voir absolument.</p><h3><a
name="DeuximejournerestermotivGrails"></a>Deuxième journée, rester motivé : Grails Infinispan plugin</h3><p>Après quelques agapes entre participants la veille, la 2ème journée démarre sur les chapeaux de roues, avec un exposé sur le plugin Grails pour <a
href="http://www.jboss.org/infinispan" title="Infinispan" >Infinispan</a>, la grille de données estampillée JBoss. Thomas Fuller nous présente des cas d&#8217;utilisation qui peuvent pousser à se servir d&#8217;une datagrid et quels gains on peut en retirer. Puis il fait le tour du <a
href="http://www.grails.org/plugin/infinispan" title="plugin Grails" >plugin Grails</a> pour s&#8217;interfacer avec Infinispan. Les exemples de code donnés sont d&#8217;une simplicité à toute épreuve, l&#8217;architecture de plugin de Grails est exploité à fond pour le confort du développeur.</p><p>Bien évidemment, ce n&#8217;est pas n&#8217;importe quel projet qui peut avoir besoin d&#8217;une datagrid, mais il est bon de savoir que des plugins existent déjà et sont utilisés et maintenus. Je regrette un peu trop de temps passé sur la première partie et la justification de l&#8217;utilité d&#8217;Infinispan. Le sujet était intéressant et j&#8217;aurais aimé voir plus de code que le strict minimum.</p><h3><a
name="GroovyPerformanceImprovements"></a>Groovy 1.8 Performance Improvements</h3><p>Ensuite, Jochen Theodorou, alias Blackdrag vient nous parler des optimisations de performances apportées par la version 1.8 de Groovy. Il semble que les gens de chez SpringSource en ai assez de se faire ridiculiser dans les micro benchmarks qu&#8217;on peut trouver sur le net. Ils ont donc placé leur effort sur la satisfaction des fétichistes du micro-bench.</p><p>Le plupart des micro-bench Groovy contre Java qu&#8217;on peut trouver sont basés sur des calculs arithmétiques, comme le célèbre calcul de la suite de Fibonacci. Mais Groovy est un langage dynamique, par conséquent, toutes les opérations mathématiques sont en fait des appels de fonction, ce qui fait l&#8217;impasse sur les capacités de la JVM en calcul sur primitives. Les améliorations de performances de la 1.8 sont restreintes aux calculs sur entier et sont encore assez fragiles. Vous n&#8217;en profiterez que si vous travaillez sur des entiers sans mélanger les types d&#8217;opérations. Si vous lancer un a = b <u> c </u> d, vous êtes dans la zone verte. Si vous lancez a = b + c &#8211; d, vous êtes dans la zone rouge.</p><p>Pour les prochaines versions de Groovy, Springsource mettra l&#8217;accent sur la stabilisation et la généralisation de ces améliorations. A plus long terme, il est prévu de s&#8217;appuyer sur le InvokeDynamic fourni par le JDK7.</p><p>Les 2 conseils à retenir :</p><ul><li>Pour du calcul mathématique, préférez le Java pur</li><li>Ne faites pas de micro benchmarks, préférez le prototypage d&#8217;application. Il est important de mettre tous les facteurs dans la balance : Confort et rapidité de développment, expérience développeur, statisfaction sur le produit fini.</li></ul><h3><a
name="GORMOptimisations"></a>GORM Optimisations</h3><p><a
href="https://twitter.com/#!/burtbeckwith" title="Burt Beckwith" >Burt Beckwith</a> est venu nous parlé des différentes techniques pour optimiser GORM. Il est également auteur des billets &laquo;&nbsp;<a
href="http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/" title="GORM Gotchas" >GORM Gotchas</a>&nbsp;&raquo; sur le blog de Springsource, à lire absolument pour éviter certains pièges.</p><p>Parmi les techniques intéressantes je retiens :</p><ul><li>L&#8217;utilisation de classes de domaine avec mapping fin pour pointer sur des vues en base.</li><li>D&#8217;une façon générale, il ne faut pas hésiter à utiliser des classes de domaines contenant en attribut un sous-ensemble des colonnes de la table requêtée. De cette façon, on s&#8217;assure de ne remonter ou de mettre à jour que les données utiles.</li><li>Définir finement ses mappings dans les classes de domaines permet de customiser au mieux le schéma de la base de données.</li></ul><p>De nombreux exemples de cas d&#8217;application ont été passés en revue. Une session très intéressante.</p><h3><a
name="GrailsWebflow"></a>Grails Webflow</h3><p>Pour clore la matinée, Ivo Houbrechts nous a parlé du plugin Grails WebFlow. Il a commencé par une petite démonstration (avec Grails 1.4 SNAPSHOT, derniers commit de la veille au soir). Comme son nom l&#8217;indique, ce plugin intègre Spring WebFlow à Grails. Il permet notamment d&#8217;obtenir sans effort :</p><ul><li>un flow de formulaire, ce qui encourage le découpage en formulaires simples plutôt qu&#8217;un unique formulaire énorme.</li><li>un fil d&#8217;ariane des étapes déjà effectuée, très pratique.</li><li>la gestion de la double soumission en cas d&#8217;utilisation du bouton &#8216;Back&#8217; du navigateur</li></ul><p>Quelques limitations par rapport à Spring WebFlow :</p><ul><li>l&#8217;héritage de flow n&#8217;est pas supporté</li><li>les transisition globales non plus</li></ul><p>La DSL de configuration est simple au départ mais peu vite devenir illisible si vous tentez des flow complexes (surtout si vous passez beaucoup de closures en paramètre). Restez autant que possible dans des cas flow simples pour éviter cela.</p><h3><a
name="GrailsandNeoJ"></a>Grails and Neo4J</h3><p>La dernière session que j&#8217;ai pu suivre a eu pour sujet le plugin Neo4J pour Grails. <a
href="https://twitter.com/#!/darthvader42" title="Stefan Armbruster" >Stefan Armbruster</a> a commencé par nous rappeler les bénéfices du paysage NoSQL parmi les options de stockage de données. Puis nous a expliqué de quelle façon GORM appliquait le mapping des classes de domaines à une base de données orientée graphes.</p><p>Le gros avantage de ce plugin est de s&#8217;intégrer de façon transparente avec GORM, ce qui ne rajoute aucune complexité et permet même de tester les résultats d&#8217;un remplacement de votre base par Neo4J sans effort. Pour les enthousiastes, faites bien attention à la <a
href="http://neo4j.org/licensing-guide/" title="licence de Neo4J" >licence de Neo4J</a> avant de la faire adopter chez vous.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>J&#8217;ai ensuite dû courir à l&#8217;aéroport pour rentrer au pays, en ratant les 2 dernières sessions de la journée. Ces deux journées ont été très riches en enseignement technique mais aussi humain. C&#8217;était pour moi une première immersion dans la communauté Groovy et j&#8217;en suis revenu convaincu par le langage, les librairies, les outils et la communauté. Il me paraît opportun de conclure en citant les &laquo;&nbsp;idées GR8Conf à emporter&nbsp;&raquo; (&laquo;&nbsp;GR8conf takeaway&nbsp;&raquo;), twittées par <a
href="https://twitter.com/#!/mittie" title="Dierk Knig" >Dierk König</a> le dernier jour :</p><ul><li>Groovy est une place d&#8217;innovation</li><li>L&#8217;outillage Groovy est mature et activement maintenu par des équipes compétentes</li><li>Groovy est mainstream, avec un nombre de téléchargement comparable à Spring</li><li>La communauté Groovy est accueillante</li><li>La communauté Groovy a une attitude orientée &laquo;&nbsp;Getting things done&nbsp;&raquo; (prouvée par le Hackgarten)</li></ul><p>Je ne peux que tomber d&#8217;accord. Un grand merci aux courageux qui ont lu jusqu&#8217;à la fin. Groovy rocks ! <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><ul><li>Dernière minute : les slides de toutes les conférences sont maintenant <a
href="http://www.slideshare.net/gr8conf/slideshows" title="disponibles sur SlideShare" >disponibles sur SlideShare</a>.</li></ul><div
class="shr-publisher-7900"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F30%2Frapport-sur-la-conference-groovy-europeenne-la-gr8conf%2F' data-shr_title='Rapport+sur+LA+conf%C3%A9rence+Groovy+europ%C3%A9enne+%3A+la+GR8Conf'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F30%2Frapport-sur-la-conference-groovy-europeenne-la-gr8conf%2F' data-shr_title='Rapport+sur+LA+conf%C3%A9rence+Groovy+europ%C3%A9enne+%3A+la+GR8Conf'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/30/rapport-sur-la-conference-groovy-europeenne-la-gr8conf/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Xebia à Epita le 24 Mai</title><link>http://blog.xebia.fr/2011/05/23/xebia-a-epita-le-24-mai/</link> <comments>http://blog.xebia.fr/2011/05/23/xebia-a-epita-le-24-mai/#comments</comments> <pubDate>Mon, 23 May 2011 09:51:40 +0000</pubDate> <dc:creator>Nicolas Jozwiak</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Publications]]></category> <category><![CDATA[Tests]]></category> <category><![CDATA[Dette technique]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7796</guid> <description><![CDATA[Comme chaque année, l’école Epita organise une semaine de conférences technologiques. Cette année la 23ème édition se déroulera du 23 au 27 Mai. Ce sera l’occasion pour les étudiants de découvrir les métiers de l’informatique et de bénéficier de retours d’expériences de professionnels. C’est à ce titre que j’interviendrai le Mardi 24 Mai lors d’une [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/epita.png" alt="epita" title="epita" width="200" height="119" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Comme chaque année, l’école <a
href="http://www.epita.fr/" title="Epita" >Epita</a> organise une semaine de conférences technologiques. Cette année la 23ème édition se déroulera du 23 au 27 Mai. Ce sera l’occasion pour les étudiants de découvrir les métiers de l’informatique et de bénéficier de retours d’expériences de professionnels.</p><p>C’est à ce titre que j’interviendrai le Mardi 24 Mai lors d’une présentation sur la dette technique. Le but sera de sensibiliser les futurs diplômés aux conséquences d’une dette non gérée sur les projets logiciels. Nous étudierons notamment les mécanismes de la dette et des bonnes pratiques pour la résorber.</p><div
class="shr-publisher-7796"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F23%2Fxebia-a-epita-le-24-mai%2F' data-shr_title='Xebia+%C3%A0+Epita+le+24+Mai'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F23%2Fxebia-a-epita-le-24-mai%2F' data-shr_title='Xebia+%C3%A0+Epita+le+24+Mai'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/23/xebia-a-epita-le-24-mai/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Les moteurs de recherche au Bordeaux JUG</title><link>http://blog.xebia.fr/2011/05/18/les-moteurs-de-recherche-au-bordeaux-jug/</link> <comments>http://blog.xebia.fr/2011/05/18/les-moteurs-de-recherche-au-bordeaux-jug/#comments</comments> <pubDate>Wed, 18 May 2011 11:30:14 +0000</pubDate> <dc:creator>Michaël Figuière</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Bordeaux JUG]]></category> <category><![CDATA[Lucene]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7774</guid> <description><![CDATA[Le projet Lucene a été fondé il y a une dizaine d&#8217;années maintenant, pourtant son potentiel n&#8217;est pas toujours pleinement perçu. Souhaitant montrer ce qu&#8217;il est possible de réaliser avec ce framework, je ferai une présentation jeudi 19 mai à 19h au Bordeaux JUG titrée &#171;&#160;Les moteurs de recherche pour l&#8217;entreprise&#160;&#187;. Le but est d&#8217;y [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/bordeauxjug-logo-small.jpg" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Le projet <a
href="http://lucene.apache.org/" title="Lucene" >Lucene</a> a été fondé il y a une dizaine d&#8217;années maintenant, pourtant son potentiel n&#8217;est pas toujours pleinement perçu.</p><p>Souhaitant montrer ce qu&#8217;il est possible de réaliser avec ce <em>framework</em>, je ferai une présentation <strong>jeudi 19 mai à 19h</strong> au <a
href="http://www.bordeauxjug.org/" title="Bordeaux JUG" >Bordeaux JUG</a> titrée <em>&laquo;&nbsp;Les moteurs de recherche pour l&#8217;entreprise&nbsp;&raquo;</em>.</p><p>Le but est d&#8217;y présenter quelques concepts théoriques suivi d&#8217;un tour d&#8217;horizon des possibilités offertes par Lucene et des indexes de recherche en général : gestion des fautes de frappe, moteurs de recherche conscients du métier, pondération statique et dynamique des résultats, <em>faceted search</em>, ou encore obtention des documents similaires. Le propos sera ensuite élargi vers les solutions disponibles pour mettre en oeuvre Lucene dans un environnement distribué : <a
href="http://lucene.apache.org/solr/" title="Solr" >Solr</a>, <a
href="http://www.elasticsearch.org/" title="ElasticSearch" >ElasticSearch</a>, <a
href="http://www.hibernate.org/subprojects/search.html" title="Hibernate Search" >Hibernate Search</a>, &#8230;</p><p>Des <a
href="http://www.jugevents.org/jugevents/event/registration.form?event.id=38155" title="places sont encore disponibles" >places sont encore disponibles</a>, donc si vous êtes dans la région de Bordeaux ce jeudi, n&#8217;hésitez pas à nous rejoindre !</p><div
align="center"> <a
href="http://twitter.com/mfiguiere" ><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png"  title="Twitter Michaël Figuière" border="0" /><br
/> </a></div><div
class="shr-publisher-7774"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F18%2Fles-moteurs-de-recherche-au-bordeaux-jug%2F' data-shr_title='Les+moteurs+de+recherche+au+Bordeaux+JUG'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F18%2Fles-moteurs-de-recherche-au-bordeaux-jug%2F' data-shr_title='Les+moteurs+de+recherche+au+Bordeaux+JUG'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/18/les-moteurs-de-recherche-au-bordeaux-jug/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Réponses au Quizz Licences Open Source</title><link>http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/</link> <comments>http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#comments</comments> <pubDate>Mon, 16 May 2011 15:42:42 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Open Source]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7723</guid> <description><![CDATA[A l&#8217;occasion de la rétrospective de notre XKE de Mai (notre journée mensuelle de partage de la connaissance), nous vous avions proposé un Quizz sur les licences Open Source. Merci à Noël Rocher (Red Hat / Jboss) pour l&#8217;éclairage officiel sur RHEL, à Bertrand Dechoux pour ses investigations sur iText, à Steve Klouvi pour les [...]]]></description> <content:encoded><![CDATA[<p>A l&#8217;occasion de la rétrospective de notre XKE de Mai <em>(notre journée mensuelle de partage de la connaissance)</em>, nous vous avions proposé un <a
href="http://blog.xebia.fr/2011/05/09/retrospective-de-notre-xke-de-mai/#QuizzlicencesOpenSource" title="Quizz sur les licences Open Source" >Quizz sur les licences Open Source</a>. Merci à Noël Rocher <em>(Red Hat / Jboss)</em> pour l&#8217;éclairage officiel sur RHEL, à Bertrand Dechoux pour ses investigations sur iText, à Steve Klouvi pour les licences Linux, gcc autre posix. Voici les réponses !</p><ul><li><a
href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#Commentdesditeurscommerciauxpe">Réponse 1</a> : Comment des éditeurs commerciaux peuvent-ils distribuer des programmes «&nbsp;close source&nbsp;» pour Linux alors que Linux utilise la licence «&nbsp;business unfriendly&nbsp;» GPL qui est censée être «&nbsp;contaminante&nbsp;»&nbsp;?</li><li><a
href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#Commentahrefhttpfrwikipediaorg">Réponse 2</a> : Comment <a
href="http://fr.wikipedia.org/wiki/CentOS" title="CentOS" >CentOS</a> peut-il distribuer gratuitement une version de Linux qui reprend quasiment toute la distribution payante <a
href="http://fr.wikipedia.org/wiki/Red_Hat_Enterprise_Linux" title="Red Hat Enterprise Linux" >Red Hat Enterprise Linux</a>&nbsp;?</li><li><a
href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#Pourquoiaijeledroitdedistribue">Réponse 3</a> : Pourquoi ai-je le droit de distribuer un logiciel «&nbsp;close source&nbsp;» qui embarque une JVM OpenJDK alors que celle-ci utilise la licence «&nbsp;contaminante&nbsp;» dérivée de la GPL&nbsp;? Ai-je ce droit sur toutes les plateformes&nbsp;? Y compris sur les terminaux mobiles&nbsp;?</li><li><a
href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#LahrefhttpfrwikipediaorgwikiAf">Réponse 4</a> : L&#8217;<a
href="http://fr.wikipedia.org/wiki/Affero_General_Public_License" title="Affero General Public License" >Affero General Public License</a> (aka Affero GPL) étend la notion de distribution de la licence GPL à la distribution sur le réseau. Quel est l’impact sur des sites web accessibles sur Internet&nbsp;? Citer une librairie Java très connue licenciée sous AGPL&nbsp;? Utilisez-vous iText&nbsp;?</li></ul><h4><a
name="Commentdesditeurscommerciauxpe"></a>Comment des éditeurs commerciaux peuvent-ils distribuer des programmes «&nbsp;close source&nbsp;» pour Linux alors que Linux utilise la licence «&nbsp;business unfriendly&nbsp;» GPL qui est censée être «&nbsp;contaminante&nbsp;»&nbsp;?</h4><p>L&#8217;essentiel du code source de Linux est distribué sous la licence <em>business unfriendly</em> <a
href="http://en.wikipedia.org/wiki/GNU_General_Public_License" title="GPL" >GPL</a> qui est contaminante et requiert donc que le code qui lui est <em>linké</em> soit distribué sous une licence compatible GPL avec le code source disponible.</p><p>Cependant, pour s&#8217;exécuter sur Linux, un programme n&#8217;a pas besoin d&#8217;être compilé et/ou <em>linké</em> à ce code <em>contaminant</em> ; il lui suffit d&#8217;être compilé et linké sur les API <a
href="http://en.wikipedia.org/wiki/POSIX" title="POSIX / "Portable Operating System Interface for Unix"" >POSIX / &laquo;&nbsp;Portable Operating System Interface for Unix&nbsp;&raquo;</a> (e.g. <a
href="http://www.opensource.apple.com/source/file_cmds/file_cmds-45/pax/cpio.h" title="cpio.h" >cpio.h</a>) qui ont une licence non contaminante <a
href="http://en.wikipedia.org/wiki/BSD_licenses" title="BSD" >BSD</a> (en plus de licences LGPL et GPL) ou sur des librairies aux licences non contaminantes comme <a
href="http://en.wikipedia.org/wiki/GNU_C_Library" title="glibc" >glibc</a> (licence <a
href="http://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License" title="LGPL" >LGPL</a>). Quant au compilateur <a
href="http://en.wikipedia.org/wiki/GCC" title="GCC" >GCC</a>, il ne contamine pas non plus avec sa <a
href="http://www.gnu.org/licenses/gcc-exception.html" title="GCC Runtime Library Exception" >GCC Runtime Library Exception</a>.</p><h4><a
name="Commentahrefhttpfrwikipediaorg"></a>Comment CentOS peut-il distribuer gratuitement une version de Linux qui reprend quasiment toute la distribution payante Red Hat Enterprise Linux&nbsp;?</h4><p>Comme Noel Rocher (Red Hat / JBoss) nous l&#8217;a expliqué, Red Hat tient à disposition de ses clients RHEL le code source de l&#8217;OS ; c&#8217;est conforme à la licence GPL de Linux. En revanche, les logos et les termes Red Hat, RHEL, etc sont sous copyright Red Hat.</p><p>Il suffit aux membres du projet CentOS d&#8217;acheter une licence RHEL, de demander le source et de faire disparaitre les logos et termes copyrightés (RHEL, Red Hat, etc) pour constituer une version qu&#8217;ils ont le droit de distribuer gratuitement.</p><p>Il est donc possible d&#8217;obtenir une quasi-RHEL gratuitement mais on perd alors le support et les services que Red Hat propose à ses clients.</p><h4><a
name="Pourquoiaijeledroitdedistribue"></a>Pourquoi ai-je le droit de distribuer un logiciel «&nbsp;close source&nbsp;» qui embarque une JVM OpenJDK alors que celle-ci utilise la licence «&nbsp;contaminante&nbsp;» dérivée de la GPL&nbsp;? Ai-je ce droit sur toutes les plateformes&nbsp;? Y compris sur les terminaux mobiles&nbsp;?</h4><p>La JVM OpenJDK est disponible sous <a
href="http://openjdk.java.net/legal/gplv2+ce.html" title="GNU General Public License version 2 with the Classpath Exception" >GNU General Public License, version 2, with the Classpath Exception</a>. Le <strong>classpath exception</strong> protège le code qui s&#8217;exécute sur la JVM de la contamination habituelle des licences GPL. Une application peut donc être livrée avec une JVM OpenJDK sans être contaminée et donc sans devoir rendre son code source disponible sous licence compatible GPL.</p><p>Cela ressemble presque plus à une licence LGPL qu&#8217;à une licence GPL.</p><p>Pour ce qui est du monde mobile, Oracle (à l&#8217;époque Sun) n&#8217;a pas posé de <strong>classpath exception</strong> à la JVM ME (aka Mobile Edition). De ce fait, une application qui embarque une JVM ME open source d&#8217;Oracle est contaminée et doit proposer son code source sous licence compatible GPL. Cette disposition a incité les fabricants de téléphones mobiles et systèmes embarqués qui utilisaient Java ME à continuer à utiliser des JVM ME commerciale.</p><p>En revanche, rien n&#8217;interdit de bénéficier de la <strong>classpath exception</strong> en utilisant un Open JDK sur téléphone mobile ou tout autre <em><a
href="http://en.wikipedia.org/wiki/Embedded_device" title="embedded device" >embedded device</a></em>. Le <a
href="http://openjdk.java.net/projects/zero/" title="OpenJDK  Zero  Assembler Project" >OpenJDK : Zero &#8211; Assembler Project</a> travaille justement à porter OpenJDK sur les processeurs ARM qui sont communément utilisés dans les smartphones.</p><h4><a
name="LahrefhttpfrwikipediaorgwikiAf"></a>L&#8217;Affero General Public License (aka Affero GPL) étend la notion de distribution de la licence GPL à la distribution sur le réseau. Quel est l’impact sur des sites web accessibles sur Internet&nbsp;? Citer une librairie Java très connue licenciée sous AGPL&nbsp;? Utilisez-vous iText&nbsp;?</h4><p>L’<a
href="http://en.wikipedia.org/wiki/Affero_General_Public_License" title="Affero General Public License" >Affero General Public License</a> a été introduite en complément de la GPL pour <em>combler l&#8217;oubli des</em> <em><a
href="http://en.wikipedia.org/wiki/Application_service_provider" title="Application Service Providers" >Application Service Providers</a></em>.</p><p>Cette licence stipule que la distribution ne se limite pas à la forme de binaires comme le définit la licence GPL mais concerne aussi la fourniture en mode service de ce logiciel au travers d&#8217;un réseau.</p><p>De ce fait, exposer un logiciel à des clients sous forme de services web relève d&#8217;une distribution aux yeux de l&#8217;Affero GPL. Par conséquent, une application web visible sur internet qui embarque une librairie Affero GPL est contaminée et doit rendre <strong>tout</strong> son code source disponible sous licence compatible AGPL !</p><p>Avis aux utilisateurs d&#8217;<a
href="http://www.itextpdf.com/" title="iText" >iText</a> : la librairie est passée en <em>dual licensing</em> Affero GPL / commercial depuis la <a
href="http://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.0.6" title="version 5" >version 5</a>. Si vous voulez continuer à bénéficier de la <em>business friendly</em> <a
href="http://en.wikipedia.org/wiki/Mozilla_Public_License" title="Mozilla Public License" >Mozilla Public License</a>, il faut rester sur la version <a
href="http://mvnrepository.com/artifact/com.lowagie/itext/2.1.7" title="217" >2.1.7</a> d&#8217;iText (merci à Bertrand Dechoux pour l&#8217;historique).</p><div
class="shr-publisher-7723"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F16%2Freponses-au-quizz-licences-open-source%2F' data-shr_title='R%C3%A9ponses+au+Quizz+Licences+Open+Source'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F16%2Freponses-au-quizz-licences-open-source%2F' data-shr_title='R%C3%A9ponses+au+Quizz+Licences+Open+Source'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Xebia sera à la GR8Conf</title><link>http://blog.xebia.fr/2011/05/13/xebia-sera-a-la-gr8conf/</link> <comments>http://blog.xebia.fr/2011/05/13/xebia-sera-a-la-gr8conf/#comments</comments> <pubDate>Fri, 13 May 2011 09:06:34 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Conference]]></category> <category><![CDATA[Gaelyk]]></category> <category><![CDATA[GPars]]></category> <category><![CDATA[GR8Conf]]></category> <category><![CDATA[Gradle]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Griffon]]></category> <category><![CDATA[Groovy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7704</guid> <description><![CDATA[Du 17 au 19 mai se tiendra à Copenhague la grand-messe des technologies Groovy en Europe : la GR8Conf. Xebia France y sera pour couvrir l&#8217;évènement. Parmi les sujets abordés : Groovy : à tout seigneur, tout honneur Grails : et notamment son adoption en entreprise Gradle : l&#8217;outil de build qui monte Gaelyk : [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/gr8conf_logo.jpg" alt="gr8conf_logo" title="gr8conf_logo" width="130" style="margin: 1em 1em 1em 1em; float: right;"/></p><p>Du 17 au 19 mai se tiendra à Copenhague la grand-messe des technologies Groovy en Europe : la <a
href="http://www.eu2011.gr8conf.org/">GR8Conf</a>. Xebia France y sera pour couvrir l&#8217;évènement.</p><p>Parmi les sujets abordés :</p><ul><li>Groovy : à tout seigneur, tout honneur</li><li>Grails : et notamment son adoption en entreprise</li><li>Gradle : l&#8217;outil de build qui monte</li><li>Gaelyk : la boite à outil Groovy pour Google AppEngine</li><li>Griffon : le framework inspiré de Grails pour les applications de bureau</li><li>GPars : la librairie Groovy orientée concurrence, Actors, fork-join, etc</li></ul><p>De nombreux speakers seront présents, notamment Guillaume Laforge, Burt Beckwith, Dierk König, et bien d&#8217;autres. Comme toujours dans ces grosses conférences, il faudra choisir entre des sessions en parallèle, mais nous essaierons de vous informer sur les plus intéressantes, pour dresser l&#8217;état de l&#8217;art et le futur des technologies Groovy en 2011.</p><p>Les 3 jours de conférence se découpent en :</p><ul><li>une journée &laquo;&nbsp;University&nbsp;&raquo;, où les participants pourront réviser les bases du Groovy, de Grails et coder comme des fous au <a
href="http://www.eu2011.gr8conf.org/talk/hackergarten" title="HackerGarten" >HackerGarten</a>.</li><li>2 jours de conférence plus &laquo;&nbsp;classique&nbsp;&raquo; avec différents acteurs du monde Groovy</li></ul><p>Vous trouverez le <a
href="http://www.eu2011.gr8conf.org/agenda/list" title="programme complet ici" >programme complet ici</a>.</p><div
style="text-align:center"> <a
href="https://twitter.com/#!/aurelienmaury"><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/twitter4.png" border="0" alt="Suivez moi sur Twitter" /><br
/> </a></div><div
class="shr-publisher-7704"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F13%2Fxebia-sera-a-la-gr8conf%2F' data-shr_title='Xebia+sera+%C3%A0+la+GR8Conf'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F13%2Fxebia-sera-a-la-gr8conf%2F' data-shr_title='Xebia+sera+%C3%A0+la+GR8Conf'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/13/xebia-sera-a-la-gr8conf/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Rétrospective de notre XKE de Mai</title><link>http://blog.xebia.fr/2011/05/09/retrospective-de-notre-xke-de-mai/</link> <comments>http://blog.xebia.fr/2011/05/09/retrospective-de-notre-xke-de-mai/#comments</comments> <pubDate>Mon, 09 May 2011 07:56:20 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Flex 4]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[JMS]]></category> <category><![CDATA[Mule ESB]]></category> <category><![CDATA[nexTep]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7672</guid> <description><![CDATA[Comme chaque premier jeudi du mois, les consultants Xebia se sont réunis en fin de semaine dernière pour le XKE (Xebia Knowledge Exchange). La journée a commencé par un jeu intitulé « Questions pour un Xebian » organisé par Cyrille Le Clerc et Jean-Laurent de Morlhon où il a été question de reconnaître ce que [...]]]></description> <content:encoded><![CDATA[<p>Comme chaque premier jeudi du mois, les consultants Xebia se sont réunis en fin de semaine dernière pour le <a
href="http://blog.xebia.fr/tag/xke/" title="XKE (Xebia Knowledge Exchange)" >XKE (Xebia Knowledge Exchange)</a>.</p><p>La journée a commencé par un jeu intitulé « Questions pour un Xebian » organisé par <a
href="http://blog.xebia.fr/author/cleclerc/" title="Cyrille Le Clerc" >Cyrille Le Clerc</a> et <a
href="http://blog.xebia.fr/author/cleclerc/" title="JeanLaurent de Morlhon" >Jean-Laurent de Morlhon</a> où il a été question de reconnaître ce que cachent plusieurs noms de technologies en vogue <em>(sass, haml, hateoas, etc)</em>.</p><p>Nous avons ensuite poursuivi avec deux sessions en parallèle :</p><ul><li><strong>Algorithme Min / Max et Tournoi de Puissance 4</strong>, animé par Morgan Renou<br
/> L&#8217;objectif de cette session était de présenter l&#8217;algorithme <a
href="http://fr.wikipedia.org/wiki/Algorithme_minimax" title="MiniMax" >MiniMax</a> avec un élagage Alpha-Béta afin de développer de petites intelligences  artificielles s&#8217;affrontant dans un tournoi puissance 4.</li><li><strong>Mule ESB</strong>, animé par <a
href="http://twitter.com/#!/jlrigau" title="JeanLouis Rigau" >Jean-Louis Rigau</a><br
/> Après avoir expliqué les principes fondamentaux de Mule ESB, cette session a permis de détailler, étape par étape, la mise en place d&#8217;une boutique en ligne, axée sur les traitements back-office.</li></ul><p>Après le déjeuner, deux nouvelles sessions en parallèle :</p><ul><li><strong>Hands On JMS</strong>, animé par <a
href="http://blog.xebia.fr/author/garnaud/" title="Guillaume Arnaud" >Guillaume Arnaud</a><br
/> Après une présentation des concepts importants de l&#8217;API JMS, nous avons vu sa mise en place (connexion à un broker, émission et réception de messages sur des queues et topics durables / non durables).</li><li><strong>nexTep Designer</strong>, animé par <a
href="http://www.nextep-softwares.fr/" title="nexTep" >nexTep</a><br
/> Cette session a permis de présenter l&#8217;environnement de développement nexTep Designer.</li></ul><p>Pour clore la journée, une nouvelle fois deux sessions en parallèles :</p><ul><li><strong>Grails from Scratch</strong>, animé par <a
href="http://blog.xebia.fr/author/amaury/" title="Aurlien Maury" >Aurélien Maury</a><br
/> Le framework Grails fut présenté dans ses grandes lignes (origines, concepts et fonctionnement) avant de poursuivre sur la réalisation d&#8217;un mini plugin Grails en Hands-On pour afficher les derniers tweets d&#8217;une recherche via une taglib.</li><li><strong>Flex 4</strong>, animé par <a
href="http://blog.xebia.fr/author/edijoux/" title="Ellne Dijoux" >Ellène Dijoux</a><br
/> Après une présentation de Flex 4, nous avons réalisé une application de gestion des tâches. Le but était de faire le tour des nouveautés avec la librairie Spark, l&#8217;utilisation du skinning (habillage des composants) et la gestion des évènements et manipulation du XML. Le slot était accessible à tous et a permis d&#8217;introduire les notions de base que l&#8217;on peut retrouver dans Flex.</li></ul><h3><a
name="QuizzlicencesOpenSource"></a>Quizz &laquo;&nbsp;licences Open Source&nbsp;&raquo;</h3><p>Cette journée fut aussi l&#8217;occasion d&#8217;un tour d&#8217;horizon des licences Open Source (business friendly, business unfriendly, contaminantes, virales, etc) présenté par <a
href="http://blog.xebia.fr/author/cleclerc/" title="Cyrille Le Clerc" >Cyrille Le Clerc</a>. Nous vous proposons les points amusants sous forme de jeu :</p><ul><li>Comment des éditeurs commerciaux peuvent-ils distribuer des programmes &laquo;&nbsp;close source&nbsp;&raquo; pour Linux alors que Linux utilise la licence &laquo;&nbsp;business unfriendly&nbsp;&raquo; GPL qui est censée être &laquo;&nbsp;contaminante&nbsp;&raquo; ?</li><li>Comment <a
href="http://fr.wikipedia.org/wiki/CentOS" title="CentOS" >CentOS</a> peut-il distribuer gratuitement une version de Linux qui reprend quasiment toute la distribution payante <a
href="http://fr.wikipedia.org/wiki/Red_Hat_Enterprise_Linux" title="Red Hat Enterprise Linux" >Red Hat Enterprise Linux</a> ?</li><li>Pourquoi ai-je le droit de distribuer un logiciel &laquo;&nbsp;close source&nbsp;&raquo; qui embarque une JVM OpenJDK alors que celle-ci utilise la licence &laquo;&nbsp;contaminante&nbsp;&raquo; dérivée le la GPL ? Ai-je ce droit sur toutes les plateformes ? Y compris sur les treminaux mobiles ?</li><li>L&#8217;<a
href="http://fr.wikipedia.org/wiki/Affero_General_Public_License" title="Affero Ceneral Public License" >Affero Ceneral Public License</a> (aka Affero GPL) étend la notion de distribution de la licence GPL à la distribution sur le réseau. Quel est l&#8217;impact sur des sites web accessibles sur Internet ? Citer une librairie Java très connue licensiée sous AGPL ? Utilisez-vous iText ?</li></ul><p>Si ces questions suscitent votre curiosité, n&#8217;hésitez pas à répondre sous forme de commentaires dans ce billet. Nous publierons nos réponses d&#8217;ici la fin de la semaine <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><div
class="shr-publisher-7672"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F09%2Fretrospective-de-notre-xke-de-mai%2F' data-shr_title='R%C3%A9trospective+de+notre+XKE+de+Mai'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F09%2Fretrospective-de-notre-xke-de-mai%2F' data-shr_title='R%C3%A9trospective+de+notre+XKE+de+Mai'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/09/retrospective-de-notre-xke-de-mai/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Grails Tips : la validation sur mesure</title><link>http://blog.xebia.fr/2011/04/28/grails-tips-la-validation-sur-mesure/</link> <comments>http://blog.xebia.fr/2011/04/28/grails-tips-la-validation-sur-mesure/#comments</comments> <pubDate>Thu, 28 Apr 2011 08:01:36 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7568</guid> <description><![CDATA[Le mécanisme de validation de Grails est basé sur l&#8217;API Spring Validator. Il existe dans Grails un ensemble de validateurs permettant de couvrir la plupart des besoins simples, tels que champs obligatoires, taille mini/maxi, valeurs min/max pour les nombres, etc. Cependant, il arrive souvent d&#8217;avoir besoin de validateurs sur mesure, plus adaptés au métier de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/02/Grails_Logo_180x176.png" width="100" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Le mécanisme de validation de Grails est basé sur l&#8217;API Spring Validator. Il existe dans Grails un ensemble de validateurs permettant de couvrir la plupart des besoins simples, tels que champs obligatoires, taille mini/maxi, valeurs min/max pour les nombres, etc. Cependant, il arrive souvent d&#8217;avoir besoin de validateurs sur mesure, plus adaptés au métier de l&#8217;application. Aujourd&#8217;hui nous allons voir les différentes méthodes de validation avancées des classes du domaine qui s&#8217;offrent aux utilisateurs de ce framework web magique :</p><ul><li>Retour sur la contrainte <code>validator</code></li><li>Faire une contrainte réutilisable</li><li>Le plugin <em>Constraints</em></li></ul><p>Suivez le guide&#8230;</p><h3><a
name="Validationsurmesure"></a>Validation sur mesure</h3><p>Il existe 16 contraintes applicables sur les attributs des classes de domaine dans une application Grails. Ces contraintes permettent de s&#8217;assurer de la validité du contenu de nos entités avant de les envoyer en base. Elles vont de la vérification de la nullité, de la taille d&#8217;une chaîne, à la correspondance à une expression régulière, et j&#8217;en passe.</p><p>Mais parfois, il est indispensable de valider nos attributs en fonction de critères plus fins, ou liés à des logiques métiers complexes. C&#8217;est alors que la 17ème contrainte livrée avec Grails peut servir : <code>validator</code>.</p><p>Grâce à cette contrainte, on peut glisser une closure qui sera exécutée lors de la validation de l&#8217;entité. Voici la <a
href="http://grails.org/doc/1.3.7/ref/Constraints/validator.html" title="page de la documentation officielle" >page de la documentation officielle</a> qui détaille son utilisation. Pour ceux qui n&#8217;ont pas le temps d&#8217;aller lire la documentation voilà un exemple assez parlant :</p><pre class="brush: java; title: ; notranslate">
class User {
  String login
  String autreChamp
  static constraints = {
    login(validator: { val, obj -&gt;
      return (val.length != 0 &amp;&amp; obj.properties['autreChamp'] != 'magicString')
    })
  }
}
</pre><p>Dans cet exemple, si la contrainte n&#8217;est pas respectée, alors le message d&#8217;erreur associé sera, par convention : <code>user.login.validator.invalid</code>.</p><p>Ce mécanisme est très pratique et flexible, mais oblige à dupliquer du code si on souhaite utiliser la même contrainte complexe sur plusieurs classes de domaine. Poussons plus loin l&#8217;investigation.</p><h3><a
name="Fairemieuxlamain"></a>Faire mieux, à la main</h3><p>Il est possible d&#8217;écrire ses propres classes de contrainte et de les réutiliser plusieurs fois. <a
href="http://blog.swwomm.com/2011/02/custom-grails-constraints.html" title="Cet article" >Cet article</a> décrit très bien la méthode à suivre. Je vais vous en tracer les grandes lignes ici, en français dans le texte.</p><p>Pour écrire un validateur réutilisable, il suffit d&#8217;étendre la classe <code>AbstractConstraint</code> et d&#8217;implémenter la méthode <code>processValidate</code>. En voici un exemple :</p><pre class="brush: java; title: ; notranslate">
package myapp
import org.codehaus.groovy.grails.validation.AbstractConstraint
import org.springframework.validation.Errors
class LowerCaseConstraint extends AbstractConstraint {
// nom à utiliser dans les classes de domaine
    static NAME = 'lowerCase'
    String getName() {
        NAME
    }
// si le validateur ne s'applique qu'à certaines classes, cette méthode permet de filtrer l'application de la contrainte
    boolean supports(Class type) {
        true
    }
// code de la logique de validation
    protected void processValidate(Object target, Object value, Errors errors) {
        if (constraintParameter &amp;&amp; value =~ /[A-Z]/)
            rejectValue target, errors, &quot;default.invalid.${name}.message&quot;, &quot;${name}.invalid&quot;,
                [constraintPropertyName, constraintOwningClass, value] as Object[]
    }
}
</pre><p>La place idéale dans votre arborescence projet pour cette classe se trouve dans le répertoire <code>src/groovy</code>. Une fois votre classe de contrainte terminée, il faut l&#8217;enregistrer auprès du framework pour que Grails sache où la retrouver. Pour ce faire, ajoutez cette ligne dans votre fichier <code>grails-app/conf/Config.groovy</code> :</p><pre class="brush: java; title: ; notranslate">
org.codehaus.groovy.grails.validation.ConstrainedProperty.registerNewConstraint myapp.LowerCaseConstraint.NAME, myapp.LowerCaseConstraint.class
</pre><p>Il ne reste plus qu&#8217;à vous en servir dans vos classes de domaine :</p><pre class="brush: java; title: ; notranslate">
static constraints = {
    myProperty size: 1..20, lowerCase: true
}
</pre><h3><a
name="LepluginexistedjConstraintsPlu"></a>Le plugin existe déjà : Constraints Plugin</h3><p>Mais comme souvent quand on parle de Grails : il y a un plugin pour ça ! Le <a
href="ttp://grails.org/plugin/constraints" title="plugin Constraints" >plugin <em>Constraints</em></a> fourni des scripts pour générer des classes de contraintes réutilisables. En deux lignes de commandes, le tour est joué, installation et création de contrainte :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin constraints
grails create-constraint my.package.ContrainteSurMesure
</pre><p>Dans la classe générée, il ne vous restera plus qu&#8217;à coder une closure de validation, comme on l&#8217;aurait fait dans la première solution. Un grand merci à Geoff Lane qui s&#8217;est donné la peine de coder ce plugin. Il est possible de configurer certains comportements de ce plugin, mais je vous laisse consulter <a
href="https://github.com/geofflane/grails-constraints" title="la documentation" >la documentation</a> pour découvrir dans quelle mesure.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>L&#8217;usage du plugin Constraint est très simple et permet beaucoup de choses. N&#8217;hésitez pas à vous en servir. Je vous encourage également à exploiter au maximum la formidable extensibilité de Grails. Pourquoi ne pas coder vos validateurs dans un nouveau plugin qui s&#8217;appuiera sur le plugin <em>Constraints</em> ? Ainsi vous disposerez  d&#8217;un paquetage de validateur sur mesure, à installer en claquant des doigts dans tout nouveau projet Grails démarrant chez vous.</p><p>What else ? <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><div
class="shr-publisher-7568"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F04%2F28%2Fgrails-tips-la-validation-sur-mesure%2F' data-shr_title='Grails+Tips+%3A+la+validation+sur+mesure'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F04%2F28%2Fgrails-tips-la-validation-sur-mesure%2F' data-shr_title='Grails+Tips+%3A+la+validation+sur+mesure'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/04/28/grails-tips-la-validation-sur-mesure/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Rétrospective de notre XKE d&#8217;avril</title><link>http://blog.xebia.fr/2011/04/08/retrospective-de-notre-xke-d-avril/</link> <comments>http://blog.xebia.fr/2011/04/08/retrospective-de-notre-xke-d-avril/#comments</comments> <pubDate>Fri, 08 Apr 2011 19:27:32 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[cryptographie]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[Flex Mobile]]></category> <category><![CDATA[iOS]]></category> <category><![CDATA[iPhone]]></category> <category><![CDATA[JQuery Mobile]]></category> <category><![CDATA[PKI]]></category> <category><![CDATA[urbanisation]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7392</guid> <description><![CDATA[Comme chaque premier jeudi du mois, les consultants Xebia se sont réunis hier pour le XKE (Xebia Knowledge Exchange). Cette journée fut dédiée au développement mobile. Après un échange sur l&#8217;actualité, 4 groupes se sont formés autour de thèmes forts : Android, animé par Steve Klouvi Iphone, animé par Amin Fathallah Flex Mobile, animé par Julien [...]]]></description> <content:encoded><![CDATA[<p>Comme chaque premier jeudi du mois, les consultants Xebia se sont réunis hier pour le XKE (Xebia Knowledge Exchange).</p><p>Cette journée fut dédiée au développement mobile. Après un échange sur l&#8217;actualité, 4 groupes se sont formés autour de thèmes forts :</p><ul><li><strong>Android</strong>, animé par <a
href="http://blog.xebia.fr/author/sklouvi/">Steve Klouvi</a></li><li><strong>Iphone</strong>, animé par <a
href="http://blog.xebia.fr/author/afathallah/">Amin Fathallah</a></li><li><strong>Flex Mobile</strong>, animé par Julien Buret</li><li><strong>JQuery Mobile</strong>, animé par <a
href="http://blog.xebia.fr/author/akinsella/">Alexis Kinsella</a></li></ul><p>Suite à une brève introduction aux différentes technologies challengées, les xebians ont développé une application mobile en <em>Pair Programming</em> à l&#8217;aide de l&#8217;api JSON du blog de Xebia, proposant des fonctionnalités de listing des auteurs, des categories et des articles, ainsi que des fonctionnalités telles que la recherche. Certaines solutions telles que Windows Phone 7, Palm OS, BlackBerry ou encore BKRender n&#8217;ont pu être défendues lors de cette journée faute de participants pour ces challengers, ce qui n&#8217;est que partie remise.</p><p>Une restitution, suivie d&#8217;un débat a permis aux xebians de faire le point sur les différentes solutions testées, et de mettre en avant les forces et faiblesses de chacune des technologies. </p><p>La journée s&#8217;est achevée sur deux sessions parallèles :</p><ul><li><strong><a
href="http://blog.xebia.fr/2008/04/10/urbanisation-pour-les-nuls/" title="L'urbanisation" >L&#8217;urbanisation</a></strong> présenté par <a
href="http://blog.xebia.fr/author/njozwiak/">Nicolas Jozwiak</a>.</li><li><strong>Les bases de la cryptographie et des infrastructures à clés publiques</strong> présenté par <a
href="http://blog.xebia.fr/author/dgalichet/">David Galichet</a>.</li></ul><div
class="shr-publisher-7392"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F04%2F08%2Fretrospective-de-notre-xke-d-avril%2F' data-shr_title='R%C3%A9trospective+de+notre+XKE+d%27avril'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F04%2F08%2Fretrospective-de-notre-xke-d-avril%2F' data-shr_title='R%C3%A9trospective+de+notre+XKE+d%27avril'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/04/08/retrospective-de-notre-xke-d-avril/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Conférence MIX-IT Lyon 2011</title><link>http://blog.xebia.fr/2011/03/29/conference-mix-it-lyon-2011/</link> <comments>http://blog.xebia.fr/2011/03/29/conference-mix-it-lyon-2011/#comments</comments> <pubDate>Tue, 29 Mar 2011 13:26:30 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Conference]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Mahout]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7327</guid> <description><![CDATA[La semaine prochaine se tiendra la conférence Mix-IT (prononcez &#171;&#160;mixité&#160;&#187;) à Lyon. 25 speakers animeront la journée dans 5 salles en parallèle. Le but est de fournir des sujets variés et complémentaires, autour de 5 thèmes : Techy : Java et son écosystème Agility : L&#8217;agilité pour débutants et passionnés Trendy : Tendances novatrices et [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2011/03/logo-mixit2011_small-300x75.png" width="280" alt="Mix-IT Lyon" /></p><p>La semaine prochaine se tiendra la conférence Mix-IT (prononcez &laquo;&nbsp;mixité&nbsp;&raquo;) à Lyon. 25 speakers animeront la journée dans 5 salles en parallèle. Le but est de fournir des sujets variés et complémentaires, autour de 5 thèmes :</p><ul><li>Techy : Java et son écosystème</li><li>Agility : L&#8217;agilité pour débutants et passionnés</li><li>Trendy : Tendances novatrices et avant-gardistes</li><li>Mixy : Le meilleur de l&#8217;agilité et des technologies Java</li><li>Gamy : Jeux agiles et coding dojos</li></ul><p>Cet évènement est organisé par le <a
href="http://www.lyonjug.org/" title="Lyon JUG" >Lyon JUG</a> et le <a
href="http://clubagile.org/" title="Club Agile RhneAlpes" >Club Agile Rhône-Alpes</a>.</p><p>En vrac, on y parlera de : Play!, Product Owner, Clojure, Coaching agile, Apache Mahout, BDD, Grails, DevOps, Spock, HTML5, Code retreat et bien d&#8217;autres sujets.</p><p>Vous pouvez découvrir le programme complet à <a
href="http://www.mix-it.fr/programme" title="cette adresse" >cette adresse</a>.</p><p>Xebia participe à cet évènement en animant 2 slots :</p><ul><li><a
href="http://www.mix-it.fr/sessions#session_56005" title="Grails from scratch to Prod" >Grails from scratch to Prod</a>, par Aurélien Maury (<a
href="https://twitter.com/#!aurelienmaury" title="aurelienmaury" >@aurelienmaury</a>)</li><li><a
href="http://www.mix-it.fr/sessions#session_32002" title="Intelligence collective avec Apache Mahout" >Intelligence collective avec Apache Mahout</a>, par Michaël Figuière (<a
href="https://twitter.com/#!mfiguiere" title="mfiguiere" >@mfiguiere</a>)</li></ul><p>Les places sont comptées (200 spectateurs) donc dépêchez-vous de <a
href="http://www.mix-it.fr/inscription" title="vous inscrire" >vous inscrire</a> !</p><div
class="shr-publisher-7327"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F03%2F29%2Fconference-mix-it-lyon-2011%2F' data-shr_title='Conf%C3%A9rence+MIX-IT+Lyon+2011'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F03%2F29%2Fconference-mix-it-lyon-2011%2F' data-shr_title='Conf%C3%A9rence+MIX-IT+Lyon+2011'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/03/29/conference-mix-it-lyon-2011/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Rétrospective de notre XKE de mars</title><link>http://blog.xebia.fr/2011/03/04/retrospective-de-notre-xke-de-mars/</link> <comments>http://blog.xebia.fr/2011/03/04/retrospective-de-notre-xke-de-mars/#comments</comments> <pubDate>Fri, 04 Mar 2011 15:27:28 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Guava]]></category> <category><![CDATA[Mahout]]></category> <category><![CDATA[MongoDB]]></category> <category><![CDATA[SOLID]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7120</guid> <description><![CDATA[Comme chaque mois, le premier jeudi de mars a réuni tous les consultants Xebia pour le XKE (Xebia Knowledge Exchange). Après la traditionnelle introduction où chacun partage les actualités du mois précédent, place aux présentations, en parallèle : Michael Figuière a présenté Apache Mahout, le framework de Machine Learning de l&#8217;ecosystème Hadoop ; Nicolas Jozwiak [...]]]></description> <content:encoded><![CDATA[<p>Comme chaque mois, le premier jeudi de mars a réuni tous les consultants Xebia pour le <strong>XKE (Xebia Knowledge Exchange)</strong>.</p><p>Après la traditionnelle introduction où chacun partage les actualités du mois précédent, place aux présentations, en parallèle :</p><ul><li><a
href="http://blog.xebia.fr/author/mfiguiere/" title="Michael Figuire" >Michael Figuière</a> a présenté Apache Mahout, le framework de <em>Machine Learning</em> de l&#8217;ecosystème Hadoop ;</li><li><a
href="http://blog.xebia.fr/author/njozwiak/" title="Nicolas Jozwiak" >Nicolas Jozwiak</a> et <a
href="http://blog.xebia.fr/author/fdubois/" title="Frédéric Dubois" >Frédéric Dubois</a> se sont quant à eux attaqués aux concepts <a
href="http://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29" title="SOLID" >SOLID</a>.</li></ul><p>Ont suivi deux nouvelles sessions parallèles :</p><ul><li><a
href="http://blog.xebia.fr/author/ealliaume/" title="Erwan Alliaume" >Erwan Alliaume</a>, Julien Buret, <a
href="http://blog.xebia.fr/author/slemesle/" title="Séven Le Mesle" >Séven Le Mesle</a> et <a
href="http://blog.xebia.fr/author/plopez/" title="Pablo Lopez" >Pablo Lopez</a> ont animé un débat sur les problématiques de Load Balancing dans les architectures soumises à forte charge ;</li><li><a
href="http://blog.xebia.fr/author/nrichand/" title="Nathaniel Richand" >Nathaniel Richand</a> a organisé un open space, où il a notamment été question de traitement des exceptions Java puis de gestion des émotions.</li></ul><p>Après la pause déjeuner, les sessions sont redevenues plénières :</p><ul><li><a
href="http://blog.xebia.fr/author/karesti/" title="Katia Aresti" >Katia Aresti</a> est revenue en détail sur son expérience MongoDb et nous a fait l&#8217;honneur de l&#8217;avant première de la présentation qu&#8217;elle donnera à <a
href="http://www.10gen.com/conferences/mongofr2011" title="Mongo Paris" >Mongo Paris</a> ;</li><li><a
href="http://blog.xebia.fr/author/rmaton/" title="Romain Maton" >Romain Maton</a> nous a proposé un aperçu des APIs Google Guava ;</li><li><a
href="http://blog.xebia.fr/author/nrichand/" title="Nathaniel Richand" >Nathaniel Richand</a> nous a démontré à quel point la communication est un facteur déterminant dans la réussite d&#8217;une mission ;</li><li>Et, une fois n&#8217;est pas coutume, ce sont des intervenants extérieurs qui ont clos la journée. Mais contrairement à l&#8217;habitude, ce n&#8217;est pas un éditeur qui est venu nous présenter sa solution, mais deux de nos clients, Vincent Jaouen et Jean-Yves Cronier, qui nous ont exposé comment une refonte complète de leur couche HTML a permis de diviser les temps d&#8217;accès à un site internet grand public par cinq. Un grand merci à eux pour avoir apporté leur pierre à cet échange de connaissances.</li></ul><p>Malgré l&#8217;heure avancée <em>(la journée a une fois de plus été dense)</em>, bon nombre de courageux ont poursuivi les discussions autour d&#8217;un verre <em>(Ajax, Json, méthodes d&#8217;audit, Grid computing mais aussi vacances au soleil et cinéma <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</em>.</p><div
class="shr-publisher-7120"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F03%2F04%2Fretrospective-de-notre-xke-de-mars%2F' data-shr_title='R%C3%A9trospective+de+notre+XKE+de+mars'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F03%2F04%2Fretrospective-de-notre-xke-de-mars%2F' data-shr_title='R%C3%A9trospective+de+notre+XKE+de+mars'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/03/04/retrospective-de-notre-xke-de-mars/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Quelques places disponibles pour la première session de Robert Martin</title><link>http://blog.xebia.fr/2011/02/21/quelques-places-disponibles-pour-la-premiere-session-de-robert-martin/</link> <comments>http://blog.xebia.fr/2011/02/21/quelques-places-disponibles-pour-la-premiere-session-de-robert-martin/#comments</comments> <pubDate>Mon, 21 Feb 2011 11:22:35 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Craftsmanship]]></category> <category><![CDATA[Software Craftsmanship]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7062</guid> <description><![CDATA[Comme nous l’avions évoqué lors d’un précédent billet, nous organisons notre première formation « Software Craftsmanship Agile en Java » animée par Robert Martin les 20 et 21 avril pour laquelle il reste encore quelques places. Pour ceux qui ne le connaissent pas, Robert Martin est une des figures emblématiques du monde du développement logiciel [...]]]></description> <content:encoded><![CDATA[<p>Comme nous l’avions évoqué lors d’un <a
href="http://blog.xebia.fr/2010/11/08/robert-martin-uncle-bob-en-france-pour-des-formations-software-craftsmanship/">précédent billet</a>, nous organisons notre première formation <strong><a
href="http://training.xebia.fr/formations-methodes-agiles/formation-agile-software-craftsmanship-par-robert-cecil-martin/">« Software Craftsmanship Agile en Java »</a></strong> animée par <strong>Robert Martin</strong> les 20 et 21 avril pour laquelle il reste encore quelques places. Pour ceux qui ne le connaissent pas, Robert Martin est une des figures emblématiques du monde du développement logiciel agile. Il est l’auteur de plusieurs ouvrages et articles sur le « Craftsmanship » logiciel dont <a
href="http://www.amazon.fr/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">« Clean Code: A Handbook of Agile Software Craftsmanship »</a>.</p><p>Cette formation de 2 jours abordera principalement les thèmes suivants :</p><ul><li><strong>Justesse</strong> :  Développer des logiciels utiles et faciles d’usage.<li><strong>Fiabilité</strong> :  Développer des logiciels comportant peu de défauts et maintenant  leur niveau de service dans des conditions précises et pendant une période déterminée.<li><strong>Efficience</strong> :  Développer des  logiciels nécessitant un dimensionnement rentable et proportionné de la plate-forme d’hébergement en regard des autres exigences.<li><strong>Evolutivité</strong> :  Développer des logiciels demandant peu d’effort pour les rendre conformes à de  nouveaux besoins.</li><li><strong>Performance</strong> :  Développer des logiciels rapides et efficients.</li><li><strong>Exploitabilité</strong> :  Développer des logiciels exploitables</li><li><strong>Maintenabilité</strong> :  Développer des logiciels évolutifs et faciles à prendre en main.</li><li><strong>Interopérabilité</strong> :  Développer des logiciels  portables et interopérables.</li></ul><p>Si cette formation vous intéresse ou si vous souhaitez de plus amples informations, n’hésitez pas à consulter le <a
href="http://training.xebia.fr/formations-methodes-agiles/formation-agile-software-craftsmanship-par-robert-cecil-martin/">programme de la formation sur le site xebia-training.fr</a> ou à nous contacter au 01 53 89 99 99.</p><div
class="shr-publisher-7062"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F02%2F21%2Fquelques-places-disponibles-pour-la-premiere-session-de-robert-martin%2F' data-shr_title='Quelques+places+disponibles+pour+la+premi%C3%A8re+session+de+Robert+Martin'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F02%2F21%2Fquelques-places-disponibles-pour-la-premiere-session-de-robert-martin%2F' data-shr_title='Quelques+places+disponibles+pour+la+premi%C3%A8re+session+de+Robert+Martin'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/02/21/quelques-places-disponibles-pour-la-premiere-session-de-robert-martin/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Grails Tips : externaliser la configuration</title><link>http://blog.xebia.fr/2011/02/10/grails-tips-externaliser-la-configuration/</link> <comments>http://blog.xebia.fr/2011/02/10/grails-tips-externaliser-la-configuration/#comments</comments> <pubDate>Thu, 10 Feb 2011 08:50:48 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6825</guid> <description><![CDATA[Grails, c&#8217;est bien. Ça permet des développements rapides, simples et efficaces. Mais à moins de faire du jetable pour tester, un jour, il faut livrer. Se pose alors, souvent tard, la question de la configuration de l&#8217;application au runtime. Nous allons voir ensemble quelques solutions pour externaliser proprement les clés de configuration pour un projet [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/02/Grails_Logo_180x176.png" width="100" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Grails, c&#8217;est bien. Ça permet des développements rapides, simples et efficaces. Mais à moins de faire du jetable pour tester, un jour, il faut livrer. Se pose alors, souvent tard, la question de la configuration de l&#8217;application au runtime.</p><p>Nous allons voir ensemble quelques solutions pour externaliser proprement les clés de configuration pour un projet basé sur Grails.</p><h3><a
name="Outofthebox"></a>Out of the box</h3><p>Grails, par défaut, nous offre la possibilité de charger des fichiers de configuration externe de façon assez simple. Le chargement s&#8217;effectue suivant une logique simple :</p><ul><li>Tout ce qui se trouve dans le fichier <em>Config.groovy</em> vient en premier</li><li>Toutes les clés présentes dans les fichiers externes viennent s&#8217;ajouter à la configuration, ou surcharger les valeurs de <em>Config.groovy</em>.</li></ul><p>Ce mécanisme est <a
href="http://grails.org/doc/latest/guide/3.%20Configuration.html#3.4%20Externalized%20Configuration" title="document" >documenté</a> et très simple à mettre en œuvre. Il suffit de placer les quelques lignes suivantes au début du fichier <em>grails-app/conf/Config.groovy</em> :</p><pre class="brush: java; title: ; notranslate">
grails.config.locations = [ &quot;classpath:${appName}-config.properties&quot;,
                            &quot;classpath:${appName}-config.groovy&quot;,
                            &quot;file:${userHome}/.grails/${appName}-config.properties&quot;,
                            &quot;file:${userHome}/.grails/${appName}-config.groovy&quot; ]
</pre><p>Comme on peut le voir dans cet exemple tiré de la documentation, on peut même utiliser des variables dans les chemins spécifiés. Plutôt simple, n&#8217;est-il pas ? Le problème est réglé ? Ça conviendra très bien à la plupart des petits projets montés en local, cependant, l&#8217;utilisation de chemins en dur (ou modulo certaines variables) directement dans le <em>Config.groovy</em> est un peu rigide. Il est souvent problématique de livrer un war à un exploitant en lui expliquant que le fichier de configuration doit se placer à tel chemin et pas un autre.</p><p>Voyons si on peut trouver mieux&#8230;</p><h3><a
name="Parvariabledenvironnementoupro"></a>Par variable d&#8217;environnement ou propriété JVM</h3><p>L&#8217;idéal serait de pouvoir définir le chemin vers le fichier de configuration depuis l&#8217;extérieur du war. Pour faire cela, on peut se baser sur des variables d&#8217;environnement. Le fichier <em>Config.groovy</em> est, avant toute chose, un script Groovy ! Par conséquent, aucun problème pour inclure un peu de code dedans et récupérer des valeurs depuis le système.</p><p>On pourrait par exemple remplacer l&#8217;exemple du précédent paragraphe par :</p><pre class="brush: java; title: ; notranslate">
// On fixe le nom de la variable d'environnement qui nous intéresse
def ENV_NAME = &quot;APPNAME_CONFIG&quot;
// Si la liste grails.config.location n'existe pas, on l'instancie
if(!grails.config.locations || !(grails.config.locations instanceof List)) {
    grails.config.locations = []
}
// Si la variable est présente dans l'environnement ...
if(System.getenv(ENV_NAME)) {
  // ... on inclut sa valeur dans les configuration à charger
  println &quot;Including configuration file specified in environment: &quot; + System.getenv(ENV_NAME);
  grails.config.locations &lt;&lt; &quot;file:&quot; + System.getenv(ENV_NAME)
} else if (System.getProperty(ENV_NAME)) {
  // Sinon on regarde dans les propriétés JVM et on l'inclut si elle est présente
  println &quot;Including configuration file specified on command line: &quot; + System.getProperty(ENV_NAME);
  grails.config.locations &lt;&lt; &quot;file:&quot; + System.getProperty(ENV_NAME)
} else {
  // Si vraiment on ne trouve rien, on le dit quand même, parce que ça se fait.
  println &quot;No external configuration file defined.&quot;
}
</pre><p><em>Extrait de</em> <em><a
href="http://phatness.com/2010/03/how-to-externalize-your-grails-configuration/" title="cet article" >cet article</a></em> <em>et commenté maison</em></p><p>Si vos administrateurs sont complaisants, cette méthode peut être votre solution. Mais beaucoup rechigneront à toucher à leur environnement système pour faire plaisir à votre code chéri (du moins c&#8217;était le cas parmi ceux que j&#8217;ai rencontrés). Cela risque également de poser des problèmes dans le cas où l&#8217;on souhaite faire tourner plusieurs instances de notre application sur le même serveur avec des configurations différentes. Dans ce cas, la grimace de l&#8217;administrateur devant son environnement système se remplissant de toute une famille de variables vaut le coup d&#8217;œil.</p><p>Poussons donc un peu plus loin&#8230;</p><h3><a
name="ParentreJNDI"></a>Par entrée JNDI</h3><p>Plutôt que de toucher à l&#8217;environnement du système, nous pouvons nous contenter de toucher à l&#8217;environnement d&#8217;exécution de notre application. JNDI arrive à la rescousse. En s&#8217;appuyant non pas sur des variables système mais sur des variables JNDI, on cantonne nos modifications au serveur d&#8217;applications. Le lien entre l&#8217;instance et son fichier de configuration est plus étroit et donc plus évident à manipuler.</p><p>Modifions une dernière fois notre en-tête de chargement de configuration (toujours dans <em>Config.groovy</em>) :</p><pre class="brush: java; title: ; notranslate">
import javax.naming.InitialContext
// Si la liste grails.config.location n'existe pas, on l'instancie
if(!grails.config.locations || !(grails.config.locations instanceof List)) {
    grails.config.locations = []
}
try {
  // On tente de récupérer la variable d'environnement JNDI
  String extConfFile = (String) new InitialContext().lookup(&quot;java:comp/env/myAppInstanceConfig&quot;)
  // Si on trouve notre valeur, on l'ajoute aux fichiers à charger
  if (extConfFile) {
    grails.config.locations &lt;&lt; extConfFile
    println &quot;External configuration file loaded : ${extConfFile}&quot;
  }
} catch (Exception e) {
  // En cas d'absence de la variable, on log
  println &quot;Unable to load external configuration, using default.&quot;
}
</pre><p>Il suffira pour appliquer une configuration particulière, de définir la variable JNDI pour notre déploiement. Si on prend un serveur d&#8217;applications au hasard, Tomcat par exemple (oui, le hasard fait bien les choses), cela donnerait un fichier de contexte ressemblant à ceci:</p><pre class="brush: java; title: ; notranslate">
&lt;Context path=&quot;/myAppInstance1&quot; debug=&quot;0&quot; docBase=&quot;/the/full/path/to/myApp.war&quot;&gt;
  &lt;Environment name=&quot;myAppInstanceConfig&quot; type=&quot;java.lang.String&quot; override=&quot;false&quot;
               value=&quot;file:/the/full/path/to/myApp-instance1-config.properties&quot;/&gt;
&lt;/Context&gt;
</pre><h3><a
name="Conclusions"></a>Conclusions</h3><p>Même si toutes ces méthodes sont valides, j&#8217;avoue ma préférence pour la dernière. Elle présente à mon sens de multiples avantages:</p><ul><li>pas d&#8217;impact sur le système</li><li>possibilité de multiplier les instances avec des configurations différentes</li><li>lien fort entre l&#8217;instance d&#8217;application et le chemin vers son fichier de configuration</li></ul><p>Ce qu&#8217;il faut retenir de ces propositions, c&#8217;est surtout que <em>Config.groovy</em> est avant tout un script. Il est donc très facile d&#8217;ajouter sa propre logique de récupération des fichiers de configuration à charger. On pourrait en imaginer d&#8217;autres, comme d&#8217;aller parser un fichier centralisé sur le système ou de se connecter à une base de données pour récupérer des clés de configuration.</p><p>Le système de configuration incrémentale sur lequel est basé Grails et la configuration par scripting, permettent une très grande flexibilité, ou comme dirait les Perlistes: <a
href="http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it" title="Tim Toady!" >Tim Toady!</a>.</p><h4><a
name="Ressources"></a>Ressources</h4><ul><li><a
href="http://grails.org/doc/latest/guide/3.%20Configuration.html#3.4%20Externalized%20Configuration" title="Documentation Grails section configuration externe" >Documentation Grails, section configuration externe</a></li><li><a
href="http://groovy.codehaus.org/ConfigSlurper" title="ConfigSlurper laggrgateur de configuration" >ConfigSlurper, l&#8217;aggrégateur de configuration</a></li><li><a
href="http://java.sun.com/developer/technicalArticles/Programming/jndi/index.html" title="Developing JNDIbased Application" >Developing JNDI-based Application</a>, notamment la section <strong>Declaring Environment Variables</strong></li></ul><div
class="shr-publisher-6825"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F02%2F10%2Fgrails-tips-externaliser-la-configuration%2F' data-shr_title='Grails+Tips+%3A+externaliser+la+configuration'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F02%2F10%2Fgrails-tips-externaliser-la-configuration%2F' data-shr_title='Grails+Tips+%3A+externaliser+la+configuration'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/02/10/grails-tips-externaliser-la-configuration/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Notre XKE de février</title><link>http://blog.xebia.fr/2011/02/04/notre-xke-de-fevrier/</link> <comments>http://blog.xebia.fr/2011/02/04/notre-xke-de-fevrier/#comments</comments> <pubDate>Fri, 04 Feb 2011 14:33:16 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Craftsmanship]]></category> <category><![CDATA[java]]></category> <category><![CDATA[NaCl]]></category> <category><![CDATA[OAuth]]></category> <category><![CDATA[refactoring]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6793</guid> <description><![CDATA[Hier, comme tous les premiers jeudi du mois, se tenait notre XKE (Xebia Knowledge Exchange) lors duquel nous étions tous réunis pour échanger autour de sujets techniques passionnants. Après le traditionnel café du matin, la journée a commencé par une session de Craftsmanship autour du Refactoring to Patterns animée par Simon Caplette et Benoit Guérout. [...]]]></description> <content:encoded><![CDATA[<p>Hier, comme tous les premiers jeudi du mois, se tenait notre XKE (Xebia Knowledge Exchange) lors duquel nous étions tous réunis pour échanger autour de sujets techniques passionnants.</p><p>Après le traditionnel café du matin, la journée a commencé par une session de <a
href="http://blog.xebia.fr/2011/01/31/software-craftsmanship-en-pratique/">Craftsmanship</a> autour du <a
href="http://www.industriallogic.com/xp/refactoring/">Refactoring to Patterns</a> animée par <a
href="http://blog.xebia.fr/author/scaplette/">Simon Caplette</a> et Benoit Guérout.</p><p>Nous enchainons avec <a
href="http://www.javapuzzlers.com/">un challenge amusant autour du langage Java</a> animé par Nabil Gasri.</p><p>Après la pause déjeuner, <a
href="http://blog.xebia.fr/author/mfiguiere/">Michael Figuière</a> nous a présenté son retour d&#8217;expérience sur <a
href="http://www.slideshare.net/mfiguiere/xebia-knowledge-exchange-feb-2011-large-scale-web-development">le développement d’applications web à fortes affluences</a>.</p><p>La journée de XKE s’est achevée par deux sessions parallèles :</p><ul><li>Une présentation de <a
href="http://blog.xebia.fr/author/sklouvi/">Steve Klouvi</a> autour de <a
href="http://code.google.com/p/nativeclient/">Google Native Client (NaCl)</a> permettant d’exécuter du code natif dans Chrome / Chromium de façon sécurisée.</li><li>Une présentation avancée de <a
href="http://oauth.net/">l’API OAuth</a> par Mathieu Minh.</li></ul><p>Pour les plus courageux, les discussions ont continué en soirée à l&#8217;occasion d&#8217;un pot improvisé.</p><div
class="shr-publisher-6793"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F02%2F04%2Fnotre-xke-de-fevrier%2F' data-shr_title='Notre+XKE+de+f%C3%A9vrier'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F02%2F04%2Fnotre-xke-de-fevrier%2F' data-shr_title='Notre+XKE+de+f%C3%A9vrier'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/02/04/notre-xke-de-fevrier/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Moteurs de recherche temps réel au FOSDEM</title><link>http://blog.xebia.fr/2011/02/04/moteurs-de-recherche-temps-reel-au-fosdem/</link> <comments>http://blog.xebia.fr/2011/02/04/moteurs-de-recherche-temps-reel-au-fosdem/#comments</comments> <pubDate>Fri, 04 Feb 2011 08:07:27 +0000</pubDate> <dc:creator>Michaël Figuière</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[FOSDEM]]></category> <category><![CDATA[Lucene]]></category> <category><![CDATA[S4]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6785</guid> <description><![CDATA[Ce week-end, à Bruxelles, se déroulera le FOSDEM (Free and Open Source Software Developers&#8217; European Meeting). Cette conférence adresse les technologies Open Source dans leur ensemble avec des tracks diversifiées traitant de Linux, BSD, des systèmes embarqués, Mono (.Net), Java, ou encore de l&#8217;analyse de données (Data Analytics). Pour ma part j&#8217;y présenterai une session [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/02/fosdem.png" border="0" alt="FOSDEM" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Ce week-end, à Bruxelles, se déroulera le <a
href="http://fosdem.org/2011/" title="FOSDEM" >FOSDEM</a> <em>(Free and Open Source Software Developers&#8217; European Meeting)</em>. Cette conférence adresse les technologies Open Source dans leur ensemble avec des <a
href="http://fosdem.org/2011/schedule/tracks" title="tracks diversifies" ><em>tracks</em> diversifiées</a> traitant de Linux, BSD, des systèmes embarqués, Mono (.Net), Java, ou encore de l&#8217;analyse de données <em>(Data Analytics)</em>.</p><p>Pour ma part j&#8217;y présenterai une session sur le sujet émergeant que sont les moteurs de recherche temps réel. En effet depuis que Lucene s&#8217;est doté d&#8217;une capacité de recherche <em>Near Real-Time</em>, il y a <a
href="http://blog.xebia.fr/2009/09/28/revue-de-presse-xebia-126/#Lucenevolueetprparelavenir" title="un peu plus dun an" >un peu plus d&#8217;un an</a>, il est maintenant possible d&#8217;effectuer des recherches sur du contenu au fur et à mesure de son apparition, là où auparavant un délai était nécessaire en raison d&#8217;une indexation en <em>batch</em>. Cette nouvelle capacité offre de nouveaux défis, puisque les différents traitements doivent également être assurés en temps réel. Pour répondre à cette problématique, je montrerai comment <a
href="http://s4.io/" title="Yahoo! S4">S4</a>, le récent <em>framework</em> distribué de traitement de flux de Yahoo! peut rendre possible les analyses les plus audacieuses sur un flux de documents d&#8217;une taille quelconque.</p><p>L&#8217;<em>abstract</em> de cette présentation est le suivant :</p><p><em>Search engines have been around for a while, but only recently focus has been made on allowing search on real-time content. To enable such a thing, the whole indexing pipeline has to be made real-time : that is the data processing, and the insertion in the index itself. Lucene has been extended to allow the latter, but the former still has to be handled.</em><br
/> <em>S4 is an emerging technology from Yahoo that simplifies real-time distributed data processing. The goal of this presentation is to show how S4 can be used to enable some expensive pre-processing on a stream of incoming data, right before its indexing, thus bringing a powerful real-time search capability.</em></p><p>Pour rappel, FOSDEM est une conférence gratuite et ouverte à tous, alors si Bruxelles vous est accessible, n&#8217;hésitez pas à vous y rendre !</p><div
align="center"> <a
href="http://twitter.com/mfiguiere" ><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png"  title="Twitter Michaël Figuière" border="0" /><br
/> </a></div><div
class="shr-publisher-6785"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F02%2F04%2Fmoteurs-de-recherche-temps-reel-au-fosdem%2F' data-shr_title='Moteurs+de+recherche+temps+r%C3%A9el+au+FOSDEM'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F02%2F04%2Fmoteurs-de-recherche-temps-reel-au-fosdem%2F' data-shr_title='Moteurs+de+recherche+temps+r%C3%A9el+au+FOSDEM'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/02/04/moteurs-de-recherche-temps-reel-au-fosdem/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Rétrospective de notre XKE de janvier</title><link>http://blog.xebia.fr/2011/01/07/retrospective-de-notre-xke-de-janvier/</link> <comments>http://blog.xebia.fr/2011/01/07/retrospective-de-notre-xke-de-janvier/#comments</comments> <pubDate>Fri, 07 Jan 2011 16:03:48 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Backelite]]></category> <category><![CDATA[BkRender]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Mémoire]]></category> <category><![CDATA[MongoDB]]></category> <category><![CDATA[Performances]]></category> <category><![CDATA[Play!]]></category> <category><![CDATA[Tests unitaires]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6579</guid> <description><![CDATA[Nous étions tous réunis hier chez Xebia pour le premier XKE (Xebia Knowledge Exchange) de l’année 2011 ! Après nos échanges de vœux pour la nouvelle année et un bon café, la journée commença par deux sessions parallèles : Une présentation de la gestion avancée de la mémoire en Java animée par Pablo Lopez. Ce [...]]]></description> <content:encoded><![CDATA[<p>Nous étions tous réunis hier chez Xebia pour le premier <strong>XKE (Xebia Knowledge Exchange)</strong> de l’année 2011 !</p><p>Après nos échanges de vœux pour la nouvelle année et un bon café, la journée commença par deux sessions parallèles :</p><ul><li>Une présentation de la <strong>gestion avancée de la mémoire en Java</strong> animée par <a
href="http://blog.xebia.fr/author/plopez/" title="Pablo Lopez" >Pablo Lopez</a>. Ce slot se positionnait dans la continuité du <a
href="http://blog.xebia.fr/2010/01/27/performance-les-xebians-jouent-les-demineurs/" title="concours de tuning de performance organis lanne dernire" >concours de tuning de performance organisé l&#8217;année dernière</a>.</li><li>Un <strong>débat autour du concept de DTO</strong> animé par <a
href="http://blog.xebia.fr/author/cleclerc/" title="Cyrille Le Clerc" >Cyrille Le Clerc</a> et <a
href="http://blog.xebia.fr/author/jlmorlhon/" title="JeanLaurent De Morlhon" >Jean-Laurent De Morlhon</a>.</li></ul><p>Ce fut ensuite au tour de <a
href="http://blog.xebia.fr/author/mfiguiere/" title="Michael Figuière" >Michael Figuière</a> de prendre la parole et d’esquisser les <a
href="http://www.slideshare.net/mfiguiere/xebia-knowledge-exchange-jan-2011-trends-in-enterprise-applications-architecture-6473819" title="tendances des architectures de demain  Cloud Elasticit NoSQL Scalabilit etc" >tendances des architectures de demain : Cloud, Elasticité, NoSQL, Scalabilité, etc</a>.<br
/> Cette présentation a donné lieu à des débats animés.</p><p>Après un copieux déjeuner, nous avons accueilli <a
href="http://fr.linkedin.com/in/sarlandie" title="Thomas Sarlandie" >Thomas Sarlandie</a>, CTO de <a
href="http://www.backelite.com/" title="Backelite" >Backelite</a>, qui nous a présenté leur solution de développement de services mobiles BkRender. Ce framework sera d&#8217;ailleurs testé lors de nos prochains XKE face à des alternatives comme JQuery Mobile, Flex pour Mobile, etc.</p><p>L&#8217;après midi s&#8217;est poursuivie par une présentation du <a
href="http://moreunit.sourceforge.net/" title="plugin More Unit pour Eclipse" >plugin More Unit pour Eclipse</a> par <a
href="http://blog.xebia.fr/author/ndemengel/" title="Nicolas Demengel" >Nicolas Demengel</a>, contributeur sur le projet.</p><p><a
href="http://blog.xebia.fr/author/ealliaume/" title="Erwan Alliaume" >Erwan Alliaume</a> a ensuite animé un Hands On autour du framework Play!.</p><p>La journée s’est achevée par un retour d&#8217;expérience sur la mise en place de MongoDB / Amazon EC2 / S3 par <a
href="http://blog.xebia.fr/author/karesti/" title="Katia Aresti" >Katia Aresti</a> et <a
href="http://blog.xebia.fr/author/jlmorlhon/" title="Jean-Laurent De Morlhon" >Jean-Laurent De Morlhon</a> (Cf. <a
href="http://blog.xebia.fr/2010/12/15/mongodb-en-pratique/" title="MongoDB en pratique" >MongoDB en pratique</a>).</p><div
class="shr-publisher-6579"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F01%2F07%2Fretrospective-de-notre-xke-de-janvier%2F' data-shr_title='R%C3%A9trospective+de+notre+XKE+de+janvier'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F01%2F07%2Fretrospective-de-notre-xke-de-janvier%2F' data-shr_title='R%C3%A9trospective+de+notre+XKE+de+janvier'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/01/07/retrospective-de-notre-xke-de-janvier/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Bêtisier 2010</title><link>http://blog.xebia.fr/2010/12/31/betisier-2010/</link> <comments>http://blog.xebia.fr/2010/12/31/betisier-2010/#comments</comments> <pubDate>Fri, 31 Dec 2010 13:11:01 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6551</guid> <description><![CDATA[L’époque s’y prête : pour finir l’année en beauté, et exploiter une formule qui fait les choux gras de TF1, voici une sélection de perles que nous avons rencontrées en 2010, sur des projets ou sur la toile. Elle vient compléter nos sélections des années précédentes: Bêtisier 2007 Bêtisier 2008 Bêtisier 2009 N’hésitez pas à [...]]]></description> <content:encoded><![CDATA[<p>L’époque s’y prête : pour finir l’année en beauté, et exploiter une formule qui fait les choux gras de TF1, voici une sélection de perles que nous avons rencontrées en 2010, sur des projets ou sur la toile.</p><p>Elle vient compléter nos sélections des années précédentes:</p><ul><li><a
href="http://blog.xebia.fr/2007/12/31/betisier-2007/" title="Btisier 2007" >Bêtisier 2007</a></li><li><a
href="http://blog.xebia.fr/2008/12/31/betisier-2008/" title="Btisier 2008" >Bêtisier 2008</a></li><li><a
href="http://blog.xebia.fr/2009/12/31/betisier-2009/" title="Btisier 2009" >Bêtisier 2009</a></li></ul><p>N’hésitez pas à poster en commentaire vos propres rencontres du troisième type … A vous de jouer !</p><h4><a
name="Aprslebreakdancelebreakcoding"></a>Après le break dance, le break coding</h4><pre class="brush: java; title: ; notranslate">
while (mamethode()) {
 break;
}
</pre><h4><a
name="Enentier"></a>En entier &#8230;</h4><pre class="brush: java; title: ; notranslate">
public static int toInteger(String value) {
     try {
            return new Double(Double.parseDouble(value)).intValue();
     } catch (NumberFormatException e) {
           return 0;
     }
}
</pre><h4><a
name="UnLong"></a>Un Long ?</h4><pre class="brush: java; title: ; notranslate">
private static final String DOT = &quot;.&quot;;
...
public static boolean isLongNumber(String value) {
     try {
           Double.parseDouble(value);
           return !value.contains(DOT);
     } catch (NumberFormatException e) {
           return false;
     }
}
</pre><h4><a
name="Cherchezlerreur"></a>Cherchez l&#8217;erreur</h4><pre class="brush: java; title: ; notranslate">
public static ColumnsTableManagement getInstance() {
     synchronized (ColumnsTableManagement.class) {
            instance = (ColumnsTableManagement) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(&quot;columnsTableManagement&quot;);
            if (instance == null) {
                instance = new ColumnsTableManagement();
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(&quot;columnsTableManagement&quot;, instance);
            }
            return instance;
     }
}
</pre><h4><a
name="Unejolietrouvedansuntestunitai"></a>Une jolie trouvée dans un test unitaire</h4><pre class="brush: java; title: ; notranslate">
if (messagesList.size() == 3) {
    assertEquals(true, true);
} else {
    assertEquals(true, false);
}
</pre><h4><a
name="Quelquesnullsfrachementinstanc"></a>Quelques nulls fraîchement instanciés</h4><pre class="brush: java; title: ; notranslate">
if (null == new Integer(srt.getValuationType())) {
    //...
}
</pre><pre class="brush: java; title: ; notranslate">
GetTrace response = new GetTrace();
if (response != null)
    cache_getTrace.putValue(signature, response);
else
    cache_getTrace.failRelease(signature);
</pre><h4><a
name="Aucasouneexceptionnhriteraitpa"></a>Au cas où une exception n&#8217;hériterait pas de Throwable</h4><pre class="brush: java; title: ; notranslate">
try {
    //...
} catch (Exception e) {
    if (e instanceof Throwable) {
        throw new SecurityManagerException(e);
    }
    if (code == 2) {
        accountsummary.setIsBlocked(accountBlocked);
    }
}
</pre><div
class="shr-publisher-6551"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F31%2Fbetisier-2010%2F' data-shr_title='B%C3%AAtisier+2010'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F31%2Fbetisier-2010%2F' data-shr_title='B%C3%AAtisier+2010'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/12/31/betisier-2010/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Introduction à la sécurisation des applications web</title><link>http://blog.xebia.fr/2010/12/10/introduction-a-la-securisation-des-applications-web/</link> <comments>http://blog.xebia.fr/2010/12/10/introduction-a-la-securisation-des-applications-web/#comments</comments> <pubDate>Fri, 10 Dec 2010 10:56:47 +0000</pubDate> <dc:creator>David Galichet</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[authentification]]></category> <category><![CDATA[autorisations]]></category> <category><![CDATA[certificat]]></category> <category><![CDATA[chiffrement]]></category> <category><![CDATA[cryptographie]]></category> <category><![CDATA[Sécurité]]></category> <category><![CDATA[SSO]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6133</guid> <description><![CDATA[La sécurisation des sites web est un sujet important dès lors que l&#8217;application que vous développez contient des données un tant soit peu sensibles, ayant trait à la vie privée, à des données bancaires ou encore à des données stratégiques (d&#8217;entreprise, gouvernementales, militaires &#8230;). Le but de cet article est de sensibiliser les développeurs aux [...]]]></description> <content:encoded><![CDATA[<p>La sécurisation des sites web est un sujet important dès lors que l&#8217;application que vous développez contient des données un tant soit peu sensibles, ayant trait à la vie privée, à des données bancaires ou encore à des données stratégiques (d&#8217;entreprise, gouvernementales, militaires &#8230;).</p><p>Le but de cet article est de sensibiliser les développeurs aux notions de sécurité des applications web. L&#8217;idée n&#8217;est pas de faire de vous des experts de la sécurité (le sujet est, comme vous vous en doutez probablement, plutôt vaste) mais de vous donner les bases qui vous permettront d&#8217;appréhender les principales problématiques de la sécurité informatique, et plus particulièrement de la sécurité des applications Web. <strong>Cet article n&#8217;a donc pas vocation à être un état de l&#8217;art des techniques de cryptographie et de sécurité informatique, mais d&#8217;en introduire les concepts</strong>.</p><p>Lorsque nous travaillons sur la sécurisation d&#8217;une application, nous nous attachons principalement aux aspects suivant :</p><ul><li><em>l&#8217;authentification,</em></li><li><em>les autorisations,</em></li><li><em>l&#8217;intégrité,</em></li><li><em>la confidentialité,</em></li><li><em>l&#8217;identité,</em></li><li><em>la non répudiation.</em></li></ul><p>Nous allons traiter dans la suite de cet article ces différents principes, en essayant de rester simple et pragmatique.</p><h3><a
name="Principesdelacryptographie"></a>Principes de la cryptographie</h3><p>Avant d&#8217;entrer dans le vif du sujet, je vous propose un petit rappel des principaux principes de la cryptographie.</p><h4><a
name="Lesfonctionsdehachage"></a>Les fonctions de hachage</h4><p>Ces fonctions permettent de calculer une empreinte (appelée aussi <strong>hash</strong>) d&#8217;une donnée informatique. Les fonctions de hachage implémentent quelques propriétés que nous allons définir maintenant :</p><ul><li>le grand nombre d&#8217;empreintes possibles (entre 2^128 à 2^256 bits)  implique une probabilité extrêmement faible de collisions,</li><li>la taille de l&#8217;empreinte est fixe, quelle que soit la taille de la donnée hachée. L&#8217;empreinte d&#8217;un mot de passe de huit caractères aura donc la même taille que l&#8217;empreinte d&#8217;un fichier de plusieurs centaines de Mo,</li><li>un changement infime dans la donnée hachée entraîne un changement important dans l&#8217;empreinte correspondante (ce qui rend une recherche inverse par dichotomie impossible),</li><li>le calcul d&#8217;une empreinte est très rapide (pratique pour le calcul de sommes de contrôle de fichiers de plusieurs centaines de Mo),</li><li>il n&#8217;est pas possible, en connaissant l&#8217;empreinte et la fonction de hachage utilisée, de calculer la donnée d&#8217;origine.</li></ul><p>Ces fonctions sont généralement utilisées pour les besoins suivant :</p><ul><li><em>vérification de l&#8217;intégrité d&#8217;une donnée</em> : dans ce cas, le <strong>hash</strong> (généralement appelée <strong>somme de contrôle</strong> ou <strong>checksum</strong>) est utilisé pour s&#8217;assurer qu&#8217;une donnée informatique n&#8217;a pas été corrompue,</li><li><em>stockage des mots de passes</em> : le hachage du mot de passe permet d&#8217;éviter que ce dernier soit stocké en clair. Nous reviendrons sur ce cas d&#8217;utilisation dans la suite de cet article,</li><li><em>la construction de jetons</em> : comme les jetons <strong>remember me</strong>.</li></ul><p>Il existe différents algorithmes de hachage :</p><ul><li><em>MD5</em> (<em>Message Digest 5</em>) : probablement le plus connu, il est souvent utilisé pour les sommes de contrôle ou le stockage de mot de passes (notamment dans sa version salée dans diverses distributions <em>Linux</em>). Son empreinte est représentée sur 128 bits. Actuellement, le <strong>MD5</strong> est mis de côté au profit des algorithmes <strong>SHA1</strong> et <strong>SHA256</strong> réputés plus sûrs.</li><li><em>SHA1</em> (<em>Secure Hash Algorithm</em>) : cette fonction de hachage crée des empreintes sur 160 bits. Cet algorithme est lui aussi progressivement remplacé par le <strong>SHA256</strong>, beaucoup moins facile a casser grâce à son empreinte sur 256 bits.</li></ul><p>Le cassage d&#8217;un mot de passe haché ne peut se faire que par brute force (si l&#8217;on a beaucoup de puissance de calcul et de temps), par dictionnaire (on parcourt successivement les mots de passe les plus courants), en utilisant des dictionnaires inversés qui permettent de retrouver le mot de passe à partir du <strong>hash</strong> ou encore plus efficacement par l&#8217;utilisation de <a
href="http://fr.wikipedia.org/wiki/Table_arc-en-ciel" title="Rainbow Tables" >Rainbow Tables</a>.<br
/> Cette dernière technique reste la plus efficace pour retrouver un mot de passe faible, à condition d&#8217;avoir accès au <strong>hash</strong> d&#8217;origine. On peut l&#8217;imaginer comme une grosse <code>HashMap</code> dont la clé serait l&#8217;empreinte et la valeur la donnée d&#8217;origine. Les mots de passe les plus simples ont donc de grandes chances de s&#8217;y retrouver.</p><p>Le salage du <strong>hash</strong> est une technique efficace permettant de se prémunir des attaques par dictionnaire inversé. Cette technique consiste à ajouter à la donnée à hacher un sel, qui peut être une valeur arbitraire, et qui rendra donc les attaques par dictionnaire inversé inefficaces :<br
/> <code>empreinte = hachage(mot_de_passe + sel)</code><br
/> Il n&#8217;est pas nécessaire que le sel soit une information secrète, son utilité étant de rendre les dictionnaires inversés inefficaces.</p><p>Les commandes unix <code>md5pass</code> et <code>sha1pass</code> permettent de générer des mots de passes salés :</p><pre class="brush: java; title: ; notranslate">
% sha1pass password dupont@example.com
$4$dupont@example.com$hJLyOpYbVayE1Iq/ZY03Rx/r5Sk$
% sha1pass password martin@example.com
$4$martin@example.com$+LoO8eRzXhH23ozwXIDDpNE7ag4$
</pre><p>On voit ici que le salage d&#8217;un même mot de passe donne une empreinte totalement différente.</p><p>Nous reviendrons dans un prochain article sur la manière d&#8217;utiliser les algorithmes de hachage pour le stockage des mots de passe.</p><h4><a
name="Lechiffrementsymtrique"></a>Le chiffrement symétrique</h4><p>Les algorithmes de chiffrement symétriques reposent sur un secret (clé de chiffrement) partagé qui est utilisé pour chiffrer une donnée. Ils sont généralement utilisés pour sécuriser des informations ou des communications. Ses caractéristiques sont :</p><ul><li>un chiffrement rapide des données, nécessaire au chiffrement des communications ou d&#8217;un important volume de données,</li><li>la même clé est utilisée pour chiffrer et déchiffrer.</li></ul><p>Les algorithmes les plus couramment utilisés sont l&#8217;<strong>AES</strong> et le <strong>Blowfish</strong>. Il existe un grand nombre d&#8217;algorithme disponibles en Java (cf la documentation du projet <a
href="http://www.bouncycastle.org/docs/docs1.6/org/bouncycastle/crypto/engines/package-frame.html" title="Bouncycastle" >Bouncycastle</a> et la page de <a
href="http://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Algorithme_de_cryptographie_sym%C3%A9trique" title="Wikipedia" >Wikipedia</a>)</p><h4><a
name="Lechiffrementasymtrique"></a>Le chiffrement asymétrique</h4><p>Ce chiffrement repose sur une <strong>bi-clé</strong>, l&#8217;une publique et l&#8217;autre privée, dont l&#8217;une permet de chiffrer ce que l&#8217;autre va déchiffrer. Si la clé publique est utilisée pour chiffrer, la clé privée permettra le déchiffrement et inversement.<br
/> La clé publique est librement diffusée et peut être utilisée pour chiffrer une donnée à l&#8217;intention du détenteur de la clé privée.<br
/> La clé privée peut aussi être utiliser pour chiffrer et dans ce cas, seule la clé publique pourra déchiffrer le contenu. Ce type d&#8217;utilisation permet au détenteur de la clé privée de prouver son identité en signant une donnée. Nous y reviendrons dans la suite de cet article.</p><p>Le chiffrement asymétrique est principalement utilisé pour chiffrer des clés de chiffrement symétriques ou des <strong>hash</strong> pour une raison toute simple : les algorithmes de chiffrement asymétriques sont excessivement lents et ne peuvent pas être utilisés pour chiffrer des données dépassant quelques centaines d&#8217;octets. Son usage est donc principalement réservé au chiffrement de clés ou d&#8217;une empreinte (<strong>hash</strong>).</p><p>Un cas typique d&#8217;utilisation du chiffrement asymétrique est l&#8217;échange de clés de session (clé secrète) permettant le chiffrement d&#8217;une communication entre deux systèmes.<br
/> Un autre cas d&#8217;utilisation du chiffrement asymétrique est la signature d&#8217;un document. Dans ce cas, l&#8217;empreinte du document à signer est chiffrée à l&#8217;aide de la clé privée et déchiffrée avec la clé publique. Nous reviendrons plus tard sur ces types d&#8217;utilisation.</p><p>Les algorithmes asymétriques les plus connus sont le <strong>RSA</strong> (<strong>Rivest Shamir Adleman</strong>), le <strong>DSA</strong> (<strong>Digital Signature Algorithm</strong>) et le protocole d&#8217;échange de clés <strong>Diffie-Hellman</strong>.</p><p>Enfin, le chiffrement asymétrique est utilisé dans les certificats numériques <strong>X509</strong> dont nous reparlerons bientôt.</p><p>Nous en avons fini avec les principes de base de la cryptographie. Un petit tour sur <em>Wikipedia</em> vous donnera de plus amples informations sur le sujet.</p><h3><a
name="Lauthentification"></a>L&#8217;authentification</h3><p>L&#8217;authentification est probablement la notion la plus simple à comprendre, mais en tant que développeur, c&#8217;est une de celles qui vous demandera le plus de travail d&#8217;implémentation.<br
/> Comme vous pouvez vous en douter, l&#8217;authentification consiste à fournir un moyen d&#8217;accès à une application.</p><h4><a
name="Authentificationparidentifiant"></a>Authentification par identifiant et mot de passe</h4><p>Elle prend le plus souvent la forme d&#8217;un formulaire d&#8217;authentification où un identifiant unique ainsi qu&#8217;un secret (mot de passe secret que seul l&#8217;utilisateur rattaché à l&#8217;identifiant unique est sensé connaître) vous est demandé.<br
/> Dans ce cas de figure, le mot de passe est généralement stocké sous forme hachée le plus souvent dans un annuaire <strong>LDAP</strong> ou dans une base de donnée. La version salée de la fonction de hachage est chaudement recommandée afin d&#8217;éviter la découverte du mot de passe à l&#8217;aide d&#8217;un dictionnaire inversé.</p><p>Des techniques de durcissement de l&#8217;authentification par mot de passe, comme l&#8217;envoi de SMS, l&#8217;utilisation de <a
href="http://fr.wikipedia.org/wiki/Captcha" title="Captchas" >Captchas</a> ou encore l&#8217;utilisation de <a
href="http://fr.wikipedia.org/wiki/SecurID" title="RSA SecurID" >RSA SecurID</a>, peuvent être employé avec des résultats plus ou moins satisfaisants.</p><p>Dans un prochain article, nous verrons qu&#8217;il est assez simple de mettre en œuvre ces bonnes pratiques d&#8217;authentification à l&#8217;aide du framework <a
href="http://static.springsource.org/spring-security/site/" title="Spring Security" >Spring Security</a>.</p><h4><a
name="Authentificationparcertificat"></a>Authentification par certificat</h4><p>Les certificats numériques <strong>X509</strong> sont généralement connus pour leur utilité dans le chiffrement des connexions <strong>SSL</strong> (utilisé avec le protocole <strong>HTTPS</strong>) et peuvent aussi être utilisés pour l&#8217;authentification à une application. Ils sont constitués d&#8217;une partie privée, généralement protégée par un mot de passe, qui est conservée par l&#8217;utilisateur et d&#8217;une partie publique qui est stockée sur le système hébergeant l&#8217;application à laquelle nous souhaitons accéder.</p><p>Là encore, un durcissement de cette technique d&#8217;authentification peut être réalisé à l&#8217;aide de <em>tokens</em> cryptographiques (clés USB, cartes à puce). Ces <em>tokens</em> cryptographiques ont la capacité de générer la <strong>bi-clé</strong> du certificat numérique et d&#8217;effectuer des opérations de chiffrement/déchiffrement asymétriques. L&#8217;intérêt majeur réside dans le fait que la clé privée ne sortira jamais du <em>token</em> et ne pourra donc pas être dupliquée (en cas de vol, le certificat sera simplement révoqué et deviendra inutilisable). La sécurité est donc assurée par une possession physique (le <em>token</em>) et par un secret (le mot de passe permettant l&#8217;utilisation du <em>token</em>).</p><p>Les certificats numériques sont un moyen de contrôle d&#8217;accès efficace mais potentiellement complexes à mettre en œuvre. Nous reviendrons sur le détail de leur fonctionnement et de leur utilisation dans un prochain article.</p><h4><a
name="AuthentificationparSingleSignO"></a>Authentification par <strong>Single Sign On</strong> (<strong>SSO</strong>)</h4><p>Le <strong>Single Sign On</strong> permet la délégation de l&#8217;authentification à une application tierce qui va permettre aux utilisateurs d&#8217;accéder à toutes les applications du Système d&#8217;Information en ne s&#8217;authentifiant qu&#8217;une unique fois, pour la durée de la session d&#8217;authentification.</p><p>L&#8217;authentification par <strong>SSO</strong> peut être mise en place en interne, au sein du Système d&#8217;Information d&#8217;entreprise utilisant le <strong>Central Authenticate Service (CAS)</strong> par exemple, ainsi qu&#8217;en externe à l&#8217;aide de sites implémentant des protocoles tels qu&#8217;<a
href="http://openid.net/" title="OpenID" >OpenID</a>.</p><p>Là encore, un prochain article entrera dans les détails de l&#8217;utilisation du <strong>SSO</strong> dans vos applications web, ainsi que diverses bonnes pratiques et mises en garde sur leur utilisation (notamment en ce qui concerne <strong>OpenID</strong>).</p><h3><a
name="Lesautorisations"></a>Les autorisations</h3><p>Une fois authentifié, l&#8217;utilisateur souhaite utiliser l&#8217;application et pour cela, il lui faut des droits ou autorisations. Chaque utilisateur aura donc un <strong>rôle</strong> lui accordant un ensemble de droits permettant d&#8217;effectuer des opérations ou d&#8217;accéder à certaines données.<br
/> Les <strong>rôles</strong> les plus communs sont &laquo;&nbsp;utilisateur&nbsp;&raquo; ou encore &laquo;&nbsp;administrateur&nbsp;&raquo; mais il est possible d&#8217;imaginer tous types de <strong>rôles</strong> en fonction des besoins de l&#8217;application.</p><h3><a
name="Lintgrit"></a>L&#8217;intégrité</h3><p>Les fonctions de hachage sont utilisées pour s&#8217;assurer de l&#8217;intégrité (la non altération) d&#8217;une donnée. Le calcul des <strong>sommes de contrôle</strong> est un élément important permettant de s&#8217;assurer qu&#8217;une donnée n&#8217;a pas été corrompue, frauduleusement ou non.</p><h3><a
name="Laconfidentialit"></a>La confidentialité</h3><p>L&#8217;un des enjeux de la sécurisation des sites web est de garantir la confidentialité des données. Cette confidentialité repose sur les mécanismes de chiffrement symétriques et asymétriques qui permettent de protéger des données locales (avec <a
href="http://www.truecrypt.org/" title="TrueCrypt" >TrueCrypt</a> par exemple) ou bien des communications.</p><p>L&#8217;un des mécanismes les plus connus est probablement le protocole <strong>Secured Socket Layer (SSL)</strong> (remplacé par <strong>Transport Layer Security</strong> normalisé par l&#8217;<em>IETF</em>) qui permet entre autre, le chiffrement des communications entre deux tiers. Le protocole utilise les algorithmes asymétrique pour chiffrer une clé de session (symétrique) qui est ensuite utilisée pour le chiffrement symétrique de la communication.</p><p>La confidentialité est d&#8217;une importance capitale dans tout mécanisme d&#8217;échange de données un tant soit peu sensibles (mot de passes, données bancaires &#8230;).</p><h3><a
name="Lidentit"></a>L&#8217;identité</h3><p>Prouver son identité est probablement la tâche la plus complexe, et en même temps un des aspects fondamentaux de la sécurité. Lors d&#8217;une communication entre deux tiers, au hasard un client et un serveur, nous avons vu que certains mécanismes permettent de s&#8217;authentifier ou encore d&#8217;assurer la confidentialité.</p><p>Nous avons aussi vu que les algorithmes de chiffrement asymétriques, reposant sur une <strong>bi-clé</strong> dont l&#8217;une est privée et l&#8217;autre est publique, permettent l&#8217;échange de données sécurisé ou encore de prouver son identité.</p><p>Dans le premier cas de figure, nous utilisons la clé publique de notre interlocuteur afin de chiffrer une clé de session qui elle même a permis le chiffrement du document que nous souhaitons faire parvenir, en toute confidentialité, au possesseur de la clé privée. Dans ce cas, la seule chose dont nous sommes certains est que seul le possesseur de la clé privée sera à même de déchiffrer le contenu du document.</p><p>Dans un second cas de figure, nous souhaitons prouver que nous sommes à l&#8217;origine d&#8217;une donnée (une demande de congés par exemple). Une fois encore, le mécanisme de chiffrement asymétrique va venir à notre rescousse en nous permettant de chiffrer une empreinte du document que nous souhaitons envoyer à l&#8217;aide de notre clé privée. Ainsi, en déchiffrant l&#8217;empreinte à l&#8217;aide de la clé publique, nous nous assurons que la donnée provient bien du possesseur de la clé privée, mais aussi que cette donnée n&#8217;a pas été altérée, en recalculant l&#8217;empreinte du document et en la comparant à celle que nous venons de déchiffrer.</p><p>C&#8217;est plutôt pas mal, nous avons un mécanisme nous permettant d&#8217;envoyer un document de manière confidentielle à un tiers, mais aussi de prouver notre identité, juste à l&#8217;aide d&#8217;un mécanisme de clé publique que l&#8217;on distribue à ceux avec qui l&#8217;on souhaite communiquer. C&#8217;est malheureusement sur ce dernier point, &laquo;&nbsp;la distribution de la clé publique&nbsp;&raquo;, que les choses se compliquent. Est-il toujours possible de remettre en main propre sa clé publique ? Comment puis-je m&#8217;assurer que la clé publique dont je dispose correspond bien à l&#8217;émetteur dont je crois connaître l&#8217;identité ?</p><p>Les certificats numérique dont le standard <strong>X509</strong> est le plus répandu, apporte des réponses à nos questions. Ces certificats contiennent un certain nombre d&#8217;informations sur son propriétaire, sa clé publique ainsi qu&#8217;une empreinte signée du contenu du certificat.</p><p>Concernant la signature de l&#8217;empreinte nous avons deux cas de figure. Dans le premier cas, l&#8217;empreinte est signée à l&#8217;aide de la clé privée correspondant à la clé publique du certificat, c&#8217;est ce que l&#8217;on appelle un certificat auto-signé. Dans le second cas, une demande de certification est envoyée à une <strong>Autorité de Certification</strong> (<strong>AC</strong>), qui va ajouter sa propre identité dans le certificat (clé publique + informations sur l&#8217;<strong>Autorité de Certification</strong>) et signer l&#8217;empreinte du certificat.</p><p>L&#8217;<strong>Autorité de Certification</strong> peut être une entreprise dont les certificats sont reconnus dans la plupart des Systèmes d&#8217;Exploitation, Navigateurs, JVM&#8230;, comme <em>Verisign</em> par exemple, mais peut aussi être une DSI qui crée son propre certificat racine et l&#8217;implante dans les différentes postes de son SI.</p><p>Lorsque le navigateur, par exemple, recevra un certificat <strong>X509</strong>, celui-ci vérifiera qu&#8217;il est bien signé par une <strong>Autorité de Certification</strong> reconnue et le reconnaîtra comme valide. Dans le cas d&#8217;un certificat auto-signé et non reconnu, le système pourra proposer de l&#8217;accepter à ses risques et périls.</p><p>Afin d&#8217;augmenter la sécurité des certificats, les clés privées (qui sont sensées ne jamais être exposées), sont généralement protégées par un mot de passe. Le principe est que notre identité soit protégée par quelque chose que l&#8217;on possède (une clé privée) et un secret. Des mécanismes plus &laquo;&nbsp;durs&nbsp;&raquo; de sécurisation reposent sur des <em>tokens</em> cryptographiques qui contiennent le générateur de la <strong>bi-clé</strong> et l&#8217;espace mémoire pour stocker la clé privée. Dans ce cas, la clé privée peut être volée mais pas dupliquée. En cas de vol, le certificat numérique peut être révoqué ce qui empêche une utilisation délictueuse.</p><p>Nous n&#8217;entrerons pas plus dans les détails sur les certificats numériques dans cet article. Nous en reparlerons lorsque nous aborderons l&#8217;authentification <strong>X509</strong> dans un prochain article. Sachez simplement que les certificats numériques sont mis en œuvre dans beaucoup de mécanismes tels que les connections <strong>HTTPS</strong> qui sécurisent nos communications sur le web, dans le protocole <strong>SSH</strong> ou encore dans les réseaux privés virtuels (<strong>VPN</strong>).</p><h3><a
name="Lanonrpudiation"></a>La non répudiation</h3><p>La non répudiation consiste à s&#8217;assurer que l&#8217;émetteur d&#8217;une donnée ne puisse pas nier son implication en cas de litige. La non répudiation repose généralement sur des certificats numériques, qui restent le moyen le plus efficace pour s&#8217;assurer de l&#8217;identité d&#8217;une personne.</p><p>D&#8217;un point de vue légal, la non répudiation est particulièrement difficile à mettre en œuvre. Il est en effet difficile de remettre en cause la bonne foi d&#8217;une personne pouvant prétexter le vol de son identité numérique pour se défausser de sa responsabilité. Il peut par exemple être nécessaire de mettre en place des mécanismes de co ou de contre signature et de l&#8217;horodatage en fonction des besoins.</p><p>Ce sujet est particulièrement complexe, nous ne nous y attarderons pas plus. Vous pourrez trouver de plus amples informations sur internet, <a
href="http://www.slideshare.net/asyd/signature-presentation" title="ici" >ici</a> par exemple.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Cette introduction nous à permis de faire un tour des principes liés à la sécurisation des sites web. Les principes cryptographiques que sont le hachage et les algorithmes de chiffrement symétriques et asymétriques sont à la base de toute infrastructure web sécurisée.</p><p>Comme vous l&#8217;aurez compris, cet article est le prélude à une série d&#8217;articles sur la sécurisation des sites web, où nous utiliserons le très répandu framework <strong>Spring Security</strong> pour illustrer nos propos et quelques bonnes pratiques. Nous nous efforcerons par la même occasion d&#8217;aborder les failles les plus communes, référencées par l&#8217;<strong>OWASP Top Ten</strong>, et de montrer comment les traiter.</p><div
class="shr-publisher-6133"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F10%2Fintroduction-a-la-securisation-des-applications-web%2F' data-shr_title='Introduction+%C3%A0+la+s%C3%A9curisation+des+applications+web'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F10%2Fintroduction-a-la-securisation-des-applications-web%2F' data-shr_title='Introduction+%C3%A0+la+s%C3%A9curisation+des+applications+web'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/12/10/introduction-a-la-securisation-des-applications-web/feed/</wfw:commentRss> <slash:comments>18</slash:comments> </item> <item><title>NoThunes, tests en tout genre et qualité de code</title><link>http://blog.xebia.fr/2010/12/09/nothunes-tests-en-tout-genre-et-qualite-de-code/</link> <comments>http://blog.xebia.fr/2010/12/09/nothunes-tests-en-tout-genre-et-qualite-de-code/#comments</comments> <pubDate>Thu, 09 Dec 2010 12:03:45 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Tests]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[NoThunes]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6098</guid> <description><![CDATA[Avec un peu de retard sur les autres, voici le cinquième article de cette série sur Grails. Nous allons parler ici de : Tests unitaires Tests d&#8217;intégration Mesures de qualité de code Intégration continue En appliquant le tout à notre projet test bien aimé : NoThunes. Tout code sera testé, sinon par vous, alors par [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/09/nothunes_mini_logo.png" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Avec un peu de retard sur les autres, voici le cinquième article de cette <a
href="http://blog.xebia.fr/tag/nothunes/">série sur Grails</a>. Nous allons parler ici de :</p><ul><li>Tests unitaires</li><li>Tests d&#8217;intégration</li><li>Mesures de qualité de code</li><li>Intégration continue</li></ul><p>En appliquant le tout à notre projet test bien aimé : NoThunes.</p><h3><a
name="Toutcodeseratestsinonparvousal"></a>Tout code sera testé, sinon par vous, alors par vos utilisateurs &#8230;</h3><p>La nécessité de tester notre code, quel qu&#8217;il soit, a été largement décrite, soutenue et argumentée. Par conséquent, nous ne reviendrons pas dessus dans cet article. Je tiens à m&#8217;excuser pour avoir placé en dernier lieu l&#8217;activité qui devrait ouvrir le bal dans la rédaction d&#8217;une application (le TDD c&#8217;est bon, mangez-en). Cela m&#8217;a paru plus attractif de mettre les mains dans le cambouis de suite. Mais maintenant nous allons passer aux choses sérieuses : les Tests.</p><p>Scott Davis, sur le blog d&#8217;IBM, a rédigé une série d&#8217;articles <a
href="http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=mastering+grails" title="Mastering Grails" >Mastering Grails</a> dont 2 nous concernent plus particulièrement ici :</p><ul><li><a
href="http://www.ibm.com/developerworks/java/library/j-grails10209/index.html" title="Mock Testing with Grails" >Mock Testing with Grails</a></li><li><a
href="http://www.ibm.com/developerworks/java/library/j-grails10148/index.html" title="Testing your Grails application" >Testing your Grails application</a></li></ul><p>Les tests à la mode Grails sont largement bien décrits dans ces 2 articles. Je vais donc vous fournir ici mon retour d&#8217;expérience sur l&#8217;application en conditions réelles de ces conseils. Les tests unitaires au sens propre sont très bien décrits dans ces 2 articles, nous allons donc directement sauter aux tests d&#8217;intégration.</p><h3><a
name="TestsdintgrationGrailsdanslapr"></a>Tests d&#8217;intégration Grails dans la pratique</h3><p>Durant la phase des tests d&#8217;intégration, l&#8217;application est chargée entièrement, dans un <a
href="http://www.grails.org/Environments">mode test</a>. C&#8217;est l&#8217;équivalent du lancement de <code>grails test run-app</code>. Par conséquent nous disposons d&#8217;une base de données et de tous nos composants.</p><p>D&#8217;après Burt Beckwith, membre de la team Grails, il ne faut pas utiliser le framework de mock de Grails pour tester les classes de domaine. Sinon, tout ce qui est testé, c&#8217;est le framework de mock en lui-même et il ne supporte pas toutes les fonctionnalités de GORM (comme les closures <em>withCriteria</em> par exemple !). Pour les classes de domaine, il faut donc utiliser uniquement des tests d&#8217;intégration. L&#8217;exception à cette règle concerne les tests de méthode n&#8217;impliquant ni GORM, ni la base de données, comme les tests de validation de contraintes (regarder du côté de <code><a
href="http://www.ibm.com/developerworks/java/library/j-grails10209/index.html#N10205" title="mockForConstraintsTests()" >mockForConstraintsTests()</a></code> pour ça).</p><p>Cette méthode est un peu radicale et suppose que, dès qu&#8217;on fait usage, à un quelconque endroit, de requêtes nommées ou de closures Criteria, on se retrouve obligé de ne coder <em>que</em> des tests d&#8217;intégration. Une alternative consiste à <a
href="http://adhockery.blogspot.com/2010/01/using-gmock-to-complement-grails.html" title="utiliser GMock" >utiliser GMock</a> pour combler les manques actuels de Grails.</p><h4><a
name="Jeuxdedonnes"></a>Jeux de données</h4><p>Lorsqu&#8217;on code des tests d&#8217;intégration il est important de connaitre le contenu de la base de données avant chaque test. Il est donc utile de pouvoir se baser sur des jeux de données pour initialiser la base. Parmi les nombreuses solutions qui s&#8217;offrent à nous, voici celles qui ont retenu mon attention :</p><ul><li><strong>Utiliser la classe de configuration</strong> <code>Bootstrap.groovy</code> : Cela suppose de charger l&#8217;intégralité des données utiles pour tous les tests d&#8217;intégration, ce qui peut vite devenir encombrant. De plus le code nécessaire à instancier, lier et sauver toutes les instances utiles est assez verbeux.</li><li><strong>Le plugin</strong> <strong><a
href="http://www.grails.org/plugin/dbunit-operator" title="DbUnit Operator" >DbUnit Operator</a></strong> : Permet d&#8217;injecter à la demande des jeux de données écrits en XML. Ce plugin est basé sur la <a
href="http://www.dbunit.org/" title="librairie" >librairie</a> du même nom. C&#8217;est robuste et souple à la fois. L&#8217;inconvénient est que le modèle XML est centré sur le schéma de la base et va nécessiter une maintenance non négligeable.</li><li><strong>Le couple de plugin</strong> <strong><a
href="http://gpc.github.com/grails-fixtures/" title="Fixtures" >Fixtures</a>/<a
href="http://www.grails.org/plugin/build-test-data" title="BuildTestData" >BuildTestData</a></strong> : Fixtures permet de créer des jeux de données et de les sauvegarder en base rapidement avec une syntaxe concise. C&#8217;est la solution qui m&#8217;a semblée la plus pratique. L&#8217;association avec le plugin BuildTestData autorise à raccourcir encore la définition d&#8217;entités. Les champs non remplis manuellement dans une fixture peuvent être remplis automatiquement par BuildTestData.</li></ul><p>Après expérimentation, la dernière solution s&#8217;est révélée la plus simple et efficace. La documentation du plugin est un peu succincte et ne décrit pas de façon <em>explicite</em> tous les cas d&#8217;utilisation. En exclusivité, je vais prendre comme exemple un cas non documenté, sous vos yeux ébahis : l&#8217;utilisation conjointe des 2 plugins dans une fixture externe. Commençons par l&#8217;installation :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin fixtures
grails install-plugin build-test-data
</pre><p>L&#8217;installation du plugin Fixtures entraine l&#8217;apparition d&#8217;un répertoire <code>fixtures/</code> à la racine du projet. Tous les fichiers de fixtures déposés dedans seront rendus accessible pour être chargé dans le code de nos tests. Il est possible de mettre directement les fixtures dans notre code (comme décrit <a
href="http://gpc.github.com/grails-fixtures/docs/manual/guide/2.%20Defining%20The%20Data.html" title="dans la documentation" >dans la documentation</a>) mais j&#8217;ai préféré l&#8217;option de chargement de fichiers externes pour éviter d&#8217;introduire du bruit dans le code. Voici une fixture appliquée à notre modèle :</p><p><code><strong>fixtures/initialDev.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
import fr.xebia.nothunes.domain.*
import fr.xebia.nothunes.security.*
def member = User.findByUsername('user')
member.confirmPasswd = member.passwd
build {
  rtnp(Band) {
    name = 'RTNP'
    webSite = 'http://rtnp.org'
    owner = member
  }
  promotionCanape(Album) {
    name = &quot;Promotion Canapé&quot;
    band = rtnp
  }
  zombieNow(Track) {
    name = &quot;Zombie Now&quot;
    album = promotionCanape
  }
}
</pre><p>Décryptons ce fichier. Nous commençons par récupérer une instance de compte utilisateur en base, pour lui attribuer un <code>Band</code>. Cet utilisateur a été inséré dans la base via la classe de configuration <code>Bootstrap</code>, on peut donc compter dessus. La closures <code>build</code> sera interprétée par Fixtures pour créer les objets et les sauver en base. Fixture permet d&#8217;utiliser une closure <em>build</em>, qui s&#8217;appuie sur le plugin <code>BuildTestsData</code>, qui remplira automatiquement les champs non definis dans la fixture, de façon à ce que l&#8217;instance créée respecte ses contraintes d&#8217;intégrité.</p><p>Il est important de noter que les liens tissés entre les objets de la fixture sont écrits de façon directe. Par exemple la propriété <code>band</code> de notre instance <code>promotionCanape</code> est directement le nom de l&#8217;instance décrite juste au dessus. Pas besoin de sauvegarde intermédiaire, ce qui fait gagner pas mal de temps d&#8217;écriture.</p><p>Maintenant que nous disposons d&#8217;un petit jeu de données, pour le charger dans un test, il suffit de faire comme ceci :</p><pre class="brush: java; title: ; notranslate">
package fr.xebia.nothunes.domain
import grails.test.*
import fr.xebia.nothunes.domain.*
import fr.xebia.nothunes.security.*
class TrackIntegTests extends GrailsUnitTestCase {
  // definition de l'attribut fixtureLoader pour injection automatique
  def fixtureLoader
  protected void setUp() {
    super.setUp()
  }
  protected void tearDown() {
    super.tearDown()
  }
  void testLoadFixture() {
    // chargement du fichier fixtures/initialDev.groovy
    def fixture = fixtureLoader.load('initialDev')
    def result = Track.listOrderByName()
    assertEquals 1, result.size()
    assertEquals 'Zombie Now', result[0].name
  }
  void testNotLoadedFixture() {
    def result = Track.listOrderByName()
    assertEquals 0, result.size()
  }
}
</pre><p>Comme on peut le voir, la durée de vie des données en base ne dépasse pas la méthode de test. Ce comportement est plutôt pratique pour éviter que nos tests d&#8217;intégration se polluent les uns les autres.</p><h3><a
name="Testfonctionnels"></a>Test fonctionnels</h3><p>Pour aller encore un peu plus loin dans les tests, il faut monter encore d&#8217;un cran et passer aux tests d&#8217;IHM. Une référence dans le monde du web en Java : Selenium. C&#8217;est le premier nom qui m&#8217;est venu et j&#8217;ai donc cherché un plugin Grails. Il existe bel et bien mais la documentation initiale m&#8217;a fait faire demi-tour. Les tests peuvent être rédigés en trois formats différents, je vous colle des exemple de chacun pour que vous puissiez juger :</p><ul><li>HTML :</li></ul><pre class="brush: java; title: ; notranslate">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;test1&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; border=&quot;1&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;td colspan=&quot;3&quot;&gt;test1&lt;/td&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;open&lt;/td&gt;&lt;td&gt;/selenium-test/&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clickAndWait&lt;/td&gt;&lt;td&gt;link=BookController&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clickAndWait&lt;/td&gt;&lt;td&gt;link=New Book&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;title&lt;/td&gt;&lt;td&gt;book1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clickAndWait&lt;/td&gt; &lt;td&gt;//input[@value='Create']&lt;/td&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clickAndWait&lt;/td&gt; &lt;td&gt;link=Book List&lt;/td&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;verifyTextPresent&lt;/td&gt; &lt;td&gt;book1&lt;/td&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><ul><li>Pipe separated values :</li></ul><pre class="brush: java; title: ; notranslate">
open|/selenium-test
clickAndWait|link=BookController
clickAndWait|link=New Book
type|title|book2
clickAndWait|//input[@value='Create']
clickAndWait|link=Book List
verifyTextPresent|book2
</pre><ul><li>Groovy Server Pages :</li></ul><pre class="brush: java; title: ; notranslate">
&lt;g:set var=&quot;bookTitle&quot; value=&quot;book0d&quot;/&gt;
&lt;sel:test name=&quot;MyTest&quot;&gt;
&lt;sel:row command=&quot;open&quot; target=&quot;${request.contextPath}&quot;/&gt;
&lt;sel:row line=&quot;clickAndWait|link=BookController&quot;/&gt;
&lt;sel:row line=&quot;clickAndWait|link=New Book&quot;/&gt;
&lt;sel:row command=&quot;type&quot; target=&quot;title&quot; value=&quot;${bookTitle}&quot;/&gt;
&lt;sel:row line=&quot;clickAndWait|//input[@value='Create']&quot;/&gt;
&lt;sel:row line=&quot;clickAndWait|link=Book List&quot;/&gt;
&lt;sel:row line=&quot;verifyTextPresent|${bookTitle}&quot;/&gt;
&lt;/sel:test&gt;
</pre><p>Si l&#8217;une de ces syntaxes vous emballe, faites en bon usage. Personnellement j&#8217;ai été refroidi par l&#8217;aspect très compact et plutôt dur à relire. J&#8217;ai donc continué mes investigations, et suis finalement tombé sur le plugin <a
href="http://www.grails.org/plugin/webtest" title="WebTest" >WebTest</a>, basé sur la librairie de <a
href="http://webtest.canoo.com/webtest/manual/WebTestHome.html" title="Canoo" >Canoo</a>. Une librairie beaucoup plus orienté Groovy que ne l&#8217;est le plugin Selenium. De plus WebTest fourni également de jolis rapports HTML plein de couleurs attrayantes, faciles à interpréter. Voici un exemple de ce que peut donner le code d&#8217;un test simpliste avec cette librairie :</p><pre class="brush: java; title: ; notranslate">
package nothunes
import nothunes.common.WebTestsNoThunes
class BandWebTests extends WebTestsNoThunes {
  def fixtureLoader
  void testLogin() {
    invoke(url:'login')
    verifyText(text:'Please Login..')
    def fixture = fixtureLoader.load('initialDev')
    invoke(url:'/navigation')
    verifyText(text:'RTNP')
  }
}
</pre><p>Les actions sont basiques, l&#8217;API est nativement en Groovy, et pour ceux qui ont déjà utilisé Selenium sur des projets Java, ce n&#8217;est vraiment pas dépaysant. La facilité de prise en main et les rapports parlants en font ma préférence pour l&#8217;automatisation de tests d&#8217;IHM web.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/12/webtests-report.png" alt="webtests-report" title="webtests-report" /></div><h3><a
name="Analysestatiqueducode"></a>Analyse statique du code</h3><p>Outre la pose d&#8217;un filet de sécurité autour des fonctionnalités de l&#8217;application, il est également intéressant d&#8217;affiner la qualité du code source produit. L&#8217;analyse statique de code est une méthode rodée chez les développeurs Java pour permettre de trouver des duplications de code, des bugs éventuels, évaluer la complexité, etc. Du coté du langage Groovy, l&#8217;outillage est un peu moins riche mais on trouve quand même quelques petites choses intéressantes.</p><h4><a
name="CodeNarc"></a>CodeNarc</h4><p>Tout d&#8217;abord : <a
href="http://codenarc.sourceforge.net/" title="CodeNarc" >CodeNarc</a>. Ce programme permet de valider du code Groovy en regard de règles de programmation établie. Un jeu de règle est proposé par défaut mais il est possible de définir ses propres règles. Un packaging sous forme de <a
href="http://www.grails.org/plugin/codenarc" title="plugin Grails" >plugin Grails</a> existe également, pour permettre une installation et une utilisation simplifiées :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin codenarc
grails codenarc
</pre><p>Cela va lancer l&#8217;analyse et générer un rapport détaillé de toutes les violations de règles, au format HTML :</p><p><strong>Extrait de CodeNarcReport.html</strong></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/12/codenarc_nothunes.png" alt="codenarc_nothunes" title="codenarc_nothunes" width="700px" /></div><p>La présentation est spartiate, mais ça tourne ! Le rapport commence par une vision macro avec la consolidation des erreurs par package, puis viens la liste détaillée de chacun des packages concernés, et enfin la description de chaque type de violation rencontré.<br
/> On peut également <a
href="http://codenarc.sourceforge.net/codenarc-creating-ruleset.html" title="crire soit mme des rgles" >écrire soit même des règles</a> de programmation à respecter. Il est donc aisé de se baser sur cet outil pour faire respecter les normes de votre choix. Pour ceux d&#8217;entre vous qui l&#8217;utilise déjà, sachez que la dernière version (la 0.11) est sortie le 13 novembre avec notamment 50 règles supplémentaires.</p><h4><a
name="GMetrics"></a>GMetrics</h4><p>GMetrics, quant à lui, est centré sur le calcul et la présentation de métriques. Le projet assure le calcul :</p><ul><li>de complexité cyclomatique</li><li>du nombre de lignes par méthode</li><li>du nombre de lignes par classe</li></ul><p>Selon le même principe que CodeNarc, l&#8217;installation de cette librairie se fait comme un plugin au projet : il se lance simplement et génère un rapport HTML :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin gmetrics
grails gmetrics
</pre><p><strong>Extrait d&#8217;un rapport GMetrics</strong></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/12/gmetrics_nothunes.png" alt="gmetrics_nothunes" title="gmetrics_nothunes" width="700px"/></div><p>GMetrics est encore assez léger dans les métriques collectées, mais il offre une excellente base de développement pour collecter ses propres métriques. Si par hasard vous en écrivez pour un projet, n&#8217;hésitez pas à en faire profiter la communauté.</p><h3><a
name="Conclusions"></a>Conclusions</h3><p>Il y aurait de quoi écrire un livre entier sur le seul sujet des tests dans le cadre de Grails. Comme d&#8217;habitude, les affinités entre le langage Groovy et le Java font que beaucoup d&#8217;outils Java sont déjà <em>pluginizé</em> ou ne coûterai pas cher à l&#8217;être. Longtemps cantonné aux scripting Java, le langage Groovy trouve ses lettre de noblesse avec Grails. Il est agréable de voir se développer pour le langage Groovy des outils de qualité qui apportent tant au langage Java. En quelques recherches, un projet peut se doter de tout ce qu&#8217;il faut pour développer des tests unitaires, d&#8217;intégration, fonctionnels mais aussi tests d&#8217;acceptance (avec <a
href="http://www.grails.org/plugin/fitnesse" title="Fitnesse" >Fitnesse</a> ou <a
href="http://www.grails.org/plugin/easyb" title="EasyB" >EasyB</a>), ou même des tests de vos fonctions Javascript avec <a
href="http://www.grails.org/plugin/jsunit" title="JsUnit" >JsUnit</a>.</p><p>Dans le framework Grails, les tests sont disponibles pour tous les goûts, toutes les tailles. Le véritable défi consiste à séparer le bon grain de l&#8217;ivraie au milieu du foisonnement de plugins disponibles (sans compter qu&#8217;il est toujours possible d&#8217;intégrer soit même des librairies Java). J&#8217;espère vous avoir apporté, sinon <em>La</em> réponse, au moins l&#8217;éclairage de mon expérience personnelle sur le sujet. Maintenant il ne reste plus qu&#8217;à trouver votre propre style de tests Grails.</p><p><strong>Ressources :</strong></p><ul><li><a
href="http://www.grails.org/Unit+Testing" title="Tests unitaires sur le site Grails" >Tests unitaires sur le site Grails</a></li><li><a
href="http://grails.org/doc/latest/guide/9.%20Testing.html" title="Section Testing de la documentation officielle" >Section Testing de la documentation officielle</a></li><li><a
href="http://www.ibm.com/developerworks/java/library/j-grails10209/index.html" title="Mock Testing with Grails" >Mock Testing with Grails</a></li><li><a
href="http://www.ibm.com/developerworks/java/library/j-grails10148/index.html" title="Testing your Grails application" >Testing your Grails application</a></li><li><a
href="https://github.com/aurelienmaury/nothunes" title="NoThunes sur GitHub" >NoThunes sur GitHub</a></li></ul><div
class="shr-publisher-6098"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F09%2Fnothunes-tests-en-tout-genre-et-qualite-de-code%2F' data-shr_title='NoThunes%2C+tests+en+tout+genre+et+qualit%C3%A9+de+code'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F09%2Fnothunes-tests-en-tout-genre-et-qualite-de-code%2F' data-shr_title='NoThunes%2C+tests+en+tout+genre+et+qualit%C3%A9+de+code'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/12/09/nothunes-tests-en-tout-genre-et-qualite-de-code/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Tous réunis chez Xebia pour le XKE !</title><link>http://blog.xebia.fr/2010/12/03/tous-reunis-chez-xebia-pour-le-xke/</link> <comments>http://blog.xebia.fr/2010/12/03/tous-reunis-chez-xebia-pour-le-xke/#comments</comments> <pubDate>Fri, 03 Dec 2010 16:15:32 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Acceptance Test Tools]]></category> <category><![CDATA[BDD]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[iPhone]]></category> <category><![CDATA[jBehave]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6070</guid> <description><![CDATA[Comme tous les premiers jeudi du mois, l’ensemble des consultants de Xebia était réuni hier, boulevard Haussmann, pour notre journée mensuelle XKE (Xebia Knowledge Exchange). La culture du partage de la connaissance étant la valeur fondatrice de Xebia, ces journées mensuelles réunissent nos passionné(e)s qui discutent, entre autres, des dernières technologies de l’écosystème Java JEE [...]]]></description> <content:encoded><![CDATA[<p>Comme tous les premiers jeudi du mois, l’ensemble des consultants de Xebia était réuni hier, boulevard Haussmann, pour notre journée mensuelle XKE (Xebia Knowledge Exchange).</p><p><a
href="http://blog.xebia.fr/2010/10/27/xebia-une-sociologie-de-craftsmen-ou-crafstmen-en-devenir/|http://blog.xebia.fr/2010/10/27/xebia-une-sociologie-de-craftsmen-ou-crafstmen-en-devenir/" title="La culture du partage de la connaissance tant la valeur fondatrice de Xebia" >La culture du partage de la connaissance étant la valeur fondatrice de Xebia</a>, ces journées mensuelles réunissent nos passionné(e)s qui discutent, entre autres, des dernières technologies de l’écosystème Java JEE et font partager leurs retours d’expérience sur des sujets techniques <em>(mais pas seulement)</em> choisis à l&#8217;avance.</p><p>C’est donc à travers des présentations formelles, des sessions de travaux pratiques, des débats, que chacun peut faire profiter de son point de vue et de son expérience.</p><p>Après un vote collégial sur les sujets qui seront abordés au cours de cette journée, les volontaires ont plusieurs semaines pour travailler seuls ou en groupe sur leurs sujets plébiscités par l&#8217;ensemble de leurs collègues.</p><p>Xebia souhaitait vous en dévoiler un peu plus sur ces journées, au coeur de l&#8217;ADN et des synergies de Xebia.</p><p><strong>Au programme ce mois ci :</strong></p><p>Après le café du matin, qui aide à oublier le grand froid, la journée commence avec une session News / Actus au cours de laquelle les 45 consultants de Xebia échangent librement sur les actualités qui ont retenu leur attention ce mois-ci.</p><p>Pour continuer, les consultants ont eu le choix entre deux sessions parallèles :</p><ul><li>Une présentation sur la collecte de logs sur des architectures massivement distribuées, par <a
href="http://blog.xebia.fr/author/plopez/" title="Pablo Lopez" >Pablo Lopez</a>.</li><li>Un slot Acceptance Test Tools Contest, par <a
href="http://blog.xebia.fr/author/nrichand/" title="Nathaniel Richand" >Nathaniel Richand</a>.</li></ul><p>Après le déjeuner, qui est l&#8217;occasion de poursuivre les débats et discussions de la matinée et de faire connaissance avec les invités autour d&#8217;une pizza, nous accueillons <a
href="http://www.riagora.com/" title="Michal Chaize" >Michaël Chaize</a> évangéliste de la plateforme Flash qui nous présente les nouveautés des plateformes Flash et Flex d&#8217;Adobe.</p><p>L&#8217;après midi, se poursuit avec deux Hands On en parallèle :</p><ul><li>Un Hands On &laquo;&nbsp;<a
href="http://fr.wikipedia.org/wiki/Behavior_Driven_Development" title="BDD (Behaviour Driven Development)" >BDD <em>(Behaviour Driven Development)</em></a> avec <a
href="http://jbehave.org/" title="jBehave" >&laquo;&nbsp;jBehave&nbsp;&raquo;</a>, animé par <a
href="http://blog.xebia.fr/author/hbenmansour/" title="Hamza Benmansour" >Hamza Benmansour</a> et Aurélien Masse.</li><li>Un Hands On &laquo;&nbsp;Développement iPhone&nbsp;&raquo;, animé par <a
href="http://blog.xebia.fr/author/afathallah/" title="Amin Fathallah" >Amin Fathallah</a>.</li></ul><p>La dernière session de la journée est un retour complet sur <a
href="http://blog.xebia.fr/tag/devoxx/" title="Devoxx" >Devoxx</a>, par <a
href="http://blog.xebia.fr/author/edijoux/" title="Ellène Dijoux" >Ellène Dijoux</a>, <a
href="http://blog.xebia.fr/author/rmaton/" title="Romain Maton" >Romain Maton</a> et <a
href="http://blog.xebia.fr/author/mfiguiere/" title="Michael Figuire" >Michael Figuière</a>, nos reporters pour l&#8217;évènement !</p><p>Le XKE s&#8217;est terminé, comme à son habitude, par un apéritif improvisé pour célébrer une nouvelle journée d&#8217;émulation technique et de partage de connaissances&#8230; <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><div
class="shr-publisher-6070"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F03%2Ftous-reunis-chez-xebia-pour-le-xke%2F' data-shr_title='Tous+r%C3%A9unis+chez+Xebia+pour+le+XKE+%21'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F03%2Ftous-reunis-chez-xebia-pour-le-xke%2F' data-shr_title='Tous+r%C3%A9unis+chez+Xebia+pour+le+XKE+%21'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/12/03/tous-reunis-chez-xebia-pour-le-xke/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Xebia 37ème du classement Deloitte Technology Fast 50 France 2010</title><link>http://blog.xebia.fr/2010/11/23/xebia-37eme-du-classement-deloitte-technology-fast-50-france-2010/</link> <comments>http://blog.xebia.fr/2010/11/23/xebia-37eme-du-classement-deloitte-technology-fast-50-france-2010/#comments</comments> <pubDate>Tue, 23 Nov 2010 09:58:01 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Xebia]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5988</guid> <description><![CDATA[Xebia a été classée 37ème du classement Deloitte Technology Fast 50 France 2010. Deloitte a sélectionné les entreprises de ce palmarès en fonction du taux de croissance de leur chiffre d&#8217;affaires sur cinq exercices (2005-2009). C&#8217;est donc avec fierté que Xebia s&#8217;est vue récompensée lors de la remise des prix du palmarès National, réunissant plus [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/Fast50_Laureat2010.png" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /></p><p><strong>Xebia a été classée 37ème du classement <a
href="http://www.fast50france.com/" title="Deloitte Technology Fast 50 France 2010" >Deloitte Technology Fast 50 France 2010</a>.</strong><br
/> Deloitte a sélectionné les entreprises de ce palmarès en fonction du taux de croissance de leur chiffre d&#8217;affaires sur cinq exercices (2005-2009).</p><p>C&#8217;est donc avec fierté que Xebia s&#8217;est vue récompensée lors de la remise des prix du palmarès National, réunissant plus de 300 entrepreneurs, investisseurs  et acteurs majeurs de la chaine de l&#8217;innovation et du développement des entreprise technologiques, lundi 22 novembre, au palais Brongniart.</p><p>Le Président de Xebia, Luc Legardeur, attribue au respect en toutes circonstances des valeurs fondatrices de la société <em>(l&#8217;absence de compromis sur la qualité, la place de l&#8217;individu au centre de toutes décisions, le partage de la connaissance et l&#8217;instauration d&#8217;une intimité client forte)</em>, le taux de croissance de 1060% du chiffre d&#8217;affaires de Xebia sur ces cinq dernières années.<br
/> Il déclare : <em><strong>&laquo;&nbsp;Cette récompense est une récompense pour tous les Xebians&nbsp;&raquo;</strong></em>.</p><p><em>&laquo;&nbsp;Figurer au palmarès des Technology Fast 50 de Deloitte signifie faire partie des leaders français de la croissance pendant 5 années, ce qui démontre des qualités exceptionnelles dans le secteur d&#8217;activité si fortement concurrentiel qu&#8217;est la technologie aujourd&#8217;hui&nbsp;&raquo;</em> déclare Pierre Marque, Associé Deloitte responsable du programme Technology Fast 50 de Deloitte. <em>&laquo;&nbsp;Nous félicitons chaleureusement Xebia d&#8217;être l&#8217;une des  premières entreprises technologiques de croissance en France&nbsp;&raquo;</em>.</p><h4><a
name="Contacts"></a>Contacts</h4><ul><li><strong>Julia Debienne</strong> : Relations Presse Deloitte : + 33 (0)1 55 61 41 69 / jdebienne@deloitte.fr</li><li><strong>Benjamin Sasu</strong> : Agence Rumeur Publique : + 33 (0)1 55 74 52 37 / Benjamin.sas@rumeurpublique.fr</li></ul><h4><a
name="AproposduprogrammeTechnologyFa"></a>A propos du programme Technology Fast 50</h4><p>Le programme Technology Fast 50 a vu le jour en 1995 à San Jose en Californie, cœur de la Silicon Valley, et a ensuite été étendu à tous les Etats-Unis puis au Royaume-Uni, au Canada, aux Pays-Bas, à Israël et à la France. Il est désormais présent dans plus de 50 pays et régions dans le monde. Il a été créé afin de mettre en valeur la remarquable contribution des entreprises technologiques à la croissance de l&#8217;économie.</p><h4><a
name="AproposdeDeloitte"></a>A propos de Deloitte</h4><p>Deloitte fait référence à un ou plusieurs cabinets membres de Deloitte Touche Tohmatsu Limited, société de droit anglais (« private company limited by guarantee »), et à son réseau de cabinets membres constitués en entités indépendantes et juridiquement distinctes. Pour en savoir plus sur la structure légale de Deloitte Touche Tohmatsu Limited et de ses cabinets membres, consulter www.deloitte.com/about. En France, Deloitte SA est le cabinet membre de Deloitte Touche Tohmatsu Limited, et les services professionnels sont rendus par ses filiales et ses affiliés.<br
/> Deloitte mobilise un ensemble de compétences diversifiées pour répondre aux enjeux de ses clients, de toutes tailles et de tous secteurs &#8211; des grandes entreprises multinationales aux microentreprises locales, en passant par les entreprises moyennes. Fort de l&#8217;expertise de ses 6 500 collaborateurs et associés, Deloitte en France est un acteur de référence en audit et risk services, consulting, financial advisory, juridique &#038; fiscal et expertise comptable, dans le cadre d&#8217;une offre pluridisciplinaire et de principes d&#8217;action en phase avec les exigences de notre environnement.</p><div
class="shr-publisher-5988"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F11%2F23%2Fxebia-37eme-du-classement-deloitte-technology-fast-50-france-2010%2F' data-shr_title='Xebia+37%C3%A8me+du+classement+Deloitte+Technology+Fast+50+France+2010'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F11%2F23%2Fxebia-37eme-du-classement-deloitte-technology-fast-50-france-2010%2F' data-shr_title='Xebia+37%C3%A8me+du+classement+Deloitte+Technology+Fast+50+France+2010'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/23/xebia-37eme-du-classement-deloitte-technology-fast-50-france-2010/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
