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

<channel>
	<title>Lorenzo Arcaini - Consultant Freelance</title>
	<atom:link href="http://blog.lorenzo-arcaini.fr/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.lorenzo-arcaini.fr</link>
	<description>J2EE et Agilité sur Bordeaux</description>
	<lastBuildDate>Thu, 08 Oct 2009 15:23:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>GWT et les tests unitaires rapides</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=51</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=51#comments</comments>
		<pubDate>Thu, 11 Jun 2009 14:26:32 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jsni]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=51</guid>
		<description><![CDATA[On en a beaucoup parlé lors de sa sortie, on en parle encore maintenant avec la sortie de Google Wave, il s&#8217;agit de GWT (Google Web Toolkit).
Rapidement : GWT c&#8217;est coder du Javascript en Java, ce qui permet de faire &#171;&#160;facilement&#160;&#187; de l&#8217;Ajax avec des gens qui maîtrisent bien ce langage (plus que JS en [...]]]></description>
			<content:encoded><![CDATA[<p>On en a beaucoup parlé lors de sa sortie, on en parle encore maintenant avec la sortie de <a href="http://googleblog.blogspot.com/2009/05/went-walkabout-brought-back-google-wave.html">Google Wave</a>, il s&#8217;agit de <a href="http://code.google.com/intl/fr/webtoolkit/">GWT (Google Web Toolkit)</a>.<br />
Rapidement : GWT c&#8217;est coder du Javascript en Java, ce qui permet de faire &laquo;&nbsp;facilement&nbsp;&raquo; de l&#8217;Ajax avec des gens qui maîtrisent bien ce langage (plus que JS en tout cas&#8230;).</p>
<p>Bref, nous ne sommes pas ici pour parler de GWT tout seul mais plutôt de la façon dont on écrit des tests pour cette technologie. Armé de notre JUnit favoris et de Mocks en tout genre (pour Spring, pour les Web Services, tout ça&#8230;) nous sommes pourtant démunis face à GWT. En effet dès l&#8217;écriture du premier test unitaire (qui ne ferait que créer un objet par exemple) nous avons une erreur de ce type :<br />
<code>java.lang.ExceptionInInitializerError<br />
[...]<br />
Caused by: java.lang.UnsupportedOperationException: ERROR: GWT.create() is only usable in client code!  It cannot be called, for example, from server code.  If you are running a unit test, check that your test case extends GWTTestCase and that GWT.create() is not called from within an initializer or constructor.<br />
at com.google.gwt.core.client.GWT.create(GWT.java:91)<br />
at com.google.gwt.user.client.ui.UIObject.(UIObject.java:139)<br />
... 23 more<br />
</code></p>
<p>Ok, pas très grave puisqu&#8217;apparement Google y a pensé et nous donne même la solution : on étends la classe GWTTestCase, on refait la même chose et ça devrait marcher. Et c&#8217;est vrai ça marche, alors où est le problème ? Le problème c&#8217;est que GWT a besoin de lancer son navigateur pour exécuter les tests et que c&#8217;est gourmand en ressources et en temps d&#8217;exécution (ceux qui font des tests avec un contexte Spring complet savent de quoi je parle).</p>
<p>Hors je travaille sur des projets en méthodologie Agile (<a href="http://fr.wikipedia.org/wiki/Test_Driven_Development">avec du TDD dedans</a>), et la fréquence de passage des tests <em>unitaires</em> est très élevée. Contrairement aux tests d&#8217;intégration qui sont exécutés moins souvent, le passage des tests unitaires fait partie du processus de création du code, il est donc impensable d&#8217;attendre 10 à 15 secondes que le test veuille bien se lancer alors qu&#8217;on peut en avoir besoin plusieurs fois par minute !<br />
<span id="more-51"></span><br />
Actuellement nous avons plus de 1200 tests unitaires sur le projet, et ils s&#8217;exécutent sur ma machine en environ 26 secondes et le lancement d&#8217;un test lambda est instantané (aussi rapide qu&#8217;un test junit classique en tout cas). Nous avons donc contourné le problème en étendant notre propre classe de test GWT mais en choisissant une autre stratégie que Google.<br />
Notre solution a été de patcher les classes GWT au runtime à l&#8217;aide d&#8217;une librairie spécifique et d&#8217;un JDK 1.6. Je passe sur le code lui même car il est utilisé en clientèle mais le principe consiste à intercepter les appels de méthodes GWT qui produisent du code natif JavaScript (JSNI de Google) afin de produire un comportement équivalent en Java.<br />
L&#8217;effort consenti en début de projet a été relativement important (création du code pour couvrir 100% des besoins spécifiques du projet, corrections de bugs&#8230;) mais le gain est considérable puisque nous avons pu appliquer nos méthodes de développement sans être contraint par cette technologie à avoir une productivité inférieure.<br />
Le projet sur lequel cette solution est mis en place fait travailler une petite dizaine de développeurs depuis plus de 6 mois chez un grand compte, ce n&#8217;est pas la refonte d&#8217;un SI, mais ce n&#8217;est pas non plus du bricolage dans un garage.</p>
<p>Ma question est : comment <em>vous</em> vous faites pour écrire des tests avec GWT ? Pour quelle taille de projet ? Est ce que la solution fournit par Google vous suffit ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=51</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Maven et NetBeans, un duo qui marche</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=44</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=44#comments</comments>
		<pubDate>Fri, 05 Sep 2008 14:18:13 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[M2Eclipse]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=44</guid>
		<description><![CDATA[J&#8217;ai testé Maven avec NetBeans pour constater l&#8217;état de l&#8217;intégration entre ces deux outils. Autant le dire tout de suite, celui ci n&#8217;a rien à voir avec celui d&#8217;Eclipse : c&#8217;est le jour et la nuit !
Cela faisait en fait plusieurs années que je n&#8217;avais pas testé cet IDE (ça remonte avant même la sortie [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">J&#8217;ai testé Maven avec <a href="http://www.netbeans.org/">NetBeans</a> pour constater l&#8217;état de l&#8217;intégration entre ces deux outils. Autant le dire tout de suite, celui ci n&#8217;a rien à voir avec celui d&#8217;Eclipse : c&#8217;est le jour et la nuit !<br />
Cela faisait en fait plusieurs années que je n&#8217;avais pas testé cet IDE (ça remonte avant même la sortie d&#8217;Eclipse 3.0 !) et la prise en main après toutes ces années d&#8217;Eclipse a été déroutante. Je n&#8217;ai pas retrouvé tous mes raccourcis, mais voilà un mois que j&#8217;utilise cet IDE sans envie de revenir en arrière !</p>
<p style="text-align: justify;">L&#8217;installation du plugin Maven pour Netbeans se fait simplement via l&#8217;interface d&#8217;ajouts de plugins, sans ajouter de dépot particulier. Une fois installé, on a l&#8217;impression que l&#8217;IDE n&#8217;a jamais été conçu autrement que pour travailler sur des projets Maven. Je passe sur l&#8217;import (simplissime) d&#8217;un projet Maven qui n&#8217;est pas l&#8217;objet de cet article&#8230;</p>
<p style="text-align: justify;">Une fois un projet ouvert (avec des modules tant qu&#8217;à faire) toute l&#8217;interface et les menus s&#8217;adaptent au projet Maven. En dépliant le projet parent, on découvre une liste de modules, les librairies rangées par scope, et les répertoires habituels de sources, de tests et le reste&#8230;</p>
<p style="text-align: justify;">
<span id="more-44"></span><br />
Le menu contextuel d&#8217;un projet permet de lancer les commandes Maven les plus courantes (build, clean and build, test), de modifier les profils (récupérés dynamiquement depuis le pom), etc&#8230;</p>
<p style="text-align: center;"><a href="http://www.lorenzo-arcaini.fr/wordpress/wp-content/uploads/2008/09/netbeans-maven.png"><img class="aligncenter size-medium wp-image-45" title="netbeans-maven" src="http://espritlibre.org/wp-content/uploads/2008/09/netbeans-maven-300x277.png" alt="Capture d\'écran de l\'interface de NetBeans" width="300" height="277" /></a></p>
<p style="text-align: justify;">NetBeans utilise exclusivement le pom.xml et ne pollue pas le workspace comme Eclipse de multiples fichiers (.project, .classpath, .settings, etc&#8230; à ajouter au svn ignore). Le seul fichier spécifique est créé lors de l&#8217;ajouts de commandes définies par l&#8217;utilisateur sur les Goals Maven à exécuter pour un projet.<br />
Le lancement ponctuel de fichiers de tests est aisé. Un simple clic droit sur le fichier JUnit, puis &laquo;&nbsp;Run file&nbsp;&raquo; et le tour est joué : le build Maven se déroule pour lancer l&#8217;unique fichier de test. La modification du nom de l&#8217;artefact renomme le projet en temps réel, il n&#8217;y a pas de décalage entre les erreurs remontées par l&#8217;IDE et ceux du build Maven&#8230; Bref tout marche pour le mieux même si je n&#8217;ai sans doute pas poussé l&#8217;outil jusqu&#8217;au bout. Pour ceux qui aimeraient approfondir le sujet <a href="http://wiki.netbeans.org/MavenBestPractices">il y a un wiki sur le site de NetBeans qui couvre le sujet</a>.</p>
<p style="text-align: justify;">Un bémol tout de même, si NetBeans sais gérer plusieurs répertoires sources pour un projet Java classique, il semble qu&#8217;il ai quelques difficultées à gérer le plugin Maven qui remplit ce rôle. Nous avons en effet le code suivant dans un fichier pom.xml sur un projet :<br />
<code>&lt;plugin&gt;<br />
&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;<br />
&lt;artifactId&gt;build-helper-maven-plugin&lt;/artifactId&gt;<br />
&lt;version&gt;1.1&lt;/version&gt;<br />
&lt;executions&gt;<br />
&lt;execution&gt;<br />
&lt;id&gt;add-source&lt;/id&gt;<br />
&lt;phase&gt;generate-sources&lt;/phase&gt;<br />
&lt;goals&gt;<br />
&lt;goal&gt;add-source&lt;/goal&gt;<br />
&lt;/goals&gt;<br />
&lt;configuration&gt;<br />
&lt;sources&gt;<br />
&lt;source&gt;<br />
${basedir}/src/main/axisgenerated<br />
&lt;/source&gt;<br />
&lt;/sources&gt;<br />
&lt;/configuration&gt;<br />
&lt;/execution&gt;<br />
&lt;/executions&gt;<br />
&lt;/plugin&gt;<br />
</code><br />
Mais le problème c&#8217;est que NetBeans n&#8217;identifie pas ce répertoire comme source et est incapable de résoudre les imports sur ces fichiers&#8230; En revanche si l&#8217;IDE signale des erreurs, le build Maven lui fonctionne correctement (sans surprise). Peut être que quelqu&#8217;un connaît une autre façon de faire qui fonctionne pour répondre à ce besoin ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=44</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Base de données H2, la relève de HSQLDB ?</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=37</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=37#comments</comments>
		<pubDate>Wed, 20 Aug 2008 17:31:08 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[base de données]]></category>
		<category><![CDATA[h2]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[hsqldb]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[patch]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=37</guid>
		<description><![CDATA[Le créateur de Hypersonic SQL, Thomas Mueller, se replonge dans la création d&#8217;une base de données légère avec H2 (enfin ça remonte au moins à 2007).
Comme HSQL, les points forts de cette BDD sont une faible empreinte mémoire et un mode embarqué très performant. Les graphiques du site officiel sont d&#8217;ailleurs assez révélateurs sur les [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Le créateur de <a href="http://hsqldb.org/">Hypersonic SQL</a>, Thomas Mueller, se replonge dans la création d&#8217;une base de données légère avec <a href="http://www.h2database.com/">H2</a> (enfin ça remonte au moins à 2007).</p>
<p style="text-align: justify;">Comme HSQL, les points forts de cette BDD sont une faible empreinte mémoire et un mode embarqué très performant. Les graphiques du site officiel sont d&#8217;ailleurs assez révélateurs sur les performances que l&#8217;on est en droit d&#8217;attendre de ce produit&#8230;</p>
<p style="text-align: center;"><img src="http://www.h2database.com/html/images/performance.png" alt="Graphes de performances" /></p>
<div style="text-align: center;"><span style="color: #666699;"><em>Operations/second</em></span> (<a href="http://www.h2database.com/html/frame.html?performance.html&amp;main">détails</a>)</div>
<p style="text-align: justify;">Un problème tout de même&#8230; Alors qu&#8217;une grande quantité d&#8217;applications JEE utilise Hibernate pour la persistance, <a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-3401">le dialecte relatif à H2 est bugué</a>. Cette petite classe est responsable de la traduction du code Hibernate en requêtes SQL. Un problème qui n&#8217;est toujours pas adressé malgré la sortie de la version 3.3 du framework alors qu&#8217;un patch est disponible depuis un certain temps déjà&#8230;</p>
<p style="text-align: justify;">J&#8217;aimerais beaucoup l&#8217;utiliser pour le projet sur lequel je travaille en ce moment, mais je préfère attendre la prise en compte du patch&#8230; Est ce que quelqu&#8217;un a des retours sur l&#8217;utilisation de cette base de données dans la vrai vie ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=37</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Template with Grails and GSP</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=36</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=36#comments</comments>
		<pubDate>Fri, 11 Jul 2008 10:11:35 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=36</guid>
		<description><![CDATA[Here is a simple way to use the GSP from Grails to build reusable templates from files coming from the outside of the application (for mails, files exports, etc. &#8230;)
The first step is to create a GSP which defines the template. It should be noted that no special tag will be interpreted this way. Here [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a simple way to use the GSP from Grails to build reusable templates from files coming from the outside of the application (for mails, files exports, etc. &#8230;)</p>
<p style="text-align: left;">The first step is to create a GSP which defines the template. It should be noted that no special tag will be interpreted this way. Here is a sample VCARD file to import a contact (_vcard.gsp) :<br />
<code><span style="color: #666699;">BEGIN:VCARD<br />
VERSION:2.1<br />
N:${people.lastname};${people.firstname};;${people.civility}<br />
FN:${people.civility} ${people.firstname} ${people.lastname}<br />
TITLE:${people.job}<br />
TEL;WORK;VOICE:${people.professionnalPhone}<br />
EMAIL;INTERNET:${people.email}<br />
END:VCARD</span></code></p>
<p style="text-align: left;">Then we must add a small method that will link the template to the data through the Groovy&#8217;s template engine :<br />
<span id="more-36"></span><br />
<code><span style="color: #666699;">class MyUtilityClass {<br />
static SimpleTemplateEngine engine = new SimpleTemplateEngine()<br />
static generateFromGSP(String templateFilename, model) throws Exception {<br />
Template template = engine.createTemplate(new File(templateFilename))<br />
return template.make(model).toString()<br />
}<br />
}</span></code></p>
<p style="text-align: left;">And finally all that remains is a call from a piece of Groovy code, in a controller for example :<br />
<code><span style="color: #666699;">def myVcard<br />
People myContact = People.findByName('lorenzo')<br />
myVcard = MyUtilityClass.generateFromGSP("_vcard.gsp",['people':myContact])</span></code></p>
<p>That&#8217;s all.. The myVcard variable contains the template supplied with data from myContact, we can now send it to a web browser to download it for example ..</p>
<p style="text-align: left;">This is not necessarily highlighted in the documentation, but the use of GSP from the inside of the Grails application grails to create templates is even easier.<br />
Just do the same way as from the inside of a classical GSP, as the methods of the taglib are available. Here is the same result as the example above, but with a GSP located in the project :<br />
<code><span style="color: #666699;">People myContact = People.findByName('lorenzo')<br />
vcard = g.render(template: "/myTemplates/vcard", model: ['people':myContact])</span></code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=36</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XPlanner, Spring and JDK 1.6</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=35</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=35#comments</comments>
		<pubDate>Thu, 10 Jul 2008 14:31:48 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[metaRepository]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[tomcat 5]]></category>
		<category><![CDATA[TypeMismatchException]]></category>
		<category><![CDATA[xplanner]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=35</guid>
		<description><![CDATA[Just a small article on a matter I encountered yesterday&#8230; Maybe some of you heard about the Agile project management tool XPlanner (directed toward eXtreme Programming depending on the website)
The latest release date of May 2006 and was tested only with the 1.4.2 JDK. However the JVM evolved since then&#8230; When trying to make XPlanner [...]]]></description>
			<content:encoded><![CDATA[<p>Just a small article on a matter I encountered yesterday&#8230; Maybe some of you heard about <a href="http://www.xplanner.org/">the Agile project management tool XPlanner</a> (directed toward eXtreme Programming depending on the website)<br />
The latest release date of May 2006 and was tested only with the 1.4.2 JDK. However the JVM evolved since then&#8230; When trying to make XPlanner working on a server with a Tomcat 5.5 and especially a JDK 1.6, I got a very nice stacktrace when launching the application, which the interesting part is :<br />
<span style="color: #800080;"><code>org.springframework.beans.TypeMismatchException: Failed to convert property value of type [org.apache.commons.collections.map.LinkedMap] to required type [java.util.HashMap] for property 'repositories'</code></span></p>
<p>The solution is to modify the following spring&#8217;s confguration file : <span style="color: #666699;"><code>WEB-INF/classes/spring-beans.xml</code></span> replacing :<span id="more-35"></span><br />
<span style="color: #666699;"><code>&lt;bean id="metaRepository" class="com.technoetic.xplanner.domain.repository.MetaRepositoryImpl"&gt;<br />
&lt;property name="repositories"&gt;<br />
&lt;map&gt;<br />
[...]<br />
&lt;/map&gt;</code></span><br />
by<br />
<code><span style="color: #666699;">&lt;bean id="metaRepository" class="com.technoetic.xplanner.domain.repository.MetaRepositoryImpl"&gt;<br />
&lt;property name="repositories"&gt;<br />
&lt;bean class="java.util.HashMap"&gt;<br />
&lt;constructor-arg&gt;<br />
&lt;map&gt;<br />
[...]<br />
&lt;/map&gt;<br />
&lt;/constructor-arg&gt;<br />
&lt;/bean&gt;<br />
[...]</span><br />
</code><br />
The bug is notified <a href="http://jira.codehaus.org/browse/XPR-391">on the Jira bugtracker of the project</a> since some time, but is still to be fixed&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=35</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>L&#039;Université du SI 2008 : &quot;j&#039;y étais !&quot;</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=24</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=24#comments</comments>
		<pubDate>Fri, 04 Jul 2008 10:15:46 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Bjarne Stroustrup]]></category>
		<category><![CDATA[Eliyahu Goldratt]]></category>
		<category><![CDATA[évènement]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Gouvernance]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Méthodologie]]></category>
		<category><![CDATA[Michel Serres]]></category>
		<category><![CDATA[Neil Armstrong]]></category>
		<category><![CDATA[Octo]]></category>
		<category><![CDATA[paris]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[système d'information]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[université du si]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=24</guid>
		<description><![CDATA[Et c&#8217;était un très grand moment !
Ça a commencé très fort avec le discours de Michel Serres sur l&#8217;innovation ; ou comment l&#8217;informatique, après l&#8217;écriture et l&#8217;imprimerie, marque une 3ème révolution dans l&#8217;histoire de l&#8217;humanité. Malgré l&#8217;heure matinale, le philosophe a su captiver l&#8217;attention de son auditoire et provoquer l&#8217;enthousiasme des quelques 300 personnes présentes [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Et c&#8217;était un très grand moment !</p>
<p style="text-align: justify;">Ça a commencé très fort avec le discours de <a href="http://www.universite-du-si.com/Speakers.aspx#Michel_Serres">Michel Serres</a> sur l&#8217;innovation ; ou comment l&#8217;informatique, après l&#8217;écriture et l&#8217;imprimerie, marque une 3ème révolution dans l&#8217;histoire de l&#8217;humanité. Malgré l&#8217;heure matinale, le philosophe a su captiver l&#8217;attention de son auditoire et provoquer l&#8217;enthousiasme des quelques 300 personnes présentes dans la salle !<br />
Et de finir sur &laquo;&nbsp;Tout est là devant vous, sous vos mains. Il ne vous reste plus qu&#8217;à inventer !&nbsp;&raquo;, il n&#8217;en fallait pas plus pour marquer le coup d&#8217;envoi d&#8217;une journée qui s&#8217;annonçait riche d&#8217;enseignements.</p>
<p style="text-align: justify;">Puis ce fut la course aux sessions. Ayant opté pour <a href="http://www.universite-du-si.com/ParcoursLibre.aspx">le parcours libre</a>, j&#8217;ai du effectuer des choix souvent difficiles pour sélectionner le contenu de mes journées face à l&#8217;importante densité du programme.<br />
<span id="more-24"></span><br />
En quelques mots la première journée fut orientée sur l&#8217;<a href="http://www.universite-du-si.com/ParcoursLibre.aspx#ergonomie-2">ergonomie</a>, <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#grands-mythes-informatiques">les mythes de l&#8217;informatique</a>, <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#usine-developpement-management-visuel">l&#8217;usine de développement</a>, <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#tout-tests-java">les tests</a>, <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#technologies-non-mainstream-standards-dsi">l&#8217;innovation</a> et <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#productivite-java">la productivité</a>. La seconde m&#8217;a permis d&#8217;approfondir les thèmes de l&#8217;<a href="http://www.universite-du-si.com/ParcoursLibre.aspx#architecture-java-agile">Ag</a><a href="http://www.universite-du-si.com/ParcoursLibre.aspx#agile-demystifie">il</a><a href="http://www.universite-du-si.com/ParcoursLibre.aspx#rencontre-cascadeur-agiliste">ité</a>, la <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#architectures-pilotees-client">SOA</a>, <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#TDD-TestDirector-GreenPaper">TDD</a> et les <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#domain-specific-languages">DSL</a>.<br />
C&#8217;est donc avec regrets que j&#8217;ai du me passer des sessions sur le <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#lean">Lean</a>, <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#culture-entreprise-innovation-google-octo">Goo</a><a href="http://www.universite-du-si.com/ParcoursLibre.aspx#pourquoi-google-revolutionne-si">gle</a>, <a href="http://www.universite-du-si.com/ParcoursLibre.aspx#virtualisation-questions">la virtualisation</a>, etc&#8230;</p>
<p style="text-align: justify;">Premier constat, toutes les sessions auxquelles j&#8217;ai pu assister étaient de grande qualité. Ayant suivi la préparation de l&#8217;intérieur ce ne fut pas une grosse surprise, mais tout de même le résultat final est impressionnant. Je ne suis d&#8217;ailleurs pas le seul à le ressentir d&#8217;après les premiers echos que j&#8217;ai pu en avoir&#8230;</p>
<p style="text-align: justify;">Si j&#8217;étais déjà convaincu de l&#8217;intérêt de l&#8217;approche <a href="http://fr.wikipedia.org/wiki/M%C3%A9thode_agile">Agile</a> et <a href="http://fr.wikipedia.org/wiki/Test_Driven_Development">TDD</a>, j&#8217;ai pu bénéficier de quelques éclairages bien pratiques sur leur mise en oeuvre concrète, les pièges à éviter et de <a href="http://fr.wikipedia.org/wiki/Nabaztag">nouvelles idées à expérimenter</a>. Dans l&#8217;ensemble et y compris sur les autres sujets, j&#8217;ai pu apprécier le concret que j&#8217;ai pu retirer des sessions et dont je pourrais faire l&#8217;usage dès mon retour en projet.</p>
<p style="text-align: justify;">Les pauses entre les sessions étaient l&#8217;occasion de rencontrer quelques clients et d&#8217;échanger sur leurs problèmes mais aussi de bénéficier de points de vus différents, car deux populations étaient adressées à l&#8217;USI (&nbsp;&raquo;geek&nbsp;&raquo; et &laquo;&nbsp;boss&nbsp;&raquo;). Plus concrètement des sessions de &laquo;&nbsp;Speed Consulting&nbsp;&raquo; ont été mises en place afin que les speaker puissent êtres directements sollicités par les participants.</p>
<p style="text-align: justify;">Et les keynotes&#8230; du beau monde ! Je ne vais pas revenir sur Michel Serres, mais nous avions également le plaisir d&#8217;accueillir :</p>
<ul style="text-align: justify;">
<li><a href="http://www.universite-du-si.com/Speakers.aspx#Bjarne_Stroustrup">Bjarne Stroustrup</a> l&#8217;inventeur du C++, toujours passionné après plus de 20 ans&#8230; un peu aigri apparement face à Java mais finalement ça semble de bonne guerre. Qu&#8217;aurais donné C++ s&#8217;il était apparu à l&#8217;ère du Web et de l&#8217;Open Source ? En effet un de ses grands regrets est l&#8217;absence d&#8217;une communauté claire et unie autour de ce langage&#8230; qui a la peau dure !</li>
<li><a href="http://www.universite-du-si.com/Speakers.aspx#Eliyahu_Goldratt">Eliyahu M. Goldratt</a>, l&#8217;auteur du best seller &laquo;&nbsp;Le But&nbsp;&raquo;, dont le discours ne peux pas m&#8217;empêcher de repenser à une célèbre phrase qui dit que &laquo;&nbsp;l&#8217;informatique est partout, sauf dans les statistiques de productivité&nbsp;&raquo; !</li>
<li>Et enfin&#8230; <a href="http://www.universite-du-si.com/Speakers.aspx#Neil_Armstrong">Neil Armstrong</a> ! Son arrivée sur la scène pour clore le séminaire restera le point d&#8217;orgue de ces deux jours. Nous aurions pu rester longtemps à l&#8217;écouter, mais voilà il n&#8217;était là qu&#8217;une petite heure. Une petite heure néanmoins unique, pleine d&#8217;émotions, de rêve et d&#8217;humanité.</li>
</ul>
<p style="text-align: justify;"><strong>Un grand merci</strong> à tous mes collègues qui se sont donnés à fond pour organiser cet évènement, ça en vallait la peine !</p>
<p style="text-align: justify;">Est ce que j&#8217;y retourne l&#8217;année prochaine ? <em>Sans hésitation</em> ! Peut-être bien que je ferais une présentation cette fois là !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=24</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XPlanner, Spring et JDK 1.6</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=17</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=17#comments</comments>
		<pubDate>Wed, 07 May 2008 10:26:45 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[metaRepository]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[tomcat 5]]></category>
		<category><![CDATA[TypeMismatchException]]></category>
		<category><![CDATA[xplanner]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=17</guid>
		<description><![CDATA[Juste un petit article sur un problème que j&#8217;ai rencontré hier&#8230; Certains connaissent peut être l&#8217;outils de gestion de projets agiles XPlanner (orienté eXtreme Programming selon le site du projet).
La dernière version date de mai 2006 et n&#8217;a été testée qu&#8217;avec des version de JDK 1.4.2. Cependant la JVM a évoluée depuis&#8230; En tentant de [...]]]></description>
			<content:encoded><![CDATA[<p>Juste un petit article sur un problème que j&#8217;ai rencontré hier&#8230; Certains connaissent peut être <a href="http://www.xplanner.org/">l&#8217;outils de gestion de projets agiles XPlanner</a> (orienté eXtreme Programming selon le site du projet).<br />
La dernière version date de mai 2006 et n&#8217;a été testée qu&#8217;avec des version de JDK 1.4.2. Cependant la JVM a évoluée depuis&#8230; En tentant de faire fonctionner XPlanner sur un serveur doté d&#8217;un tomcat 5.5 et surtout d&#8217;un JDK 1.6 on obtient une belle stack d&#8217;erreur au lancement de l&#8217;application, dont la partie significative est :<br />
<span style="color: #800080;"><code>org.springframework.beans.TypeMismatchException: Failed to convert property value of type [org.apache.commons.collections.map.LinkedMap] to required type [java.util.HashMap] for property 'repositories'</code></span></p>
<p>La solution est de modifier le fichier de configuration de spring <span style="color: #666699;"><code>WEB-INF/classes/spring-beans.xml</code></span> en remplaçant :<span id="more-17"></span><br />
<span style="color: #666699;"><code>&lt;bean id="metaRepository" class="com.technoetic.xplanner.domain.repository.MetaRepositoryImpl"&gt;<br />
&lt;property name="repositories"&gt;<br />
&lt;map&gt;<br />
[...]<br />
&lt;/map&gt;</code></span><br />
par<br />
<code><span style="color: #666699;">&lt;bean id="metaRepository" class="com.technoetic.xplanner.domain.repository.MetaRepositoryImpl"&gt;<br />
&lt;property name="repositories"&gt;<br />
&lt;bean class="java.util.HashMap"&gt;<br />
&lt;constructor-arg&gt;<br />
&lt;map&gt;<br />
[...]<br />
&lt;/map&gt;<br />
&lt;/constructor-arg&gt;<br />
&lt;/bean&gt;<br />
[...]</span><br />
</code><br />
Le problème est remonté <a href="http://jira.codehaus.org/browse/XPR-391">sur le Jira du projet</a> depuis un certain temps, mais n&#8217;est toujours pas fixé&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=17</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Threadlocal avec Grails</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=16</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=16#comments</comments>
		<pubDate>Wed, 16 Apr 2008 14:08:26 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Threadlocal]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=16</guid>
		<description><![CDATA[Un des gros avantage de Groovy avec Java c&#8217;est que l&#8217;on peut quasiment reprendre la totalité d&#8217;un projet Java sans y toucher et qu&#8217;il soit compatible avec Groovy. Quasiment&#8230; c&#8217;est bien ce qui nous empêche de reprendre d&#8217;un simple copier-coller le Threadlocal sans générer une erreur de compilation.
Prenons un exemple d&#8217;utilisation en Java&#8230;
private static ThreadLocal&#60;String&#62; [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Un des gros avantage de Groovy avec Java c&#8217;est que l&#8217;on peut quasiment reprendre la totalité d&#8217;un projet Java sans y toucher et qu&#8217;il soit compatible avec Groovy. Quasiment&#8230; c&#8217;est bien ce qui nous empêche de reprendre d&#8217;un simple copier-coller le Threadlocal sans générer une erreur de compilation.</p>
<p style="text-align: left;">Prenons un exemple d&#8217;utilisation en Java&#8230;</p>
<p><span id="more-16"></span><span style="color: #666699;"><code>private static ThreadLocal&lt;String&gt; remoteUser = new ThreadLocal&lt;String&gt;() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;protected synchronized String initialValue() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"inconnu";<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
};</code><br />
<code><br />
private static setRemoteUser(String p_user) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;remoteUser.set(p_user);<br />
}</code><br />
<code><br />
public static String getRemoteUser() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return remoteUser.get();<br />
}</code><br />
</span><br />

<p style="text-align: left;">Vous pouvez reprendre cette portion de code et l&#8217;intégrer dans une classe Groovy (avec les bons imports) vous constaterez immédiatement que le compilateur n&#8217;apprécie pas vraiment cette façon de faire&#8230; Voici maintenant l&#8217;équivalent en Groovy de cette portion de code :</p>
<p><span style="color: #666699;"><code>private static ThreadLocal&lt;String&gt; remoteUser = [<br />
&nbsp;&nbsp;&nbsp;&nbsp;initialValue: { return UNKNOWN_USER }<br />
] as ThreadLocal&lt;String&gt;;<br />
</code><code><br />
private static void setRemoteUser(String user) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;remoteUser.set(user)<br />
}<br />
</code><code><br />
public static String getRemoteUser() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;remoteUser.get()<br />
}<br />
</code></span><br />

<p style="text-align: left;">La différence de syntaxe est assez flagrante, mais il y également un point très important auquel il faut faire attention, c&#8217;est le point virgule sur cette ligne : <code>as ThreadLocal&lt;String&gt;;</code>. Si celui ci est supprimé, le parseur semble avoir quelques difficultées et ne distinguera pas la fin de l&#8217;instruction. Contrairement aux habitudes il faudra donc conserver cet élément dans ce cas bien précis.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=16</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Templates avec Grails et les GSP</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=15</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=15#comments</comments>
		<pubDate>Thu, 10 Apr 2008 14:57:54 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=15</guid>
		<description><![CDATA[Voici un moyen simple d&#8217;utiliser les GSP de Grails pour construire des templates réutilisables à partir de fichiers externes à l&#8217;application (pour des mails, des fichiers d&#8217;exports, etc&#8230;)
La première étape consiste à créer une GSP qui définit le template. Il faut noter qu&#8217;aucun tag spécial ne sera interprété de cette manière. Voici un exemple de [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un moyen simple d&#8217;utiliser les GSP de Grails pour construire des templates réutilisables à partir de fichiers externes à l&#8217;application (pour des mails, des fichiers d&#8217;exports, etc&#8230;)</p>
<p style="text-align: left;">La première étape consiste à créer une GSP qui définit le template. Il faut noter qu&#8217;aucun tag spécial ne sera interprété de cette manière. Voici un exemple de fichier VCARD pour importer un contact (_vcard.gsp) :<br />
<code><span style="color: #666699;">BEGIN:VCARD<br />
VERSION:2.1<br />
N:${personne.nom};${personne.prenom};;${personne.civilite}<br />
FN:${personne.civilite} ${personne.prenom} ${personne.nom}<br />
TITLE:${personne.poste}<br />
TEL;WORK;VOICE:${personne.telephonePro}<br />
EMAIL;INTERNET:${personne.email}<br />
END:VCARD</span></code></p>
<p style="text-align: left;">Ensuite il faut ajouter une petite méthode qui se chargera d&#8217;associer le template aux données grâce au moteur de template de Groovy :<br />
<span id="more-15"></span><br />
<code><span style="color: #666699;">class MaClasseUtilitaire {<br />
static SimpleTemplateEngine engine = new SimpleTemplateEngine()<br />
static generateFromGSP(String templateFilename, model) throws Exception {<br />
Template template = engine.createTemplate(new File(templateFilename))<br />
return template.make(model).toString()<br />
}<br />
}</span></code></p>
<p style="text-align: left;">Et enfin il ne reste plus qu&#8217;à effectuer l&#8217;appel depuis un bout de code Groovy, dans un controller par exemple :<br />
<code><span style="color: #666699;">def maVcard<br />
Personne monContact = Personne.findByName('lorenzo')<br />
maVcard = MaClasseUtilitaire.generateFromGSP("_vcard.gsp",['personne':monContact])</span></code></p>
<p>C&#8217;est tout.. la variable maVcard contient le template alimenté avec les données de monContact, il ne reste plus qu&#8217;à l&#8217;envoyer au navigateur pour la télécharger par exemple..</p>
<p style="text-align: left;">Ce n&#8217;est pas forcément mis en évidence dans la documentation mais l&#8217;utilisation de GSP internes à l&#8217;application grails pour les templates est encore plus simple. Il suffit de procéder de la même façon que depuis une GSP classique, les méthodes de la taglib étant disponibles. Voici le même résultat que l&#8217;exemple ci dessus, mais avec une GSP située dans le projet :<br />
<code><span style="color: #666699;">Personne monContact = Personne.findByName('lorenzo')<br />
vcard = g.render(template: "/mesTemplates/vcard", model: ['personne':monContact])</span></code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=15</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1ère édition de l&#039;Université du SI</title>
		<link>http://blog.lorenzo-arcaini.fr/?p=14</link>
		<comments>http://blog.lorenzo-arcaini.fr/?p=14#comments</comments>
		<pubDate>Fri, 04 Apr 2008 12:01:22 +0000</pubDate>
		<dc:creator>Lorenzo</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[évènement]]></category>
		<category><![CDATA[Octo]]></category>

		<guid isPermaLink="false">http://espritlibre.org/?p=14</guid>
		<description><![CDATA[Octo se lance dans un évènement de grande envergure, l&#8217;organisation d&#8217;un séminaire totalement indépendant à destination des &#171;&#160;geek&#160;&#187; et des &#171;&#160;boss&#160;&#187; : l&#8217;université du SI ! Celui ci se déroulera les 2 &#38; 3 juillets à Paris et réunira des intervenants à ne pas manquer comme Neil Armstrong, Michel Serres, Eliyahu M. Goldratt, Bjarne Stroutrup&#8230;
Au [...]]]></description>
			<content:encoded><![CDATA[<p>Octo se lance dans un évènement de grande envergure, l&#8217;organisation d&#8217;un séminaire totalement indépendant à destination des &laquo;&nbsp;geek&nbsp;&raquo; et des &laquo;&nbsp;boss&nbsp;&raquo; : <a href="http://www.universite-du-si.com">l&#8217;université du SI</a> ! Celui ci se déroulera les 2 &amp; 3 juillets à Paris et réunira des <a href="http://www.universite-du-si.com/Speakers.aspx">intervenants à ne pas manquer</a> comme Neil Armstrong, Michel Serres, Eliyahu M. Goldratt, Bjarne Stroutrup&#8230;</p>
<p style="text-align: left;">Au programme, <a href="http://www.universite-du-si.com/Parcourslibre.aspx">plus de 30 sessions</a> animées par des experts d&#8217;Octo et de l&#8217;extérieur sur des sujets variés et répondant à des thématiques de technologie, de gouvernance, de méthodologie et d&#8217;architecture.<br />
<span id="more-14"></span></p>
<p style="text-align: center;"><iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;hl=fr&amp;geocode=&amp;q=28+Avenue+George+V,+75008&amp;sll=48.868512,2.301136&amp;sspn=0.007876,0.020084&amp;ie=UTF8&amp;s=AARTsJo3pY7wZ-lX0uhrukbnMBT2ugKBWw&amp;ll=48.875893,2.305326&amp;spn=0.019758,0.036478&amp;z=14&amp;iwloc=cent&amp;output=embed"></iframe><br /><small><a href="http://maps.google.com/maps?f=q&amp;hl=fr&amp;geocode=&amp;q=28+Avenue+George+V,+75008&amp;sll=48.868512,2.301136&amp;sspn=0.007876,0.020084&amp;ie=UTF8&amp;ll=48.875893,2.305326&amp;spn=0.019758,0.036478&amp;z=14&amp;iwloc=cent&amp;source=embed" style="color:#0000FF;text-align:left">Agrandir le plan</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lorenzo-arcaini.fr/?feed=rss2&amp;p=14</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
