<?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>OCTO talks ! &#187; groovy</title>
	<atom:link href="http://blog.octo.com/tag/groovy/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Fri, 03 Feb 2012 13:46:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Comment ne plus avoir de NullPointerException en Java ?</title>
		<link>http://blog.octo.com/comment-ne-plus-avoir-de-nullpointerexception-en-java/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=comment-ne-plus-avoir-de-nullpointerexception-en-java</link>
		<comments>http://blog.octo.com/comment-ne-plus-avoir-de-nullpointerexception-en-java/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 10:20:39 +0000</pubDate>
		<dc:creator>Rémy-Christophe Schermesser</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Brèves de consultants]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[null]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=24646</guid>
		<description><![CDATA[NullPointerException : l&#8217;erreur la plus courante dans un programme Java. On est tous à un moment ou à un autre tombé sur cette exception. Malheureusement, ce n&#8217;est qu&#8217;en production à 4h du matin qu&#8217;elle arrive. On corrige donc le bug suivant : MonObjet monObjet = null; … monObjet.maMethode(); // =&#62; NullPointerException Par un rapide : if(monObjet [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/article-parallelisation-distribution-partie-3-comment-tirer-parti-des-processeurs-multi-coeurs-a-travers-l-api-de-concurrence-de-java-7/' rel='bookmark' title='Parallélisation, distribution partie 3 : comment tirer parti des processeurs multi-coeurs à travers l&#8217;API de concurrence de Java 7 ?'>Parallélisation, distribution partie 3 : comment tirer parti des processeurs multi-coeurs à travers l&#8217;API de concurrence de Java 7 ?</a></li>
<li><a href='http://blog.octo.com/les-nouveautes-du-langage-dans-java-7/' rel='bookmark' title='Les nouveautés du langage dans Java 7'>Les nouveautés du langage dans Java 7</a></li>
<li><a href='http://blog.octo.com/un-dsl-sql-pour-java/' rel='bookmark' title='Un DSL SQL pour Java'>Un DSL SQL pour Java</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fcomment-ne-plus-avoir-de-nullpointerexception-en-java%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Comment%20ne%20plus%20avoir%20de%20NullPointerException%20en%20Java%20%3F%22%20%7D);"></div>
<p><em>NullPointerException</em> : l&#8217;erreur la plus courante dans un programme Java. On est tous à un moment ou à un autre tombé sur cette exception. Malheureusement, ce n&#8217;est qu&#8217;en production à 4h du matin qu&#8217;elle arrive. On corrige donc le bug suivant :</p>
<pre class="brush:java">MonObjet monObjet = null;
…
monObjet.maMethode(); // =&gt; NullPointerException</pre>
<p>Par un rapide :</p>
<pre class="brush:java">if(monObjet != null) {
  monObjet.maMethode();
}</pre>
<p>Ce correctif est tout à fait honorable, mais pourquoi ne pas essayer de ne plus avoir aucune exception de ce type ?</p>
<p>Il existe plusieurs méthodes validées par le compilateur pour l&#8217;éviter, et donc avant la mise en production. Aucune n&#8217;est nouvelle, certaines controversés, mais elles sont toutes étudiées dans la suite de cet article.</p>
<p><span id="more-24646"></span></p>
<h3>Tu n&#8217;utiliseras pas <em>null</em></h3>
<p>La première règle est simple : ne <strong>jamais</strong> utiliser le mot clé <em>null</em>.</p>
<p>Globalement, il est utilisé dans deux cas :</p>
<ul>
<li>initialisation d&#8217;objets</li>
<li>valeur vide</li>
</ul>
<p>Par exemple, au lieu d&#8217;écrire :</p>
<pre class="brush:java">String maVariable = null;

if(test == 0) {
  maVariable = "toto";
} else if(test &gt; 0) {
  maVariable = "titi";
} else {
  maVariable = "tata";
}

maVariable.subString(….)</pre>
<p>On peut tout simplement ne pas initialiser la variable <em>maVariable</em>. De cette façon, si on oublie un cas dans notre <em>if</em>, le compilateur va nous générer une erreur du type :</p>
<pre class="brush:bash">variable maVariable might not have been initialized</pre>
<p>Pour les valeurs vides, le problème est plus complexe. Nous verrons donc par la suite comme remplacer un <em>null </em>qui fait office de valeur vide.</p>
<h3>Tu utiliseras @NotNull, @Nullable</h3>
<p>La <a href="http://www.jcp.org/en/jsr/detail?id=308">JSR 308</a> nous apporte deux annotations <a href="http://www.jetbrains.com/idea/documentation/howto.html">@NotNull et @Nullable</a> qui permettent une vérification statique par le compilateur des valeurs des paramètres et de retour des méthodes. Par exemple :</p>
<pre class="brush:java">int maMethode(@NotNull String maChaine) {
  return maChaine.length();
}

maMethode(null);</pre>
<p>Dans ce cas on aurait eu une <em>NullPointerException</em> au lancement, alors qu&#8217;avec cette annotation on aura un <em>warning</em> directement à la compilation.</p>
<p>Bien évidement, mon exemple est simpliste mais cela fonctionne aussi sur des cas plus complexes.</p>
<p>Cette JSR peut être intégrée à plusieurs outils (Maven, Eclipse, etc.), pour plus de détails c&#8217;est <a href="http://types.cs.washington.edu/checker-framework/current/checkers-manual.html#external-tools">ici</a>. Il faut noter qu&#8217;IntelliJ l&#8217;intègre nativement.</p>
<h3>Tu utiliseras des objets vides</h3>
<p>Une autre façon d&#8217;éviter le <em>null </em>est d&#8217;utiliser le <a href="http://en.wikipedia.org/wiki/Null_Object_pattern">Null Object Pattern</a>. Le principe est très simple : créer des objets spécifiques qui représente le vide. Par exemple :</p>
<pre class="brush:java">class Personne {
  public String getNom() { … }
  public void setNom(String nom) { … }
  public List&lt;Personne&gt; getEnfants() { … }
}

public final PersonneVide extends Personne {
  public String getNom() {
    return "";
  }
  public void setNom(String nom) {}
  public List&lt;Personne&gt; getEnfants() {
    return Collections.emptyList();
  }
}</pre>
<p>Il suffit d&#8217;employer <em>PersonneVide</em> plutôt que d&#8217;utiliser <em>null. </em>Il y a plusieurs implémentations de cette solution. On peut aussi créer une interface <em>Personne</em> et l&#8217;implémenter en deux classe : <em>PersonnePhysique</em> (la vraie implémentation) et <em>PersonneVide</em>.</p>
<p>On peut aussi facilement étendre ce principe pour avoir d&#8217;autres objets plus spécifiques, comme le <a href="http://martinfowler.com/eaaCatalog/specialCase.html">montre</a> Martin Fowler.</p>
<p>Cette méthode a des nombreuses limitations. Il faut se contraindre à créer et surtout à utiliser ses objets vides. Ce qui rajoute du code et donc peut rajouter des bugs. À ma connaissance il n&#8217;existe pas de méthode automatique qui nous force à utiliser cette méthode.</p>
<h3>Tu lanceras des exceptions</h3>
<p>Une autre solution est d&#8217;utiliser des exceptions. Plutôt que de renvoyer une valeur <em>null</em>, on lance une exception. Cela à l&#8217;avantage d&#8217;avoir une validation statique faite par le compilateur. Pour plus de détail sur les bonnes pratiques sur la gestion des exceptions, c&#8217;est <a href="http://blog.octo.com/la-gestion-des-exceptions-en-java/">ici</a>. Par exemple :</p>
<pre class="brush:java">class ImpossibleDeGenererIDException extends Exception { … }

public class Personne {
  public Email genereID() throws ImpossibleDeGenererIDException {
    //On lance l'exception si on n'a pas pu générer d'ID
    //plutôt que de renvoyer null
  }
}</pre>
<p>Il faut noter que lancer une exception est très coûteux en terme de calcul. Et comme le dis très bien l&#8217;article citer ci-dessus, utiliser une exception pour un contrôle de flux est un anti-pattern. À mon avis, cette solution n&#8217;est pas à utiliser.</p>
<h3>Tu utiliseras le pattern <em>Option</em>/<em>Maybe</em></h3>
<p>Ce pattern nous vient des langages fonctionnels. Il consiste en un objet particulier <em>Option </em>qui encapsule un résultat. Cet objet peut avoir 2 valeurs possibles : une valeur non nulle (<em>Some</em>) ou <em>None</em>. Prenons un exemple de l&#8217;API de Java. La méthode <em>get </em>de <em>MyMap </em>renvoie <em>null</em> si l&#8217;objet demandé n&#8217;est pas présent dans celle-ci. Avec ce pattern, la méthode renverrait une instance d&#8217;<em>Option</em>. C&#8217;est donc l&#8217;utilisateur de la méthode est forcé par le compilateur de gérer le cas <em>None</em>. Une implémentation naïve serait donc :</p>
<pre class="brush:java">interface Option&lt;T&gt; {
  public Boolean isNone();
}

class Some&lt;T&gt; implements Option&lt;T&gt; {
  public T get() { … }
  public Boolean isNone() { return false; }
}

class None&lt;T&gt; implements Option&lt;T&gt; {
  public Boolean isNone() { return true; }
}

class MyMap&lt;K, V&gt; {
  public Option&lt;V&gt; get(K key) { … }
}

MyMap&lt;Integer, String&gt; map = new MyMap&lt;Integer, String&gt;();
map.put(1, "un");

Option&lt;String&gt; result = map.get(2);
if(result.isNone()) {
  // Gestion du cas None
} else {
  String val = ((Some) result).get();
}</pre>
<p>Cette méthode a le gros avantage d&#8217;avoir une validation statique par le compilateur. En effet, il est impossible d&#8217;utiliser directement la valeur de retour de la méthode <em>get</em>. Elle est du type <em>Option&lt;String&gt;</em> et donc complètement différent que celui attendu &laquo;&nbsp;classiquement&nbsp;&raquo; : <em>String. </em>On est donc forcé de faire le test du <em>None</em>. De plus, cela nous donne tout de suite l&#8217;information que la méthode peut renvoyer une valeur vide.</p>
<p>Cette implémentation est clairement bancale, la bibliothèque <a href="http://code.google.com/p/functionaljava">Functional Java</a> en fournit <a href="http://code.google.com/p/functionaljava/#Optional_Values_(type-safe_null)">une plus complète</a>.</p>
<p>C&#8217;est à mon avis la méthode la plus sûre. Mais elle a été pensée pour les langages gérant le <a href="http://fr.wikipedia.org/wiki/Filtrage_par_motif">pattern matching</a> comme <a href="http://www.scala-lang.org/">Scala</a> ou <a href="http://www.haskell.org/haskellwiki/Haskell">Haskell</a>, où elle est intégrée nativement dans l&#8217;API.</p>
<p>Elle est donc un peu lourde à utiliser en Java. Et surtout, elle n&#8217;est pas intégrée à l&#8217;API. Il faut donc soit utiliser une autre API, ou faire des wrapper autour de l&#8217;API standard.</p>
<h3>Conclusion</h3>
<p>Ces méthodes sont adaptables à tous les langages orientés objets. Certains offrent d&#8217;autres méthodes. Par exemple en Groovy il y a l&#8217;<a href="http://groovy.codehaus.org/Operators#Operators-OtherOperators">Elvis Operator</a>, en Ruby (avec Rails) le <a href="http://api.rubyonrails.org/classes/Object.html#method-i-try">try</a>.</p>
<p>Le problème reste lors de l&#8217;utilisation de bibliothèques externes. Même si un projet utilise ces solutions, il faudra toujours faire attention lors de l&#8217;utilisation de l&#8217;API Java ou autre (Hibernate pour ne citer que lui).</p>
<p>Il n&#8217;y a donc pas de méthode magique pour ne plus avoir de <em>NullPointerException</em> dans votre code Java (à part changer de langage ;)).</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=24646" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/article-parallelisation-distribution-partie-3-comment-tirer-parti-des-processeurs-multi-coeurs-a-travers-l-api-de-concurrence-de-java-7/' rel='bookmark' title='Parallélisation, distribution partie 3 : comment tirer parti des processeurs multi-coeurs à travers l&#8217;API de concurrence de Java 7 ?'>Parallélisation, distribution partie 3 : comment tirer parti des processeurs multi-coeurs à travers l&#8217;API de concurrence de Java 7 ?</a></li>
<li><a href='http://blog.octo.com/les-nouveautes-du-langage-dans-java-7/' rel='bookmark' title='Les nouveautés du langage dans Java 7'>Les nouveautés du langage dans Java 7</a></li>
<li><a href='http://blog.octo.com/un-dsl-sql-pour-java/' rel='bookmark' title='Un DSL SQL pour Java'>Un DSL SQL pour Java</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/comment-ne-plus-avoir-de-nullpointerexception-en-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Analyser la qualité de votre code Groovy / Grails</title>
		<link>http://blog.octo.com/analyse-code-groovy-grails/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=analyse-code-groovy-grails</link>
		<comments>http://blog.octo.com/analyse-code-groovy-grails/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 09:51:06 +0000</pubDate>
		<dc:creator>Cyril Picat</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[analyse statique]]></category>
		<category><![CDATA[codenarc]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[sonar]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=16170</guid>
		<description><![CDATA[Groovy / Grails est une bouffée d&#8217;air frais pour le programmeur Java, vous permettant d&#8217;écrire du code plus expressif et plus lisible, sans les lourdeurs de Java ou de JEE. Groovy vous simplifie également la vie en vous épargnant les écueils classiques du programmeur débutant ou distrait (BigDecimal, equals(), etc…). Ce n&#8217;est pas pour autant [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/transactions-en-grails/' rel='bookmark' title='Transactions et traitement métier en Grails'>Transactions et traitement métier en Grails</a></li>
<li><a href='http://blog.octo.com/retour-jug-lausanne-qualite-code-java/' rel='bookmark' title='Retour sur le JUG de Lausanne sur l&#8217;analyse de la qualité du code Java'>Retour sur le JUG de Lausanne sur l&#8217;analyse de la qualité du code Java</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fanalyse-code-groovy-grails%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Analyser%20la%20qualit%C3%A9%20de%20votre%20code%20Groovy%20%2F%20Grails%22%20%7D);"></div>
<p>Groovy / Grails est une bouffée d&#8217;air frais pour le programmeur Java, vous permettant d&#8217;écrire du code plus expressif et plus lisible, sans les lourdeurs de Java ou de JEE. Groovy vous simplifie également la vie en vous épargnant les écueils classiques du programmeur débutant ou distrait (BigDecimal, equals(), etc…). Ce n&#8217;est pas pour autant suffisant pour s&#8217;assurer de la qualité du code délivré et il vous faudra là aussi un ensemble de pratiques pour garder un code maintenable malgré les ajouts et évolutions.</p>
<p>Une de ces pratiques est l&#8217;analyse statique de votre code source via des métriques et des règles, et la surveillance de leur évolution d&#8217;une version sur l&#8217;autre, ou de manière plus ciblée pour une version particulière. Dans ce domaine le programmeur Java est sans aucun doute l&#8217;un des mieux outillés, avec des outils comme PMD, FindBugs, CheckStyle, XDepend, Sonar etc… Qu&#8217;en est-il en Groovy / Grails ? <span id="more-16170"></span></p>
<p><a href="http://blog.octo.com/en/analyzing-groovy-grails-code">L&#8217;article complet</a>, en anglais uniquement, aborde les points suivants :</p>
<ul>
<li>les outils disponibles en Groovy, à savoir <a href="http://gmetrics.sourceforge.net/">GMetrics</a>, <a href="http://codenarc.sourceforge.net/">CodeNarc</a>, <a href="http://www.sonarsource.org/">Sonar</a></li>
<li>la pertinence des autres outils Java sur du code Groovy, par exemple PMD, FindBugs, CheckStyle ou XDepend</li>
<li>la spécificité des langages dynamiques et l&#8217;importance des tests et d&#8217;une métrique comme la couverture de tests</li>
<li>comment mettre en place la solution retenue sur votre projet Grails : <strong>Sonar</strong>, plus précisément le <a href="http://docs.codehaus.org/display/SONAR/Groovy+Plugin">plugin Groovy</a> pour Sonar</li>
<li>une ouverture sur l&#8217;impact d&#8217;un IDE sur la qualité du code et les possibilités d&#8217;analyse d&#8217;IntelliJ via les &laquo;&nbsp;inspections&nbsp;&raquo;</li>
</ul>
<p>En guise de teaser, voici un exemple de tableau de bord Sonar sur un projet Grails :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2010/10/sonar-screenshot.png"><img class="aligncenter size-large wp-image-15875" title="sonar screenshot" src="http://blog.octo.com/wp-content/uploads/2010/10/sonar-screenshot-1024x580.png" alt="Screenshot of Sonar dashboard on a Grails project" width="1024" height="580" /></a></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=16170" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/transactions-en-grails/' rel='bookmark' title='Transactions et traitement métier en Grails'>Transactions et traitement métier en Grails</a></li>
<li><a href='http://blog.octo.com/retour-jug-lausanne-qualite-code-java/' rel='bookmark' title='Retour sur le JUG de Lausanne sur l&#8217;analyse de la qualité du code Java'>Retour sur le JUG de Lausanne sur l&#8217;analyse de la qualité du code Java</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/analyse-code-groovy-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Domain-Specific Languages: 3 questions à Guillaume Laforge</title>
		<link>http://blog.octo.com/domain-specific-languages-3-questions-a-guillaume-laforge/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=domain-specific-languages-3-questions-a-guillaume-laforge</link>
		<comments>http://blog.octo.com/domain-specific-languages-3-questions-a-guillaume-laforge/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 09:19:04 +0000</pubDate>
		<dc:creator>Nelly Grellier</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Université du SI]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=2420</guid>
		<description><![CDATA[Guillaume Laforge, Responsable Développement Groovy, présentera Domain-Specific Languages par la pratique les 1er et 2 juillet prochains à l’Université du SI. Voici 3 questions pour en savoir plus sur le contenu de sa session. Pourquoi participer à l&#8217;USI ? Pour moi, il manquait clairement un événement IT de taille en France. L&#8217;USI vient combler ce [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/retours-sur-le-javacampparis-ii/' rel='bookmark' title='Retours sur le JavaCampParis II'>Retours sur le JavaCampParis II</a></li>
<li><a href='http://blog.octo.com/octo-a-la-conference-grails-exchange-2007/' rel='bookmark' title='OCTO à la conférence Grails eXchange 2007'>OCTO à la conférence Grails eXchange 2007</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fdomain-specific-languages-3-questions-a-guillaume-laforge%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Domain-Specific%20Languages%3A%203%20questions%20%C3%A0%20Guillaume%20Laforge%20%20%22%20%7D);"></div>
<p>Guillaume Laforge, <span class="societe">Responsable Développement Groovy,</span> présentera <a href="http://www.usi2009.com/Guillaume-Laforge-1-130.html" target="_blank" class="broken_link">Domain-Specific Languages par la pratique</a> les 1er et 2 juillet prochains à l’<a onclick="javascript:pageTracker._trackPageview(&#039;/outbound/article/usi2009.universite-du-si.com&#039;);" href="http://usi2009.universite-du-si.com/index.php?module=Pagesetter&amp;tid=1&amp;tpl=list-intro" target="_blank" class="broken_link">Université du SI</a>.</p>
<p>Voici 3 questions pour en savoir plus sur le contenu de sa session.</p>
<p><span id="more-2420"></span></p>
<p><!--[if gte mso 9]><xml> <w :WordDocument> </w><w :View>Normal</w> <w :Zoom>0</w> <w :TrackMoves /> <w :TrackFormatting /> <w :HyphenationZone>21</w> <w :PunctuationKerning /> <w :ValidateAgainstSchemas /> <w :SaveIfXMLInvalid>false</w> <w :IgnoreMixedContent>false</w> <w :AlwaysShowPlaceholderText>false</w> <w :DoNotPromoteQF /> <w :LidThemeOther>FR</w> <w :LidThemeAsian>X-NONE</w> <w :LidThemeComplexScript>X-NONE</w> <w :Compatibility> <w :BreakWrappedTables /> <w :SnapToGridInCell /> <w :WrapTextWithPunct /> <w :UseAsianBreakRules /> <w :DontGrowAutofit /> <w :SplitPgBreakAndParaMark /> <w :DontVertAlignCellWithSp /> <w :DontBreakConstrainedForcedTables /> <w :DontVertAlignInTxbx /> <w :Word11KerningPairs /> <w :CachedColBalance /> </w> <w :DoNotOptimizeForBrowser /> <m :mathPr> <m :mathFont m:val="Cambria Math" /> <m :brkBin m:val="before" /> <m :brkBinSub m:val="&#45;-" /> <m :smallFrac m:val="off" /> <m :dispDef /> <m :lMargin m:val="0" /> <m :rMargin m:val="0" /> <m :defJc m:val="centerGroup" /> <m :wrapIndent m:val="1440" /> <m :intLim m:val="subSup" /> <m :naryLim m:val="undOvr" /> </m> </xml>< ![endif]--><!--[if gte mso 9]><xml> <w :LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w :LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w :LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w :LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w :LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w :LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w :LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w :LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w :LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w :LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w :LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w :LsdException Locked="false" Priority="39" Name="toc 1" /> <w :LsdException Locked="false" Priority="39" Name="toc 2" /> <w :LsdException Locked="false" Priority="39" Name="toc 3" /> <w :LsdException Locked="false" Priority="39" Name="toc 4" /> <w :LsdException Locked="false" Priority="39" Name="toc 5" /> <w :LsdException Locked="false" Priority="39" Name="toc 6" /> <w :LsdException Locked="false" Priority="39" Name="toc 7" /> <w :LsdException Locked="false" Priority="39" Name="toc 8" /> <w :LsdException Locked="false" Priority="39" Name="toc 9" /> <w :LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w :LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w :LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w :LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w :LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w :LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w :LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w :LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w :LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w :LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w :LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w :LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w :LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w :LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w :LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w :LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w :LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w :LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w :LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w :LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w :LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w :LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w :LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w :LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w :LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w :LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w :LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w :LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w :LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w :LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w :LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w :LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w :LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w :LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w :LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w :LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w :LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w :LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w :LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w :LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w :LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w :LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w :LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w :LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w :LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w :LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w :LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w :LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w :LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w :LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w :LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w :LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w :LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w :LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w :LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w :LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w :LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w :LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w :LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w :LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w :LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w :LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w :LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w :LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w :LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w :LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w :LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w :LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w :LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w :LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w :LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w :LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w :LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w :LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w :LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w :LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w :LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w :LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w :LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w :LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w :LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w :LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w :LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w :LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w :LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w :LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w :LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w :LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w :LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w :LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w :LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w :LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w :LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w :LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w :LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w :LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w :LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w :LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w :LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w :LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w :LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w :LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w :LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w :LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w :LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w :LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w :LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w :LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w :LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w :LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w :LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w :LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w :LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w :LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w :LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w :LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w :LsdException Locked="false" Priority="37" Name="Bibliography" /> <w :LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w> </xml>< ![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face 	{font-family:Consolas; 	panose-1:2 11 6 9 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:modern; 	mso-font-pitch:fixed; 	mso-font-signature:-1610611985 1073750091 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} p.MsoPlainText, li.MsoPlainText, div.MsoPlainText 	{mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-link:"Texte brut Car"; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	font-family:Consolas; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} span.TextebrutCar 	{mso-style-name:"Texte brut Car"; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-unhide:no; 	mso-style-locked:yes; 	mso-style-link:"Texte brut"; 	mso-ansi-font-size:10.5pt; 	mso-bidi-font-size:10.5pt; 	font-family:Consolas; 	mso-ascii-font-family:Consolas; 	mso-hansi-font-family:Consolas;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]> <mce :style>< !   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} --> <!--[endif]--></p>
<ul>
<li><strong>Pourquoi participer à l&#8217;USI ?</strong></li>
</ul>
<p>Pour moi, il manquait clairement un<strong> événement IT de taille en France</strong>. L&#8217;USI vient combler ce vide, avec des speakers connus, du contenu de qualité, et plus encore.<br />
C&#8217;est une conférence qui rassemble des gens aux <strong>profils variés</strong> (aussi bien techos que manager) pour parler ensemble de sujets centrés autour de nos SI, de notre métier d&#8217;informaticien, d&#8217;architecture, de technologie, de méthodos, d&#8217;évolution de l&#8217;informatique, etc.<br />
L&#8217;USI, c&#8217;est vraiment là où il faut être si l&#8217;on veut rester au fait des tendances de notre métier.</p>
<ul>
<li><strong>De quoi va parler ta session USI ?</strong></li>
</ul>
<p>Je vais vous parler de langages métier et de comment concrètement en créer avec Groovy (<a href="http://groovy.codehaus.org">http://groovy.codehaus.org</a>)<br />
Je gère depuis plusieurs années le projet Groovy, qui est un langage dynamique pour la machine virtuelle Java.<br />
Groovy permet de <strong>créer ses propres langages dérivés</strong> pour exprimer des<strong> règles métier</strong>.<br />
Et je profite de l&#8217;USI pour m&#8217;adresser aussi bien aux geeks qu&#8217;aux boss, pour leur montrer ce que peuvent apporter les Domain-Specific Languages en Groovy dans leurs applications.</p>
<ul>
<li><strong>Sinon, quoi de neuf dans la sphère Groovy ?</strong></li>
</ul>
<p>Depuis le rachat de ma société G2One par <a href="http://www.springsource.com/g2one" target="_blank">SpringSource</a> , on n&#8217;a pas chaumé, et on a sorti deux versions majeures de Groovy et Grails : respectivement <a href="http://blog.springsource.com/2009/03/04/groovy16/" target="_blank">Groovy 1.6 </a>et <a href="http://blog.springsource.com/2009/03/10/grails-11-released/" target="_blank">Grails 1.1</a>. Plus de performance, plus de fonctionnalités pour <strong>simplifier la vie des développeurs Java</strong>. J&#8217;organise également une conférence, <strong><a href="http://www.gr8conf.org" target="_blank">GR8Conf</a></strong> au Danemark, en mai, et ce sera l&#8217;occasion d&#8217;approfondir toutes les technologies apparentées à Groovy, comme Grails et Griffon.<br />
J&#8217;espère vous y voir nombreux !</p>
<p><a href="http://www.youtube.com/watch?v=4dG0p1L11L4&amp;feature=channel_page">Video de présentation de la session</a></p>
<p><a href="http://twitter.com/USI2009" class="broken_link">Cliquez ici</a> pour suivre l&#8217;actualité USI 2009</mce></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2420" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/retours-sur-le-javacampparis-ii/' rel='bookmark' title='Retours sur le JavaCampParis II'>Retours sur le JavaCampParis II</a></li>
<li><a href='http://blog.octo.com/octo-a-la-conference-grails-exchange-2007/' rel='bookmark' title='OCTO à la conférence Grails eXchange 2007'>OCTO à la conférence Grails eXchange 2007</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/domain-specific-languages-3-questions-a-guillaume-laforge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Innover sans technologie</title>
		<link>http://blog.octo.com/innover-sans-technologie/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=innover-sans-technologie</link>
		<comments>http://blog.octo.com/innover-sans-technologie/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 08:52:31 +0000</pubDate>
		<dc:creator>David Alia</dc:creator>
				<category><![CDATA[Brèves de consultants]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[innovation]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=993</guid>
		<description><![CDATA[Dans un article précédent, Yannick prônait l’innovation durable illustrée dans le secteur des Télécom, auquel un commentateur zélé répondait qu’icelle « n’est pas une question de technologie, ni d’architecture de SI », invoquant même le directeur marketing de Coca-Cola (lire). Je suis assez tenté de rejoindre votre position, cher commentateur. D’autant plus que, chez OCTO, [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/la-productivite-des-developpements%e2%80%a6-n%e2%80%99est-pas-qu%e2%80%99une-affaire-de-technologie/' rel='bookmark' title='La productivité des développements… n’est pas qu’une affaire de technologie !'>La productivité des développements… n’est pas qu’une affaire de technologie !</a></li>
<li><a href='http://blog.octo.com/scrum-sans-iterations/' rel='bookmark' title='Scrum sans itérations ?'>Scrum sans itérations ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Finnover-sans-technologie%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Innover%20sans%20technologie%22%20%7D);"></div>
<p>Dans un article précédent, Yannick prônait l’innovation durable illustrée dans le secteur des Télécom, auquel un commentateur zélé répondait qu’icelle « n’est pas une question de technologie, ni d’architecture de SI », invoquant même le directeur marketing de Coca-Cola (<a href="http://blog.octo.com/index.php/2008/04/24/105-les-nouvelles-plates-formes-de-service" target="_blank">lire</a>).</p>
<p>Je suis assez tenté de rejoindre votre position, cher commentateur. D’autant plus que, chez OCTO, l’innovation que je vais vous présenter a démarré bien loin de l’IT.<br />
<span id="more-993"></span><br />
OCTO, nombre de lecteurs l’auront évidemment compris, est fervent partisan de l’intégration des méthodes Lean dans le SI. Le kaizen (amélioration continue), issu des pratiques industrielles de Toyota, reste un maître mot dans l’accompagnement de nos clients.</p>
<p>Pour tordre le cou au droit proverbial des cordonniers à être mal chaussés, j’avais décidé de mettre en place cette pratique en interne. L’innovation proposée devait amener de la valeur à un public ciblé, sans bousculer les habitudes de travail, avec un investissement initial restreint.</p>
<p>Le sujet était tout trouvé : améliorer la communication commerciale essentielle vers les consultant(e)s. En effet, tous étaient et sont toujours susceptibles d’être intéressés par les propositions commerciales en cours, celles (brillamment !) gagnées et celles (étonnamment !) perdues et ce, au fil de l’eau.</p>
<p>Allais-je lancer une expression des besoins puis une recette auprès de key users habilement sélectionnés ? Allais-je me ruer tête baissée vers une extraction journalière des données de notre ERP pour une diffusion par mail aux abonnés ?  Allais-je tout simplement me lancer dans la technologie pour innover ? Le suspense est insoutenable, vous le sentez aussi.</p>
<p>Pour tester et démontrer la valeur de mon innovation, j’ai plutôt choisi de prototyper éco : économique et écologique.</p>
<ul>
<li>Un tableau en liège grand format installé dans la cafét’ (en face du baby-foot)</li>
</ul>
<ul>
<li>Des post-it de couleurs variées (les couleurs illustreront les secteurs de nos clients sur lesquels est structurée notre organisation)</li>
</ul>
<ul>
<li>Des punaises de qualité irréprochable</li>
</ul>
<ul>
<li>Et… c’est malheureusement tout : je sais, c’est cruel pour les technophiles technocentriques</li>
</ul>
<p><img class="size full wp-image-1004 alignleft" src="http://blog.octo.com/wp-content/uploads/2009/03/octotalks-innover-sans-technologie-11-mini.jpg" alt="Tableau des propositions commerciales OCTO" width="15%" height="15%" /></p>
<p>Le tableau est divisé en trois sections : en cours, gagnées, perdues. Sur les posts-it, le nom du client et l’intitulé de la mission gribouillés au marqueur. La purge est mensuelle.</p>
<p>Mon objectif : susciter l’adhésion des  gestionnaires commerciaux (écrire un post-it à la pause café ne coûte pas), obtenir un feedback de TOUS les utilisateurs sans les assaillir (pendant qu’on discute autour d’un café, on peut commenter les missions affichées) et initier le changement sans rupture (l’information pertinente est accessible sans efforts).</p>
<p>Le projet a été plébiscité, et depuis plus de six mois désormais, le tableau est régulièrement mis à jour et a subi quelques modifications suggérées par les utilisateurs.</p>
<p>Passer à la technologie était l’étape <strong>complémentaire</strong> : quelques modifications de code dans notre ERP maison, l’ajout d’un feed RSS sur les missions et le tour était joué. Modifier le code était relativement aisé puisque notre logiciel (basé sur le framework Grails) était balisé par un harnais de tests automatisés (*). Implémenter un flux RSS était redoutablement facile, mais vous devez achever la lecture de ce billet pour comprendre pourquoi : c’est visiblement l’article de tous les suspenses.</p>
<p>Alors, innover sans technologie c’est non seulement possible mais c’est indispensable lorsque le contexte s’y prête :</p>
<ul>
<li>Les utilisateurs ne sont pas bousculés, au contraire ils sont tacitement incités à participer à l’élaboration du projet par des suggestions immédiates ou du fait de la facilité à modifier soi-même (changer la disposition ou la couleur des posts-it),</li>
<li>L’investissement initial est marginal (chez OCTO, on peut encore se servir de posts-it sans remplir cinq formulaires) et autorise l’échec,</li>
<li>Toutes les castes sont impliquées et valorisées d’emblée : les directeurs, les commerciaux, les consultants, les stagiaires : tous transitent une fois par jour au moins à la salle café (au moins trois fois par jour pour les stagiaires) et constatent l’épanouissement du business de notre société.</li>
</ul>
<h3>La partie technique</h3>
<p>Les articles informatiques, c’est comme les bons yaourts aux fruits : c’est toujours meilleur avec des morceaux dedans.</p>
<p>La plateforme Grails qu’on ne présente plus possède un plug-in spécifique : <a href="http://grails.codehaus.org/Feeds+Plugin" target="_blank">Feeds</a>. Grâce à l’expressivité intrinsèque de Groovy et à l’implémentation masquée des mécaniques de flux (RSS/ATOM), ce plug-in a permis de développer la version technologique du tableau de la salle café en deux heures à peine, tests inclus évidemment.</p>
<p>L’innovation avec Grails est un sujet passionnant, qui sera de nouveau abordé dans une session de l’<a href="http://www.usi2009.com" target="_blank">Université du SI</a> les 1 et 2 juillet prochain. Décidément, le suspense se poursuit…</p>
<p><strong>Extrait du code de génération du flux RSS à partir du plug-in Grails « Feeds »</strong>.</p>

<div class="wp_codebox"><table><tr id="p9932"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code" id="p993code2"><pre class="groovy" style="font-family:monospace;">render<span style="color: #66cc66;">&#40;</span>feedType:<span style="color: #ff0000;">'rss'</span>, feedVersion:<span style="color: #ff0000;">'2.0'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
title <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Les propositions commerciales OCTO&quot;</span>
description <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;La mise à jour régulière propositions commerciales d’OCTO&quot;</span>
link <span style="color: #66cc66;">=</span> url <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;/wS/feedMissions&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// méthode du Core Domain pour récupérer les dernières modifications</span>
<span style="color: #808080; font-style: italic;">// sur les missions. La variable period fournie par l’utilisateur permet de</span>
<span style="color: #808080; font-style: italic;">// remonter les modifications chaque jour (défaut) ou chaque semaine.</span>
<span style="color: #000000; font-weight: bold;">def</span> l <span style="color: #66cc66;">=</span> Project.<span style="color: #006600;">listRecent</span><span style="color: #66cc66;">&#40;</span>period, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
l.<span style="color: #663399;">each</span> <span style="color: #66cc66;">&#123;</span> pr <span style="color: #66cc66;">-&amp;</span>gt<span style="color: #66cc66;">;</span>
  <span style="color: #808080; font-style: italic;">// On filtre sur les projets facturés</span>
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>pr.<span style="color: #006600;">isBilledProject</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> client <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;client non renseigné&quot;</span>
    <span style="color: #000000; font-weight: bold;">def</span> sector <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;secteur inconnu&quot;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>pr.<span style="color: #006600;">client</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      client <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">client</span>.<span style="color: #006600;">name</span>
      sector <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">client</span>.<span style="color: #006600;">sector</span>.<span style="color: #006600;">name</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">// projectStatus.name renseigne sur l’état de la mission :</span>
    <span style="color: #808080; font-style: italic;">// avant-vente, signée, annulée, perdue…</span>
    <span style="color: #000000; font-weight: bold;">def</span> title <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">projectStatus</span>.<span style="color: #006600;">name</span>.<span style="color: #006600;">toUpperCase</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot; : &quot;</span> <span style="color: #66cc66;">+</span> client <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot; (&quot;</span> <span style="color: #66cc66;">+</span> sector <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;)&quot;</span>
    <span style="color: #000000; font-weight: bold;">def</span> ref <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">getReferenceAndName</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #000000; font-weight: bold;">def</span> am <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">accountManager</span> <span style="color: #66cc66;">?</span> pr.<span style="color: #006600;">accountManager</span>.<span style="color: #006600;">trigram</span> : <span style="color: #ff0000;">&quot;N/A&quot;</span>
    <span style="color: #000000; font-weight: bold;">def</span> invoice <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">invoicingType</span>.<span style="color: #006600;">description</span>
    <span style="color: #000000; font-weight: bold;">def</span> amount <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">totalAmount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">?</span> <span style="color: #aaaadd; font-weight: bold;">String</span>.<span style="color: #006600;">format</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'% 6.2f'</span>, pr.<span style="color: #006600;">totalAmount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot; euros&quot;</span>
                                  : <span style="color: #ff0000;">'N/A'</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">// Définition d’une entrée RSS</span>
    entry<span style="color: #66cc66;">&#40;</span>title<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      publishedDate <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
      link <span style="color: #66cc66;">=</span> url <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;/project/edit/&quot;</span> <span style="color: #66cc66;">+</span> pr.<span style="color: #006600;">id</span>
&nbsp;
      <span style="color: #808080; font-style: italic;">// cette méthode met en forme les informations</span>
      <span style="color: #808080; font-style: italic;">// sous forme linéaire ou tabulaire, selon le choix utilisateur</span>
      renderFeed<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>ref, invoice, amount, am, pr.<span style="color: #006600;">comment</span><span style="color: #66cc66;">&#93;</span>, format<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>(*) Hmm… Ce n’est pas entièrement vrai, à croire que l’adage sur les cordonniers a la nuque raide</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=993" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/la-productivite-des-developpements%e2%80%a6-n%e2%80%99est-pas-qu%e2%80%99une-affaire-de-technologie/' rel='bookmark' title='La productivité des développements… n’est pas qu’une affaire de technologie !'>La productivité des développements… n’est pas qu’une affaire de technologie !</a></li>
<li><a href='http://blog.octo.com/scrum-sans-iterations/' rel='bookmark' title='Scrum sans itérations ?'>Scrum sans itérations ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/innover-sans-technologie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GRAILS et FitNesse : au service de l&#8217;innovation métier</title>
		<link>http://blog.octo.com/grails-et-fitnesse-au-service-de-l-innovation-metier/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=grails-et-fitnesse-au-service-de-l-innovation-metier</link>
		<comments>http://blog.octo.com/grails-et-fitnesse-au-service-de-l-innovation-metier/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 10:19:46 +0000</pubDate>
		<dc:creator>Fabrice Robini</dc:creator>
				<category><![CDATA[Méthodologie et conduite du changement]]></category>
		<category><![CDATA[Agilité]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://new-blog.octo.com/2008/12/30/grails-et-fitnesse-au-service-de-l-innovation-metier/</guid>
		<description><![CDATA[Une société dans le monde des médias : &#171;&#160;Deux mois, seulement deux mois pour sortir ces nouvelles fonctionnalités, sinon nous sommes morts !&#160;&#187;. Pour se différencier, il faut innover. Mais l&#8217;innovation métier seule ne suffit pas, il faut innover avec une longueur d&#8217;avance, être le premier. Le décor est planté. Pour adresser l&#8217;innovation dans un [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/transactions-en-grails/' rel='bookmark' title='Transactions et traitement métier en Grails'>Transactions et traitement métier en Grails</a></li>
<li><a href='http://blog.octo.com/grails-maven-plugin-03/' rel='bookmark' title='Grails Maven Plugin 0.3'>Grails Maven Plugin 0.3</a></li>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fgrails-et-fitnesse-au-service-de-l-innovation-metier%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22GRAILS%20et%20FitNesse%20%3A%20au%20service%20de%20l%27innovation%20m%C3%A9tier%22%20%7D);"></div>
<p>Une société dans le monde des médias :</p>
<p><em>&laquo;&nbsp;Deux mois, seulement deux mois pour sortir ces nouvelles fonctionnalités, sinon nous sommes morts !&nbsp;&raquo;.</em> Pour se différencier, il faut innover. Mais l&#8217;innovation métier seule ne suffit pas, il faut innover avec une longueur d&#8217;avance, être le premier. Le décor est planté.</p>
<p><span id="more-177"></span></p>
<p>Pour adresser l&#8217;innovation dans un contexte temporel borné, on aura tendance à privilégier des méthodes agiles plutôt que de se lancer dans des longues phases de spécifications fonctionnelles générales, détaillées, qui ne feront qu&#8217;ajouter du risque &#8230; Passons  le peu de temps que l&#8217;on a à produire plutôt qu&#8217;à tout spécifier en détail.</p>
<p>Les méthodologies agiles permettent d&#8217;une part de répondre à ces contraintes de planning très fortes où les dérapages sont impossibles et d&#8217;autre part d&#8217;avancer sur un périmètre fonctionnel et/ou technique non encore défini ou changeant.</p>
<p>Concrètement, on adoptera une approche itérative et incrémentale</p>
<ul>
<li><strong>Itératif</strong> : Les phases de développements sont cycliques, régulières et de durée fixe. On parle d&#8217;itération. Le périmètre fonctionnel d&#8217;une itération est figé.</li>
<li><strong>Incrémental</strong> : Chaque itération délivre une nouvelle version fonctionnelle du logiciel.</li>
</ul>
<p>Du coté des développements, l&#8217;équipe se doit d&#8217;être réactive aux orientations de la MOA,  c&#8217;est-à-dire faire en sorte que le logiciel puisse être facilement adaptable aux évolutions futures ou autre changements de spécification. De cette hypothèse, on va privilégier une conception et une architecture légère : la technique ne doit plus être une contrainte pour faire évoluer le logiciel. C&#8217;est là que GRAILS et les tests entrent en jeu&#8230;</p>
<h3>GRAILS, kesako ?</h3>
<p><strong></strong> <a href="http://www.grails.org/">GRAILS</a>, bien plus qu&#8217;un framework est une plateforme JEE complète ayant comme objectif la productivité et la simplification des développements. S&#8217;appuyant massivement sur le paradigme &nbsp;&raquo; Convention Over Configuration &laquo;&nbsp;, cette approche permet de libérer le développeur de toutes les &nbsp;&raquo; siouxeries &nbsp;&raquo; techniques de configuration,  de manipulation des multiples APIs, etc&#8230; Précisons que GRAILS n&#8217;est pas un autre framework issue du bien connu syndrome &nbsp;&raquo; NIH &nbsp;&raquo; (Not Invented Here), mais une abstraction des frameworks les plus éprouvés du monde JEE à savoir Spring, Spring MVV, Hibernate, Sitemesh,  EhCache, Log4j, etc&#8230; ce qui garantit bien évidemment un certain standard.</p>
<p>Cette solution dite &nbsp;&raquo; packagée &laquo;&nbsp;, permet  d&#8217;être très  rapidement opérationnel, puisqu&#8217;elle vient avec tout ce dont le développeur à besoin pour coder, lancer et tester son application : une base de données embarquée (HSQLDB), un serveur web light (Jetty), des scripts Maven /Ant&#8230;<br />
Bref, en quelques minutes les développeurs sont opérationnels et peuvent commencer à travailler sur les premières fonctionnalités.</p>
<p>Récemment racheté et intégré au portefeuille des produits de <a href="http://www.springsource.com/fr">Spring Source</a> (éditeur de Spring/Spring DM, etc&#8230;), les récents téléchargements de la dernière version montrent clairement un engouement prononcé de la communauté&#8230; (30 000 téléchargements en février 08. 72 000 téléchargements pour le mois de novembre, soit plus du double).</p>
<h3>GRAILS, un bon candidat pour adresser l&#8217;innovation métier</h3>
<p><strong></strong> La convention apportée par GRAILS alliée à l&#8217;expressivité du langage GROOVY permet de se focaliser sur le besoin métier, c&#8217;est-à-dire sur les règles de gestion que le développeur devra coder.</p>
<ul>
<li><strong>Expressivité</strong>: Le code est proche du langage naturel et les termes techniques sont minimisés (dans le cas de groovy, ils se résument à de la simple ponctuation)</li>
<li><strong>Convention</strong> : En respectant l&#8217;architecture proposée, les règles de nommage des variables, méthodes, pages jsps, controllers, services, etc &#8230;  le framework se charge de la technique que nous aurions dû normalement coder. Par exemple : les accès en base, les requetes sql/hql,  la configuration des mapping url/controllers et controllers/vues, etc&#8230;</li>
</ul>
<p>Ainsi, pas besoin d&#8217;être un expert Hibernate, Spring, etc&#8230; pour réaliser les opérations CRUD d&#8217;un objet, mais une convention à respecter.  Cette approche permet de réduire le temps de développement et ainsi maximiser l&#8217;apport de valeur métier. Les démonstrations à la MOA sont plus fréquentes, on obtient un <em>feedback </em>au plus tôt et l&#8217;on peut soit valider le besoin soit réajuster le tir si besoin ;-). Ceci est particulièrement appréciable en contexte d&#8217;innovation.</p>
<p>Un bémol tout de même; à ce jour (décembre 08), l&#8217;intégration dans les IDEs n&#8217;est pas aussi étendue qu&#8217;avec Java. Ce manque devrait être comblé grâce aux travaux actuels des développeurs de Spring Source.</p>
<h3>Des fonctionnalités décrites sous la forme de tests de recette</h3>
<p><strong></strong> Pas de cahier des charges, mais une approche TDR (Test Driven Requirements) c&#8217;est-à-dire une spécification où les règles de gestion sont écrites sous la forme de tests de recette automatisés. Dans un contexte où le temps est compté, cette approche est particulièrement bien adaptée puisqu&#8217;elle présente les avantages suivants :</p>
<ul type="disc">
<li><strong>La spécification est compréhensible :</strong> la règle de gestion est illustrée via un test représenté sous forme tabulaire, comme dans Excel.</li>
<li><strong>La validation de la spécification est automatique :</strong> Le test de recette est automatiquement exécuté sur le code de l&#8217;application</li>
<li><strong>La validation est univoque :</strong> Le résultat d&#8217;un test est binaire : OK ou KO, pas de discussions possibles</li>
</ul>
<p>J&#8217;ai l&#8217;habitude d&#8217;utiliser l&#8217;outil <a href="http://fitnesse.org">FitNesse</a> sur mes projets. Gratuit,  léger et autonome (il ne requiert aucun système externe), il répond bien dans un premier temps à mes attentes : installation et prise en main rapide.</p>
<h3>FitNesse, un outil collaboratif</h3>
<p><strong></strong> FitNesse est un wiki, il donne une véritable visibilité au projet. Les spécifications (ou tests ;-) sont accessibles à l&#8217;aide d&#8217;un navigateur web, ce qui facilite son adoption et rassemble autour de lui les équipes MOA et MOE.</p>
<p>Pour plus d&#8217;information sur FitNesse, je vous invite à consulter le site officiel <a href="http://fitnesse.org/">http://fitnesse.org/</a></p>
<h3>Un exemple concret</h3>
<p><strong></strong></p>
<p>Une fois le contexte posé, voyons à partir d&#8217;un exemple concret comment cela se passe dans la réalité.</p>
<p>Mise en situation. Notre client nous demande d&#8217;implémenter la fonctionnalité suivante :</p>
<ul>
<li><em>Réduction sur la vente des albums musicaux à partir de codes promotionnels.</em></li>
</ul>
<p>La suite dans le prochain billet, ce qui nous donnera l&#8217;occasion de voir l&#8217;écriture du test de recette et l&#8217;intégration de FitNesse avec GRAILS.</p>
<p>A suivre donc&#8230;</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=177" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/transactions-en-grails/' rel='bookmark' title='Transactions et traitement métier en Grails'>Transactions et traitement métier en Grails</a></li>
<li><a href='http://blog.octo.com/grails-maven-plugin-03/' rel='bookmark' title='Grails Maven Plugin 0.3'>Grails Maven Plugin 0.3</a></li>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/grails-et-fitnesse-au-service-de-l-innovation-metier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retours sur le JavaCampParis II</title>
		<link>http://blog.octo.com/retours-sur-le-javacampparis-ii/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=retours-sur-le-javacampparis-ii</link>
		<comments>http://blog.octo.com/retours-sur-le-javacampparis-ii/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 11:52:37 +0000</pubDate>
		<dc:creator>Luc Bizeul</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://new-blog.octo.com/2008/12/18/retours-sur-le-javacampparis-ii/</guid>
		<description><![CDATA[<p>Merci à vous !</p>
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/cr-du-barcamp-java/' rel='bookmark' title='Retour sur le BarCamp Java du Mardi 30 Septembre'>Retour sur le BarCamp Java du Mardi 30 Septembre</a></li>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/barcamp-java-a-paris-le-mardi-16-decembre/' rel='bookmark' title='BarCamp Java à Paris le Mardi 16 Décembre'>BarCamp Java à Paris le Mardi 16 Décembre</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fretours-sur-le-javacampparis-ii%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Retours%20sur%20le%20JavaCampParis%20II%22%20%7D);"></div>
<p>Merci à vous !</p>
<p>Bonjour, Merci aux participants d&#8217;avoir rendu cet évènement si sympathique ! Merci d&#8217;avoir simplement été présents avec votre passion et votre enthousiasme :)<br />
<span id="more-173"></span></p>
<p>Voici le Cr de la session sur Grails/Groovy :</p>
<p>Langages dynamiques : pourquoi des langages dynamiques comme Ruby, Python et Groovy ont du succès bien que ces langages s&#8217;inspirent largement de Smalltalk qui ne trouve pas sa place dans le monde des entreprises. Groovy : Deux propriétés assez attirantes : 1/ le concept de closure, et 2/ la lisibilité du code (langage fonctionnel proche du domaine métier &#8211; DSL). Le problème est qu&#8217;il n&#8217;y a pas, pour le moment, assez d&#8217;outillage ce qui rend difficile toute refactorisation. Rails : bien adapté si on souhaite des accès CRUD. Pas assez outillé. Pas de retour sur le &laquo;&nbsp;Scaffolding&nbsp;&raquo; dans des cas réels. L&#8217;exécution et le débogage est souvent fait en mode console. Il n&#8217;y a pas eu retour sur le plugin eclipse (non utilisé). Typage faible, fort et dynamique : les concepts différent d&#8217;une personne à une autre.. il n&#8217;y a pas de support pour refactoriser le code des langages à faible typage comme Ruby par ex. Finalement il y a eu une discussion sur les raisons pour lesquelles une équipe adopte une nouvelle technologie.</p>
<p>Merci à Houssam Fakih pour les notes sur la session Groovy, et merci aux blogueurs pour les retours :</p>
<p><a hreflang="fr" href="http://www.insideit.fr/post/2008/12/17/JavaCamp-2-compte-rendu">http://www.insideit.fr/post/2008/12/17/JavaCamp-2-compte-rendu</a></p>
<p><a hreflang="fr" href="http://www.touilleur-express.fr/2008/12/17/java-barcamp-2-merci-octo/">http://www.touilleur-express.fr/2008/12/17/java-barcamp-2-merci-octo/</a></p>
<p><a hreflang="fr" href="http://thecodersbreakfast.net/index.php?post/2008/12/17/Java-BarCamp-2-%3A-compte-rendu" class="broken_link">http://thecodersbreakfast.net/index.php?post/2008/12/17/Java-BarCamp-2-%3A-compte-rendu</a></p>
<p><a hreflang="fr" href="http://thecodersbreakfast.net/index.php?post/2008/12/19/Java-BarCamp-2-%3A-compte-rendu-(2/2)" class="broken_link">http://thecodersbreakfast.net/index.php?post/2008/12/19/Java-BarCamp-2-%3A-compte-rendu-(2/2)</a></p>
<p><a hreflang="fr" href="http://boissinot.blogspot.com/2008/12/retour-sur-le-barcamp-2.html">http://boissinot.blogspot.com/2008/12/retour-sur-le-barcamp-2.html</a></p>
<p><a hreflang="fr" href="http://www.itaware.eu/2008/12/20/javacamp-ii-db-et-esb/">http://www.itaware.eu/2008/12/20/javacamp-ii-db-et-esb/</a></p>
<p>A bientôt pour la 3 eme édition !</p>
<p>Luc</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=173" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/cr-du-barcamp-java/' rel='bookmark' title='Retour sur le BarCamp Java du Mardi 30 Septembre'>Retour sur le BarCamp Java du Mardi 30 Septembre</a></li>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/barcamp-java-a-paris-le-mardi-16-decembre/' rel='bookmark' title='BarCamp Java à Paris le Mardi 16 Décembre'>BarCamp Java à Paris le Mardi 16 Décembre</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/retours-sur-le-javacampparis-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Last day @Devoxx</title>
		<link>http://blog.octo.com/last-day-devoxx/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=last-day-devoxx</link>
		<comments>http://blog.octo.com/last-day-devoxx/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 14:55:48 +0000</pubDate>
		<dc:creator>Olivier Mallassi</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[Usabilité]]></category>

		<guid isPermaLink="false">http://new-blog.octo.com/2008/12/12/last-day-devoxx/</guid>
		<description><![CDATA["Devoxx is over!". Directement depuis le train du retour...
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/another-day-devoxx/' rel='bookmark' title='Another day @ Devoxx'>Another day @ Devoxx</a></li>
<li><a href='http://blog.octo.com/one-day-devoxx/' rel='bookmark' title='One day @ Devoxx'>One day @ Devoxx</a></li>
<li><a href='http://blog.octo.com/les-grandes-tendances-de-devoxx-2011/' rel='bookmark' title='Les grandes tendances de Devoxx 2011'>Les grandes tendances de Devoxx 2011</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Flast-day-devoxx%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Last%20day%20%40Devoxx%22%20%7D);"></div>
<p>&laquo;&nbsp;Devoxx is over!&nbsp;&raquo;. Directement depuis le train du retour&#8230;<br />
<span id="more-166"></span></p>
<p>Il est traditionnel que la journée du vendredi (la matinée en fait) ne regroupe jamais les sessions les plus attendues. Cette matinée nous a tout de même amené du contenu fort intéressant.</p>
<h3>DM Server : from WAR to Web Module</h3>
<p>SpringSource a profité de la matinée pour réaliser une présentation d&#8217;une heure sur leur nouvellle plateforme DMServer. DMServer a pour objectifs:</p>
<ul>
<li>offrir de la modularité. SpringSource considère les war comme quelque chose de monolitique (notamment car l&#8217;ensemble des librairies disponibles sont potentiellement en plusieurs exemplaires dans le répertoire WEB-INF/lib) et souhaite pouvoir partager des services communs à plusieurs applications web entre ces applications web.</li>
<li>faciliter l&#8217;intégration des beans Spring dans OSGI avec notamment la &laquo;&nbsp;service registry&nbsp;&raquo;, l&#8217;annuaire de services</li>
<li>faciliter la gestion des librairies avec le &laquo;&nbsp;Bundle Repository&nbsp;&raquo;, le référentiel de Bundle OSGI. A noter que lorsqu&#8217;une application utilise un Bundle OSGI, ce dernier est chargé uniquement &laquo;&nbsp;on demand&nbsp;&raquo; afin bien entendu de limiter l&#8217;empreinte mémoire.</li>
</ul>
<p>OSGI introduit la notion de Bundle, un jar définissant un MANIFEST qui définit quels packages sont visibles de l&#8217;extérieur du Bundle. La  limite aux bundles dans le cadre d&#8217;une application Web reste le déploiement et l&#8217;unité de déploiement (classiquement un WAR ou un EAR). pour répondre à cela, SpringSource définit une nouvelle unité de déploiement : le PAR qu&#8217;il faut voir comme un jar définissant un MANIFEST qui contient des headers de type Application-* et qui définit quels sont les Bundle OSGI qu&#8217;il peut utiliser&#8230;Au delà de la pure problématique de déploiement, le PAR doit aussi permettre de gérer le scope des Beans à l&#8217;application&#8230;Reste que DMServer accepte de déployer de bon vieux WARs.</p>
<p>Il faut avouer que la session était très &laquo;&nbsp;par la pratique&nbsp;&raquo; et a consisté à transformer un WAR en PAR/WebModule. Donc du code, de l&#8217;IDE&#8230;</p>
<h4>Step 1: d&#8217;un WAR aux librairies partagées</h4>
<p>Prenez une application web classique regroupant dans son WEB-INF/lib quelques jars. La première étape consiste à rajouter dans le WAR un MANIFEST OSGI qui spécifie les Bundles que l&#8217;application va utiliser ainsi que leurs versions. Par exemple</p>

<div class="wp_codebox"><table><tr id="p1663"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p166code3"><pre class="xml" style="font-family:monospace;">Import-Package:javax.servlet:version=&quot;2.5&quot;
Import-Library:org.springframework.spring,version&quot;[2.5.0,3.0.0)&quot;</pre></td></tr></table></div>

<p>Résultat des courses, le WEB-INF/lib disparait. Vous me direz qu&#8217;on savait déjà mettre des jars dans le classpath du serveur. Ce n&#8217;est pas faux mais cela ne permet de gérer qu&#8217;une seule version des jars.</p>
<h4>Step 2: vers des services partagés entre WAR</h4>
<p>L&#8217;idée est de pouvoir partager des &laquo;&nbsp;services&nbsp;&raquo; &#8211; concrètement des Beans Spring&nbsp;&raquo; &#8211; qui seraient communs entre différents WAR. Dans ce cas,  l&#8217;application se repose sur le Service Registry mis à disposition par DMServer.</p>
<p>Pour faire cela, on extrait du war les classes en question (typiquement les classes des packages &laquo;&nbsp;services&nbsp;&raquo;) puis il faut exposer certains packages au niveau des Bundles réutilisables puis les référencer depuis l&#8217;application Web. L&#8217;exposition de services/beans est assez simple et ce fait grâce au manifest, à un fichier de configuration spring et un fichier OSGI (et oui, cela se complexifie un peu&#8230;).</p>
<p>concernant le manifest donc:</p>
<pre lang"=xml">
Export-Package:com.octo
Import-Package:org.myossproject</pre>
<p>La première ligne de cet extrait de manifest offre la possibilité d&#8217;exporter les classes présentes dans le package com.octo. La seconde indique que le Bundle utilise le package org.myossproject. Ce fichier manifest doit (ou peut?) être complété par :</p>
<ul>
<li>un fichier META-INF/spring/module-context.xml, un classique fichier Spring qui définit le Bean, son nom logique&#8230;</li>
<li>un fichier META-INF/spring/osgi-context.xml qui précise le bean Spring à exposer &#8211; via son nom logique -.</li>
</ul>

<div class="wp_codebox"><table><tr id="p1664"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p166code4"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;service</span> <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">&quot;myService&quot;</span> <span style="color: #000066;">interface</span>=<span style="color: #ff0000;">&quot;com.octo.IMyService&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p>Côté WAR et application web, il est nécessaire de modifier le fichier application-context.xml pour référencer le service OSGI</p>
<p>précédemment exposé (vous être toujours là? ;o) ). Le fichier devient donc :</p>

<div class="wp_codebox"><table><tr id="p1665"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p166code5"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;reference</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;myService&quot;</span> <span style="color: #000066;">interface</span>=<span style="color: #ff0000;">&quot;com.octo.IMyService&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p>Personnellement, à ce moment là je tape les limites suivantes:</p>
<ul>
<li>trop de configuration XML avec la nécessité de répéter certaines informations comme l&#8217;interface. Il y a certainement une bonne raison mais je dois avouer que je ne l&#8217;ai pas saisie.</li>
<li>les projets se démultiplie. Quelques années auparavant, on créait des artifacts (pour Maven notamment et pour gérer les dépendances de compilation) et donc des projets différents. Personnellement, cela ne me dérange pas mais force est de constater que beaucoup trouve cela trop complexe. Donc, la mode est de tout ramener simplement dans un WAR avec des packages &laquo;&nbsp;propres&nbsp;&raquo;. Et bien là, roll back, le nombre de projet augmente à nouveau.</li>
</ul>
<p>La session continue avec cet exemple et démontre que l&#8217;on peut charger et décharger les bundles de la JVM sans aucun problème. La subtilité vient au moment où on décharge le bundle qui est référencé, utilisé par l&#8217;application Web. Tant que cette dernière ne réalise pas d&#8217;appels vers les services exposées par ce bundle, tout va bien. Lorsque l&#8217;on souhaite utiliser un de ces services, l&#8217;application attend jusqu&#8217;au timeout&#8230;</p>
<p>Là encore je tape une limite. Franchement c&#8217;est génial et la démonstration est impressionante mais (ben oui il y a un mais&#8230;)</p>
<ul>
<li>comment vont faire les équipes d&#8217;exploitation pour gérer les bundles utilisés, déployés, non utilisés&#8230;certes la console d&#8217;administration fournit la liste des bundle et leur version déployées dans le serveur mais est-ce suffisant pour s&#8217;assurer qu&#8217;après 6 mois d&#8217;exploitation, ne seront pas utilisé que 3 des 20 bundles déployés</li>
<li>peut-on vraiment en production déployer de nouvelles versions des bundles en remplacement des anciennes? Les équipes ont intérêt à être hyper mûres sur les aspects testabilité et non regression de leurs APIs. Enfin il me semble.</li>
<li>le déploiement des Bundles est ordonné. En effet, si le Bundle B dépend (Import-Package) du Bundle A, il faut que ce dernier soit déployé avant&#8230;</li>
</ul>
<h4>Step 3 : La création du Web Module et du PAR</h4>
<p>le Web Module est un jar qui contient un répertoire particulier MODULE-INF. Ce répertoire MODULE-INF reprend l&#8217;intégralité du répertoire WebContent, c&#8217;est à dire les jsp, le WEB-INF&#8230;Ce module contient également un manifest</p>

<div class="wp_codebox"><table><tr id="p1666"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p166code6"><pre class="xml" style="font-family:monospace;">Module-Type:web
Web-ContextPath:myAppContextRoot</pre></td></tr></table></div>

<p>Enfin le PAR qui est un artefact d&#8217;agrégation. Ce PAR proser un fichier META-INF/MANIFEST qui reprend la liste des Bundles nécessaires à l&#8217;application Web. Le bon ordre de chargement des bundles est alors garanti par DMServer.</p>
<p>Bref, j&#8217;ai été plutôt prolixe sur cette session qui reste pour moi géniale. J&#8217;ai néanmoins cette (première) impression qui est que sur ce coup, les choses sont encore un peu complexes. Après, il s&#8217;agit de la première version.</p>
<h3>Developing beyond locahost</h3>
<p>Lors de cette session, un autre aspect de la productivité à été présenté : comme vérifier rapidement que son code marche correctement sur des OS et des configurations différentes ?</p>
<p>La réponse proposée est d&#8217;utiliser des machines virtuelles sur son poste et ainsi pouvoir tester directement les effets d&#8217;une modification et son comportement sur les différentes configuration. La démo s&#8217;est basée sur l&#8217;outil VirtualBox déployé sur OpenSolaris :</p>
<ul>
<li>On code notre application</li>
<li>On switch très rapidement entre les VMs ce qui rend les tests (manuels) très rapides</li>
<li>La machine utilsée (laptop) n&#8217;a pas souffert de lenteurs malgré les 3 VMs</li>
</ul>
<p>Un outil assez intéressant (désolé le nom m&#8217;échappe&#8230;) permet d&#8217;effectuer des sauvegardes incrémentales (et donc d&#8217;en faire une multitude sans prendre trop d&#8217;espace). Ces sauvegardes nous permettent de revenir à un état initiale, pour ne plus avoir des cookies ou de cache par exemple, ou encore pour vérifier l&#8217;installation ou la montée de version d&#8217;une application JavaWebStart.</p>
<h3>Devoxx is Over!</h3>
<p>Devoxx en général et l&#8217;édition 2008 reste un bon moyen de sentir ce qu&#8217;il se passe sur les thématiques d&#8217;architectures, de développement et même un peu de méthodologie (car on a noté quelques 2 ou 3 sessions taggées &laquo;&nbsp;Méthodologie&nbsp;&raquo; autour de Java).</p>
<ul>
<li>La Modularité. Toujours et partout. Au niveau des serveurs d&#8217;applications, au niveau des applications, au niveau du JDK&#8230;bref, c&#8217;est le régime pour Java et la possibilité du &laquo;&nbsp;juste adapté&nbsp;&raquo;.</li>
<li>Java et sa JVM comme plateforme d&#8217;exécution de &laquo;&nbsp;tous&nbsp;&raquo; les langages. Force est de constater la poussée toujours plus forte des langages dynamiques (Groovy, Ruby,Python etc&#8230;). La retro-compatibilité du lagange et de la plateforme, mise en avant depuis des années, a commencé à être attaqué dans le but de faire tomber les barrières qui limitent l&#8217;évolution du langage, l&#8217;intégration d&#8217;autres langages&#8230;La plateforme Java est-elle vouée à devenir une plateforme offrant des services techniques à des applications écrire en N langages, une espèce de machine virtuelle universelle?</li>
<li>Java s&#8217;ouvre à la communauté et cherche à fournir une plateforme plus productive. Les modèles de programmation  Spring et JEE se rapprochent et tendent vers du plus simple. Le langage évolue en ce sens également.</li>
<li>La confirmation de l&#8217;avantage des IHMs &laquo;&nbsp;vectorielles&nbsp;&raquo; (à base de plugin comme par exemple Flex) et des architectures IHM &laquo;&nbsp;client-side&nbsp;&raquo;. Au delà des purs aspects graphiques, ces solutions laissent envisager de nouvelles manières d&#8217;interagir avec des machines, bref de nouveaux patterns d&#8217;usabilité.</li>
<li>Le rapprochement Designer/Développeur. Des solutions apparaissent et visent à faciliter voire à rendre transparent ce round trip entre le designer et le développeur, l&#8217;objectif étant de s&#8217;assurer qu&#8217;il n&#8217;y a pas de pertes lors des développement.</li>
</ul>
<p><strong>By Benoit Lafontaine, Olivier Mallassi, Fabrice Robini</strong></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=166" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/another-day-devoxx/' rel='bookmark' title='Another day @ Devoxx'>Another day @ Devoxx</a></li>
<li><a href='http://blog.octo.com/one-day-devoxx/' rel='bookmark' title='One day @ Devoxx'>One day @ Devoxx</a></li>
<li><a href='http://blog.octo.com/les-grandes-tendances-de-devoxx-2011/' rel='bookmark' title='Les grandes tendances de Devoxx 2011'>Les grandes tendances de Devoxx 2011</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/last-day-devoxx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Another day @ Devoxx</title>
		<link>http://blog.octo.com/another-day-devoxx/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=another-day-devoxx</link>
		<comments>http://blog.octo.com/another-day-devoxx/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 18:21:07 +0000</pubDate>
		<dc:creator>Olivier Mallassi</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[batch]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://new-blog.octo.com/2008/12/11/another-day-devoxx/</guid>
		<description><![CDATA[<p>"Et ca continu, encore et encore....". ne me demandez pas pourquoi j'ai cet air dans la tête. ce n'est franchement pas mon style de musique...</p> <p><br /></p>
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/last-day-devoxx/' rel='bookmark' title='Last day @Devoxx'>Last day @Devoxx</a></li>
<li><a href='http://blog.octo.com/one-day-devoxx/' rel='bookmark' title='One day @ Devoxx'>One day @ Devoxx</a></li>
<li><a href='http://blog.octo.com/les-grandes-tendances-de-devoxx-2011/' rel='bookmark' title='Les grandes tendances de Devoxx 2011'>Les grandes tendances de Devoxx 2011</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fanother-day-devoxx%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Another%20day%20%40%20Devoxx%22%20%7D);"></div>
<p>&laquo;&nbsp;Et ça continue, encore et encore&#8230;.&nbsp;&raquo;. ne me demandez pas pourquoi j&#8217;ai cet air dans la tête. ce n&#8217;est franchement pas mon style de musique&#8230;</p>
<p><span id="more-165"></span></p>
<h3>Effective Java by James Bloch</h3>
<p>Du code, du code, du code&#8230;malgré des neurones pas encore complètement &laquo;&nbsp;up&nbsp;&raquo;. Une session au format Tips &amp; Tricks sur certains aspects de la version 5 langage Java. Des subtilités autour des enum (&laquo;&nbsp;do not use ordinal()&nbsp;&raquo;), des mécanismes de lazy initialization, des generics.</p>
<p>On peut s&#8217;étonner du fait qu&#8217;on ne parle que de Java5 mais force est de constater qu&#8217;encore peu de personnes ont définitivement quitté la version antérieure de Java et que cela reste la version amenant le plus de modification du langage depuis un bout de temps.</p>
<h3>La Modularité : décidément un sujet à la mode&#8230;</h3>
<p>&#8230;mais ce matin, la keynote s&#8217;est concentrée sur la modularité du JDK, la compatibilité et les nouveautés de Java7. Le JDK se doit d&#8217;être modulaire pour faciliter les downloads, les temps de démarrage etc&#8230;.une mouvance que l&#8217;on a déjà constaté au niveau des serveurs d&#8217;applications (par exemple Glassfish).</p>
<p>&laquo;&nbsp;La compatibilité ne sera pas forcément assurée tout le temps&nbsp;&raquo; est une synthèse du message de Mark Reinhold sur le sujet de la compatibilité ascendante entre versions du JSE. C&#8217;est surprenant,  effrayant et en même temps, cela garanti ou facilite la survie du langage Java : certaines fonctionnalités, évolutions du langage se doivent d&#8217;être intégrées et la compatibilité est un frein à une réelle intégration&#8230;Affaire à suivre.</p>
<p>Les nouveautés du Java 7. On note un mouvement de fond de Sun qui est l&#8217;ouverture sur la communauté utilisateur comme si Sun avait compris qu&#8217;il était important de faire évoluer le langage pour répondre aux demandes du terrain et donc aux communautés de développeurs.  J&#8217;aime cette idée. Java 7 intègre donc des évolutions souhaitées par Sun et des évolutions souhaitées par d&#8217;autres acteurs:</p>
<ul>
<li>la JSR 277 (ou JAM) disparait au profit de la JSR 294. Là ou la JSR 277 travaillait sur le déploiement, la JSR 294 se limite au langage, aux mécanismes de super-package ou comment jouer sur la visibilité de certaines classes ou package. on se rapproche d&#8217;OSGI</li>
<li>OSGI justement. Mark Reinhold officialise le rapprochement. Dans les faits, cela c&#8217;était déjà concrétisé avec la modularité OSGI de Glassfish.</li>
<li>la machine virtuel veut supporter des langages dynamiques. Son petit nom de code est simplement JSR 292 mais le mouvement était déjà lancé depuis quelque temps</li>
<li>de nouvelles APIS de I/O. Certes les NIO mais surtout de nouvelles APIs d&#8217;accès au système de fichier (depuis le temps&#8230; ;-) )</li>
<li>une gestion des exceptions facilitée grâce à deux points.
<ul>
<li>Le &laquo;&nbsp;safe rethrow&nbsp;&raquo; qui permet par exemple de &laquo;&nbsp;catcher Throwable&nbsp;&raquo; et de &laquo;&nbsp;relancer&nbsp;&raquo; strictement l&#8217;exception alors que la signature de méthode ne prévoit que deux cas d&#8217;erreur fortement typé. en bref, le compilateur gère pour nous.</li>
</ul>
</li>
</ul>

<div class="wp_codebox"><table><tr id="p1657"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p165code7"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">void</span> doIt<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> X1, X2<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Throwable</span> e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #000000; font-weight: bold;">throw</span> e<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<ul>
<li>
<ul>
<li>Le &laquo;&nbsp;multicatch&nbsp;&raquo; qui permet d&#8217;avoir un seul catch(X1, x2&#8230;) et donc un seul traitement pour les exceptions X1 et X2.</li>
</ul>
</li>
</ul>

<div class="wp_codebox"><table><tr id="p1658"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p165code8"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>...<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>X1, X2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></pre></td></tr></table></div>

<ul>
<li>peut etre de nouvelles annotations sur plus de type. L&#8217;exemple pris est celui d&nbsp;&raquo;une annotation @NonNull sur un paramètre de méthode. Cette annotation permet de préciser que le paramètre doit etre non null et facilite la vérification de NullPointerException et autres bugs. C&#8217;est intéressant car cela nous rapproche des classiques outils de qualimétrie mais on peut regretter la forte adhérence et intrusion au code.</li>
</ul>
<h4>Event Driven Architecture &amp; Complex Event Processing</h4>
<p>Les architectures orientées évènements fonctionnent sur la base d&#8217;évènements échangés entre un &laquo;&nbsp;publisher&nbsp;&raquo; et un &laquo;&nbsp;subscriber&nbsp;&raquo;. L&#8217;utilisateur a alors la responsabilité de s&#8217;abonner aux évènements qui l&#8217;intéressent; le système s&#8217;auto organise (enfin&#8230;).</p>
<p>Le Complex Event Processing est une évolution des architectures orientées évènements ou Event Driven Architecture qui vise à agréger beaucoup plus finement qu&#8217;un simple Publish/Subscribe des informations, des évènements  provenant de différentes sources. Il est possible de requêter le contenu des messages; par exemple, les ordres d&#8217;achat qui dépasse tel ou tel montant ou bien les évènements de crédit et débit qui ont en commun un numéro de compte&#8230;</p>
<p>Les cas d&#8217;utilisation sont autour des systèmes de trading, de détection de fraudes ou bien un système de <a href="http://ganglia.info/">monitoring de système</a>&#8230;</p>
<p>La session est l&#8217;occasion de présenter un produit nommé <a href="http://esper.codehaus.org/">Esper</a> qui implémente et facilite (normalement bien entendu car rappelez vous qu&#8217;il s&#8217;agit d&#8217;une présentation&#8230;) le développement de systèmes basées sur cette architecture. Esper propose donc une API permettant de réagir aux évènements, d&#8217;en créer de nouveaux, de requêter le contenu des message avec une syntaxe proche de SQL.</p>
<h3>La modularité Java</h3>
<p>Je crois que je n&#8217;aurai jamais autant entendu ce terme: modularité. Cette présentation se concentre sur la JSR-294 ou comment gérer la modularité de JDK mais également des applications afin d&#8217;améliorer quelques limitations sur l&#8217;existant:</p>
<ul>
<li>le &laquo;&nbsp;jar hell&nbsp;&raquo; et les problématiques de classpath. Apparemment, l&#8217;idée de supprimer le classpath et sa nécessaire configuration au profit de quelque chose &#8211; que j&#8217;avoue ne pas avoir trés bien saisi&#8230;</li>
<li>les temps de download</li>
<li>les &laquo;&nbsp;memory footprint&nbsp;&raquo;</li>
</ul>
<p>Bref, cette JSR veut faire évoluer le langage et la VM pour être plus simple et flexible. Alors voilà dans les grandes lignes ce qui nous attend (au risque de ne pas être exhaustif). En premier lieu, le concept de module. le package est hiérarchique. le module, lui, permettra de regrouper des classes de différents packages dans un composant &laquo;&nbsp;logique&nbsp;&raquo;. Ainsi le code suivant pourra être écrit</p>

<div class="wp_codebox"><table><tr id="p1659"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p165code9"><pre class="xml" style="font-family:monospace;">module com.octopackage com.octo.core public class DoIt</pre></td></tr></table></div>

<p>puis dans une autre classe</p>

<div class="wp_codebox"><table><tr id="p16510"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p165code10"><pre class="xml" style="font-family:monospace;">module com.octo package com.octo.ext module class DoItDifferently</pre></td></tr></table></div>

<p>la classe DoItDifferently utilise le mot-clé module qui lui donne simplement la visibilité &#8211; et donc la possibilité d&#8217;être utilisée &#8211; au sein du module, indépendamment de son package.</p>
<p>Mais le module introduit également la gestion des dépendances. Ainsi il peut référencer d&#8217;autres modules qu&#8217;ils utilisent et que la JVM aura à charge de récupérer (comment? ca non plus je n&#8217;ai pas compris&#8230;ben oui désolé.)</p>

<div class="wp_codebox"><table><tr id="p16511"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p165code11"><pre class="xml" style="font-family:monospace;">module com.octo{ require com.octo.core require ceQueVousVoulez }</pre></td></tr></table></div>

<p>Bien entendu, il faut rajouter les notions de versionning; là encore, c&#8217;est le développeur qui gère cela.</p>

<div class="wp_codebox"><table><tr id="p16512"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p165code12"><pre class="xml" style="font-family:monospace;">module com.octo @ 1.2{ require com.octo.core @ 1.2 require ceQueVousVoulez @ 2.2 }</pre></td></tr></table></div>

<p>Il reste à voir comment la JVM va gérer ces dépendances de modules. Reste qu&#8217;à ce jour, ces évolutions du langage me semblent plutôt destinée aux éditeurs mais cela risque d&#8217;impacter nos processus de build car aujourd&#8217;hui des outils comme Maven gère pour nous et au build ces histoires de dépendances et de version de binaires.<br />
Peut être que la JSR 294 aura le même destin que sa quasi homonyme JSR- 277; Java Module. Peut-être pas.</p>
<h3>JEE 6 : Coming Soon, March 2009</h3>
<p>Là encore, le keyword est &laquo;&nbsp;modularité&nbsp;&raquo;. JEE continu à grossir par rapport à sa version précédente mais introduit la notion de profile. L&#8217;idée dérrière les profiles est de regrouper des technologies &laquo;&nbsp;cohérentes&nbsp;&raquo; entre elles. Le premier de ces profiles est le &laquo;&nbsp;Web Profile&nbsp;&raquo; ou quelles sont les APIs nécessaires et utiles pour réaliser une application Web complète.<br />
Ainsi, le Web Profile va réunir Servlet 3.0, JSP 2.1, JSF 2.0, EJB Lite 3.1, JTA 1.1, JPA 2.0..Un beau programme mais la limite ou la difficulté auquel Sun devra faire face avec les profils, c&#8217;est de créer le consensus sur ce quelles APIs seront présentes ou non dans le profile&#8230;Au regard des réactions du public, la tâche me parait complexe.</p>
<p>&laquo;&nbsp;Faute avouée est à moitié pardonnée&nbsp;&raquo; disait ma mère (et en fait j&#8217;imagine toutes les mères&#8230;). Sun appelle le &laquo;&nbsp;pruning&nbsp;&raquo; ou comment déprécier des pans complet de JEE; les éditeurs auront le choix d&#8217;implémenter ou non ces parties. On y trouve des APIs comme JAX-RPC&#8230;</p>
<p>JEE 6 s&#8217;ouvrira également sur la communauté au proposant les &laquo;&nbsp;Extensibility&nbsp;&raquo;; un mécanisme permettant à des solutions open source, des framework comme Spring, de bundler leur configuration (typiquement les servlet-filter&#8230;) pour que cette dernière soit simplement et de façon transparente, pour le développeur, prise en compte par le container.</p>
<p>Pour aller un peu plus dans le détail. Servlet 3.0 propose :</p>
<ul>
<li>un mode de développement à base d&#8217;annotations (@WebServlet, @ServletFilter)</li>
<li>une modularité du fichier web.xml. Cela rejoint les &laquo;&nbsp;extensibility&nbsp;&raquo; mais il est possible d&#8217;embarquer un fichier META-INF/web-fragment.xml dans un jar, un framework et ce dernier sera mergé avec la configuration de l&#8217;application réalisée par annotation.</li>
<li>l&#8217;intégration de <a href="http://blog.octo.com/index.php/2008/09/04/136-apres-ajax-le-reverse-ajax-et-le-grizzly?cos=1">Comet</a>. Encore une configuration à base d&#8217;annotations @WebServlet(asyncSupported=true)&#8230;Les choses bougent vraiment trop vite&#8230;</li>
</ul>
<p>Concernant EJB 3.1, on note:</p>
<ul>
<li>l&#8217;appartion d&#8217;un nouveau type de Bean. Annoté @Singleton, ce dernier est un Bean qui joue le rôle de singleton. Semble idéal pour les classiques problématiques de &laquo;&nbsp;Startup class&nbsp;&raquo;, attention à ce que ce dernier ne deviennent pas le bottleneck de l&#8217;applicatif. L&#8217;API rajoute un gestionnaire d&#8217;accès concurrent (@ConcurrencyManager), un gestion des lock (@Lock)&#8230;</li>
<li>le support de méthodes asynchrone sur un EJB Session. L&#8217;ajout de l&#8217;annotation @Asynchronous rend l&#8217;exécution asynchrone et laisse le container définir le moment opportun pour son exécution.</li>
<li>les EJB 3.1 Lite&#8230;Modularité quand tu nous tiens! Bref, un sous ensemble d&#8217;EJB 3.1 qui propose Session Beans, gestion des transactions, de la sécurité, les intercepteurs et un mode EJB Container embedable. Cet embeddable Container peut être facilement démarrer via des APIs. Il permet donc d&#8217;utiliser des EJBs avec un JSE, de faire de tests unitaires. Enfin, ces EJBs peuvent être directement intégrables dans une application web; il n&#8217;est donc plus nécessaire de passer par un jar tiers.</li>
</ul>
<h4>Un outil a essayer : <a href="http://www.zeroturnaround.com/javarebel/">Javarebel</a></h4>
<p>Commencons par le but du produit : supprimer le turnover; ie le temps entre une modification du code et la visualisation du changement dans une application déployée sur un serveur.</p>
<p>La présentation commence par poser le problème : en tant que développeurs Java d&#8217;application web, on passe 10% du temps à attendre que notre application se redéploie et a peu pès autant à retrouver ce qu&#8217;on était en train de faire vu que pendant notre temps d&#8217;attente, notre cerveau à perdu le fil. Bref, chaque seconde compte.</p>
<p>Des solutions plus ou moins bonnes existent déjà.</p>
<ul>
<li>Les serveurs d&#8217;applications savent recharger une application en changeant de classloader, le problème est qu&#8217;il faut alors réinitialiser et recharger le contexte, avec des applications spring cela peut prendre relativement longtemps.</li>
<li>OSGI va plus loin et permet de ne plus recharger toute l&#8217;application, mais seulement un module (et les modules qui en dépendent). On réduit, mais ce n&#8217;est pas encore ça.</li>
<li>Les frameworks comme tapestry ou RIFE permettent de recharger un composant uniquement. On approche&#8230; mais il reste des problèmes (tout ce qui est hors composant par exemple, et il faut toujours recharger le contexte)</li>
<li>Hotswap, c&#8217;est un peu ce qu&#8217;on vise, car avec hotswap, on ne recharge plus de contexte, c&#8217;est le code de l&#8217;objet qui est directement changer. Cette (très bonne) solution reste limitée : on ne peut peut changer que le code interne à une méthode et on est obligé d&#8217;être dans un debuggeur.</li>
</ul>
<p>Javarebel est assez similaire a hotswap : il change directement le code des objets (donc pas de rechargement de contexte), mais il supporte lui plus de fonctionnalités comme l&#8217;ajout de méthodes, de<br />
variables d&#8217;instances, de classes etc&#8230; Les limitations sont repoussées aux changement d&#8217;héritage (l&#8217;objet n&#8217;étant plus X mais Y par exemple).</p>
<p>Une partie de certains frameworks comme Spring ou Struts sont aussi gérés (tant que la configuration est gérée par annotation dans la classe) : par exemple, on peut rajouter à chaud une méthode d&#8217;un controlleur spring avec l&#8217;annotation qui va bien pour qu&#8217;elle soit bindé sur l&#8217;URL correspondante, ou encore on peut rajouter un bean &laquo;&nbsp;autowired&nbsp;&raquo;, le bean sera mis à jour automatiquement.</p>
<p>Des plugins sont prévus pour intégrer ce produit aux outils comme Maven ou Eclipse.</p>
<p>Conclusion du speaker : &laquo;&nbsp;chaque secondes comptent. Il y a plein de solutions efficaces, gratuites et qu&#8217;il faut utiliser, si vous voulez aller encore plus loin, il y a une solution payante (mais pas chere)&nbsp;&raquo; .<br />
A noter, que vous pouvez payer en bières si vous voulez (4 pour la version individuelle et une dizaine pour la version entreprise)</p>
<p>La société développe aussi un serveur d&#8217;application basé sur la même technologie qui vous permet de réaliser une montée de version de votre application avec zéro interruption de service.</p>
<h3>Hibernate Performance Tuning</h3>
<p>Session très intéressante qui énumère toutes les optimisations possibles et leur contexte d&#8217;application.  Toute la chaîne participant à la persistance est passée en revue,  on commence par parler des paramétrages au niveau de l&#8217;OS (et oui, à la fin nos données son bien sauvegardées sur de vulgaires  fichiers ;-),  les accès disques (compression, cryptage, fragmentation), communication réseau, etc&#8230; Puis on remonte d&#8217;un niveau pour aborder la base de données et les configurations permettant là encore de gagner en performance:  la taille du cache (the bigger, the better ;-),  les indexs,  la taille des buffers, les table space&#8230; là on se dit, tiens je vais aller payer un café à mon DBA préféré ;-) Puis on remonte doucement vers Hibernate (en abordant le choix judicieux du driver JDBC);  petite piqure de rappel sur les différents caches Hibernate (1er et 2ème niveaux).  On entre ans le vif du sujet avec les optimisations au niveau code et design d&#8217;implémentation:  on prendra bien soin de ne pas avoir une hiérarchie d&#8217;héritage trop importante, de bien choisir le type de la colonne discriminante (on préférera utiliser un char(1), certes moins explicite mais bien plus performant.</p>
<p>Idée reçu: le DDL automatiquement généré par hibernate n&#8217;est pas optimisé pour la production ! Volker insiste bien sur le fait de se rapprocher le plus possible du DBA pour qu&#8217;il puisse &laquo;&nbsp;tuner&nbsp;&raquo; les scripts de génération et poser correctement les bons indexs (sans doute l&#8217;optimisation qui fournit le meilleur retour sur investissement). La session se termine par l&#8217;optimisation des requêtes HQL: toujours utiliser les &laquo;&nbsp;parametrized queries&nbsp;&raquo;, maximiser les bulks/batch invocation pour optimiser les allers-retours vers la base de données,  préférer le eager-loading pour les cas d&#8217;utilisation de navigation dans les grappes d&#8217;objet&#8230;</p>
<p>L&#8217;optimisation des performances s&#8217;effectue à de très nombreux niveaux depuis les fichiers jusque dans le code de l&#8217;application. Pour que ce chantier soit utile et concluant, Il ne faut jamais oublier de se fixer un objectif&#8230; et là, le test de monté en charge nous aidera pour fixer cet objectif à atteindre grâce aux métriques que nous pourront alors suivre.</p>
<h3>Efficient Enterprise Build</h3>
<p>Les nouveautés de Maven 3 :</p>
<ul>
<li>Une gestion des plages de versions qui fonctionne : les plages de fonctions par exemple : version=[1.1,) étaient présentent dans les dernières versions de Maven2, mais il restait pas mal de  problèmes dans leur implémentation.</li>
<li>Plexus (le framework d&#8217;IOC de maven) va être remplacé par un autre framework, probablement XBean ou Guice Maven devient encore plus modulaire (encore&#8230;). Cette modularité ouvre de nombreuses possibilités de réutilisation ou d&#8217;ouverture notamment :
<ul>
<li>La partie embedder permet une meilleure intégration aux outils comme Eclipse, Netbean ou Hudson</li>
<li>Le &laquo;&nbsp;Plugin manager&nbsp;&raquo; est réutilisée dans Nexus</li>
<li>Le project builder peut-être changer pour intégrer des projets Visual Studio ou pour permettre de construire son POM avec un script ruby ou groovy à la place du fichier XML.</li>
</ul>
</li>
<li>Une amélioration de la partie &laquo;&nbsp;code coverage&nbsp;&raquo; qui ne se limitera plus aux tests unitaires, mais permettra de visualiser la couverture de code par les tests unitaires, les tests d&#8217;intégration et les tests<br />
d&#8217;acceptance sous le même rapport.</li>
</ul>
<p>L&#8217;équipe travaille avec Hudson pour offrir une meilleure intégration de Maven, notamment grâce à l&#8217;embedder. Une intégration de workflow (via drools) permettra de définir un workflow pour une release par exemple : &laquo;&nbsp;build &#8211; envoi de mails &#8211; vote des intéressés &#8211; release&nbsp;&raquo;.</p>
<p>Au final, un gros accent sur la modularité et l&#8217;intégration aux outils du développeur, Jason van Zyl nous à fait une bonne démo de m2eclipse et l&#8217;objectif est clairement que le développeur reste dans son  IDE et que celui-ci lui apporte tout ce qu&#8217;il a besoin : documentation pour construire son projet, autocomplétion, vue sur les repositories centraux, etc&#8230;</p>
<p><strong>By Benoit Lafontaine, Fabrice Robini, Olivier Mallassi</strong></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=165" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/last-day-devoxx/' rel='bookmark' title='Last day @Devoxx'>Last day @Devoxx</a></li>
<li><a href='http://blog.octo.com/one-day-devoxx/' rel='bookmark' title='One day @ Devoxx'>One day @ Devoxx</a></li>
<li><a href='http://blog.octo.com/les-grandes-tendances-de-devoxx-2011/' rel='bookmark' title='Les grandes tendances de Devoxx 2011'>Les grandes tendances de Devoxx 2011</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/another-day-devoxx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Construire ses parsers ANTLR avec Maven &#8211; Partie 1/3 &#8211; ANTLR</title>
		<link>http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-1-3-antlr/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=construire-ses-parsers-antlr-avec-maven-partie-1-3-antlr</link>
		<comments>http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-1-3-antlr/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 19:00:52 +0000</pubDate>
		<dc:creator>Thomas Vial</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[antlr]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://new-blog.octo.com/2008/12/10/construire-ses-parsers-antlr-avec-maven-partie-1-3-antlr/</guid>
		<description><![CDATA[<p>Cet article en 3 volets présente comment intégrer la construction et le test de parsers ANTLR avec Maven. La première partie est consacrée à une présentation rapide d'ANTLR.</p>
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-3-3-testez-vos-grammaires/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 3/3 &#8211; Testez vos grammaires'>Construire ses parsers ANTLR avec Maven &#8211; Partie 3/3 &#8211; Testez vos grammaires</a></li>
<li><a href='http://blog.octo.com/maven-deploy-avec-2-profiles/' rel='bookmark' title='Maven deploy avec 2 profiles'>Maven deploy avec 2 profiles</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fconstruire-ses-parsers-antlr-avec-maven-partie-1-3-antlr%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Construire%20ses%20parsers%20ANTLR%20avec%20Maven%20-%20Partie%201%2F3%20-%20ANTLR%22%20%7D);"></div>
<p>Cet article en 3 volets présente comment intégrer la construction et le test de parsers ANTLR avec Maven. La première partie est consacrée à une présentation rapide d&#8217;ANTLR.</p>
<p><span id="more-162"></span></p>
<p>Lorsque vous avez besoin de développer un langage maison pour votre projet Java, avec une grammaire capable de le reconnaître, une valeur sûre est ANTLR (<em>ANother Tool for Language Recognition</em>, <a href="http://antlr.org">http://antlr.org</a>), de même que le couple lex + yacc (ou la version GNU flex + bison) est la référence pour le langage C. Pour citer deux exemples, le parser HQL de Hibernate et celui de Groovy sont écrits avec ANTLR. On notera au passage que l&#8217;auteur d&#8217;ANTLR, en photo sur la page d&#8217;accueil du site, a conservé la métaphore animale en passant du monde des bovidés (<em>Bos grunniens</em> et <em>Bison bison</em>) à celui des cervidés (<em>Cervus elaphus</em>) !<sup>[<a id="rev-pnote-201-1" href="#pnote-201-1">1</a>]</sup></p>
<p>Après une première partie de présentation d&#8217;ANTLR, cet article vous proposera de mettre en œuvre l&#8217;exécution automatique et fiable d&#8217;ANTLR au sein d&#8217;un build Maven. Une troisième partie montrera comment on peut écrire et lancer, par le même biais, des tests unitaires sur une grammaire.</p>
<h3>A propos d&#8217;ANTLR</h3>
<p>Malgré des différences importantes dans l&#8217;implémentation des langages, ANTLR, comme lex + yacc, est un préprocesseur qui prend en entrée un fichier descriptif de votre grammaire (appelons-le <code>Demo.g</code>) et pond du code source : en l&#8217;occurrence deux classes, une pour le lexer (<code>DemoLexer</code>) et une pour le parser (<code>DemoParser</code>). Le code source est par défaut émis en Java, mais ANTLR est aussi capable de générer du C#, du C++, du Ruby, <del>du Brainfuck</del>, &#8230; Dans cet article nous ciblons une plate-forme Java.</p>
<p>Le <em>lexer</em> (le terme exact est <em>analyseur lexical</em>) découpe le flux de caractères en entrée en <em>tokens</em>, ou éléments syntaxiques de base : une constante numérique, un caractère de ponctuation, un identifiant de variable, &#8230;</p>
<p>Quant au <em>parser</em>, il consomme ce flux de tokens pour reconnaître les constructions syntaxiques du langage (ex. une déclaration de méthode) et agir en conséquence. Ses actions peuvent être l&#8217;interprétation immédiate du texte fourni en entrée (ex. exécution de commandes), ou bien la construction d&#8217;un arbre syntaxique abstrait (AST) en mémoire<sup>[<a id="rev-pnote-201-2" href="#pnote-201-2">2</a>]</sup>.</p>
<p>Voici un schéma récapitulatif qui illustrerait un fragment de grammaire pour le langage Java :</p>
<p><img src="/wp-content/uploads/images/antlr/antlr_principe.png" alt="" /></p>
<h3>Une première exécution</h3>
<p>Téléchargez la dernière version d&#8217;ANTLR sur le site : <a href="http://antlr.org/download/antlr-3.1.1.jar">http://antlr.org/download/antlr-3.1.1.jar</a>, et placez le JAR dans un répertoire de votre disque.</p>
<p>Ensuite copiez-coller le code suivant dans un fichier texte que vous nommerez <code>Demo.g</code>, dans le même répertoire :</p>

<div class="wp_codebox"><table><tr id="p16213"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="code" id="p162code13"><pre class="groovy" style="font-family:monospace;">grammar Demo<span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Les mots-clefs de notre langage</span>
tokens <span style="color: #66cc66;">&#123;</span>
    PRINT <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'print'</span><span style="color: #66cc66;">;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Code Java ajouté en tête du fichier source du lexer</span>
@lexer::header
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">package</span> <span style="color: #a1a100;">com.octo.testantlr</span><span style="color: #66cc66;">;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">// Code Java ajouté en tête du fichier source du parser</span>
@parser::header
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">package</span> <span style="color: #a1a100;">com.octo.testantlr</span><span style="color: #66cc66;">;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Règles du parser (les noms commencent par une minuscule)</span>
program
    :    statement<span style="color: #66cc66;">*</span>
    <span style="color: #66cc66;">;</span>
&nbsp;
statement
    :     PRINT INTEGER <span style="color: #ff0000;">';'</span>          <span style="color: #808080; font-style: italic;">// Ex. : print 123;</span>
    <span style="color: #66cc66;">|</span>     PRINT VARIABLE <span style="color: #ff0000;">';'</span>         <span style="color: #808080; font-style: italic;">// Ex. : print toto;</span>
    <span style="color: #66cc66;">|</span>     VARIABLE <span style="color: #ff0000;">'='</span> INTEGER <span style="color: #ff0000;">';'</span>   <span style="color: #808080; font-style: italic;">// Ex. : toto = 123;</span>
    <span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Règles du lexer (les noms commencent par une majuscule ; la convention est de tout mettre en majuscules)</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Nom de variable</span>
VARIABLE
    :     LETTER <span style="color: #66cc66;">&#40;</span>LETTER <span style="color: #66cc66;">|</span> DIGIT<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>
    <span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Constante entière</span>
INTEGER
    :     DIGIT<span style="color: #66cc66;">+</span>
    <span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Commentaire -&gt; ignoré</span>
COMMENT
    :     <span style="color: #ff0000;">'//'</span> <span style="color: #66cc66;">&#40;</span>~ NL<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span> NL<span style="color: #66cc66;">?</span> <span style="color: #66cc66;">&#123;</span> skip<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span> <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Sauts de ligne (ignorés via la règle WS)</span>
NL
    :     <span style="color: #ff0000;">'n'</span> <span style="color: #66cc66;">|</span> <span style="color: #ff0000;">'r'</span>
    <span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Espaces -&gt; ignorés</span>
WS
    :     <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">' '</span> <span style="color: #66cc66;">|</span> <span style="color: #ff0000;">'t'</span> <span style="color: #66cc66;">|</span> NL<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> skip<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span> <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">;</span>
&nbsp;
fragment LETTER
    :     <span style="color: #ff0000;">'A'</span>..<span style="color: #ff0000;">'Z'</span> <span style="color: #66cc66;">|</span> <span style="color: #ff0000;">'a'</span>..<span style="color: #ff0000;">'z'</span> <span style="color: #66cc66;">|</span> <span style="color: #ff0000;">'_'</span>
    <span style="color: #66cc66;">;</span>
&nbsp;
fragment DIGIT
    :	<span style="color: #ff0000;">'0'</span>..<span style="color: #ff0000;">'9'</span>
    <span style="color: #66cc66;">;</span></pre></td></tr></table></div>

<p>Puis, pour générer le lexer et le parser en ligne de commande, depuis le répertoire où est stocké <code>Demo.g</code> :</p>

<div class="wp_codebox"><table><tr id="p16214"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p162code14"><pre class="dos" style="font-family:monospace;">java -cp antlr-3.1.1.jar org.antlr.Tool -o . Demo.g</pre></td></tr></table></div>

<p>Vous aurez alors, dans le répertoire courant (du fait de l&#8217;option &laquo;&nbsp;<code>-o .</code>&laquo;&nbsp;), deux fichiers <code>DemoLexer.java</code> et <code>DemoParser.java</code> &#8212; qui ne sont pas destinés à être lisibles par un être humain ! Il y a même un troisième fichier, <code>Demo.tokens</code>, qui contient la liste et les valeurs de tous les tokens, explicites et implicites, définis par la grammaire. Ce fichier est utilisé lorsqu&#8217;on veut partager des tokens entre plusieurs grammaires ; nous n&#8217;en avons pas besoin ici.</p>
<p>Une fois un lexer et un parser instanciés dans un projet (opérations non détaillées ici), la méthode <code>DemoParser.program()</code>, dont le nom est celui de la règle &laquo;&nbsp;point d&#8217;entrée&nbsp;&raquo; du parser, reconnaîtra notre mini-langage (aucune action n&#8217;étant associée aux règles du parser, en l&#8217;état celui-ci ne fait que valider la syntaxe du langage sans effets de bord).</p>
<h3>Intégration au build Maven d&#8217;un vrai projet</h3>
<p>Ce sera l&#8217;objet de la partie suivante. Pour l&#8217;instant, il faudra vous contenter de copier les fichiers générés dans le répertoire de votre projet, en faisant attention au nom du package (cf. sections <code> @parser::header</code> et <code> @lexer::header</code> de <code>Demo.g</code>), et de les regénérer à la main à chaque fois que vous modifierez la grammaire.</p>
<p>N&#8217;hésitez pas aussi à jeter un œil à l&#8217;IDE dédié à ANTLR, ANTLRWorks : <a href="http://antlr.org/works/index.html">http://antlr.org/works/index.html</a>. Il vous permet de tester les règles individuelles en mode interactif, d&#8217;obtenir une représentation graphique de l&#8217;automate du parser, etc. Un plugin Eclipse est aussi disponible ici : <a href="http://antlrv3ide.sourceforge.net/">http://antlrv3ide.sourceforge.net/</a>, mais je ne l&#8217;ai pas encore essayé !</p>
<div class="footnotes">
<h3>Notes</h3>
<p>[<a id="pnote-201-1" href="#rev-pnote-201-1">1</a>] <em>antler</em> = bois de cerf, en anglais</p>
<p>[<a id="pnote-201-2" href="#rev-pnote-201-2">2</a>] Pour plus de détails sur les AST, une fonctionnalité très puissante et qui devient vite indispensable, je vous renvoie à la documentation d’ANTLR. Les AST permettent, au lieu d’interpréter au fil de l’eau le flux d’entrée, d’en construire une représentation complète en mémoire pour pouvoir ensuite la parcourir dans n’importe quel sens, la retravailler, l’optimiser, &#8230; Comme cas d&#8217;usage, penser par exemple à un compilateur ou au moteur d’optimisation de requêtes d&#8217;un SGBD.</div>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=162" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-3-3-testez-vos-grammaires/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 3/3 &#8211; Testez vos grammaires'>Construire ses parsers ANTLR avec Maven &#8211; Partie 3/3 &#8211; Testez vos grammaires</a></li>
<li><a href='http://blog.octo.com/maven-deploy-avec-2-profiles/' rel='bookmark' title='Maven deploy avec 2 profiles'>Maven deploy avec 2 profiles</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-1-3-antlr/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Les nouveautés du langage dans Java 7</title>
		<link>http://blog.octo.com/les-nouveautes-du-langage-dans-java-7/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=les-nouveautes-du-langage-dans-java-7</link>
		<comments>http://blog.octo.com/les-nouveautes-du-langage-dans-java-7/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 22:31:52 +0000</pubDate>
		<dc:creator>Marc Bojoly</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://new-blog.octo.com/2008/11/14/les-nouveautes-du-langage-dans-java-7/</guid>
		<description><![CDATA[<p>La nouvelle version de Java 7 est en cours de préparation. Malgré le retard et les incertitudes sur le contenu, nous considérons que Java 7 constitue une opportunité intéressante pour le langage. Après un premier article consacré aux nouvelles librairies proposées pour Java 7, ce second article introductif vous propose de découvrir les nouvelles fonctionnalités du langage et de la JVM. Là encore, en cas de doute sur le contenu de la version finale, nous préciserons les réserves concernant une librairie ou une syntaxe en indiquant si l'exemple de code proposé compilait avec la version de prévisualisation 1.7.0-ea-b37.</p>
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/socle-technique-des-applications-java-ee-dans-le-war-ou-dans-le-serveur/' rel='bookmark' title='Socle technique des applications Java EE : dans le WAR ou dans le serveur ?'>Socle technique des applications Java EE : dans le WAR ou dans le serveur ?</a></li>
<li><a href='http://blog.octo.com/les-nouvelles-librairies-dans-java-7/' rel='bookmark' title='Les nouvelles librairies dans Java 7'>Les nouvelles librairies dans Java 7</a></li>
<li><a href='http://blog.octo.com/thrift-protobuf-compacite/' rel='bookmark' title='Thrift et Protocol Buffers : compacité du message sérialisé dans le monde Java'>Thrift et Protocol Buffers : compacité du message sérialisé dans le monde Java</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fles-nouveautes-du-langage-dans-java-7%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Les%20nouveaut%C3%A9s%20du%20langage%20dans%20Java%207%22%20%7D);"></div>
<p>La nouvelle version de Java 7 est en cours de préparation. Malgré le retard et les incertitudes sur le contenu, nous considérons que Java 7 constitue une opportunité intéressante pour le langage. Après un premier article consacré aux nouvelles librairies proposées pour Java 7, ce second article introductif vous propose de découvrir les nouvelles fonctionnalités du langage et de la JVM. Là encore, en cas de doute sur le contenu de la version finale, nous préciserons les réserves concernant une librairie ou une syntaxe en indiquant si l&#8217;exemple de code proposé compilait avec la version de prévisualisation 1.7.0-ea-b37.</p>
<p><span id="more-159"></span></p>
<h3>Support des propriétés JavaBean</h3>
<p>En Java, il est nécessaire d&#8217;implémenter des accesseurs (<em>getter</em> et <em>setter</em>) pour lire et modifier les attributs d&#8217;un objet. En effet, rendre public un attribut est une (très) mauvaise pratique puisque lorsque le besoin d&#8217;ajouter un comportement lors de la lecture ou de la modification de cet attribut apparaitra, tous les accès à cet attribut devront être remplacés par des appels aux accesseurs (qui implémentent ce nouveau comportement). La notion de propriété est proche de celle d&#8217;un attribut à ceci près qu&#8217;un getter et un setter peuvent lui être associés sans que l&#8217;appelant ne soit impacté.</p>
<p>Ainsi une propriété peut-être déclarée <code>public</code> :</p>

<div class="wp_codebox"><table><tr id="p15915"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p159code15"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Product <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> property <span style="color: #003399;">String</span> name<span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> ... 
<span style="color: #006633;">product</span><span style="color: #339933;">-&gt;</span>name <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Java&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Dans cet exemple, la propriété <code>name</code> se comporte comme un attribut public (notez cependant la nouvelle syntaxe d&#8217;accès à la propriété, <code>-></code>, qui n&#8217;est pas sûr d&#8217;être celle retenue dans la version finale). Lorsque le besoin d&#8217;implémenter un getter et/ou un setter se fait sentir :</p>

<div class="wp_codebox"><table><tr id="p15916"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p159code16"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Product <span style="color: #009900;">&#123;</span>  
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> _name<span style="color: #339933;">;</span>  
  <span style="color: #000000; font-weight: bold;">public</span> property <span style="color: #003399;">String</span> name   
  get <span style="color: #009900;">&#123;</span>    <span style="color: #666666; font-style: italic;">// do something    ...;    return _name;   }   </span>
  set<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> newName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>     <span style="color: #666666; font-style: italic;">// do something     ...;     _name = newName;   } </span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Après cette évolution, le code appelant n&#8217;a pas besoin d&#8217;être modifié, les nouveaux getter et setter seront appelés. Les propriétés permettent donc de s&#8217;affranchir d&#8217;écrire des getter et setter qui ne font rien de plus que lire et modifier un attribut (même si nos IDE le font pour nous aujourd&#8217;hui) mais aussi d&#8217;alléger le code des classes de type JavaBean.</p>
<p>Le compilateur de la prévisualisation ne supporte pas encore cette fonctionnalité.</p>
<h5>Support des opérateurs numérique pour le type BigDecimal</h5>
<p>Lorsqu&#8217;il s&#8217;agit d&#8217;effectuer des calculs avec la classe BigDecimal de Java, cela devient vite illisible :</p>

<div class="wp_codebox"><table><tr id="p15917"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p159code17"><pre class="java" style="font-family:monospace;">bd1.<span style="color: #006633;">multiply</span><span style="color: #009900;">&#40;</span>bd2<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">divide</span><span style="color: #009900;">&#40;</span>bd3.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>bd4<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>En ajoutant le support des opérateurs numériques à cette classe, on obtiendrait alors un code plus clair :</p>

<div class="wp_codebox"><table><tr id="p15918"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p159code18"><pre class="java" style="font-family:monospace;">bd1 <span style="color: #339933;">*</span> bd2 <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span>bd3 <span style="color: #339933;">+</span> bd4<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Le compilateur de la prévisualisation ne supporte pas encore cette fonctionnalité.</p>
<h5>Comparaison pour les énumérations</h5>
<p>Cette proposition permet de donner un ordre aux valeurs d&#8217;une énumération et ainsi de pouvoir comparer leur ordre.</p>

<div class="wp_codebox"><table><tr id="p15919"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p159code19"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">enum</span> LevelEnum <span style="color: #009900;">&#123;</span> level1, level2, level3, level4, level5 <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>currentLevel <span style="color: #339933;">&gt;</span> LevelEnum.<span style="color: #006633;">level3</span><span style="color: #009900;">&#41;</span> ...</pre></td></tr></table></div>

<p>Le compilateur de la prévisualisation ne supporte pas encore cette fonctionnalité.</p>
<h5>Invocation chainée</h5>
<p>L&#8217;invocation chainée de méthodes d&#8217;un même objet consiste à renvoyer l&#8217;objet en question pour ses méthodes qui ont déclarées <code>void</code> comme type de retour. De cette façon, il est alors possible d&#8217;appeler une seconde méthode de cet objet après l&#8217;appel d&#8217;une méthode qui ne renvoie rien.</p>

<div class="wp_codebox"><table><tr id="p15920"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p159code20"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JFrame</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  .<span style="color: #006633;">setBounds</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">100</span>, <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span>  .<span style="color: #006633;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;MainFrame&quot;</span><span style="color: #009900;">&#41;</span>  .<span style="color: #006633;">setLocation</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">200</span>, <span style="color: #cc66cc;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>L&#8217;intérêt est d&#8217;alléger le code répétitif et de pouvoir pousser un peu plus la création d&#8217;API dites fluides (ou &laquo;&nbsp;fluent API&nbsp;&raquo;). Le compilateur de la prévisualisation ne supporte pas encore cette fonctionnalité.</p>
<h5>Méthodes d&#8217;extension</h5>
<p>Les méthodes d&#8217;extension sont des méthodes statiques qui peuvent être utilisées comme s&#8217;il s&#8217;agissait de méthodes de la classe de leur premier argument.</p>

<div class="wp_codebox"><table><tr id="p15921"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p159code21"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">Class</span> <span style="color: #003399;">Collections</span> <span style="color: #009900;">&#123;</span>   
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> T max<span style="color: #009900;">&#40;</span><span style="color: #003399;">Collection</span> collection<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span> 
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<pre>
import static java.util.Collections.max;
Collection list = new ArrayList();
list.max();</pre>
<p>La méthode <code>max</code> est appliquée sur l&#8217;objet <code>list</code> comme s&#8217;il s&#8217;agissait d&#8217;une méthode de la classe <code>Collection</code>. Avec les méthodes d&#8217;extension, ceci est possible car <code>list</code> est du type du premier argument de la méthode statique <code>max</code>. La dernière ligne revient à écrire :</p>

<div class="wp_codebox"><table><tr id="p15922"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p159code22"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Collections</span>.<span style="color: #006633;">max</span><span style="color: #009900;">&#40;</span>list<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Le compilateur de la prévisualisation ne supporte pas encore cette fonctionnalité.</p>
<h5>Clause catch améliorée</h5>
<p>La clause <code>catch</code> améliorée permet de traiter plusieurs exceptions dans le même bloc en utilisant l&#8217;opérateur &#8216;<code>|</code>&#8216; :</p>

<div class="wp_codebox"><table><tr id="p15923"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p159code23"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>  ... <span style="color: #009900;">&#125;</span> 
<span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> <span style="color: #339933;">|</span> <span style="color: #003399;">RuntimeException</span> exception<span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#123;</span>  ... <span style="color: #666666; font-style: italic;">// le même traitement est appliqué pour les 2 types d'exceptions }</span></pre></td></tr></table></div>

<p>De plus, la possibilité de renvoyer une exception même si la classe déclarée dans la clause <code>catch</code> est parente de la classe réelle de l&#8217;exception sans avoir à l&#8217;encapsuler dans une nouvelle exception d&#8217;un type déclaré par la méthode (comme c&#8217;est nécessaire de faire actuellement).</p>

<div class="wp_codebox"><table><tr id="p15924"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p159code24"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> throwAnException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span>, <span style="color: #003399;">RuntimeException</span> <span style="color: #009900;">&#123;</span>  
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>    ...  <span style="color: #009900;">&#125;</span> 
<span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> exception<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>    
  <span style="color: #666666; font-style: italic;">// Code actuel:    </span>
  <span style="color: #666666; font-style: italic;">// throw new IOException(exception);    </span>
  <span style="color: #666666; font-style: italic;">// ou    </span>
  <span style="color: #666666; font-style: italic;">// throw new RuntimeException(exception);   </span>
  <span style="color: #666666; font-style: italic;">// Code avec la clause catch améliorée    </span>
  <span style="color: #000000; font-weight: bold;">throw</span> exception<span style="color: #339933;">;</span>  
 <span style="color: #009900;">&#125;</span> 
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Le compilateur de la prévisualisation ne supporte pas encore cette fonctionnalité.</p>
<h5>Instruction invokedynamic et langages dynamiques</h5>
<p><code>invokedynamic</code> est une nouvelle instruction du bytecode de la JVM qui permet de simplifier l&#8217;implémentation de langages dynamiques (tels que JRuby, JPython ou encore Groovy). En effet, pour ces langages, les types des objets sur lesquels sont invoquées les méthodes ne sont pas connus à la compilation mais à l&#8217;exécution. De plus, il n&#8217;est pas possible de savoir si une méthode existe ou non pour une classe puisqu&#8217;elles peuvent être ajoutées ou supprimées à l&#8217;exécution. Les instructions actuelles (<code>invokeinterface</code> et <code>invokevirtual</code>) du bytecode Java nécessitent un type bien définit pour exécuter une méthode. Les implémentations actuelles de ces langages dynamiques sur la JVM doivent donc générer ces types à l&#8217;exécution. invokedynamic supprime cette limitation et améliore alors les performances de ces langages.</p>
<h5>Support natif XML</h5>
<p>Le support d&#8217;une classe XML avec une syntaxe native au langage Java est une des propositions d&#8217;inclusion pour la version 7. En effet, au même titre que la classe <code>String</code> qui possède une syntaxe particulière (les guillemets) pour construire une nouvelle chaine de caractère, une syntaxe particulière pour construire des documents XML permettrait de réduire grandement la verbosité du code Java nécessaire pour créer de telles structures avec les API existantes. Parmi les syntaxes proposées, on trouve :</p>

<div class="wp_codebox"><table><tr id="p15925"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p159code25"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> XML createProduct<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name, <span style="color: #003399;">String</span> version<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  
  XML product <span style="color: #339933;">=</span> <span style="color: #339933;">&lt;</span>product<span style="color: #339933;">&gt;</span>
                          <span style="color: #339933;">&lt;</span>name<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#123;</span>name<span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;/</span>name<span style="color: #339933;">&gt;</span>
                          <span style="color: #339933;">&lt;</span>version<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#123;</span>version<span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;/</span>version<span style="color: #339933;">&gt;</span>
                       <span style="color: #339933;">&lt;/</span>product<span style="color: #339933;">&gt;;</span>  
         <span style="color: #000000; font-weight: bold;">return</span> product<span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Cette syntaxe a l&#8217;avantage d&#8217;être du XML mais utilise les éléments syntaxiques des génériques. Une autre syntaxe pourrait être : public XML createProduct(String name, String version) {</p>

<div class="wp_codebox"><table><tr id="p15926"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p159code26"><pre class="java" style="font-family:monospace;">XML product <span style="color: #339933;">=</span> #product <span style="color: #009900;">&#123;</span> 
                        #name <span style="color: #009900;">&#123;</span> name <span style="color: #009900;">&#125;</span>,               
                        #version <span style="color: #009900;">&#123;</span> version <span style="color: #009900;">&#125;</span>       
       <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
    <span style="color: #000000; font-weight: bold;">return</span> product<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Les expressions entre accolades sont des expressions Java. À cette proposition s&#8217;ajoute la notion de <code>DataCoder</code> qui permettrait d&#8217;encoder et décoder un objet Java en chaine de caractères (pour être placé comme contenu d&#8217;une balise XML par exemple) et inversement. Pour ce qui est du streaming XML, les objets <code>XMLSource</code> pour lire (<code>hasNext()</code>, <code>match(String xpath)</code> et <code>match()</code>) et <code>XMLSink</code> pour écrire permettraient de simplifier la lecture et l&#8217;écriture au fil de l&#8217;eau de flux XML.</p>
<p>Le compilateur de la prévisualisation ne supporte pas encore cette fonctionnalité.</p>
<h5>Comparaisons de chaines de caractères dans la clause switch</h5>
<p>Une des propositions d&#8217;évolution pour Java 7 est la possibilité d&#8217;utiliser des chaines de caractères dans les clauses <code>case</code> d&#8217;un <code>switch</code> :</p>

<div class="wp_codebox"><table><tr id="p15927"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p159code27"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>    
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #0000ff;">&quot;true&quot;</span><span style="color: #339933;">:</span>        
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>    
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #0000ff;">&quot;false&quot;</span><span style="color: #339933;">:</span>        
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Le compilateur de la prévisualisation ne supporte pas encore cette fonctionnalité.</p>
<h5>Tiered Compilation</h5>
<p>En plus du mode client et du mode serveur actuels, un nouveau mode de compilation JIT appelé Tiered Compilation permettra à la JVM de profiter à la fois d&#8217;un démarrage rapide proposé par le mode client et d&#8217;optimisations plus agressives qu&#8217;offre le mode serveur actuel. En fait, il améliorera le mode client actuel en supprimant certaines compilations inutiles car réalisées trop top dans le démarrage de la JVM. Par exemple, certaines méthodes sont compilées et inlinées car au démarrage il n&#8217;y a qu&#8217;une possibilité d&#8217;appel (une seule implémentation de la classe sous-jacente) alors que d&#8217;autres classes sont ensuite chargées et rendent obsolète cette optimisation car elles implémentent cette même méthode. En effet, le choix de la méthode à appeler dépendra alors de la classe réelle de l&#8217;objet sur lequel la méthode sera appelée. Après le démarrage, les optimisations sont plus agressives (que le mode client actuel) comme pour le mode serveur. Ce type de compilation permet ainsi de profiter du meilleur des deux modes.</p>
<h5>Garbage collector G1</h5>
<p>Pour la JVM de Sun, une nouvelle évolution du Garbage Collector sera introduite dans la version 7 (voir peut-être même dans une version précédente) portant de le doux nom de <em>G1</em> (ou Garbage First). Sans entrer dans trop de détails, le principe est de diviser l&#8217;espace mémoire en zones de taille fixe qui seront taggées avec leur génération (jeune ou ancienne, G1 reste donc un collecteur générationel au même titre que l&#8217;actuel <em>CMS</em> (Concurrent Mark-Sweep)). Après une phase de marquage globale des objets pour déterminer ceux qui sont encore en vie, le collecteur pourra vider (en copiant les objets d&#8217;une zone à une autre) les zones avec peu d&#8217;objets vivants afin de les regrouper. Ceci aura pour gain de faire gagner de l&#8217;espace dans la <em>heap</em> et supprimer la fragmentation dont souffrait <em>CMS</em>. En libérant plus d&#8217;espace mémoire, le passage d&#8217;un nettoyage complet (et coûteux en resources CPU) s&#8217;effectuera moins souvent.</p>
<h5>Types et génériques</h5>
<p>Un certain nombre d&#8217;évolutions concernent les types Java :</p>
<ul>
<li>l&#8217;inférence de types,</li>
<li>les annotations sur les types,</li>
<li>les types littéraux</li>
<li>la réification par des génériques</li>
</ul>
<p>Afin de décrire plus en profondeur chacune de ces évolutions et des notions qu&#8217;elles traitent, un article à part entière abordera ces sujets.</p>
<h5>Closures et blocs de gestion automatique des ressources</h5>
<p>Les closures, fonctionnalité qui revient sur le devant de la scène avec les langages dynamiques, sont proposées pour être incluses dans Java 7. Nous verrons dans un prochain article ce qu&#8217;elles sont et ce qu&#8217;elles peuvent apporter au langage Java.</p>
<p>Au cours de ces deux articles nous avons largement détaillé les nouveautés de Java 7. Les points que nous n&#8217;avons pas abordés tels la modularité, la gestion de la concurrence et du parallélisme, les évolutions des génériques et le closures seront étudiés dans de futur articles.</p>
<p>Il reste vrai que de nombreuses incertitudes entourent encore cette version de java tant sur sa date de sortie que sur son contenu. Mais au final, nous trouvons que les fonctionnalités pressenties apportent de la valeur à cette plate-forme. Pour notre part, nous retiendrons plus particulièrement :</p>
<ul>
<li>La prise en compte de la modularité et du packaging</li>
<li>Des librairies qui facilitent le code de tous les jours avec API Date &#038; Time,  Unit &#038; Quantites ou JMX 2.0. Elles sont largement basées sur l&#8217;expérience de framework réel, ce qui est un gage de qualité et d&#8217;intérêt des concepts importés.</li>
<li>Des outils pour faciliter l&#8217;utilisation de swing comme Beans Binding et Beans Validation</li>
<li>Des améliorations pour rendre le langage plus expressif comme la nouvelle syntaxe pour les propriétés, les méthodes d&#8217;extension, ou le support natif du XML. Cela contribue à rendre Java plus léger et moins verbeux pour rester compétitif par rapport à des langages plus jeunes qui ont simplifié leur syntaxe comme JRuby ou C#.</li>
<li>Des améliorations techniques par exemple au niveau du garbadge collector ou de l&#8217;instruction invokedynamic</li>
</ul>
<p>Toutes ces modifications même très techniques restent importantes car elles constituent la base de l&#8217;innovation pour tous les développements du monde java.</p>
<p>Par David Rousselie et Marc Bojoly</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=159" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/socle-technique-des-applications-java-ee-dans-le-war-ou-dans-le-serveur/' rel='bookmark' title='Socle technique des applications Java EE : dans le WAR ou dans le serveur ?'>Socle technique des applications Java EE : dans le WAR ou dans le serveur ?</a></li>
<li><a href='http://blog.octo.com/les-nouvelles-librairies-dans-java-7/' rel='bookmark' title='Les nouvelles librairies dans Java 7'>Les nouvelles librairies dans Java 7</a></li>
<li><a href='http://blog.octo.com/thrift-protobuf-compacite/' rel='bookmark' title='Thrift et Protocol Buffers : compacité du message sérialisé dans le monde Java'>Thrift et Protocol Buffers : compacité du message sérialisé dans le monde Java</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/les-nouveautes-du-langage-dans-java-7/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

