<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4119583874959957708</id><updated>2012-02-02T22:13:57.242+01:00</updated><category term='mobile'/><category term='utilisabilité'/><category term='saopui'/><category term='GWT'/><category term='javascript'/><category term='ESB'/><category term='apple'/><category term='ebay'/><category term='.Net'/><category term='java tips'/><category term='maven'/><category term='cxf'/><category term='tomcat advanced io'/><category term='applet'/><category term='template'/><category term='SOA'/><category term='cassandra-unit'/><category term='presentation'/><category term='console'/><category term='échange asynchrone'/><category term='iphone'/><category term='agile'/><category term='ejb'/><category term='plugin'/><category term='polling'/><category term='spring'/><category term='web service'/><category term='xpath'/><category term='push http'/><category term='EDA'/><category term='impression'/><category term='nosql'/><category term='tdd'/><category term='jEE'/><category term='extreme programming'/><category term='hook'/><category term='Cassandra'/><category term='histoire'/><category term='xml'/><category term='hibernate'/><category term='pont'/><category term='soap'/><category term='ihm'/><category term='java'/><category term='chtijug'/><category term='ajax'/><category term='échange synchrone'/><category term='remote'/><category term='shutdown ctrl c'/><category term='jvm'/><category term='entreprise'/><category term='google web toolkit'/><category term='j2EE'/><category term='norsys'/><category term='pdf'/><category term='framework web'/><category term='pair programming'/><category term='comet'/><category term='garbage collector'/><category term='photo'/><category term='android'/><category term='continuation jetty'/><category term='scrum'/><category term='onGwt'/><category term='coding dojo'/><category term='hector'/><category term='jboss'/><category term='microsoft'/><category term='intégration continue'/><category term='architecture'/><category term='axis'/><category term='jconsole'/><category term='forge'/><category term='vista'/><category term='prototype'/><category term='google'/><title type='text'>Un Chti café</title><subtitle type='html'>Un peu de JEE... un peu d'IT... un peu d'agilité... par Jérémy SEVELLEC</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-3078992149533960651</id><published>2012-01-27T17:34:00.003+01:00</published><updated>2012-01-27T17:39:01.004+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forge'/><title type='text'>Brancher Nexus sur Active Directory (LDAP)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;Après avoir perdu un peu de temps à configurer &lt;a href="http://nexus.sonatype.org/"&gt;Nexus&lt;/a&gt; sur &lt;a href="http://fr.wikipedia.org/wiki/Active_Directory"&gt;Active Directory&lt;/a&gt;&amp;nbsp;par l'intermédiaire du protocole &lt;a href="http://fr.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol"&gt;LDAP&lt;/a&gt;, Je vous propose de vous faire partager mon expérience sur le sujet et en français&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mon besoin était le suivant :&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li style="text-align: justify;"&gt;Mettre en place un Nexus.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Mettre en place un système d'authentification pour l'administration du Nexus.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Réutiliser le &amp;nbsp;référentiel d'utilisateur de l'entreprise.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Ne pas ouvrir l'administration de Nexus à tous les utilisateurs présents dans l'AD mais seulement à un groupe.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Une documentation très bien faite est mise à disposition par Sonatype &lt;a href="http://www.sonatype.com/books/nexus-book/reference/ldap-sect-configuring.html"&gt;Ici.&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Le problème n'est pas dans la qualité de la documentation mais se brancher sur un AD par l'intermédiaire de LDAP n'est jamais simple : beaucoup d'options, de paramétrages, des contenu dans les référentiels LDAP très différents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;Etape 1 : Obtenir un accès&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Avant de commencer, il faut obtenir un utilisateur/mot de passe qui soit capable de naviguer en lecture au sein de l'AD. En général, il faut créer ou faire créer un utilisateur générique par lequel vos applicatifs (comme Nexus) viendront interroger votre AD.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Une fois cet utilisateur en poche (ça peut prendre du temps à avoir ce genre de choses...) , je vous conseille de le tester avec un &lt;a href="http://www.google.fr/search?ie=UTF-8&amp;amp;q=browser+ldap"&gt;browser LDAP&lt;/a&gt;. Je me suis servi d'&lt;a href="http://directory.apache.org/studio/"&gt;Apache Directory Studio&lt;/a&gt;. Il est Open Source et c'est une application RCP. Bref, il fait plutôt bien le job.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il vous suffit donc de créer une connexion (host et port de l'AD, user, password) et hop vous pouvez naviguer à l'intérieur.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il faut aussi créer un groupe AD et y rattacher les utilisateurs à qui vous souhaitez donner l'accès à l'administration de Nexus. Votre AD possède peut être déjà un groupe qui correspond à la population qui vous&amp;nbsp;intéresse. Vous pouvez dans ce cas le réutiliser. Pour la suite de l'article, nous&amp;nbsp;appellerons&amp;nbsp;ce groupe "&lt;u&gt;&lt;i&gt;equipe-de-developpement&lt;/i&gt;&lt;/u&gt;".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mais ça n'est pas fini...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;Etape 2 : Obtenir une bonne vision de l'arborescence de l'AD&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Le plus important et de récupérer l'adresse LDAP racine dans laquelle tous les utilisateurs se trouvent. Nous&amp;nbsp;l’appellerons&amp;nbsp;pour la suite de l'article "&lt;u&gt;&lt;i&gt;l'adresse racine utilisateur&lt;/i&gt;&lt;/u&gt;".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;par exemple :&amp;nbsp;CN=Users,DC=votreDomaine,DC=com&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mais ça n'est pas fini...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;Etape 3 : configurer la partie LDAP de Nexus&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Connectez-vous en admin sur Nexus et déplacez-vous dans la partie Security &amp;gt; "LDAP Configuration" accessible&amp;nbsp;depuis le menu latéral gauche. C'est parti pour la partie conf :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li style="text-align: justify;"&gt;Connection : (permet de définir les&amp;nbsp;paramètres&amp;nbsp;de&amp;nbsp;connexion&amp;nbsp;à l'AD)&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Protocol&lt;/u&gt; : Ldap&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Hostname&lt;/u&gt; : adresse de l'AD (le même que vous avez utilisé avec botre browser LDAP).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Port&lt;/u&gt; : port de l'AD (en général c'est 389).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Search Base&lt;/u&gt; : c'est l'adresse par défaut à partir de laquelle le requêtage LDAP se fera une fois connecté. Remplissez le avec &lt;u&gt;&lt;i&gt;l'adresse racine utilisateur&lt;/i&gt;&lt;/u&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;li style="text-align: justify;"&gt;Authentication : (permet de définir la manière dont Nexus s'authentifie sur l'AD)&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Authentication method&lt;/u&gt; : Choisir "Simple Authentication"&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;SASL Realm&lt;/u&gt; &amp;nbsp;: laisser vide.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Username&lt;/u&gt; : le username de votre utilisateur générique ayant accès en lecture à AD.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Password&lt;/u&gt; :&amp;nbsp;le password de votre utilisateur générique ayant accès en lecture à AD.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Vous pouvez faire un "check authentication". Si tout est ok vous devez avoir un "LDAP connection and authentication test completed successfully."&amp;nbsp;Ça&amp;nbsp;veut dire que votre Nexus sait se connecter à votre AD.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li style="text-align: justify;"&gt;User Element mapping : (permet de définir la manière dont Nexus va vérifier si un user existe)&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Base DN&lt;/u&gt; : laisser vide (si vous avez bien renseigné dans la partie connection que l'adresse par défaut de requêtage est bien &lt;i&gt;&lt;u&gt;l'adresse racine utilisateur&lt;/u&gt;&lt;/i&gt;).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;User Subtree&lt;/u&gt; : à cocher.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Object Class&lt;/u&gt; : Saisir "Person", c'est le type d'objet LDAP contenant les utilisateurs.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;User ID Attribute&lt;/u&gt; : Il faut indiquer le nom de l'attribut LDAP qui contient les logins utilisateurs AD. Saisir : "sAMAccountName"&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Real Name Attribute&lt;/u&gt; : Il faut indiquer le nom de l'attribut&amp;nbsp;LDAP qui contient le nom complet des utilisateurs AD. Saisir : "displayName".&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;E-Mail Attribute&lt;/u&gt; : Il faut indiquer&amp;nbsp;le nom de l'attribut LDAP qui contient l'adresse mail des utilisateurs AD. Saisir : "mail".&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Password Attribute&lt;/u&gt; : Il faut indiquer&amp;nbsp;le nom de l'attribut qui contient le mot de passe des utilisateurs AD. Laisser vide (c'est un attribut par défaut).&lt;/li&gt;&lt;/ul&gt;&lt;li style="text-align: justify;"&gt;Group Element Mapping : (permet de définir&amp;nbsp;la manière donc Nexus va récupérer la liste des groupes).&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Group Type&lt;/u&gt; : Saisir "Dynamic Groups". Il y a 2 types de groupes LDAP : un groupe dynamique correspondant à un attribut dans un objet "user" LDAP. Un groupe statique, c'est le contraire, c'est la référence à une liste d'utilisateurs dans un objet LDAP "group". Avec AD, à priori, quand un groupe est créé il l'est en statique et dynamique. Autant donc choisir dynamique car il y a beaucoup moins de configuration ;-).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;u&gt;Member Of Attribute&lt;/u&gt; : Il faut indiquer le nom de l'attribut LDAP dans lequel un groupe dynamique est défini. Saisir : "memberOf".&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Vous pouvez faire un "Check User Mapping". Si tout est ok, Nexus vous affiche un début de liste d'utilisateurs qu'il a réussi à&amp;nbsp;requêter.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;N'oubliez pas de faire "save" :-)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mais ça n'est pas fini...&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Etape 5 : Mapper votre groupe AD avec un&amp;nbsp;rôle&amp;nbsp;NEXUS.&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il faut maintenant configurer à Nexus pour que les utilisateurs de votre groupe AD &lt;i style="text-decoration: underline;"&gt;equipe-de-developpement&lt;/i&gt;&amp;nbsp;correspondent à un rôle dans Nexus, par exemple "Administrateur Nexus".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Déplacez-vous dans la partie "Roles" accessible&amp;nbsp;depuis le menu latéral gauche :&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li style="text-align: justify;"&gt;Sélectionner "Add" &amp;gt; "External Role Mapping"&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Realm : choisir "LDAP"&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Role : La liste des rôle LDAP de votre AD doit être présente. choisir votre groupe &lt;u&gt;&lt;i&gt;equipe-de-developpement&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Ajouter ensuite le Rôle associé en cliquant sur "add"&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Cocher le "Nexus Administrator Role"&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Cliquer sur OK&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Mais ça n'est pas fini...&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Etape 6 : activer l'authentification LDAP pour Nexus&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il faut maintenant simplement activer l'authentification par LDAP. Je dis "simplement", mais j'ai cherché un bout de temps avant de comprendre pour tout ça ne marchait pas ;-).&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Déplacez-vous dans la partie "Administration" &amp;gt; "Server" accessible&amp;nbsp;depuis le menu latéral gauche :&lt;/div&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li style="text-align: justify;"&gt;Dans la partie "Security Settings": déplacer "OSS LDAP Authentication Realm" de "Available Realms" vers "Selected Realms".&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;That's all...&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-3078992149533960651?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/3078992149533960651/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=3078992149533960651' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3078992149533960651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3078992149533960651'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2012/01/brancher-nexus-sur-active-directory.html' title='Brancher Nexus sur Active Directory (LDAP)'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-3328331003049894809</id><published>2012-01-13T10:25:00.000+01:00</published><updated>2012-01-13T10:25:36.406+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Agilité par contamination</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1kj8FfsKECo/Tw_wTTulgRI/AAAAAAAACHo/mfCnXKiNnW0/s1600/radiation1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-1kj8FfsKECo/Tw_wTTulgRI/AAAAAAAACHo/mfCnXKiNnW0/s200/radiation1.jpg" width="190" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Lorsqu'on souhaite mettre en oeuvre &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)" target="_blank"&gt;Scrum&lt;/a&gt; la première fois, il est souvent dit de mettre en place la totalité du framework et dans un second temps de l'adapter quand l'ensemble des acteurs possèdent le recul&amp;nbsp;nécessaire&amp;nbsp;(pour justement l'adapter favorablement). Cette mise en place totale a pour but de ne pas tomber dans les fameux "&lt;a href="http://www.scrum.org/scrumbut" target="_blank"&gt;Scrum But&lt;/a&gt;", souvent cause de l'échec de la mise en place de Scrum. Les "&lt;a href="http://www.scrum.org/scrumbut" target="_blank"&gt;Scrum But&lt;/a&gt;" pour simplifier représentent les entorses au framework (Exemple : c'est le ScrumMaster qui fait les estimations et affectent les tâches, oui ça c'est de la très grosse entorse ;-)).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;Je vous propose ici de vous raconter un de mes retours d'expérience sur le sujet qui est très différent de l'approche dont je viens de vous parler.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Il y a bientôt un an, j'ai intégré une équipe de développement chez un éditeur logiciel qui ne pratiquait pas "l'agilité". Ce nouvel environnement me paraissait idéal pour mettre en place Scrum couplé avec un peu&amp;nbsp;d’&lt;a href="http://en.wikipedia.org/wiki/Extreme_programming" target="_blank"&gt;Extrême&amp;nbsp;Programming&lt;/a&gt; pour plusieurs raisons :&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;une petite structure (moins de 25 personnes).&lt;/li&gt;&lt;li&gt;une équipe de développement de moins de 6 personnes.&lt;/li&gt;&lt;li&gt;une forte croissance.&lt;/li&gt;&lt;li&gt;la volonté de développer une nouvelle version d'un produit.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Il faut avouer que Scrum est très déroutant dans ces pratiques quand on ne les a jamais mises en oeuvre. Comme&amp;nbsp;je ne m'appelle pas&amp;nbsp;&lt;a href="http://jeffsutherland.com/" target="_blank"&gt;Jeff Sutherland&lt;/a&gt;&amp;nbsp;(un des papas de Scrum) et que je ne suis pas un&amp;nbsp;extrémiste&amp;nbsp;(enfin j'estime ne pas l'être, ce qui est différent, je vous l'accorde), je n'ai pas forcé pour la mise en place de Scrum.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En revanche, je travaillais sur un sujet isolé et avec une liberté totale sur ma façon de travailler. J'ai donc fait du Scrum et de l'Xp seul (ok ce n'est pas vraiment du Scrum). Tiens ça me fait penser à &lt;a href="http://www.youtube.com/watch?v=zuNmzTLwjcc" target="_blank"&gt;Jean Jacques&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hey hop, c'est parti, je récupère un tableau en carton, j'ai un mur juste derrière moi,&amp;nbsp;impeccable, &amp;nbsp;ça sera mon scrum board. Un petit tour par la compta : "Heu, vous auriez des post-its? Ha, vous n'avez que cette couleur, ok ça ira très bien pour commencer. Vous pouvez en commander d'autres? et de plusieurs couleurs?".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9Kd4JoIURXE/Tw_v8Fi7wJI/AAAAAAAACHg/f5t9P-E1Xy8/s1600/scrum-board-perso.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-9Kd4JoIURXE/Tw_v8Fi7wJI/AAAAAAAACHg/f5t9P-E1Xy8/s320/scrum-board-perso.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Un ou deux jours passent...&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Réaction 1 : "Ha c'est comme ça que tu travailles?"&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Réaction 2 : "C'est jolie tous ces post-its&amp;nbsp;derrière&amp;nbsp;toi, c'est quoi, ça marche comment?"&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Côté pratique d'ingénierie, pas d'intégration continue, pas de &lt;a href="http://en.wikipedia.org/wiki/Distributed_revision_control" target="_blank"&gt;DVCS&lt;/a&gt; (en tous cas pas celui que je voulais :-)), pas de suivi de qualité, pas de déploiement continu. Ok, qu'à cela ne tienne, "Just Do It". C'est parti pour mettre en place une forge logicielle complète sur une machine virtuelle dans un coin de serveur (&lt;a href="http://httpd.apache.org/" target="_blank"&gt;apache&lt;/a&gt;, &lt;a href="http://jenkins-ci.org/" target="_blank"&gt;jenkins&lt;/a&gt;, &lt;a href="http://git-scm.com/" target="_blank"&gt;git&lt;/a&gt;, &lt;a href="http://www.sonarsource.org/" target="_blank"&gt;sonar&lt;/a&gt;, &lt;a href="http://maven.apache.org/" target="_blank"&gt;maven&lt;/a&gt;, ...).&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Réaction 3 : "C'est quoi l'intégration continue?"&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;J'avais maintenant tous les outils que je souhaitais pour développer. C'est parti. Les semaines passent, les post-its s'entassent...&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Réaction 4 : "C'est pas mal ton tableau avec les post-its pour voir l'avancement du travail"&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A force de question et de discussion autour de Scrum avec l'équipe de développement, je me propose de leur faire une présentation de Scrum. C'est parti pour une présentation de 2h très conviviale. L'objectif est de faire découvrir les principes du framework. Rien de plus.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Réaction 5 : "C'est vraiment très différents, ça n'est pas du tout aujourd'hui notre façon de travailler, ça fait un peu peur"&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Les semaines passent... et qu'est-ce que je vois sur le bureau du collègue à côté de moi, &lt;a href="http://www.aubryconseil.com/pages/Livre-Scrum" target="_blank"&gt;le livre "Scrum"&lt;/a&gt; de &lt;a href="http://www.aubryconseil.com/" target="_blank"&gt;Claude Aubry&lt;/a&gt;. Je lui dis que c'est un super bouquin qu'il a bien fait de l'acheter.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Réaction&amp;nbsp;6 : "C'est ma compagne qui me l'a acheté car je lui avais parlé de la présentation que tu avais faite"&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Alors là je suis scotché!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Les semaines passent... et un gros sujet à traiter par toute l'équipe nous tombe dessus. On ne sait pas par quel bout le prendre. Je propose aux membres de l'équipe qui connait le mieux le sujet de faire un &lt;a href="http://en.wikipedia.org/wiki/Mind_map" target="_blank"&gt;mind map&lt;/a&gt; pour modéliser le travail à effectuer ainsi qu'une réunion tous ensemble où l'on ajuste le Mind Map pour tous obtenir une bonne vision de ce qu'on va devoir faire. &amp;nbsp;J'extrais ensuite le contenu du Mind Map dans un fichier Excel.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;u&gt;Réaction 7 : "C'est un peu comme un Backlog ce fichier Excel, non?"&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Je l'ai ensuite renommé en "Backlog".&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Réaction 8 : "Par quoi on commence?"&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Je propose de refaire une réunion avec toute l'équipe pour qu'on priorise les sujets/tâches tous ensemble pour traiter les tâches les plus urgentes.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Réaction 9 : "On priorise tout, tout de suite?"&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Je propose alors de faire un point tous ensemble toutes les semaines et de prioriser/reprioriser les sujets.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;i&gt;Réaction 10 : "On migre les applis existantes sur git"?&lt;/i&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Yes!&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;i&gt;Réaction 11 : "Comment on fait pour rajouter un Job dans Jenkins"?&lt;/i&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Yes! Je te montre!&lt;br /&gt;&lt;br /&gt;Les semaines passent... et je discute avec le directeur général. Il m'apprend qu'il s'est documenté sur Scrum et les méthodes Agiles qu'il trouve ça très&amp;nbsp;intéressant&amp;nbsp;et qu'il souhaite qu'on fasse des petites réunions tous les matins.&lt;br /&gt;&lt;br /&gt;Aujourd'hui, nous ne pouvons pas dire que nous "faisons du Scrum" mais tous ce qui est mis en place nous aident réellement au quotidien.&amp;nbsp;L'utilisation d'un backlog et la réalisation du Daily Scrum du matin sont maintenant une évidence. J'espère que cette démarche (non préméditée) de contamination va se poursuivre.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Alors que je pensais que Scrum ne pouvait fonctionner sur le principe du tout ou rien, je me rends compte que l'agilité progressive est un&amp;nbsp;succès&amp;nbsp;dans notre cas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vous en pensez quoi?&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-3328331003049894809?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/3328331003049894809/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=3328331003049894809' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3328331003049894809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3328331003049894809'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2012/01/agilite-par-contamination.html' title='Agilité par contamination'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-1kj8FfsKECo/Tw_wTTulgRI/AAAAAAAACHo/mfCnXKiNnW0/s72-c/radiation1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-8717594176348420152</id><published>2011-12-13T10:52:00.000+01:00</published><updated>2012-01-12T15:32:23.012+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cassandra-unit'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Cassandra'/><category scheme='http://www.blogger.com/atom/ns#' term='hector'/><category scheme='http://www.blogger.com/atom/ns#' term='chtijug'/><title type='text'>Cassandra pour les développeurs Java</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Hier soir,&amp;nbsp;au&amp;nbsp;&lt;a href="http://chtijug.org/lily-et-cassandra-avec-outerthought-et-sarbacane-software-le-12-decembre/"&gt;Ch'ti JUG&lt;/a&gt;&amp;nbsp;il y a eu une double session sur NoSQL.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#!/stevenn"&gt;Steven Noels&lt;/a&gt;&amp;nbsp;a présenté en première partie &lt;a href="http://www.lilyproject.org/"&gt;Lily&lt;/a&gt;,&amp;nbsp;&amp;nbsp;une solution d'indexation basé sur HBase.&lt;br /&gt;En deuxième partie, j'ai effectué une présentation de "Cassandra pour les développeurs Java" où j'y ai abordé les principaux concepts de &lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt;, présenté &lt;a href="http://hector-client.org/"&gt;Hector&lt;/a&gt; et &lt;a href="https://github.com/jsevellec/cassandra-unit"&gt;cassandra-unit&lt;/a&gt;l e tout avec un peu de live coding.&lt;br /&gt;&lt;br /&gt;Voici les slides de cette présentation :&lt;br /&gt;&lt;br /&gt;&lt;div id="__ss_10571941" style="width: 425px;"&gt;&lt;strong style="display: block; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 12px; text-align: center;"&gt;&lt;a href="http://www.slideshare.net/jsevellec/cassandra-pour-les-dveloppeurs-java" target="_blank" title="Cassandra pour les développeurs java"&gt;Cassandra pour les développeurs java&lt;/a&gt;&lt;/strong&gt; &lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/10571941" width="425"&gt;&lt;/iframe&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;&lt;div style="text-align: center;"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jsevellec" target="_blank"&gt;jsevellec&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Ça&amp;nbsp;a été une bien belle soirée et un after bien sympa et convivial :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-EcD9AbwpjQs/TuceIcZXoDI/AAAAAAAACHQ/ac442tKXf4Y/s1600/photo.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-EcD9AbwpjQs/TuceIcZXoDI/AAAAAAAACHQ/ac442tKXf4Y/s320/photo.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;@bientôt à une autre session du Ch'ti Jug!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-8717594176348420152?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/8717594176348420152/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=8717594176348420152' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8717594176348420152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8717594176348420152'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2011/12/cassandra-pour-les-developpeurs-java.html' title='Cassandra pour les développeurs Java'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-EcD9AbwpjQs/TuceIcZXoDI/AAAAAAAACHQ/ac442tKXf4Y/s72-c/photo.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4958107618933636982</id><published>2011-10-04T17:13:00.001+02:00</published><updated>2011-10-06T11:04:44.191+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Cassandra'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><title type='text'>Cassandra : Les problématiques à traiter lorsqu'on développe une application java</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt; fait parti de la famille des bases de données &lt;a href="http://fr.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt;. C'est une base de données dont on entend de plus en plus parler dès que l'on est confronté à devoir gérer de gros volumes de données, à être très performant et à vouloir monter en charge facilement.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;De part sa conception, Cassandra a été nativement pensé pour être hautement distribué, hautement performant et avec une forte capacité de montée en charge.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cassandra est une très belle implémentation du modèle p2p. Tous les noeuds au sein d'un Cluster Cassandra ont le même rôle. Il n'y a pas de notion de&amp;nbsp;maître/esclave...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bref, Je ne vais pas vous énumérer les avantages à utiliser Cassandra car d'autres l'ont déjà très bien fait avant moi. Vous trouverez sur &lt;a href="http://wiki.apache.org/cassandra/ArticlesAndPresentations"&gt;le wiki de Cassandra&lt;/a&gt; un ensemble de liens vers des présentation qui &amp;nbsp;décriront les concepts clés autour de Cassandra.&amp;nbsp;Juste un dernier mot pour vous dire que Cassandra va bientôt sortir en v1.0.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Une fois votre choix arrêté : "ok, on part sur Cassandra", quelles sont les problématiques auxquels vous allez être confronté lors de sa mise en oeuvre? Je vais tenter d'apporter quelques réponses... C'est parti!&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Design de votre modèle de données :&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Une des premières choses à faire quand on commence à travailler avec Cassandra, c'est d'oublier tout ce qu'on vous a dit et ce que vous faisiez avec une base de données&amp;nbsp;relationnelle : Le&amp;nbsp;maître&amp;nbsp;mot est &lt;u&gt;dénormalisation&lt;/u&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cassandra propose un modèle orienté "Column Family" inspiré par &lt;a href="http://labs.google.com/papers/bigtable.html"&gt;BigTable&lt;/a&gt; de Google. Je vous conseille dans un premier temps de bien comprendre le modèle de Cassandra (Keyspace, ColumnFamily, Column, SuperColum, Counter) avant de vous lancer.&amp;nbsp;&lt;a href="http://www.datastax.com/docs/0.8/ddl/index"&gt;La documentation de DataStax&lt;/a&gt; sur le sujet ainsi que &lt;a href="http://wiki.apache.org/cassandra/DataModel"&gt;l'article sur le wiki &lt;/a&gt;sont un bon point départ.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Une fois le modèle de Cassandra compris, il faut axer la réflexion sur la façon dont vous allez&amp;nbsp;requêter&amp;nbsp;vos données. Le système de requêtage de Cassandra est limité (pas de jointures par exemple...). Il faut donc commencer par là pour être sûr de pouvoir faire ce que l'on veut faire.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Installer&amp;nbsp;et&amp;nbsp;paramétrer&amp;nbsp;un cluster Cassandra&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La force de Cassandra est de fonctionner avec un grand nombre de noeud dans un cluster. Le plus gros cluster dont j'ai entendu parler (dans &lt;a href="http://twit.tv/show/floss-weekly/183"&gt;cette interview&lt;/a&gt; de &lt;a href="http://twitter.com/spyced"&gt;Jonathan Ellis&lt;/a&gt;) serait constitué de 400 noeuds... Juste énorme. Sans aller jusque là, il faut malgré tout rapidement vous familiariser avec le fonctionnement et l'administration d'un cluster Cassandra. Bref, il faut mettre les mains dedans. Je vous conseille &lt;a href="http://posulliv.github.com/2009/09/07/building-a-small-cassandra-cluster-for-testing-and-development.html"&gt;cet article&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.screenr.com/5G6"&gt;cette video&lt;/a&gt;&amp;nbsp;ou encore &lt;a href="http://www.datastax.com/docs/0.8/install/cluster_init"&gt;cette documentation&lt;/a&gt; DataStax&amp;nbsp;décrivant la mise en oeuvre rapide d'un cluster cassandra. Cassandra fonctionne aussi en Single Node, cela peut toujours servir en terme de développement mais j'y reviendrai plus tard.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il vous faut aussi comprendre le fichier de configuration principal de chaque noeud Cassandra : cassandra.yaml. Voici &lt;a href="http://www.datastax.com/docs/0.8/configuration/node_configuration#cassandra-yaml"&gt;sa documentation&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si vos serveurs acceptent le packaging Debian, Je vous conseille fortement d'utiliser &lt;a href="http://www.datastax.com/docs/0.8/install/install_package#installing-cassandra-debian-packages"&gt;celui&lt;/a&gt; proposé par Cassandra. Il vous permettra très rapidement de l'installer et surtout de le mettre à jour facilement!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il faut aussi un peu de moyens... Pour pouvoir faire des tests sur votre cluster, il faut un environnement machines permettant de mettre en valeurs les capacités de Cassandra. Cela permet aussi pour vous rassurer avec des tests de performances valables avant d'arriver dans un environnement de production. La virtualisation de plusieurs noeuds sur un ("petit") serveur ne permettra pas de faire des tests de performances concluants.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Administrer et monitorer un cluster Cassandra&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cassandra fournit nativement un ensemble d'outils permettant d'administrer votre cluster :&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.datastax.com/docs/0.8/dml/using_cli"&gt;cassandra-cli&lt;/a&gt; : c'est l'utilitaire en ligne de commande permettant de lire/ecrire dans votre cluster&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.datastax.com/docs/0.8/operations/monitoring#monitoring-using-nodetool"&gt;nodetool&lt;/a&gt; : c'est l'utilisaire en ligne de commande permettant de monitorer et administrer les noeuds du cluster&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;En plus de ça, DataStax propose une application Web de monitoring et d'administration de votre cluster Cassandra : &lt;a href="http://www.datastax.com/products/opscenter"&gt;OpsCenter&lt;/a&gt;. C'est vraiment un superbe outil. Il y a une version gratuite pour le développement. J'ai cru comprendre (mais je me trompe peut être) qu'il y aura bientôt aussi une version production gratuite mais qui ne l'est pas pour le moment.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Gérer le "Eventuellement&amp;nbsp;Consistant"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Cassandra propose un modèle "Eventuellement Consistant". Ces mots doivent normalement mettre la puce à l'oreille à n'importe quel développeur et faire un peu peur.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;Pour faire simple, selon &lt;a href="http://en.wikipedia.org/wiki/CAP_theorem"&gt;le théorème CAP&lt;/a&gt;, il n'est pas possible d'avoir à la fois de la consistance (Consistency) , de la disponibilité (Availability) et une résistance au&amp;nbsp;morcellement&amp;nbsp;(Partition tolerance). Il n'est possible que d'en avoir 2 sur 3. Cassandra a choisi de mettre l'accent sur le "A" et le "P" et d'offrir la possibilité de choisir son niveau de consistance. Il est donc possible d'avoir un consistance forte avec Cassandra mais au détriment d'une dégradation du temps de latence (car il faut demander à plus de noeud dans le cluster de se mettre d'accord sur la valeur d'une donnée lors d'une lecture par exemple).&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il y est donc possible de choisir parmi plusieurs niveaux de consistances. Voici &lt;a href="http://www.datastax.com/docs/0.8/dml/data_consistency#tunable-consistency"&gt;une documentation&lt;/a&gt; sur le site de DataStax sur le sujet pour vous guider dans votre choix.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Lock&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Cassandra ne sait pas faire de Lock. C'est un inconvénient lié à son architecture. Il ne permet donc pas&amp;nbsp;d’empêcher&amp;nbsp;plusieurs clients de lire ou d'écrire un ensemble données&amp;nbsp;portant&amp;nbsp;sur les mêmes clés de votre modèle au même moment. Ce qui peut être fortement&amp;nbsp;gênant, il ne faut pas le nier... Dans ce cas : "la réponse est ailleurs".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il n'est pas impossible de faire du lock sur vos données mais en utilisant un système externe qui va gérer cela. &lt;a href="http://zookeeper.apache.org/"&gt;Zookeeper&lt;/a&gt; va vous permettre de faire cela. C'est un&amp;nbsp;système&amp;nbsp;de synchronisation distribué de type sémaphore qui va vous permettre de faire des locks. Zookeeper&amp;nbsp;n’entraîne&amp;nbsp;pas de SPOF car il fonctionne aussi en cluster.&amp;nbsp;&lt;a href="http://code.google.com/p/cages/"&gt;Cage&lt;/a&gt;&amp;nbsp;est une libraire Java qui s'appuie sur zookeeper et propose un système de lock basé sur des chemins. Voici &lt;a href="http://ria101.wordpress.com/2010/05/12/locking-and-transactions-over-cassandra-using-cages/"&gt;un article&lt;/a&gt; qui vous explique en détail son utilité pour compléter l'utilisation de Cassandra.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Transaction&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ok, vous faites du lock mais lock ne veut pas dire transaction... Cassandra assure une atomicité des données au niveau d'une même clé (même dans des columnFamily différentes). En revanche, comment faire si vous avez besoin d'une atomicité de données sur plusieurs clés car vos données sont&amp;nbsp;fortement&amp;nbsp;couplés et que vous ne pouvez pas faire autrement.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La réponse est "Just do it (yourself)". Une des approches est de mettre en oeuvre un système de transaction log dans une columnFamily dédiée. Le principe est donc :&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li style="text-align: justify;"&gt;de logger la transation en sérialisant les données qui ont besoin d'être atomiques (json, xml, ...) et en insérant le résultats de la sérialisation en une fois dans une colonne d'une columFamily.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;effectuer votre traitement en insérant vos données dans votre modèle.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;de marquer ou supprimer la log de la transaction une fois le traitement terminé.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Ce système vous donne alors la possibilité de rejouer la log de la transaction si un souci est survenu pendant votre traitement. Ce système est abordé dans &lt;a href="http://www.slideshare.net/mattdennis/cassandra-data-modeling"&gt;cette présentation&lt;/a&gt; (à partir du slide 24).&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Comment dialoguer avec Cassandra&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Cassandra expose toute son Api cliente via &lt;a href="http://thrift.apache.org/"&gt;Thrift&lt;/a&gt;. L'utilisation native de thrift est déconseillée car c'est plutôt une Api de bas niveau s'adressant à des clients développeur plutôt qu'à des applications clientes.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il faut donc choisir votre client pour vous adresser à Cassandra : Ils sont listés &lt;a href="http://wiki.apache.org/cassandra/ClientOptions"&gt;ici&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En java, il en existe plusieurs. &lt;a href="http://rantav.github.com/hector/build/html/index.html"&gt;Hector&lt;/a&gt; semble clairement le plus utilisé et le plus configurable. C'est celui que j'utilise.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Environnement de développement&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Si vous utilisez maven, la plupart des librairies dont vous avez besoin sont mavenisées et disponibles dans les repository centraux (l'exception est Cage qui&amp;nbsp;nécessite&amp;nbsp;de déclarer un repository spécifique).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vous aimez faire des tests unitaires et du TDD, pas de problèmes, c'est possible et ça se fait même très bien.&amp;nbsp;Il est possible de lancer Cassandra et Zookeeper de façon "embedded" dans votre JVM.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il est même possible si vous le souhaitez de lancer Cassandra de façon embarquée et d'y charger des données avant&amp;nbsp;d’exécuter&amp;nbsp;vos tests unitaires. Je vous propose d'aller jeter un oeil du côté de &lt;a href="https://github.com/jsevellec/cassandra-unit/wiki"&gt;cassandra-unit&lt;/a&gt;&amp;nbsp;si vous&amp;nbsp;souhaitez&amp;nbsp;faire ça.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Ecosystème&amp;nbsp;en évolution permanente&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Que ce soit sur les fonctionnalités de Cassandra, son outillage, son&amp;nbsp;écosystème, il y a beaucoup de changements, d'évolutions et d'améliorations.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;De grosses et nouvelles fonctionnalités apparaissent constamment. Par exemple, il y a quelque mois, entre la version 0.7.8 et la 0.8.0, un langage de requêtage le "CQL" est apparu et très prochainement Cassandra sort en version 1.0...&amp;nbsp;Ça&amp;nbsp;va très vite.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il faut globalement rester en veille sur les blogs, twitter, les mailing list (Cassandra et Hector par exemple) pour voir ce qui se fait, ce qui sort. La communauté autour de Cassandra est grossissante et est très réactive.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Ne pas avoir peur de défaire&lt;/span&gt;&lt;br /&gt;Comme les choses changent et évoluent, Il ne faut pas avoir peur de jeter un peu, de modifier souvent, de refactorer beaucoup votre code. C'est dû soit à une évolution de compréhension de Cassandra qui vous fait dire qu'il faut mieux faire autrement, soit à l'apparition d'une nouvelle fonctionnalité soit à un lecture sur un blog...&lt;br /&gt;&lt;br /&gt;Il n'y a pas de secret, ma meilleure arme pour gérer ses changements sont : mes tests unitaires et mes tests d'intégrations et ça se passe bien!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Pour aller plus loin&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Vous pouvez aller jeter un oeil dans le code source de Cassandra sous svn &lt;a href="http://svn.apache.org/repos/asf/cassandra/trunk/"&gt;ici&lt;/a&gt;&amp;nbsp;ou sur le&amp;nbsp;miroir&amp;nbsp;sous Git &lt;a href="https://github.com/apache/cassandra"&gt;ici&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vous pouvez aller lire la documentation sur le wiki sur l'architecture interne de Cassandra &lt;a href="http://wiki.apache.org/cassandra/ArchitectureInternals"&gt;ici&lt;/a&gt;&amp;nbsp;et voir cette &lt;a href="http://blip.tv/datastax/cassandra-internals-5491363"&gt;vidéo&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vous pouvez contribuer en commençant &lt;a href="http://wiki.apache.org/cassandra/HowToContribute"&gt;ici&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Pour Conclure&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Utiliser Cassandra comme backend pour stocker vos données à un réel impact sur votre façon de développer votre application. C'est&amp;nbsp;quelque part&amp;nbsp;assez normal dans le sens si vous utilisez Cassandra, c'est que vous avez normalement beaucoup de données à gérer et qu'il faut de toute façon obligatoirement prendre ça en compte pour développer votre application...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Une fois les efforts produits, quel plaisir de rajouter un noeud dans le cluster pour monter en charge...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En fait, Cassandra, c'est très "DevOps" :-).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4958107618933636982?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4958107618933636982/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4958107618933636982' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4958107618933636982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4958107618933636982'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2011/10/cassandra-les-problematiques-traiter.html' title='Cassandra : Les problématiques à traiter lorsqu&apos;on développe une application java'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-5078374979208145638</id><published>2011-08-10T22:06:00.002+02:00</published><updated>2011-08-10T23:08:30.756+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cassandra'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>CassandraUnit : a Java test framework to develop with Cassandra</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hi everyone,&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Let me present you CassandraUnit!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Why?&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I work for few months on a new Java application with a &lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt; database backend.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As I'm A TDD Lover, I'd like to developp in a pure TDD Style combined with continuous integration system like Jenkins.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The difficulty when using a database backend is how to write isolated unit Test. One of solutions is to :&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;first : embed an instance of your database in your unit test.&lt;/li&gt;&lt;li&gt;next : load data into your database to setup your unit test.&lt;/li&gt;&lt;li&gt;finally : execute your test with your data.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In a Relational database world, there is some tools to help you like DBUnit. As Cassandra is a relatively young product (but so beautiful :-)), I didn't find some tools to help me doing what I want.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;CassandraUnit is born.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What does it do?&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;CassandraUnit, for now, does :&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;embed and start a Cassandra instance in your code if you want.&lt;/li&gt;&lt;li&gt;load data from a dataset (xml).&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;A very little example?&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create an xml dataset like that "simpleDataSet.xml" :&lt;/li&gt;&lt;/ul&gt;&lt;pre style="background: #ffffff; color: black;"&gt;&lt;span style="color: #004a43;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #004a43;"&gt;xml&lt;/span&gt; &lt;span style="color: #004a43;"&gt;version&lt;/span&gt;&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #008c00;"&gt;"1.0"&lt;/span&gt; &lt;span style="color: #004a43;"&gt;encoding&lt;/span&gt;&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"UTF-8"&lt;/span&gt; &lt;span style="color: #004a43;"&gt;standalone&lt;/span&gt;&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"yes"&lt;/span&gt;&lt;span style="color: #004a43;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;keyspace&lt;/span&gt; &lt;span style="color: #666616;"&gt;xmlns&lt;/span&gt;&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"&lt;/span&gt;&lt;span style="color: #666616;"&gt;http&lt;/span&gt;&lt;span style="color: purple;"&gt;:&lt;/span&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;//&lt;/span&gt;&lt;span style="color: #5555dd;"&gt;xml.dataset.cassandraunit.org&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;beautifulKeyspaceName&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;columnFamilies&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;columnFamily&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;beautifulColumnFamilyName&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;row&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;key&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;key10&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;key&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;column&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;name11&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;value&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;value11&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;value&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;column&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;column&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;name12&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;value&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;value12&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;value&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;column&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;row&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;row&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;key&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;key20&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;key&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;column&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;name21&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;name&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #a65700;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;value&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;value21&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;value&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;column&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;row&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;columnFamily&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;columnFamilies&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a65700;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #5f5035;"&gt;keyspace&lt;/span&gt;&lt;span style="color: #a65700;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;create a JUnit test case witch extends AbstractCassandraUnit4TestCase :&lt;/li&gt;&lt;/ul&gt;&lt;pre style="background: #ffffff; color: black;"&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;package&lt;/span&gt;&lt;span style="color: #004a43;"&gt; org&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;cassandraunit&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: #004a43;"&gt; static org&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;hamcrest&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;Matchers&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;is&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: #004a43;"&gt; static org&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;hamcrest&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;Matchers&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;notNullValue&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: #004a43;"&gt; static org&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;junit&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;Assert&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;assertThat&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: #004a43;"&gt; org&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;cassandraunit&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;dataset&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;IDataSet&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: #004a43;"&gt; org&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;cassandraunit&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;dataset&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;xml&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;ClassPathXmlDataSet&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: #004a43;"&gt; org&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;junit&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;&lt;span style="color: #004a43;"&gt;Test&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: maroon; font-weight: bold;"&gt;class&lt;/span&gt; AutomaticallyStartAndLoadSimpleDataSetTest &lt;span style="color: maroon; font-weight: bold;"&gt;extends&lt;/span&gt; AbstractCassandraUnit4TestCase &lt;span style="color: purple;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #808030;"&gt;@&lt;/span&gt;Override&lt;br /&gt;    &lt;span style="color: maroon; font-weight: bold;"&gt;public&lt;/span&gt; IDataSet getDataSet&lt;span style="color: #808030;"&gt;(&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt; &lt;span style="color: purple;"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: maroon; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: maroon; font-weight: bold;"&gt;new&lt;/span&gt; ClassPathXmlDataSet&lt;span style="color: #808030;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"simpleDataSet.xml"&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: purple;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #808030;"&gt;@&lt;/span&gt;Test&lt;br /&gt;    &lt;span style="color: maroon; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #bb7977;"&gt;void&lt;/span&gt; shouldHaveLoadASimpleDataSet&lt;span style="color: #808030;"&gt;(&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt; &lt;span style="color: maroon; font-weight: bold;"&gt;throws&lt;/span&gt; &lt;span style="color: #bb7977; font-weight: bold;"&gt;Exception&lt;/span&gt; &lt;span style="color: purple;"&gt;{&lt;/span&gt;&lt;br /&gt;        assertThat&lt;span style="color: #808030;"&gt;(&lt;/span&gt;getKeyspace&lt;span style="color: #808030;"&gt;(&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt;&lt;span style="color: #808030;"&gt;,&lt;/span&gt; notNullValue&lt;span style="color: #808030;"&gt;(&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;        assertThat&lt;span style="color: #808030;"&gt;(&lt;/span&gt;getKeyspace&lt;span style="color: #808030;"&gt;(&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt;&lt;span style="color: #808030;"&gt;.&lt;/span&gt;getKeyspaceName&lt;span style="color: #808030;"&gt;(&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt;&lt;span style="color: #808030;"&gt;,&lt;/span&gt; is&lt;span style="color: #808030;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"beautifulKeyspaceName"&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt;&lt;span style="color: #808030;"&gt;)&lt;/span&gt;&lt;span style="color: purple;"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: purple;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: purple;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;And now?&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;It was just a very little example. CassandraUnit allows to make more complex dataSet (Super column, type definition, ...).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I've just published it on github. It is published under LGPL v3.0 license.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The first release will be available on maven central repository in the coming hours.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As it's the first release, It probably still missing a lot of functionnality but it was time for me to published it.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;You want to go further?&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;and it's normal :-)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Here you can find more informations :&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;the github repository and doc (not a lot but a lot of tests) &amp;nbsp;of the framework :&amp;nbsp;&lt;a href="https://github.com/jsevellec/cassandra-unit"&gt;https://github.com/jsevellec/cassandra-unit&lt;/a&gt;&lt;/li&gt;&lt;li&gt;the github repository of examples is available here : &lt;a href="https://github.com/jsevellec/cassandra-unit-examples"&gt;https://github.com/jsevellec/cassandra-unit-examples&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;You can follow it on twitter @cassandraunit&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I hope it will help you as it helps me every day on my project.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-5078374979208145638?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/5078374979208145638/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=5078374979208145638' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/5078374979208145638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/5078374979208145638'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2011/08/cassandraunit-java-test-framework-to.html' title='CassandraUnit : a Java test framework to develop with Cassandra'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4986455129159511964</id><published>2010-12-31T17:46:00.001+01:00</published><updated>2010-12-31T18:19:50.177+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Il est beau mon scrum board</title><content type='html'>&lt;div style="text-align: justify;"&gt;Le scrum board est un élément central au niveau d'un projet agile.&amp;nbsp;Il est déjà fort utile sur des projets dit "non agile". Dans un contexte agile,&amp;nbsp;c'est tout simplement &lt;u&gt;&lt;b&gt;INDISPENSABLE&lt;/b&gt;&lt;/u&gt;. Cela ne sert à rien d'en dire plus à ce sujet!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;J'ai déjà pu lire des débats sur la forme qu'il doit prendre surtout dans des contextes un peu complexe d'équipes distribuées où il peut devenir numérique. Dans mon cas, sur un projet avec une équipe centralisée, on est resté très&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt; : un simple tableau blanc&amp;nbsp;aimanté&amp;nbsp;de 2m * 1m est&amp;nbsp;impeccable.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xTcJwT_7XDI/TR3ay-KJ-UI/AAAAAAAABwg/tsQsiXt8GOE/s1600/IMG_0714.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_xTcJwT_7XDI/TR3ay-KJ-UI/AAAAAAAABwg/tsQsiXt8GOE/s320/IMG_0714.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Scrum Wall&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Vous parler seulement de notre Scrum board est trop réducteur. Il faut que je vous parle de notre "Scrum Wall". Un tableau blanc est un peu juste pour tout ce dont nous avions besoin. Comme nous avions de la place, nous ne nous sommes pas privé.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Voici donc notre Scrum Wall :&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xTcJwT_7XDI/TR3gD8E6NYI/AAAAAAAABws/Q0z_rrDyJLg/s1600/scrum+wall2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_xTcJwT_7XDI/TR3gD8E6NYI/AAAAAAAABws/Q0z_rrDyJLg/s320/scrum+wall2.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La photo est prise après la fin du projet, le partie tableau blanc est un peu vide :-).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il est constitué (en partant du porte manteau, de gauche à droite) :&lt;/div&gt;&lt;ul&gt;&lt;li&gt;d'un A4 de rappel sur le daily Scrum :&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR3hoVpRwTI/AAAAAAAABww/UtvOhJKmLHU/s1600/photo+1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR3hoVpRwTI/AAAAAAAABww/UtvOhJKmLHU/s320/photo+1.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cette feuille n'était pas là au début, je l'ai rajoutée en cours de projet. Avec l'habitude du projet, nous oubliions parfois les fondamentaux. Ca fait toujours du bien de les avoir sous les yeux pendant notre Daily Scrum :-), même de dire que "je n'ai pas rencontré de&amp;nbsp;problème&amp;nbsp;particulier".&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;La partie gauche du tableau blanc :&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/TR3kvEzUm5I/AAAAAAAABw8/u-zVKRl4R24/s1600/photo+2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/TR3kvEzUm5I/AAAAAAAABw8/u-zVKRl4R24/s320/photo+2.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La partie gauche du tableau blanc est purement réservée au sprint.&amp;nbsp;Dans cette partie se trouvent 4 colonnes :&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- To do&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- In progress&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- QA&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- Done.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;J'ai dû rajouter une feuille en dessous car je n'arrivais pas à tout faire tenir sur une colonne pour un sprint. Haaa... ces équipes hyperproductives, je vous jure :-).&amp;nbsp;La dernière colonne de cette partie&amp;nbsp;hébergeait&amp;nbsp;un ensemble de zones qui ont évoluées au cours du temps. Nous avons commencé avec :&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- identification du sprint (numero et contenu)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- technique (problèmes)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- organisationnel (problèmes)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- RE7 (remontées d'infos suite à la recette)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pour au final terminer avec :&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- identification du sprint (numero et contenu)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- corbeille (permet de faire le ménage quand la colonne "Done" devient trop remplie sans pour autant enlever les tâches du sprint en cours du Scrum Board).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- Actions après rétro (actions à effectuer sur le sprint par rapport à la rétro précédente).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- Problèmes (tous)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- Stockage des&amp;nbsp;aimants&amp;nbsp;: il faut bien les mettre quelque part. Au lieu de les retrouver dans la zone des problèmes organisationnel par exemple...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La partie droite du tableau blanc :&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR3rucq-H0I/AAAAAAAABxA/ZXG9OTXP_vU/s1600/photo+3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR3rucq-H0I/AAAAAAAABxA/ZXG9OTXP_vU/s320/photo+3.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;C'est l'espace "temporaire", il sert un peu à ce qu'on veut. Comme vous pouvez le voir, comme la photo a été prise&amp;nbsp;après la fin du projet, l'emplacement est déjà "squatté" pour un autre projet.&amp;nbsp;Cette espace permettait de réfléchir ensemble, d'expliquer, de schématiser, d'y mettre les horaires de la prochaine démo et de la prochaine rétro.&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;La partie droite du mur :&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xTcJwT_7XDI/TR3ttVxLYYI/AAAAAAAABxE/hxrt1KkzsG0/s1600/photo+4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_xTcJwT_7XDI/TR3ttVxLYYI/AAAAAAAABxE/hxrt1KkzsG0/s320/photo+4.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;C'est le "A3 du projet". L'objectif est de proposer une vue synthétique du projet (la vision, les enjeux, la méthodologie, l'architecture globale, un mot sur Scrum, ...).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Et il manque??? Le burndown du Sprint que nous mettions entre le tableau blanc et le A3 du projet mais qui n'est plus là au moment des photos que j'ai prises.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Et en bonus, au dessus du tableau blanc, nous y avons mis des goodies que nous avions sur le projet, les cartes postales envoyées par les membres de l'équipe en congés,...&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Beau et "clean"&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Que vient donc faire la notion du "beau" dans un projet Scrum?&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Le principe d'affichage est à double tranchant. Il offre d'une part une transparence sur le projet et d'autre part justement, on ne peut rien cacher.&amp;nbsp;Les apparences sont trompeuses mais elles ne laissent pas forcément une bonne impression :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xTcJwT_7XDI/TR3yI84tA-I/AAAAAAAABxI/gs6lkyL6x60/s1600/2603.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_xTcJwT_7XDI/TR3yI84tA-I/AAAAAAAABxI/gs6lkyL6x60/s320/2603.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Vous y croyez vous si la personne qui possède cette chambre est&amp;nbsp;bibliothécaire? C'est possible mais c'est dur à croire avec cette seule vision:-)&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Vue de l'équipe : Le Scrum board est le seul outil qui permet aux membres de l'équipe de travailler&amp;nbsp;ensemble&amp;nbsp;de façon efficace sans se marcher dessus. De plus, c'est aussi cette même équipe qui s'en sert quotidiennement. le&amp;nbsp;désordre&amp;nbsp;attire le désordre et inversement!&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Vue de l'extérieur,&amp;nbsp;Scrum souffre parfois de son image.&amp;nbsp;Les clichés ont parfois la vie dure :&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;/div&gt;-Le framework Scrum est parfois vue comme une méthode de gestion de projet exotique mais qui n'est pas applicable. On en arrive même à préférer ne pas dire qu'on fait du Scrum...&lt;br /&gt;- "C'est quoi cette bande de rigolos qui joue avec des pos-its."&lt;br /&gt;- "Et en plus ils font un poker au boulot"&lt;br /&gt;&lt;div&gt;- "Cela manque de rigueur"&lt;br /&gt;&lt;div&gt;- On a parfois du mal à comprendre que le fun peut faire partie du boulot.&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si on associe à cela un Scrum Wall qui n'est pas "clean", on a dû mal à projeter un image de qualité logiciel sur ce qu'on livre...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il faut donc que le Scrum Wall soit beau!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;CQFD&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Des astuces&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Un "A3 projet" de qualité : Sa réalisation est un exercice&amp;nbsp;délicat&amp;nbsp;qui nécessite de prendre du recul et du temps mais il est la carte de visite de votre projet vu de l'extérieur. Il facilite aussi l'intégration d'un membre dans l'équipe ainsi que la présentation du projet.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;De la couleur :&amp;nbsp;N'hésitez&amp;nbsp;pas utiliser des couleurs différentes pour vos post-its d'un sprint à l'autre. En revanche, sur un sprint, essayez de vous y tenir.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Des couleurs et des tailles différentes : &amp;nbsp;Utilisez des post-its de tailles et de couleurs différents&amp;nbsp;permet d'identifier rapidement des fonctions différentes.&amp;nbsp;Nous utilisons par exemple des pos-its carré (76mm*76mm) pour décrire une User Story et des petits post-its rectangulaire (38mm*51mm)&amp;nbsp;d'une autre couleur pour les tâches.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Utilisez un stylo feutre pour écrire. Ca augmente la lisibilité.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Une petite illustration :&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR365Ldxs1I/AAAAAAAABxM/A7eiljsgtMo/s1600/photo.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR365Ldxs1I/AAAAAAAABxM/A7eiljsgtMo/s320/photo.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;en haut : BAD / en bas : GOOD&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Eviter d'avoir le post-it qui rebique :&amp;nbsp;&lt;a href="http://www.bouzin-agile.fr/?post/2010/10/15/Evitez-d-avoir-le-post-it-qui-rebique"&gt;http://www.bouzin-agile.fr/?post/2010/10/15/Evitez-d-avoir-le-post-it-qui-rebique&lt;/a&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://www.bouzin-agile.fr/?post/2010/10/15/Evitez-d-avoir-le-post-it-qui-rebique"&gt;&lt;/a&gt;Notez vos initiales sur les tâches en cours (ou un autre moyen d'identifier une personne sur une tâche en cours).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Faites le ménage régulièrement sur le Scrum Board: Est-ce que ce schéma est encore utile, est-ce que le problème est toujours d'actualité, ...&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Voici quelques illustrations de notre projet :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Un début de sprint (d'une semaine) :&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR3azVdhqaI/AAAAAAAABwk/Hwyik0H3fYQ/s1600/IMG_0715.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR3azVdhqaI/AAAAAAAABwk/Hwyik0H3fYQ/s320/IMG_0715.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Un sprint en cours (de 15jours, nous avons fait évoluer la durée de nos sprints) :&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR37z8ONQYI/AAAAAAAABxQ/1wT1PKVFf7w/s1600/IMG_0781.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_xTcJwT_7XDI/TR37z8ONQYI/AAAAAAAABxQ/1wT1PKVFf7w/s320/IMG_0781.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;(Nous remontions la colonne de gauche au fur et à mesure des Users Storys terminées en haut).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sur ce, bonne année à tous!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4986455129159511964?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4986455129159511964/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4986455129159511964' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4986455129159511964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4986455129159511964'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2010/12/il-est-beau-mon-scrum-board.html' title='Il est beau mon scrum board'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_xTcJwT_7XDI/TR3ay-KJ-UI/AAAAAAAABwg/tsQsiXt8GOE/s72-c/IMG_0714.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-259553298463384959</id><published>2010-12-28T11:41:00.001+01:00</published><updated>2010-12-28T13:43:46.924+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intégration continue'/><title type='text'>Intégration continue : "have fun" :-)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Je trouve que l'intégration continue est une pratique incontournable sur un projet de développement. Comme je l'avais déjà expliquée &lt;a href="http://jsevellec.blogspot.com/2009/02/causes-dechec-de-lintegration-continue.html"&gt;ici&lt;/a&gt;, la mise en place d'une démarche d'intégration continue peut ne pas prendre au niveau d'un projet de développement. Ce n'a pas été le cas sur le dernier projet auquel j'ai participé:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Un défi technique : tout doit être buildé&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La mise en place d'une démarche d'intégration continue est d'abord un défi technique (en tous cas, ça peut l'être). Dans le cadre du projet dont je vous parle, nous avons un ensemble de plateformes de développements ayant des processus de builds différents (exemple : application jEE, application Iphone, application Android).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Le premier défi est donc de réussir à faire fonctionner le système d'intégration continue sur des plateformes hétérogènes. Le but est d'éviter que des membres de l'équipe plus ou moins spécialisés sur une ou deux plateformes e&lt;/span&gt;t que celles-ci ne soient pas testées par l'intégration continue, seraient "à l'abri".&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Notre serveur d'intégration continue est Hudson et notre gestionnaire de sources est Subversion. Un couple qui fonctionne bien.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Nous n'avons pas de soucis pour mettre en place l'intégration continue sur les applications jEE car nous utilisons maven pour les builder.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;En ce qui concerne la plateforme Android, nous utilisons maven pour builder et signer l'application. L'intégration dans Hudson n'a pas posé de problème.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Le build Iphone est celui qui a été le plus complexe par rapport aux autres à mettre en place. Au final, avec un slave Hudson sur un de nos IMac et google comme ami pour trouver &lt;a href="http://fr.w3support.net/index.php?db=so&amp;amp;id=212999"&gt;ça&lt;/a&gt;, ça s'est malgré tout fait assez rapidement.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;Une fois de plus l'important est que tout soit buildé. Pour être transparent, on peut noter malgré tout des deltas sur le contenu des builds selon les plateformes. Par exemple, sur la plateforme Iphone, seul une compilation est effectuée alors que sur les applications jEE, il y a compilation, exécution des tests unitaires, execution des tests d'intégrations et déploiement.&lt;br /&gt;&lt;br /&gt;Hudson notifie tous les membres de l'équipe par mail sur un build failed ou fixed.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Un défi organisationnel : elle doit être adoptée par toute l'équipe&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;L'intégration continue c'est aussi et surtout une démarche et un fonctionnement d'équipe!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Comme je l'ai déjà dit, il ne sert à rien d'avoir une superbe plateforme d'intégration continue si un build cassé n'entraîne pas une mobilisation de l'équipe pour résoudre le&amp;nbsp;problème. Même si normalement l'intégration continue est un outil pour aider l'équipe, il est parfois vu comme un outil "gênant".&lt;br /&gt;&lt;br /&gt;Pour motiver l'équipe, il faut ajouter du fun :-). Le fun sur notre projet, pour simplifier, c'est d'être un peu ridicule le temps de corriger un build cassé.&amp;nbsp;Voici notre règle : si tu casses l'intégration continue, c'est toi qui porte le chapeau jusqu'à ce que le build soit réparé. Et quand on dit porter le chapeau, c'est au sens propre et il y a même le choix :&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xTcJwT_7XDI/TRivOx4toOI/AAAAAAAABv8/xMmLyLTuo94/s1600/chapeau.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_xTcJwT_7XDI/TRivOx4toOI/AAAAAAAABv8/xMmLyLTuo94/s320/chapeau.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Personne n'y a échappé sur le projet.&amp;nbsp;Comme vous allez pouvoir le constater, il y a des têtes à chapeau ou pas.... On retiendra le "ou pas" dans l'équipe... :-). Juste pour repositionner le contexte, nous évoluions à cette époque sur un open space de 30 à 40 personnes qui n'étaient pas concernées par ce projet...&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Au passage, merci à tous les membres de l'équipe d'avoir accepté que je publie les photos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Je vous laisse découvrir ce que cela peut donner&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Bon ok, je commence par moi :&lt;/div&gt;&lt;div style="text-align: center;"&gt;Une version sobre, discrete, ça passe presque&amp;nbsp;inaperçu :&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRixD9Jon2I/AAAAAAAABwA/qplsEBxNZZg/s1600/jeremy.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRixD9Jon2I/AAAAAAAABwA/qplsEBxNZZg/s320/jeremy.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Une version plus "je vous jure que c'est pas moi" :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xTcJwT_7XDI/TRixchug2RI/AAAAAAAABwE/QwazINhForI/s1600/alex.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_xTcJwT_7XDI/TRixchug2RI/AAAAAAAABwE/QwazINhForI/s320/alex.JPG" width="239" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Une version "pair programming", assez rare à obtenir :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRixyH7Bo2I/AAAAAAAABwI/q058lqk0nGM/s1600/yoann.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRixyH7Bo2I/AAAAAAAABwI/q058lqk0nGM/s320/yoann.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;version "total style" :&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRix_ZbQawI/AAAAAAAABwM/hv8QI1WaFD0/s1600/jeanphi.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRix_ZbQawI/AAAAAAAABwM/hv8QI1WaFD0/s320/jeanphi.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;version "j'assume" et en plus en vidéo :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-b5171247c4110dbc" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v20.nonxt1.googlevideo.com/videoplayback?id%3Db5171247c4110dbc%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330368101%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D45524B12FB4B88BE67F3CD14D84946B7B3F7D3F3.182C6D6D3821602F4831F6C12F6548427E740C2E%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Db5171247c4110dbc%26offsetms%3D5000%26itag%3Dw160%26sigh%3D76BG-GzQHgXGnvwFrcPl9bIVvSs&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v20.nonxt1.googlevideo.com/videoplayback?id%3Db5171247c4110dbc%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330368101%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D45524B12FB4B88BE67F3CD14D84946B7B3F7D3F3.182C6D6D3821602F4831F6C12F6548427E740C2E%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Db5171247c4110dbc%26offsetms%3D5000%26itag%3Dw160%26sigh%3D76BG-GzQHgXGnvwFrcPl9bIVvSs&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;version "faire abstraction, je suis au téléphone avec le client" :&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRizF1FdEuI/AAAAAAAABwQ/GfEl78h1eO8/s1600/tom.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRizF1FdEuI/AAAAAAAABwQ/GfEl78h1eO8/s320/tom.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;version "represent" :&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xTcJwT_7XDI/TRizfQoGUyI/AAAAAAAABwU/h7C7kKVVEus/s1600/quentin3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_xTcJwT_7XDI/TRizfQoGUyI/AAAAAAAABwU/h7C7kKVVEus/s320/quentin3.JPG" width="239" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;Au delà de ça, on va vu des comportements très intéressants émerger au niveau du projet :&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Le temps de découverte du build cassé était très court :&amp;nbsp;C'était en général un des membres de l'équipe qui venait&amp;nbsp;gentiment&amp;nbsp;déposer le chapeau sur la tête de la personne qui a cassé le build (le dernier commiteur). On devait être, la plupart du temps, en dessous des 30 secondes&amp;nbsp;après que la notification par mail du "build failed".&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Des temps de résolution de build cassé assez court aussi. De l'ordre de 15 minutes. C'est qu'en plus, ils grattent et ils tiennent chaud ces chapeaux :-)&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Le fun, c'est contagieux : Il se trouve que le projet voisin du notre sur l'open space faisait aussi de l'intégration continue, le principe du ridicule a été&amp;nbsp;réutilisé, je dirais même amélioré... Je vous laisse juger par vous même :&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRi40VZAv2I/AAAAAAAABwY/u8eIva7grJw/s1600/ludo.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRi40VZAv2I/AAAAAAAABwY/u8eIva7grJw/s320/ludo.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em; text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;Je crois qu'au final je&amp;nbsp;préfère&amp;nbsp;nos chapeaux :-).&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em; text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em; text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Tout ça pour dire&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em; text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;que l'intégration continue n'a pas été vécue comme une contrainte au niveau de l'équipe. Bien au contraire :&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em; text-align: left;"&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;c'était un moyen d'améliorer la qualité sur le projet (notamment la qualité des commits)&lt;/li&gt;&lt;li style="text-align: justify;"&gt;c'était un moyen d'avoir du fun sur le projet et le fameux "team spirit".&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-259553298463384959?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/259553298463384959/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=259553298463384959' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/259553298463384959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/259553298463384959'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2010/12/integration-continue-have-fun.html' title='Intégration continue : &quot;have fun&quot; :-)'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_xTcJwT_7XDI/TRivOx4toOI/AAAAAAAABv8/xMmLyLTuo94/s72-c/chapeau.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-1939577950066536272</id><published>2010-12-23T12:09:00.002+01:00</published><updated>2010-12-23T13:50:04.115+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Scrum Box : la caisse à outil d'un projet Scrum</title><content type='html'>Avez-vous déjà remarqué la rapidité avec laquelle vos pos-its, vos stylos et autres fournitures&amp;nbsp;disparaissent sur votre bureau. C'est d'autant plus&amp;nbsp;gênant&amp;nbsp;sur un projet utilisant Scrum car justement assez&amp;nbsp;gourmand&amp;nbsp;en fournitures.&lt;br /&gt;&lt;br /&gt;Pour éviter ça, j'ai créé sur notre projet la "Scrum Box" :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRMflJ_8muI/AAAAAAAABvw/t3D0_R-8EyA/s1600/photo+3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/TRMflJ_8muI/AAAAAAAABvw/t3D0_R-8EyA/s320/photo+3.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;C'est quoi donc "une Scrum box"? :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;On peut la voir comme la caisse à outil Scrum de notre projet.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xTcJwT_7XDI/TRMgzvPn-GI/AAAAAAAABv0/Ku3KagG3SHU/s1600/photo+2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_xTcJwT_7XDI/TRMgzvPn-GI/AAAAAAAABv0/Ku3KagG3SHU/s320/photo+2.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Qu'est-ce qu'elle contient :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Un assortiment de bloc de post-it carré 76mm*76mm. "les standards"&lt;/li&gt;&lt;li&gt;Un assortiment de bloc de pos-it rectangulaire 38mm*51mm. "les petits"&lt;/li&gt;&lt;li&gt;Un assortiment de marqueur pour tableau blanc.&lt;/li&gt;&lt;li&gt;Un assortiment de marqueur pour paper board.&lt;/li&gt;&lt;li&gt;Un ou deux stylos feutre.&lt;/li&gt;&lt;li&gt;Une dizaine de stylos à bille.&lt;/li&gt;&lt;li&gt;Un jeu de carte de Planning Poker.&lt;/li&gt;&lt;li&gt;l'adaptateur vga de mon mbp pour le video projecteur.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Elle doit être identifiée en tant que telle et porter le nom du projet!&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Qui s'en sert?&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;L'équipe et uniquement l'équipe! Il peut y avoir des dérogations si c'est demandé&amp;nbsp;gentiment&amp;nbsp;:-)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Quand s'en sert-on?&lt;/span&gt;&lt;br /&gt;Au quotidien, tous les membres de l'équipe viennent y piocher des post-its, prendre des stylos, et choses assez cool : les remettre une fois utilisé.&lt;br /&gt;&lt;br /&gt;Et plus particulièrement lors des rituels de début de de fin de sprints : Nous effectuons le sprint planning, la démo et la rétro dans une salle un étage en dessous de celui où nous travaillons. Dans cette box, j'ai quasiment tous ce qu'il me faut pour mener ces rituels.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Est-ce vraiment utile?&lt;/span&gt;&lt;br /&gt;Oui! C'est une évidence sur notre projet. On n'y prette même plus attention.&lt;br /&gt;On peut se poser la question de savoir si ça permet de ne pas se faire piquer les fournitures par d'autres collègue sur d'autres projets, hé bien oui ça marche et pourtant la box est en libre service et juste en carton.&lt;br /&gt;&lt;br /&gt;Avec elle, impossible d'avoir oublié son stylo lors d'un sprint planning!&lt;br /&gt;&lt;br /&gt;Cela me permet d'avoir un stock&amp;nbsp;intermédiaire et dédié au projet&amp;nbsp;de fournitures. Elle permet d'être "toujours prêt". Il y a déjà pas mal de chose à préparer et à transporter lors d'un rituel de début ou de fin de sprint (entre le portable, son chargeur, &amp;nbsp;le video projecteur, des éléments pour faire la démo, ...), la box simplifie le transport de toutes les fournitures :-).&lt;br /&gt;&lt;br /&gt;En tant que ScrumMaster sur le projet, ca a été un réel obstacle en moins pour moi ou pour les autres membres de l'équipe. Evidemment, il faut relativiser, il y a d'autres obstacles plus importants et plus compliqués à enlever sur un projet :-).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-1939577950066536272?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/1939577950066536272/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=1939577950066536272' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1939577950066536272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1939577950066536272'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2010/12/scrum-box-la-caisse-outil-dun-projet.html' title='Scrum Box : la caisse à outil d&apos;un projet Scrum'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xTcJwT_7XDI/TRMflJ_8muI/AAAAAAAABvw/t3D0_R-8EyA/s72-c/photo+3.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4251338215077277548</id><published>2010-12-23T09:56:00.000+01:00</published><updated>2010-12-23T09:56:43.876+01:00</updated><title type='text'>De retour!</title><content type='html'>J'ai délaissé un peu ce blog ces dernier temps. Ce n'est pas une volonté délibérée de ma part mais c'est plus dû à un manque de temps.&lt;br /&gt;&lt;br /&gt;Je travaille depuis 6 mois sur un projet passionnant à Norsys où j'interviens en tant que ScrumMaster. Vous trouverez plus d'infos sur ce projet &lt;a href="http://www.zegroom.fr/"&gt;ici&lt;/a&gt;. Il y a deux facteurs principaux qui en font pour moi un projet très&amp;nbsp;intéressant&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Une liberté de choix technologique : Sur ce projet, tout est centré sur le but à atteindre et non sur le comment l'atteindre.&lt;/li&gt;&lt;li&gt;"Have fun": Le facteur humain est super important. Une équipe motivée, un vrai "team spirit", la mise en oeuvre de&amp;nbsp;Scrum/XP et c'est le pied! Notre Daily Scrum a même été diffusé sur M6 Capital :-).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Les idées de posts ne manquent pas sur ces différents sujets! Promis, Je m'y mets!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4251338215077277548?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4251338215077277548/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4251338215077277548' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4251338215077277548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4251338215077277548'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2010/12/de-retour.html' title='De retour!'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-5685584315888052415</id><published>2010-03-08T15:11:00.000+01:00</published><updated>2010-03-08T15:11:09.463+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='pair programming'/><category scheme='http://www.blogger.com/atom/ns#' term='extreme programming'/><title type='text'>Intégrer un nouveau membre dans une équipe projet</title><content type='html'>On m'a récemment demandé si j'avais des suggestions ou des idées sur l'intégration d'un nouveau membre dans une équipe projet.&lt;br /&gt;&lt;br /&gt;J'ai évidemment directement suggérer de faire du &lt;a href="http://en.wikipedia.org/wiki/Pair_programming"&gt;Pair programming&lt;/a&gt;. Le pair programming est une des pratiques de &lt;a href="http://fr.wikipedia.org/wiki/Extreme_Programming"&gt;eXtreme Programming&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Les bénéfices du pair programming ne sont plus à démontrer mais cette pratique est particulièrement&amp;nbsp;intéressante&amp;nbsp;dans le cadre de l'intégration d'un nouvel arrivant dans une équipe :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;L'intégration se fait par l'exemple mais dans des conditions réelles.&lt;/li&gt;&lt;li&gt;Le nouveau membre a tout de suite une vision de comment faire&amp;nbsp;concrètement.&lt;/li&gt;&lt;li&gt;Le risque de "laisser" le nouveau travailler seul n'existe plus. (Principe du "je ferme les yeux, ça va passer, ça va passer...")&lt;/li&gt;&lt;li&gt;Pour le membre de la paire qui fait déjà parti du projet, il va devoir reprendre du recul par rapport à ce qu'il fait pour pouvoir répondre aux questions. Prendre du recul, c'est toujours favorable.&lt;/li&gt;&lt;li&gt;Le nouveau membre se sentira membre de l'équipe beaucoup plus rapidement.&lt;/li&gt;&lt;li&gt;Le nouveau membre sera "opérationnel" beaucoup plus rapidement.&lt;/li&gt;&lt;li&gt;Cela permet de ne pas se retrouver avec le nouveau membre, le jour de son arrivée, assis à un bureau sans rien faire sans login mot de passe et sans poste de travail... (si si, je vous vois sourire, ça arrive tout le temps, il doit d'ailleurs y avoir une "loi" derrière tout ça, c'est à creuser :-)).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Le principal argument qu'on peut entendre en général pour ne pas faire du pair programming :&amp;nbsp;&lt;/div&gt;&lt;div&gt;"Ça&amp;nbsp;va me couter du temps et donc de l'argent car&amp;nbsp;ça va monopoliser un membre de l'équipe."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La réponse à cela&amp;nbsp;est "c'est pas faux" pour ne pas dire "c'est pas vrai" :-) :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;L'intégration d'un nouveau membre dans une équipe à un coût. Il faut l'accepter. Cela n'a rien à voir avec le fait de faire du pair programming.&lt;/li&gt;&lt;li&gt;Ce coût est beaucoup moins facile à quantifier quand on laisse le nouveau membre se débrouiller car il est&amp;nbsp;dilué&amp;nbsp;(qualité moyenne des&amp;nbsp;premières&amp;nbsp;réalisations, temps de "parasitage" du nouveau membre envers l'équipe lorsqu'il aura besoin de savoir quelque chose, temps passé à corriger les anomalies découvertes des premières réalisations, ...)&lt;/li&gt;&lt;li&gt;Le membre de l'équipe qui va travailler en pair programming avec le nouveau n'arrête pas de développer, il va juste développer un peu moins vite (mais à contrario c'est directement quantifiable :-)).&lt;/li&gt;&lt;li&gt;Faire du pair programming, ne veut pas dire de faire que du pair programming. Il peut être&amp;nbsp;intéressant d'alterner pendant la durée d'intégration les phases de travail en paire et les phases en autonomie. Cela peut permettre au nouveau membre de monter sa plateforme de développement, de "digérer" la phase de travail en paire, de lire des documentations, de trouver une date pour payer son coup...&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: left;"&gt;Pair programming se dit en français &lt;a href="http://fr.wikipedia.org/wiki/Programmation_en_bin%C3%B4me"&gt;programmation en binôme&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-5685584315888052415?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/5685584315888052415/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=5685584315888052415' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/5685584315888052415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/5685584315888052415'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2010/03/integrer-un-nouveau-membre-dans-une.html' title='Intégrer un nouveau membre dans une équipe projet'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-1747179502205312633</id><published>2010-03-01T17:51:00.009+01:00</published><updated>2010-03-01T18:03:48.067+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='coding dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Coding Dojo en entreprise</title><content type='html'>&lt;div style="height: 0px;"&gt;&lt;div style="text-align: justify;"&gt;x&lt;/div&gt;&lt;/div&gt;&lt;div style="height: 0px;"&gt;&lt;div style="text-align: justify;"&gt;x&lt;/div&gt;&lt;/div&gt;&lt;div style="height: 0px;"&gt;&lt;div style="text-align: justify;"&gt;x&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;J'organise avec &lt;a href="http://blog.tartachuc.org/"&gt;Thomas&lt;/a&gt;, &lt;a href="http://walletguillaume.blogspot.com/"&gt;Guillaume&lt;/a&gt;&amp;nbsp;et &lt;a href="http://twitter.com/jhattat"&gt;Jay&lt;/a&gt;&amp;nbsp;(amis, collègues et membres de la direction technique de &lt;a href="http://www.norsys.fr/"&gt;Norsys&lt;/a&gt;)&amp;nbsp;des Coding Dojos en interne.&amp;nbsp;J'ai réalisé avec &lt;a href="http://walletguillaume.blogspot.com/"&gt;Guillaume&lt;/a&gt; un document descriptif / retour d'expérience sur l'organisation de ce type d'évènement.&amp;nbsp;En voici une adaptation :&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Un Coding Dojo,&amp;nbsp;Qu'est-ce que c'est ?&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Un Coding Dojo est une réunion où un ensemble de personnes se retrouvent pour travailler sur un défi de programmation de façon collective. Un défi de programmation est un problème à résoudre ou un besoin à implémenter.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Chaque coding DOJO se porte sur un sujet particulier qui est décliné en un exercice à réaliser. Il représente le challenge de programmation du DOJO.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Un Coding Dojo permet de mettre en œuvre différentes techniques de programmation notamment lié à l'extrême proggramming :&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Pair Programming.&lt;/li&gt;&lt;li&gt;TDD.&lt;/li&gt;&lt;li&gt;…&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;On pourrait assimiler un Coding Dojo à un Coding party. Ce n'est pas le cas. L'objectif n'est pas de réussir à résoudre le défi de programmation mais plutôt de d'apprendre de façon collective sur la manière d'y arriver.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Un Coding Dojo, Pourquoi faire?&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;"Si je veux apprendre le Judo, je vais m'inscrire au dojo du coin et y passer une heure par semaine pendant deux ans, au bout de quoi j'aurai peut-être envie de pratiquer plus assidument.&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&amp;nbsp;&lt;/span&gt;Si je veux apprendre la programmation objet, mon employeur va me trouver une formation de trois jours à Java dans le catalogue 2004. Cherchez l'erreur. "&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;Laurent Bossavit, président de l'association XP-France (Extreme Programming).&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Le constat de départ est que trop de développeurs utilisent uniquement leur travail (et leurs réalisations professionnelles) comme terrain d'entraînement pour parfaire leurs techniques. Le principe d'un Coding &amp;nbsp;dojo est de proposer un espace sûr pour que les développeurs puissent expérimenter, tester et apprendre en dehors du cadre d'un projet.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Les personnes qui participent à ce type de réunion doivent le faire par envie et pour améliorer leurs compétences en programmation.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Les principales motivations qui doivent pousser les personnes à participer à un Coding Dojo sont :&lt;/div&gt;&lt;ul&gt;&lt;li&gt;l'envie d'apprendre.&lt;/li&gt;&lt;li&gt;l'envie de partager.&lt;/li&gt;&lt;li&gt;l'amélioration continue.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Les caractérisitiques d'un Coding Dojo&lt;/span&gt;&lt;br /&gt;Le coding DOJO doit être "un lieu sûr " :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tous les niveaux de compétences en programmation sont acceptés.&lt;/li&gt;&lt;li&gt;Seule une personne volontaire peut participer à un Coding Dojo.&lt;/li&gt;&lt;li&gt;Ce n'est pas une compétition.&lt;/li&gt;&lt;li&gt;L'erreur est humaine.&lt;/li&gt;&lt;li&gt;Il n'y a pas de jugement.&lt;/li&gt;&lt;li&gt;Le Coding Dojo doit être un moment convivial.&lt;/li&gt;&lt;li&gt;Tout le monde doit participer.&lt;/li&gt;&lt;/ul&gt;Voici un ensemble de points qui caractérisent un Coding Dojo :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Chacun doit pouvoir s'améliorer à son rythme.&lt;/li&gt;&lt;li&gt;Le but n'est pas de terminer l'exercice mais bien d'apprendre.&lt;/li&gt;&lt;li&gt;Il permet un apprentissage continu/régulier.&lt;/li&gt;&lt;li&gt;Il permet un apprentissage par petits pas.&lt;/li&gt;&lt;/ul&gt;Il existe 2 types de Dojos :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;le kata.&lt;/li&gt;&lt;li&gt;le randori.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Qu'est-ce qu'un Kata?&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;PRINCIPE :&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Le kata est une des formes de Coding Dojo. C'est une démonstration en live de la réalisation d'un défi de programmation en partant de zéro.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xTcJwT_7XDI/S4vnb3wAvzI/AAAAAAAABqw/jO38C5viFXI/s1600-h/image004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://1.bp.blogspot.com/_xTcJwT_7XDI/S4vnb3wAvzI/AAAAAAAABqw/jO38C5viFXI/s640/image004.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;image provenant de Dojo@SP (São Paulo)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/S4vp10lK35I/AAAAAAAABq4/RpN3Ey4bKFg/s1600-h/image006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/S4vp10lK35I/AAAAAAAABq4/RpN3Ey4bKFg/s400/image006.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Un présentateur (un seul programmeur ou un binôme) présente sa solution du défi. Il explique continuellement son cheminement et il affiche sa progression en déroulant continuellement les tests. Le défi est réalisé en entier en TDD (Test-Driven Development). L'interactivité avec le reste du groupe est primordiale.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Le but n'est pas de trouver la meilleure solution mais de comprendre la solution proposée par le présentateur.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;b&gt;CHARTE :&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;La pratique du TDD appliquée au Kata pour le présentateur (ou binôme) est la suivante :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rédaction d'un test.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Le test est au rouge (en echec).&lt;/span&gt;&amp;nbsp;Si le test ne passe pas, le présentateur doit expliquer aux participants la raison de l'échec. il doit mettre en œuvre le code permettant de réussir le test.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;Le test est au vert (réussite).&lt;/span&gt;&amp;nbsp;Le présentateur peut souligner de bonnes ou de mauvaises pratiques. La salle peut interrompre le présentateur dans le seul cas où il ne comprend plus le déroulement de la solution.…&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Refactoring du code.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Toute restructuration doit être expliquée&lt;br /&gt;et ainsi de suite…&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Qu'est ce qu'un Randori&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;PRINCIPE :&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Le randori est l'autre forme de Coding Dojo. L'objectif est d'implémenter une solution de façon collaborative pour un défi. Le principe de base est que tout le monde effectue les rôles de pilote et co-pilote pendant la session.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/S4vqNQmIKcI/AAAAAAAABrA/oztu-njv5Z0/s1600-h/image008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="148" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/S4vqNQmIKcI/AAAAAAAABrA/oztu-njv5Z0/s640/image008.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;image provenant de Dojo@SP (São Paulo)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xTcJwT_7XDI/S4vqRTUyW6I/AAAAAAAABrI/iNhtCHCsR4Q/s1600-h/image010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://1.bp.blogspot.com/_xTcJwT_7XDI/S4vqRTUyW6I/AAAAAAAABrI/iNhtCHCsR4Q/s400/image010.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Le binôme de développement est composé d'un pilote qui a le clavier et d'un co-pilote qui implémentent une solution pour le défi en respectant la démarche TDD (Test-Driven Development). Le binôme est changé toutes les 5 à 7minutes par une rotation :&lt;/div&gt;&lt;ul&gt;&lt;li&gt;le pilote retourne parmi le reste du groupe.&lt;/li&gt;&lt;li&gt;le co-pilote devient pilote.&lt;/li&gt;&lt;li&gt;une personne du groupe devient co-pilote.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;i&gt;CHARTE :&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La pratique du TDD appliquée au randori pour chaque binôme (durée 5 à 7 minutes) est la suivante :&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Rédaction d'un test.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Le test est au rouge (en echec).&amp;nbsp;&lt;/span&gt;Le binôme de développement à la main. Si le test ne passe pas, le pilote doit expliquer aux participants la raison de l'échec. Les participants n'interviennent que si le binôme le demande. Le binôme doit mettre en œuvre le code permettant de réussir le test.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;Le test est au vert (réussite).&lt;/span&gt;&amp;nbsp;Les participants peuvent intervenir pour proposer des améliorations, faire des remarques, poser des questions…&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Refactoring du code.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Toute restructuration doit être discutéé et avoir l'accord de la majorité des participants.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;et ainsi de suite…&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Du coté de l'organisation...&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;QUI PEUT PARTICIPER?&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Toutes les personnes qui adhèrent aux principes d'un Coding Dojo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;QUI PEUT ORGANISER?&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Toutes les personnes qui adhèrent aux principes d'un Coding Dojo qui ont envie d'organiser ce type d'évènement.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;LES CONTRAINTES D'ORGANISATION :&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Pour organiser un Coding Dojo, il faut :&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Un lieu.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Une date.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Une durée fixe est définie avant le Coding Dojo.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Un sujet + langage de programmation.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Un mode de fonctionnement kata ou randori.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;LA LOGISITIQUE À PRÉVOIR:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;D'un point de vue logistique il faut :&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Que les participants possèdent une adresse mail pour les communications qui précédent et suivent une session.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Une salle.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Une table (au moins).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Des chaises pour l'ensemble des participants&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Un video projecteur.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Un ordinateur portable.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Un paper board ou white board.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Des post-its.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Des stylos.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Un appareil photo (optionnel)&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Une Caméra (optionnelle)&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Exemple : Un Dojo à Norsys&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;AVANT :&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Il faut :&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Choisir une date.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Choisir le lieu.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Choisir le sujet (soit par un vote public, soit par un choix au niveau des organisateurs).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Réserver les éléments logistiques nécéssaires (video projecteur, salle, …).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Préparer un système d'inscription en ligne et de choix de sandwich(doodle ou formulaire google docs).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Envoyer l'annonce du Dojo (date, lieu, contenu, lien vers le système d'inscription.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Solliciter les personnes qui doivent préparer des choses pour la session pour s'assurer qu'il n'y ai pas de malentendu.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;i&gt;JUSTE AVANT :&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Envoyer un mail de rappel aux inscrits avec le choix de leur sandwich.&lt;/li&gt;&lt;li&gt;Gérer la commande de sandwich.&lt;/li&gt;&lt;li&gt;S'assurer que les éléments logistiques réservés sont bien disponibles.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;i&gt;PENDANT :&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; font-weight: normal;"&gt;12h00-12h30 : &amp;nbsp;arrivée progressive des participants. Préparation de dernière minutes. Distribution des sandwichs et récupération de l'argent.&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;12h30-13h30 : Coding Dojo.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;13h30-14h00 : Discussion autour du Dojo. Rangement . Départ progressif des participants.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;i&gt;APRÈS :&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mettre à disposition le code de la session.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Difficultés&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Un coding Dojo réprésente malgré tout un défi d'organisation :&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Cela prend du temps.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Il faut résoudre les difficultés logistiques en amont d'une séance.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Il faut se mettre d'accord sur un sujet et ça n'est pas toujours évident.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Durant la séance :&amp;nbsp;Ne pas oublier que l'ojectif premier est d'apprendre et non pas de terminer l'excercice. Il faut trouver un bon equilibre entre le développement l'échange.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;1 heure, c'est très court. Le souhait de de développer le plus possible et de faire participer tout le monde.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Travail collaboratif. Il faut faire des choix dans un temps restreint et dans le cadre d'une rélfexion commune.&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Quelques références :&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://www.slideshare.net/ehsavoie/agile-tour-2009-coding-dojo-kata-atdd"&gt;http://www.slideshare.net/ehsavoie/agile-tour-2009-coding-dojo-kata-atdd&lt;/a&gt;&amp;nbsp;(Merci à&amp;nbsp;&lt;a href="http://www.ehsavoie.com/"&gt;Emmanuel&lt;/a&gt;&amp;nbsp;de m'avoir m'autoriser à réutiliser ses&amp;nbsp;schémas&amp;nbsp;et photos)&amp;nbsp;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://codingdojo.org/"&gt;http://codingdojo.org/&lt;/a&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://linuxfr.org/2008/12/19/24813.html"&gt;http://linuxfr.org/2008/12/19/24813.html&lt;/a&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://clubagile.org/"&gt;http://clubagile.org/&lt;/a&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://groups.google.com/group/nord-agile/"&gt;http://groups.google.com/group/nord-agile/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;A vous de jouer :-)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-1747179502205312633?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/1747179502205312633/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=1747179502205312633' title='8 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1747179502205312633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1747179502205312633'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2010/03/coding-dojo-en-entreprise.html' title='Coding Dojo en entreprise'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_xTcJwT_7XDI/S4vnb3wAvzI/AAAAAAAABqw/jO38C5viFXI/s72-c/image004.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4086825574844110201</id><published>2010-02-11T14:37:00.005+01:00</published><updated>2010-02-11T14:42:12.583+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='axis'/><category scheme='http://www.blogger.com/atom/ns#' term='cxf'/><title type='text'>Bench de framework web service java : Axis2 vs Cxf vs Spring ws</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;C'est quoi un framework web service? :&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;Les frameworks web service java ont pour objectif de s'affranchir des problématiques techniques liées à la mise en oeuvre d'un web service pour permettre de se concentrer sur le traitement qui doit être réalisé par celui-ci et de simplifier son appel. Dans les grandes lignes, ils permettent :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;coté client : de générer les classes à partir d'un&amp;nbsp;&lt;a href="http://fr.wikipedia.org/wiki/Web_Services_Description_Language"&gt;WSDL&lt;/a&gt; permettant de créer une grappe d'objet correspondant au message &lt;a href="http://fr.wikipedia.org/wiki/SOAP"&gt;SOAP&lt;/a&gt; du web service de façon transparente.&lt;/li&gt;&lt;li&gt;coté serveur : de récupérer une requête HTTP SOAP, de transformer le contenu du message en une grappe d'objets, d'appeler une méthode java correspondant à la requête puis de récupérer l'objet en retour de l'appel de la méthode et de le transformer en réponse HTTP SOAP.&lt;/li&gt;&lt;/ul&gt;Plusieurs méthodes de développement sont associées à ces frameworks :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Contract first : définir un contrat d'échange et ensuite de s'appuyer sur ce contrat pour développer le service à l'aide du framework.&lt;/li&gt;&lt;li&gt;Code first : développer un service java et ensuite s'appuyer sur le framework pour qu'il expose la méthode sous forme de web service.&lt;/li&gt;&lt;/ul&gt;Ces deux méthodes font débats et je ne vais pas m'attarder dessus dans le cadre de ce bench dont ce n'est pas l'objet. J'y reviendrai peut être dans un autre billet...&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Les frameworks testés :&lt;/span&gt;&lt;br /&gt;Je me suis attardé sur les frameworks les plus connus :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ws.apache.org/axis2/"&gt;Apache Axis2&lt;/a&gt;&amp;nbsp;(version 1.5.1)&lt;/li&gt;&lt;li&gt;&lt;a href="http://cxf.apache.org/"&gt;Apache Cxf&lt;/a&gt;&amp;nbsp;(version 2.2.5)&lt;/li&gt;&lt;li&gt;&lt;a href="http://static.springsource.org/spring-ws/sites/1.5/"&gt;Spring ws&lt;/a&gt;&amp;nbsp;(version 1.5.9)&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Objectif du bench:&lt;/span&gt;&lt;br /&gt;L'objectif du bench est de mesurer le temps passé dans les couches techniques des frameworks web services en dehors du réel traitement que doit effectuer le web service et cela différent niveau de charge. Le tout est de pouvoir mesurer l'overhead engendré par les frameworks web services par rapport à un appel direct de méthode en java et de comparer cet overhead. Le bench se focalise sur les temps de traitements coté serveur :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/S3PR0tgD0GI/AAAAAAAABpw/gU1q1SG_Umg/s1600-h/image1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/S3PR0tgD0GI/AAAAAAAABpw/gU1q1SG_Umg/s400/image1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Caractéristiques du bench :&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;les web services exposés :&lt;/li&gt;&lt;/ul&gt;J'ai mis en place le même web service avec les 3 frameworks dans 3 webapps indépendantes. Les temps de réponses sont mesurés coté client.&amp;nbsp;Pour que les temps de réponse coté client correspondent à l'overheard technique coté serveur, le traitement métier est inexistant : Le service java ne fait que renvoyer l'objet récupérer en&amp;nbsp;paramètre :&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xTcJwT_7XDI/S3PZyCNwhfI/AAAAAAAABp4/9FHgHIRHP7s/s1600-h/image2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://2.bp.blogspot.com/_xTcJwT_7XDI/S3PZyCNwhfI/AAAAAAAABp4/9FHgHIRHP7s/s400/image2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La requête en entrée ainsi que la réponse en retour sont représentatifs d'un "vrai" web service (dans le sens ou ce n'est pas un simple hello world) :&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;60 données unitaires&lt;/li&gt;&lt;li&gt;3 niveaux de profondeur&lt;/li&gt;&lt;li&gt;requête SOAP de 3.75 Ko&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Du coté du client :&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;J'ai mis en oeuvre un injecteur http maison multithreadé et basé sur commons-httpclient qui envoie directement la requête SOAP prédéfinies et mesure les temps de réponse. J'ai d'abord fait des tests avec &lt;a href="http://www.soapui.org/"&gt;SoapUI&lt;/a&gt; en local sur mon poste mais je ne voulais pas "pollué" les résultats en saturant le poste client et j'ai donc décidé de mesurer les temps de réponse client à partir d'un serveur plus puissant que mon poste et dédié au bench.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Du coté du serveur :&lt;/li&gt;&lt;/ul&gt;J'ai déployé les 3 webapps dans un JBoss 5.1.0 "out of the box" s'appuyant sur une JVM Sun 1.6.0_18. J'ai&amp;nbsp;simplement&amp;nbsp;augmenté la taille de la JVM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/S3Pgm-NSroI/AAAAAAAABqA/ogZ8_0e1BZI/s1600-h/image3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/S3Pgm-NSroI/AAAAAAAABqA/ogZ8_0e1BZI/s400/image3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;procédure du bench :&lt;/li&gt;&lt;/ul&gt;J'ai monté en charge les uns après les autres chacun des web services exposés avec : 10, 50 et 100 clients (threads) simultanés effectuant chacun 2000 appels. Le test est répété 4 fois pour vérifier la stabilité des temps &amp;nbsp;de réponse sur plusieurs essais.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Résultats :&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/S3P_VjmbolI/AAAAAAAABqQ/5ri8y1HF-Ho/s1600-h/graph.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/S3P_VjmbolI/AAAAAAAABqQ/5ri8y1HF-Ho/s400/graph.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Voici le tableau détaillé :&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xTcJwT_7XDI/S3P_4yEg9YI/AAAAAAAABqg/cIVni1JuyGs/s1600-h/tableau.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="81" src="http://1.bp.blogspot.com/_xTcJwT_7XDI/S3P_4yEg9YI/AAAAAAAABqg/cIVni1JuyGs/s400/tableau.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Dans le cadre de ce bench, CXF est donc le framework le plus performant suivi d'assez prêt par Spring ws.&amp;nbsp;Axis2 est clairement moins performant indépendamment du niveau de charge coté serveur.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Conclusion :&lt;/span&gt;&lt;/div&gt;&lt;div&gt;J'ai été confronté à quelques problèmes de déploiement sur JBoss à cause de librairies utilisées à la fois par les frameworks et par JBoss avec Axis2 et Spring ws. Sur cet aspect là, la communauté et la documentation&amp;nbsp;autour de Spring permettent de résoudre rapidement &lt;a href="http://static.springsource.org/spring-ws/sites/1.5/faq.html#saaj-jboss"&gt;le problème&lt;/a&gt;&amp;nbsp;alors que pour Axis2, il a fallu creuser un peu plus.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4086825574844110201?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4086825574844110201/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4086825574844110201' title='13 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4086825574844110201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4086825574844110201'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2010/02/bench-de-framework-web-service-java.html' title='Bench de framework web service java : Axis2 vs Cxf vs Spring ws'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xTcJwT_7XDI/S3PR0tgD0GI/AAAAAAAABpw/gU1q1SG_Umg/s72-c/image1.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-5269447894651451594</id><published>2010-02-09T09:11:00.002+01:00</published><updated>2010-02-09T09:11:41.591+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='remote'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>JBoss : permettre les accès distants</title><content type='html'>Depuis la version&amp;nbsp;4.2 &amp;nbsp;de&amp;nbsp;JBoss, la configuration de l'accès aux services réseaux est mappé sur le 127.0.0.1 (la machine en local). Cela rend JBoss complètement&amp;nbsp;hermétique&amp;nbsp;à toutes connexions distantes à ses services. Cette nouvelle configuration a pour objectif de sécuriser le JBoss.&lt;br /&gt;&lt;br /&gt;Pour autoriser des accès distants au services de JBoss, &amp;nbsp;il faut alors démarrer le serveur l'option -b en précisant l'ip que vous désirez autoriser.&lt;br /&gt;&lt;br /&gt;Voici la commande de lancement pour autoriser toutes les ips (qui est la configuration par défaut des versions antérieures de JBoss) :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;run.sh -b 0.0.0.0&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-5269447894651451594?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/5269447894651451594/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=5269447894651451594' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/5269447894651451594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/5269447894651451594'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2010/02/jboss-permettre-les-acces-distants.html' title='JBoss : permettre les accès distants'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-3590195384633913463</id><published>2009-10-16T14:00:00.000+02:00</published><updated>2009-10-16T14:00:32.049+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Formation certifiante  Scrum Master avec Jeff Sutherland</title><content type='html'>J'ai participé à la formation certifiante Scrum Master du 1er et 2 Octobre dernier organisé par &lt;a href="http://www.xebia.fr/news/certification-scrummaster-2009-avec-jeff-sutherland"&gt;Xebia&lt;/a&gt; à Paris La Défense avec Monsieur &lt;a href="http://jeffsutherland.com/"&gt;Jeff Sutherland&lt;/a&gt; (le papa de Scrum).&lt;br /&gt;&lt;br /&gt;Je ne peux que trop vous conseiller de faire cette formation!&lt;br /&gt;&lt;br /&gt;J'étais déjà convaincu par ce peut apporter Scrum (couplé avec XP par exemple), et après la formation, ça ne s'est pas arrangé.&lt;br /&gt;&lt;br /&gt;Il faut par contre, à mon avis avoir, déjà débroussailler le terrain sur Scrum et les grands concepts pour assister à cette formation. Je vous conseille par exemple : &lt;a href="http://pour%20assister%20%c3%a0%20cette%20formation/"&gt;"Scrum and Xp From the trenches"&lt;/a&gt; de Henrik Kniberg. C'est une bonne première approche. Le livre est disponible gratuitement en version numérique. Prenez la version original en anglais, ça vous aidera aussi si vous voulez assister à la formation qui est en anglais :-).&lt;br /&gt;&lt;br /&gt;Pour en revenir à la formation, Jeff ne s'attarde pas plus que ça sur les grands concepts en début de formation. Il les aborde tout au long de la formation. En revanche, il insiste plus sur ces retours d'expériences et sur le fait que cette méthode, pardon ce framework, est sacrément efficace. Jeff est un bon évangéliste sur le sujet :-). Les références sont quand même Google, Apple ainsi que de très grand groupe.&lt;br /&gt;&lt;br /&gt;J'ai bien aimé la partie concernant les projets en échecs et qui disent utiliser Scrum et qui en grattant très légèrement ne l'utilise pas vraiment, voir pas du tout.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;J'ai bien aimé le planning poker avec l'application sur mon Iphone :-). C'est totalement "In".&lt;br /&gt;&lt;br /&gt;J'ai bien aimé le léger focus sur le rôle de Product Owner qui est très très très important.&lt;br /&gt;Il nous a d'ailleurs posé la question : "Who is the best Product Owner in the World?" la réponse &lt;a href="http://fr.wikipedia.org/wiki/Steve_Jobs"&gt;ici&lt;/a&gt;. J'adore...&lt;br /&gt;&lt;br /&gt;J'ai bien aimé enfin le fait qu'on ai réellement le temps de poser toute nos questions. pas de langue de bois.&lt;br /&gt;&lt;br /&gt;Les mises en situation tout au long des 2 jours de la formation sont très intéressantes. Le XP game en fin de formation est top.&lt;br /&gt;&lt;br /&gt;La prochaine session en France est normalement prévu le 3 et 4 décembre 2009. Vous trouverez plus de détails &lt;a href="http://blog.xebia.fr/2009/01/14/certification-scrummaster-par-jeff-sutherland-sessions-2009/"&gt;ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;J'ai rarement vu une formation où tout le monde veut prendre sa petite photo avec le formateur à la fin de la formation. C'est peut être une preuve de la qualité de la formation... ou pas... bon ok j'ai été faible, j'ai la mienne aussi...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/SthcotFKHtI/AAAAAAAABjQ/ov1lPrpfJwg/s1600-h/photo2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/SthcotFKHtI/AAAAAAAABjQ/ov1lPrpfJwg/s320/photo2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Bon maintenant le problème, c'est que je ne vois pas comment je vais faire rentrer Scrum chez mon client autrement qu'en allant voir le CEO :-).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-3590195384633913463?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/3590195384633913463/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=3590195384633913463' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3590195384633913463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3590195384633913463'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/10/formation-certifiante-scrum-master-avec.html' title='Formation certifiante  Scrum Master avec Jeff Sutherland'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xTcJwT_7XDI/SthcotFKHtI/AAAAAAAABjQ/ov1lPrpfJwg/s72-c/photo2.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-1221434199971424392</id><published>2009-10-16T10:51:00.009+02:00</published><updated>2009-10-16T12:11:03.667+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chtijug'/><category scheme='http://www.blogger.com/atom/ns#' term='norsys'/><title type='text'>Le ch'ti Jug du 21 Septembre</title><content type='html'>Avec un peu de retard, mais il vaut mieux tard que jamais, voici un petit retour sur le Ch'ti Jug du 21 Septembre sur Bean validation et Hibernate Search.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_xTcJwT_7XDI/Stg2-XTXReI/AAAAAAAABjI/DF9MSV440To/s1600-h/photo.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5393120998811190754" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/Stg2-XTXReI/AAAAAAAABjI/DF9MSV440To/s400/photo.jpg" style="cursor: pointer; display: block; height: 300px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;La salle était pleine malgré le lieu de la session (assez éloigné du centre de Lille...).&lt;br /&gt;&lt;br /&gt;Je ne suis pas forcément très objectif sur la qualité de cette session vu que je faisais partie des organisateurs coté Norsys. Voici en revanche un retour d'Arnaud Bailly sur la session sur son &lt;a href="http://www.oqube.com/journal/journal/2009/09/22/Chti-JUG-Hibernate-Search---JSR303"&gt;blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La soirée s'est poursuivie par le petit coup à boire classique de fin de session et par un resto sur Lille pour les irréductibles :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img22.yfrog.com/img22/2769/fklg.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://img22.yfrog.com/img22/2769/fklg.jpg" style="cursor: pointer; display: block; height: 299px; margin: 0px auto 10px; text-align: center; width: 450px;" /&gt;&lt;/a&gt;Les slides de la présentations sont disponibles sur le blog du cht'ti Jug &lt;a href="http://chtijug.org/presentation-hibernate-search-bean-validation/"&gt;ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La session a été filmée par &lt;a href="http://blog.proxiad.com/author/abuisine/"&gt;Arnaud Buisine&lt;/a&gt; (qui a passé pas mal d'heures aussi sur le montage...). Voici la vidéo en preview :&lt;br /&gt;&lt;object height="300" width="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/krlZJ2cZuUE&amp;amp;hl=fr&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/krlZJ2cZuUE&amp;amp;hl=fr&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Je tenais à remercier &lt;a href="http://blog.emmanuelbernard.com/"&gt;Emmanuel&lt;/a&gt; pour la qualité de sa présentation. Ainsi que Didier, &lt;a href="http://blog.tartachuc.org/"&gt;Tom&lt;/a&gt;, Pascal, Mathilde et Denis pour leur aide précieuse!&lt;br /&gt;&lt;br /&gt;ps : Servir de la bière à partir d'une pompe à bière à 5 bar de pression dans des gobelets en plastique, c'est très très sport :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-1221434199971424392?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/1221434199971424392/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=1221434199971424392' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1221434199971424392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1221434199971424392'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/10/le-chti-jug-du-21-septembre.html' title='Le ch&apos;ti Jug du 21 Septembre'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xTcJwT_7XDI/Stg2-XTXReI/AAAAAAAABjI/DF9MSV440To/s72-c/photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-2723026645715503384</id><published>2009-09-07T16:33:00.003+02:00</published><updated>2009-09-07T16:40:36.261+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='chtijug'/><category scheme='http://www.blogger.com/atom/ns#' term='norsys'/><title type='text'>Ch'ti Jug : session du 21 Septembre</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://chtijug.org/wp-content/themes/chtijug/images/chtijug_20090312_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 156px; height: 100px;" src="http://chtijug.org/wp-content/themes/chtijug/images/chtijug_20090312_2.png" alt="" border="0" /&gt;&lt;/a&gt;Ca y est les inscriptions pour la session du Ch'tiJug hébergée par Norsys sont ouvertes!&lt;br /&gt;&lt;/div&gt;http://chtijug.org/session-21-septembre-hibernate-search-validation-norsys/&lt;br /&gt;&lt;br /&gt;C'est effectivement Emmanuel Bernard, leader technique chez JBoss sur Hibernate Annotations, Hibernate EntityManager, Hibernate Search et Validator, qui animera la présentation.&lt;br /&gt;&lt;br /&gt;Si vous désirez y participer, n'hésitez pas à vous inscrire assez rapidement car les places sont limitées et ont l'air de partir assez vite...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://chtijug.org/wp-content/uploads/2009/09/norsys2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 130px; height: 49px;" src="http://chtijug.org/wp-content/uploads/2009/09/norsys2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-2723026645715503384?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/2723026645715503384/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=2723026645715503384' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2723026645715503384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2723026645715503384'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/09/chti-jug-session-du-21-septembre.html' title='Ch&apos;ti Jug : session du 21 Septembre'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-748119967587541580</id><published>2009-08-10T11:20:00.003+02:00</published><updated>2009-08-10T11:30:47.239+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chtijug'/><category scheme='http://www.blogger.com/atom/ns#' term='norsys'/><title type='text'>Un Ch'ti Jug chez Norsys</title><content type='html'>Une session du &lt;a href="http://chtijug.org/"&gt;Ch'ti Jug&lt;/a&gt; va être effectuée chez Norsys (Région Nord) dans les locaux d'Ennevelin à la rentrée le 21 Septembre. Ils en parlent &lt;a href="http://chtijug.org/rendez-vous-a-la-rentree-jboss-norsys/"&gt;ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.emmanuelbernard.com/"&gt;Emmanuel Bernard&lt;/a&gt; viendra parler de &lt;strong&gt;JPA2&lt;/strong&gt;, &lt;strong&gt;Bean Validation&lt;/strong&gt; et &lt;strong&gt;Hibernate Search.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Plus d'informations viendront par la suite notamment sur le blog du &lt;a href="http://chtijug.org/"&gt;Ch'ti Jug&lt;/a&gt;. Restez à l'affut...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-748119967587541580?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/748119967587541580/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=748119967587541580' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/748119967587541580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/748119967587541580'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/08/un-chti-jug-chez-norsys.html' title='Un Ch&apos;ti Jug chez Norsys'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-3888180630843254211</id><published>2009-06-16T08:53:00.004+02:00</published><updated>2009-06-16T09:13:50.441+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chtijug'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Ch'ti Jug sur Maven2</title><content type='html'>A cause du nom de mon blog, je suis obligé d'en parler :-).&lt;br /&gt;&lt;br /&gt;J'ai participé hier à la 2ème session du ch'ti Jug dont le sujet était sur Maven2.&lt;br /&gt;&lt;br /&gt;C'était Arnaud héritier qui animait la présentation. Il parle d'ailleurs de sa future intervention au Ch'ti Jug &lt;a href="http://blog.aheritier.net/apache-maven-le-chti-jug-et-moi/"&gt;ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La présentation d'Arnaud était de qualité. Je n'ai pas forcément appris énormément de choses nouvelles sur Maven en revanche, je retiens que je suis d'accord avec lui sur les bonnes pratiques autour de Maven et que je vais dans le bon sens :-).&lt;br /&gt;&lt;br /&gt;La petite touche d'humour est que j'ai gagné une licence IntelliJ IDEA, l'IDE dont on dit beaucoup de bien, en répondant à une question sur Maven : De quel projet est-il issu?... "and the answer is..." &lt;a href="http://turbine.apache.org/"&gt;Turbine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;J'ai été étonné de l'affluence à la présentation. Pour une 2ème session, nous étions dans les 70 personnes "selon la police" :-). Quand on compare ce nombre aux affluences du Jug de Paris par exemple, c'est prometteur pour la suite de ce Jug régional!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-3888180630843254211?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/3888180630843254211/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=3888180630843254211' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3888180630843254211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3888180630843254211'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/06/chti-jug-sur-maven2.html' title='Ch&apos;ti Jug sur Maven2'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-3896992983293553592</id><published>2009-04-17T10:14:00.008+02:00</published><updated>2009-04-17T11:34:01.724+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='norsys'/><title type='text'>Norsys, une réunion d'agence "Agile"</title><content type='html'>Hier soir a eu lieu la classique réunion d'agence de Norsys Région Nord dans les locaux d'Ennevelin.&lt;br /&gt;&lt;br /&gt;La réunion avait l'originalité d'être présentée comme une réunion d'agence "Agile". Ça mérite bien un billet pour en parler.&lt;br /&gt;&lt;br /&gt;Pour bien repréciser le sujet, il n'existe pas réellement de réunion "Agile" c'est pour cela que dans le titre du billet Agile est entre guillemet... En revanche, l'originalité de la réunion réside dans la réutilisation de certains concepts et de certaines méthodes Agiles pour organiser son déroulement.&lt;br /&gt;&lt;br /&gt;Voici les différents points d'organisations intéressants :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ce sont les salariés qui ont choisi parmi un ensemble de thèmes (business, stratégie 2009, les méthodes Agiles, RH, informations sur le groupe Norsys...) ceux qui allaient être débattus pendant la réunion.&lt;/li&gt;&lt;li&gt;Chaque thème devait être présenté en 10 minutes, pas plus, pas moins.&lt;/li&gt;&lt;li&gt;L'utilisation du powerpoint pour présenter un thème était quasiment interdit pour favoriser d'autres modes de restitution visuels et originaux.&lt;/li&gt;&lt;/ul&gt;L'ensemble des salariés a donc été sollicité par mail en amont de la réunion pour choisir des thèmes. Lors de la réunion, pendant un premier "sprint", les thèmes retenus par mail ont été abordés et 2 thèmes ont été retenus en live pour être présenté dans un second sprint. Un pot convivial a été organisé après la réunion.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_xTcJwT_7XDI/SehA98VxzsI/AAAAAAAABc4/BORtUUZTsvA/s1600-h/photo.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/SehA98VxzsI/AAAAAAAABc4/BORtUUZTsvA/s400/photo.jpg" alt="" id="BLOGGER_PHOTO_ID_5325577992279281346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Les présentateurs ont utilisé des moyens originaux pour rendre fun la restitution des thèmes abordés (rappelons que le coté fun fait évidemment parti des méthodes Agiles)  :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;interview.&lt;/li&gt;&lt;li&gt;proposition de sujets par paper board/post-it.&lt;/li&gt;&lt;li&gt;réutilisation du principe de "TODO", "IN PROGRESS" et "DONE" sur un tableau pour présenter l'avancement d'un thème.&lt;/li&gt;&lt;li&gt;réalisation d'un "Dessinez c'est gagné" numérique "videoprojeté" (cf photo) pour trouver les sujets d'un thème.&lt;/li&gt;&lt;li&gt;Diffusion d'une vidéo pour présenter un thème.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;réalisation d'une petite exposition dans une salle annexe pour présenter un thème.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_xTcJwT_7XDI/SehBHPVC2lI/AAAAAAAABdA/pvKBTSlAgtQ/s1600-h/photo%282%29.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://1.bp.blogspot.com/_xTcJwT_7XDI/SehBHPVC2lI/AAAAAAAABdA/pvKBTSlAgtQ/s400/photo%282%29.jpg" alt="" id="BLOGGER_PHOTO_ID_5325578151995300434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;remarques diverses :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La réunion a rassemblé une grande majorité des salariés hier soir.&lt;/li&gt;&lt;li&gt;Nos chers commerciaux n'ont pas réussi à respecter les 10 minutes pour présenter la partie business :-).&lt;/li&gt;&lt;li&gt;La réunion était très vivante et participative.&lt;/li&gt;&lt;li&gt;La réunion a été Fun!&lt;/li&gt;&lt;li&gt;L'agence est maintenant en rupture de stock de paper board et de post-it :-).&lt;/li&gt;&lt;li&gt;Les modes de restitutions des thèmes ont été très originaux.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Dans tous les cas, ça changeait de l'ordinaire et il fallait le souligner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-3896992983293553592?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/3896992983293553592/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=3896992983293553592' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3896992983293553592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3896992983293553592'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/04/norsys-une-reunion-dagence-agile.html' title='Norsys, une réunion d&apos;agence &quot;Agile&quot;'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xTcJwT_7XDI/SehA98VxzsI/AAAAAAAABc4/BORtUUZTsvA/s72-c/photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-8634374687198017581</id><published>2009-03-26T17:11:00.006+01:00</published><updated>2009-04-17T11:59:43.371+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Migration Maven 2 : 3ème épisode : retour d'expériences</title><content type='html'>Il est vrai que je n'avais pas fait de 3ème épisode concernant ce sujet de migration de maven1 vers maven2.&lt;br /&gt;&lt;br /&gt;Voici alors le 3ème épisode de la migration plutôt sous la forme d'un retour d'expérience... tintintin...&lt;br /&gt;&lt;br /&gt;La migration a été effectuée sur 2 gros projets J2EE avec des processus de build assez complexe. L'utilisation de maven2 est effective depuis maintenant quelques mois. Voici en vrac quelques remarques par rapport à des ajustements effectués après la migration : &lt;ul&gt;&lt;li&gt;delta au niveau du contenu des archives j2ee. Les archives j2EE ont tendance à prendre de l'enbonpoint (gestion des dépendances transitives, repository différents) :&lt;span style="font-weight: bold;"&gt; bien définir les exclusions et scopes&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;changement de comportement du build suite à l'apparition d'une nouvelle version du plugin : &lt;span style="font-weight: bold;"&gt;fixer la version de tous les plugins&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;confusion possible avec les fichiers de conf maven1 : une fois que l'utilisation maven2 est bien intégrée,  &lt;span style="font-weight: bold;"&gt;faire le ménage sur les anciens fichiers de conf maven1&lt;/span&gt; qui "polluent" le gestionnaire de sources.&lt;/li&gt;&lt;/ul&gt;Maven1 est en train d'être oublié par les équipes de développement, preuve que la migration est un succès.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-8634374687198017581?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/8634374687198017581/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=8634374687198017581' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8634374687198017581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8634374687198017581'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/03/migration-maven-2-3eme-episode-retour.html' title='Migration Maven 2 : 3ème épisode : retour d&apos;expériences'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-6178405000869566603</id><published>2009-03-09T15:45:00.004+01:00</published><updated>2009-03-09T16:03:06.773+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><title type='text'>Retouche photo en ligne : Pixlr</title><content type='html'>Dans le cadre d'un développement orienté web, si vous avez besoin de faire des petites retouches photos, je vous conseille d'utiliser Pixlr. C'est un bon compromis entre une interface simple et conviviale et un nombre de fonctionnalités déjà assez important (Pixlr prend en charge la gestion des calques par exemple).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_xTcJwT_7XDI/SbUu--qYqtI/AAAAAAAABcY/2Bgo9bEkSOs/s1600-h/pixlr.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 298px;" src="http://3.bp.blogspot.com/_xTcJwT_7XDI/SbUu--qYqtI/AAAAAAAABcY/2Bgo9bEkSOs/s400/pixlr.PNG" alt="" id="BLOGGER_PHOTO_ID_5311202995060910802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le tout est réalisé en Flash et propose des raccourcis clavier. On oublie même que c'est une interface "web". Il ne faut même pas s'inscrire...&lt;br /&gt;&lt;br /&gt;Les virtuoses du photoshop seront surement déçus mais pour un outil gratuit et en ligne, c'est assez surprenant.&lt;br /&gt;&lt;br /&gt;Voici l'adresse du site :&lt;br /&gt;&lt;a href="http://www.pixlr.com/"&gt;http://www.pixlr.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-6178405000869566603?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/6178405000869566603/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=6178405000869566603' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6178405000869566603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6178405000869566603'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/03/retouche-photo-en-ligne-pixlr.html' title='Retouche photo en ligne : Pixlr'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xTcJwT_7XDI/SbUu--qYqtI/AAAAAAAABcY/2Bgo9bEkSOs/s72-c/pixlr.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-2370251429469672982</id><published>2009-02-10T11:01:00.009+01:00</published><updated>2009-02-11T09:59:54.921+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intégration continue'/><title type='text'>Causes d'échec de l'Intégration continue</title><content type='html'>Dans certain cas, aux yeux d'une équipe de développement, l'intégration continue se limite à recevoir un mail quand le "build" de l'application échoue. Le problème est que l'intégration continue ne se limite pas seulement à ça...&lt;br /&gt;&lt;br /&gt;Il ne faut pas oublier que l'intégration continue n'est pas qu'un outil mais bien un ensemble de pratiques autour de l'ingénierie logicielle. Dans &lt;a href="http://www.martinfowler.com/articles/continuousIntegration.html"&gt;un de ces articles&lt;/a&gt;, Martin Fowler présente les pratiques d'intégration continue sur son site.&lt;br /&gt;&lt;br /&gt;Voici quelques causes probables d'échecs sur la mise en place d'une démarche d'intégration continue :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un manque de connaissances de l'ensemble des pratiques d'intégration continue par l'équipe (y compris les managers).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;une mise en place d'un serveur d'intégration continue au niveau d'une équipe projet sans communiquer, informer sur les bénéfices de ce type de démarche et intégrer les principes de fonctionnement que cette mise en place entraine.&lt;/li&gt;&lt;/ul&gt;Si la volonté de mettre en place ce type de démarche ne vient pas de l'équipe , il faut alors présenter et communiquer autour de la démarche. Il ne faut pas oublier que ce type de pratique est fait pour les équipes de développements et pour leur permettre de travailler efficacement ensemble.&lt;br /&gt;&lt;br /&gt;L'intégration continue est avant une histoire de communication. Cela doit être une culture au niveau du projet. Il faut rendre "fun" la pratique de l'intégration continue!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-2370251429469672982?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/2370251429469672982/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=2370251429469672982' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2370251429469672982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2370251429469672982'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/02/causes-dechec-de-lintegration-continue.html' title='Causes d&apos;échec de l&apos;Intégration continue'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-1865514404665577055</id><published>2009-01-29T11:23:00.018+01:00</published><updated>2009-02-24T17:08:22.602+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ejb'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Supprimer les EJbs par Spring</title><content type='html'>J'ai procédé chez mon client à la réalisation d'une étude sur la suppression des EJBs Sessions sur un de leur applicatif java.&lt;br /&gt;&lt;br /&gt;Pourquoi supprimer les EJBs Sessions?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Pour simplifier l'architecture logicielle de l'applicatif.&lt;/li&gt;&lt;li&gt;Pour simplifier la plateforme de développements.&lt;/li&gt;&lt;li&gt;Pour simplifier le processus de construction de l'application.&lt;/li&gt;&lt;li&gt;Pour augmenter la productivité des développeurs.&lt;/li&gt;&lt;li&gt;Pour banaliser l'infrastructure serveur (pas de différenciation serveur métier et serveur présentation).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Qu'apportent les Ejbs Sessions au niveau de l'applicatif?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La possibilité de séparer sur des infrastructures différentes la partie présentation et la partie métier. Cette possibilité n'est plus exploitée du fait de leur volonté de banaliser l'infrastructure serveur.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;La possibilité d'appeler la couche Ejbs ( couche "métier")  depuis d'autres applications. Ce choix d'interfaçage n'a pas été retenu et il sera pris en charge par la mise en place de Web Services.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;La gestion des transactions. C'est la problématique intéressante qui reste à traiter... avec Spring évidemment...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;L'intégration de Spring pour prendre en charge la gestion des transactions est réellement facile. Il existe 2 possibilités :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;de façon déclarative dans le fichier de conf Spring.&lt;/li&gt;&lt;li&gt;Par annotation.&lt;/li&gt;&lt;/ul&gt;Après avoir testé les 2, j'ai choisi de le faire par annotations. L'inconvénient est d'être intrusif en rajoutant les annotations "@Transactional" dans le code. En revanche, cela augmente la lisibilité au niveau du code. Dans tous les cas, je crois qu'il n'y a pas de mauvaises façons de faire avec Spring mais dans tous les cas des façons "simplifiantes". Voici le lien vers la documentation de Spring qui m'a aidé concernant &lt;a href="http://static.springframework.org/spring/docs/2.0.x/reference/transaction.html#transaction-intro"&gt;&lt;/a&gt;&lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/transaction.html"&gt;la gestion des transactions.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dans le cadre du projet concerné, l'environnement de développement se base sur un simple serveur web Tomcat alors qu'en production, c'est un serveur d'application JBoss. L'applicatif à aussi la particularité d'utiliser un ensemble de datasources.&lt;br /&gt;&lt;br /&gt;J'utilise alors un transaction manager différent selon l'environnement :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dans l'environnement de développement avec Tomcat,  je ne pouvais pas me servir du transactionManager proposer par Spring (&lt;a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/datasource/DataSourceTransactionManager.html"&gt;org.springframework.jdbc.datasource.DataSourceTransactionManager&lt;/a&gt;) car il ne gère  qu'une seule source de données. &lt;a href="http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html?page=6"&gt;Un article sur le site javaworld&lt;/a&gt; explique comment mettre en place un "ChainedTransactionManager" qui s'appuie ensuite sur le transactionManager de spring et permet de gérer plusieurs datasources. Voici un extrait de conf spring correspondante :&lt;br /&gt;&lt;pre&gt;&lt;code class="xml"&gt; &lt;span class="comment"&gt;&amp;lt;!-- aop pour la gestion des transactions --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;tx&lt;/span&gt;&lt;span class="tag_internal"&gt;:annotation-driven transaction-manager="txManager" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;&amp;lt;!-- recuperation des datasources en jndi --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;jee&lt;/span&gt;&lt;span class="tag_internal"&gt;:jndi-lookup&lt;span class="attribute"&gt; id=&lt;span class="value"&gt;"datasource1"&lt;/span&gt;&lt;/span&gt; jndi-name="jdbc/ds1" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;jee&lt;/span&gt;&lt;span class="tag_internal"&gt;:jndi-lookup&lt;span class="attribute"&gt; id=&lt;span class="value"&gt;"datasource2"&lt;/span&gt;&lt;/span&gt; jndi-name="jdbc/ds2" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;jee&lt;/span&gt;&lt;span class="tag_internal"&gt;:jndi-lookup&lt;span class="attribute"&gt; id=&lt;span class="value"&gt;"datasource3"&lt;/span&gt;&lt;/span&gt; jndi-name="jdbc/ds3" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;jee&lt;/span&gt;&lt;span class="tag_internal"&gt;:jndi-lookup&lt;span class="attribute"&gt; id=&lt;span class="value"&gt;"datasource4"&lt;/span&gt;&lt;/span&gt; jndi-name="jdbc/ds4" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;&amp;lt;!-- declaration du transaction manager --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; name=&lt;span class="value"&gt;"txManager"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; id=&lt;span class="value"&gt;"txManager"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; class=&lt;span class="value"&gt;"com.springsource.open.db.ChainedTransactionManager"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;property&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; name=&lt;span class="value"&gt;"transactionManagers"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;list&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; class=&lt;span class="value"&gt;"org.springframework.jdbc.datasource.DataSourceTransactionManager"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;property&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; name=&lt;span class="value"&gt;"dataSource"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; ref=&lt;span class="value"&gt;"datasource1"&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; class=&lt;span class="value"&gt;"org.springframework.jdbc.datasource.DataSourceTransactionManager"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;property&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; name=&lt;span class="value"&gt;"dataSource"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; ref=&lt;span class="value"&gt;"datasource2"&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; class=&lt;span class="value"&gt;"org.springframework.jdbc.datasource.DataSourceTransactionManager"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;property&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; name=&lt;span class="value"&gt;"dataSource"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; ref=&lt;span class="value"&gt;"datasource3"&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; class=&lt;span class="value"&gt;"org.springframework.jdbc.datasource.DataSourceTransactionManager"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;property&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; name=&lt;span class="value"&gt;"dataSource"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; ref=&lt;span class="value"&gt;"datasource4"&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;list&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;property&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Dans l'environnement de production avec Jboss, pas de soucis, j'utilise le transaction manager JTA de spring (&lt;a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/transaction/jta/JtaTransactionManager.html"&gt;org.springframework.transaction.jta.JtaTransactionManager&lt;/a&gt;). Voici l'extrait de la conf Spring correspondante :&lt;br /&gt;&lt;pre&gt;&lt;code class="xml"&gt; &lt;span class="comment"&gt;&amp;lt;!-- transaction manager JTA --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;bean&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; name=&lt;span class="value"&gt;"txManager"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; class=&lt;span class="value"&gt;"org.springframework.transaction.jta.JtaTransactionManager"&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;&amp;lt;!-- aop pour la gestion des transactions --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;tx&lt;/span&gt;&lt;span class="tag_internal"&gt;:annotation-driven transaction-manager="txManager" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-1865514404665577055?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/1865514404665577055/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=1865514404665577055' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1865514404665577055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1865514404665577055'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2009/01/supprimer-les-ejbs-par-spring.html' title='Supprimer les EJbs par Spring'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-3602894224488836249</id><published>2008-11-14T09:58:00.002+01:00</published><updated>2008-11-14T10:25:50.326+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven et les dépendances transitives</title><content type='html'>Une des évolutions de maven2 par rapport à maven1 concerne la gestion de dépendances transitives : La définition d'une dépendance au niveau d'un projet entraîne la récupération des dépendances de cette dépendance et ainsi de suite...&lt;br /&gt;&lt;br /&gt;Sur de gros projets, la gestion des dépendances avec Maven est quasiment indispensable. J'ai même dû mal à comprendre qu'on puisse faire sans.&lt;br /&gt;&lt;br /&gt;Avec les dépendances transitives, on se retrouve vite à récupérer la terre entière et à avoir des dépendances qui utilisent des dépendances transitives communes mais dans des versions différentes...&lt;br /&gt;&lt;br /&gt;On voit apparaître des exceptions du type "NoClassDefFoundError" à l'exécution et c'est là que le casse tête commence...&lt;br /&gt;&lt;br /&gt;Voici ce que j'utilise pour résoudre ce genre de problème :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;la commande du plugin maven "dependency" pour découvrir les dépendances en double :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;mvn dependency:tree&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;La mise en place de tags d'exclusion au niveau des pom.xml pour permettre de définir une dépendance mais d'exclure certaines de ces dépendances transitives :&lt;br /&gt;&lt;pre&gt;&lt;code class="xml"&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;dependency&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;groupId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;yourDependencyGroupId&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;groupId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;yourDependencyArtifactId&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;yourDependencyVersion&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;exclusions&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;exclusion&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;groupId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;ExcludedTransitiveDependencyGroupId&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;groupId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;ExcludedTransitiveDependencyArtifactId&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;exclusion&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;exclusions&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;dependency&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-3602894224488836249?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/3602894224488836249/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=3602894224488836249' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3602894224488836249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3602894224488836249'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/11/maven-et-les-dpendances-transitives.html' title='Maven et les dépendances transitives'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-9129298473187607023</id><published>2008-11-07T13:56:00.010+01:00</published><updated>2008-11-07T14:39:19.392+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Scrum fait peur</title><content type='html'>Et plus largement les méthodes Agiles.&lt;br /&gt;&lt;br /&gt;C'est le constat que je peux faire dans le contexte dans lequel j'évolue.&lt;br /&gt;&lt;br /&gt;Je me suis longtemps dit qu'en effet, se lancer dans un premier projet en &lt;a href="http://www.scrumalliance.org/pages/what_is_scrum"&gt;Scrum&lt;/a&gt; peut faire peur alors que l'on n'a jamais fait cela auparavant. En revanche, lorsque le contexte le permet, que des gens compétents sur le sujet y participent et qu'il n'y a pas réellement de risques à faire "un essai" ( :-) les experts comprendront...) , j'ai plus de mal à comprendre...&lt;br /&gt;&lt;br /&gt;Une des grosses évolutions par rapport à des méthodes de gestion de projet dites "traditionnelles" (ou plutôt celles qui ne fonctionne pas ou peu) concerne le métier de chef de projet qui n'existe plus car il est remplacé/transféré par le rôle du ScrumMaster.&lt;br /&gt;&lt;br /&gt;En se mettant un peu à la place d'un chef de projet, il est plus facile de comprendre (mais pas forcément d'accepter) leurs points de vue. Imaginons qu'on vienne vous dire que votre façon de travailler depuis des années soit totalement remise en questions, que des retours d'expériences vous démontre que c'est presque une évidence et que vous n'y avez pas pensé. Cela ne doit pas être évident à encaisser...&lt;br /&gt;&lt;br /&gt;Messieurs les chefs de projets, je vous le dit :&lt;br /&gt;Scrum ça n'est pas l'avenir, c'est tout de suite! Allez-y!&lt;br /&gt;&lt;br /&gt;Juste pour le fun, une petite tendance à la google :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_xTcJwT_7XDI/SRRAh7Gf59I/AAAAAAAABZ8/eaLkLMauiMg/s1600-h/rup-scrum.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 292px;" src="http://1.bp.blogspot.com/_xTcJwT_7XDI/SRRAh7Gf59I/AAAAAAAABZ8/eaLkLMauiMg/s400/rup-scrum.PNG" alt="" id="BLOGGER_PHOTO_ID_5265904815847761874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;en bleu : rational unified process&lt;br /&gt;en rouge : Scrum agile&lt;br /&gt;&lt;br /&gt;Comme le précisez Claude Aubry sur son blog dans &lt;a href="http://www.aubryconseil.com/dotclear/index.php/2007/04/05/202-scrum-fait-peur"&gt;ce billet&lt;/a&gt; en 2007, il faut faire attention à ne pas créer un Buzz autour de Scrum et le transformer en une méthode un peu originale et à la mode. Scrum c'est avant tout un ensemble de pratiques simples et pragmatiques à mettre en œuvre pour réussir un projet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-9129298473187607023?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/9129298473187607023/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=9129298473187607023' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/9129298473187607023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/9129298473187607023'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/11/scrum-fait-peur.html' title='Scrum fait peur'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_xTcJwT_7XDI/SRRAh7Gf59I/AAAAAAAABZ8/eaLkLMauiMg/s72-c/rup-scrum.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-8280145506203853612</id><published>2008-11-03T09:35:00.004+01:00</published><updated>2008-11-03T09:42:33.636+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Une métaphore de Scrum</title><content type='html'>Le Touilleur Express vient de publier une métaphore permettant d'expliquer les grands concepts autour de Scrum.&lt;br /&gt;&lt;br /&gt;Pour Simplifier, Scrum : c'est une machine à laver. J'adore.&lt;br /&gt;&lt;br /&gt;Je vous laisse aller lire &lt;a href="http://www.touilleur-express.fr/2008/11/02/scrum-une-histoire-de-lave-linge/"&gt;le billet du Touilleur Express &lt;/a&gt;sur le sujet pour avoir plus d'infos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-8280145506203853612?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/8280145506203853612/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=8280145506203853612' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8280145506203853612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8280145506203853612'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/11/une-mtaphore-de-scrum.html' title='Une métaphore de Scrum'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-2656423390666022508</id><published>2008-10-17T16:42:00.004+02:00</published><updated>2008-10-17T16:58:16.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Retour sur... l'Agile Tour 2008 à Lille</title><content type='html'>L'Agile Tour 2008 à fait escale mardi dernier à Lille.&lt;br /&gt;&lt;br /&gt;Pour résumé :&lt;br /&gt;- les locaux de l'école d'ingénieurs Telecom Lille1 était impeccable pour l'évènement.&lt;br /&gt;- l'organisation était sans faille.&lt;br /&gt;- les sessions (soit orientées "présentation" soit orientées "atelier")  étaient de grande qualité.&lt;br /&gt;&lt;br /&gt;J'ai été surpris de voir que le public semblait majoritairement connaître les grands principes autour des méthodes Agiles. Ce n'est peut-être qu'une impression liée au public des sessions auxquelles j'ai assisté...&lt;br /&gt;&lt;br /&gt;Le seul reproche que je puisse faire : c'était trop court! En même temps, ce n'est que la première édition. Il ne faut pas être trop gourmand...&lt;br /&gt;&lt;br /&gt;En tous cas pour une première, c'était vraiment bien!&lt;br /&gt;&lt;br /&gt;Vivement l'année prochaine! Enfin je l'espère.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-2656423390666022508?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/2656423390666022508/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=2656423390666022508' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2656423390666022508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2656423390666022508'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/10/retour-sur-lagile-tour-2008-lille.html' title='Retour sur... l&apos;Agile Tour 2008 à Lille'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-8298330826820596199</id><published>2008-10-08T15:21:00.003+02:00</published><updated>2008-10-08T15:38:30.478+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Iphone, la belle bête</title><content type='html'>Je suis l'heureux possesseur d'un &lt;a href="http://www.apple.com/fr/iphone/"&gt;Iphone 3G&lt;/a&gt; depuis quelques semaines (merci chérie...).&lt;br /&gt;&lt;br /&gt;L'Iphone pour moi c'est :&lt;br /&gt;- un bel objet.&lt;br /&gt;- un gadget perso.&lt;br /&gt;- un outil pro.&lt;br /&gt;- une ergonomie incroyable.&lt;br /&gt;- un &lt;a href="http://www.apple.com/fr/itunes/"&gt;Ipod&lt;/a&gt;.&lt;br /&gt;- un téléphone conviviale.&lt;br /&gt;mais c'est surtout : &lt;span style="font-weight: bold;"&gt;internet dans la poche&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Il fallait le dire. C'est chose faite...&lt;br /&gt;&lt;br /&gt;J'ai dû recevoir 2 MMS dans ma vie dont un juste après l'obtention de l'Iphone... et la c'est le drame.&lt;br /&gt;&lt;br /&gt;Heureusement j'ai été voir le fameux MMS sur le site d'Orange avec l'Iphone. Et Hop, ça c'est fait.:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-8298330826820596199?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/8298330826820596199/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=8298330826820596199' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8298330826820596199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8298330826820596199'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/10/iphone-la-belle-bte.html' title='Iphone, la belle bête'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-2120738829901231792</id><published>2008-10-06T13:36:00.003+02:00</published><updated>2008-10-06T13:41:42.546+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Agile Tour 2008</title><content type='html'>Un grand rendez-vous à ne pas manquer!!!&lt;br /&gt;&lt;br /&gt;L'Agile Tour "Le rendez-vous francophone de l'agilité" (&lt;a href="http://www.agiletour.com/"&gt;http://www.agiletour.com/&lt;/a&gt;) passe par Lille le 14 Octobre Après-midi.&lt;br /&gt;&lt;br /&gt;Pour ceux que ça intéresse (débutant, amateur ou professionnel), il est possible de s'inscrire sur le site.&lt;br /&gt;&lt;br /&gt;Voici le wiki de la session de Lille : &lt;a href="http://wiki.agiletour.com/At2008Lille"&gt;http://wiki.agiletour.com/At2008Lille&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-2120738829901231792?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/2120738829901231792/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=2120738829901231792' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2120738829901231792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2120738829901231792'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/10/agile-tour-2008.html' title='Agile Tour 2008'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-1819304695485916347</id><published>2008-08-28T17:29:00.004+02:00</published><updated>2008-08-28T17:38:50.376+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java tips'/><category scheme='http://www.blogger.com/atom/ns#' term='template'/><title type='text'>Java, Moteur de template : Freemarker</title><content type='html'>Voici un moteur de template efficace : &lt;a href="http://freemarker.sourceforge.net/"&gt;Freemarker&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le concept et de concevoir un template (un modèle contenant des "variables") :&lt;br /&gt;inputTemplate.ftl :&lt;br /&gt;&lt;pre&gt;&lt;code class="html"&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;head&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;title&lt;/span&gt;&amp;gt;&lt;/span&gt;les Contacts&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;title&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;head&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;body&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;Les contacts de ${carnet.proprietaire.prenom} ${carnet.proprietaire.nom}&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;table&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;tr&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;td&lt;/span&gt;&amp;gt;&lt;/span&gt;nom&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;td&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;td&lt;/span&gt;&amp;gt;&lt;/span&gt;prenom&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;td&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;tr&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;#list carnet.lesContacts as unContact&amp;gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;tr&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;td&lt;/span&gt;&amp;gt;&lt;/span&gt;${unContact.nom}&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;td&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;td&lt;/span&gt;&amp;gt;&lt;/span&gt;${unContact.prenom}&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;td&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;tr&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/#list&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;table&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;body&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Construire une structure objet contenant les valeurs des variables à remplacer dans le template :&lt;br /&gt;&lt;pre&gt;&lt;code class="php"&gt;  Map root = &lt;span class="keyword"&gt;new&lt;/span&gt; HashMap();&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* structure agenda */&lt;/span&gt;&lt;br /&gt;Map agenda = &lt;span class="keyword"&gt;new&lt;/span&gt; HashMap();&lt;br /&gt;root.put(&lt;span class="string"&gt;"carnet"&lt;/span&gt;, agenda);&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* structure proprietaire (dans agenda) */&lt;/span&gt;&lt;br /&gt;Map proprietaire = &lt;span class="keyword"&gt;new&lt;/span&gt; HashMap();&lt;br /&gt;agenda.put(&lt;span class="string"&gt;"proprietaire"&lt;/span&gt;, proprietaire);&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* remplissage de la structure proprietaire */&lt;/span&gt;&lt;br /&gt;proprietaire.put(&lt;span class="string"&gt;"nom"&lt;/span&gt;, &lt;span class="string"&gt;"Dupont"&lt;/span&gt;);&lt;br /&gt;proprietaire.put(&lt;span class="string"&gt;"prenom"&lt;/span&gt;, &lt;span class="string"&gt;"Jean"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* structure contacts (dans agenda */&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;List&lt;/span&gt; lesContacts = &lt;span class="keyword"&gt;new&lt;/span&gt; ArrayList();&lt;br /&gt;agenda.put(&lt;span class="string"&gt;"lesContacts"&lt;/span&gt;, lesContacts);&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* remplissage des contacts */&lt;/span&gt;&lt;br /&gt;Map unContact = &lt;span class="keyword"&gt;new&lt;/span&gt; HashMap();&lt;br /&gt;lesContacts.add(unContact);&lt;br /&gt;unContact.put(&lt;span class="string"&gt;"nom"&lt;/span&gt;, &lt;span class="string"&gt;"Bond"&lt;/span&gt;);&lt;br /&gt;unContact.put(&lt;span class="string"&gt;"prenom"&lt;/span&gt;, &lt;span class="string"&gt;"James"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;unContact = &lt;span class="keyword"&gt;new&lt;/span&gt; HashMap();&lt;br /&gt;lesContacts.add(unContact);&lt;br /&gt;unContact.put(&lt;span class="string"&gt;"nom"&lt;/span&gt;, &lt;span class="string"&gt;"Woman"&lt;/span&gt;);&lt;br /&gt;unContact.put(&lt;span class="string"&gt;"prenom"&lt;/span&gt;, &lt;span class="string"&gt;"Cat"&lt;/span&gt;);&lt;/code&gt;&lt;/pre&gt;Fusionner le template et la structure objet dans un fichier de destination :&lt;br /&gt;&lt;pre&gt;&lt;code class="php"&gt;   InputStreamReader fileTemplate = &lt;span class="keyword"&gt;new&lt;/span&gt; InputStreamReader(ClassLoader&lt;br /&gt;   .getSystemResourceAsStream(&lt;span class="string"&gt;"inputTemplate.ftl"&lt;/span&gt;));&lt;br /&gt; Configuration cfg = &lt;span class="keyword"&gt;new&lt;/span&gt; Configuration();&lt;br /&gt; cfg.setObjectWrapper(&lt;span class="keyword"&gt;new&lt;/span&gt; DefaultObjectWrapper());&lt;br /&gt; Template temp = &lt;span class="keyword"&gt;new&lt;/span&gt; Template(&lt;span class="string"&gt;"inputTemplate.ftl"&lt;/span&gt;, fileTemplate, cfg);&lt;br /&gt;&lt;br /&gt; Writer out = &lt;span class="keyword"&gt;new&lt;/span&gt; OutputStreamWriter(System.out);&lt;br /&gt; temp.process(root, out);&lt;br /&gt; out.flush();&lt;br /&gt; out.close();&lt;/code&gt;&lt;/pre&gt;C'est évidemment un exemple assez simple mais les possibilités offertes par Freemarker sont très larges.&lt;br /&gt;&lt;br /&gt;Pour plus d'informations : &lt;a href="http://freemarker.sourceforge.net/"&gt;http://freemarker.sourceforge.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-1819304695485916347?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/1819304695485916347/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=1819304695485916347' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1819304695485916347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1819304695485916347'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/08/java-moteur-de-template.html' title='Java, Moteur de template : Freemarker'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4178893755631046781</id><published>2008-08-27T08:25:00.004+02:00</published><updated>2008-08-27T09:16:04.915+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java tips'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Java: Scanner un répertoire</title><content type='html'>Dans la cadre du développement de plugin &lt;a href="http://maven.apache.org/"&gt;maven 2&lt;/a&gt;, récupérer un ensemble de fichier selon certains critères peut être intéressant :&lt;br /&gt;- récupérer un sous ensemble de fichiers source java.&lt;br /&gt;- récupérer un ensemble de properties.&lt;br /&gt;- ...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://plexus.codehaus.org/plexus-utils/project-reports.html"&gt;Plexus&lt;/a&gt; est là! Cette librairie est déjà largement utilisée par les plugins maven 2.&lt;br /&gt;&lt;br /&gt;La classe &lt;a href="http://plexus.codehaus.org/plexus-utils/apidocs/index.html"&gt;DirectoryScanner&lt;/a&gt; vous permettra de faire ça.&lt;br /&gt;Il faut lui spécifier :&lt;br /&gt;- un répertoire de base.&lt;br /&gt;- des patterns d'inclusions et d'exclusions (en options) du style "**/**.properties".&lt;br /&gt;puis appeler la méthode scan() et récupérer ensuite un tableau avec l'ensemble des chemins des fichiers correspondant à la recherche.&lt;br /&gt;&lt;br /&gt;Pour plus d'informations, tout est dans la javadoc de la classe.&lt;br /&gt;&lt;br /&gt;wonderfull!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4178893755631046781?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4178893755631046781/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4178893755631046781' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4178893755631046781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4178893755631046781'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/08/java-scanner-un-rpertoire.html' title='Java: Scanner un répertoire'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-7696414509261092609</id><published>2008-08-21T10:21:00.003+02:00</published><updated>2008-08-21T11:13:00.388+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='xpath'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>requête XPath en java</title><content type='html'>Une solution simple (à mon goût) existe pour récupérer une valeur ou un attribut dans un fichier &lt;a href="http://fr.wikipedia.org/wiki/Xml"&gt;Xml&lt;/a&gt; en java sans avoir à le parcourir complètement avec &lt;a href="http://fr.wikipedia.org/wiki/Simple_API_for_XML"&gt;Sax&lt;/a&gt; ou avec Dom.&lt;br /&gt;&lt;br /&gt;Voici un petit exemple de mise en œuvre des &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/package-summary.html"&gt;APIS XPATH&lt;/a&gt; de java 1.5 s'appuyant sur Sax :&lt;br /&gt;&lt;br /&gt;Voici le fichier XML source :&lt;br /&gt;&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;level1&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;level2&lt;span class="attribute"&gt; level&lt;/span&gt;2-attribute1="valueOfLevel2-attribute1"&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="tag"&gt;&amp;lt;level3&lt;span class="attribute"&gt; level&lt;/span&gt;3-attribute1="valueOfLevel3-attribute1"&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="tag"&gt;&amp;lt;level41&amp;gt;&lt;/span&gt;valueOfLevel41&lt;span class="tag"&gt;&amp;lt;/level41&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="tag"&gt;&amp;lt;level42&amp;gt;&lt;/span&gt;valueOfLevel42&lt;span class="tag"&gt;&amp;lt;/level42&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="tag"&gt;&amp;lt;/level3&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;/level2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/level1&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;le code "technique" :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="java"&gt;...&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; java.io.InputStream;&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; javax.xml.xpath.XPath;&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; javax.xml.xpath.XPathConstants;&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; javax.xml.xpath.XPathExpression;&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; javax.xml.xpath.XPathExpressionException;&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; javax.xml.xpath.XPathFactory;&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; org.xml.sax.InputSource;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt; &lt;br /&gt; &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;static&lt;/span&gt; String executeXpath(InputStream sourceXml, String xPathQuery)&lt;br /&gt;   &lt;span class="keyword"&gt;throws&lt;/span&gt; XPathExpressionException {&lt;br /&gt;&lt;br /&gt;  &lt;span class="comment"&gt;// creation de la source sax&lt;/span&gt;&lt;br /&gt;  InputSource source = &lt;span class="keyword"&gt;new&lt;/span&gt; InputSource(sourceXml);&lt;br /&gt;&lt;br /&gt;  &lt;span class="comment"&gt;// creation de la requete XPTAH&lt;/span&gt;&lt;br /&gt;  XPathFactory xPathFactory = XPathFactory.newInstance();&lt;br /&gt;  XPath xpath = xPathFactory.newXPath();&lt;br /&gt;  XPathExpression xPathExpression = xpath.compile(xPathQuery);&lt;br /&gt;&lt;br /&gt;  &lt;span class="comment"&gt;/* execution de la requete xPath sur le fichier XML */&lt;/span&gt;&lt;br /&gt;  String resultat = (String) xPathExpression.evaluate(source,&lt;br /&gt;    XPathConstants.STRING);&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;return&lt;/span&gt; resultat;&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt; ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;La mise en œuvre :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="java"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;static&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; main(String[] args) {&lt;br /&gt;&lt;br /&gt;      &lt;span class="keyword"&gt;try&lt;/span&gt; {&lt;br /&gt;          &lt;span class="comment"&gt;/* recuperation du flux xml */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;          InputStream xml = &lt;span class="keyword"&gt;null&lt;/span&gt;;&lt;br /&gt;          String result = &lt;span class="keyword"&gt;null&lt;/span&gt;;&lt;br /&gt;          String xPathQuery = &lt;span class="keyword"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;          &lt;span class="comment"&gt;/* exemple 1 */&lt;/span&gt;&lt;br /&gt;          xml = Main.&lt;span class="keyword"&gt;class&lt;/span&gt;.getResourceAsStream(&lt;span class="string"&gt;"/fichier.xml"&lt;/span&gt;);&lt;br /&gt;          xPathQuery = &lt;span class="string"&gt;"/level1/level2/@level2-attribute1"&lt;/span&gt;;&lt;br /&gt;          result = XpathHelper.executeXpath(xml, xPathQuery);&lt;br /&gt;&lt;br /&gt;          System.out.println(&lt;span class="string"&gt;"xpathQuery : "&lt;/span&gt; + xPathQuery&lt;br /&gt;                  + &lt;span class="string"&gt;"---&amp;gt; resultat : "&lt;/span&gt; + result);&lt;br /&gt;&lt;br /&gt;          &lt;span class="comment"&gt;/* exemple 2 */&lt;/span&gt;&lt;br /&gt;          xml = Main.&lt;span class="keyword"&gt;class&lt;/span&gt;.getResourceAsStream(&lt;span class="string"&gt;"/fichier.xml"&lt;/span&gt;);&lt;br /&gt;          xPathQuery = &lt;span class="string"&gt;"/level1/level2/level3/level41"&lt;/span&gt;;&lt;br /&gt;          result = XpathHelper.executeXpath(xml, xPathQuery);&lt;br /&gt;&lt;br /&gt;          System.out.println(&lt;span class="string"&gt;"xpathQuery : "&lt;/span&gt; + xPathQuery&lt;br /&gt;                  + &lt;span class="string"&gt;"---&amp;gt; resultat : "&lt;/span&gt; + result);&lt;br /&gt;      } &lt;span class="keyword"&gt;catch&lt;/span&gt; (XPathExpressionException e) {&lt;br /&gt;          e.printStackTrace();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;  }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Le résultat en console :&lt;br /&gt;&lt;pre&gt;&lt;code class="cpp"&gt;xpathQuery : /level1/level2/@level2-attribute1---&amp;gt; resultat : valueOfLevel2-attribute1&lt;br /&gt;xpathQuery : /level1/level2/level3/level41---&amp;gt; resultat : valueOfLevel41&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Le tout a le mérite d'être assez simple, élégant et performant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-7696414509261092609?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/7696414509261092609/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=7696414509261092609' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7696414509261092609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7696414509261092609'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/08/requte-xpath-en-java.html' title='requête XPath en java'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4554101478019684230</id><published>2008-07-23T09:47:00.012+02:00</published><updated>2008-07-24T17:31:58.413+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Migration Maven 2 : 2ème épisode : la procédure</title><content type='html'>Suite de la migration... Comme je le précisais dans le première épisode dans ce &lt;a href="http://jsevellec.blogspot.com/2008/07/migration-maven2-1re-pisode.html"&gt;post&lt;/a&gt;. J'ai procédé à la migration de gros applicatifs J2EE de maven 1 vers maven 2.&lt;br /&gt;&lt;br /&gt;Une fois devant l'écran, un peu comme un écrivain, c'est un peu la page blanche : Par où commencer???&lt;br /&gt;&lt;br /&gt;Je vais m'efforcer de vous décrire la procédure que j'ai appliquée:&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Maitriser et comprendre l'applicatif et le processus de build maven 1 existant :&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Avant tout, je pense qu'il faut bien connaître l'applicatif ainsi que le processus de build à migrer, en tous cas d'un point de vue technique. Cette connaissance va permettre de déceler les points sur lesquels il va falloir mettre l'accent plus particulièrement (où ça va coincer :-))&lt;br /&gt;Dans mon cas, il se trouve que quasiment chaque projet java (l'applicatif est composé d'un ensemble de projets java) est muni de son project.xml mais surtout est quasiment toujours accompagné d'un fichier maven.xml. Pas de chance, il y a pas mal de spécificités de build qui ont été mises en œuvre : génération de code source en tout genre, concaténation de fichiers, exécution de tâches ant diverses et variées,...&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Posséder une plateforme "témoin" :&lt;/li&gt;&lt;/ul&gt;Un des principales objectifs est de réussir à fournir, avec un processus de build différent, les mêmes livrables j2EE (un ear et plusieurs wars dans mon cas). Je me suis installé l'ensemble de la plateforme de développement et effectué des builds avec le processus de build maven 1 existant. Ce système permet d'avoir un environnement "témoin" permettant d'effectuer des comparaisons entre l'ancien build et le nouveau build. Concrètement, ça revient à récupérer 2 fois les projets de sources sur le poste:&lt;br /&gt;- les projets de sources maven 1 "témoin".&lt;br /&gt;- les projets de sources  sur lesquels travailler pour effectuer la migration maven 2.&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Migrer les dépendances&lt;/li&gt;&lt;/ul&gt;Dans un premier temps, il faut analyser et lister les dépendances dont le projet a besoin. Un bon vieux tableur facilite le travail. Pour chacune de ces dépendances, il faut vérifier si elle est disponible dans un repository maven 2 sur la toile grâce &lt;a href="http://jsevellec.blogspot.com/2008/02/maven-2-recherche-de-jars.html"&gt;à ce site&lt;/a&gt; par exemple. Pour celles qui n'existent pas, il faut les installer dans le repository maven 2 de l'entreprise (s'il n'y en a pas, c'est un travail à faire... et pourquoi pas aussi mettre en œuvre &lt;a href="http://archiva.apache.org/"&gt;Archiva&lt;/a&gt; , oulaaa, je m'emballe!) :&lt;br /&gt;&lt;pre&gt;&lt;code class="perl"&gt;mvn deploy:deploy-file -Durl=file://C:\m2-repo \&lt;br /&gt;                    -DrepositoryId=some.id \&lt;br /&gt;                    -Dfile=your-artifact-1.0.jar \&lt;br /&gt;                    [-DpomFile=your-pom.xml] \&lt;br /&gt;                    [-DgroupId=org.some.group] \&lt;br /&gt;                    [-DartifactId=your-artifact] \&lt;br /&gt;                    [-Dversion=1.0] \&lt;br /&gt;                    [-Dpackaging=jar] \&lt;br /&gt;                    [-Dclassifier=test] \&lt;br /&gt;                    [-DgeneratePom=true] \&lt;br /&gt;                    [-DgeneratePom.description="My Project Description"] \&lt;br /&gt;                    [-DrepositoryLayout=legacy] \&lt;br /&gt;                    [-DuniqueVersion=false]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Mettre en place un premier pom.xml&lt;/li&gt;&lt;/ul&gt;Dans le cadre d'applicatif j2EE découpé en un ensemble de projets Java/Maven, il est difficile de migrer l'ensemble des POM en une seule fois. Il est important de procéder de façon itérative et de se concentrer sur la migration d'un des projets (simple en terme de build si possible) pour commencer.&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Capitaliser et centraliser le build&lt;/li&gt;&lt;/ul&gt;Les possiblités en terme d'héritage et de gestion "multi module" de Maven permettent :&lt;br /&gt;- de réutiliser comportement de Pom en définissant des Pom parent, grand-parent, ...&lt;br /&gt;- de piloter l'ensemble des projets en définissant un Pom multimodule.&lt;br /&gt;&lt;br /&gt;En conservant à l'esprit ce type de pratique, j'ai progressivement procédé à des refactorings de Pom au fur et à mesure de la mise en place des Pom des projets. Voici une version simplifiée de mon arborescence de Pom :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;pom "base"&lt;br /&gt;pom projet utilitaire&lt;br /&gt;...&lt;br /&gt;pom "webapp"&lt;br /&gt;  pom webapp1&lt;br /&gt;  pom webapp2&lt;br /&gt;  ...&lt;br /&gt;pom "ejb"&lt;br /&gt;  pom ejb1&lt;br /&gt;  pom ejb2&lt;br /&gt;  ...&lt;/code&gt;&lt;/pre&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Migrer les spécificités maven 1 : "exit maven.xml"&lt;/li&gt;&lt;/ul&gt;Une fois le comportement global du build définit, les spécificités de build maven 1 viennent vite bloquer le processus de migration, notamment en ce qui concerne la génération de code qui a un impact sur la compilation (ça compile si le code a été généré sinon non...).&lt;br /&gt;Voici quelques exemples de spécificités :&lt;br /&gt;- génération des classes techniques ejb avec ejbDoclet de XDoclet : cette génération était pilotée en Maven 1 par le lancement de tâche Ant. Le plugin &lt;a href="http://maven.apache.org/plugins/maven-antrun-plugin/"&gt;maven2 antrun&lt;/a&gt; a permis de faire la migration.&lt;br /&gt;- génération d'un fichier par concaténation d'un ensemble de fichiers : La concaténation était effectuée en jelly... La seule solution était de mettre en place un plugin maven 2 qui effectue le travail.&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Rester zen...&lt;/li&gt;&lt;/ul&gt;Une fois passé le cap du "BUILD SUCCEFULL" (qui , d'ailleurs, fait bien plaisir), le gros du travail est effectué. Le reste correspond a des ajustements mais des ajustements qui font d'ailleurs perdre pas mal de temps. Dans mon cas , le build du projet dans son ensemble prend dans les 10 minutes. Pour tester une modification, une seule solution : reBUILDER! Il faut savoir être patient et se dire que si on devait le faire soi-même on mettrait 3h pour faire un seul build...&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Comparer les livrables j2EE entre le build maven 1 témoin et le nouveau build maven2&lt;/li&gt;&lt;/ul&gt;Les principaux ajustements à effectuer pour obtenir des contenus de livrables (ear et wars) identiques concernent les dépendances dans les archives war et ear. Avec maven 2 et la transitivité des dépendances, j'ai dû ajuster les choses en terme de versions et de porter de jars pour finalement obtenir des dossiers de "lib" identiques.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tester les nouveaux livrables&lt;/li&gt;&lt;/ul&gt;Il faut ensuite déployer les nouveaux livrables pour valider que l'application fonctionne toujours... et procéder à des ajustements en terme de fichiers de conf J2EE notamment ceux propres au serveurs d'applications (ex : weblogic.xml, jboss-web.xml, ...).&lt;br /&gt;&lt;br /&gt;Une fois ce cap franchi, on pense avoir quasiment terminé... mais il reste des choses à faire...&lt;br /&gt;Ha, mon build vient de se terminer, la suite dans le prochain épisode...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4554101478019684230?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4554101478019684230/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4554101478019684230' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4554101478019684230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4554101478019684230'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/07/migration-maven-2-2me-pisode-la.html' title='Migration Maven 2 : 2ème épisode : la procédure'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4039869123328357456</id><published>2008-07-15T14:45:00.010+02:00</published><updated>2008-07-23T11:17:22.470+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Migration Maven 2 : 1ère épisode : Le contexte</title><content type='html'>Je me suis attelé ses derniers jours (voir mois) chez mon client à entreprendre la migration de gros applicatifs &lt;a href="http://maven.apache.org/maven-1.x/"&gt;maven 1&lt;/a&gt; vers &lt;a href="http://maven.apache.org/"&gt;maven 2&lt;/a&gt;. Je vais essayer de vous faire profiter d'un retour d'expérience sur le sujet car je n'ai pas trouvé de méthodes miracles de migration.&lt;br /&gt;&lt;br /&gt;Je vais y consacrer un certains nombres de billets. Le dossier est assez touffu...&lt;br /&gt;&lt;br /&gt;Pour commencer, voici le contexte des applicatifs qui doivent être migrer :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;applicatifs &lt;a href="http://fr.wikipedia.org/wiki/J2EE"&gt;j2EE&lt;/a&gt; multi module (ear contenant un ensemble d'ejb sessions + mutli war).&lt;/li&gt;&lt;li&gt;héritage de projet maven.&lt;/li&gt;&lt;li&gt;utilisation du multi-projet.&lt;/li&gt;&lt;li&gt;changement du type de packaging (simple jar, ejb-jar ou ejb-jar-client) en fonction de propriétés au moment du build.&lt;/li&gt;&lt;li&gt;génération des classes techniques des ejbs avec &lt;a href="http://xdoclet.sourceforge.net/xdoclet/index.html"&gt;xdoclet&lt;/a&gt; (&lt;a href="http://xdoclet.sourceforge.net/xdoclet/ant/xdoclet/modules/ejb/EjbDocletTask.html"&gt;ejbdoclet&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;génération de classes techniques type "delegate" pour simplifier l'appel aux ejbs avec &lt;a href="http://xdoclet.sourceforge.net/xdoclet/index.html"&gt;xdoclet&lt;/a&gt; (&lt;a href="http://xdoclet.sourceforge.net/xdoclet/ant/xdoclet/DocletTask.html"&gt;template doclet&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;génération des sites projets.&lt;/li&gt;&lt;li&gt;utilisation de &lt;a href="http://fr.wikipedia.org/wiki/Int%C3%A9gration_continue"&gt;l'intégration continue&lt;/a&gt; avec &lt;a href="http://continuum.apache.org/"&gt;continuum&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;dans les 8000 fichiers au contrôle de source (sources + ressources).&lt;/li&gt;&lt;li&gt;une dizaine de minutes à attendre pour faire un build complet.&lt;/li&gt;&lt;li&gt;entre 5 et 20 développeurs par applicatifs.&lt;/li&gt;&lt;li&gt;déjà en production pour certains applicatifs.&lt;/li&gt;&lt;li&gt;application de type stratégiques.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Avant tout on peut se demander pourquoi? Voici les arguments que j'ai pu trouver à part de dire qu'il faut le faire :-) :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Pour      permettre d’utiliser les nouvelles fonctionnalités de Maven2 (&lt;a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html"&gt;transitivité      des dépendances&lt;/a&gt;, &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-profiles.html"&gt;profile&lt;/a&gt;,&lt;a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope"&gt; scope&lt;/a&gt;, …).&lt;/li&gt;&lt;li&gt;Pour      profiter des modifications effectuées sur les fonctionnalités existantes      (gestion multiprojet, héritage)&lt;o:p&gt;.&lt;/o:p&gt;&lt;/li&gt;&lt;li&gt;Pour profiter des améliorations de performances que propose maven 2 (consommation mémoire pendant le build, temps de build &lt;span style=""&gt; &lt;/span&gt;…).&lt;/li&gt;&lt;li&gt;De      simplifier les scripts de build.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Je détaillerai par la suite la démarche de migration qui a été mise en œuvre dès que j'ai un peu de temps entre 2 builds :-).&lt;br /&gt;&lt;br /&gt;La suite dans le prochaine épisode...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4039869123328357456?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4039869123328357456/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4039869123328357456' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4039869123328357456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4039869123328357456'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/07/migration-maven2-1re-pisode.html' title='Migration Maven 2 : 1ère épisode : Le contexte'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4648184432255035957</id><published>2008-06-17T11:30:00.002+02:00</published><updated>2008-06-17T11:34:42.270+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><title type='text'>Vista et Flavie</title><content type='html'>Quand vous êtes triste ou déprimé... n'oubliez pas de regarder cette (vieille) pub de Flavie Flament qui présente Windows Vista. Ensuite tout ira mieux pour vous!! Un grand moment de publicité :-)&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/KOBw_WXPFto&amp;amp;hl=fr"&gt;&lt;embed src="http://www.youtube.com/v/KOBw_WXPFto&amp;amp;hl=fr" type="application/x-shockwave-flash" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4648184432255035957?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4648184432255035957/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4648184432255035957' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4648184432255035957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4648184432255035957'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/06/vista-et-flavie.html' title='Vista et Flavie'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-8910965587189339915</id><published>2008-06-02T11:24:00.006+02:00</published><updated>2008-06-12T13:59:17.278+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven : war dépendant d'un autre war</title><content type='html'>Comment utiliser la gestion de dépendances de maven entre war.&lt;br /&gt;&lt;br /&gt;La problématique posée était la suivante : comment capitaliser et partager des éléments communs dans plusieurs applications web. Ce type de besoin provient en fait à l'existence d'un "framework" proposant des composants communs chez mon client pour permettre de réutiliser des jsp, des scripts Javascripts, des tlds, des images, ... on va l'appeller le "framework war"&lt;br /&gt;&lt;br /&gt;Le but pour moi est de récupérer dans les sources de mon application web dans le répertoire racine de la webapp, l'ensemble des composants du framework war.&lt;br /&gt;&lt;br /&gt;En cherchant un peu, on peut voir que le &lt;a href="http://maven.apache.org/plugins/maven-war-plugin/"&gt;plugin war&lt;/a&gt; de maven propose un goal &lt;a href="http://maven.apache.org/plugins/maven-war-plugin/inplace-mojo.html"&gt;war:inplace&lt;/a&gt;  qui semblerait coller à mon besoin!!! cool!!&lt;br /&gt;&lt;br /&gt;Je définis alors en dépendance de mon application web mon framework war :&lt;br /&gt;&lt;pre&gt;&lt;code class="xml"&gt;&lt;span class="pi"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;project&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;modelVersion&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;4.0.0&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;modelVersion&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;groupId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;fr.sevellec.test&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;groupId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;my-application-webapp&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;packaging&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;war&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;packaging&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;name&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;my application de test pour le fwk&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;name&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;dependencies&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;dependency&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;groupId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;fr.sevellec.fwk&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;groupId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;fwk-war&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;1.0&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;type&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;war&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;type&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;dependency&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;dependencies&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;project&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En plus de la définition des dépendances, il faut préciser le comportement du goal war:inplace :&lt;br /&gt;&lt;pre&gt;&lt;code class="xml"&gt;&lt;span class="comment"&gt;&amp;lt;!-- plugin WAR --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;plugin&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;maven-war-plugin&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;2.0.2&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;executions&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;execution&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;id&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;inplace&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;id&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;phase&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;generate-sources&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;phase&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;goals&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;goal&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;inplace&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;goal&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;goals&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;execution&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;executions&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;configuration&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;warSourceDirectory&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;webapp&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;warSourceDirectory&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;dependentWarExcludes&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;WEB-INF/web.xml,META-INF/**,WEB-INF/classes/**,WEB-INF/lib/**,WEB-INF/conf/**&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;dependentWarExcludes&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;warSourceExcludes&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;/webapp/WEB-INF/lib/**&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;warSourceExcludes&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;useCache&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;false&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;useCache&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;configuration&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;plugin&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La complexité ensuite réside dans les ressources existants à la fois dans mon application web et à la fois dans mon framework war (par exemple, web.xml, struts-config.xml,...). Si j'execute la commande war:inplace, les ressources du framework war vont venir écraser les ressources existantes qui auraient été modifiées. Il faut alors mettre en place un système d'exclusion comme on peu le voir dans la configuration du plugin war :&lt;br /&gt;&lt;pre&gt;&lt;code class="xml"&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;dependentWarExcludes&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;WEB-INF/web.xml,META-INF/**,WEB-INF/classes/**,WEB-INF/lib/**,WEB-INF/conf/**&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;dependentWarExcludes&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;J'ai défini des dépendances au niveau de mon framework war. Je les récupère par transitivité dans le war de mon application web. Super! En revanche, l'utilisation du goals war:inplace rapatrie l'ensemble des dépendances transitives de mon framework war dans le dossier WEB-INF/lib de mon application web. Ce comportement me pose problème car en utilisant eclipse/sysdeo/tomcat ou eclipse/wtp/tomcat pour faire du développement en mode "exploded", la gestion du chargement des librairies est déléguées au plugin sysdeo ou WTP. La présence des librairies dans WEB-INF/lib pendant le développement perturbent le comportement des plugins sysdeo ou WTP.&lt;br /&gt;Pour supprimer ces librairies génante en mode "exploded", j'ai utilisé le plugin ant-tun de maven et exécuté un delete... Je sais, ce n'est pas forcément très élégant mais ça à le mérite de fonctionner :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="xml"&gt;&lt;span class="comment"&gt;&amp;lt;!-- plugin ANT --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;plugin&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;maven-antrun-plugin&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;artifactId&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;1.1&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;version&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;executions&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;execution&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;phase&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;generate-sources&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;phase&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;configuration&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;tasks&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;delete&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; dir=&lt;span class="value"&gt;"${basedir}/webapp/WEB-INF/lib"&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;delete&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; dir=&lt;span class="value"&gt;"${basedir}/webapp/WEB-INF/classes"&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;delete&lt;/span&gt;&lt;span class="tag_internal"&gt;&lt;span class="attribute"&gt; dir=&lt;span class="value"&gt;"${basedir}/webapp/META-INF"&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;tasks&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;configuration&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;goals&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="tag"&gt;&amp;lt;&lt;span class="title"&gt;goal&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;run&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;goal&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;goals&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;execution&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;executions&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="title"&gt;plugin&lt;/span&gt;&lt;span class="tag_internal"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;L'ordre de déclaration des plugins dans le pom.xml de ma webapp à une importance. Il faut déclarer le plugin war avant le plugin ant car les goals des 2 plugins s'exécutent dans la même phase.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-8910965587189339915?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/8910965587189339915/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=8910965587189339915' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8910965587189339915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8910965587189339915'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/06/maven-war-dpendant-dun-autre-war.html' title='Maven : war dépendant d&apos;un autre war'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-6079739946350907663</id><published>2008-05-30T14:39:00.004+02:00</published><updated>2010-06-06T14:56:00.600+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Google I/O : une démo Android</title><content type='html'>Voici une petite démo de plus de la plateforme Google Android provenant de la conférence google I/O à San Francisco:&lt;br /&gt;&lt;br /&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/sOSk9TW7z-4&amp;hl=fr"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/sOSk9TW7z-4&amp;hl=fr" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-6079739946350907663?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/6079739946350907663/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=6079739946350907663' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6079739946350907663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6079739946350907663'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/05/google-io-une-dmo-android.html' title='Google I/O : une démo Android'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-2544171511369826500</id><published>2008-05-28T13:53:00.006+02:00</published><updated>2008-05-28T15:43:48.513+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intégration continue'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Continuum, Maven2 et Clearcase</title><content type='html'>C'est possible!&lt;br /&gt;&lt;br /&gt;Faire de &lt;a href="http://fr.wikipedia.org/wiki/Int%C3%A9gration_continue"&gt;l'intégration continue&lt;/a&gt; en utilisant le trio &lt;a href="http://continuum.apache.org/"&gt;Continuum&lt;/a&gt; / &lt;a href="http://maven.apache.org/"&gt;Maven2&lt;/a&gt; / &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; est bien répandu. Le trio maintenant bien huilé...&lt;br /&gt;&lt;br /&gt;Il se trouve que chez mon client, le système de gestion de contrôle de source est le produit d'IBM : &lt;a href="http://www-306.ibm.com/software/awdtools/clearcase/"&gt;Rational Clearcase&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Dans le cadre de la mise en oeuvre d'un serveur d'intégration continue, il a alors fallu faire fonctionner le trio Continuum / Maven2 / Clearcase. C'est au moment de commencer qu'on ressent un grand moment de solitude... Le but du jeu est de permettre à Continuum par l'intermédiaire de Maven de faire un "update" des sources pour vérifier si des choses ont changées et relancer une commande de build Maven.&lt;br /&gt;&lt;br /&gt;Une particularité de Clearcase, qui reste un outil très puissant (mais un peu usine à gaz à mon gout), concerne la façon dont il structure son arborescence de sources sous forme de composants.&lt;br /&gt;&lt;br /&gt;La difficulté principale réside dans la définition de l'url du SCM dans chacun des &lt;a href="http://fr.wikipedia.org/wiki/Apache_Maven#Projet_Object_Model_.28POM.29"&gt;pom&lt;/a&gt; des projets.&lt;br /&gt;&lt;br /&gt;Voici la procédure de mise en oeuvre :&lt;br /&gt;*rajouter un fichier de conf clearcase sur le serveur d'intégration continue dans le fichier MAVEN_HOME/conf/clearcase-settings.xml avec ce contenu :&lt;br /&gt;&lt;PRE&gt;&lt;CODE class=php&gt;&amp;lt;clearcase-settings&amp;gt;&lt;br /&gt;&amp;lt;useVWSParameter&amp;gt;false&amp;lt;/useVWSParameter&amp;gt;&lt;br /&gt;&amp;lt;clearcaseType&amp;gt;UCM&amp;lt;/clearcaseType&amp;gt;&lt;br /&gt;&amp;lt;/clearcase-settings&amp;gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;br /&gt;*rajouter l'url scm dans chacun des pom de vos projets : &lt;pre&gt;&lt;code class="python"&gt; &amp;lt;scm&amp;gt;&lt;br /&gt; &amp;lt;connection&amp;gt;scm:clearcase:load \&amp;lt;My_Vob\My\Project\Dir&amp;gt;:/&amp;lt;PVOB_Name&amp;gt;:&amp;lt;View_Name&amp;gt;&amp;lt;/connection&amp;gt;&lt;br /&gt;&amp;lt;/scm&amp;gt;&lt;/code&gt;&lt;/pre&gt;où :&lt;br /&gt;- My_Vob\My\Project\Dir : nom du vob dans lequel se trouve le projet + chemin d'accès à la racine du projet.&lt;br /&gt;- PVOB_Name  : nom du &lt;a href="http://en.wikipedia.org/wiki/IBM_Rational_ClearCase_UCM#PVOB"&gt;PVOB&lt;/a&gt;. le PVOB correspond au nom du projet racine dans le project explorer du client Clearcase.&lt;br /&gt;-  View_Name : nom de la vue Clearcase&lt;br /&gt;&lt;br /&gt;*Il faut ensuite importer le pom du ou des projets dans continuum&lt;br /&gt;&lt;br /&gt;*Il faut enfin définir des commandes maven de build dans chacun des projets. Attention! Il faut modifier le champs "Nom du fichier POM&lt;span class="required"&gt;*&lt;/span&gt;" : au lieu de :&lt;pre&gt;&lt;code class="php"&gt;pom.xml&lt;/code&gt;&lt;/pre&gt;il faut préciser le chemin relatif d'accès au fichier + le nom du fichier. Il faut renseigner le champ de cette façon :&lt;br /&gt;&lt;pre&gt;&lt;code class="php"&gt;&amp;lt;My_Vob\My\Project\Dir\&amp;gt;pom.xml&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-2544171511369826500?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/2544171511369826500/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=2544171511369826500' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2544171511369826500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2544171511369826500'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/05/continuum-maven2-et-clearcase.html' title='Continuum, Maven2 et Clearcase'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-2859752267433313870</id><published>2008-05-26T13:52:00.003+02:00</published><updated>2008-05-30T14:55:34.632+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='j2EE'/><title type='text'>Garbage Collector</title><content type='html'>Si vous cherchez des infos concernant le Garbage Collector en Java ainsi que les différents algorithmes existants voici un ensemble de liens qui peuvent vous être utile  :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://gfx.developpez.com/tutoriel/java/gc/"&gt;http://gfx.developpez.com/tutoriel/java/gc/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dotnetguru.org/articles/GC/GC.html"&gt;http://www.dotnetguru.org/articles/GC/GC.html&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html"&gt;http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-2859752267433313870?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/2859752267433313870/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=2859752267433313870' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2859752267433313870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2859752267433313870'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/05/garbage-collector.html' title='Garbage Collector'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-4874748778115808809</id><published>2008-05-26T11:33:00.008+02:00</published><updated>2008-05-26T12:01:11.312+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='garbage collector'/><category scheme='http://www.blogger.com/atom/ns#' term='jconsole'/><title type='text'>Monitorer le Garbage Collector avec JConsole</title><content type='html'>Il est possible de monitorer le &lt;a href="http://gfx.developpez.com/tutoriel/java/gc/"&gt;Garbage Collector&lt;/a&gt; d'une JVM de façon distante sans posséder d'outils complexe.&lt;br /&gt;Voici ce dont vous avez besoin :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;avoir accès à la JVM du Garbage Collector que vous voulez monitorer.&lt;/li&gt;&lt;li&gt;avoir un jdk &gt;=1.5 permettant d'utiliser la &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html"&gt;JConsole&lt;/a&gt;. JConsole est un client &lt;a href="http://fr.wikipedia.org/wiki/JMX"&gt;JMX&lt;/a&gt; intégré dans le jdk à partir de la version 1.5.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;L'ojectif est d'ouvrir le connecteur JMX de la JVM pour permettre à la JConsole de s'y connecté. Une fois connecté, la JConsole nous donne toutes les informations utiles sur le Garbage Collector.&lt;br /&gt;&lt;br /&gt;Voici la procédure en 2 étapes :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ouvrir le connecteur de la JVM : Il faut démarrer la JVM en lui passant des options de lancement supplémentaires  :&lt;br /&gt;&lt;pre&gt;&lt;code class="perl"&gt;-Dcom.sun.management.jmxremote.port=&amp;lt;port&amp;gt;&lt;br&gt;&lt;br /&gt;-Dcom.sun.management.jmxremote.authenticate=false&lt;br&gt;&lt;br /&gt;-Dcom.sun.management.jmxremote.ssl=false&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Lancer JConsole: Le programme se trouve dans le répertoire /bin de votre JDK :&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xTcJwT_7XDI/SDqH3ngXEGI/AAAAAAAABVk/_aXDryq22RI/s1600-h/jconsole1.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_xTcJwT_7XDI/SDqH3ngXEGI/AAAAAAAABVk/_aXDryq22RI/s400/jconsole1.PNG" alt="" id="BLOGGER_PHOTO_ID_5204621708947296354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Renseigner le champ JMX URL avec une url du type :&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;&lt;span class="method"&gt;service:&lt;/span&gt;&lt;span class="method"&gt;jmx:&lt;/span&gt;&lt;span class="method"&gt;rmi:&lt;/span&gt;///jndi/&lt;span class="method"&gt;rmi:&lt;/span&gt;//&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/jmxrmi&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Se connecter.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Aller dans l'onglet "Memory" :&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xTcJwT_7XDI/SDqJMXgXEHI/AAAAAAAABVs/nvt6Wq9n4Cw/s1600-h/jconsole2.PNG"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_xTcJwT_7XDI/SDqJMXgXEHI/AAAAAAAABVs/nvt6Wq9n4Cw/s400/jconsole2.PNG" alt="" id="BLOGGER_PHOTO_ID_5204623164941209714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Une combobox permet de choisir le graphique désiré en temps réel permettant de voir les différents espaces mémoires de la JVM et la façon dont le Garbage Collector les gère.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-4874748778115808809?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/4874748778115808809/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=4874748778115808809' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4874748778115808809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/4874748778115808809'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/05/monitorer-le-garbage-collector-avec.html' title='Monitorer le Garbage Collector avec JConsole'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_xTcJwT_7XDI/SDqH3ngXEGI/AAAAAAAABVk/_aXDryq22RI/s72-c/jconsole1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-8934000758918102679</id><published>2008-03-12T14:36:00.013+01:00</published><updated>2008-03-12T16:45:28.757+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='impression'/><title type='text'>Outils de génération de PDF</title><content type='html'>Dans le cadre d'un de mes précédents projets, j'ai dû réaliser une veille concernant les outils de génération de PDF&lt;br /&gt;&lt;br /&gt;En voici une synthèse :&lt;br /&gt;&lt;br /&gt;J'avais identifié à l'époque différents outils/frameworks:&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;PDFBox&lt;/li&gt;&lt;li&gt;IText&lt;/li&gt;&lt;li&gt;FOP&lt;/li&gt;&lt;li&gt;Birt&lt;/li&gt;&lt;li&gt;JasperReport&lt;/li&gt;&lt;li&gt;Open Office&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;Cette liste n’est pas exhaustive mais les outils citées ci-dessus font partis des plus connus.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;span style="font-weight: bold;"&gt;-&lt;span style="font-size:130%;"&gt; PDBOX&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt; :&lt;/span&gt; &lt;a href="http://www.pdfbox.org/"&gt;http://www.pdfbox.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p class="N" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_xTcJwT_7XDI/R9fd8mm4cHI/AAAAAAAABUc/8Yz1Cx4KANM/s1600-h/pdfbox.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_xTcJwT_7XDI/R9fd8mm4cHI/AAAAAAAABUc/8Yz1Cx4KANM/s400/pdfbox.JPG" alt="" id="BLOGGER_PHOTO_ID_5176850329911193714" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="N" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;  &lt;/p&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;PdfBox est une simple librairie java à inclure dans une application. C’est un ensemble d’APIs utilisable pour manipuler un document au format PDF.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;Il permet de récupérer une instance d’un document PDF pour y récupérer l’ensemble de ces caractéristiques (type du document, contenu du document, …). Il est possible de fusionner un document pdf existant avec des données de grâce aux variables présentes dans le document pdf appelé « formulaire » et grâce aux APIs de la librairie.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;L’outil est assez limité en terme de fonctionnalités. Son utilisation est conseillée dans le cadre d’introspection dans un document PDF ou pour générer des pdfs à partir de modèles très rigides (exemples : un courrier type sur lequel il faut juste remplacer un nom, un prénom et une adresse).&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;- IText :&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.lowagie.com/iText/"&gt; http://www.lowagie.com/iText/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p class="N" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xTcJwT_7XDI/R9fe2Gm4cII/AAAAAAAABUk/rK8_cb0Rz_Q/s1600-h/itext.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_xTcJwT_7XDI/R9fe2Gm4cII/AAAAAAAABUk/rK8_cb0Rz_Q/s400/itext.JPG" alt="" id="BLOGGER_PHOTO_ID_5176851317753671810" border="0" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p class="N" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;IText est une simple librairie java à inclure dans une application. C’est un ensemble d’APIs utilisable dans un environnement d’exécution pour créer ou manipuler un document au format PDF.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p class="N" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;Il fonctionne sur le même principe que PDFBOX mais offre beaucoup plus de fonctionnalités. Il permet notamment de générer un document pdf « from scratch » avec du texte et des images dynamiques ainsi que de fusionner des données de type texte avec un modèle de document (lui-même au format pdf). &lt;/p&gt;&lt;div style="text-align: justify;"&gt;      &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;L’avantage de l’outil est de pouvoir générer facilement et sans modèle un pdf. Il pourrait être intéressant d’utiliser l’outil si les pdfs à générer sont fortement variabilisés (peu de données statiques) et où il y a peu de valeur ajoutée à devoir d’abord concevoir un modèle puis développer le moyen de réaliser la fusion avec les données.L’outil sait tout faire, il faut simplement le développer en Java.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p class="N" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;-FOP:&lt;/span&gt;&lt;/span&gt;&lt;a href="http://xmlgraphics.apache.org/fop/"&gt; http://xmlgraphics.apache.org/fop/&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xTcJwT_7XDI/R9ffY2m4cJI/AAAAAAAABUs/8UJORcjxdMQ/s1600-h/fop.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_xTcJwT_7XDI/R9ffY2m4cJI/AAAAAAAABUs/8UJORcjxdMQ/s400/fop.JPG" alt="" id="BLOGGER_PHOTO_ID_5176851914754125970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p class="N" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;FOP correspond à un ensemble de librairies java. Il est plus complexe mais offre de nombreuses fonctionnalités. Il permet entre autre de générer des documents au format PDF. C’est un outil fortement orienté vers le langage XML.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;FOP consiste à générer une représentation des données brutes à éditer au format XML. Il faut ensuite appliquer une première transformation qui va permettre de fusionner ces données brutes avec un modèle (qui est au format XML). Le fichier ainsi obtenu est une représentation de l’édition à effectuer au format XML. Il faut enfin appliquer la transformation FOP permettant de générer le format de sortie désiré (PDF, HTML, …).&lt;/p&gt;  &lt;p class="MsoNormal"&gt;L’avantage de l’outil est de gérer des modèles au format XSLT (feuille de transformation au format XML). La modification d’un modèle revient donc à éditer un fichier XML. L’utilisation classique de cet outil est de partir des données et de leur appliquer des transformations successives permettant d’aboutir au résultat final attendu. La grande flexibilité de l’outil est un atout. En revanche pour mettre en place l’édition d’un document, il faut concevoir la représentation XML des données brutes et la feuille de transformation XSLT. Il faut donc maîtriser ce langage de transformation qui est assez verbeux. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;-BIRT:&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.eclipse.org/birt/"&gt; http://www.eclipse.org/birt/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xTcJwT_7XDI/R9fgQGm4cKI/AAAAAAAABU0/HgBhxsHkhmM/s1600-h/eclipse.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_xTcJwT_7XDI/R9fgQGm4cKI/AAAAAAAABU0/HgBhxsHkhmM/s400/eclipse.JPG" alt="" id="BLOGGER_PHOTO_ID_5176852863941898402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;  &lt;p class="N" style="margin-left: 0cm; text-indent: 0cm;"&gt;Birt est un outil de reporting. Il intègre à la fois un éditeur graphique de modèle (intégrer dans eclipse avec une perspective de « report modeling ») ainsi qu’un moteur de génération d’impression permettant de le rendre autonome dans une application.&lt;/p&gt;    &lt;p style="text-align: justify;" class="MsoNormal"&gt;Il faut appréhender l’outil en deux temps :&lt;br /&gt;&lt;/p&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;L’outil      de reporting : Cet outil est intégré dans la plateforme de      développement d’eclipse. Il permet de façon graphique de concevoir le      modèle à éditer par la suite. L’éditeur graphique est en fait un      générateur de XML qui est le format de sauvegarde du modèle.&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Le      moteur de génération : Il permet de fusionner le modèle demandé avec      les données du contexte au moment de l’exécution (provenant d’une BD ou      d’objet java).&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;      &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;Cet outil est fortement orienté pour faire du reporting à partir de source de données. Les possibilités de génération d’état sont donc très vastes.&lt;span style=""&gt; &lt;/span&gt;L’utilisation classique de cet outil consiste, dans un premier temps, à concevoir le modèle grâce à l’éditeur et, dans un second temps, d’intégrer le modèle dans l’application cible grâce aux APIs fournit par le moteur de génération.&lt;/p&gt;   &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;- JasperReport:&lt;/span&gt;&lt;/span&gt;&lt;a href="http://jasperforge.org/sf/projects/jasperreports"&gt; http://jasperforge.org/sf/projects/jasperreports&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_xTcJwT_7XDI/R9fhIWm4cLI/AAAAAAAABU8/43f923AIU4w/s1600-h/jasper.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_xTcJwT_7XDI/R9fhIWm4cLI/AAAAAAAABU8/43f923AIU4w/s400/jasper.JPG" alt="" id="BLOGGER_PHOTO_ID_5176853830309540018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;  &lt;p class="MsoNormal"&gt;Jasper Report est un moteur de génération de report intégrable dans des applicatifs java/j2EE. Il est associé à IReport qui est un outil de conception de modèle pour JasperReport.&lt;/p&gt;  Comme pour Birt l'outil est décomposable :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;L’outil      de reporting IReport : Cet outil est une application graphique (client      lourd) permettant de concevoir de façon graphique (WYSIWYG) les modèles de      report. Le format&lt;span style=""&gt;  &lt;/span&gt;de stockage des      modèles conçus est le XML. Il existe aussi maintenant un plugin eclipse      IReport qui permet d’éditer des modèles dans l’environnement eclipse.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Le      moteur d’exécution JasperReport : Il permet de fusionner le modèle      demandé avec les données du contexte d’exécution et générer le report sous      différent format.&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;Les formats de restitution sont variés (pdf, html, xml, csv, excel). Le moteur d’exécution est une simple dépendance à embarquer dans l’application. La documentation est claire sur le Web et les apis d’utilisation du moteur d’exécution sont simples à utiliser. L’outil est bien évidemment orienté pour faire du reporting en connexion directe avec une BD.&lt;/p&gt;  &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;- Open Office&lt;/span&gt;&lt;/span&gt;:&lt;a href="http://www.openoffice.org/"&gt; http://www.openoffice.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xTcJwT_7XDI/R9fh3Gm4cMI/AAAAAAAABVE/WuT5_Y-J5ik/s1600-h/oo.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_xTcJwT_7XDI/R9fh3Gm4cMI/AAAAAAAABVE/WuT5_Y-J5ik/s400/oo.JPG" alt="" id="BLOGGER_PHOTO_ID_5176854633468424386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;L’outil permet de créer des modèles de document grâce à l’éditeur classique d’open office. Les possibilités de mise en pages sont alors celles proposés par l’éditeur de texte. Les APIs d'utilisations sont complexes. il faut faire un réel effort pour s'approprier l'outil et le mettre en oeuvre car il est plus complexe que les autres. Ils offrent en revanche beaucoup de possibilités.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;Il n'est pas possible de définir le meilleur outil d'impression/génération de pdf. Ils ont tous des philosophie de mise en oeuvre différentes. On peut noter que JasperReport et Birt sont des outils plus orientés vers le reporting alors qu'IText est propose des APIs plus bas niveau permettant la génération de PDF. Il faudra faire un choix en fonction de son besoin...&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-8934000758918102679?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/8934000758918102679/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=8934000758918102679' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8934000758918102679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8934000758918102679'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/03/outils-de-gnration-de-pdf.html' title='Outils de génération de PDF'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_xTcJwT_7XDI/R9fd8mm4cHI/AAAAAAAABUc/8Yz1Cx4KANM/s72-c/pdfbox.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-3594730275278251942</id><published>2008-03-12T11:44:00.006+01:00</published><updated>2008-03-12T11:55:09.761+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='utilisabilité'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>résumé apple, google et votre entreprise</title><content type='html'>Je suis obligé de relayer le &lt;a href="http://www.fredcavazza.net/2008/03/11/ne-peut-pas-etre-apple-ou-google-qui-veut/"&gt;post&lt;/a&gt; du blog de &lt;a href="http://www.fredcavazza.net/"&gt;fredcavazza&lt;/a&gt; concernant un dessin résumant les produits google, apple et les applications d'entreprises.&lt;br /&gt;&lt;br /&gt;c'est tellement vrai :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xTcJwT_7XDI/R9e2G2m4cGI/AAAAAAAABUU/zv-2n0PwUn4/s1600-h/Apple_Google_You.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xTcJwT_7XDI/R9e2G2m4cGI/AAAAAAAABUU/zv-2n0PwUn4/s400/Apple_Google_You.jpg" alt="" id="BLOGGER_PHOTO_ID_5176806525539741794" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-3594730275278251942?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/3594730275278251942/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=3594730275278251942' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3594730275278251942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/3594730275278251942'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/03/rsum-apple-google-et-votre-entreprise.html' title='résumé apple, google et votre entreprise'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xTcJwT_7XDI/R9e2G2m4cGI/AAAAAAAABUU/zv-2n0PwUn4/s72-c/Apple_Google_You.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-7771492422867992738</id><published>2008-02-29T11:54:00.004+01:00</published><updated>2008-02-29T16:30:26.277+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Téléphone Google android</title><content type='html'>J'attends avec impatience la sortie de téléphones avec la plateforme &lt;a href="http://code.google.com/android/"&gt;Android&lt;/a&gt; de google.&lt;br /&gt;&lt;br /&gt;Grâce aux &lt;a href="http://www.mobileworldcongress.com/"&gt;Mobile World Congress 2008&lt;/a&gt;, on voit quelques prototypes de constructeurs faire leur apparition!!!&lt;br /&gt;&lt;br /&gt;Voici une vidéo d'un prototype de Texas Instrument :&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;object height="336" width="420"&gt;&lt;param name="movie" value="http://www.dailymotion.com/swf/x4ckpv&amp;amp;v3=1&amp;amp;related=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.dailymotion.com/swf/x4ckpv&amp;amp;v3=1&amp;amp;related=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="336" width="420"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.dailymotion.com/video/x4ckpv_impressions-google-android-mwc-2008_tech"&gt;Impressions : Google Android MWC 2008&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;i&gt;envoyé par &lt;a href="http://www.dailymotion.com/JournalduGeek"&gt;JournalduGeek&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-7771492422867992738?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/7771492422867992738/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=7771492422867992738' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7771492422867992738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7771492422867992738'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/tlphone-google-android.html' title='Téléphone Google android'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-8179870339400237644</id><published>2008-02-29T10:11:00.004+01:00</published><updated>2008-02-29T10:40:32.079+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='applet'/><title type='text'>Javascript vers applet Java</title><content type='html'>Dans ce &lt;a href="http://jsevellec.blogspot.com/2008/02/applet-java-vers-javascript.html"&gt;post&lt;/a&gt;, j'expliquais qu'il était possible de faire un pont entre le monde java dans un applet et du javascript.&lt;br /&gt;&lt;br /&gt;Il est aussi possible de faire ça dans l'autre sens, cad, appeler une méthode java dans une applet à partir d'une fonction javascript. Voici un petit exemple de mise en oeuvre :&lt;br /&gt;&lt;br /&gt;1 : test/myApplet.java&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="java"&gt;&lt;span class="keyword"&gt;package&lt;/span&gt; test;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; java.applet.Applet;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="class"&gt;&lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="title"&gt;MyApplet&lt;/span&gt; &lt;span class="inheritance"&gt;&lt;span class="keyword"&gt;extends&lt;/span&gt;&lt;/span&gt; &lt;span class="title"&gt;Applet&lt;/span&gt; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; init() {&lt;br /&gt;      &lt;span class="keyword"&gt;super&lt;/span&gt;.init();&lt;br /&gt;      System.out.println(&lt;span class="string"&gt;"init something"&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; jsCall(String hello) {&lt;br /&gt;      System.out.println(&lt;span class="string"&gt;"this method is called by a js function and say :"&lt;/span&gt;&lt;br /&gt;              + hello);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2 : test-call.html&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="html"&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;head&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;title&lt;/span&gt;&amp;gt;&lt;/span&gt;test applet&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;title&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;script&lt;/span&gt;&lt;span class="attribute"&gt; type=&lt;span class="value"&gt;"text/javascript"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  function callJavaMethod() {&lt;br /&gt;      document.javaToJavascriptApplet.jsCall('hello world');&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;head&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;body&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;applet&lt;/span&gt;&lt;span class="attribute"&gt; id=&lt;span class="value"&gt;"javaToJavascriptApplet"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; code=&lt;span class="value"&gt;"test.MyApplet.class"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; mayscript&lt;/span&gt;&lt;br /&gt;  width="0"&lt;span class="attribute"&gt; height=&lt;span class="value"&gt;"0"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; codebase=&lt;span class="value"&gt;"bin/"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;applet&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;&lt;span class="keyword"&gt;input&lt;/span&gt;&lt;span class="attribute"&gt; type=&lt;span class="value"&gt;"button"&lt;/span&gt;&lt;/span&gt;&lt;span class="attribute"&gt; value=&lt;span class="value"&gt;"Call a java applet method"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  onclick="callJavaMethod();"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;body&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;span class="keyword"&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Il ne reste plus qu'à lancer la page html, cliquer sur le bouton et observer la console java de l'applet :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="php"&gt;init something&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;this&lt;/span&gt; method is called by a js function and say :hello world&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-8179870339400237644?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/8179870339400237644/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=8179870339400237644' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8179870339400237644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/8179870339400237644'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/javascript-vers-applet-java.html' title='Javascript vers applet Java'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-7195622502804827164</id><published>2008-02-28T10:28:00.004+01:00</published><updated>2008-02-28T10:47:27.804+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven 2, recherche de jars</title><content type='html'>J'utilise et abuse de &lt;a href="http://maven.apache.org/"&gt;maven&lt;/a&gt; dans les projets java notamment chez mon client. Comment faisait-on d'ailleurs avant la création de cette outil???&lt;br /&gt;&lt;br /&gt;Ce qu'on peut parfois lui reprocher, c'est la perte de temps qu'occasionne la définition des dépendances dans le &lt;a href="http://maven.apache.org/pom.html"&gt;pom&lt;/a&gt; : la recherche de dépendances sur les repositorys distant sur le net prend un temps fou même si le système de dépendance transitive  permet d'alléger la déclaration des dépendances dans le pom.&lt;br /&gt;&lt;br /&gt;Un collègue m'a présenté un site qui me permet maintenant de gagner beaucoup de temps sur cette recherche :&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.mvnrepository.com/"&gt;http://www.mvnrepository.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Le site propose un système de recherche permettant de trouver une dépendance :&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_xTcJwT_7XDI/R8aCK4XTReI/AAAAAAAABUM/XpxcF8BinmM/s1600-h/mvnrepository.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_xTcJwT_7XDI/R8aCK4XTReI/AAAAAAAABUM/XpxcF8BinmM/s320/mvnrepository.PNG" alt="" id="BLOGGER_PHOTO_ID_5171964345522013666" border="0" /&gt;&lt;/a&gt;Une fois la dépendance trouvée et dans la bonne version, il fournit le bout de code xml à rajouter pour la déclarer dans le pom! magique!&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-7195622502804827164?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/7195622502804827164/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=7195622502804827164' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7195622502804827164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7195622502804827164'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/maven-2-recherche-de-jars.html' title='Maven 2, recherche de jars'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_xTcJwT_7XDI/R8aCK4XTReI/AAAAAAAABUM/XpxcF8BinmM/s72-c/mvnrepository.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-6012258768692569524</id><published>2008-02-20T15:05:00.004+01:00</published><updated>2008-02-20T15:26:06.084+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='saopui'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><title type='text'>SoapUI : testeur de web service</title><content type='html'>Je travaille chez mon client à la mise en oeuvre d'architecture d'intégration, notamment SOA et EDA avec des ESBs.&lt;br /&gt;&lt;br /&gt;Je viens de terminer une phase de test de montée en charge dans lequel nous avons mis à l'épreuve plusieurs ESBs Open Source du marché.&lt;br /&gt;&lt;br /&gt;Plusieurs de nos scénarios concernées la mise en oeuvre d'échanges synchrones à base de &lt;a href="http://fr.wikipedia.org/wiki/Web_service"&gt;web services&lt;/a&gt; avec un &lt;a href="http://fr.wikipedia.org/wiki/Enterprise_Service_Bus"&gt;ESB&lt;/a&gt; comme "proxy" intermédiaire. Nous avons développé un injecteur maison permettant de simuler une charge synchrone (appel massif de &lt;a href="http://fr.wikipedia.org/wiki/Web_service"&gt;web services&lt;/a&gt;) ou asynchrone (écriture massive de messages &lt;a href="http://fr.wikipedia.org/wiki/Java_Message_Service"&gt;JMS&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;J'ai néanmoins découvert un outil très sympa : &lt;a href="http://www.soapui.org/gettingstarted/index.html"&gt;SoapUI&lt;/a&gt;&lt;br /&gt;L'outil permet à partir d'un &lt;a href="http://fr.wikipedia.org/wiki/WSDL"&gt;WSDL&lt;/a&gt; d'appeler un &lt;a href="http://fr.wikipedia.org/wiki/Web_service"&gt;web service&lt;/a&gt;. Ce que je trouve très intérressant dans l'outil c'est la génération d'un message SOAP par défaut qui permet d'appeler le web service. Pour ceux qui n'ont pas eu WSDL en seconde langue au lycée, c'est très appréciable! :-)&lt;br /&gt;&lt;br /&gt;En creusant un peu sur les fonctionnalités de l'outil, j'ai découvert qu'en plus de faire des tests unitaires, il permet aussi de mettre en place des tests de charge (multi threading) avec la possibilité de mettre en place tout un ensemble d'&lt;a href="http://fr.wikipedia.org/wiki/Assertion"&gt;assertions&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-6012258768692569524?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/6012258768692569524/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=6012258768692569524' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6012258768692569524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6012258768692569524'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/soapui-testeur-de-web-service.html' title='SoapUI : testeur de web service'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-7205157639826105502</id><published>2008-02-20T11:29:00.002+01:00</published><updated>2008-02-20T11:39:02.852+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ebay'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Architecture Ebay</title><content type='html'>Vous êtes vous déjà poser la question :"Heu, Ebay, comment ça marche???".&lt;br /&gt;&lt;br /&gt;Quand on lit les chiffres annoncés par Ebay en terme de volume de traitement, c'est incroyable.&lt;br /&gt;J'en prends un au hasard : 28 milliards de requête SQL par Jour!!! En novembre 1999, Ebay atteint les limites physiques de croissances des serveurs de Base de données...&lt;br /&gt;&lt;br /&gt;On se doute bien qu'avec se genre de problématique, des réflexions sur l'architecture mise en place (et son évolution) est primordiale.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf"&gt;Voici un PDF&lt;/a&gt; sur l'architecture d'EBay que j'ai trouvé sur ce post :&lt;br /&gt;&lt;a href="http://www.highscalability.com/ebay-architecture"&gt;http://www.highscalability.com/ebay-architecture&lt;/a&gt;&lt;br /&gt;(Le nom du site plante déjà un peu de décor)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-7205157639826105502?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/7205157639826105502/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=7205157639826105502' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7205157639826105502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7205157639826105502'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/architecture-ebay.html' title='Architecture Ebay'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-2563011745809746479</id><published>2008-02-20T11:10:00.004+01:00</published><updated>2008-02-20T11:23:02.789+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='histoire'/><title type='text'>google, c'est plus fort que toi</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.fr/intl/fr_fr/images/logo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px;" src="http://www.google.fr/intl/fr_fr/images/logo.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Il n'y a pas encore si longtemps (bon quelques années quand même), quand j'expliquais que j'avais fait une recherche en allant sur le moteur de recherche google on me répondait "goo quoi??"&lt;br /&gt;&lt;br /&gt;Tout le monde connait aujourd'hui ce moteur de recherche. Le plus incroyable c'est de voir &lt;a href="http://www.google.fr/options/"&gt;l'ensemble des services&lt;/a&gt; que propose aujourd'hui google.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/corporate/history.html"&gt;L'histoire de google&lt;/a&gt; est relativement courte mais elle est incroyablement bien remplie!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-2563011745809746479?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/2563011745809746479/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=2563011745809746479' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2563011745809746479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2563011745809746479'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/google-cest-plus-fort-que-toi.html' title='google, c&apos;est plus fort que toi'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-7853532007810424969</id><published>2008-02-18T17:11:00.003+01:00</published><updated>2008-02-18T17:29:31.435+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='applet'/><category scheme='http://www.blogger.com/atom/ns#' term='pont'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><title type='text'>Applet java vers Javascript</title><content type='html'>Le concept de devoir faire un pont entre le monde java dans une applet et le monde javascript peut paraitre bizarre mais il peut s'expliquer...&lt;br /&gt;&lt;br /&gt;Alors imaginons pour commencer une application j2EE en client léger typée AJAX. Rajoutons-y ensuite des besoins fonctionnels propres à des centres téléphoniques (call center, hotline) comme le fait d'identifier un client automatiquement  par son numéro de téléphone dans une application au moment où l'appel sonne sur le poste téléphonique...&lt;br /&gt;&lt;br /&gt;Il existe multiple choix architecturaux pour mettre en place ce type de système.&lt;br /&gt;&lt;br /&gt;Une réponse est de faire du polling AJAX pour tester l'arrivée d'un appel. J'ai d'ailleurs expliquer comment faire du polling coté client dans ce &lt;a href="http://jsevellec.blogspot.com/2008/02/polling-ajax-cot-client.html"&gt;post.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Une autres réponses possibles est d'intégrer une applet dans le navigateur qui va écouter l'arrivée des appels et notifier l'application dans le navigateur par l'appel d'une fonction javascript.&lt;br /&gt;&lt;br /&gt;C'est à ce moment que cette documentation peut vous être utile :&lt;br /&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/plugin/developer_guide/java_js.html"&gt;http://java.sun.com/j2se/1.5.0/docs/guide/plugin/developer_guide/java_js.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-7853532007810424969?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/7853532007810424969/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=7853532007810424969' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7853532007810424969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/7853532007810424969'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/applet-java-vers-javascript.html' title='Applet java vers Javascript'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-6664022485112052278</id><published>2008-02-14T17:59:00.002+01:00</published><updated>2008-02-18T17:33:10.820+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jEE'/><category scheme='http://www.blogger.com/atom/ns#' term='j2EE'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>JEE vs .Net, piqure de rappel</title><content type='html'>Voici un &lt;a href="http://urba-si.blogspot.com/2006/05/j2ee-vs-net-le-retour.html"&gt;post&lt;/a&gt; comme je les aime...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-6664022485112052278?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/6664022485112052278/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=6664022485112052278' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6664022485112052278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6664022485112052278'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/jee-vs-net-piqure-de-rappel.html' title='JEE vs .Net, piqure de rappel'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-1701046926734189919</id><published>2008-02-14T17:11:00.004+01:00</published><updated>2008-02-18T17:32:43.807+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EDA'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='ESB'/><category scheme='http://www.blogger.com/atom/ns#' term='échange synchrone'/><category scheme='http://www.blogger.com/atom/ns#' term='échange asynchrone'/><title type='text'>SOA et EDA</title><content type='html'>&lt;a href="http://fr.wikipedia.org/wiki/Service_Oriented_Architecture"&gt;SOA&lt;/a&gt; est sur toutes les lèvres. A tel point que trop de SOA peut parfois tuer le SOA :-). Certains responsables informatiques ont maintenant peur de l'entendre ou de le prononcer.&lt;br /&gt;&lt;br /&gt;Je travaille actuellement sur les architectures d'intégrations et notamment celles autour des ESBs. La plupart des présentations que j'ai pu voir sur les ESBs les définissent comme une infrastructure permettant de "faire du SOA". "Faire du SOA" implique de mettre en oeuvre des architectures où un applicatif appelle un service d'un autre applicatif de manière synchrone (pour simplifier...). Cette démarche implique alors une dépendance en terme de disponibilité entre les 2 systèmes. Elle implique aussi de déporter les exigences en terme de temps de réponse de l'application consommatrice vers l'application qui fournit le service.&lt;br /&gt;&lt;br /&gt;C'est normalement à ce moment que le responsable des applicatifs en production vous dit :"heuuu et comment je fais si je veux que mes applicatifs soit indépendants en terme de disponibilité pour pouvoir continuer à travailler si un d'entre eux crash?..."&lt;br /&gt;&lt;br /&gt;&lt;a href="http://fr.wikipedia.org/wiki/Architecture_Orient%C3%A9e_Ev%C3%A8nements"&gt;EDA&lt;/a&gt; permet ce genre de fonctionnement. EDA, pour Event Driven Architecture, propose des échanges asynchrones de messages unitaires (ayant seul un sens métier au sein du SI) au fil de l'eau. Ce type d'architecture permet de rendre indépendant les applicatifs en terme de disponibilités et de performance, tout en offrant la possibilité de diffuser les messages au fil de l'eau dans le SI. La plupart des ESBs permettent de faire de l'EDA même si en général le focus est mis sur les partie SOA qu'offre le bus.&lt;br /&gt;&lt;br /&gt;Je pense, et je crois que je ne suis pas le seul (enfin j'espère...), que ces 2 types d'architectures font partis d'un SI moderne.&lt;br /&gt;&lt;br /&gt;Vous en pensez quoi???&lt;br /&gt;&lt;br /&gt;Voici d'ailleurs un blog intéressant :&lt;br /&gt;&lt;a href="http://soa-eda.blogspot.com/"&gt;http://soa-eda.blogspot.com/&lt;/a&gt;&lt;br /&gt;Le nom du blog est assez porteur de sens...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-1701046926734189919?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/1701046926734189919/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=1701046926734189919' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1701046926734189919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/1701046926734189919'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/soa-et-eda.html' title='SOA et EDA'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-556943751143409240</id><published>2008-02-14T10:14:00.008+01:00</published><updated>2008-02-18T17:31:26.067+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='comet'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='continuation jetty'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype'/><category scheme='http://www.blogger.com/atom/ns#' term='push http'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat advanced io'/><category scheme='http://www.blogger.com/atom/ns#' term='polling'/><title type='text'>Polling Ajax coté client</title><content type='html'>Le besoin de faire du Push Http vers un browser est de plus en plus présent.&lt;br /&gt;&lt;br /&gt;Une méthode consiste à poller à interval régulier depuis le browser  une url pour vérifier l'arrivée d'un nouvel évènement. Voici un exemple coté client de mise en place en utilisant la librairie Ajax Prototype (Ca sert à rien de réinventer la roue à chaque fois) :&lt;br /&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="comment"&gt;/* fonction de lancement du poll http */&lt;/span&gt;&lt;br /&gt;&lt;span class="function"&gt;&lt;span class="keyword"&gt;function&lt;/span&gt; &lt;span class="title"&gt;launchPolling&lt;/span&gt;&lt;span class="params"&gt;()&lt;/span&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;new&lt;/span&gt; PeriodicalExecuter(executePoll, &lt;span class="number"&gt;5&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* lors de chague poll */&lt;/span&gt;&lt;br /&gt;&lt;span class="function"&gt;&lt;span class="keyword"&gt;function&lt;/span&gt; &lt;span class="title"&gt;executePoll&lt;/span&gt;&lt;span class="params"&gt;()&lt;/span&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; url = &lt;span class="string"&gt;'your url...'&lt;/span&gt;;&lt;br /&gt;&lt;span class="keyword"&gt;new&lt;/span&gt; Ajax.Request(url, {&lt;br /&gt;method: &lt;span class="string"&gt;'get'&lt;/span&gt;,&lt;br /&gt;contentType: &lt;span class="string"&gt;'application/xml'&lt;/span&gt;,&lt;br /&gt;onSuccess: &lt;span class="keyword"&gt;function&lt;/span&gt;(transport) {&lt;br /&gt;&lt;span class="keyword"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; response = transport.responseText;&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; ((response != &lt;span class="string"&gt;''&lt;/span&gt;) {&lt;br /&gt;  &lt;span class="comment"&gt;/* do something... */&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;} &lt;span class="keyword"&gt;catch&lt;/span&gt;(e) {&lt;br /&gt;alert(e.message);&lt;br /&gt;}&lt;br /&gt;transport=&lt;span class="literal"&gt;null&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Il existe aussi maintenant une évolution sur ce type de polling qui consiste à poller moins fréquemment. Le serveur, sur réception d'une requête de polling, attend avant de retourner une réponse. Ce modèle de programmation s'appelle COMET et est décrit dans un post très intéressant de Thomas Recloux à cette adresse :&lt;br /&gt;&lt;a href="http://blog.tartachuc.org/2008/02/12/comet-push-http/"&gt;http://blog.tartachuc.org/2008/02/12/comet-push-http/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-556943751143409240?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/556943751143409240/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=556943751143409240' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/556943751143409240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/556943751143409240'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/polling-ajax-cot-client.html' title='Polling Ajax coté client'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-5424241585026432249</id><published>2008-02-13T02:56:00.000+01:00</published><updated>2008-02-12T18:36:12.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework web'/><category scheme='http://www.blogger.com/atom/ns#' term='entreprise'/><category scheme='http://www.blogger.com/atom/ns#' term='ihm'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>GWT en entreprise, oui et reOui!</title><content type='html'>La version 1.0 de &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt; est apparu en mai 2006. Déjà à l'époque je trouvais ce framework web en avance sur son temps. Il m'avait réconcilié avec le développement d'IHM Web que je trouvais trop longue et fastidieuse surtout au moment où je devais mettre les mains dans du javascript pour faire une bidouille... beurk!!&lt;br /&gt;&lt;br /&gt;Il s'est maintenant fait sa place parmi la multitude de framework Web aujourd'hui disponible.&lt;br /&gt;&lt;br /&gt;Si on me demande aujourd'hui si GWT, pour faire du client léger et portable, peut fonctionner dans un contexte d'application d'entreprise, je dit OUI! En tous cas, je vote POUR intégrer le framework dans la réflexion de choix d'un framework web d'entreprise (si une entreprise à ce type de réflexion...:-)).&lt;br /&gt;&lt;br /&gt;GWT, dès sa sortie, se voulait extensible. Encore fallait-il que la mayonnaise prenne et que des librairies graphiques apparaissent. C'est maintenant chose faite!&lt;br /&gt;Pour n'en citer qu'une, prenons par exemple.... heu... il y en a tellement... allez : &lt;a href="http://code.google.com/p/gwt-ext/"&gt;GWT Ext&lt;/a&gt; qui est maintenant en vers 2.0.1.&lt;br /&gt;&lt;br /&gt;On peut aussi noter une communauté très active autour de ce framework ce qui est un argument majeur aux yeux des directions informatiques pour permettre de minimiser le risques de se retrouver seul au monde avec un framework bugé et qui n'évolue pas.&lt;br /&gt;&lt;br /&gt;Ce qui peut ralentir l'intégration de GWT en entreprise :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La méconnaissance du framework... (genre, "il y aura de la pub dans mon application si vous utilisez GWT", si si on ne rigole pas... c'est du vécu...).&lt;/li&gt;&lt;li&gt;L'inertie des technologies dans les entreprises. Combien d'entreprises travaillent encore en jdk 1.4.x? (heu je ne dis pas que la version 1.4 c'est pas bien mais sun à commencé son &lt;a href="http://java.sun.com/j2se/1.4.2/"&gt;processus de fin de vie&lt;/a&gt; sur cette version. Il serait temps de migrer!) Plus les services informatiques sont conséquents, plus il est difficile de mettre en place de nouvelle choses... comme des framework web moderne...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-5424241585026432249?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/5424241585026432249/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=5424241585026432249' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/5424241585026432249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/5424241585026432249'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/gwt-en-entreprise-oui-et-reoui.html' title='GWT en entreprise, oui et reOui!'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-6311953136504674704</id><published>2008-02-12T16:16:00.000+01:00</published><updated>2008-02-12T16:45:12.899+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hook'/><category scheme='http://www.blogger.com/atom/ns#' term='shutdown ctrl c'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><category scheme='http://www.blogger.com/atom/ns#' term='console'/><title type='text'>Arrêter une JVM dans une console avec Ctrl C, mais qui pense au serveur??</title><content type='html'>Que ce soit sous windows ou Linux, tout le monde connait bien le ctrl C pour arrêter un serveur ou/et une jvm qui est lancé en mode console.&lt;br /&gt;&lt;br /&gt;Voici une façon de gérer ça proprement coté serveur au moment ou la JVM s'arrête.&lt;br /&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/lang/hook-design.html"&gt;http://java.sun.com/j2se/1.5.0/docs/guide/lang/hook-design.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cela peut permettre d'arrêter proprement votre programme et de faire un peu de ménage...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-6311953136504674704?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/6311953136504674704/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=6311953136504674704' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6311953136504674704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/6311953136504674704'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/arrter-une-jvm-dans-une-console-avec.html' title='Arrêter une JVM dans une console avec Ctrl C, mais qui pense au serveur??'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-554991397006508931</id><published>2008-02-11T17:34:00.000+01:00</published><updated>2008-02-12T16:54:20.454+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='onGwt'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='google web toolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>Présentation de GWT en 60 slides</title><content type='html'>Voici une présentation très intéressante de GWT.  J'aime beaucoup l'aspect prise de recul sur la techno. C'est bien d'arriver à se faire comprendre par d'autres personnes que des geeks...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ongwt.com/post/2008/02/04/Presentation-%3A-Introduction-to-Google-Web-Toolkit"&gt;http://www.ongwt.com/post/2008/02/04/Presentation-%3A-Introduction-to-Google-Web-Toolkit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;merci onGwt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-554991397006508931?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/554991397006508931/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=554991397006508931' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/554991397006508931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/554991397006508931'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2008/02/prsentation-de-gwt-en-60-slides.html' title='Présentation de GWT en 60 slides'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4119583874959957708.post-2841411321005282384</id><published>2006-12-22T11:54:00.000+01:00</published><updated>2006-12-22T11:55:07.407+01:00</updated><title type='text'>Ouverture de mon blog</title><content type='html'>Salut à tous,&lt;br /&gt;&lt;br /&gt;Bon ben voilà, ça y est j'ai mon blog... Va falloir que je trouve quoi y faire maintenant...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4119583874959957708-2841411321005282384?l=www.unchticafe.fr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unchticafe.fr/feeds/2841411321005282384/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4119583874959957708&amp;postID=2841411321005282384' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2841411321005282384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4119583874959957708/posts/default/2841411321005282384'/><link rel='alternate' type='text/html' href='http://www.unchticafe.fr/2006/12/ouverture-de-mon-blog.html' title='Ouverture de mon blog'/><author><name>Jérémy Sevellec</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
