<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://blog.aperigeek.com/roller-ui/styles/rss.xsl" media="screen"?><rss version="2.0" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
  <title>viv&apos;s blog</title>
  <link>http://blog.aperigeek.com/viv/</link>
      <atom:link rel="self" type="application/rss+xml" href="http://blog.aperigeek.com/viv/feed/entries/rss" />
    <description></description>
  <language>en-us</language>
  <copyright>Copyright 2010</copyright>
  <lastBuildDate>Sat, 20 Nov 2010 04:26:19 +0100</lastBuildDate>
  <generator>Apache Roller (incubating) 4.0 (20071120033321:dave)</generator>
        <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/charger_partiellement_une_entit%C3%A9_en</guid>
    <title>Charger partiellement une entit&#233; avec JPA</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/charger_partiellement_une_entit%C3%A9_en</link>
        <pubDate>Fri, 21 Aug 2009 17:24:13 +0100</pubDate>
    <category>Java</category>
    <category>javaee</category>
    <category>jpaql</category>
    <category>ejb</category>
    <category>jpa</category>
    <category>ejbql</category>
    <category>java</category>
            <description>Il est int&#233;ressant, dans nombre de cas, de ne charger que partiellement une entit&#233; en JPA. Prennons l&apos;exemple de &lt;a href=&quot;http://jtentative.kenai.com/&quot;&gt;JTentative&lt;/a&gt;, un agr&#233;gateur de flux RSS. Il est souhaitable de charger la liste des entr&#233;es appartenant &#224; un flux, mais sans forc&#233;ment charger l&apos;int&#233;gralit&#233; de chaque entit&#233; (contenu et description sont des champs lourds et souvent inutilis&#233;s).&lt;br /&gt;
&lt;br /&gt;

Plusieurs solutions existent pour charger partiellement une entit&#233;, de ne s&#233;lectionner que certains champs &#224; charger depuis la base de donn&#233;es.&lt;br /&gt;
&lt;br /&gt;

&lt;h2&gt;Premi&#232;re solution : &lt;code&gt;FetchType.LAZY&lt;/code&gt;&lt;/h2&gt;

La premi&#232;re solution consiste &#224; d&#233;finir certains champs de notre entit&#233; avec un attribut &lt;code&gt;fetch&lt;/code&gt; &#224; &lt;code&gt;LAZY&lt;/code&gt;. Cela permet de sp&#233;cifier que ces champs ne sont pas charg&#233;s lors du chargement de l&apos;entit&#233;, mais uniquement lors du premier acc&#232;s &#224; ce champ.&lt;br /&gt;
&lt;br /&gt;

L&apos;annotation &lt;code&gt;@Basic&lt;/code&gt; nous permet de sp&#233;cifier ce lazy-loading.&lt;br /&gt;
&lt;br /&gt;

Voici un exemple de code mettant en avant cette annotation. Le code de l&apos;entit&#233; &#224; &#233;t&#233; r&#233;duit pour plus de lisibilit&#233; :&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
@Entity
public class Entry implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String title;

    private String author;

    @Lob
    @Basic(fetch=FetchType.LAZY)
    private String description;

    @Lob
    @Basic(fetch=FetchType.LAZY)
    private String content;

    /* Getters, Setters... */
}
&lt;/pre&gt;
&lt;br /&gt;

Cette solution pr&#233;sente cependant un inconv&#233;nient majeur : si elle fonctionne correctement lorsque l&apos;on charge une entit&#233; via l&apos;&lt;code&gt;EntityManager&lt;/code&gt;, elle est compl&#232;tement inefficace lors de la s&#233;lection de donn&#233;es via une requ&#234;te JPA-QL.

&lt;h2&gt;Seconde solution : S&#233;lectionner uniquement les champs dont on a besoin&lt;/h2&gt;

Une seconde solution peut-&#234;tre mise en place dans une requ&#234;te JPA-QL. Cependant, elle ne fonctionnera paslors de la s&#233;lection lors d&apos;un appel &#224; la m&#233;thode &lt;code&gt;find()&lt;/code&gt; de l&apos;&lt;code&gt;EntityManager&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;

Cette solution est bas&#233;e sur un op&#233;rateur m&#233;connu du langage JPA-QL, &lt;code&gt;new&lt;/code&gt;. L&apos;op&#233;rateur &lt;code&gt;new&lt;/code&gt; permet d&apos;intancier des objets au sein d&apos;une requ&#234;te JPA-QL. Il s&apos;agit donc d&apos;instancier un objet, en fournissant au constructeur uniquement les champs que nous souhaitons r&#233;cup&#233;rer.&lt;br /&gt;
&lt;br /&gt;

Voici un autre exemple, le code de l&apos;entit&#233; a l&#224; aussi &#233;t&#233; r&#233;duit :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
@Entity
@NamedQuery(name=&quot;Entry.findAll&quot;, query=&quot;SELECT new Entry(e.id, e.title, e.author) FROM Entry AS e&quot;)
public class Entry implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String title;

    private String author;

    @Lob
    @Basic(fetch=FetchType.LAZY)
    private String description;

    @Lob
    @Basic(fetch=FetchType.LAZY)
    private String content;

    public Entry() {
    }

    public Entry(Long id, String title, String author) {
        this.id = id;
        this.title = title;
        this.author = author;
    }

    /* Getters, Setters... */
}
&lt;/pre&gt;
&lt;br /&gt;

Quelques pr&#233;cisions cependant :
&lt;ul&gt;
    &lt;li&gt;Il faut pr&#233;ciser la classe &lt;em&gt;compl&#232;te&lt;/em&gt; de l&apos;entit&#233; dans la requ&#234;te, incluant le nom du package&lt;/li&gt;
    &lt;li&gt;Le constructeur que l&apos;on souhaite invoquer doit exister&lt;/li&gt;
    &lt;li&gt;Prennez garde avec vos entit&#233;s charg&#233;es de cette mani&#232;re : certaines propri&#233;t&#233;s sont absentes, une mise &#224; jour dans la base de donn&#233;es avec une entit&#233; charg&#233;e partiellement risque d&apos;effacer certaines valeurs&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;

Le code complet de l&apos;entit&#233; utilis&#233;e pour cette exemple est disponible sur le &lt;a href=&quot;http://kenai.com/projects/jtentative/sources/main/content/trunk/jtentative/jtentative-ejb/src/main/java/com/aperigeek/jtentative/entity/Entry.java?rev=23&quot;&gt;d&#233;p&#244;t SVN de JTentative&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/aperiquiz_4_integer_equals_integer</guid>
    <title>Aperiquiz #4 : Integer equals Integer</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/aperiquiz_4_integer_equals_integer</link>
        <pubDate>Tue, 21 Jul 2009 21:04:06 +0100</pubDate>
    <category>Java</category>
    <category>integer</category>
    <category>equals</category>
    <category>java</category>
    <category>aperiquiz</category>
            <description>Soit le code suivant :&lt;br /&gt;
&lt;textarea name=&quot;code&quot; class=&quot;java&quot;&gt;
public class Main {

    public static void main(String[] args) {
        Integer a = new Integer(1024);
        Integer b = new Integer(1024);
        boolean c = a &lt; b || a == b || a &gt; b;
        System.out.println(c);
    }

}
&lt;/textarea&gt;&lt;br /&gt;
&lt;br /&gt;

Quel est la valeur de &lt;code&gt;c&lt;/code&gt; ?
&lt;ul&gt;
    &lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;Erreur de compilation&lt;/li&gt;
    &lt;li&gt;Une exception est lev&#233;e lors de l&apos;ex&#233;cution&lt;/li&gt;
&lt;/ul&gt;

R&#233;ponse : (&lt;a href=&quot;#aperiquiz-answer4&quot; name=&quot;aperiquiz-answer4&quot; onclick=&quot;document.getElementById(&apos;aperiquiz-answer4&apos;).style.display=&apos;block&apos;;&quot;&gt;cliquez pour afficher&lt;/a&gt;)
&lt;blockquote id=&quot;aperiquiz-answer4&quot; style=&quot;border: 1px solid black; display: none;&quot;&gt;
En utilisant Java 5 : &lt;code&gt;false&lt;/code&gt;.&lt;br /&gt;
En utilisant Java 1.4 : Erreur de compilation.&lt;br /&gt;
&lt;br /&gt;

&lt;h3&gt;Explication :&lt;/h3&gt;
Le cas de Java 1.4 est certainement le plus simple &#224; expliquer : nous avons deux objets de type Integer, et il est impossible de comparer des objets avec les op&#233;rateurs &lt;code&gt;&amp;lt;&lt;/code&gt; et &lt;code&gt;&amp;gt;&lt;/code&gt;. En Java 1.4, l&apos;autoboxing n&apos;existe pas.&lt;br /&gt;
&lt;br /&gt;

Concernant Java 5, l&apos;explication est plus profonde. Nos objets de type Integer sont automatiquement transform&#233;s en &lt;code&gt;int&lt;/code&gt; d&#232;s que n&#233;cessaire. C&apos;est le cas lors des comparaisons en utilisant les op&#233;rateurs &lt;code&gt;&amp;lt;&lt;/code&gt; et &lt;code&gt;&amp;gt;&lt;/code&gt;. Ces deux comparaisons renvoient donc &lt;code&gt;false&lt;/code&gt;. Cependant, lors de la comparaison avec l&apos;op&#233;rateur &lt;code&gt;==&lt;/code&gt;, nos objets ne sont pas convertis en &lt;code&gt;int&lt;/code&gt;, mais leur &lt;strong&gt;r&#233;f&#233;rences&lt;/strong&gt; sont compar&#233;es. &lt;code&gt;a&lt;/code&gt; et &lt;code&gt;b&lt;/code&gt; &#233;tant deux objets distincts, la comparaison avec &lt;code&gt;==&lt;/code&gt; renvoie &lt;code&gt;false&lt;/code&gt;. D&apos;o&#249; la valeur de &lt;code&gt;c&lt;/code&gt;.

&lt;/blockquote&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/types_primitifs_pi%C3%A8ges_courants</guid>
    <title>Types primitifs : pi&#232;ges courants</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/types_primitifs_pi%C3%A8ges_courants</link>
        <pubDate>Wed, 8 Jul 2009 20:21:48 +0100</pubDate>
    <category>Java</category>
    <category>piege</category>
    <category>type</category>
    <category>primitif</category>
    <category>java</category>
            <description>&lt;em&gt;It&apos;s a trap&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;

Je viens de tomber dans la soir&#233;e sur deux pi&#232;ges, non triviaux, mais facile &#224; &#233;viter pour peu de les conna&#238;tre...&lt;br /&gt;
&lt;br /&gt;

&lt;h2&gt;27/10 != 2.7&lt;/h2&gt;

Le premier bout de code ressemblait &#224; celui-ci :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public class Main {

    public static void main(String... args) {
        float price = 27/10;
        System.out.println(&quot;Price: &quot; + price);
    }

}
&lt;/pre&gt;
&lt;br /&gt;

Alors qu&apos;il est facile de penser que le code suivant va afficher &quot;Price: 2.70&quot; lors de l&apos;ex&#233;cution, la r&#233;alit&#233; est tout autre. Effectivement, le r&#233;sultat une fois ce code compil&#233; / ex&#233;cut&#233; est &quot;Price: 2.00&quot;.&lt;br /&gt;
&lt;br /&gt;

Le pi&#232;ge est le suivant :
&lt;ul&gt;
    &lt;li&gt;27 est, en Java, un entier&lt;/li&gt;
    &lt;li&gt;10 est, toujours en Java, un entier&lt;/li&gt;
    &lt;li&gt;L&apos;op&#233;ration 27/10 est la division de deux entiers. Pour la JVM, le r&#233;sultat est donc un entier. Donc 2.&lt;/li&gt;
    &lt;li&gt;La valeur 2 est assign&#233;e &#224; une variagle de type &lt;code&gt;float&lt;/code&gt;, la valeur 2 est transform&#233;e en 2.00&lt;/li&gt;
    &lt;li&gt;La valeur 2.00 est affich&#233;e dans la console.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

Il est facile de contourner ce probl&#232;me : transformer notre division d&apos;entier en division de nombre flottants :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public class Main {

    public static void main(String... args) {
        float price = 27.0/10.0;
        System.out.println(&quot;Price: &quot; + price);
    }

}
&lt;/pre&gt;
&lt;br /&gt;

Dans ce bloc de code, 27.0 et 10.0 sont des nombres &#224; virgule flottante. La division des deux donne une nombre &#224; virgule flottante, donc 2.7. Et le r&#233;sultat est donc celui attendu.

&lt;h2&gt;&lt;code&gt;return (int) 2.7 - 2.4;&lt;/code&gt;&lt;/h2&gt;

Le second bloc de code pi&#233;g&#233; consistait &#224; comparer deux entiers :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public class FloatComparator implements Comparator&amp;eacute;Float&gt; {

    public int compare(Float f1, Float f2) {
        return (int) (f2 - f1);
    }

}
&lt;/pre&gt;
&lt;br /&gt;

A premi&#232;re vue, ce code semble lui aussi enti&#232;rement correct. Le raisonnement suivi est celui-ci :
&lt;ul&gt;
    &lt;li&gt;Si je renvoie le r&#233;sultat de &lt;code&gt;f2 - f1&lt;/code&gt;, mon objet triera des nombres par ordre croissant&lt;/li&gt;
    &lt;li&gt;La m&#233;thode &lt;code&gt;compare&lt;/code&gt; doit renvoyer un entier&lt;/li&gt;
    &lt;li&gt;Je caste le r&#233;sultat de ma soustraction (un &lt;code&gt;float&lt;/code&gt;) en &lt;code&gt;int&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

Ce code fonctionne &lt;strong&gt;presque&lt;/strong&gt; tout le temps. Le probl&#232;me tiens dans le presque... Pour comprendre o&#249; est le probl&#232;me, rien ne vaut une simulation :
&lt;ul&gt;
    &lt;li&gt;Je souhaite comparer 2.7 et 2.8&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;2.8 - 2.7&lt;/code&gt; renvoie 0.1, un nombre positif, donc je respecte le contrat de la m&#233;thode &lt;code&gt;compare&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;0.1 est cast&#233; en &lt;code&gt;int&lt;/code&gt;, le r&#233;sultat est 0 alors que f2 est supp&#233;rieur a f1, je ne respecte plus le contrat de ma m&#233;thode&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

L&apos;erreur se trouve dans le cast. Il faut donc effectuer un changement dans notre m&#233;thode pour renvoyer un nombre positif dans tous les cas o&#249; &lt;code&gt;f2&lt;/code&gt; est supp&#233;rieur &#224; &lt;code&gt;f1&lt;/code&gt;. Par exemple :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public class FloatComparator implements Comparator&amp;eacute;Float&gt; {

    public int compare(Float f1, Float f2) {
        if (f2 &gt; f1) {
            return 1;
        }
        if (f1 &lt; f2) {
            return -1;
        }
        return 0;
    }

}
&lt;/pre&gt;

&lt;a href=&quot;http://java.sun.com/javase/6/docs/api/java/util/Comparator.html#compare(T,%20T)&quot;&gt;Le contrat&lt;/a&gt; de &lt;code&gt;Comparator&lt;/code&gt; est maintenant respect&#233;.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/aperiquiz_3_param%C3%A8tres_de_m%C3%A9thodes</guid>
    <title>Aperiquiz #3 : Param&#232;tres de m&#233;thodes</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/aperiquiz_3_param%C3%A8tres_de_m%C3%A9thodes</link>
        <pubDate>Tue, 17 Feb 2009 14:10:33 +0100</pubDate>
    <category>Aperiquiz</category>
    <category>parameter</category>
    <category>aperiquiz</category>
    <category>method</category>
    <category>java</category>
            <description>Quel est le nombre maximum de param&#232;tres pour une m&#233;thode ?&lt;br /&gt;
&lt;br /&gt;

&lt;ul&gt;
    &lt;li&gt;127&lt;/li&gt;
    &lt;li&gt;255&lt;/li&gt;
    &lt;li&gt;256&lt;/li&gt;
    &lt;li&gt;Il n&apos;y a pas de limites&lt;/li&gt;
    &lt;li&gt;Cela d&#233;pends du compilateur&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

R&#233;ponse : (&lt;a href=&quot;#aperiquiz-answer3&quot; name=&quot;aperiquiz-answer3&quot; onclick=&quot;document.getElementById(&apos;aperiquiz-answer3&apos;).style.display=&apos;block&apos;;&quot;&gt;cliquez pour afficher&lt;/a&gt;)
&lt;blockquote id=&quot;aperiquiz-answer3&quot; style=&quot;border: 1px solid black; display: none;&quot;&gt;
255&lt;br /&gt;
&lt;br /&gt;

&lt;h3&gt;Explication :&lt;/h3&gt;
Je n&apos;ai malheureusement trouv&#233; aucune r&#233;f&#233;rence &#224; cette limite dans la JLS, mais cette limite a &#233;t&#233; r&#233;v&#233;l&#233;e par un test avec le compilateur du JDK de Sun :
&lt;blockquote&gt;
&lt;pre&gt;
java version &quot;1.6.0_10&quot;
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;

J&apos;ai &#233;galement test&#233; avec gcj (Ubuntu 4.3.2-1ubuntu2) 4.3.2. La sortie est un petit peu plus explicite :
&lt;blockquote&gt;
&lt;pre&gt;
Main.java:518: error: Too many parameters, parameter param255 is exceeding the limit of 255 words eligible for method parameters
	String param255
	       ^^^^^^^^
1 problem (1 error)
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;

&lt;/blockquote&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/netbeans_tip_replier_un_bloc</guid>
    <title>NetBeans tip : replier un bloc de code</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/netbeans_tip_replier_un_bloc</link>
        <pubDate>Wed, 11 Feb 2009 17:05:33 +0100</pubDate>
    <category>NetBeans</category>
    <category>netbeans</category>
    <category>collapse</category>
    <category>tip</category>
    <category>editor-fold</category>
            <description>Question assez r&#233;curente lorsque des utilisateurs venant d&apos;environnement .NET d&#233;couvrent NetBeans :
&lt;blockquote&gt;
Est-ce qu&apos;il est possible de r&#233;duire un bloc de code dans une classe, comme le fait Visual Studio avec ses r&#233;gions ?
&lt;/blockquote&gt;
&lt;br /&gt;

&lt;center&gt;&lt;img src=&quot;http://blog.aperigeek.com/viv/resource/NetBeans/editor-fold.png&quot; style=&quot;border: 1px solid black;&quot; /&gt;&lt;/center&gt;&lt;br /&gt;

La r&#233;ponse est oui. cette fonctionnalit&#233; de NetBeans est bas&#233;e sur une balise XML plac&#233;e dans des commentaires, la balise &lt;code&gt;&amp;lt;editor-fold&amp;gt;&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;

Petit exemple :
&lt;textarea name=&quot;code&quot; class=&quot;java&quot;&gt;
public class Main {

    // &lt;editor-fold&gt;

    public static void main(String... args) {
        System.out.println(&quot;This is my program!&quot;);
    }

    // &lt;/editor-fold&gt;

}
&lt;/textarea&gt;
&lt;br /&gt;

Il est maintenant possible de replier ce bout de code sur lui m&#234;me, et il sera remplac&#233; par le texte &lt;code&gt;...&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;

Il est possible de configurer le texte qui sera affich&#233; lorsque le bloc de code sera repli&#233; (au lieu de &lt;code&gt;...&lt;/code&gt;). Pour cela, il suffit de sp&#233;cifier l&apos;attribut &lt;code&gt;desc&lt;/code&gt; dans la balise &lt;code&gt;&amp;lt;editor-fold&amp;gt;&lt;/code&gt; :
&lt;textarea name=&quot;code&quot; class=&quot;java&quot;&gt;
public class Main {

    // &lt;editor-fold desc=&quot;This is my main method&quot;&gt;

    public static void main(String... args) {
        System.out.println(&quot;This is my program!&quot;);
    }

    // &lt;/editor-fold&gt;

}
&lt;/textarea&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/aperiquiz_2_exception_g%C3%A9n%C3%A9rique</guid>
    <title>Aperiquiz #2 : Exception g&#233;n&#233;rique</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/aperiquiz_2_exception_g%C3%A9n%C3%A9rique</link>
        <pubDate>Mon, 2 Feb 2009 18:44:21 +0100</pubDate>
    <category>Aperiquiz</category>
    <category>generics</category>
    <category>exception</category>
    <category>aperiquiz</category>
            <description>Est-ce que le code suivant compile ?
&lt;textarea name=&quot;code&quot; class=&quot;java&quot; style=&quot;display: block;&quot;&gt;
public class MyException&lt;T&gt; extends Exception {

}
&lt;/textarea&gt;

R&#233;ponse : (&lt;a href=&quot;#aperiquiz-answer2&quot; name=&quot;aperiquiz-answer2&quot; onclick=&quot;document.getElementById(&apos;aperiquiz-answer2&apos;).style.display=&apos;block&apos;;&quot;&gt;cliquez pour afficher&lt;/a&gt;)
&lt;blockquote id=&quot;aperiquiz-answer2&quot; style=&quot;border: 1px solid black; display: none;&quot;&gt;
Non.&lt;br /&gt;
&lt;br /&gt;

&lt;h3&gt;Explication :&lt;/h3&gt;
La sp&#233;cification du langage pr&#233;cise explicitement : &quot;It is a compile-time error if a generic class is a direct or indirect subclass of Throwable.&quot; (Traduction : &quot;C&apos;est une erreur de compilation si une classe g&#233;n&#233;rique h&#233;rite directement ou indirectement de Throwable&quot;).&lt;br /&gt;
&lt;br /&gt;

En effet, le m&#233;canisme de &lt;code&gt;catch&lt;/code&gt; des exceptions en Java ne fonctionne qu&apos;avec des classes non g&#233;n&#233;riques. C&apos;est pour cela que les classes h&#233;ritant de &lt;code&gt;Throwable&lt;/code&gt; ne peuvent pas &#234;tre typ&#233;es avec des generics.
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;

Sources :
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://java.sun.com/docs/books/jls/third_edition/html/&quot;&gt;Java Language Specification&lt;/a&gt;, &lt;a href=&quot;http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.2&quot;&gt;&#167;8.1.2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/aperiquiz_1_finally_returns</guid>
    <title>Aperiquiz #1 : Finally returns</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/aperiquiz_1_finally_returns</link>
        <pubDate>Mon, 26 Jan 2009 14:06:29 +0100</pubDate>
    <category>Aperiquiz</category>
    <category>finally</category>
    <category>aperiquiz</category>
    <category>return</category>
            <description>Ceci est le premier post d&apos;une longue (j&apos;esp&#232;re) s&#233;rie de questions : l&apos;Aperiquiz.&lt;br /&gt;
&lt;br /&gt;

Le principe est simple : mettre en &#233;vidence un point pr&#233;cis de la sp&#233;cification Java en se basant sur un exemple de code inhabituel, une question tordue ou une particularit&#233; peu connue du langage.&lt;br /&gt;
&lt;br /&gt;

Pr&#234;ts ? C&apos;est parti !&lt;br /&gt;
&lt;br /&gt;

Consid&#233;rant le code suivant :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public class Main {

    public static String myMethod() {
        try {
            return &quot;try&quot;;
        } catch (Exception e) {
            return &quot;catch&quot;;
        } finally {
            return &quot;finally&quot;;
        }
    }

    public static void main(String[] args) {
        System.out.println(myMethod());
    }

}
&lt;/pre&gt;
Quel est le r&#233;sultat ?
&lt;ul&gt;
    &lt;li&gt;try&lt;/li&gt;
    &lt;li&gt;catch&lt;/li&gt;
    &lt;li&gt;finally&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

R&#233;ponse : (&lt;a href=&quot;#aperiquiz-answer1&quot; name=&quot;aperiquiz-answer1&quot; onclick=&quot;document.getElementById(&apos;aperiquiz-answer1&apos;).style.display=&apos;block&apos;;&quot;&gt;cliquez pour afficher&lt;/a&gt;)
&lt;blockquote id=&quot;aperiquiz-answer1&quot; style=&quot;border: 1px solid black; display: none;&quot;&gt;
&lt;code&gt;finally&lt;/code&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;

Sources :
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/479112/questions-to-indicate-competency-in-java&quot;&gt;Stack Overflow : Questions to indicate competency in Java&lt;/a&gt; (merci &#224; &lt;a href=&quot;http://twitter.com/nitramf/status/1148734995&quot;&gt;Martin&lt;/a&gt; pour le lien)&lt;/li&gt;
&lt;/ul&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/comment_se_d%C3%A9barasser_de_code</guid>
    <title>Comment se d&#233;barasser de com.sun.messaging.jmq.io.Packet cannot be cast to com.sun.messaging.jms.ra.DirectPacket ?</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/comment_se_d%C3%A9barasser_de_code</link>
        <pubDate>Fri, 16 Jan 2009 16:51:31 +0100</pubDate>
    <category>GlassFish</category>
    <category>jms</category>
    <category>glassfish</category>
            <description>Avec une installation par d&#233;faut de GlassFish, l&apos;utilisation de JMS au sein du serveur d&apos;application am&#232;ne souvent &#224; l&apos;erreur suivante :
&lt;br /&gt;&lt;code&gt;
DirectConsumer:Caught Exception delivering messagecom.sun.messaging.jmq.io.Packet cannot be cast to com.sun.messaging.jms.ra.DirectPacket
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;

Cette erreur n&apos;est pas fatale, l&apos;application est tout de m&#234;me d&#233;ploy&#233;e et les diff&#233;rents messages sont envoy&#233;s et re&#231;us. Cependant, cette erreur est g&#233;n&#233;r&#233;e &#224; chaque envoi de message, ce qui peut rapidement devenir encombrant dans les fichiers de log de GlassFish.&lt;br /&gt;
&lt;br /&gt;

Cette exception viens du mode de configuration utilis&#233; pour le lancement du service JMS dans GlassFish. Par d&#233;faut, le service est lanc&#233; en mode &lt;code&gt;EMBEDDED&lt;/code&gt;. Le service JMS tourne dans le m&#234;me processus que le serveur GlassFish, ce qui provoque ce genre d&apos;erreurs.&lt;br /&gt;
&lt;br /&gt;

Il est possible de changer ce mode de lancement du service JMS. Il suffit de lancer ce m&#234;me service en mode &lt;code&gt;LOCAL&lt;/code&gt; pour que le service tourne dans un processus s&#233;par&#233; du serveur GlassFish (mais toujours sur la m&#234;me machine). Le service JMS sera toujours contr&#244;l&#233; par GlassFish (lancement simultan&#233;s entre autre). Changer ce mode de fonctionnement du service JMS permet de r&#233;soudre ce probl&#232;me de cast de messages.&lt;br /&gt;
&lt;br /&gt;

Pour effectuer ce changement, il faut se rendre dans la console d&apos;administration de GlassFish :
&lt;ul&gt;
    &lt;li&gt;Acc&#233;der &#224; l&apos;adresse http://localhost:4848/&lt;/li&gt;
    &lt;li&gt;Se connecter avec les identifiants d&apos;administration de GlassFish (par d&#233;faut : admin /// adminadmin)&lt;/li&gt;
    &lt;li&gt;Cliquer sur &quot;Configuration&quot; -&gt; &quot;Java Message Service&quot; dans le menu de navigation de gauche&lt;/li&gt;
    &lt;li&gt;Modifier la propri&#233;t&#233; &quot;Type&quot; et lui donner la valeur de &quot;LOCAL&quot;&lt;/li&gt;
&lt;/ul&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/richfaces_filtrer_et_trier_une</guid>
    <title>RichFaces : Filtrer et trier une DataTable</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/richfaces_filtrer_et_trier_une</link>
        <pubDate>Sat, 29 Nov 2008 17:18:40 +0100</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>datatable</category>
    <category>jsf</category>
    <category>richfaces</category>
    <category>javaee</category>
            <description>Apr&#232;s avoir install&#233; &lt;a href=&quot;http://blog.aperigeek.com/viv/entry/richfaces&quot;&gt;RichFaces&lt;/a&gt;, je me suis lanc&#233; dans la r&#233;daction d&apos;une page d&apos;exemple, histoire d&apos;apprendre le fonctionnement de cette librairie qui semble bien int&#233;ressante.&lt;br /&gt;
&lt;br /&gt;

&lt;div align=&quot;center&quot;&gt;
    &lt;img src=&quot;http://blog.aperigeek.com/viv/resource/RichFaces/DataTable-FilterSort.png&quot; /&gt;
&lt;/div&gt;

Le but de cette page d&apos;exemple est de mettre en place une DataTable, avec fonctionnalit&#233;s de tri et de filtres. Toutes ces fonctionnalit&#233;s utiliseront de l&apos;Ajax, et il ne sera donc pas n&#233;c&#233;ssaire de recharger la page afin de voir les changements.&lt;br /&gt;
&lt;br /&gt;

Les contacts contenus dans notre DataTable devront &#234;tre tri&#233;s par nom de famille par d&#233;faut. Il sera &#233;galement possible pour l&apos;utilisateur de changer l&apos;ordre de tri (croissant, d&#233;croissant), ainsi que la propri&#233;t&#233; servant &#224; effectuer ce tri (pr&#233;nom, nom, ou adresse mail).&lt;br /&gt;
&lt;br /&gt;

Enfin, pour le filtre, nous aurons un champ de texte qui limitera la liste aux contacts :
&lt;ul&gt;
    &lt;li&gt;Dont le nom commence par la requ&#234;te&lt;/li&gt;
    &lt;li&gt;Dont le pr&#233;nom commence par la requ&#234;te&lt;/li&gt;
    &lt;li&gt;Dont l&apos;adresse mail contient la requ&#234;te&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Mise en place d&apos;une Rich DataTable&lt;/h2&gt;

Afin de commencer notre page d&apos;exemple, nous allons cr&#233;er une classe &lt;code&gt;Contact&lt;/code&gt;, qui aura pour vocation de contenir les donn&#233;es. Cette classe est un JavaBean, et poss&#232;de donc les caract&#233;risques suivantes :
&lt;ul&gt;
    &lt;li&gt;Les propri&#233;t&#233;s doivent &#234;tre priv&#233;es&lt;/li&gt;
    &lt;li&gt;Chaque propri&#233;t&#233; doit avoir des acc&#233;sseurs (getters et setters) publics&lt;/li&gt;
    &lt;li&gt;La classe doit avoir un constructeur par d&#233;faut&lt;/li&gt;
    &lt;li&gt;La classe doit impl&#233;menter &lt;code&gt;Serializable&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;

Nous allons donc cr&#233;er notre classe &lt;code&gt;Contact&lt;/code&gt; avec les propri&#233;t&#233;s &lt;code&gt;firstName&lt;/code&gt;, &lt;code&gt;lastName&lt;/code&gt; et &lt;code&gt;mailAddress&lt;/code&gt; :
&lt;textarea name=&quot;code&quot; class=&quot;java&quot;&gt;
public class Contact implements java.io.Serializable {

    private String firstName;

    private String lastName;

    private String mailAddress;

    public Contact() {
    }

    public Contact(String firstName, String lastName, String mailAddress) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.mailAddress = mailAddress;
    }

    // Getters and setters

}
&lt;/textarea&gt;&lt;br /&gt;
&lt;br /&gt;

La seconde &#233;tape sera de cr&#233;er un managed bean JSF, qui nous renvera une liste de contacts d&apos;exemple :
&lt;textarea name=&quot;code&quot; class=&quot;java&quot;&gt;
public class DataTableManager {

    // Returns sample data
    public DataModel getSampleModel() {
        List&lt;Contact&gt; contacts = new ArrayList&lt;Contact&gt;();
        contacts.add(new Contact(&quot;Toto&quot;, &quot;Tata&quot;, &quot;toto@tata.com&quot;));
        contacts.add(new Contact(&quot;John&quot;, &quot;Doe&quot;, &quot;john@doe.com&quot;));
        contacts.add(new Contact(&quot;Alan&quot;, &quot;Smithee&quot;, &quot;alan@smithee.com&quot;));
        contacts.add(new Contact(&quot;Vivien&quot;, &quot;Barousse&quot;, &quot;barousse.vivien@gmail.com&quot;));
        contacts.add(new Contact(&quot;Titi&quot;, &quot;Tata&quot;, &quot;titi@tata.com&quot;));
        contacts.add(new Contact(&quot;Foo&quot;, &quot;Bar&quot;, &quot;foo.bar@provider.com&quot;));
        contacts.add(new Contact(&quot;Bar&quot;, &quot;Baz&quot;, &quot;bar.baz@provider.com&quot;));
        contacts.add(new Contact(&quot;Gloubi&quot;, &quot;Boulga&quot;, &quot;gloubi@goulba.com&quot;));
        return (new ListDataModel(contacts));
    }
}
&lt;/textarea&gt;&lt;br /&gt;
&lt;br /&gt;

Et enfin, derni&#232;re &#233;tape, nous allons cr&#233;er notre Rich DataTable, basique pour l&apos;instant, capable d&apos;afficher ces donn&#233;es :
&lt;textarea name=&quot;code&quot; class=&quot;xml&quot;&gt;
&lt;rich:dataTable value=&quot;#{DataTableManager.sampleModel}&quot; var=&quot;contact&quot;&gt;
    &lt;f:facet name=&quot;header&quot;&gt;
        &lt;h:outputText value=&quot;Sorting &amp; Filter exemple&quot; /&gt;
    &lt;/f:facet&gt;
    &lt;rich:column&gt;
        &lt;f:facet name=&quot;header&quot;&gt;
            &lt;h:outputText value=&quot;First name&quot; /&gt;
        &lt;/f:facet&gt;
        &lt;h:outputText value=&quot;#{contact.firstName}&quot; /&gt;
    &lt;/rich:column&gt;
    &lt;rich:column&gt;
        &lt;f:facet name=&quot;header&quot;&gt;
            &lt;h:outputText value=&quot;Last name&quot; /&gt;
        &lt;/f:facet&gt;
        &lt;h:outputText value=&quot;#{contact.lastName}&quot; /&gt;
    &lt;/rich:column&gt;
    &lt;rich:column&gt;
        &lt;f:facet name=&quot;header&quot;&gt;
            &lt;h:outputText value=&quot;Mail address&quot; /&gt;
        &lt;/f:facet&gt;
        &lt;h:outputText value=&quot;#{contact.mailAddress}&quot; /&gt;
    &lt;/rich:column&gt;
&lt;/rich:dataTable&gt;
&lt;/textarea&gt;&lt;br /&gt;
&lt;br /&gt;

Nous avons dans l&apos;exemple de code pr&#233;c&#233;dent cr&#233;&#233; une Rich DataTable. Le code ressemble &#224; celui d&apos;une DataTable classique, la seule diff&#233;rence &#233;tant l&apos;utilisation de la taglib RichFaces au lieu de la taglib standard.

&lt;h2&gt;Rajout des fonctionnalit&#233;s de tri&lt;/h2&gt;

L&apos;ajout du tri dans une Rich DataTable est tr&#232;s facile. La balise &lt;code&gt;&amp;lt;rich:column /&amp;gt;&lt;/code&gt; poss&#232;de un attribut &lt;code&gt;sortBy&lt;/code&gt;, qui permet de sp&#233;cifier la propri&#233;t&#233; qui sera utilis&#233;e pour trier la colonne concern&#233;e.&lt;br /&gt;
&lt;br /&gt;

Notre code pr&#233;c&#233;dent ressemble donc d&#233;sormais &#224; ceci :
&lt;textarea name=&quot;code&quot; class=&quot;xml&quot;&gt;
&lt;rich:dataTable value=&quot;#{DataTableManager.sampleModel}&quot; var=&quot;contact&quot;&gt;
    &lt;f:facet name=&quot;header&quot;&gt;
        &lt;h:outputText value=&quot;Sorting &amp; Filter exemple&quot; /&gt;
    &lt;/f:facet&gt;
    &lt;rich:column sortBy=&quot;#{contact.firstName}&quot;&gt;
        &lt;f:facet name=&quot;header&quot;&gt;
            &lt;h:outputText value=&quot;First name&quot; /&gt;
        &lt;/f:facet&gt;
        &lt;h:outputText value=&quot;#{contact.firstName}&quot; /&gt;
    &lt;/rich:column&gt;
    &lt;rich:column sortBy=&quot;#{contact.lastName}&quot;&gt;
        &lt;f:facet name=&quot;header&quot;&gt;
            &lt;h:outputText value=&quot;Last name&quot; /&gt;
        &lt;/f:facet&gt;
        &lt;h:outputText value=&quot;#{contact.lastName}&quot; /&gt;
    &lt;/rich:column&gt;
    &lt;rich:column sortBy=&quot;#{contact.mailAddress}&quot;&gt;
        &lt;f:facet name=&quot;header&quot;&gt;
            &lt;h:outputText value=&quot;Mail address&quot; /&gt;
        &lt;/f:facet&gt;
        &lt;h:outputText value=&quot;#{contact.mailAddress}&quot; /&gt;
    &lt;/rich:column&gt;
&lt;/rich:dataTable&gt;
&lt;/textarea&gt;
&lt;br /&gt;

L&apos;ex&#233;cution de ce code nous montre que sur chaque colonne, RichFaces a rajout&#233; des boutons permettant &#224; l&apos;utilisateur de choisir quelle colonne sera utilis&#233;e pour trier les donn&#233;es, et de choisir l&apos;ordre de tri.&lt;br /&gt;
&lt;br /&gt;

Il est &#233;galement possible de donner un ordre de tri par d&#233;faut &#224; notre DataTable. Pour cel&#224;, nous allons utiliser l&apos;attribut &lt;code&gt;sortOrder&lt;/code&gt; de notre balise &lt;code&gt;&amp;lt;rich:column /&amp;gt;&lt;/code&gt; :
&lt;textarea name=&quot;code&quot; class=&quot;xml&quot;&gt;
&lt;rich:column sortBy=&quot;#{contact.lastName}&quot;
             sortOrder=&quot;ASCENDING&quot;&gt;
    &lt;f:facet name=&quot;header&quot;&gt;
        &lt;h:outputText value=&quot;Last name&quot; /&gt;
    &lt;/f:facet&gt;
    &lt;h:outputText value=&quot;#{contact.lastName}&quot; /&gt;
&lt;/rich:column&gt;
&lt;/textarea&gt;
&lt;br /&gt;

Ainsi, au lancement de la page, les contacts seront tri&#233;s par ordre alphab&#233;tique en fonction de leur nom de famille. Il sera &#233;galement possible pour l&apos;utilisateur de changer la propri&#233;t&#233; servant &#224; faire le tri (et de choisir le pr&#233;nom, ou l&apos;adresse mail). L&apos;utilisateur aura &#233;galement la possibilit&#233; de changer l&apos;ordre de tri (croissant, d&#233;croissant).&lt;br /&gt;

&lt;h2&gt;Filtrer les donn&#233;es&lt;/h2&gt;

Le filtrage des donn&#233;es &#224; l&apos;int&#233;rieur d&apos;une DataTable passe par plusieurs &#233;tapes :
&lt;ul&gt;
    &lt;li&gt;Il faut commencer par cr&#233;er un champ de texte, permettant &#224; l&apos;utilisateur de rentrer la requ&#234;te sur laquelle nous allons nous baser pour filtrer les entr&#233;es&lt;/li&gt;
    &lt;li&gt;Il faudra ensuite cr&#233;er une m&#233;thode permettant de filter chacune de nos entr&#233;es. Cette m&#233;thode prends en param&#232;tre l&apos;objet &#224; filter, et renvoie un bool&#233;en indiquant si l&apos;objet doit &#234;tre affich&#233;&lt;/li&gt;
    &lt;li&gt;Enfin, il faudra que notre DataTable soit mise &#224; jour &#224; chaque modification de la requ&#234;te&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

La premi&#232;re &#233;tape est donc de cr&#233;er notre champ de texte. Il s&apos;agit d&apos;un simple champ de texte JSF (&lt;code&gt;&amp;lt;h:inputText /&amp;gt;&lt;/code&gt;) que nous allons lier &#224; une propri&#233;t&#233; d&apos;un managed bean :
&lt;textarea name=&quot;code&quot; class=&quot;java&quot;&gt;
public class DataTableManager {

    // [...]

    // Filtering

    private String filterValue;

    public String getFilterValue() {
        return filterValue;
    }

    public void setFilterValue(String filterValue) {
        this.filterValue = filterValue;
    }

}
&lt;/textarea&gt;
Puis le code JSP correspondant :
&lt;textarea name=&quot;code&quot; class=&quot;xml&quot;&gt;
&lt;h:inputText value=&quot;#{DataTableManager.filterValue}&quot;
             id=&quot;lastNameFilterText&quot;&gt;
&lt;/h:inputText&gt;
&lt;/textarea&gt;
&lt;br /&gt;

Seconde &#233;tape, toujours dans notre managed bean, nous allons cr&#233;er une m&#233;thode filtrant les objets de type &lt;code&gt;Contact&lt;/code&gt; en fonction de la requ&#234;te qui nous est envoy&#233;e par le champ de saisie. Dans l&apos;exemple ci dessous, la m&#233;thode &lt;code&gt;doFilter&lt;/code&gt; prends en param&#232;tre l&apos;objet que nous allons devoir filtrer (dans notre cas, on objet de type &lt;code&gt;Contact&lt;/code&gt;), et dois renvoyer &lt;code&gt;true&lt;/code&gt; si le contact doit &#234;tre affich&#233;, &lt;code&gt;false&lt;/code&gt; sinon :
&lt;textarea name=&quot;code&quot; class=&quot;java&quot;&gt;
public class DataTableManager {

    // [...]

    public boolean doFilter(Object value) {
        if (filterValue == null) {
            return (true);
        }
        Contact contact = (Contact) value;
        if (contact.getFirstName().toLowerCase()
                .startsWith(filterValue.toLowerCase())) {
            return (true);
        }
        if (contact.getLastName().toLowerCase()
                .startsWith(filterValue.toLowerCase())) {
            return (true);
        }
        if (contact.getMailAddress().toLowerCase()
                .contains(filterValue.toLowerCase())) {
            return (true);
        }
        return (false);
    }

}
&lt;/textarea&gt;
Nous allons &#233;galement dire &#224; notre DataTable d&apos;utiliser cette m&#233;thode afin de filtrer les entr&#233;es &#224; afficher :
&lt;textarea name=&quot;code&quot; class=&quot;xml&quot;&gt;
&lt;rich:column sortBy=&quot;#{contact.firstName}&quot;
             filterMethod=&quot;#{DataTableManager.doFilter}&quot;&gt;
    &lt;f:facet name=&quot;header&quot;&gt;
        &lt;h:outputText value=&quot;First name&quot; /&gt;
    &lt;/f:facet&gt;
    &lt;h:outputText value=&quot;#{contact.firstName}&quot; /&gt;
&lt;/rich:column&gt;
&lt;/textarea&gt;
&lt;br /&gt;

Enfin, derni&#232;re &#233;tape, nous allons pr&#233;ciser &#224; RichFaces que notre champ de texte doit automatiquement rafra&#238;chir, en Ajax, notre DataTable afin que les donn&#233;es soient de nouveau filtr&#233;es, avec la nouvelle requ&#234;te :
&lt;textarea name=&quot;code&quot; class=&quot;xml&quot;&gt;
&lt;h:inputText value=&quot;#{DataTableManager.filterValue}&quot;
             id=&quot;lastNameFilterText&quot;&gt;
    &lt;a4j:support event=&quot;onkeyup&quot;
                 reRender=&quot;dataTable&quot;
                 requestDelay=&quot;500&quot; /&gt;
&lt;/h:inputText&gt;
&lt;/textarea&gt;
La balise &lt;code&gt;&amp;lt;a4j:support /&amp;gt;&lt;/code&gt; permet, entre autres, de mettre rafra&#238;chir un composant. Elle prends 3 param&#232;tres :
&lt;ul&gt;
    &lt;li&gt;&lt;code&gt;event&lt;/code&gt; : l&apos;&#233;v&#232;nement JavaScript qui devra d&#233;clencher le rafra&#238;chissement&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;reRender&lt;/code&gt; : le composant &#224; rafra&#238;chir&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;requestDelay&lt;/code&gt; : permet de sp&#233;cifier un d&#233;lai entre la requ&#234;te et le refra&#238;chissement du composant&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

A chaque fois que la valeur du champ de texte est modifi&#233;e, la nouvelle valeur est envoy&#233; dans notre managed bean, et notre DataTable est raffra&#238;chie. Ainsi, le tableau va de nouveau &#234;tre filtr&#233;, et notre m&#233;thode va permettre d&apos;&#233;liminer certains r&#233;sultats de notre tableau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

Nous avons donc vu un premier exemple de fonctionnalit&#233; Ajax qu&apos;il est possible de r&#233;aliser gr&#226;ce &#224; RichFaces. Une DataTable avec fonctionnalit&#233;s de tri et de filtre, qui se rafra&#238;chit sans recharger la page.&lt;br /&gt;
&lt;br /&gt;

Les sources du projet NetBeans de cet article sont disponnibles &lt;a href=&quot;http://blog.aperigeek.com/viv/resource/RichFaces/DataTable-FilterSort.zip&quot;&gt;ici&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/richfaces</guid>
    <title>RichFaces</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/richfaces</link>
        <pubDate>Wed, 26 Nov 2008 19:12:04 +0100</pubDate>
    <category>Java</category>
    <category>richfaces</category>
    <category>java</category>
    <category>jsf</category>
    <category>javaee</category>
            <description>Je continue dans ma recherche de librairie de composants pour JSF. J&apos;avais d&#233;j&#224; test&#233; &lt;a href=&quot;http://blog.aperigeek.com/viv/tags/icefaces&quot;&gt;ICEFaces&lt;/a&gt;, mais elle ne me satisfaisait pas. Trop de changement au niveau du cycle de vie de JSF &#224; mon go&#251;t.&lt;br /&gt;
&lt;br /&gt;

J&apos;ai test&#233; aujourd&apos;hui une nouvelle librairie, qui &#224; l&apos;air de s&apos;int&#233;grer parfaitement &#224; JSF. Tr&#232;s peu de changements dans le cycle de vie JSF, &lt;a href=&quot;http://livedemo.exadel.com/richfaces-demo/index.jsp&quot;&gt;beaucoup de composants&lt;/a&gt;, &lt;a href=&quot;http://www.jsfmatrix.net/&quot;&gt;dont la plupart en Ajax&lt;/a&gt;. Il s&apos;agit de &lt;a href=&quot;http://www.jboss.org/jbossrichfaces/&quot;&gt;RichFaces&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;

L&apos;installation, compar&#233;e &#224; &lt;a href=&quot;http://blog.aperigeek.com/viv/entry/installer_icefaces_pour_les_nuls&quot;&gt;celle de ICEFaces&lt;/a&gt;, est tr&#232;s simple. Quelques &lt;a href=&quot;http://www.jboss.org/jbossrichfaces/downloads/&quot;&gt;librairies&lt;/a&gt;, quelques d&#233;pendances (&lt;a href=&quot;http://commons.apache.org/beanutils/&quot;&gt;BeanUtils&lt;/a&gt;, &lt;a href=&quot;http://commons.apache.org/collections/&quot;&gt;Collections&lt;/a&gt;, &lt;a href=&quot;http://commons.apache.org/digester/&quot;&gt;Digester&lt;/a&gt;, &lt;a href=&quot;http://commons.apache.org/logging/&quot;&gt;Commons Log&lt;/a&gt;). La seule configuration n&#233;cessaire est la d&#233;claration d&apos;un filtre dans le fichier &lt;code&gt;web.xml&lt;/code&gt; :
&lt;textarea name=&quot;code&quot; class=&quot;xml&quot;&gt;
&lt;filter&gt;
    &lt;display-name&gt;RichFaces Filter&lt;/display-name&gt;
    &lt;filter-name&gt;richfaces&lt;/filter-name&gt;
    &lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt;
&lt;/filter&gt;

&lt;filter-mapping&gt;
    &lt;filter-name&gt;richfaces&lt;/filter-name&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
    &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
    &lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
&lt;/filter-mapping&gt;
&lt;/textarea&gt;
&lt;br /&gt;

Il ne reste plus qu&apos;&#224; tester la liste assez imposante de composants propos&#233;s :)</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/netbeans_6_5_est_parmis</guid>
    <title>NetBeans 6.5 est parmis nous</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/netbeans_6_5_est_parmis</link>
        <pubDate>Wed, 19 Nov 2008 18:29:12 +0100</pubDate>
    <category>NetBeans</category>
    <category>netbeans</category>
    <category>final</category>
    <category>6.5</category>
            <description>La version &lt;a href=&quot;http://www.netbeans.org/community/releases/65/&quot;&gt;6.5&lt;/a&gt; de l&apos;IDE &lt;a href=&quot;http://www.netbeans.org/&quot;&gt;NetBeans&lt;/a&gt; viens de sortir, en version finale.&lt;br /&gt;
&lt;br /&gt;

Apr&#232;s t&#233;l&#233;chargement et installation, la premi&#232;re impression est assez marquante. Le lancement est encore plus rapide, et l&apos;interface encore plus fluide (compar&#233; &#224; la version 6.1).&lt;br /&gt;
&lt;br /&gt;

Au niveau des nouvelles fonctionnalit&#233;s, quelques nouveaut&#233;s assez importantes :
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://php.netbeans.org/&quot;&gt;Environnement de d&#233;veloppement PHP&lt;/a&gt; (et une distribution de NetBeans sp&#233;cialis&#233;e)&lt;/li&gt;
    &lt;li&gt;Am&#233;lioration du support Java EE (notamment JSF et JPA)&lt;/li&gt;
    &lt;li&gt;&#201;diteur Java FX&lt;/li&gt;
    &lt;li&gt;Support de &lt;a href=&quot;https://glassfish.dev.java.net/&quot;&gt;GlassFish&lt;/a&gt; &lt;a href=&quot;https://glassfish.dev.java.net/downloads/v3-prelude.html&quot;&gt;v3 prelude&lt;/a&gt;, uniquement pour de d&#233;veloppement Web&lt;/li&gt;
    &lt;li&gt;Am&#233;lioration de l&apos;&#233;diteur Java&lt;/li&gt;
    &lt;li&gt;Nouvelles fonctionnalit&#233;s dans l&apos;IDE de base&lt;/li&gt;
    &lt;ul&gt;
        &lt;li&gt;Compile on save / Deploy on save&lt;/li&gt;
        &lt;li&gt;Modification des pr&#233;f&#233;rences d&apos;indentation par projet&lt;/li&gt;
        &lt;li&gt;Barre de recherche rapide&lt;/li&gt;
    &lt;/ul&gt;
&lt;/ul&gt;
La liste compl&#232;te est disponible &lt;a href=&quot;http://www.netbeans.org/community/releases/65/&quot;&gt;ici&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;

Parmis ces fonctionnalit&#233;s, certaines me plaisent d&#233;j&#224;, dont :
&lt;ul&gt;
    &lt;li&gt;Le &quot;compile/deploy on save&quot; qui recompile et/ou red&#233;ploie un projet d&#232;s qu&apos;un changement est fait dans un fichier&lt;/li&gt;
    &lt;li&gt;Le support de GlassFish v3 prelude (que j&apos;aime d&#233;j&#224;, pour sa rapidit&#233;, et ses derniers frameworks [EJB 3.1, JSF 2.0])&lt;/li&gt;
    &lt;li&gt;Les pr&#233;f&#233;rences d&apos;indentation sp&#233;cifique &#224; chaque projet. Finies les guerres d&apos;indentation sur les d&#233;pots !&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

Il y a aussi quelques fonctionnalit&#233;s qui restent &#224; tester et qui semblent int&#233;ressantes, comme le support am&#233;lior&#233; de JSF et de JPA.&lt;br /&gt;
&lt;br /&gt;

Pour les t&#233;l&#233;chargements, c&apos;est directement &lt;a href=&quot;http://www.netbeans.org/downloads/index.html&quot;&gt;ici&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/ejb_3_1_on_y</guid>
    <title>EJB 3.1, on y arrive !</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/ejb_3_1_on_y</link>
        <pubDate>Tue, 11 Nov 2008 16:34:36 +0100</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>javaee</category>
    <category>ejb</category>
            <description>Cela va mainteant faire 4 jours que &lt;a href=&quot;https://glassfish.dev.java.net/&quot;&gt;GlassFish&lt;/a&gt; &lt;a href=&quot;https://glassfish.dev.java.net/downloads/v3-prelude.html&quot;&gt;v3 prelude&lt;/a&gt; est sorti. Pour accompagner sa sortie, &lt;a href=&quot;&quot;&gt;une vingtaine de pr&#233;sentations&lt;/a&gt; ont &#233;t&#233; faites sur GlassFish (via la chaine &lt;a href=&quot;http://www.ustream.tv/channel/theaquarium&quot;&gt;TheAquarium&lt;/a&gt;, sur &lt;a href=&quot;http://www.ustream.tv/&quot;&gt;Ustream.TV&lt;/a&gt;), mais aussi sur Java EE 6 et NetBeans 6.5.&lt;br /&gt;
&lt;br /&gt;

Je viens d&apos;en regarder quelques unes, et celle qui a le plus retenu mon attention est sans aucun doute la pr&#233;sentation des EJB 3.1, qui vient avec son lot d&apos;am&#233;liorations et de nouvelles fonctionnalit&#233;s qui m&#233;ritent de s&apos;y attarder :-)&lt;br /&gt;
&lt;br /&gt;

On retrouve parmis ces fonctionnalit&#233;s :
&lt;ul&gt;
    &lt;li&gt;Les singletons&lt;/li&gt;
    &lt;li&gt;Une meilleure gestion des timers&lt;/li&gt;
    &lt;li&gt;Les noms JNDI globaux&lt;/li&gt;
    &lt;li&gt;Les Session Beans &quot;sans interface&quot;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Les singletons&lt;/h2&gt;

Les &lt;a href=&quot;http://fr.wikipedia.org/wiki/Singleton_(patron_de_conception)&quot;&gt;singletons&lt;/a&gt; sont des beans qui ont la particularit&#233; de n&apos;&#234;tre instanci&#233;s qu&apos;une seule et unique fois tout au long de la vie de notre application. Cette instance sera ensuite partag&#233;e entre les diff&#233;rents clients l&apos;utilisant.&lt;br /&gt;
&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
@Singleton
public class MySingleton {

    private int sharedValue;

    public int getSharedValue() {
        return (sharedValue);
    }

}
&lt;/pre&gt;
&lt;br /&gt;

Dans cet exemple de code, notre bean &lt;code&gt;MySingleton&lt;/code&gt; sera instanci&#233; une seule et unique fois, et chaque appel de m&#233;thode fera appel &#224; la m&#234;me instance, ce qui nous permettra, par exemple, de partager des donn&#233;es (comme la variable &lt;code&gt;sharedValue&lt;/code&gt; de notre exemple).

&lt;h2&gt;Une meilleure gestion des timers&lt;/h2&gt;

EJB 3.1 introduit &#233;galement une nouvelle gestion des timers, qui se rapproche de la gestions des &lt;a href=&quot;http://fr.wikipedia.org/wiki/Cron&quot;&gt;crons&lt;/a&gt; Unix : on peut sp&#233;cifier des t&#226;ches &#224; ex&#233;cuter de mani&#232;re tr&#232;s pr&#233;cise. Ces timers seront alors automatiquement cr&#233;&#233;s et d&#233;marr&#233;s.&lt;br /&gt;
&lt;br /&gt;

Voici un exemple, lan&#231;ant une t&#226;che tous les jours &#224; 8 heures :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
@Stateless
public class MyBean implements MyInterface {

    @Schedule(hour=&quot;8&quot;)
    void myTask() {
    }

}
&lt;/pre&gt;

&lt;h2&gt;Les noms JNDI globaux&lt;/h2&gt;

Il s&apos;agit s&#251;rement d&apos;une des plus grosses lacunes de la sp&#233;cification EJB 3 qui se trouve ici combl&#233;e : l&apos;absence de standardisation des noms JNDI associ&#233;s aux Session Bean, ce qui entra&#238;nait des pertes de portabilit&#233; entre les diff&#233;rents serveurs d&apos;application.&lt;br /&gt;
&lt;br /&gt;

Par exemple, sous GlassFish, le nom par d&#233;faut d&apos;un Session Bean est le nom complet de l&apos;interface m&#233;tier de notre bean (&lt;code&gt;&lt;b&gt;com.aperigeek.ejb.MyInterface&lt;/b&gt;&lt;/code&gt;). Sous JBoss, le nom est &lt;code&gt;&lt;b&gt;&amp;lt;nom du jar&amp;gt;/&amp;lt;nom du bean&amp;gt;/&amp;lt;visibilit&#233;&amp;gt;&lt;/b&gt;&lt;/code&gt;, ce qui donnerais par exemple &lt;code&gt;&lt;b&gt;aperigeek/MyBean/remote&lt;/b&gt;&lt;/code&gt;. Les noms sont donc tr&#232;s d&#233;pendants du serveur d&apos;application.&lt;br /&gt;
&lt;br /&gt;

La nouvelle sp&#233;cification EJB 3.1 sp&#233;cifie des noms standards &#224; respecter lors du binding des beans : &lt;code&gt;&lt;b&gt;java:global[/&amp;lt;app-name&amp;gt;]/&amp;lt;module-name&amp;gt;/&amp;lt;ejb-name&amp;gt;&lt;/b&gt;&lt;/code&gt;, ce qui pourrait donner : &lt;code&gt;&lt;b&gt;java:global/aperigeek/aperigeek-ejb/MyBean&lt;/b&gt;&lt;/code&gt;. Cette fonctionnalit&#233; permet d&apos;assurer la portabilit&#233; d&apos;une application entre diff&#233;rents serveurs d&apos;applications.

&lt;h2&gt;Les Session Beans &quot;sans interface&quot;&lt;/h2&gt;

Derni&#232;re fonctionnalit&#233; dans la s&#233;rie des simplifications de la sp&#233;cification : la possibilit&#233; de d&#233;finir un Session Bean dans une seule classe, sans passer par une interface m&#233;tier exposant les diff&#233;rentes m&#233;thodes.&lt;br /&gt;
&lt;br /&gt;

&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
@Stateless
public class MyBean {

    public void myMethod() {
    }

}
&lt;/pre&gt;
&lt;br /&gt;

Dans ce cas de figure, toutes les m&#233;thodes publiques deviennent visibles.
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
@Stateless
public class MyOtherBean {

    @EJB
    private MyBean myBean;

    public void myOtherMethod() {
        myBean.myMethod();
    }

}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

La nouvelle version des EJB, la version 3.1, apporte encore quelques am&#233;liorations &#224; la version 3.0. L&apos;optique de cette nouvelle version reste essentiellement la m&#234;me : simplifier l&apos;utilisation des EJBs. On retrouve quand m&#234;me quelques nouvelles fonctionnalit&#233;s int&#233;ressantes, comme les singletons ou les timers.&lt;br /&gt;
&lt;br /&gt;

Toutes ces nouvelles fonctionnalit&#233;s sont d&apos;ores et d&#233;j&#224; testables gr&#226;ce &#224; &lt;a href=&quot;https://glassfish.dev.java.net/downloads/v3-prelude.html&quot;&gt;GlassFish v3 prelude&lt;/a&gt;, qui sert d&apos;impl&#233;mentation de r&#233;f&#233;rence &#224; cette sp&#233;cification.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/java_c_sockets</guid>
    <title>Java/C : Sockets</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/java_c_sockets</link>
        <pubDate>Fri, 3 Oct 2008 08:28:09 +0100</pubDate>
    <category>C/C++</category>
    <category>socket</category>
    <category>java</category>
    <category>c</category>
            <description>&lt;div style=&quot;width: 48%; float: left&quot;&gt;
&lt;textarea name=&quot;code&quot; class=&quot;java&quot;&gt;
public class Main {

    public static void main(String[] args) {
        try {
            ServerSocket serv = new ServerSocket(8080);
            for (int i = 0; i &lt; 3; i++) {
                Socket client = serv.accept();
                OutputStream out = client.getOutputStream();
                out.write(&quot;Toto\n&quot;.getBytes());
                out.close();
                client.close();
            }
            serv.close();
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }
}
&lt;/textarea&gt;
&lt;/div&gt;
&lt;div style=&quot;width: 48%; float: left&quot;&gt;
&lt;textarea name=&quot;code&quot; class=&quot;c&quot;&gt;
int main(int argc, char** argv) {
    
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    
    struct sockaddr_in* sin = malloc (sizeof (struct sockaddr_in));
    sin-&gt;sin_family = AF_INET;
    sin-&gt;sin_port = htons(8080);
    sin-&gt;sin_addr.s_addr = htonl(INADDR_ANY);
    
    if (bind (sock, (struct sockaddr*) sin, sizeof (struct sockaddr_in)) &lt; 0) {
        printf(&quot;Error while binding...\n&quot;);
        return(EXIT_FAILURE);
    }
    
    if (listen(sock, 5) &lt; 0) {
        printf(&quot;Error while listening...\n&quot;);
        return(EXIT_FAILURE);
    }
    
    int i;
    for (i = 0; i &lt; 3; i++) {
        
        int client = accept(sock, 0, 0);
        if (client &lt; 0) {
            printf(&quot;Error accepting!\n&quot;);
            break;
        }
        
        write(client, &quot;Toto\n&quot;, 5);
        
        close(client);
    }
    close(sock);
    
    return (EXIT_SUCCESS);
}
&lt;/textarea&gt;
&lt;/div&gt;
&lt;br style=&quot;clear: both;&quot; /&gt;

J&apos;ai refait un peu de C hier, &quot;pour le plaisir&quot;... Je pense que les deux bouts de code au dessus parlent pour moi :-)&lt;br /&gt;
&lt;br /&gt;

Juste, en passant, le plugin C/C++ de NetBeans est tout simplement... bien. Toutes les fonctionnalit&#233;s que l&apos;on attend d&apos;un IDE sont l&#224; (autocompl&#233;tion, affichage des param&#232;tres des fonctions, ...). Moi qui n&apos;aimais pas les IDE pour le C, j&apos;ai &#233;t&#233; plut&#244;t surpris. Dans le bon sens :-)</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/java_net_op%C3%A9rateurs</guid>
    <title>Java/.NET : Op&#233;rateurs</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/java_net_op%C3%A9rateurs</link>
        <pubDate>Thu, 2 Oct 2008 12:43:46 +0100</pubDate>
    <category>.NET</category>
    <category>.net</category>
    <category>surcharge</category>
    <category>java</category>
    <category>operateur</category>
    <category>indexeur</category>
            <description>Dans ce billet, nous allons parler des op&#233;rateurs. Les op&#233;rateurs existants en Java existent &#233;galement en C#, et les diff&#233;rences entre les deux sont quasi-inexistantes.&lt;br /&gt;
&lt;br /&gt;

Nous allons donc parler de deux fonctionnalit&#233;s, pr&#233;sentes en C#, qui n&apos;existent pas en Java :
&lt;ul&gt;
    &lt;li&gt;La surcharge des op&#233;rateurs&lt;/li&gt;
    &lt;li&gt;Les indexeurs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Surcharge des op&#233;rateurs&lt;/h2&gt;

Le langage C#, contrairement au langage Java, impl&#233;mente la surcharge des op&#233;rateurs. Les principes sont inspir&#233;s du C++.&lt;br /&gt;
&lt;br /&gt;

Voici un exemple de surcharge des op&#233;rateurs en C# :
&lt;pre name=&quot;code&quot; class=&quot;c-sharp&quot;&gt;
class Program
{
    static void Main(string[] args)
    {
        MyString s1 = new MyString(&quot;Hello &quot;);
        MyString s2 = new MyString(&quot;World!&quot;);
        MyString s = s1 + s2;
    }
}

class MyString
{
    private string _value;
    public MyString(string _value)
    {
        this._value = _value;
    }
    public static MyString operator + (MyString a, MyString b)
    {
        return (new MyString(a._value + b._value));
    }
}
&lt;/pre&gt;
&lt;br /&gt;

Il n&apos;existe aucun &#233;quivalent &#224; la surcharge des op&#233;rateurs en Java.

&lt;h2&gt;Indexeurs&lt;/h2&gt;

Le langage C# introduit un nouveau concept, les indexeurs. Un indexeur est semblable &#224; un op&#233;rateur, et il permet d&apos;acc&#233;der &#224; un index donn&#233; d&apos;un objet, comme par exemple un tableau. Cet index peut &#234;tre de type &lt;code&gt;int&lt;/code&gt;, mais aussi de n&apos;importe quel autre type, valeur ou r&#233;f&#233;rence.&lt;br /&gt;
&lt;br /&gt;

Voici un exemple de code mettant en oeuvre un indexeur :
&lt;pre name=&quot;code&quot; class=&quot;c-sharp&quot;&gt;
class Program
{
    static void Main(string[] args)
    {
        MyIndex i = new MyIndex();
        Console.WriteLine(i[12]);
    }
}

class MyIndex
{
    public string this [int index]
    {
        get
        {
            return (&quot;Index &quot; + index);
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;

Il n&apos;existe aucun &#233;quivalent aux indexeurs en Java.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

En ce qui concerne les op&#233;rateurs en C#, nous avons vu deux fonctionnalit&#233;s int&#233;ressantes qui n&apos;existent malheureusement pas en Java.&lt;br /&gt;
&lt;br /&gt;

Beaucoup de personnes ont esp&#233;r&#233; voir la surcharge des op&#233;rateurs arriver dans Java 7. Cependant, cette fonctionnalit&#233;s est assez controvers&#233;e, et il y a peu de chances de la voir arriver dans le langage (de m&#234;me que les indexeurs).</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/neal_gafter_quitte_google_pour</guid>
    <title>Neal Gafter quitte Google... Pour Microsoft</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/neal_gafter_quitte_google_pour</link>
        <pubDate>Tue, 30 Sep 2008 09:40:25 +0100</pubDate>
    <category>Actualit&#233;s</category>
    <category>google</category>
    <category>microsoft</category>
    <category>gafter</category>
            <description>Les rumeurs courent depuis plusieurs jours maintenant, et c&apos;est maintenant certain. &lt;a href=&quot;http://gafter.com/~neal/&quot;&gt;Neal Gafter&lt;/a&gt;, un des &quot;grands&quot; du monde Java, viens de quitter Google pour aller travailler chez Microsoft.&lt;br /&gt;
&lt;br /&gt;

Neal Gafter travaille depuis longtemps pour le monde Java. Il a notamment dirig&#233; les &#233;volutions du langages et des outils (java, javac, javah et javap) de la version 1.3.1 &#224; la version 1.5.0 du JDK. Plus r&#233;cemment, il a &#233;galement contribu&#233; &#224; Java 7, et fait entre autres partie de l&apos;&#233;quipe &#224; l&apos;origine des &lt;a href=&quot;http://www.javac.info&quot;&gt;closures BGGA&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;

Maintenant chez Microsoft, il travaille sur les langages de la plate-forme .NET, et en particulier le langage C#.&lt;br /&gt;
&lt;br /&gt;

&lt;a href=&quot;http://blog.refactor.se/2008/09/29/gafter-to-microsoft/&quot;&gt;Beaucoup&lt;/a&gt; &lt;a href=&quot;http://kohlerm.blogspot.com/2008/09/it-official-neal-gafter-works-for.html&quot;&gt;en&lt;/a&gt; &lt;a href=&quot;http://prashantjalasutram.blogspot.com/2008/09/confirmed-news-neal-gafter-joins.html&quot;&gt;parlent&lt;/a&gt; comme d&apos;une mauvaise nouvelle pour le monde Java, il reste &#224; voir ce que ce changement va nous apporter...</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/java_net_types_de_donn%C3%A9es</guid>
    <title>Java/.NET : Types de donn&#233;es</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/java_net_types_de_donn%C3%A9es</link>
        <pubDate>Mon, 29 Sep 2008 06:55:15 +0100</pubDate>
    <category>.NET</category>
    <category>package</category>
    <category>namespace</category>
    <category>struct</category>
    <category>types</category>
    <category>java</category>
    <category>generics</category>
    <category>enum</category>
    <category>.net</category>
            <description>Dans ce second billet de la s&#233;rie &quot;Java/.NET&quot;, nous allons parler de toutes les diff&#233;rences touchant aux types de donn&#233;es.

&lt;h2&gt;Fichiers sources&lt;/h2&gt;

En Java, le compilateur n&#8217;autorise qu&#8217;une seule et unique classe publique par fichier source. De plus, la classe publique d&#8217;un fichier source doit poss&#233;der exactement le m&#234;me nom que le fichier dans lequel elle se trouve.&lt;br /&gt;
&lt;br /&gt;

En C#, les restrictions comme celles-ci n&#8217;existent pas. Il est possible de d&#233;clarer plusieurs classes publiques au sein du m&#234;me fichier, et aucune v&#233;rification n&#8217;est faite quand au nom du fichier contenant les classes.

&lt;h2&gt;Types primitifs - types valeurs&lt;/h2&gt;

En Java comme en C#, il existe un type de donn&#233;es particulier : leur valeur est directement stock&#233; dans une zone m&#233;moire appel&#233;e la pile. De plus, ces diff&#233;rents types de donn&#233;es sont directement pass&#233;s par valeur.&lt;br /&gt;
&lt;br /&gt;

Ils peuvent repr&#233;senter une valeur &quot;basique&quot;, &#224; savoir :
&lt;ul&gt;
    &lt;li&gt;Un nombre (entier ou &#224; virgule flottante)&lt;/li&gt;
    &lt;li&gt;Un caract&#232;re&lt;/li&gt;
    &lt;li&gt;Un bool&#233;en&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

En Java, ces types de donn&#233;es qui sont appel&#233;s des types primitifs. Il s&#8217;agit des seuls types de donn&#233;es qui ne sont pas des objets, c&apos;est-&#224;-dire qu&#8217;ils ne poss&#232;dent aucune m&#233;thode. Pour palier &#224; cet inconv&#233;nient, il existe des types dits wrappers, qui sont des &#233;quivalents objets de ces types primitifs.&lt;br /&gt;
&lt;br /&gt;

En C#, ces types sont appel&#233;s les types valeurs. Ils r&#233;sident &#233;galement sur la pile, mais ce sont cependant des objets. Chaque type valeur poss&#232;de un alias, qui permet de faciliter l&#8217;appel de ces types dans le code. Par exemple, le type valeur &lt;code&gt;Int32&lt;/code&gt; poss&#232;de un alias &lt;code&gt;int&lt;/code&gt;. Ces alias seront convertis au moment de la compilation.&lt;br /&gt;
&lt;br /&gt;

A noter &#233;galement qu&#8217;en C#, les cha&#238;nes de caract&#232;res et les &#233;num&#233;rations ont la particularit&#233; d&#8217;&#234;tre des types valeur. Au contraire, les cha&#238;nes de caract&#232;res et les &#233;num&#233;rations en Java sont des objets, et r&#233;sident sur le tas.

&lt;h2&gt;Types r&#233;f&#233;rences&lt;/h2&gt;

Chacun des deux langages d&#233;finit un autre type de variables : les types r&#233;f&#233;rences.&lt;br /&gt;
&lt;br /&gt;

Contrairement aux types primitifs (ou types valeurs), ils sont pass&#233;s par r&#233;f&#233;rence lors des diff&#233;rents appels de m&#233;thodes. Ils repr&#233;sentent en g&#233;n&#233;ral des types complexes, que nous allons d&#233;finir nous m&#234;me. De plus, la valeur de ces types de donn&#233;es est stock&#233;e sur le tas, et la pile ne contient qu&#8217;une r&#233;f&#233;rence vers ces objets.&lt;br /&gt;
&lt;br /&gt;

En Java, chaque type primitif poss&#232;de un &#233;quivalent en type r&#233;f&#233;rence. Ce sont les types wrappers. Ces objets
sont des objets comme tous les autres objets Java. Leur valeur r&#233;side sur le tas et ils sont pass&#233;s par r&#233;f&#233;rence lors des diff&#233;rents appels de m&#233;thodes. Depuis Java 1.5, la conversion entre les types primitifs et types wrapper est automatique.&lt;br /&gt;
&lt;br /&gt;

En C# comme en Java, les classes sont des types r&#233;f&#233;rences.

&lt;h2&gt;Structures&lt;/h2&gt;

Le langage C# introduit un type de donn&#233;es qui n&#8217;existe pas en Java : le type structure. Les structures sont un type de donn&#233;es semblable aux classes, sauf qu&#8217;elles sont de types valeur, et non de type r&#233;f&#233;rence.&lt;br /&gt;
&lt;br /&gt;

Cette diff&#233;rence implique que les structures sont stock&#233;es sur la pile (et non sur le tas, contrairement aux
objets), et qu&#8217;elles sont pass&#233;es par valeur en param&#232;tre aux m&#233;thodes.&lt;br /&gt;
&lt;br /&gt;

De par leur statut particulier, les structures ont cependant quelques fonctionnalit&#233;s en moins par rapport aux classes. Il est impossible par exemple d&#8217;h&#233;riter d&#8217;une structure en C#.

&lt;h2&gt;Enum&#233;rations&lt;/h2&gt;

En Java, les &#233;num&#233;rations sont des objets. Comme pour les objets, il est possible de leur d&#233;finir des attributs, des m&#233;thodes, et m&#234;me des constructeurs.&lt;br /&gt;
&lt;br /&gt;

Contrairement &#224; cela, en C#, les &#233;num&#233;rations sont de type valeur. Les &#233;num&#233;rations correspondent &#224; des
entiers cod&#233;s sur 8, 16, 32 ou 64 bits. Il est &#233;galement possible d&#8217;assigner n&#8217;importe quelle valeur num&#233;rique &#224; une &#233;num&#233;ration (y compris des valeurs non d&#233;finies dans l&#8217;&#233;num&#233;ration), ainsi que de combiner plusieurs valeurs pour une m&#234;me &#233;num&#233;ration gr&#226;ce &#224; l&#8217;op&#233;rateur | (bitwise or).

&lt;h2&gt;Espaces de nommages&lt;/h2&gt;

Lors du d&#233;veloppement d&#8217;applications, il arrive que plusieurs structures de donn&#233;es (classes, interfaces,
&#233;num&#233;rations...) poss&#232;dent le m&#234;me nom. Afin d&#8217;&#233;viter les collisions de noms ainsi g&#233;n&#233;r&#233;es, chaque langage &#224;
mis en place sa propre solution : les espaces de nommages.&lt;br /&gt;
&lt;br /&gt;

En Java, un espace de nommage s&#8217;appelle un package. Un package doit &#234;tre d&#233;clar&#233; en d&#233;but de tout fichier
source gr&#226;ce au mot cl&#233; &lt;code&gt;package&lt;/code&gt; suivi du nom du package, et s&#8217;applique &#224; tout le fichier. Il est possible d&#8217;acc&#233;der &#224; des classes appartenant &#224; d&#8217;autres packages gr&#226;ce au mot cl&#233; &lt;code&gt;import&lt;/code&gt;, suivi du nom de la classe &#224; importer. Il est &#233;galement possible d&#8217;importer toutes les classes d&#8217;un package en utilisant l&#8217;&#233;toile (*).&lt;br /&gt;
&lt;br /&gt;

En C#, un espace de nommage s&#8217;appelle un namespace. Un namespace est un bloc de code, not&#233; gr&#226;ce au mot
cl&#233; &lt;code&gt;namespace&lt;/code&gt;, suivi du nom du namespace. Il est possible d&#8217;utiliser des classes appartenant &#224; d&#8217;autres espaces de noms gr&#226;ce au mot cl&#233; &lt;code&gt;using&lt;/code&gt;, suivi du nom de l&#8217;espace de nom &#224; utiliser.&lt;br /&gt;
&lt;br /&gt;

Voici par exemple la d&#233;claration de deux classes dans un espace de nommage, en Java (&#224; gauche) et en C# (&#224; droite) :
&lt;div style=&quot;float: left; width: 48%;&quot;&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
package ns;

class Toto {
}

class Tata {
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;

&lt;div style=&quot;float: right; width: 48%;&quot;&gt;
&lt;pre name=&quot;code&quot; class=&quot;c-sharp&quot;&gt;
namespace Ns
{
    class Toto
    {
    }
    class Tata
    {
    }
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br style=&quot;clear: both;&quot; /&gt;

&lt;h2&gt;Types g&#233;n&#233;riques&lt;/h2&gt;

Java et C# impl&#233;mentent tous les deux les types g&#233;n&#233;riques. Si l&#8217;utilisation est similaire dans les deux langages, leurs impl&#233;mentations sont cependant tr&#232;s diff&#233;rentes.&lt;br /&gt;
&lt;br /&gt;

Premier point, les types g&#233;n&#233;riques en Java n&#8217;acceptent pas les types primitifs, alors que l&#8217;impl&#233;mentation en C# accepte les types valeurs.&lt;br /&gt;
&lt;br /&gt;

Second point, les g&#233;n&#233;riques en Java sont impl&#233;ment&#233;s selon une technique dite du type erasure. Derri&#232;re ce
nom effrayant se cache un concept simple : les g&#233;n&#233;riques en Java sont &#233;valu&#233;s &#224; la compilation, toute trace de type g&#233;n&#233;rique n&#8217;existe plus &#224; l&#8217;ex&#233;cution. C&#8217;est le compilateur qui va se charger de transformer les types g&#233;n&#233;riques en leurs op&#233;rations &#233;quivalentes (principalement du transtypage et des v&#233;rifications de types), et supprimer toute trace de leur passage.&lt;br /&gt;
&lt;br /&gt;

Contrairement &#224; cela, les g&#233;n&#233;riques en C# persistent &#224; l&#8217;ex&#233;cution, et sont interpr&#233;t&#233;s par l&#8217;environnement
d&#8217;ex&#233;cution. Il est donc possible de conna&#238;tre le type g&#233;n&#233;rique d&#8217;une classe ou d&#8217;une m&#233;thode lors de
l&#8217;ex&#233;cution.&lt;br /&gt;
&lt;br /&gt;

Les cons&#233;quences sont alors multiples. Par exemple, en C#, il est possible de cr&#233;er une instance d&#8217;un type
g&#233;n&#233;rique, et des tableaux de types g&#233;n&#233;riques, choses qui sont impossibles &#224; faire en Java, principalement &#224;
cause du type erasure.&lt;br /&gt;
&lt;br /&gt;

Autre diff&#233;rence importante, il est possible d&#8217;effectuer des v&#233;rifications plus pouss&#233;es sur les types utilis&#233;s en tant que types g&#233;n&#233;riques dans le langage C#. Par exemple, en C#, il est possible de d&#233;finir une contrainte &#171; Cette classe utilise un type T, qui doit poss&#233;der un constructeur par d&#233;faut &#187;, contrainte qui est impossible en Java.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

Voil&#224; donc la fin de cette liste de diff&#233;rences entre Java et C# en ce qui concerne les types de donn&#233;es.&lt;br /&gt;
&lt;br /&gt;

Le prochain billet portera sur les op&#233;rateurs, et devrait parler de deux fonctionnalit&#233;s pr&#233;sentes en C# et inexistantes en Java : la surcharge des op&#233;rateurs et les indexeurs.&lt;br /&gt;
&lt;br /&gt;

PS : Ceci &#233;tait de &lt;a href=&quot;http://fr.wikipedia.org/wiki/La_Grande_Question_sur_la_Vie,_l%27Univers_et_le_Reste&quot;&gt;42&lt;/a&gt;&#232;me billet de ce blog ;-)</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/java_net_concepts_%C3%A9l%C3%A9mentaires</guid>
    <title>Java/.NET : Concepts &#233;l&#233;mentaires</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/java_net_concepts_%C3%A9l%C3%A9mentaires</link>
        <pubDate>Mon, 22 Sep 2008 08:33:23 +0100</pubDate>
    <category>.NET</category>
    <category>.net</category>
    <category>execution</category>
    <category>compilation</category>
    <category>java</category>
            <description>Dans ce premier billet de la s&#233;rie consacr&#233;e aux diff&#233;rences entre Java et .NET, nous allons voir les concepts &#233;l&#233;mentaires des deux plateformes.&lt;br /&gt;
&lt;br /&gt;

Les concepts &#233;l&#233;mentaires au niveau des deux technologies sont tr&#232;s similaires. Les deux s&#8217;appuient sur le m&#234;me principe : la compilation est effectu&#233;e vers un langage interm&#233;diaire. Ce langage interm&#233;diaire est proche du langage machine, mais ind&#233;pendant de l&#8217;architecture et du syst&#232;me. Il sera ensuite ex&#233;cut&#233; par une machine virtuelle au moment de l&#8217;ex&#233;cution du programme. Ce principe permet d&#8217;assurer une certaine portabilit&#233; entre les diff&#233;rents syst&#232;mes d&#8217;exploitation et les diff&#233;rentes architectures mat&#233;rielles.

&lt;h2&gt;Compilation&lt;/h2&gt;

Le compilateur C# s&#8217;appelle CSC (C-Sharp Compiler). Il est charg&#233; de traduire le code source C# en code MSIL
(Microsoft Intermediate Language), un langage interm&#233;diaire qui sera ensuite ex&#233;cut&#233; par l&#8217;environnement
d&#8217;ex&#233;cution de la plateforme .NET.&lt;br /&gt;
&lt;br /&gt;

Le compilateur Java est appel&#233; Javac (Java Compiler), et son r&#244;le est de transformer le code source Java en ByteCode, qui est le langage interm&#233;diaire de la plateforme Java.&lt;br /&gt;
&lt;br /&gt;

Les deux compilateurs comportent &#233;galement des fonctionnalit&#233;s plus pouss&#233;es. Chacun des compilateurs est
capable, par exemple, d&#8217;optimiser le code source au moment de la compilation afin d&#8217;en am&#233;liorer les performances. Il n&#8217;y a pas de diff&#233;rence majeure &#224; ce niveau l&#224;.

&lt;h2&gt;Environnement d&apos;ex&#233;cution&lt;/h2&gt;

L&#8217;environnement d&#8217;ex&#233;cution .NET est construit autour de la CLR (Common Language Runtime). Il s&#8217;agit de la
machine virtuelle charg&#233;e d&#8217;ex&#233;cuter le code MSIL g&#233;n&#233;r&#233; par le compilateur.&lt;br /&gt;
&lt;br /&gt;

De son cot&#233;, l&#8217;environnement d&#8217;ex&#233;cution Java tourne autour de la JVM (Java Virtual Machine). Son r&#244;le sera
d&#8217;ex&#233;cuter le ByteCode, afin de permettre l&#8217;ex&#233;cution de nos programmes.&lt;br /&gt;
&lt;br /&gt;

Les deux machines virtuelles sont tr&#232;s proches, et sont con&#231;ues de mani&#232;re semblable. Les deux embarquent un
chargeur de classe (Class Loader), un compilateur JIT (Just In Time) qui transforme le code interm&#233;diaire en code natif afin d&#8217;acc&#233;l&#233;rer l&#8217;ex&#233;cution, d&#8217;un ramasse miettes (Garbage Collector) qui lib&#232;re la m&#233;moire qui n&#8217;est plus utilis&#233;e par le programme, ainsi que d&#8217;autres composants permettant d&#8217;assurer le bon fonctionnement de nos logiciels (s&#233;curit&#233; des applications, interaction avec le syst&#232;me, ...).&lt;br /&gt;
&lt;br /&gt;

La principale diff&#233;rence au niveau de l&#8217;environnement d&#8217;ex&#233;cution est la portabilit&#233; de celui-ci. Alors qu&#8217;il existe une machine virtuelle Java pour la plupart des syst&#232;mes d&#8217;exploitation du march&#233;, la CLR de Microsoft est d&#233;velopp&#233;e uniquement pour Windows. M&#234;me si Microsoft &#224; fait des efforts ces derniers temps pour porter la CLR vers d&#8217;autres syst&#232;mes (notamment gr&#226;ce au projet Mono), la plateforme .NET est loin de poss&#233;der la m&#234;me portabilit&#233; que la plateforme Java.

&lt;h2&gt;Biblioth&#232;ques de base&lt;/h2&gt;

Chacun des deux environnements embarque une biblioth&#232;que de base. Ces biblioth&#232;ques sont des ensembles
de composants pr&#234;ts &#224; l&#8217;emploi, qui permettent de faciliter le d&#233;veloppement d&#8217;applications. Sur les deux
plateformes, nous retrouvons des composants semblables : interfaces graphiques, gestions des entr&#233;es-sorties, gestion de l&#8217;acc&#232;s aux donn&#233;es (bases de donn&#233;es, annuaires LDAP, ...), gestion des processus...&lt;br /&gt;
&lt;br /&gt;

Les principales diff&#233;rences entre les deux ensembles de biblioth&#232;ques embarqu&#233;es se trouvent dans les noms
attribu&#233;s aux classes et aux m&#233;thodes, la plupart des composants pr&#233;sents dans l&#8217;une trouvant son &#233;quivalent
dans l&#8217;autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

Ainsi s&apos;ach&#232;ve ce premier billet portant sur les concepts &#233;l&#233;mentaires de chacune des plateforme. Comme nous l&apos;avons vu, les diff&#233;rences sont assez minimes, et les principes globaux sont communs aux deux environnements.&lt;br /&gt;
&lt;br /&gt;

Dans le prochain billet, nous aborderont les diff&#233;rences qui touchent aux types de donn&#233;es (types primitifs/valeurs, types r&#233;f&#233;rences, &#233;num&#233;rations, ...).</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/java_net_introduction</guid>
    <title>Java/.NET : Introduction</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/java_net_introduction</link>
        <pubDate>Fri, 12 Sep 2008 18:22:29 +0100</pubDate>
    <category>.NET</category>
    <category>.net</category>
    <category>java</category>
            <description>&#199;a y est !&lt;br /&gt;
&lt;br /&gt;

Je viens de finir une (longue) p&#233;riode de formation. J&apos;ai &#233;t&#233; invit&#233; &#224; suivre une formation de trois semaines, qui s&apos;est termin&#233;e aujourd&apos;hui, au &lt;a href=&quot;http://www.supinfo-training.com/&quot;&gt;SUPINFO Training Center&lt;/a&gt;, portant sur les technologies .NET, et en particulier :
&lt;ul&gt;
    &lt;li&gt;Framework .NET 2.0, base du d&#233;veloppement d&#8217;application&lt;/li&gt;
    &lt;li&gt;Windows Forms, Acc&#233;s aux donn&#233;es avec Visual Studio 2005&lt;/li&gt;
    &lt;li&gt;Cr&#233;ation et programmation d&#8217;une application Web ASP.NET 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

&#201;tant formateur Sun (et donc, Java), le but de cette formation &#233;tait de comparer les deux technologies. Loin de moi l&apos;id&#233;e d&apos;abandonner le Java pour me mettre au .NET (j&apos;ai d&#233;j&#224; vendu mon &#226;me :P). Il s&apos;agissait l&#224; d&apos;une ouverture d&apos;esprit, de la d&#233;couverte d&apos;une autre technologie afin de mieux pouvoir d&#233;fendre la sienne.&lt;br /&gt;
&lt;br /&gt;

La formation en elle-m&#234;me &#233;tait tr&#232;s int&#233;ressante. Les deux premi&#232;res semaines (Framework 2.0 et Windows Forms) furent dispens&#233;es par &lt;a href=&quot;http://www.juliencorioland.net/&quot;&gt;Julien Corioland&lt;/a&gt;, la derni&#232;re par Maxime Schneider (je tiens &#224; les remercier tous les deux). Le seul point noir que j&apos;aurais &#224; souligner concerne le cursus en lui m&#234;me, qui portait sur le framework 2.0 alors que la version la plus r&#233;cente est la 3.5, et que les changement entre les deux versions sont importants (&lt;a href=&quot;http://fr.wikipedia.org/wiki/Windows_Presentation_Foundation&quot;&gt;WPF&lt;/a&gt;, &lt;a href=&quot;http://fr.wikipedia.org/wiki/Windows_Communication_Foundation&quot;&gt;WCF&lt;/a&gt;, &lt;a href=&quot;http://fr.wikipedia.org/wiki/LINQ&quot;&gt;Linq&lt;/a&gt;, ...).&lt;br /&gt;
&lt;br /&gt;

J&apos;ai d&#233;j&#224; fait un petit r&#233;sum&#233; de cette formation en 140 caract&#232;res (&lt;a href=&quot;http://twitter.com/Onejjy/statuses/918802404&quot;&gt;&#224; la demande&lt;/a&gt; de &lt;a href=&quot;http://webd.fr/&quot;&gt;Julien Qu&#233;r&#233;&lt;/a&gt;) :
&lt;blockquote&gt;
Il y a quelques fonctionnalit&#233;s interessantes (properties, delegates, ...), mais mon coeur reste chez Java :-)
&lt;/blockquote&gt;
&lt;br /&gt;

Je pense que cette citation est celle qui r&#233;sume le mieux ce que je pense de ces trois derni&#232;res semaines.&lt;br /&gt;
&lt;br /&gt;

Je vais maintenant entamer (continuer serait plus exact, j&apos;ai d&#233;j&#224; un peu commenc&#233; :P) un gros feedback sur ce que j&apos;ai retenu de cette formation : les principales diff&#233;rences entre Java et .NET.&lt;br /&gt;
&lt;br /&gt;

Ceux qui me connaissent le savent, je suis un excellent trolleur. Et ils n&apos;ont pas compl&#232;tement tort. Je vais cependant essayer d&apos;&#234;tre le plus objectif possible :-)&lt;br /&gt;
&lt;br /&gt;

Ce billet est donc le premier d&apos;une s&#233;rie qui relatera les diff&#233;rences que j&apos;ai constat&#233;, retenu, et qui ont, &#224; mon avis, leur importance, pour le d&#233;veloppeur qui souhaite comparer les deux plateformes de d&#233;veloppement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

Petite remarque au passage : Ce billet &#233;tait aussi le billet de la rentr&#233;e. En effet, je n&apos;avais pas publi&#233; de billets, pour des raisons diverses et vari&#233;es, depuis environ deux mois. La rentr&#233;e &#233;tant arriv&#233;e, mon rythme de publication devrait redevenir un peu plus... soutenu :-)</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/r%C3%A9daction_estivale</guid>
    <title>R&#233;daction estivale</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/r%C3%A9daction_estivale</link>
        <pubDate>Tue, 15 Jul 2008 02:34:49 +0100</pubDate>
    <category>General</category>
    <category>blog</category>
            <description>Une fois n&apos;est pas coutume, je vais parler de moi.&lt;br /&gt;
&lt;br /&gt;

Comme ceux qui me suivent fr&#233;quemment ont pu le constater, mon rythme de r&#233;daction s&apos;est &#233;norm&#233;ment ralenti ces derniers temps, principalement depuis le d&#233;but du mois de juin. Je vais essayer d&apos;en expliquer les raisons et de rassurer certains de mes lecteurs pour la suite. La raison pour laquelle je ne blogue plus beaucoup ces derniers temps est presque &#233;vidente.&lt;br /&gt;
&lt;br /&gt;

C&apos;est la fin de l&apos;ann&#233;e scolaire&lt;br /&gt;
&lt;br /&gt;

Les &#233;tudiants sont partis en stage, alors que le mien ne commence que d&#233;but ao&#251;t. Je suis en quelque sorte en vacances. Mon blog est nourri principalement d&apos;&#233;changes avec les gens que je c&#244;toie tous les jours &#224; SUPINFO, avec les &#233;l&#232;ves. Depuis la fin du mois de juin, le nombre de personnes avec lesquelles je discute &quot;Java&quot; &#224; fortement diminu&#233;. D&apos;o&#249; une baisse des questions qui n&#233;cessitent une r&#233;ponse. D&apos;o&#249; une baisse du nombre d&apos;articles sur ce blog.&lt;br /&gt;
&lt;br /&gt;

Mon stage commence pr&#233;cis&#233;ment le 4 ao&#251;t. Mon r&#244;le sera de pr&#233;parer les PEFF (Peut-&#234;tre futurs formateurs, comme dirait &lt;a href=&quot;http://madd0.com/&quot;&gt;Mauricio&lt;/a&gt;) afin qu&apos;ils soient capables de dispenser des cours d&#232;s le mois d&apos;octobre. Ce &quot;stage&quot; s&apos;est r&#233;v&#233;l&#233; tr&#232;s int&#233;ressant l&apos;an dernier, notamment gr&#226;ce &#224; une intervention de &lt;a href=&quot;http://blogs.sun.com/alexismp/&quot;&gt;Alexis Moussine-Pouchkine&lt;/a&gt; sur &lt;a href=&quot;http://glassfish.org/&quot;&gt;GlassFish&lt;/a&gt;. J&apos;esp&#232;re que celui de cette ann&#233;e le sera tout autant. Entour&#233; de geeks du Java, de geeks tout court, j&apos;esp&#232;re pouvoir reprendre mes &#233;changes sur le monde Java, pouvoir reprendre plus activement la r&#233;daction de ce blog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

En attendant le d&#233;but du mois d&apos;ao&#251;t, d&apos;ici deux semaines, je ne bloguerais quasiment pas. Pour ceux qui cherchent d&#233;sesp&#233;r&#233;ment de la lecture, je peux vous conseiller pour l&apos;&#233;t&#233; :
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://dunod.com/pages/ouvrages/ficheouvrage.asp?id=51831&quot;&gt;&quot;EJB 3 - Des concepts &#224; l&apos;&#233;criture du code. Guide du d&#233;veloppeur&quot;&lt;/a&gt;, &#233;crit par le &lt;a href=&quot;http://dunod.com/pages/ouvrages/ficheouvrage.asp?id=51831&quot;&gt;laboratoire Sun&lt;/a&gt; (et auquel j&apos;ai particip&#233;), chez &lt;a href=&quot;http://dunod.com/&quot;&gt;Dunod&lt;/a&gt;. La seconde &#233;dition est sortie il y a &#224; peine quelques jours. Je n&apos;en avais pas encore parl&#233;, voil&#224; qui est chose faite.&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://javablogs.com/&quot;&gt;Java.Blogs&lt;/a&gt;. &#192; mon avis un des meilleurs agr&#233;gateurs de blogs Java, tr&#232;s utile pour se tenir au courant des tendances actuelles.&lt;/li&gt;
&lt;/ul&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/netbeans_6_5_en_approche</guid>
    <title>NetBeans 6.5 en approche</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/netbeans_6_5_en_approche</link>
        <pubDate>Tue, 8 Jul 2008 10:03:03 +0100</pubDate>
    <category>NetBeans</category>
    <category>6.5m1</category>
    <category>sortie</category>
    <category>6.5</category>
    <category>netbeans</category>
            <description>La blogosph&#232;re en parle beaucoup depuis ce matin (&lt;a href=&quot;http://blogs.sun.com/nbprofiler/entry/netbeans_ide_6_5_milestone&quot;&gt;ici&lt;/a&gt;, &lt;a href=&quot;http://cld.blog-city.com/netbeans_65_milestone_1_available___new_features_and_more.htm&quot;&gt;l&#224;&lt;/a&gt;, ou encore &lt;a href=&quot;http://blogs.sun.com/theaquarium/entry/netbeans_6_5_m1_now&quot;&gt;l&#224;&lt;/a&gt;), la premi&#232;re milestone de NetBeans 6.5 est sortie.&lt;br /&gt;
&lt;br /&gt;

L&apos;&lt;a href=&quot;http://www.netbeans.org/servlets/NewsItemView?newsItemID=1254&quot;&gt;annonce officielle&lt;/a&gt; nous propose un petit aper&#231;u des nouvelles fonctionnalit&#233;s.&lt;br /&gt;
&lt;br /&gt;

La nouveaut&#233; majeure de cette version 6.5 semble l&apos;apparition de l&apos;&#233;diteur PHP (&lt;a href=&quot;http://wiki.netbeans.org/NewAndNoteWorthyMilestone1NB65#section-NewAndNoteWorthyMilestone1NB65-PHP&quot;&gt;pr&#233;sentation des fonctionnalit&#233;s&lt;/a&gt;, &lt;a href=&quot;http://www.netbeans.org/kb/docs/php/php-editor-screencast.html&quot;&gt;screencast&lt;/a&gt;, &lt;a href=&quot;http://www.netbeans.org/kb/trails/php.html&quot;&gt;tutorial&lt;/a&gt;). Le blog &lt;a href=&quot;http://blogs.sun.com/netbeansphp/&quot;&gt;NetBeans for PHP&lt;/a&gt; &#224; &#233;galement fait son apparition r&#233;cemment.&lt;br /&gt;
&lt;br /&gt;

D&apos;autres am&#233;liorations sont &#233;galement au programme, notamment en ce qui concerne les &#233;diteurs JavaScript (Ajax), Groovy et Java.&lt;br /&gt;
&lt;br /&gt;

Le meilleur moyen de se faire une id&#233;e reste encore et toujours de la tester par soi m&#234;me. T&#233;l&#233;chargement &lt;a href=&quot;http://bits.netbeans.org/netbeans/6.5/m1/&quot;&gt;ici&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/changement_de_serveur</guid>
    <title>Changement de serveur</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/changement_de_serveur</link>
        <pubDate>Wed, 2 Jul 2008 23:49:40 +0100</pubDate>
    <category>General</category>
    <category>changement</category>
    <category>glassfish</category>
    <category>serveur</category>
    <category>blog</category>
            <description>Si vous lisez ces quelques lignes, c&apos;est que je ne me serais plant&#233; nulle part. Ou du moins que mes erreurs ne sont pas critiques.&lt;br /&gt;
&lt;br /&gt;

La r&#233;siliation de l&apos;abonnement Internet &#233;tant en cours, mon blog, qui &#233;tait jusqu&apos;&#224; pr&#233;sent h&#233;berg&#233; chez moi, avait devant lui des jours qui lui &#233;taient compt&#233;s.&lt;br /&gt;
&lt;br /&gt;

C&apos;est pour cela que j&apos;ai migr&#233; mon installation de Roller vers un nouveau serveur, lou&#233; pour l&apos;&#233;t&#233; (voire plus...) chez &lt;a href=&quot;http://www.ovh.com/&quot;&gt;OVH&lt;/a&gt; (un &lt;a href=&quot;http://www.ovh.com/fr/particulier/produits/kimsufi08.xml&quot;&gt;Kimsufi&lt;/a&gt;, qui me suffit pour l&apos;instant).&lt;br /&gt;
&lt;br /&gt;

A premi&#232;re vue tout marche, j&apos;essayerais de r&#233;parer les &#233;ventuels d&#233;fauts dans les jours &#224; venir... En attendant, bonne lecture :)</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/astuce_java_6_enum_et</guid>
    <title>Astuce Java #6 : Enum et toString</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/astuce_java_6_enum_et</link>
        <pubDate>Fri, 20 Jun 2008 17:01:03 +0100</pubDate>
    <category>Java</category>
    <category>astuce</category>
    <category>tostring</category>
    <category>java</category>
    <category>enum</category>
            <description>Depuis Java 5, le langage Java dispose d&apos;une nouvelle fonctionnalit&#233; : les &#233;num&#233;rations.&lt;br /&gt;
&lt;br /&gt;

Les &#233;num&#233;rations sont des structures permettant de repr&#233;senter une variable ayant un nombre fini de valeurs, comme par exemple le sexe d&apos;une personne, qui sera soit &quot;homme&quot;, soit &quot;femme&quot;.&lt;br /&gt;
&lt;br /&gt;

Les &#233;num&#233;rations sont mises en place de la mani&#232;re suivante :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
enum Sex {
    MALE,
    FEMALE;
}
&lt;/pre&gt;
&lt;br /&gt;

Il est ensuite possible de cr&#233;er des variables du type de l&apos;&#233;num&#233;ration, et de les utiliser :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
Sex sex = Sex.MALE;
System.out.println(sex);
&lt;/pre&gt;
&lt;br /&gt;

Et c&apos;est l&#224; qu&apos;appara&#238;t notre probl&#232;me : la console nous affiche &quot;MALE&quot;. Certes, il s&apos;agit de la bonne valeur, mais la pr&#233;sentation n&apos;est pas tr&#232;s esth&#233;tique. Heureusement pour nous, en Java une &#233;num&#233;ration est &#233;galement un objet. Il nous est possible de d&#233;finir nos propres m&#233;thodes, et aussi de r&#233;crire certaines m&#233;thodes de la classe &lt;code&gt;Object&lt;/code&gt;. Ainsi, on peut avoir le code suivant :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
enum Sex {
    MALE,
    FEMALE;
    
    @Override
    public String toString() {
        switch (this) {
            case MALE:
                return (&quot;Male&quot;);
            case FEMALE:
                return (&quot;Female&quot;);
        }
        throw new RuntimeException(&quot;Invalid value for this&quot;);
    }
}
&lt;/pre&gt;
&lt;br /&gt;

L&apos;ex&#233;cution du m&#234;me code nous donne ainsi &quot;Male&quot; au lieu de &quot;MALE&quot;. On obtient le r&#233;sultat souhait&#233;, &#224; savoir une cha&#238;ne de caract&#232;res plus facilement lisible par l&apos;utilisateur.&lt;br /&gt;
&lt;br /&gt;

Le soucis que l&apos;on rencontre maintenant viens du &lt;code&gt;switch&lt;/code&gt; dans la m&#233;thode &lt;code&gt;toString&lt;/code&gt;. Nous devons g&#233;rer toutes les valeurs possible dans cette m&#233;thode, sous peine de lancer une &lt;code&gt;RuntimeException&lt;/code&gt;.
Une des solutions possibles (que j&apos;ai trouv&#233; dans &lt;a href=&quot;http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html?showComment=1181494800000#c7079865162172472427&quot;&gt;un commentaire&lt;/a&gt; d&apos;un (tr&#232;s) vieux &lt;a href=&quot;http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html&quot;&gt;billet de blog&lt;/a&gt;), et que je trouve de loin ma pr&#233;f&#233;r&#233;e, est de fournir un constructeur &#224; notre &#233;num&#233;ration. Ce constructeur prend en param&#232;tre une cha&#238;ne de caract&#232;res qui sera utilis&#233;e en tant que valeur de retour de la m&#233;thode &lt;code&gt;toString&lt;/code&gt; :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
enum Sex {
    MALE(&quot;Male&quot;),
    FEMALE(&quot;Female&quot;);
    
    private String value;
    
    private Sex(String value) {
        this.value = value;
    }
    
    @Override
    public String toString() {
        return (value);
    }
}
&lt;/pre&gt;
&lt;br /&gt;

Ainsi, nous obtenons on comportement optimal :
&lt;ul&gt;
    &lt;li&gt;Chaque valeur de l&apos;&#233;num&#233;ration renverra une cha&#238;ne de caract&#232;res &quot;esth&#233;tique&quot; repr&#233;sentant sa valeur&lt;/li&gt;
    &lt;li&gt;Chaque valeur &lt;b&gt;devra&lt;/b&gt; poss&#233;der une cha&#238;ne de caract&#232;res (au risque de g&#233;n&#233;rer une erreur de compilation)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

Le probl&#232;me majeur qui est ainsi rencontr&#233; concerne la conversion &#233;num&#233;ration -&gt; cha&#238;ne de caract&#232;res -&gt; &#233;num&#233;ration. La cha&#238;ne de caract&#232;res renvoyait de base par &lt;code&gt;toString&lt;/code&gt; &#233;tait le nom de la constante dans l&apos;&#233;num&#233;ration (MALE ou FEMALE dans notre cas), qui pouvait ensuite &#234;tre reconverti en &#233;num&#233;ration via la m&#233;thode &lt;code&gt;valueOf&lt;/code&gt;. Dans notre cas, la conversion ne se ferra plus puisque &lt;code&gt;toString&lt;/code&gt; ne renverra plus une valeur compr&#233;hensible par &lt;code&gt;valueOf&lt;/code&gt;. Cependant, la m&#233;thode &lt;code&gt;name&lt;/code&gt;, d&#233;finie dans toute &#233;num&#233;ration, renvoie toujours le nom de la constante tel que d&#233;finit dans le code.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/syst%C3%A8me_d_inclusion_en_jsf</guid>
    <title>Syst&#232;me d&apos;inclusion en JSF</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/syst%C3%A8me_d_inclusion_en_jsf</link>
        <pubDate>Fri, 6 Jun 2008 14:55:25 +0100</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>jsf</category>
    <category>javaee</category>
            <description>Pour &#233;viter les erreurs, voici un rapide rappel pour faire de l&apos;inclusion de pages en JSF. Cet article contient un exemple de code classique, puis quelques points &#224; ne pas oublier pour que tout se passe bien.&lt;br /&gt;
&lt;br /&gt;

Le but de cet exemple sera d&apos;avoir une page &lt;code&gt;index.jsp&lt;/code&gt; qui inclue une page &lt;code&gt;content.jsp&lt;/code&gt;.

&lt;h2&gt;&lt;code&gt;index.jsp&lt;/code&gt;&lt;/h2&gt;
&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;
&amp;lt;%@page contentType=&quot;text/html&quot;%&gt;
&amp;lt;%@page pageEncoding=&quot;UTF-8&quot;%&gt;

&amp;lt;%@taglib prefix=&quot;f&quot; uri=&quot;http://java.sun.com/jsf/core&quot;%&gt;
&amp;lt;%@taglib prefix=&quot;h&quot; uri=&quot;http://java.sun.com/jsf/html&quot;%&gt;

&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
   &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;

&amp;lt;html&gt;
    &amp;lt;head&gt;
        &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
        &amp;lt;title&gt;JSP Page&amp;lt;/title&gt;
    &amp;lt;/head&gt;
    &amp;lt;body&gt;
        &amp;lt;f:view&gt;
            &amp;lt;f:subview id=&quot;content&quot;&gt;
                &amp;lt;jsp:include page=&quot;content.jsp&quot; flush=&quot;false&quot; /&gt;
            &amp;lt;/f:subview&gt;
        &amp;lt;/f:view&gt;
    &amp;lt;/body&gt;
&amp;lt;/html&gt;
&lt;/pre&gt;

&lt;h2&gt;&lt;code&gt;content.jsp&lt;/code&gt;&lt;/h2&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;
&amp;lt;%@taglib prefix=&quot;f&quot; uri=&quot;http://java.sun.com/jsf/core&quot;%&gt;
&amp;lt;%@taglib prefix=&quot;h&quot; uri=&quot;http://java.sun.com/jsf/html&quot;%&gt;

&amp;lt;h:outputText value=&quot;Ceci est le contenu !&quot; /&gt;
&lt;/pre&gt;

&lt;h2&gt;Points importants&lt;/h2&gt;

Il existe quelques r&#232;gles assez importantes pour que ce syst&#232;me d&apos;inclusion de page marche correctement :
&lt;ul&gt;
    &lt;li&gt;Dans la page de base, entourer l&apos;inclusion avec une balise &lt;code&gt;&amp;lt;f:subview /&gt;&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;Lors de l&apos;inclusion, penser &#224; mettre l&apos;attribut &lt;code&gt;flush&lt;/code&gt; &#224; &lt;code&gt;false&lt;/code&gt;. Cet attribut existe sur la plupart des balises permettant l&apos;inclusion de pages.&lt;/li&gt;
    &lt;li&gt;Dans la page de destination, r&#233;utiliser les composants JSF directement, sans remettre de balise &lt;code&gt;&amp;lt;f:view /&gt;&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;Les taglibs doivent quand &#224; elles &#234;tre r&#233;import&#233;es.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

Et voil&#224; le r&#233;sultat (en HTML) :
&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;
&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
   &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;

&amp;lt;html&gt;
    &amp;lt;head&gt;
        &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
        &amp;lt;title&gt;JSP Page&amp;lt;/title&gt;
    &amp;lt;/head&gt;

    &amp;lt;body&gt;
        Ceci est le contenu !
    &amp;lt;/body&gt;
&amp;lt;/html&gt;
&lt;/pre&gt;
&lt;br /&gt;

&lt;a href=&quot;http://martin.filliau.com/blog/&quot;&gt;Martin&lt;/a&gt; en &lt;a href=&quot;http://martin.filliau.com/blog/2008/06/06/inserer-une-page-jsf-dans-une-autre-page-jsf/&quot;&gt;parle &#233;galement&lt;/a&gt;.
</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/optimisation_utilisation_d_un_pool</guid>
    <title>Optimisation : Utilisation d&apos;un pool d&apos;objets</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/optimisation_utilisation_d_un_pool</link>
        <pubDate>Sat, 31 May 2008 20:30:11 +0100</pubDate>
    <category>Java</category>
    <category>optimisation</category>
    <category>pool</category>
    <category>java</category>
            <description>J&apos;ai lu r&#233;cemment une s&#233;rie d&apos;articles&lt;sup&gt;&lt;a href=&quot;http://javabyexample.wisdomplug.com/java-concepts/51-make-your-java-applications-run-faster-part-1-compiler-optimizations.html&quot;&gt;1&lt;/a&gt; &lt;a href=&quot;http://javabyexample.wisdomplug.com/java-concepts/34-core-java/52-make-your-java-applications-run-faster-part-2-general-optimization-techniques.html&quot;&gt;2&lt;/a&gt; &lt;a href=&quot;http://javabyexample.wisdomplug.com/java-concepts/34-core-java/53-make-your-java-applications-run-faster-part-3-variables-and-arrays.html&quot;&gt;3&lt;/a&gt; &lt;a href=&quot;http://javabyexample.wisdomplug.com/java-concepts/34-core-java/54-make-your-java-applications-run-faster-part-4-methods-synchronization-instantiation-casting-exceptions-and-threads.html&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; tr&#232;s int&#233;ressants ayant pour sujet l&apos;optimisation des programmes Java. La &lt;a href=&quot;http://javabyexample.wisdomplug.com/java-concepts/34-core-java/54-make-your-java-applications-run-faster-part-4-methods-synchronization-instantiation-casting-exceptions-and-threads.html&quot;&gt;derni&#232;re partie&lt;/a&gt; parlait de la r&#233;utilisation des objets. Un exemple montrait qu&apos;il &#233;tait plus performant de vider un &lt;code&gt;ArrayList&lt;/code&gt; que de cr&#233;er une nouvelle instance :&lt;br /&gt;
&lt;br /&gt;

&lt;div style=&quot;float: left; width: 48%;&quot;&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
for (int i = 0; i &lt; 10; i++) {
    ArrayList list = new ArrayList();
    // Do some stuff...
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;float: right; width: 48%;&quot;&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
ArrayList list = new ArrayList();
for (int i = 0; i &lt; 10; i++) {
    // Do some stuff...
    list.clear();
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br style=&quot;clear: both;&quot; /&gt;

Dans notre cas, appeler un constructeur est plus co&#251;teux en temps processeur que de simplement supprimer tous les &#233;l&#233;ments de notre liste (la raison &lt;a href=&quot;http://groups.google.com/group/comp.lang.java.programmer/browse_thread/thread/dc794c1cf33cda1b#&quot;&gt;a &#233;t&#233; discut&#233;e&lt;/a&gt; sur &lt;a href=&quot;http://groups.google.com/group/comp.lang.java.programmer/topics&quot;&gt;comp.lang.java.programmer&lt;/a&gt;). Le code de droite est donc plus rapide &#224; l&apos;ex&#233;cution.&lt;br /&gt;
&lt;br /&gt;

J&apos;ai alors eu l&apos;id&#233;e de me lancer dans la cr&#233;ation d&apos;un pool d&apos;objets. Dans le cas des &lt;code&gt;ArrayList&lt;/code&gt;, le but serait de vider notre instance et de la conserver en attendant de la r&#233;utiliser plus tard.&lt;br /&gt;
&lt;br /&gt;

J&apos;ai donc test&#233; le code suivant :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public class ArrayListPool&amp;lt;T&gt; {

    private Queue&amp;lt;ArrayList&amp;lt;T&gt;&gt; pool;
    
    public ArrayListPool() {
        pool = new LinkedList&amp;lt;ArrayList&amp;lt;T&gt;&gt;();
    }
    
    public ArrayList&amp;lt;T&gt; getArrayList() {
        synchronized (pool) {
            if (!pool.isEmpty()) {
                return (pool.poll());
            }
        }
        return (new ArrayList&amp;lt;T&gt;());
    }
    
    public void releaseArrayList(ArrayList&amp;lt;T&gt; list) {
        list.clear();
        synchronized (pool) {
            pool.offer(list);
        }
    }
    
    public void clear() {
        synchronized (pool) {
            pool.clear();
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;

Le but est d&apos;appeler &lt;code&gt;getArrayList&lt;/code&gt; pour obtenir une instance d&apos;un &lt;code&gt;ArrayList&lt;/code&gt;, et de la passer en param&#232;tre &#224; la m&#233;thode &lt;code&gt;releaseArrayList&lt;/code&gt; pour la remettre dans le pool et la r&#233;utiliser au besoin.&lt;br /&gt;
&lt;br /&gt;

Concernant les d&#233;tails de fonctionnement, je me suis servi d&apos;une &lt;code&gt;LinkedList&lt;/code&gt; pour stocker les objets &#224; r&#233;utiliser. Cette impl&#233;mentation de &lt;code&gt;Queue&lt;/code&gt; est bas&#233;e sur une liste cha&#238;n&#233;e, ainsi les insertion et les suppressions d&apos;&#233;l&#233;ments dans le pool sont tr&#232;s rapides.&lt;br /&gt;
&lt;br /&gt;

Enfin, l&apos;utilisation de ce pool. &#192; gauche, le code de base, qui servira de benchmark par la suite. &#192; droite, le code modifi&#233; pour utiliser le pool.

&lt;div style=&quot;float: left; width: 48%;&quot;&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
ThreadGroup group2 = new ThreadGroup(&quot;Group 2&quot;);
for (int i = 0; i &lt; threadCount; i++) {
    Thread t = new Thread(group2, &quot;Thread &quot; + i) {
        @Override
        public void run() {
            for (int i = 0; i &lt; listCount; i++) {
                ArrayList&amp;lt;Object&gt; list = new ArrayList&amp;lt;Object&gt;();
                for (int j = 0; j &lt; objectCount; j++) {
                    list.add(new Object());
                }
            }
        }
    };
    t.start();
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;float: right; width: 48%;&quot;&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
final ArrayListPool&amp;lt;Object&gt; pool = new ArrayListPool&amp;lt;Object&gt;();
ThreadGroup group1 = new ThreadGroup(&quot;Group 1&quot;);
for (int i = 0; i &lt; threadCount; i++) {
    Thread t = new Thread(group1, &quot;Thread &quot; + i) {
        @Override
        public void run() {
            for (int i = 0; i &lt; listCount; i++) {
                ArrayList&amp;lt;Object&gt; list = pool.getArrayList();
                for (int j = 0; j &lt; objectCount; j++) {
                    list.add(new Object());
                }
                pool.releaseArrayList(list);
            }
        }
    };
    t.start();
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br style=&quot;clear: both;&quot; /&gt;

Apr&#232;s ex&#233;cution de ce code en tant que benchmark, voici les r&#233;sultats :&lt;br /&gt;&lt;br /&gt;
&lt;center&gt;
&lt;table border=&quot;1&quot; style=&quot;border-collapse: collapse; font-size: 1em;&quot;&gt;
    &lt;tr&gt;
        &lt;td&gt;threadCount&lt;/td&gt;
        &lt;td&gt;listCount&lt;/td&gt;
        &lt;td&gt;objectCount&lt;/td&gt;
        &lt;td&gt;Temps avec pool (ms)&lt;/td&gt;
        &lt;td&gt;Temps sans pool (ms)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;65&lt;/td&gt;
        &lt;td&gt;82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;100000&lt;/td&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;1961&lt;/td&gt;
        &lt;td&gt;2051&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;100000&lt;/td&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;17484&lt;/td&gt;
        &lt;td&gt;24950&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;

Le temps d&apos;ex&#233;cution est l&#233;g&#232;rement r&#233;duit. En contrepartie, apr&#232;s analyse de l&apos;application de test gr&#226;ce au Profiler de NetBeans, la consommation m&#233;moire est d&apos;environ 2 Mo suppl&#233;mentaires pour 100 objets en attente dans le pool. Cette solution est donc int&#233;ressante &#224; mettre en place pour des objets dont l&apos;instanciation est tr&#232;s fr&#233;quente. Dans le cas o&#249; les instanciations se font plus rares, le gain en temps CPU est n&#233;gligeable, et la consommation m&#233;moire est plus &#233;tal&#233;e dans le temps.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/glassfish_v3tp2</guid>
    <title>GlassFish v3tp2</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/glassfish_v3tp2</link>
        <pubDate>Fri, 30 May 2008 18:06:10 +0100</pubDate>
    <category>GlassFish</category>
    <category>glassfish</category>
            <description>Je sais que &lt;a href=&quot;http://glassfish.dev.java.net/&quot;&gt;GlassFish&lt;/a&gt; &lt;a href=&quot;https://glassfish.dev.java.net/downloads/install/v3-preview2.html&quot;&gt;v3tp2&lt;/a&gt; est sorti depuis un petit bout de temps, mais je viens juste de le t&#233;l&#233;charger...&lt;br /&gt;
&lt;br /&gt;

Ma premi&#232;re impression ?&lt;br /&gt;
&lt;br /&gt;

&#199;a fait vraiment tr&#232;s bizarre :
&lt;pre&gt;
viv@Eudoxe:~/Programs/glassfish-v3tp2$ time ./bin/asadmin start-domain
Command start-domain executed successfully.

real	0m0.976s
user	0m0.720s
sys	0m0.056s
viv@Eudoxe:~/Programs/glassfish-v3tp2$ time ./bin/asadmin stop-domain
Command stop-domain executed successfully.

real	0m0.553s
user	0m0.640s
sys	0m0.056s
&lt;/pre&gt;
&lt;br /&gt;

Temps de d&#233;marrage de moins de une seconde, temps d&apos;arr&#234;t d&apos;environ une demi seconde...&lt;br /&gt;
&lt;br /&gt;

Sinon, les premi&#232;res choses qui changent :
&lt;ul&gt;
    &lt;li&gt;L&apos;URL de l&apos;interface d&apos;administration. &#199;a para&#238;t b&#234;te, mais j&apos;ai mit bien 5 minutes &#224; trouver la nouvelle (&lt;a href=&quot;http://localhost:8080/admin&quot;&gt;&lt;code&gt;http://localhost:8080/admin&lt;/code&gt;&lt;/a&gt;)&lt;/li&gt;
    &lt;li&gt;Un d&#233;ploiement d&apos;applications bien plus rapide qu&apos;avant&lt;/li&gt;
    &lt;li&gt;Le changement de fournisseur de persistance. GlassFish est pass&#233; de &lt;a href=&quot;http://www.oracle.com/technology/products/ias/toplink/index.html&quot;&gt;Toplink&lt;/a&gt; &#224; &lt;a href=&quot;http://www.eclipse.org/eclipselink/&quot;&gt;EclipseLink&lt;/a&gt;, donc quelques petites modifications sont &#224; faire dans les fichiers de configuration des applications sp&#233;cifiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;

Le temps de tester un peu plus en profondeur et je pourrais donner un avis un peu plus complet, mais pour l&apos;instant, je suis plut&#244;t enthousiaste :)</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/utiliser_un_certificat_ssl_avec</guid>
    <title>Utiliser un certificat SSL avec GlassFish</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/utiliser_un_certificat_ssl_avec</link>
        <pubDate>Wed, 28 May 2008 19:11:16 +0100</pubDate>
    <category>GlassFish</category>
    <category>ssl</category>
    <category>glassfish</category>
            <description>Apr&#232;s de nombreuses tentatives, c&apos;est enfin fait ! Le certificat &lt;a href=&quot;http://fr.wikipedia.org/wiki/SSL&quot;&gt;SSL&lt;/a&gt; de &lt;code&gt;*.aperigeek.com&lt;/code&gt; est valide.&lt;br /&gt;
&lt;br /&gt;

Voici les diff&#233;rentes &#233;tapes de mon aventure :&lt;br /&gt;
&lt;em&gt;Pour information, mon serveur GlassFish utilise JKS en tant que KeyStore. Il s&apos;agit du KeyStore par d&#233;faut sur une installation basique de GlassFish.&lt;/em&gt;

&lt;h2&gt;G&#233;n&#233;rer une paire de cl&#233;s&lt;/h2&gt;
Le JDK embarque un outil permettant de g&#233;rer les KeyStore de type JKS. Cet outil porte le doux nom de &lt;code&gt;keytool&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;

La premi&#232;re &#233;tape est donc de g&#233;n&#233;rer une paire de cl&#233;s. Ces cl&#233;s seront utilis&#233;es pour chiffrer les donn&#233;es entre le client et le serveur.&lt;br /&gt;
&lt;br /&gt;

Pour g&#233;n&#233;rer une paire de cl&#233;s, la commande magique est :
&lt;pre&gt;
$ keytool -genkeypair -keyalg &lt;em&gt;&amp;lt;algorithm&gt;&lt;/em&gt; -keystore &lt;em&gt;&amp;lt;keystore&gt;&lt;/em&gt; -validity &lt;em&gt;&amp;lt;validity&gt;&lt;/em&gt; -alias &lt;em&gt;&amp;lt;alias&gt;&lt;/em&gt;
&lt;/pre&gt;
&lt;em&gt;Petite note : Pour les utilisateurs du JDK 5, l&apos;option &lt;code&gt;-genkeypair&lt;/code&gt; est &#224; remplacer par &lt;code&gt;-genkey&lt;/code&gt;.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;

Les options &#224; fournir :
&lt;ul&gt;
    &lt;li&gt;&lt;em&gt;&amp;lt;algorithm&gt;&lt;/em&gt; corresponds &#224; l&apos;algorithme utilis&#233; pour g&#233;n&#233;rer les cl&#233;s (RSA, par exemple).&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;&amp;lt;keystore&gt;&lt;/em&gt; corresponds au fichier contenant les cl&#233;s du serveur. Par d&#233;fault, ce fichier s&apos;appelle &lt;code&gt;keystore.pks&lt;/code&gt; et est stock&#233; dans &lt;code&gt;domains/domain/config&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;&amp;lt;validity&gt;&lt;/em&gt; corresponds au temps de validit&#233; du certificat, en jour (365 pour un an, par exemple).&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;&amp;lt;alias&gt;&lt;/em&gt; corresponds au nom que vous souhaitez donner au certificat. Ce nom sera r&#233;utilis&#233; par la suite pour d&#233;signer ce certificat &#224; l&apos;int&#233;rieur du serveur d&apos;application.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

&lt;code&gt;keytool&lt;/code&gt; vous posera plusieurs questions, notamment :
&lt;ul&gt;
    &lt;li&gt;Le mot de passe du KeyStore (par d&#233;faut, le mot de passe du KeyStore est &lt;code&gt;changeit&lt;/code&gt;).&lt;/li&gt;
    &lt;li&gt;Un CN (Common Name). Mettez le nom de domaine pour lequel vous souhaitez cr&#233;er un certificat (il est possible d&apos;utiliser un wildcard, comme par exemple &lt;code&gt;*.aperigeek.com&lt;/code&gt; pour tous les sous domaines aperigeek.com).&lt;/li&gt;
    &lt;li&gt;Les autres informations n&apos;influent pas sur le certificat en lui m&#234;me.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;G&#233;n&#233;rer une demande de certificat (CSR : Certificate Signing Request)&lt;/h2&gt;

Ce fichier CSR va permettre d&apos;effectuer une demande de certificat aupr&#232;s d&apos;une &lt;a href=&quot;http://fr.wikipedia.org/wiki/Autorit%C3%A9_de_certification&quot;&gt;autorit&#233; de certification&lt;/a&gt;. Ce certificat permettra de justifier de l&apos;identit&#233; du serveur aupr&#232;s du client (afin d&apos;&#233;viter certaines attaques de type &lt;a href=&quot;http://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu&quot;&gt;Man in the Middle&lt;/a&gt;, par exemple).&lt;br /&gt;
&lt;br /&gt;

&lt;code&gt;keytool&lt;/code&gt; permet de g&#233;n&#233;rer cette demande de certificat. La commande est :
&lt;pre&gt;
keytool -certreq -alias &lt;em&gt;&amp;lt;alias&gt;&lt;/em&gt; -file &lt;em&gt;&amp;lt;file&gt;&lt;/em&gt; -keystore &lt;em&gt;&amp;lt;keystore&gt;&lt;/em&gt;
&lt;/pre&gt;
&lt;br /&gt;

Avec les options :
&lt;ul&gt;
    &lt;li&gt;&lt;em&gt;&amp;lt;alias&gt;&lt;/em&gt; corresponds au nom de votre certificat, celui que vous avez choisi dans la premi&#232;re &#233;tape.&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;&amp;lt;file&gt;&lt;/em&gt; corresponds au fichier qui contiendra votre demande de certificat.&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;&amp;lt;keystore&gt;&lt;/em&gt; &#224; votre KeyStore, le m&#234;me que dans la premi&#232;re &#233;tape.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

Gr&#226;ce &#224; cette demande de certificat, nous allons pouvoir maintenant demander un certificat &#224; une autorit&#233; de certification.

&lt;h2&gt;Demander un certificat &#224; une CA&lt;/h2&gt;

Libre &#224; vous de choisir une autorit&#233; de certification (CA). J&apos;ai choisi &lt;a href=&quot;http://www.cacert.org&quot;&gt;CAcert.org&lt;/a&gt;, car il s&apos;agit d&apos;une des rares autorit&#233; de certifications fournissant des certificats gratuitement.&lt;br /&gt;
&lt;br /&gt;

La demande du certificat d&#233;pend ensuite de l&apos;autorit&#233; que vous avez choisi. Il se peut que l&apos;autorit&#233; de certification vous demande de la rajouter dans en tant que telle dans votre navigateur. Une fois votre certificat cr&#233;&#233;, vous allez pouvoir le r&#233;cup&#233;rer sois sous la forme d&apos;un fichier &lt;code&gt;.cert&lt;/code&gt;, sois sous sa forme textuelle. Dans le deuxi&#232;me cas, nous allons devoir copier le texte du certificat (y compris les balises &lt;code&gt;-----BEGIN&amp;nbsp;CERTIFICATE-----&lt;/code&gt; et &lt;code&gt;-----END&amp;nbsp;CERTIFICATE-----&lt;/code&gt;).

&lt;h2&gt;Ins&#233;rer le certificat dans le KeyStore du serveur&lt;/h2&gt;

Cette &#233;tape est assez complexe &#224; r&#233;aliser avec &lt;code&gt;keytool&lt;/code&gt;, j&apos;ai donc pour ma part utilis&#233; ce code Java :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public class InsertCert {
    public static void main(String[] args) {
        try {
            String certFile = &quot;aperigeek.cert&quot;;
            String certName = &quot;*.aperigeek.com&quot;;
            String keyStoreFile = &quot;keystore.pks&quot;;
            String keyStorePassword = &quot;changeit&quot;;
            
            CertificateFactory certFactory = CertificateFactory.getInstance(&quot;X.509&quot;);
            Certificate cert = certFactory.generateCertificate(new FileInputStream(certFile));
            KeyStore keyStore = KeyStore.getInstance(&quot;JKS&quot;);
            keyStore.load(new FileInputStream(keyStoreFile), keyStorePassword.toCharArray());
            Key key = keyStore.getKey(certName, keyStorePassword.toCharArray());
            keyStore.setKeyEntry(certName, key, keyStorePassword.toCharArray(), new Certificate[]{cert});
            keyStore.store(new FileOutputStream(keyStoreFile), keyStorePassword.toCharArray());
        } catch (Exception ex) {
            Logger.getLogger(InsertCert.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
&lt;/pre&gt;
&lt;em&gt;(inspir&#233; de &lt;a href=&quot;http://blogs.sun.com/enterprisetechtips/entry/using_ssl_with_glassfish_v2&quot;&gt;Using SSL with GlassFish v2 : Enterprise Tech Tips&lt;/a&gt;)&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;

Les variables &#224; remplacer :
&lt;ul&gt;
    &lt;li&gt;&lt;code&gt;certFile&lt;/code&gt; : le nom du fichier contenant le certificat, fourni par l&apos;autorit&#233; de certification.&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;certName&lt;/code&gt; : le nom du certificat, que vous lui avez donn&#233; &#224; l&apos;&#233;tape 1&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;keyStoreFile&lt;/code&gt; : le nom du KeyStore&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;keyStorePassword&lt;/code&gt; : le mot de passe du KeyStore&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;

Apr&#232;s ex&#233;cution de ce morceau de code, voil&#224; votre nouveau certificat entr&#233; dans la base de certificats de votre serveur d&apos;applications. Il ne reste plus qu&apos;&#224; configurer GlassFish pour utiliser ce nouveau certificat !

&lt;h2&gt;Configuration du service HTTP&lt;/h2&gt;

Dans la console d&apos;administration de GlassFish :
&lt;ul&gt;
    &lt;li&gt;Dans l&apos;arbre : Configuration, Service HTTP, Listeners HTTP, nom-du-listeneur&lt;/li&gt;
    &lt;li&gt;Onglet SSL :
        &lt;ul&gt;
            &lt;li&gt;Certificate Nickname : nom du certificat (que vous lui avez donn&#233; &#224; l&apos;&#233;tape 1)&lt;/li&gt;
            &lt;li&gt;Cocher SSL3 et TLS&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Onglet HTTP Listener :
        &lt;ul&gt;
            &lt;li&gt;Cocher Security Enabled&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Red&#233;marrer GlassFish&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;

Et voil&#224; le r&#233;sultat. Vous pouvez maintenant consulter &lt;a href=&quot;http://blog.aperigeek.com/viv/&quot;&gt;mon blog&lt;/a&gt; en &lt;a href=&quot;https://blog.aperigeek.com/viv/&quot;&gt;HTTPS&lt;/a&gt; avec un certificat valide, si le c&amp;oelig;ur vous en dit.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/ex%C3%A9cuter_du_javascript_en_java</guid>
    <title>Ex&#233;cuter du JavaScript en Java</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/ex%C3%A9cuter_du_javascript_en_java</link>
        <pubDate>Sun, 25 May 2008 17:56:20 +0100</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>javascript</category>
            <description>Suite &#224; un &lt;a href=&quot;http://groups.google.com/group/comp.lang.java.programmer/browse_thread/thread/ef30e210a1f3492f&quot;&gt;sujet&lt;/a&gt; sur le forum &lt;a href=&quot;http://groups.google.com/group/comp.lang.java.programmer/topics&quot;&gt;comp.lang.java.programmer&lt;/a&gt;, j&apos;ai fait quelque recherches sur l&apos;ex&#233;cution de scripts (en particulier JavaScript) dans un environnement Java SE.&lt;br /&gt;
&lt;br /&gt;

L&apos;ex&#233;cution de scripts dans un environnement Java est fourni par le package &lt;a href=&quot;http://java.sun.com/javase/6/docs/api/javax/script/package-summary.html&quot;&gt;&lt;code&gt;javax.script&lt;/code&gt;&lt;/a&gt; (depuis Java 6). Un moteur de script est d&#233;fini par l&apos;interface &lt;a href=&quot;http://java.sun.com/javase/6/docs/api/javax/script/ScriptEngine.html&quot;&gt;&lt;code&gt;ScriptEngine&lt;/code&gt;&lt;/a&gt;, dont l&apos;impl&#233;mentation nous est fournie par la classe &lt;a href=&quot;http://java.sun.com/javase/6/docs/api/javax/script/ScriptEngineManager.html&quot;&gt;&lt;code&gt;ScriptEngineManager&lt;/code&gt;&lt;/a&gt;.

Voici donc &#224; quoi ressemble l&apos;ex&#233;cution de code JavaScript dans un environnement Java.&lt;br /&gt;
&lt;br /&gt;

&lt;h2&gt;1. Ex&#233;cution simple de script&lt;/h2&gt;

Dans un premier temps, cet exemple montre comment ex&#233;cuter un script simple. Le but est d&apos;ex&#233;cuter le code JS suivant :
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
function myFunction() {
    return (4 + 5);
}
myFunction();
&lt;/pre&gt;
&lt;br /&gt;

Le but de ce code est de d&#233;clarer une m&#233;thode qui renvoie le r&#233;sultat de 4 + 5, puis d&apos;appeler cette m&#233;thode.&lt;br /&gt;
&lt;br /&gt;

Voici maintenant l&apos;ex&#233;cution du m&#234;me code en Java, en affichant le r&#233;sultat sur la sortie standard :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public static void main(String[] args) {
    try {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName(&quot;JavaScript&quot;);
        String myJSCode = new StringBuffer()
                .append(&quot;function myFunction() {&quot;)
                .append(&quot;return (4 + 5);&quot;)
                .append(&quot;}&quot;)
                .append(&quot;myFunction();&quot;).toString();
        System.out.println(engine.eval(myJSCode));
    } catch (ScriptException ex) {
        ex.printStackTrace();
    }
}
&lt;/pre&gt;
&lt;br /&gt;

Il est &#233;galement possible de s&#233;parer la d&#233;claration de la m&#233;thode de l&apos;appel, ce qui permet plus de modularit&#233; (par exemple, nous d&#233;clarons une m&#233;thode une seule fois pour l&apos;appeler plusieurs fois) :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public static void main(String[] args) {
    try {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName(&quot;JavaScript&quot;);
        String myJSCode = new StringBuffer()
                .append(&quot;var i = 12;&quot;)
                .append(&quot;function myFunction() {&quot;)
                .append(&quot;return (i++);&quot;)
                .append(&quot;}&quot;).toString();
        engine.eval(myJSCode);
        System.out.println(engine.eval(&quot;myFunction();&quot;));
        System.out.println(engine.eval(&quot;myFunction();&quot;));
        System.out.println(engine.eval(&quot;myFunction();&quot;));
    } catch (ScriptException ex) {
        ex.printStackTrace();
    }
}
&lt;/pre&gt;
&lt;br /&gt;

L&apos;ex&#233;cution de script est donc tr&#232;s simple.

&lt;h2&gt;2. Partage de variables&lt;/h2&gt;

En plus d&apos;&#234;tre simple, l&apos;ex&#233;cution de scripts est &#233;galement tr&#232;s puissante. Il est possible de partager des r&#233;f&#233;rences vers des objets entre notre code Java et notre code JavaScript.&lt;br /&gt;
&lt;br /&gt;

Un petit exemple simple, mettant en sc&#232;ne un &lt;code&gt;StringBuffer&lt;/code&gt; dans lequel nous allons rajouter des donn&#233;es en JavaScript :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public static void main(String[] args) {
    try {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName(&quot;JavaScript&quot;);
        StringBuffer s = new StringBuffer();
        engine.put(&quot;s&quot;, s);
        engine.eval(&quot;s.append(&apos;toto&apos;);&quot;);
        System.out.println(s.toString());
    } catch (ScriptException ex) {
        ex.printStackTrace();
    }
}
&lt;/pre&gt;
&lt;br /&gt;

Il est donc possible de modifier des objets Java directement &#224; l&apos;int&#233;rieur de notre moteur de script.&lt;br /&gt;
&lt;br /&gt;

Enfin, un dernier point concerne les objets immuables (comme la classe String, par exemple). En effet, une instance de String ne peut pas changer de contenu. Un nouvel objet doit &#234;tre cr&#233;&#233;. Dans ce cas, il est possible de r&#233;cup&#233;rer un objet cr&#233;&#233; dans notre script :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
public static void main(String[] args) {
    try {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName(&quot;JavaScript&quot;);
        String str = &quot;toto&quot;;
        engine.put(&quot;str&quot;, str);
        engine.eval(&quot;str = str.concat(&apos; tata&apos;);&quot;);
        str = (String) engine.get(&quot;str&quot;);
        System.out.println(str);
    } catch (ScriptException ex) {
        ex.printStackTrace();
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;

L&apos;ex&#233;cution de scripts est donc assez ais&#233;e dans un environnement Java 6. L&apos;API permettant cette ex&#233;cution est &#224; la fois simple et puissante, puisqu&apos;elle permet m&#234;me la modification d&apos;objets Java.&lt;br /&gt;
&lt;br /&gt;

Seul b&#233;mol, sur ma machine (JVM 1.6.0_06-b02, sous Linux), il semblerais que le moteur de JavaScript soit le seul disponible...</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/nouveau_th%C3%A8me_pour_mon_blog</guid>
    <title>Nouveau th&#232;me pour mon blog</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/nouveau_th%C3%A8me_pour_mon_blog</link>
        <pubDate>Sat, 24 May 2008 14:15:01 +0100</pubDate>
    <category>General</category>
    <category>th&#232;me</category>
    <category>blog</category>
            <description>Et oui &lt;a href=&quot;http://blog.keitboor.com/&quot;&gt;Keitboor&lt;/a&gt;, &lt;a href=&quot;http://blog.matthieudordolo.com/&quot;&gt;Matt&lt;/a&gt; t&apos;a d&#233;nonc&#233; ! Il m&apos;a avou&#233; ce que tu pensais de mon ancien th&#232;me. Et je te l&apos;accorde, il n&apos;&#233;tait pas tr&#232;s esth&#233;tique.&lt;br /&gt;
&lt;br /&gt;

Mais maintenant, ce n&apos;est plus le cas !&lt;br /&gt;
&lt;br /&gt;

J&apos;ai d&#233;cid&#233; d&apos;abandonner Basic, le th&#232;me par d&#233;faut de &lt;a href=&quot;http://roller.apache.org/&quot;&gt;Roller&lt;/a&gt;, et d&apos;en utiliser un plus frais, &lt;a href=&quot;http://www.freecsstemplates.org/preview/unqualified&quot;&gt;unqualified&lt;/a&gt;, un des nombreux th&#232;mes propos&#233;s par &lt;a href=&quot;http://www.freecsstemplates.org/&quot;&gt;freeCSStemplates.org&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;

En esp&#233;rant qu&apos;il vous plaise &#224; vous aussi (vous, mes quelques lecteurs).</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/astuce_java_5_for_each</guid>
    <title>Astuce Java #5 : for-each sur une map</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/astuce_java_5_for_each</link>
        <pubDate>Tue, 20 May 2008 01:32:47 +0100</pubDate>
    <category>Java</category>
    <category>astuce</category>
    <category>java</category>
    <category>map</category>
    <category>for-each</category>
            <description>Petite astuce pour iterer sur une &lt;code&gt;Map&lt;/code&gt; dans une boucle for-each, en attendant &lt;a href=&quot;http://blog.aperigeek.com/viv/entry/java_7_am%C3%A9lioration_de_la1&quot;&gt;Java 7&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;

Il s&apos;agit de consid&#233;rer une &lt;code&gt;Map&lt;/code&gt; comme une collection de &lt;code&gt;Map.Entry&lt;/code&gt; :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
Map&amp;lt;Integer, String&gt; myMap = new HashMap&amp;lt;Integer, String&gt;();
// ...
for (Map.Entry entry : myMap.entrySet()) {
    System.out.println(entry.getKey() + &quot;=&quot; + entry.getValue());
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;

Via &lt;a href=&quot;http://jtoee.blogspot.com/2008/05/better-way-to-iterate-java-maps.html&quot;&gt;A better way to iterate java maps&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">http://blog.aperigeek.com/viv/entry/premiers_pas_avec_lucene_recherche</guid>
    <title>Premiers pas avec Lucene : Recherche dans l&apos;index</title>
    <dc:creator>Vivien Barousse</dc:creator>
    <link>http://blog.aperigeek.com/viv/entry/premiers_pas_avec_lucene_recherche</link>
        <pubDate>Mon, 19 May 2008 20:26:35 +0100</pubDate>
    <category>Java</category>
    <category>indexation</category>
    <category>apache</category>
    <category>java</category>
    <category>lucene</category>
    <category>recherche</category>
            <description>Dans la continuit&#233; de l&apos;&lt;a href=&quot;http://blog.aperigeek.com/viv/entry/premiers_pas_avec_lucene_cr%C3%A9ation&quot;&gt;entr&#233;e pr&#233;c&#233;dente&lt;/a&gt;, qui parlait de l&apos;indexation de donn&#233;es avec Lucene, je vais aujourd&apos;hui parler des &lt;code&gt;Query&lt;/code&gt;, les objets permettant de faire des requ&#234;tes de recherche dans l&apos;index.&lt;br /&gt;
&lt;br /&gt;

Prenons un petit exemple ; dans l&apos;index que nous avons cr&#233;&#233; hier, essayons de rechercher les documents dont le &lt;code&gt;content&lt;/code&gt; contient le mot-cl&#233; &quot;Java&quot;.&lt;br /&gt;
&lt;br /&gt;

Les diff&#233;rentes &#233;tapes &#224; suivre dont les suivantes :
&lt;ol&gt;
    &lt;li&gt;Cr&#233;er un &lt;code&gt;IndexReader&lt;/code&gt;, un objet capable de lire l&apos;index.&lt;/li&gt;
    &lt;li&gt;Cr&#233;er un objet de type &lt;code&gt;IndexSearcher&lt;/code&gt;, un objet capable de faire une recherche dans un index, &#224; travers un &lt;code&gt;IndexReader&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Cr&#233;er un objet de type &lt;code&gt;QueryParser&lt;/code&gt;. Cet objet va parser la requ&#234;te pass&#233;e, et l&apos;interpr&#233;ter afin de fournir les r&#233;sultats les plus pertinents.&lt;/li&gt;
    &lt;li&gt;Parser la requ&#234;te, nous obtiendrons un objet de type &lt;code&gt;Query&lt;/code&gt;, contenant la requ&#234;te &#224; ex&#233;cuter.&lt;/li&gt;
    &lt;li&gt;Ex&#233;cuter la requ&#234;te, qui nous renvera une liste de r&#233;sultats (sous la forme d&apos;un objet de type &lt;code&gt;Hits&lt;/code&gt;, contenant les r&#233;sultats.&lt;/li&gt;
    &lt;li&gt;It&#233;rer sur cette liste, afin d&apos;afficher les r&#233;sultats de notre recherche.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;

Un petit exemple de code pour concr&#233;tiser tout &#231;a :
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
IndexReader index = IndexReader.open(INDEX_ROOT);
Searcher searcher = new IndexSearcher(index);
QueryParser parser = new QueryParser(&quot;content&quot;, new StandardAnalyzer());
Query results = parser.parse(&quot;Java&quot;);
Hits hits = searcher.search(results);
Iterator&amp;lt;Hit&amp;gt; iterator = hits.iterator();
while (iterator.hasNext()) {
    Hit hit = iterator.next();
    System.out.println(hit.get(&quot;title&quot;) + &quot;, by &quot; + hit.get(&quot;author&quot;));
}
&lt;/pre&gt;
&lt;br /&gt;

Les r&#233;sultats sont automatiquement tri&#233;s par pertinence. Il est possible de r&#233;cup&#233;rer un &quot;score&quot; repr&#233;sentatif de la pertinence d&apos;un r&#233;sultat gr&#226;ce &#224; la m&#233;thode &lt;code&gt;Hit.getScore()&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

Voici donc un premier et rapide aper&#231;u du m&#233;canisme de requ&#234;tes dans des index Lucene. Le syst&#232;me de requ&#234;te en entier est bien plus complexe, et permet des requ&#234;tes beaucoup plus pouss&#233;es. Je continuerais donc cette s&#233;rie d&apos;articles au fur et &#224; mesure de mes d&#233;couvertes. En attendant, la &lt;a href=&quot;http://lucene.apache.org/java/2_3_2/&quot;&gt;documentation officielle&lt;/a&gt; de Lucene est tr&#232;s compl&#232;te.</description>          </item>
  </channel>
</rss>