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

<channel>
	<title>Le Touilleur Express &#187; jazoon</title>
	<atom:link href="http://www.touilleur-express.fr/tag/jazoon/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.touilleur-express.fr</link>
	<description>Blog sur Java, J2EE, Scrum,Apple,iphone par Nicolas Martignole</description>
	<lastBuildDate>Wed, 28 Jul 2010 09:07:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Jazoon 2009 : Mockito</title>
		<link>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-mockito/</link>
		<comments>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-mockito/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 16:39:08 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1740</guid>
		<description><![CDATA[Voici enfin le dernier billet de ma visite à Jazoon 2009. Je termine le troisième jour par une présentation de Mockito par l&#8217;excellent Szczepan Faber. Il bosse à Varsovie en Pologne, c&#8217;est un ancien de ThoughWorks London, un ancien barman lorsqu&#8217;il était étudiant, et surtout ce genre de personne qui vous font passer une heure délirante en parlant d&#8217;un sujet sérieux.
Allez soyons sérieux 30 secondes&#8230;
Après une introduction, sa présentation débute par un slide avec la définition d&#8217;un Mock.
Il pose la question : qu&#8217;est-ce qu&#8217;un mock ?
Sa réponse : &#171;&#160;C&#8217;est un ...]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://mockito.googlecode.com/svn/wiki/images/logo.jpg" title="Logo Mockito"  width="347" height="161" />Voici enfin le dernier billet de ma visite à <a href="http://www.touilleur-express.fr/jazoon-2009-liste-des-articles-publies/">Jazoon 2009</a>. Je termine le troisième jour par une présentation de Mockito par l&#8217;excellent Szczepan Faber. Il bosse à Varsovie en Pologne, c&#8217;est un ancien de ThoughWorks London, un ancien barman lorsqu&#8217;il était étudiant, et surtout ce genre de personne qui vous font passer une heure délirante en parlant d&#8217;un sujet sérieux.</p>
<p>Allez soyons sérieux 30 secondes&#8230;</p>
<p>Après une introduction, sa présentation débute par un slide avec la définition d&#8217;un Mock.<br />
Il pose la question : qu&#8217;est-ce qu&#8217;un mock ?<br />
Sa réponse : &laquo;&nbsp;<strong>C&#8217;est un substitut d&#8217;un objet réel afin de faire des tests, en simulant les interactions</strong>&laquo;&nbsp;. </p>
<p>Comme personne ne pipe mot, il appuie sur espace et une&#8230; poupée gonflable apparaît alors : &laquo;&nbsp;<em>vous voyez ? un mock permet de se passer de la vraie instance d&#8217;un objet, afin de pouvoir faire des tests tranquillement avec un substitut&#8230;</em>&laquo;&nbsp;.<br />
La salle est morte de rires, je crois que tout le monde se souviendra de la définition d&#8217;un Mock. </p>
<p>Il continue ensuite, et puis au 4ème slide il démarre Eclipse, afin de nous montrer un peu comment marche Mockito. Hop quelques lignes, on note au passage sa maîtrise des raccourcis d&#8217;Eclipse, parfois j&#8217;ai même eu envie de passer à Eclipse et de laisser tomber IDEA IntelliJ. Mais vu que visiblement ce bonhomme n&#8217;est pas humain, ou qu&#8217;il y a un truc, je suis donc resté à intelliJ. </p>
<p>Le voilà qui code une classe, un mock. Mais il utilise&#8230; EasyMock. Est-ce que quelqu&#8217;un va lui dire qu&#8217;il s&#8217;est planté ? <a href="http://lachal.neamar.fr/Que_nenni">Que nenni</a> ! C&#8217;est fait exprès&#8230;. Aaaah d&#8217;accord. Là je vais pas pouvoir continuer à bloguer cher lecteur, car le bonhomme en question a ensuite passé 32 minutes à coder, comme une bête. </p>
<p>J&#8217;ai tout d&#8217;abord retenu une petite astuce toute simple à reprendre dans vos tests unitaires. Utilisez les expressions &laquo;&nbsp;given/when/then&nbsp;&raquo; pour exprimer vos tests.<br />
Cela donne par exemple :</p>
<pre name="java" class="code">
@Test
public void shouldIncrementMyValue() throws Exception {
    // given

    // when

    // then 

}
</pre>
<p>J&#8217;ai ensuite surtout vu la différence entre easyMock et Mockito. Respect à David Gageot qui nous l&#8217;a dit il y a 6 mois. Oui Mockito est mieux qu&#8217;easyMock. Maintenant il faut que je dise pourquoi. Ca c&#8217;est le plus dur, surtout sans notes. Durant sa présentation je n&#8217;ai pas eu le temps de prendre des notes. Ce bonhomme étant trop fort avec machin-eclipse, impossible de le suivre. Ensuite, sa présentation étant vraiment bien, et sans temps morts, j&#8217;ai pas pris de notes. Voilà désolé, hop là je sens un grand cri de frustration&#8230; allez je vais chercher des bouts de codes et je reviens. Mais je vous dis, sans notes, ça va être difficile.</p>
<p>Regardons tout d&#8217;abord Mockito, le code ci-dessous n&#8217;est <strong>pas du bon code</strong> mais simplement quelques lignes afin de vous montrer le fonctionnement de Mockito.</p>
<pre name="code" class="java">
import static org.mockito.Mockito.*;

import java.util.LinkedList;

/**
 * Simple Mockito test.
 * @author Nicolas Martignole
 */
public class Test {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {

        // Creation d'un mock
        LinkedList mockedList = mock(LinkedList.class);

        mockedList.add("Test Touilleur 1");
        mockedList.clear();

        // Faire autre chose
        // ....

        // Verifier que l'on a ajoute un element
        verify(mockedList).add("Test Touilleur 1");
        // Verifier que l'on a vide la liste
        verify(mockedList).clear();

    }
}
</pre>
<p>La différence avec EasyMock : pas de replay à effectuer. Le premier appel à un verify bascule le mock automatiquement. On voit aussi que la syntaxe est facilement lisible : &laquo;&nbsp;verifier que mockedList point clear a ete appelé&nbsp;&raquo; </p>
<p>Mockito est aussi très intéressant lorsqu&#8217;un événement non attendu survient. Imaginons que je m&#8217;attende à ce que ma liste &laquo;&nbsp;mockée&nbsp;&raquo; soit manipulée, que l&#8217;on effectue un deuxième ajout. J&#8217;ajoute donc une étape de vérification qui va planter puisque je n&#8217;ai pas ajouté de deuxième élément à ma liste. Regardons comment le code réagit dans ce cas précis :</p>
<pre name="code" class="java">
import static org.mockito.Mockito.*;

import java.util.LinkedList;

/**
 * Simple Mockito test.
 * @author Nicolas Martignole
 */
public class Test {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {

        // Creation d'un mock
        LinkedList mockedList = mock(LinkedList.class);

        mockedList.add("Test Touilleur 1");
        mockedList.clear();

        // Faire autre chose

        // Verifier que l'on a ajoute un element
        verify(mockedList).add("Test Touilleur 1");
        // Verifier que l'on a vide la liste
        verify(mockedList).clear();

        // Verifier que l'on a aussi ajouter un autre element
        // ce qui n'est pas le cas, Mockito va donc
        // nous le signaler
        verify(mockedList).add("not added");
    }
}
</pre>
<p>Voici ce que Mockito affiche lors de l&#8217;exécution : </p>
<pre>
Exception in thread "main" org.mockito.exceptions.verification.WantedButNotInvoked:
Wanted but not invoked:
linkedList.add("not added");
	at Test.main(Test.java:30)
</pre>
<p>En clair : vous avez demandé à vérifier que l&#8217;on ajoute la phrase &laquo;&nbsp;not added&nbsp;&raquo; mais ce n&#8217;est pas le cas. Mockito produit des exceptions très claires lorsqu&#8217;un cas non attendu survient. Il sépare clairement aussi la définition du stub de la partie vérification, très facilement. </p>
<p>Je vous encourage à tester Mockito si vous utilisez easyMock, ou si les Mocks ne vous disent rien. Mockito permet de mocker des classes concrètes, certain préfèrent mettre des interfaces partout, et mocker ces interfaces. A la limite, faites ce qui vous arrange, la pratique des interfaces venant d&#8217;un livre de Martin Fowler qui disait, je crois, qu&#8217;il faut mocker des rôles, donc des interfaces. </p>
<p>Quelques derniers mots sur les charmes de Mockito :<br />
 &#8211; possibilité d&#8217;utiliser une vérification avec un ordre : inOrder()<br />
 &#8211; atLeast(x), times(x), etc.<br />
 &#8211; verifyNoMoreInteractions()<br />
 &#8211; enchainement de commandes: thenReturn(x).thenThrow(y)<br />
 &#8211; possibilité de matcher avec des arguments comme: anyObject(), etc.<br />
 &#8211; utilise <a href="http://code.google.com/p/hamcrest/">hamcrest</a> comme jMock</p>
<p>J&#8217;espère que nous aurons l&#8217;occasion de rencontrer Szczepan à Paris, au Paris JUG. Si vous le voyez à Devoxx 2009, croyez-moi cela vaut le coup. </p>
<p><strong>Références</strong><br />
- <a href="http://monkeyisland.pl/">Blog de Szczepan</a><br />
- <a href="http://mockito.org/">http://mockito.org/</a><br />
- <a href="http://mockito.googlecode.com/svn/branches/1.7/javadoc/org/mockito/Mockito.html">L&#8217;api de Mockito</a></p>
<p>Retrouvez l&#8217;ensemble des mes articles sur Jazoon 2009 <a href="http://www.touilleur-express.fr/jazoon-2009-liste-des-articles-publies/">sur cette page</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-mockito/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jazoon 2009 : Gaming in JavaFX</title>
		<link>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-gaming-in-javafx/</link>
		<comments>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-gaming-in-javafx/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 12:49:00 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[javafx]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1731</guid>
		<description><![CDATA[
Dernière présentation de cette deuxième journée, trop courte mais bien rafraîchissante : comment faire des jeux à la Zelda avec JavaFX ? Le speaker est bien connu de la communauté JavaFx : Jose Maria Silveira Neto, JUG Leader Brésilien du CEJUG. Allez voir son blog dans la section game, c&#8217;est une mine d&#8217;or pour apprendre à écrire des jeux avec JavaFx.
Si vous pensiez que j&#8217;étais une brute en écriture d&#8217;articles techniques, José Maria est une bête en écriture sur JavaFx et la création de jeu. Allez je vous dis regarder ...]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.touilleur-express.fr/wp-content/avatar_laure-150x150.jpg" alt="avatar_laure" title="avatar_laure" width="150" height="150" class="alignleft size-thumbnail wp-image-1735" /><br />
Dernière présentation de cette deuxième journée, trop courte mais bien rafraîchissante : comment faire des jeux à la Zelda avec JavaFX ? Le speaker est bien connu de la communauté JavaFx : Jose Maria Silveira Neto, JUG Leader Brésilien du CEJUG. Allez voir <a href="http://silveiraneto.net">son blog</a> dans la section <a href="http://silveiraneto.net/game/">game</a>, c&#8217;est une mine d&#8217;or pour apprendre à écrire des jeux avec JavaFx.</p>
<p>Si vous pensiez que j&#8217;étais une brute en écriture d&#8217;articles techniques, José Maria est une bête en écriture sur JavaFx et la création de jeu. Allez je vous dis regarder par exemple <a href="http://silveiraneto.net/2008/12/08/javafx-how-to-create-a-rpg-like-game/">cet article</a> mais revenez ensuite.</p>
<p>Sa présentation de 20 minutes vise à nous montrer comment écrire rapidement des jeux classiques. Voici ce que cela donne en vidéo :<br />
<object width="445" height="364"><param name="movie" value="http://www.youtube.com/v/Xv5z-9LGuOc&#038;hl=fr&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Xv5z-9LGuOc&#038;hl=fr&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"></embed></object></p>
<p>Je me dis après quelques slides qu&#8217;il ne reste plus qu&#8217;à offrir le support de JavaFx sur les téléphones portables. Sinon je ne vois pas l&#8217;intérêt de JavaFx pour l&#8217;instant, face à Adobe Flex ou même HTML 5 demain. Par contre, lorsque l&#8217;on sait qu&#8217;un grand nombre de téléphone embarquent une JVM, ou même Google Android, j&#8217;espère qu&#8217;il sera possible de jouer à ces petits jeux demain sur mobile. </p>
<p>José Maria explique tout d&#8217;abord que le développement de jeu n&#8217;est pas facile. Le chargement des ressources, la gestion du réseau, des périphériques comme la manette de la Wii, tout ceci fait appel pour l&#8217;instant à des kits propriétaires de développement, ce qu&#8217;il regrette. JavaFx apporte une simplification de la gestion des ressources (images, vidéos, sons). Le support de l&#8217;accélération matériel est aussi un plus. Il cite le <strong>Java Store</strong> et il espère que demain, celui-ci sera le nouveau portail de Java pour trouver des applications sympathiques en JavaFx, et donc des jeux. </p>
<p>Voici par exemple comment charger une image en JavaFx:<br />
<img src="http://www.touilleur-express.fr/wp-content/capture_arbre.jpg" alt="capture_arbre" title="capture_arbre" width="400" height="358" class="alignnone size-full wp-image-1732" /></p>
<p>Vous pouvez aussi charger une URL très facilement en JavaFx:</p>
<pre name="java" class="code">
var bed = ImageView {
    image: Image {
        url: "http://example.com/bed.png"
    }
}
</pre>
<p>La suite de sa présentation nous montre comment animer des sprites, comment gérer la détection de collision, le chargement d&#8217;une carte (MapTiles) et le scrolling.</p>
<p>Il cite le projet &laquo;&nbsp;<a href="http://projectdarkstar.com/">Project Darkstar</a>&laquo;&nbsp;. Après enquête, il s&#8217;agit d&#8217;un projet de plate-forme ouverte de dévelopement pour réaliser des jeux vidéos. C&#8217;est un moteur pour des jeux en ligne massivement multi-joueur, supporté par SUN Microsystems. Il permet de gérer finement les ressources en cluster, afin de répartir la charge des joueurs sur les serveurs. Il peut servir à réaliser un jeu social comme &laquo;&nbsp;2nd Life&nbsp;&raquo; par exemple. L&#8217;idée est de vous donner un moteur pour le chargement des zones de jeux, la gestion des joueurs, la sécurité et la gestion des problèmes de threads.</p>
<p> Voici une vidéo dans laquelle Owen Kellet en septembre 2008 présente le projet. </p>
<p><object id="flashObj" width="486" height="322" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"><param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9/1640183659?isVid=1&#038;publisherID=1460825906" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="videoId=17098239001&#038;playerID=1640183659&#038;domain=embed&#038;" /><param name="base" value="http://admin.brightcove.com" /><param name="seamlesstabbing" value="false" /><param name="allowFullScreen" value="true" /><param name="swLiveConnect" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://c.brightcove.com/services/viewer/federated_f9/1640183659?isVid=1&#038;publisherID=1460825906" bgcolor="#FFFFFF" flashVars="videoId=17098239001&#038;playerID=1640183659&#038;domain=embed&#038;" base="http://admin.brightcove.com" name="flashObj" width="486" height="322" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" swLiveConnect="true" allowScriptAccess="always" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></object></p>
<p><strong>Conclusion</strong><br />
En conclusion c&#8217;est finalement sa présentation qui m&#8217;a le plus donné envie de regarder JavaFx pendant ces 3 jours. Le marché du casual games est énorme. Le nombre de téléphones mobiles aussi. La puissance et la simplicité de JavaFx me semblent plus adapté pour attaquer ce secteur, plutôt que le monde de la bonne vieille application de gestion.</p>
<p>Rendez-vous mardi 7 juillet 2009 au Paris Java User Group pour une présentation sur Adobe Flex puis JavaFx. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-gaming-in-javafx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jazoon 2009 : Hibernate Envers</title>
		<link>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-hibernate-envers/</link>
		<comments>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-hibernate-envers/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 12:12:26 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1721</guid>
		<description><![CDATA[Adam Warski de la société Level N Consulting a présenté Hibernate Envers lors d&#8217;une présentation courte de 20 minutes à Jazoon. Petit retour sur Envers, vous allez tout comprendre. 
Hibernate Envers est un système simple qui permet d&#8217;ajouter de l&#8217;Audit et la gestion de Version à des Entités Hibernate. L&#8217;audit est l&#8217;enregistrement automatique en base de données des différentes versions d&#8217;une entité. Envers permet aussi de loguer les modifications faites à une Entité Hibernate dans une base de données, pour stocker l&#8217;heure et le nom de la personne qui a ...]]></description>
			<content:encoded><![CDATA[<p>Adam Warski de la société <em>Level N Consulting</em> a présenté Hibernate Envers lors d&#8217;une présentation courte de 20 minutes à Jazoon. Petit retour sur Envers, vous allez tout comprendre. </p>
<p>Hibernate Envers est un système simple qui permet d&#8217;ajouter de l&#8217;Audit et la gestion de Version à des Entités Hibernate. L&#8217;audit est l&#8217;enregistrement automatique en base de données des différentes versions d&#8217;une entité. Envers permet aussi de loguer les modifications faites à une Entité Hibernate dans une base de données, pour stocker l&#8217;heure et le nom de la personne qui a changé une Entité par exemple.</p>
<p>L&#8217;utilisation est simple. Pour cela, il suffit d&#8217;ajouter l&#8217;annotation @Audited et de déclarer des listeners dans le fichier persistence.xml. Pour chaque entité auditée, une nouvelle table est créée qui va conserver l&#8217;historique des changements, un peu comme Subversion si vous voulez. Cela permet aussi de retrouver facilement l&#8217;historique des différentes versions d&#8217;une entité. Imaginez une Facture, ce système vous permet d&#8217;enregistrer les différentes versions de la Facture, sans aucuns efforts.<br />
Sur cette photo prise durant la présentation, on voit l&#8217;annotation et la déclaration dans la configuration Hibernate.<br />
<img src="http://www.touilleur-express.fr/wp-content/img_envers.jpg" alt="img_envers" title="img_envers" width="500" height="344" class="alignnone size-full intrusif wp-image-1722" /></p>
<p><strong>Que peut-on auditer?</strong><br />
Les types simples définis par JPA (String, Integer, Date), les composants et les relations entre les composants. Le support des Collections et des types spécifiques à Hibernate est aussi possible. </p>
<p>Voyons avec un peu de code comment cela fonctionne.<br />
Si vous souhaitez auditer l&#8217;ensemble d&#8217;une Entité :</p>
<pre name="code" class="java">

@Entity
@Audited // that's the important part <img src='http://www.touilleur-express.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
public class Person {
    @Id
    @GeneratedValue
    private int id;

    private String name;

    private String surname;

    @ManyToOne
    private Address address;

    // add getters, setters, constructors, equals and hashCode here
}
</pre>
<p> La déclaration s&#8217;effectue de la façon suivante si vous ne souhaitez auditez que certaines propriétés :</p>
<pre name="code" class="java">
@Entity
public class Person {
    @Id
    @GeneratedValue
    private int id;

    @Audited
    private String name;

    @Audited
    @ManyToOne
    private Address address;

    // we don't care about this in Audit
    private String twitterName;
    private Date dateOfBirth;

}
</pre>
<p>Le développeur sélectionne les entités qu&#8217;il souhaite faire auditer. Pour chaque entité, une nouvelle entité auditée est créée dynamiquement. Par exemple Address aura une entité Address_AUD pour l&#8217;Audit, et c&#8217;est bien cette deuxième entité qui est persisté en base&#8230; avec Hibernate. </p>
<p>Pour chaque inser, update ou delete, une nouvelle révision est créée. Une Transaction est égale à une révision, si plusieurs entités sont embarquées dans une transaction. Le numéro de version est global si vous auditez plusieurs entités, comme le numéro SVN de votre code. Imaginez qu&#8217;une entité est un fichier Java que vous commitez, c&#8217;est exactement pareil. </p>
<p>Imaginons une entité Person et une entité Address, toutes les 2 annotées:<br />
<img src="http://www.touilleur-express.fr/wp-content/envers_uml.jpg" alt="envers_uml" title="envers_uml" width="400" height="112" class="alignnone size-full wp-image-1725" /></p>
<p>Déclarons tout d&#8217;abord 2 addresses sur une personne John Doe : </p>
<pre name="code" class="java">
// Revision 1
em.getTransaction().begin();
Address a1 = new Address(“West st.”, 10);
Address a2 = new Address(“East st.”, 15);

Person p = new Person(“John”, “Doe”);
p.setAddress(a1);
entityManager.persist(a1);
entityManager.persist(a2);
entityManager.persist(p);
em.getTransaction().commit();
</pre>
<p>Si je modifie maintenant le nom de la personne et que j&#8217;utilise la deuxième adresse :</p>
<pre name="code" class="java">
// Revision 2
em.getTransaction().begin();
p = entityManager.find(Person.class, id);
p.setName(“Paul”);
p.setAddress(a2); // declared in the other code part

em.getTransaction().commit();
</pre>
<p>Comme vous pouvez le constater, l&#8217;utilisation d&#8217;Envers est transparente pour le développeur, aucun bout de code supplémentaire n&#8217;est ajouté.<br />
Voyons maintenant comment retrouver nos données. Je recharge la révision 1 et je vérifie que le nom de la personne est bien John, puis ensuite comme on le voit, le chargement de l&#8217;arbre de relation vers Address fonctionne sans problèmes.</p>
<pre name="code" class="java">
AuditReader ar = AuditReaderFactory.get(em);

// Reading the person at revision 1
old_p = ar.find(Person.class, id, 1);
assert “John”.equals(old_p.getName());
assert a1.equals(old_p.getAddress());

// Reading the addresses at revision 1
old_a1 = ar.find(Address.class, a1_id, 1);
assert old_a1.getPersons().size() == 1;
assert old_a1.getPersons().contains(p);
old_a2 = ar.find(Address.class, a2_id, 1);
assert old_a2.getPersons().size() == 0;
</pre>
<p>La recherche est aussi très puissante et les systèmes de requêtes d&#8217;Hibernate permettent de déclarer par exemple:</p>
<pre name="code" class="java">
auditReader.createQuery()
                   .forRevisionsOfEntity(Person.class, false, true)
                   .addProjection(AuditEntity.revisionNumber.count())
                   .add(AuditEntity.id().eq(person.getId()))
                   .getSingleResult()
</pre>
<p>Il est important de se souvenir que l&#8217;audit est effectué par une autre Entité Hibernate, et que la table originale n&#8217;est jamais affectée. </p>
<p><img src="http://www.touilleur-express.fr/wp-content/envers2.jpg" alt="envers2" title="envers2" width="400" height="278" class="alignnone size-full wp-image-1726" /></p>
<p><strong>Comment écouter les changements sur une entité ?</strong><br />
Envers permet aussi de déclarer un Listener qui sera notifié lorsque l&#8217;entité est persistée vers la base de données. Je reprends le code directement des slides de la présentation, ne croyez pas que j&#8217;ai réussi à refaire cet article sans avoir les slides de la présentation <img src='http://www.touilleur-express.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  </p>
<p>Voyons tout d&#8217;abord une Entité de Révision. Elle est annotée avec @RevisionEntity, il faut aussi annoter un timestamp avec @RevisionTimeStamp et un numéro de révision, avec @RevisionNumber comme sur cet exemple:</p>
<pre name="code" class="java">
@Entity
@RevisionEntity(ExampleListener.class)
public class ExampleRevEnt {
    @Id @GeneratedValue @RevisionNumber private Long id;
    @RevisionTimestamp private Long timestamp;

    @ManyToOne private User modifiedBy;

    // Getters, setters, equals, hashCode ...
}
</pre>
<p>Vous pouvez ensuite déclarer un RevisionListener qui sera activé lorsque l&#8217;entité décorée est persistée, afin par exemple d&#8217;ajouter le nom de l&#8217;utilisateur qui a changé une Entité dans votre interface Web. Cela permet de créer une fonction de Log rapidement, sans alourdir le reste de votre application. </p>
<pre name="code" class="java">
public class ExampleListener implements RevisionListener {
    public void newRevision(Object revEntity) {
        ExampleRevEnt revEnt = (ExampleRevEnt) revEntity;
        User currentUser = (User) Component.getInstance("currentUser");

        revEnt.setModifiedBy(currentUser);
    }
}
</pre>
<p>Pour plus de détails sur cette fonctionnalité : <a href="http://www.jboss.org/envers/revision_log.html">voir la documentation d&#8217;Envers</a></p>
<p><strong>En conclustion</strong><br />
Envers 1.2.1 GA est sorti il y a quelques semaines, c&#8217;est un projet qui fonctionne avec Hibernate 3.3 et donc Java 5. Je retiendrai la facilité de mise en place, la clareté de l&#8217;API. Pour peu que votre application nécessite de l&#8217;audit, il serait dommage de s&#8217;en passer.<br />
Le site officiel : <a href="http://www.jboss.org/envers/">http://www.jboss.org/envers/</a></p>
<p>Crédit pour les extraits de code : Adam Warski de la société <em>Level N Consulting</em> ainsi que <a href="http://www.jboss.org/files/envers/docs/index.html">la documentation d&#8217;Envers</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/07/04/jazoon-2009-hibernate-envers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jazoon Day 2 : la génération de code</title>
		<link>http://www.touilleur-express.fr/2009/06/29/jazoon-day-2-la-generation-de-code/</link>
		<comments>http://www.touilleur-express.fr/2009/06/29/jazoon-day-2-la-generation-de-code/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 20:33:24 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1636</guid>
		<description><![CDATA[Présentation sur la génération de code. J&#8217;y suis allé pour comparer le sujet présenté à SpringFuse, de Jaxio, la société de Nicolas Romanetti et de Florent Ramière, que vous connaissez si vous venez souvent au ParisJUG. 
La présentation est intitulée &#171;&#160;Practitioners approach to generate object-relational persistence and services&#171;&#160;. Elle est présentée par Patrick Steger et Marc Baechinger de Zühlke Engineering AG.
Tout d&#8217;abord, pourquoi générer du code, puis ensuite une présentation de leur solution, mise en oeuvre dans un projet. 
Pourquoi générer du code ?

La génération de code permet de gagner ...]]></description>
			<content:encoded><![CDATA[<p>Présentation sur la génération de code. J&#8217;y suis allé pour comparer le sujet présenté à <a href="http://www.springfuse.com">SpringFuse</a>, de Jaxio, la société de Nicolas Romanetti et de Florent Ramière, que vous connaissez si vous venez souvent au ParisJUG. </p>
<p>La présentation est intitulée &laquo;&nbsp;<a href='http://jazoon.com/en/conference/presentationdetails.html?type=sid&#038;detail=6160'>Practitioners approach to generate object-relational persistence and services</a>&laquo;&nbsp;. Elle est présentée par Patrick Steger et Marc Baechinger de Zühlke Engineering AG.</p>
<p>Tout d&#8217;abord, pourquoi générer du code, puis ensuite une présentation de leur solution, mise en oeuvre dans un projet. </p>
<p><strong>Pourquoi générer du code ?</strong><br />
<img src="http://www.touilleur-express.fr/wp-content/img_42071.jpg" alt="img_42071" title="img_42071" width="500" height="375" class="alignnone size-full wp-image-1641" /><br />
La génération de code permet de gagner du temps en générant rapidement le squelette de l&#8217;application, en s&#8217;attachant à générer avec une qualité constante la partie purement technique de l&#8217;application.<br />
Patrick explique aussi que la génération permet de réduire le nombre de bugs. En générant le coeur de l&#8217;application, il dégage du temps pour ensuite se concentrer sur la partie métier de l&#8217;application. C&#8217;est un facteur de motivation pour l&#8217;équipe.</p>
<p>La solution présentée est basée tout d&#8217;abord sur l&#8217;utilisation d&#8217;un modeleur UML. Le schéma est exporté au format XMI.<br />
<img src="http://www.touilleur-express.fr/wp-content/generation01.jpg" alt="generation01" title="generation01" width="338" height="261" class="alignnone size-full wp-image-1658" /></p>
<p>Des feuilles de style XSLT permettent de générer du code Java à partir du fichier XMI.<br />
<img src="http://www.touilleur-express.fr/wp-content/velocity.jpg" alt="velocity" title="velocity" width="490" height="329" class="alignnone size-full wp-image-1659" /></p>
<p>La solution est donc réalisable avec un peu d&#8217;effort.<br />
Parmi les améliorations proposées, les 2 présentateurs parlent de générer plus de code, hop attendez je vous retrouve le slide&#8230; voilà<br />
<img src="http://www.touilleur-express.fr/wp-content/img_4226.jpg" alt="img_4226" title="img_4226" width="500" height="320" class="alignnone size-full wp-image-1660" /><br />
Et c&#8217;est là que je me dis, mince quand même, si Jaxio était venu présenter <a href="http://www.springfuse.com">SpringFuse</a>&#8230; Parce que les petits gars d&#8217;en face, les DTOs, les Controllers, la vue, SpringFuse génère tout cela, avec une qualité tip top&#8230; </p>
<p>Je suis allé voir les 2 présentateurs en fin de présentation. Les justifications et les idées sur la génération de code étaient intéressantes. Je pense qu&#8217;une partie de nous refuse de voir la génération comme un gain de temps. Certains pensent que ce n&#8217;est adapté qu&#8217;au <a href="http://en.wikipedia.org/wiki/Scaffolding">scaffolding</a>(échafaudage), alors que l&#8217;idée est de générer le coeur de l&#8217;application, de montrer les bonnes pratiques aux développeurs juniors, de s&#8217;assurer de la qualité, et de ne pas se planter lorsque l&#8217;on manque de temps. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/29/jazoon-day-2-la-generation-de-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vidéo Jazoon 2009</title>
		<link>http://www.touilleur-express.fr/2009/06/28/video-jazoon-2009/</link>
		<comments>http://www.touilleur-express.fr/2009/06/28/video-jazoon-2009/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 18:06:44 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1638</guid>
		<description><![CDATA[J&#8217;ai préparé une petite vidéo avec les quelques photos que j&#8217;ai pris à Jazoon. Rien d&#8217;extraordinaire, merci iMovie 09 sur Mac qui permet de créer rapidement ce genre de clip. Au programme : James Gosling, SPring 3.0, quelques vidéos de la démonstration de Java Fx 1.2 et Jazoon Rookie.
J&#8217;ai aussi changé le système de commentaires du Touilleur Express, il est possible de poster sans devoir s&#8217;inscrire au préalable. Cela devrait permettre à chacun de commenter plus facilement.

]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai préparé une petite vidéo avec les quelques photos que j&#8217;ai pris à Jazoon. Rien d&#8217;extraordinaire, merci iMovie 09 sur Mac qui permet de créer rapidement ce genre de clip. Au programme : James Gosling, SPring 3.0, quelques vidéos de la démonstration de Java Fx 1.2 et Jazoon Rookie.</p>
<p>J&#8217;ai aussi changé le système de commentaires du Touilleur Express, il est possible de poster sans devoir s&#8217;inscrire au préalable. Cela devrait permettre à chacun de commenter plus facilement.</p>
<p><object width="445" height="364"><param name="movie" value="http://www.youtube.com/v/c3GACsBtbBM&#038;hl=fr&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/c3GACsBtbBM&#038;hl=fr&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/28/video-jazoon-2009/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jazoon day 2 : a memcached implementation in Java by Bela Ban, JBoss</title>
		<link>http://www.touilleur-express.fr/2009/06/27/jazoon-day-2-a-memcached-implementation-in-java-by-bela-ban-jboss/</link>
		<comments>http://www.touilleur-express.fr/2009/06/27/jazoon-day-2-a-memcached-implementation-in-java-by-bela-ban-jboss/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 14:01:12 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1630</guid>
		<description><![CDATA[Pause repas en compagnie de quelques français (Christophe Jollivet du ToursJUG et du site Developpez.com, Pierre-Alexandre Gregoire d&#8217;Agile Partner, Anthony Dahanne de Valtech). Puis reprise en direction de la salle 9. Jazoon est organisé dans un grand cinéma style UGC. Les conférences ont lieu dans des salles de cinéma, très confortables et correctement sonorisées. 
Bela Ban de JBoss/RedHat est d&#8217;origine Suisse. Après un PhD à Zurich, un post-doc à l&#8217;université de Cornell, il rejoint la Californie, et il démarre le projet JGroups, intègre JBoss RedHat par la suite, pour s&#8217;occuper ...]]></description>
			<content:encoded><![CDATA[<p>Pause repas en compagnie de quelques français (Christophe Jollivet du ToursJUG et du site <a href="http://blog.developpez.com/christophej/c2132/conferences/jazoon-2009/">Developpez.com</a>, <a href="http://blog.zepag.org/">Pierre-Alexandre Gregoire</a> d&#8217;Agile Partner, <a href="http://blog.valtech.fr/wordpress/">Anthony Dahanne</a> de Valtech). Puis reprise en direction de la salle 9. Jazoon est organisé dans un grand cinéma style UGC. Les conférences ont lieu dans des salles de cinéma, très confortables et correctement sonorisées. </p>
<p><a href="http://belaban.blogspot.com/">Bela Ban</a> de JBoss/RedHat est d&#8217;origine Suisse. Après un PhD à Zurich, un post-doc à l&#8217;université de Cornell, il rejoint la Californie, et il démarre le projet JGroups, intègre JBoss RedHat par la suite, pour s&#8217;occuper du projet <a href="http://www.jboss.org/community/wiki/JBossCache">JBossCache</a> et <a href="http://www.jgroups.org/">JGroups</a>.</p>
<p>L&#8217;objectif de la présentation sera de nous présenter une implémentation de memcached réalisée en Java, des résultats sur les performances et une discussion sur les DataGrids. Bela Ban est un excellent orateur, sa présentation était très intéressante, animée par une démonstration en direct.</p>
<p>Pour commencer, une phrase afin de marquer les esprits:<br />
<strong>&laquo;&nbsp;Memory is the new disk. disk is the new tape (Tim Bray)&nbsp;&raquo;</strong></p>
<p>La mémoire est le nouvel espace de stockage, finalement le disque dur n&#8217;est-il pas devenu aujourd&#8217;hui l&#8217;équivalent des lecteurs à bande des années 80 ? La base de données est un point de contention, les allers-retours demandent des accès réseaux, ce qui dégrade les performances.</p>
<p>Cependant, il n&#8217;est pas possible de stocker toutes les données en mémoire sur un seul serveur. Tout d&#8217;abord pour des raisons de place, mais aussi parce que la mémoire ne résiste pas à un crash.</p>
<p><a href=" http://www.danga.com/memcached/">memcached</a> est un serveur de cache écrit en C qui fournit un service de cache de type HashMap en mémoire. Le client du cache peut être écrit dans n&#8217;importe quel langage, puisque le protocole pour utiliser memcached est très simple. Il y a un Get, un Put, un Remove, c&#8217;est une simple HashMap. Des exemples d&#8217;applications Webs connues qui utilisent memcached : FaceBook par exemple. 800 serveurs, 28 TeraBytes de données, memcached est un cache massivement répliqué, qui évite des accès disques très couteux en architecture distributée. C&#8217;est donc une grille de données distribuées. (<a href="http://www.facebook.com/note.php?note_id=39391378919">voir cet article de FaceBook</a>)</p>
<p>Le <a href="http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt">protocole</a> de memcached propose 6 opérations pour enregistrer ses données, 2 opérations pour retrouver une donnée unique ou un ensemble. Les échanges s&#8217;effectuent avec de l&#8217;Ascii par dessus du HTTP. Bela Ban explique que l&#8217;un des soucis de ce protocole est qu&#8217;il n&#8217;y a pas d&#8217;indicateur de la taille des buffers, ce qui fait qu&#8217;il est difficile avec Java NIO de préallouer efficacement des buffers. </p>
<p>Il n&#8217;y a pas de cache de niveau 1 du côté du client, cela n&#8217;étant pas dans l&#8217;objet de memcached, bien que certaines implémentations du côté client soient capables de conserver des données.<br />
Les données sont stockées avec une date d&#8217;expiration, mais plusieurs serveurs memcached ne se connaissent pas entre eux, il n&#8217;y a pas de réplication entre les noeuds. Lorsqu&#8217;un serveur memcached (c&#8217;est un cache rappelons-le) s&#8217;arrête, ses données cachées disparaissent, et il faut alors prévoir un reash de l&#8217;ensemble de la grille pour redistribuer les données. Imaginez une partie de Poker, l&#8217;un des joueurs s&#8217;en va, il faut alors reprendre les jetons de chacun et les redistribuer de manière équitable. Cette maintenance et cette fragmentation du cache est coûteuse. </p>
<p><strong>Implémentation d&#8217;un serveur memcached en Java</strong><br />
Bela Ban présente maintenant son implémentation d&#8217;un serveur compatible avec le protocole memcached, mais réalisée en Java. Tout d&#8217;abord dans son exemple de cache distributé, le client en Java dispose d&#8217;un cache L1 pour optimiser les performances. Du côté des grosses différences par rapport à l&#8217;implémentation en C, chacun des &laquo;&nbsp;ReplCaches&nbsp;&raquo; (son implémentation Java de memcached) utilise JGroups pour découvrir ses voisins. Les données sont donc automatiquement distribuées de manière efficace dans la grille, constituée par plusieurs serveurs &laquo;&nbsp;ReplCaches&nbsp;&raquo;. </p>
<p>Lorsqu&#8217;une donnée est placée dans le cache, selon la clé de hashage de cette donnée, la grille de données s&#8217;optimise automatiquement. Par ailleurs la réplication entre les serveurs memcached en Java se fait via un protocole binaire optimisé, ce qui permet de bien meilleurs performances avec la version Java que la version C. </p>
<p>Le protocole peut aussi être adapté, c&#8217;est le fonctionnement de JGroups. Si vous souhaitez ajouter de l&#8217;encryption, de la compression, il est possible de configurer la couche JGroups finement. Cela réduit l&#8217;usage du réseau. Bien entendu, TCP comme UDP sont supportés. </p>
<p><strong>Démonstration</strong><br />
Le &laquo;&nbsp;ReplCache&nbsp;&raquo; est embarqué dans un conteneur de Servlet, dans le même espace d&#8217;adressage. Arrive maintenant le moment le plus intéressant je trouve de sa présentation. Il explique qu&#8217;il utilise ses &laquo;&nbsp;ReplCache&nbsp;&raquo; comme des disques durs physiques. Il est possible de sélectionner une stratégie de stockage pour chaque donnée, afin de faire&#8230; du RAID de données. Il est donc possible de définir si l&#8217;on souhaite qu&#8217;une donnée soit répliquée ou non plusieurs fois dans la grille. </p>
<p>Les données qui peuvent être relues rapidement de la base de données pourront être reglées avec un compteur de replication (repl-count) = 0<br />
Les données critiques de travail de votre session (un panier d&#8217;achat) que vous ne devez pas perdre en cas de crashes, peuvent être répliquées dans toute la grille avec un compteur repl-count=-1. Sinon en général, l&#8217;usage est de ne stocker qu&#8217;une seule fois dans le cache cette donnée, la clé de hash permet de trouver rapidement quel serveur stocke la donnée. Il s&#8217;en sert comme d&#8217;un espace d&#8217;adressage, chaque client sait que par exemple les clés de A à H sont sur le serveur 1 et les clés de I à Z sont sur le serveur 2, ce qui permet vraiment d&#8217;optimiser les performances.</p>
<p><strong>JBoss Infinispan</strong><br />
Bela Ban présente ensuite le projet Infinispan, une grille de données open-source basée sur l&#8217;implémentation en Java memcached, avec la possibilité de passer des objets de type Runnable, ce qui en fait aussi une grille de calcul.</p>
<p>JBoss Infinispan est une implémentation de la JSR-107, la distribution du contenu caché est effectué selon la clé de hachage, afin d&#8217;assurer une distribution fine de celle-ci. Il est possible de créer un espace de stockage immense. 100 noeuds avec 2 Gb de mémoire, configuré en copie représentent 100 Gb d&#8217;espace de mémoire adressable. La mémoire est le nouveau disque dur comme il le rappelle.</p>
<p>Infinispan est aussi compliant JTA et offre le support de JMX pour proposer une interface de gestion performante. Il est compatible avec le protocole ASCII classique de memcached, ce qui permet de brancher un serveur en PHP avec un cache Infinispan par exemple. Bien entendu le protocole binaire dont il a parlé est plus intéressant, et l&#8217;un des objectifs du projet sera de fournir rapidement des implémentations du côté client en C et en PHP.</p>
<p>Du côté Java, l&#8217;API offre aussi une gestion asynchrone pour par exemple stocker de manière asynchrone une donnée :</p>
<pre>
Future<v> putAsync(K key, V value)
</v></pre>
<p><strong>Perspectives</strong><br />
Bela Ban termine la présentation avec quelques idées pour la suite. Tout d&#8217;abord, réellement développer l&#8217;idée que la grille est un système de stockage de données, un file system. Pour cela, il imagine proposer une api type java.io pour utiliser la grille pour lire et écrire des données massivement répliquées. Encore une fois : <em>Memory is the new disk, why can&#8217;t we implement JDBC on top of the grid ? use-it as a disk ? And what aboute Hibernate on a grid ?</em></p>
<p>La mémoire est le nouveau disque dur, celui-ci n&#8217;étant plus aujourd&#8217;hui que le vieux lecteur à bande destiné à faire une sauvegarde persistente. </p>
<p><strong>Références</strong><br />
Démonstration Java WebStart de ReplCache : <a href="www.jgroups.org/jnlp/replcache.jnlp">http://www.jgroups.org/jnlp/replcache.jnlp</a> (lancez 2 ou 3 fois l&#8217;application en cliquant plusieurs fois sur le lien)<br />
ReplCache Flash demo: <a href="http://www.jgroups.org/movies/ReplCache.swf">http://www.jgroups.org/movies/ReplCache.swf</a><br />
Infinispan : <a href="http://www.infinispan.org">http://www.infinispan.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/27/jazoon-day-2-a-memcached-implementation-in-java-by-bela-ban-jboss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jazoon day 2 : XWiki and Wiki 2.0</title>
		<link>http://www.touilleur-express.fr/2009/06/26/jazoon-day-2-xwiki-and-wiki-20/</link>
		<comments>http://www.touilleur-express.fr/2009/06/26/jazoon-day-2-xwiki-and-wiki-20/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 05:58:36 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1622</guid>
		<description><![CDATA[Présentation suivante ce mercredi matin :
Next generation Wikis : Mixing Content-Oriented Applications with Wikis 
by Vincent Massol
Vincent Massol, de XWiki SAS, mais aussi l&#8217;un des CastCodeurs, nous propose ce matin une présentation des nouvelles fonctionnalités de l&#8217;application XWiki 2.0. Sa présentation commence par un rappel du concept de Wiki, qu&#8217;il appelle Wiki 1.0. Ensuite, l&#8217;approche qu&#8217;il va développer concernant XWiki 2.0, sera de nous montrer qu&#8217;il devient facile de créer des mini-applications hébergées dans un wiki. Il cite quelques exemples d&#8217;applications qui seraient faciles à développer avec la future version ...]]></description>
			<content:encoded><![CDATA[<p>Présentation suivante ce mercredi matin :<br />
<em>Next generation Wikis : Mixing Content-Oriented Applications with Wikis </em><br />
by Vincent Massol</p>
<p>Vincent Massol, de XWiki SAS, mais aussi l&#8217;un des CastCodeurs, nous propose ce matin une présentation des nouvelles fonctionnalités de l&#8217;application XWiki 2.0. Sa présentation commence par un rappel du concept de Wiki, qu&#8217;il appelle Wiki 1.0. Ensuite, l&#8217;approche qu&#8217;il va développer concernant XWiki 2.0, sera de nous montrer qu&#8217;il devient facile de créer des mini-applications hébergées dans un wiki. Il cite quelques exemples d&#8217;applications qui seraient faciles à développer avec la future version de XWiki :<br />
 &#8211; Gestion de projet<br />
 &#8211; Système de demande de congés<br />
 &#8211; Notes de réunion<br />
 &#8211; Factures ou notes de frais<br />
 &#8211; Annuaire de contacts<br />
 &#8211; Notes de frais</p>
<p>Bref l&#8217;idée est de prendre en compte un fait : le Wiki est maintenant bien implanté dans l&#8217;entreprise, l&#8217;étape suivante est d&#8217;ouvrir le moteur afin d&#8217;offrir aux utilisateurs des applications, des formulaires, en conservant la philosophie du Wiki. En effet, tout ce qui va suivre sera codé directement dans l&#8217;interface de XWiki.</p>
<p>Vincent Massol montre quelques exemples de sites comme &laquo;&nbsp;France 2025&#8243; construit autour de XWiki. La frontière entre un portail et un wiki est très fine. Comme il l&#8217;explique, les Wikis 1.0 présentent des données peu structurées. Les blogs ajoutent une journalisation, ce qui structure les données. Les portails d&#8217;entreprises ensuite ont structuré l&#8217;information par domaine. Ce qu&#8217;il va présenter est donc la dernière étape, la structuration des données personnalisés, la possibilité de développer son application. Un outil de développement léger en quelques sortes.</p>
<p>L&#8217;idée des Wikis 2.0 est donc d&#8217;être l&#8217;Excel du Web. Un besoin simple ? Plutôt que de développer un gros projet, il explique que le moteur de Wiki doit fournir quelques services simples pour créer ses formulaires, et donc ajouter aux pages une application avec un coût de développement réduit. </p>
<p>Il débute la démonstration. L&#8217;objet de la démo sera de créer une petite application de demande de congés. Pour comprendre la suite, il présente 2 concepts de XWiki. Une classe est une page, un template. Un Object est une instance de cette classe. Tout d&#8217;abord il commence par créer les méta-données associées à la page. Pour cela, un script dans une textarea permet de déclarer les attributs. La syntaxe utilisée est Velocity. Le support de Groovy est <del datetime="2009-06-27T08:37:41+00:00">aussi prévu</del> déjà présent, le support de Jython et de JRub est en cours (cf commentaire ci-dessous).<br />
Cette étape fait un petit peu peur au premier coup d&#8217;oeil, on pense à Microsoft Sharepoint qui permet de créer des applications. Si j&#8217;avais un bémol je dirai que j&#8217;ai eu un peu peur en regardant le code. Mais cependant la syntaxe est simple, et je pense qu&#8217;une fois l&#8217;outil maitrisé, cela ne pose pas de soucis. De toutes les façons, ce qui suit est plutôt destiné à des administrateurs de portails, mais je n&#8217;ai pas assez de connaissances sur ce sujet. </p>
<p>L&#8217;intérêt évident d&#8217;éditer en direct, c&#8217;est que le résultat est tout de suite disponible. Et en effet, je trouve le concept vraiment intéressant. Donc un template Velocity permet de décrire sa demande de congés, ce template est attaché à une page, il est temps ensuite de créer l&#8217;interface de saisie.</p>
<p>Dans un deuxième temps, Vincent crée une ClassSheet, une feuille de style pour habiller la class qu&#8217;il a créé. La demande de congés est constitué de champs simples, de champs de type Date, et d&#8217;une liste déroulante d&#8217;utilisateurs, automatiquement peuplées par XWiki. </p>
<p>Une fois la feuille de style prête, nous voyons alors la page de saisie s&#8217;afficher. Le tout en 10 minutes à peine. Le reste est bien de la syntaxe Wiki, vous pouvez alors intégrer des images, des feuilles de style, les méta-données sont stockées dans la version de la page (??).<br />
Un langage de requêtage, le xwql, permet de créer des éléments dynamiques, une liste des personnes ayant effectué une demande de congés.</p>
<p>Vincent Massol explique ensuite que la version 2.0 de XWiki est polyglotte, elle supporte un nombre assez important de syntaxe Wiki. D&#8217;ailleurs comme il le fait remarquer, il est intéressant de remarquer que certains Wikis proposent par défaut un éditeur type Word, là où au départ le wiki a été créé pour qu&#8217;un langage simple de balisage soit utilisé !<br />
La version 2.0 supportte aussi le &laquo;&nbsp;Roundtrip between XHTML and Wiki Syntax&nbsp;&raquo; et ce moteur est disponible comme librairie à part.</p>
<p>Parmi les questions posées en fin de présentation, quelqu&#8217;un demande si un moteur de Workflow (pour valider la demande de vacances) serait prévu ? Au delà de la question, on comprend que les Wikis 2.0 se rapprochent de la frontière des applications d&#8217;entreprise. Est-ce que les utilisateurs accepteront quelques limitations ? Est-il envisageable de développer plus de fonctionnalités tout en gardant la simplicité et la puissance d&#8217;un Wiki ? </p>
<p>Peut-être qu&#8217;un slide pour présenter les fonctionnalités des autres acteurs nous aurait aidé pour comprendre l&#8217;avantage d&#8217;utiliser XWiki. Bonne présentation qui montre en tous les cas que les Wikis sont devenus des outils incontournables dans les entreprises.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/26/jazoon-day-2-xwiki-and-wiki-20/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Jazoon day 3 : Hibernate Search</title>
		<link>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-hibernate-search/</link>
		<comments>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-hibernate-search/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 15:12:31 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1612</guid>
		<description><![CDATA[J&#8217;ai assisté à la présentation d&#8217;Hibernate Search par Emmanuel Bernard, après une présentation sur les Portlets 2.0 par Thomas Heute. Tous les deux de JBoss/Red Hat. 
L&#8217;objectif est de nous présenter le fonctionnement d&#8217;Hibernate Search à travers des exemples de codes. Emmanuel assure la présentation avec un ordinateur de secours, son portable n&#8217;ayant pas supporté le voyage. Ouch ! Armé du package du bon speaker : un Mac + IDEA IntelliJ, il débute la présentation par une courte introduction afin de se présenter. Membre de l&#8217;équipe d&#8217;Hibernate, JCP Specification Leader ...]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai assisté à la présentation d&#8217;Hibernate Search par Emmanuel Bernard, après une présentation sur les Portlets 2.0 par Thomas Heute. Tous les deux de JBoss/Red Hat. </p>
<p>L&#8217;objectif est de nous présenter le fonctionnement d&#8217;Hibernate Search à travers des exemples de codes. Emmanuel assure la présentation avec un ordinateur de secours, son portable n&#8217;ayant pas supporté le voyage. Ouch ! Armé du package du bon speaker : un Mac + IDEA IntelliJ, il débute la présentation par une courte introduction afin de se présenter. Membre de l&#8217;équipe d&#8217;Hibernate, JCP Specification Leader de la JSR-303 &laquo;&nbsp;Bean Validation&nbsp;&raquo; et membre de l&#8217;expert group sur JPA 2.0. Il est l&#8217;auteur du livre &laquo;&nbsp;<a href="http://www.manning.com/bernard/">Hibernate Search In Action</a>&nbsp;&raquo; chez Mannings. Enfin petite information, il revient vivre en France en octobre, ce qui permettra je l&#8217;espère de le voir lors des soirées des Java User Group en France. </p>
<p>Son objectif sera de nous expliquer en quoi consiste la recherche &laquo;&nbsp;full-text&nbsp;&raquo;, ce qu&#8217;elle peut nous apporter, la magie des analyseurs, les différents algorithmes pour la recherche approximative, bref comment Hibernate Search fonctionne.</p>
<p><strong>La recherche</strong><br />
Que ce soit un formulaire sur un site web ou autre, tôt ou tard une application souhaite offrir une fonction de recherche dans les entités d&#8217;une base de données. Hibernate Search vise à offrir une solution efficace et puissante, basée sur Lucene, afin de nous assister lors de l&#8217;écriture de cette fonctionnalité clé dans les applications.</p>
<p>Une recherche simple basée sur la syntaxe SQL est trop restrictive. Si vous tapez &laquo;&nbsp;car&nbsp;&raquo;, comment extraire ce mot d&#8217;une colonne ? Certes il y a des requêtes comme &laquo;&nbsp;LIKE&nbsp;&raquo; mais celles-ci coûtent chères en terme de performance. Il explique que la base de données est le premier point de contention, qu&#8217;il est donc dommage de ne pas remonter cette fonction afin de la rendre plus puissante.</p>
<p>Par ailleurs, si vous tapez &laquo;&nbsp;car&nbsp;&raquo;, est-ce que le moteur de recherche sera capable de vous montrer les entrées avec &laquo;&nbsp;vehicle&nbsp;&raquo; ? Et si vous faites une faute de frappe, est-ce que le moteur sera capable de vous monter un résultat ? </p>
<p>La sélection par SQL est donc très limitée.</p>
<p>Emmanuel enchaîne ensuite avec un argument : comment classer par pertinence les résultats ? De ces besoins est né l&#8217;idée d&#8217;Hibernate Search, offrir un moteur de recherche full-text à Hibernate.</p>
<p> <strong>Full Text Search</strong><br />
Pour répondre aux besoins exposés précédemment, la solution s&#8217;appelle &laquo;&nbsp;Full Text Search&nbsp;&raquo;. Elle est relativement simple et puissante. Le principe est de créer un Index des mots clés, en supprimant les mots de liaisons, afin d&#8217;identifier les occurences de chaque mot, et donc de créer de la pertinence. Ce principe est très performant puisque l&#8217;on ne fait pas d&#8217;accès à la base de données.</p>
<p>Il existe déjà différentes solutions, soit embarquées dans la base, soit dans des boîtiers externes sous la forme d&#8217;applicance, mais qui manquent de flexibilité, puisqu&#8217;en tant que développeur il sera difficile d&#8217;affiner la stratégie d&#8217;indexation.</p>
<p><strong>Exemples de problèmes</strong><br />
Voici la mission d&#8217;Hibernate Search :<br />
 &#8211; Trouver le meilleur document, la meilleure entité selon son critère de choix.<br />
 &#8211; Classer par pertinence<br />
 &#8211; Utiliser un algorithme de similarité pour proposer à l&#8217;utilisateur des résultats similaires</p>
<p><strong>Extraction</strong><br />
L&#8217;indexation s&#8217;effectue tout d&#8217;abord en découpant les phrases en mots, ce que l&#8217;on appelle l&#8217;extraction. A ce propos, la construction de l&#8217;index est gérée par Hibernate Search, elle s&#8217;effectue automatiquement.<br />
L&#8217;extraction consiste tout d&#8217;abord à découper les phrases et à filtrer les mots communs pour ne garder que le sens.</p>
<p><strong>Approximation</strong><br />
Ce système permet d&#8217;assister l&#8217;utilisateur en lui proposant des résultats très proches lorsqu&#8217;une recherche exacte ne retourne pas de résultat par exemple. Il est possible de dire à Hibernate Search que l&#8217;approximation est moins importante que la recherche exacte, de sorte que la liste des résultats ne soit pas polluée et reste pertinente. Ce poids lors de la recherche est configuré par le développeur, ce qui nous permet de régler finement le comportement du moteur. Les réponses exactes apparaissent en premier, puis les approximations.<br />
La résolution d&#8217;approximation se fait avec des algos comme le calcul de distance Levenshtein. Tapez par exemple Hib<strong>re</strong>nate au lieu d&#8217;Hibernate, et vous verrez que le moteur détecte les résultats proches, en calculant la distance entre les lettres. </p>
<p><strong>L&#8217;approche n-gram</strong><br />
Emmanuel présente ensuite une fonction plus avancée d&#8217;indexation, appelée n-gram. Le principe consiste à découper des mots en paquets de lettre. Par exemplte un tri-gram pour découper en paquet de 3 lettres un mot comme Hibernate donnerait : hib-ern-ate. Cela permet alors de créer des arbres d&#8217;indexation et de donner des plans de résultats encore plus pertinent. </p>
<p>Emmanuel montre un exemple où il tappe &laquo;&nbsp;poter&nbsp;&raquo;. les livres sur Harry Potter s&#8217;affichent, mais aussi un<br />
&laquo;&nbsp;Capote&nbsp;&raquo; car le tri-gram &laquo;&nbsp;pot&nbsp;&raquo; a matché <img src='http://www.touilleur-express.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>Hibernate Search</strong><br />
<em>je mettrai des photos en ligne un peu plus tard avec des exemples de code</em></p>
<p>Emmanuel prend ensuite l&#8217;exemple d&#8217;un Item pour nous présenter l&#8217;API.<br />
On voit une annotation @Indexed placée sur un Entity, ce qui permet à Hibernate Search de savoir que cette entité doit être indexée. Par ailleurs il explique qu&#8217;Hibernate Search sait que lorsque l&#8217;objet est changé, il doit mettre à jour l&#8217;index Lucène. Il nous montre enfin comment configurer l&#8217;indexation afin de ne pas découper en n-gram par exemple certains champs, afin de conserver des codes ISIN.</p>
<p>La recherche s&#8217;effectue comme une requête HQL avec un entitymanager particulier, le FullTextEntityManager qui est une sous-classe de l&#8217;EntityManager d&#8217;Hibernate.</p>
<pre>
FullTextQuery q = entityManager.createFullTextQuery(luceneQuery, Item.class)
</pre>
<p>Pour construire sa requête Lucene, Hibernate Search laisse le soin au développeur de construire celle-ci, ce qui permet de régler finement le type de recherche. Il commence par faire une démonstration d&#8217;une recherche exacte, puis ensuite une démonstration d&#8217;une recherche avec un n-gram Analyzer.</p>
<p>Il est aussi possible de déclarer par exemple 2 stratégies d&#8217;indexation différentes, une indexation exacte et une indexation pour une recherche approximative. Vraiment intéressant de voir la possibilité de réglage d&#8217;Hibernate Search. La quantité d&#8217;annotations peut faire peur, mais le code est vraiment simple à lire. Quelqu&#8217;un demande d&#8217;ailleurs s&#8217;il serait possible de déclarer dans un fichier XML ce qui est déclaré ici sous forme d&#8217;Annotations.</p>
<p><strong>Approximation phonetique</strong><br />
Il existe différents algos pour indexer de manière phonétique des mots:<br />
- Soundex<br />
- Metaphone (JRSKP)<br />
- mostly for latin language<br />
Emmanuel explique cependant que ce n&#8217;est pas le cas le plus courant dans la vraie vie.</p>
<p><strong>La recherche par synonyme</strong><br />
L&#8217;ídée est de proposer à l&#8217;utilisateur des listes de résultats dont le domaine est proche sémantiquement, une voiture, une bagnole, un caisse si vous voulez. Pour cela il faut un dictionnaire, que l&#8217;on indexe. Cela crée de gros indexes, mais il est possible de construire des dictionnaires par référence. Dans tous les cas, il nous conseille de construire nous-mêmes nos bases de synonymes.</p>
<p><strong>What&#8217;s the catch</strong><br />
Lucene étant relativement bas niveau, l&#8217;intégration avec un modèle, la création et la mise à jour de l&#8217;index sont donc des fonctions clés d&#8217;Hibernate Search. Celui-ci permet d&#8217;apporter facilement des fonctions de recherches très puissantes à une application. Et qui n&#8217;offrira pas finalement une fonctionnalité de recherche ? </p>
<p>Bonne présentation, détendue, claire, et intéressante. Et en plus avec un Mac et IDEA IntelliJ ! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-hibernate-search/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jazoon Day 3 : Portlet 2.0 by Thomas Heute</title>
		<link>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-portlet-20-by-thomas-heute/</link>
		<comments>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-portlet-20-by-thomas-heute/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:31:31 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>
		<category><![CDATA[portail]]></category>
		<category><![CDATA[portlet]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1609</guid>
		<description><![CDATA[Première présentation ce matin : &#171;&#160;Portlet 2.0&#8243; par Thomas Heute de JBoss/Red Hat.
La spécification des Portlets 2.0 est sortie en juin 2008. Thomas nous donne un retour un an après de la conférence. Lui-même contributeur depuis 2004 sur JBoss Portal, une année sur JBoss Seam, il est aujourd&#8217;hui le responsable du projet JBoss Portal chez RedHat. 
L&#8217;agenda de sa présentation sera :
- Quelles sont les nouvelles fonctionnalités de la version Portlet 2.0
- Adoption par les vendeurs
- La portabilité
- Portlets versus Gadgets
Dans un premier temps, retour sur la JSR-286 Portlet 2.0 ...]]></description>
			<content:encoded><![CDATA[<p>Première présentation ce matin : &laquo;&nbsp;Portlet 2.0&#8243; par Thomas Heute de JBoss/Red Hat.</p>
<p>La spécification des Portlets 2.0 est sortie en juin 2008. Thomas nous donne un retour un an après de la conférence. Lui-même contributeur depuis 2004 sur JBoss Portal, une année sur JBoss Seam, il est aujourd&#8217;hui le responsable du projet JBoss Portal chez RedHat. </p>
<p>L&#8217;agenda de sa présentation sera :<br />
- Quelles sont les nouvelles fonctionnalités de la version Portlet 2.0<br />
- Adoption par les vendeurs<br />
- La portabilité<br />
- Portlets versus Gadgets</p>
<p>Dans un premier temps, retour sur la JSR-286 Portlet 2.0 sortie l&#8217;an passé. Tout d&#8217;abord l&#8217;une des innovations les plus importantes est ce qu&#8217;il appelle &laquo;&nbsp;Resource Serving&nbsp;&raquo;. L&#8217;objectif est de permettre l&#8217;envoi de données vers le navigateur qui ne font pas partie du portail, comme un fichier PDF ou Excel par exemple, tout en conservant les fonctionnalités d&#8217;une portlet. Cette spécification vise donc à offrir un accès au contexte afin d&#8217;assurer le support de la sécurité et de l&#8217;accès aux données par exemple.</p>
<p>Il montre ensuite l&#8217;interaction entre les portlets avec une RemoteCommandPortlet sur une démonstration fonctionnant avec JBoss Portal. Une fenêtre HTML détachée permet d&#8217;envoyer des commandes à une autre portlet, la gestion de l&#8217;asynchrone est très simple.<br />
A ce propos, il explique que les améliorations du support d&#8217;Ajax dans la spécification Portlet 2.0 permettent à des frameworks comme ICEFaces ou RichFaces de fonctionner correctement dans des portlets.</p>
<p>Les Portlets 2.0 peuvent maintenant partager leurs paramètres avec d&#8217;autres produits ce qui permet de faire communiquer les portlets entre elles. Thomas Heute montre l&#8217;exemple d&#8217;une portlet Google Map et d&#8217;une portlet Weather qui recoivent toutes les deux en paramètre le code postal d&#8217;une ville américaine. </p>
<p>Une portlet peut aussi déclencher une événement, les autres portlets peuvent être notifiées et se mettre à jour. Il conseille de ne s&#8217;en servir que pour de la mise à jour de l&#8217;interface. </p>
<p>Sur le slide suivant il dresse un état de l&#8217;implémentation de la spécification par les différents acteurs du marché :</p>
<p>La <a href="http://jcp.org/en/jsr/detail?id=286">JSR-286</a> Portlet 2.0 est en version finale depuis le 12 juin 2008.<br />
- JBoss Portlet Container 2.0 est sorti le 13 juin 2008 puis inclus dans JBoss Portal 2.7.0 en octobre<br />
- eXo Portlet Container 2.0 est sorti le 18 juin 2008, mis dans eXo Portal le 1er juillet 2008<br />
- Liferay portal a sorti sa version le 17 juillet 2008<br />
- Apache Jetspeed assez tardivement le 27 mai 2009 dernier<br />
- IBM Websphere portal 6.1 a été disponible sept 2008<br />
- Oracle Portal (BEA () + Oracle (2) + Sun(1)) ? </p>
<p>Concernant le support des frameworks WEB il existe 2 spécifications<br />
JSF Support:<br />
 &#8211; JSR-301 specification addresses JSR-166<br />
 &#8211; JSR-329 addressing JSR-286 (JBoss Portlet bridge on the way)</p>
<p>De ce qu&#8217;il a pu voir sur les forums, les pages :<br />
Wicket support -> mostly there with support for events<br />
Sruts 2 plugin for JSR-286<br />
Spring MVC also support JSR-286<br />
WebWork</p>
<p>A propos de la portabilité : attention la spec ne dit pas comment on fait un portail mais une portlet.<br />
La notion de page n&#8217;est pas définie.<br />
La communication entre portlet:<br />
 &#8211; UI Level<br />
 &#8211; Le mécanisme événementiel n&#8217;est pas un remplacement par JMS, ne pas abuser de ce mécanisme.<br />
 &#8211; Doit-on se coordonner à travers les pages ?<br />
 &#8211; Portlets aren&#8217;t a template mechanism per se</p>
<p>Rester à une gestion des événements entre portlet qui sont sur la même page si vous ne voulez pas avoir de soucis.</p>
<p>Slide suivant qui m&#8217;a fait sourire : <strong>Portlet vs Widget vs Gadget (vs Toilet ?)</strong><br />
Thomas Heute explique tout d&#8217;abord en quoi consiste un Gadget, tel que l&#8217;on peut le voir sur Facebook. C&#8217;est un affichage déporté dans un autre site web d&#8217;une fonctionnalité hébergée sur un serveur primaire. Une portlet est plutôt la représentation locale d&#8217;un service distant, c&#8217;est une composition gérée par un portail, afin d&#8217;assurer des services communs (authentification, autorisation, communication, etc) dans un seul endroit. </p>
<p>Il cite différentes initiatives autour des Gadgets :<br />
Google OpenSocial, OpenAjax Alliance (OBM, Google, Sun, Red Hat, Oracle, Microsoft) -> Widget proposal</p>
<p>L&#8217;avantage des Portlets par rapport à un Gadget/Widget:<br />
-> Fait pour des applications plutôt complexes.<br />
-> Vous pouvez utiliser votre framework en général,<br />
-> L&#8217;état des portlets est gardé lorsque la page se rafraichie.<br />
-> propagation de l&#8217;identité, de la sécurité, interaction avec un portail, visuel. </p>
<p>Les gadgets ont l&#8217;avantage d&#8217;être développable rapidement, comme pour consommer par exemple un flux RSS. Facile pour l&#8217;intégration du côté client, facile pour partager de l&#8217;information. On pense au Gadget Twitter que j&#8217;ai sur mon blog par exemple. </p>
<p>Il termine par un slide sur ses idées pour l&#8217;avenir<br />
> We could use more annotations a la Servlet 3.0 or JSF 2.0 @Portlet (no portlet,xml)<br />
> We could all benefit from a PORTAL specification<br />
 &#8211; more aware of the environment, communication with the portal itself<br />
 &#8211; Portal object management<br />
 &#8211; Federated search/index</p>
<p>Enfin il revient sur l&#8217;annonce du parternariat entre JBoss Portal et eXo Portal. Il résume cela par<br />
&laquo;&nbsp;<strong>JBoss builds the platform, eXo Platform builds the solution, We are hiring !</strong>&nbsp;&raquo;</p>
<p><strong>Réflexions et conclusion</strong><br />
Présentation intéressante, je crois que les Portlets 1.0 ne doivent plus être utilisées. Je travaillerai cet été à l&#8217;étude de différents portails pour le client avec lequel je travaille, le sujet est donc d&#8217;actualité. Mon souci du moment : comment proposer l&#8217;étude d&#8217;alternative à la politique d&#8217;achat qui voudrait que l&#8217;on prenne Oracle Portal, sans savoir si celui-ci correspond à nos besoins ? Mais c&#8217;est une autre histoire&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-portlet-20-by-thomas-heute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jazoon day 3 : Adrian Coyler</title>
		<link>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-adrian-coyler/</link>
		<comments>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-adrian-coyler/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:12:37 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1597</guid>
		<description><![CDATA[Jazoon troisième journée.
Après une soirée animée, un réveil difficile où vous vous dites que vous n&#8217;avez plus 20 ans, retour ce matin dans la plus grande salle afin de participer à la KeyNotes de SpringSource. Sur scène, un très bon speaker en la personne d&#8217;Adrian Colyer, CTO de SpringSource.
La présentation s&#8217;intitule : The Changing Nature of Enterprise Java Application Development 
La lumière s&#8217;éteint, début du show&#8230;
Adrian Colyer : notre écosystème Java est comme la Forêt Vierge : une végétation dense, des petits arbres, de grands arbres, beaucoup d&#8217;animaux, qui se ...]]></description>
			<content:encoded><![CDATA[<p>Jazoon troisième journée.</p>
<p>Après une soirée animée, un réveil difficile où vous vous dites que vous n&#8217;avez plus 20 ans, retour ce matin dans la plus grande salle afin de participer à la KeyNotes de SpringSource. Sur scène, un très bon speaker en la personne d&#8217;Adrian Colyer, CTO de SpringSource.</p>
<p>La présentation s&#8217;intitule : <a href="http://jazoon.com/en/conference/presentationdetails.html?type=sid&#038;detail=9280">The Changing Nature of Enterprise Java Application Development</a> </p>
<p>La lumière s&#8217;éteint, début du show&#8230;</p>
<p>Adrian Colyer : notre écosystème Java est comme la Forêt Vierge : une végétation dense, des petits arbres, de grands arbres, beaucoup d&#8217;animaux, qui se battent&#8230; On voit des strates, <a href="http://fr.wikipedia.org/wiki/Canopée">la canopée</a> est l&#8217;étage en contact avec la lumière du soleil. Les arbres les plus grands, 20 mètres plus haut que les autres. En dessous de cela, la canopée, ceux qui bénéficient de la lumière. Pour un oiseau c&#8217;est cool. En dessous, pas top. La vie est difficile si vous êtes en dessous, 5% de la lumière du SUN (soleil) arrive jusqu&#8217;au sol.</p>
<p><em>Adrian prend le temps de laisser les images s&#8217;imprimer&#8230;</em> </p>
<p>Le sol de la forêt ne reçoit que 2% de la lumière. Mais de temps en temps arrive une éclaircie dans la forêt. Dans ce cas, arrive une explosion de la vie, jusqu&#8217;à prendre peut-être la place des autres. Peut-être même une nouvelle canopée. </p>
<p>Regardons les arbres géants : ce sont les grosses compagnies (IBM, SUN, Oracle&#8230;). La canopée est l&#8217;espace de vie pour les mediums-size players. Il constate qu&#8217;il est très dur pour une nouvelle idée, une nouvelle approche, de faire sa place. </p>
<p>Oracle rachète SUN. Pour lui, un grand arbre est tombé. Cela crée un trou de lumière qui touche le sol, ce qui va entrainer du changement.<br />
Un ange passe..</p>
<p>Il cherche à nous faire prendre conscience qu&#8217;en ce moment, il se passe quelque chose. </p>
<p>Où en sommes-nous dans notre forêt vierge ? Au couché du soleil, en anglais au <a href="http://en.wikipedia.org/wiki/Sunset">Sunset</a>. SUN Microsystems se fait racheter par Oracle, nous sommes à la fin de quelque chose pour lui. Adrian montre la courbe de la quotation de SUN pour dire que la compagnie descend tout doucement. </p>
<p>Après le couché du soleil, vient la période sombre (Dark Age) mais nous aurons ensuite une nouvelle aire, de l&#8217;innovation, un renouveau. (<em>A cet instant je vois presque Rod sur son cheval blanc&#8230; une larme coule&#8230; que c&#8217;est beau</em>)</p>
<p>Slide suivant, les temps changent. Regardez, dit-il, la présentation de SUN la veille. Parmis les 5 premiers points les plus importants dans le JDK 7, nous voyons que le support des langages dynamiques est cité dans cette liste. C&#8217;est très important, vous devez comprendre que les alternatives à Java, qui devient parfois un peu lourd ou complexe pour certains sujets, se trouve dans les nouveaux langages dynamiques, pas dans une quelconque JSR pour les Closures en Java. En avons-nous besoin d&#8217;ailleurs ?</p>
<p>Il continue ensuite en expliquant que l&#8217;explosion de nouveaux langages basés sur la JVM comme Groovy ou Scala doivent nous faire prendre conscience rapidement qu&#8217;un nouvel arbre est entrain de pousser dans la forêt. </p>
<p>Adrian affiche ensuite un slide avec différents langages:<br />
 &#8211; Groovy,<br />
 &#8211; Erlang,<br />
 &#8211; Clojure,<br />
 &#8211; Jython,<br />
 &#8211; JRuby,<br />
 &#8211; Ruby,<br />
 &#8211; Scala.</p>
<p>Il continue ensuite: Java est peut-être trop compliqué. L&#8217;introduction des Generics serait le début de cette complexité. D&#8217;autres disent que Java bouge trop lentement. D&#8217;autres pensent qu&#8217;il y a trop de fonctionnalités. Java est trop ceci, trop cela&#8230;</p>
<p>Il nous demande à notre avis quel sera le langage qui aura le plus de chances de pousser dans cette nouvelle forêt ? 4 langages se détachent dans sa sélection<br />
Groovy JRuby Clojure et Scala</p>
<p>Il revient ensuite sur <a href="http://fr.wikipedia.org/wiki/Groovy_(langage)">Groovy</a> qui a remporté le &laquo;&nbsp;Script Bowl&nbsp;&raquo; lors de JavaOne 2009 (voir cet article sur le Touilleur Express). Dans les slides qui suivent, il montre un exemple Groovy vs Java, largement discutable. Mais l&#8217;idée est de dire que l&#8217;on peut faire la même chose avec moins de code. Ok, à cet instant je suis d&#8217;accord sur la quantité. Mais il passe aussi sous silence le changement de paradigme. Programmer avec un langage dynamique est forcément différent par rapport à Java.</p>
<p>Concernant la productivité, Groovy est plus concis, se concentrant sur l&#8217;efficacité. Adrian montre l&#8217;exemple du script HelloWorld, qu&#8217;il transforme en script Groovy. Il passe à un slide en Groovy avec 10 lignes au lieu de 30. Et il fait rire la salle en disant &laquo;&nbsp;et c&#8217;est la même taille de police&nbsp;&raquo;. </p>
<p>Adrian explique ensuite en quelques minutes les principes de Groovy. </p>
<pre name="code" class="java">
class HelloWorld {
	def name
	deg greet() { "Hello ${name}"}

	static main(args) {
		def helloWorld=new HelloWorld(name: "Groovy")
		println helloWorld.greet()
	}
}
</pre>
<p>Concernant ensuite la gestion des threads, Adrian montre un exemple en Scala. </p>
<pre name="code" class="scala">
class Pong extends Actor {
	def act() {
		var pongCount=0
		loop {
			react {
				case Ping =>
					if(pongCount % 1000 ==0)
						println("Pong: ping "+pongCount +" from + " sender)
					sender ! Pong
					pongCo = pongCount + 1
				case Stop =>
					println("Pong : Stop")
					exit('stop')
			}

		}
	}
}
</pre>
<p>Pour suivre un exemple avec Clojure, langage du domaine fonctionnel comme OCaml.</p>
<pre name="code" class="clojure">
;; Hello

(use 'clojure.contrib.test-is')

(defn hello
 "return a greeting"
 ([] "Hello World Default")
 ([username] (str "Hello " username " !")))

(println (hello "World"))

(deftest test-hello
	(is (="Hello World" (hello "World")))
	(is (="Hello World" (hello "World")))
	(is (="Hello World Defalt" (hello))
	 "Called with no arg, we default to World !"
	)
)
</pre>
<p>Il pose ensuite une question à la salle:<br />
A votre avis, quel est le langage qui a <strong>le plus de chances</strong> d&#8217;être le plus populaire ? Il ne nous demande pas le meilleur langage, question à laquelle il n&#8217;y a pas de réponses. Il nous demande simplement quel serait selon-nous les chances de chacun de ses langages ? Clairement Groovy se détache du lot. Il conclue en expliquant de manière très pragmatique : &laquo;&nbsp;That&#8217;s a reason why we bought G2One.Inc&nbsp;&raquo;<br />
SpringSource recherche la meilleur technologie, le meilleur framework, afin d&#8217;aider à faire émerger de nouveaux arbres dans la forêt vierge.</p>
<p>Il nous demande : seriez-vous prêt à retravailler en assembleur plutôt qu&#8217;en Java ?<br />
Non bien entendu car vous êtes plus productif en Java. Il nous encourage ensuite à regarder Groovy comme un moyen d&#8217;améliorer encore cette productivité. Et un jour il espère nous demander : &laquo;&nbsp;seriez-vous prêt à retravailler en Java ?&nbsp;&raquo;. Réaction plus retenue dans la salle, certains ont le sourire, d&#8217;autres moins. Mais l&#8217;objectif ce matin est de nous remuer et de nous faire prendre conscience que quelque chose est entrain de se passer. </p>
<p>Adrian Colyer parle maintenant des frameworks. Nos besoins sont assez communs et connus, lors de la création d&#8217;une application Web. Si nous acceptons que les langages dynamiques peuvent nous faire gagner du temps, il est logique d&#8217;accepter que des frameworks nous aident à améliorer notre productivité. </p>
<p>Un exemple de site : <a href="http://www.wired.com">Wired.com</a> 12 millions de lecteur cité sur le site de SpringSource utilise Grails. Aegon est une autre compagnie citée. </p>
<p>Adrian montre ensuite un écran 3270 avec 2 couleurs. Il rappelle qu&#8217;il y a peu nous avions des applications développées en mode texte, avec des touches de fonctions pour naviguer. En 2009 nous sommes aujourd&#8217;hui complètement dans un autre univers, avec la présence du réseau. </p>
<p>Il lance ensuite une charge sur la lourdeur des applications J2EE classiques, trop lourdes. Le déploiement d&#8217;une application écrite avec de vieilles technologies comme J2EE 1.4 est difficile. Alors vient OSGI et les modules.</p>
<p>L&#8217;objectif est de livrer une application modulaire, afin de ne déployer qu&#8217;une partie, et donc de faciliter le déploiement. </p>
<p>SpringSource cherche avec Spring dm Server à proposer une autre approche. Tout d&#8217;abord il rappelle que le cycle de vie de déploiement ne s&#8217;arrête pas à la construction de votre War. Le déploiement et l&#8217;administration sont aussi très importants. D&#8217;où le besoin de rendre facilement administrable une application.</p>
<p><em>We live in an Interesting times&#8230;</em> s&#8217;affiche sur le slide suivant&#8230; C&#8217;est la fin de sa présentation, qui aura le mérite de lancer le débat sur l&#8217;avenir de Java et de la plateforme. </p>
<p>La présentation s&#8217;est axée autour de la prise de conscience que les choses sont entrain de changer. Le Cloud Computing, les langages dynamiques, la modularité, on ne sait pas encore ce qu&#8217;il va se passer mais comme il le dit, nous vivons en ce moment des moments de changement intenses.<br />
Le futur arrive, que l&#8217;on aime cette idée ou pas, le Futur arrive à nous.</p>
<p><strong>Analyse et Réflexions</strong><br />
Quoiqu&#8217;un peu polémiste, sa présentation vise tout d&#8217;abord à faire prendre conscience des changements qui s&#8217;opèrent dans notre industrie. Le rachat de SUN Microsystems par Oracle est un événement, dont la portée est encore mal estimée selon les analystes. SpringSource s&#8217;engoufre certainement sur une pente un peu glissante en se présentant comme le chevalier blanc. Quoique le framework soit excellent, le temps nous dira si en effet tout change, et donc le choix d&#8217;une solution plus légère, modulaire, basée sur des langages dynamiques, constitue le bon choix ou non.<br />
En tous les cas, il y a une guerre froide qui ne dit pas son nom, qui devra éclater pour que la communauté continue à diriger Java et son avenir. Je pense que la professionnalisation de l&#8217;open-source expose aujourd&#8217;hui les débats d&#8217;idées entre les grands contributeurs. Là où il y a quelques années, les guerres entre IBM et SUN Microsystems se déroulaient entre 2 commerciaux chez le client, négociant le cuir de leur Porsche de fonction, aujourd&#8217;hui un barbu de JBoss réglera son compte à un barbu de SpringSource autour d&#8217;une bière ou au board d&#8217;une JCR. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-adrian-coyler/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
