<?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; groovy</title>
	<atom:link href="http://www.touilleur-express.fr/tag/groovy/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.touilleur-express.fr</link>
	<description>Blog sur Java, le métier de développeur et la vie de freelance par Nicolas Martignole</description>
	<lastBuildDate>Wed, 08 Feb 2012 11:54:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Traitement du XML en Groovy</title>
		<link>http://www.touilleur-express.fr/2010/02/14/traitement-du-xml-en-groovy/</link>
		<comments>http://www.touilleur-express.fr/2010/02/14/traitement-du-xml-en-groovy/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 15:55:40 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3165</guid>
		<description><![CDATA[
Groovy est un langage particulièrement adapté lorsqu&#8217;il s&#8217;agit de traiter des fichiers plats. Pour rédiger le 500ème billet du blog, j&#8217;ai exporté au format WXR (WordPress eXtended RSS) l&#8217;ensemble des billets. Cela donne un gros fichier XML de 75 762 lignes que vous pouvez télécharger ici.
Lire un fichier XML avec Groovy
Pour ouvrir et lire un fichier XML avec Groovy, rien de plus simple. Il existe 2 classes principales : XmlSlurper et XmlParser. Aujourd&#8217;hui nous ne verrons que le premier.
La structure du fichier XML utilise le format WXR (WordPress eXtended RSS ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.touilleur-express.fr/wp-content/tag_groovy_150_150.jpg"><img src="http://www.touilleur-express.fr/wp-content/tag_groovy_150_150.jpg" alt="" title="tag_groovy_150_150" width="150" height="150" class="alignnone size-full wp-image-2944" /></a><br />
Groovy est un langage particulièrement adapté lorsqu&#8217;il s&#8217;agit de traiter des fichiers plats. Pour rédiger le 500ème billet du blog, j&#8217;ai exporté au format WXR (WordPress eXtended RSS) l&#8217;ensemble des billets. Cela donne un gros fichier XML de 75 762 lignes que vous pouvez télécharger <a href="http://www.touilleur-express.fr/code/backup_touilleur_express.xml.gz">ici</a>.</p>
<h3>Lire un fichier XML avec Groovy</h3>
<p>Pour ouvrir et lire un fichier XML avec Groovy, rien de plus simple. Il existe 2 classes principales : XmlSlurper et XmlParser. Aujourd&#8217;hui nous ne verrons que le premier.<br />
La structure du fichier XML utilise le format WXR (WordPress eXtended RSS format). J&#8217;ai dû adapter et corriger quelques coquilles pour que le fichier puisse être parsé correctement.</p>
<p>Voyons tout d&#8217;abord comment lire un fichier XML en Groovy :</p>
<pre class="brush:groovy">
def file = new File("wordpress.2010-02-14.xml")
def root=new XmlSlurper().parse(file)
</pre>
<p>Plutôt simple non ?</p>
<p>Si nous prenons cette structure XML par exemple :</p>
<pre class="brush:xml">
&lt;rss version="2.0"
	xmlns:excerpt="http://wordpress.org/export/1.0/excerpt/"
	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:wp="http://wordpress.org/export/1.0/"
&gt;

&lt;channel&gt;
	&lt;title&gt;Le Touilleur Express&lt;/title&gt;
        ...
        &lt;item&gt;
            // un article
        &lt;/item&gt;
        &lt;item&gt;
            // un article
        &lt;/item&gt;
&lt;/channel&gt;
&lt;/rss&gt;
</pre>
<p>L&#8217;accès à un attribut est très simple en Groovy. Voici comment afficher le titre du blog et comment afficher le nombre d&#8217;items de la balise channel:</p>
<pre class="brush:groovy">
def file = new File("wordpress.2010-02-14.xml")
def root=new XmlSlurper().parse(file)

println "Blog title : "+root.channel['title']

println "Number of RSS items : "+root.channel.item.size()
</pre>
<pre>
nicolas@localhosr> groovy readXml.groovy
Blog title : Le Touilleur Express
Number of RSS items : 805
</pre>
<h3>Itérer des noeuds</h3>
<p>L&#8217;itération des noeuds XML s&#8217;effectue à l&#8217;aide de closure. La structure RSS de l&#8217;ensemble des articles est construite autour du noeud &laquo;&nbsp;item&nbsp;&raquo;. WordPress y ajoute un ensemble d&#8217;attributs, ce qui permet de distinguer les articles publiés des brouillons, de distinguer les images téléchargées des pages, etc.</p>
<p>Prenons cet exemple de code :</p>
<pre class="brush:groovy">
def file = new File("wordpress.2010-02-14.xml")
def root=new XmlSlurper().parse(file)

root.channel.item.each{it->
	if(it.post_type.text().equals("post")){
		if(it.status.text().equals("publish")){
			println (it.title.text(),"UTF-8")
		}
	}
}
</pre>
<p>L&#8217;élément CHANNEL est constitué d&#8217;une collection d&#8217;ITEM. Pour chacun de ces ITEMs je récupere la valeur de l&#8217;attribut TITLE. Enfin l&#8217;accesseur text() permet de récupérer le titre de l&#8217;article du Touilleur Express.<br />
Le format d&#8217;entrée est UTF-8. Lors de l&#8217;exécution sur Mac, l&#8217;encoding de la plateforme étant par défaut MacRoman, les caractères accentués entre autre ne sont pas correctement affichés. Nous verrons tout à l&#8217;heure comment spécifier le format de sortie.</p>
<h3>Générer un nouveau fichier au format HTML</h3>
<p>Maintenant que vous savez lire un fichier XML, itérer des noeuds, pouvez-vous m&#8217;écrire quelques lignes pour générer une page HTML avec la liste des articles, un lien vers l&#8217;article et la date de publication ?</p>
<p>Voici le fichier d&#8217;entrée :</p>
<pre class="brush:xml">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;rss version="2.0"
	xmlns:excerpt="http://wordpress.org/export/1.0/excerpt/"
	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:wp="http://wordpress.org/export/1.0/"
&gt;

&lt;channel&gt;
	&lt;title&gt;Le Touilleur Express&lt;/title&gt;
		&lt;item&gt;
			&lt;title&gt;Article classique&lt;/title&gt;
			&lt;wp:post_type&gt;post&lt;/wp:post_type&gt;
			&lt;wp:status&gt;publish&lt;/wp:status&gt;
			&lt;link&gt;http://www.touilleur-express.fr/2003/11/22/pourquoi-java-sappelle-java/&lt;/link&gt;
			&lt;pubDate&gt;Sat, 22 Nov 2003 09:28:40 +0000&lt;/pubDate&gt;
		&lt;/item&gt;
		&lt;item&gt;
			&lt;title&gt;Article de brouillon&lt;/title&gt;
			&lt;wp:post_type&gt;post&lt;/wp:post_type&gt;
			&lt;wp:status&gt;draft&lt;/wp:status&gt;
			&lt;link&gt;http://www.touilleur-express.fr/&lt;/link&gt;
			&lt;pubDate&gt;Sat, 22 Nov 2003 09:28:40 +0000&lt;/pubDate&gt;
		&lt;/item&gt;
		&lt;item&gt;
			&lt;title&gt;Page wordpress&lt;/title&gt;
			&lt;wp:post_type&gt;page&lt;/wp:post_type&gt;
			&lt;wp:status&gt;publish&lt;/wp:status&gt;
			&lt;link&gt;http://www.touilleur-express.fr/&lt;/link&gt;
			&lt;pubDate&gt;Sat, 22 Nov 2003 09:28:40 +0000&lt;/pubDate&gt;
		&lt;/item&gt;
	&lt;/channel&gt;
&lt;/rss&gt;
</pre>
<p>Votre script Groovy doit parser le fichier XML ci-dessus, et générer ce fichier HTML :</p>
<pre class="brush:html">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Le Touilleur Express articles&lt;/title&gt;
&lt;meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/&gt;

&lt;body&gt;
&lt;a href='http://www.touilleur-express.fr/2003/11/22/pourquoi-java-sappelle-java/' target='new'&gt;Article classique&lt;/a&gt; publi&eacute; le Sat, 22 Nov 2003 09:28:40 +0000&lt;br/&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Allez au boulot, à vous de travailler. Je vous posterai la réponse un peu plus tard.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/02/14/traitement-du-xml-en-groovy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Groovy++, une version typée statiquement de Groovy</title>
		<link>http://www.touilleur-express.fr/2010/02/08/grovvy-plus-plus/</link>
		<comments>http://www.touilleur-express.fr/2010/02/08/grovvy-plus-plus/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 09:45:29 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[groovy]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3075</guid>
		<description><![CDATA[Mi-décembre, Alex Tkachman et Eugene Vigdorchik ont lancé un projet appelé Groovy++ (prononcez Groovy Booster). L&#8217;idée de ce projet est de créer une version typée statiquement de Groovy afin d&#8217;obtenir de meilleures performances et la vérification à la compilation de votre programme, tout en gardant l&#8217;expressivité et la souplesse de Groovy. Cela donne aussi un boost en terme de performances, sachant que l&#8217;idée est aussi de générer du code optimisé capable d&#8217;utiliser finement les librairies Java existantes. Les auteurs parlent même de surpasser Java, ce qui semble un peu surprenant ...]]></description>
			<content:encoded><![CDATA[<p>Mi-décembre, Alex Tkachman et Eugene Vigdorchik ont lancé un projet appelé Groovy++ (prononcez Groovy Booster). L&#8217;idée de ce projet est de créer une version typée statiquement de Groovy afin d&#8217;obtenir de meilleures performances et la vérification à la compilation de votre programme, tout en gardant l&#8217;expressivité et la souplesse de Groovy. Cela donne aussi un boost en terme de performances, sachant que l&#8217;idée est aussi de générer du code optimisé capable d&#8217;utiliser finement les librairies Java existantes. Les auteurs parlent même de surpasser Java, ce qui semble un peu surprenant au premier abord.</p>
<p>Alex dit :</p>
<blockquote><p>To make a long story short &laquo;&nbsp;statically typed Groovy&nbsp;&raquo; (aka Static Groovy, aka Groovy Booster, aka Groovy++) is an atempt to combine performace and compile-time checks with the expressiveness of the Groovy programming language and to develop high-performant runtime libraries utilizing this combination.</p></blockquote>
<p>Il ne s&#8217;agit pas d&#8217;un nouveau langage, mais d&#8217;une option capable d&#8217;accélérer les applications Groovy comme Grails d&#8217;ailleurs. Pour cela il suffit d&#8217;ajouter un JAR et d&#8217;annoter ses classes Groovy avec @Typed pour bénéficier de l&#8217;effet Groovy++.</p>
<p>Voici un script Groovy écrit par Alex qui parcourt une arborescence de fichier, ouvre chacun des articles, compte le nombre d&#8217;occurence de différents mots et stocke le tout dans 2 fichiers triés par ordre croissant et décroissant. Il y a en fait 2 tâches : la collecte des mots d&#8217;une part, et le rangement d&#8217;autre part.</p>
<pre class="brush:groovy">

package org.mbte.groovypp.examples.wordcount

for (i in 0..&lt;10) {
    t1 = System.currentTimeMillis()
    counts = [:]
    new File("./20_newsgroups").eachFileRecurse{ f ->
      if (!f.isDirectory() &#038;&#038; !f.path.contains(".svn")) {
      f.text.toLowerCase().eachMatch(/\w+/) { w ->
          def c = counts[w] ?: 0
          counts[w] = c + 1 } } }
    new File("counts-descreasing-groovy").withWriter { out ->
      counts.sort { a, b -> b.value < => a.value }.each { k, v -> out < < "$k\t$v\n" } }
    new File("counts-alphabetical-groovy").withWriter { out ->
      counts.sort { it.key }.each { k, v -> out < < "$k\t$v\n" } }
    println "Finished in ${System.currentTimeMillis() - t1} millis"
}
</pre>
<p>D'après les tests d'Alex sur un MacBookPro, ce script tourne en moyenne en 55 secondes avec un volume de 25 Mb. Les détails et le code sont disponibles <a href="http://code.google.com/p/groovypptest/source/browse/#svn/trunk/WordCount/src/org/mbte/groovypp/examples/wordcount">ici</a> si vous voulez creuser un peu plus.</p>
<p>Avec Groovy il est possible de traiter en parrallèle la partie collecte des mots, et la partie comptage-reporting. Voici la version avec l'annotation @Type de Groovy++ qui s'exécute un peu plus rapidement, mais pas comme en 5.5 secondes comme dit Alex sur son blog. Je ne suis pas d'accord avec ses chiffres.</p>
</pre>
<pre class="brush:groovy">
@Typed package org.mbte.groovypp.examples.wordcount

import java.util.concurrent.*
import groovy.util.concurrent.*

for (i in 0..&lt;10) {

    def t1 = System.currentTimeMillis()
    def pool = Executors.newFixedThreadPool(30)
    def counts = new AtomicIntegerMap ()

    new File("./20_newsgroups").recurseFileIterator().filter{ file ->
        !file.directory &#038;&#038; !file.path.contains(".svn")
    }.each(pool,4) { file ->
        file.charSequence.eachMatch(/\w+/) { String w -> w = w.toLowerCase()
            counts[w].incrementAndGet ()
        }
    }.whenBound {
        pool.execute {
            new File("counts-descreasing-groovy").withWriter { Writer out ->
              counts.asList().sort { a, b -> b.get() < => a.get() }.each { e -> out < < "$e.key\t${e.get()}\n" }
            }
        } {
            new File("counts-alphabetical-groovy").withWriter { Writer out ->
              counts.asList().sort { a, b -> b.key < => a.key }.each { e -> out < < "$e.key\t${e.get()}\n" }
            }
        }
        pool.shutdown()
    }

    pool.awaitTermination(30,TimeUnit.SECONDS)
    println "Finished in ${System.currentTimeMillis() - t1} millis"
}
</pre>
<p>Notez l'utilisation de la class <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html">Executors</a> et de la mise en parrallèle du traitement. Une seule Thread principale démarre et itère chaque fichier. Une fois le traitement de celui-ci terminé, après compté le nombre de mot, la génération des rapports est déléguée à 4 threads en parrallèle. Sympa non ?</p>
<p>Voici enfin pour terminer la version Java:
</pre>
<pre class="brush:java">
public class JavaWordCount {
        public static void main(String[] args) throws IOException {

                for (int i = 0; i &lt; 10; ++i) {
                        Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt; sortByCount = new Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt;() {
                                public int compare(Map.Entry&lt;String, Integer&gt; o1, Map.Entry&lt;String, Integer&gt; o2) {
                                        return o2.getValue() - o1.getValue();
                                }
                        };
                        Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt; sortByElement = new Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt;() {
                                public int compare(Map.Entry&lt;String, Integer&gt; o1, Map.Entry&lt;String, Integer&gt; o2) {
                                        return o1.getKey().compareTo(o2.getKey());
                                }
                        };
                        Long timeStart = System.currentTimeMillis();
                        Pattern wordPattern = Pattern.compile("\\w+");
                        File rootDir = new File("./20_newsgroups");
                        CountingSet counter = new CountingSet();
                        for (File groupDirectory : rootDir.listFiles()) {
                                if (groupDirectory.isDirectory() &#038;&#038; !groupDirectory.getPath().contains(".svn")) {
                                        for (File f : groupDirectory.listFiles()) {
                                                if (f.isFile() &#038;&#038; !f.getPath().contains(".svn")) {
                                                        BufferedReader reader = new BufferedReader(new FileReader(f));
                                                        String line;
                                                        while ((line = reader.readLine()) != null) {
                                                                Matcher matcher = wordPattern.matcher(line);
                                                                while (matcher.find()) {
                                                                        counter.add(matcher.group().toLowerCase());
                                                                }
                                                        }
                                                        reader.close();
                                                }
                                        }
                                }
                        }

                        Writer pw = new BufferedWriter(new PrintWriter("./counts-alphabetical-java.txt"));
                        sortAndDisplay(counter.entrySet(), sortByElement, pw);
                        pw.close();

                        pw = new BufferedWriter(new PrintWriter("./counts-decreasing-java.txt"));
                        sortAndDisplay(counter.entrySet(), sortByCount, pw);
                        pw.close();

                        System.out.println("Finished in " + (System.currentTimeMillis() - timeStart) + " ms");
                }
        }

        private static void sortAndDisplay(Set&lt;Map.Entry&lt;String, Integer&gt;&gt; set, Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt; comp, Writer writer) throws IOException {
                List&lt;Map.Entry&lt;String, Integer&gt;&gt; list = new ArrayList&lt;Map.Entry&lt;String, Integer&gt;&gt;(set);
                Collections.sort(list, comp);
                display(list, writer);
        }

        private static void display(Iterable&lt;java.util.Map.Entry&lt;String, Integer&gt;&gt; list, Writer writer) throws IOException {
                for (Map.Entry&lt;String, Integer&gt; entry : list) {
                        writer.write(entry.getKey() + " : " + entry.getValue() + "\n");
                }
        }

        private static class CountingSet extends LinkedHashMap&lt;String, Integer&gt; {
                void add(String s) {
                        Integer i = get(s);
                        put(s, (i == null) ? Integer.valueOf(1) : Integer.valueOf(i + 1));
                }
        }
}
</pre>
<p>Le code Java n&#8217;est pas particulièrement optimisé, mais il a le mérite de montrer plusieurs choses. Tout d&#8217;abord l&#8217;utilisation des APIs Java, ensuite le fait que <strong>Java n&#8217;est pas adapté à ce type de traitement</strong> lorsque l&#8217;on regarde le code source. Oui cela fonctionne, mais ce n&#8217;est pas simple à lire.</p>
<p><strong>Mes propres tests</strong><br />
Du côté des performances voici mes propres résultats avec une arborescence de fichiers Groovy d&#8217;un projet assez important.<br />
Comptons tout d&#8217;abord sous Unix le nombre de fichiers :</p>
<pre>
nicolas@macbookpro> find . -type f  | wc -l
     2467
</pre>
<p>Cela représente un volume de 38 Mo de fichiers Java, Groovy, de pages JSP, bref un projet complet, tel qu&#8217;un outil de compilation comme Maven ou Graddle pourrait devoir traiter par exemple.</p>
<p>J&#8217;ai fait 3 tirs de la version Java. Chaque tir est une série de 10 tests. Le premier test est assez lent car le système fait réellement un accès disque pour charger les fichiers, le test s&#8217;exécute en 190ms en moyenne pour la version Java. J&#8217;ai donc supprimé à chaque fois pour l&#8217;ensemble de mes tests la valeur la plus lente et la valeur la plus rapide, afin de lisser les échantillons de tests.</p>
<p>Voici le script de la version Groovy++ que j&#8217;ai légèrement modifié :</p>
<pre class="brush:groovy">
@Typed(TypePolicy.MIXED)
package test
class Boosted {
    static main(args){
		for (i in 0..&lt;10) {
		    def t1 = System.currentTimeMillis()
		    def counts = [:]
		    new File(".").eachFileRecurse
		    {
			  f -&gt;
		      if (!f.isDirectory() &#038;&#038; !f.path.contains(".svn"))
		      {
		        f.text.toLowerCase().eachMatch(/\w+/) { w -&gt;
		          def c = counts[w] ?: 0
		          counts[w] = c + 1
		          }
		       }
		    }
		    new File("counts-descreasing-groovy").withWriter { out -&gt;
		      counts.sort { a, b -&gt; b.value &lt; =&gt; a.value }.each { k, v -&gt; out &lt; &lt; "$k\t$v\n" } }
		    new File("counts-alphabetical-groovy").withWriter { out -&gt;
		      counts.sort { it.key }.each { k, v -&gt; out &lt; &lt; "$k\t$v\n" } }
		    println "${System.currentTimeMillis() - t1}"
		}
  	}
}
</pre>
<p>Groovy++ est distribué sous la forme d&#8217;un ZIP. Il suffit de le décompresser, de remplacer sa variable GROOVY_HOME pour qu&#8217;elle pointe vers cette version, de mettre à jour son PATH et c&#8217;est tout. J&#8217;ai eu à augmenter les options Java pour résoudre un problème de OutOfMemory (export JAVA_OPTS=&nbsp;&raquo;-Xmx512m&nbsp;&raquo;) mais à part cela, c&#8217;est du Groovy classique.</p>
<p>Voici la moyenne des résultats ma machine (MacBookPro 2.4Ghz Intel Core 2 Duo, 4GB) pour la version Java, la verson Groovy et la version Groovy++</p>
<p><code>Java 1.6.0.17 64-bits :     58,71 ms<br />
            Groovy 1.6.0  :  5839,58 ms<br />
      Groovy ++ 0.1.12: 3858,75 ms </code></p>
<p>Mes propres tests montrent que <strong>la version Groovy++ est plus rapide de 34% par rapport à la version Groovy</strong>. Java reste largement plus rapide que la version Groovy et la version Groovy++. Tout ceci est fait avec un micro-test, ce qui n&#8217;est pas suffisant pour dire que l&#8217;un est plus rapide que l&#8217;autre. Mais cela me refait penser à Graddle, un outil de build Groovy, très sympa à utiliser, mais pour lequel j&#8217;avais une réserve à priori, sans avoir effectué de tests.</p>
<p>Voyons enfin ce que cela donne avec la version 4 Threads d&#8217;Alex. Le script est modifié afin d&#8217;effectuer la partie reporting en parrallèle.</p>
<pre class="brush:groovy">
@Typed(TypePolicy.MIXED)
package test

import java.util.concurrent.*
import groovy.util.concurrent.*

class BoostedOptimized {
    static main(args){
		for (i in 0..&lt;10) {

		    def t1 = System.currentTimeMillis()
		    def pool = Executors.newFixedThreadPool(30)
		    def counts = new AtomicIntegerMap ()

		    new File(".").recurseFileIterator().filter{ file -&gt;
		        !file.directory &#038;&#038; !file.path.contains(".svn")
		    }.each(pool,4) { file -&gt;
		        file.charSequence.eachMatch(/\w+/) { String w -&gt; w = w.toLowerCase()
		            counts[w].incrementAndGet ()
		        }
		    }.whenBound {
		        pool.execute {
		            new File("counts-descreasing-groovy").withWriter { Writer out -&gt;
		              counts.asList().sort { a, b -&gt; b.get() &lt;=&gt; a.get() }.each { e -&gt; out &lt;&lt; "$e.key\t${e.get()}\n" }
		            }
		        } {
		            new File("counts-alphabetical-groovy").withWriter { Writer out -&gt;
		              counts.asList().sort { a, b -&gt; b.key &lt;=&gt; a.key }.each { e -&gt; out &lt;&lt; "$e.key\t${e.get()}\n" }
		            }
		        }
		        pool.shutdown()
		    }

		    pool.awaitTermination(30,TimeUnit.SECONDS)
		    println "${System.currentTimeMillis() - t1}"
		}
  	}
}
</pre>
<p>J&#8217;ai effectué 3 séries de 10 tests, voici la synthèse:<br />
Java 1.6.0.17 64-bits :     58,71 ms<br />
            Groovy 1.6.0  :  5839,58 ms<br />
      Groovy ++ 0.1.12 : 3858,75 ms<br />
Groovy++ 4 Threads : 2129,17ms</p>
<p><a href="http://www.touilleur-express.fr/wp-content/groovy_graph1.jpg"><img src="http://www.touilleur-express.fr/wp-content/groovy_graph1.jpg" alt="" title="groovy_graph" width="306" height="310" class="alignnone size-full wp-image-3087" /></a></p>
<p>La version 4 Threads est donc 63,54% plus rapide que la version Groovy de base. Cependant je pense que c&#8217;est une erreur de les comparer, l&#8217;algo étant différent. Nous devons simplement retenir l&#8217;écart entre la version Groovy standard et la version exécutée avec Groovy Booster qui est de 33%. C&#8217;est déjà beaucoup.</p>
<p>Groovy++ est un projet intéressant, qui montre qu&#8217;il est possible d&#8217;accélérer Groovy. Je serai intéressé de savoir le retour de Guillaume Laforge sur le sujet. Il faut aussi noter qu&#8217;il y a quelques bémols, l&#8217;utilisation de Groovy++ empêche d&#8217;utiliser quelques mots clés comme l&#8217;opérateur de transtypage &laquo;&nbsp;as&nbsp;&raquo; (&laquo;&nbsp;-1&#8243; as Integer par exemple).</p>
<p>Enfin pour terminer, d&#8217;après les billets que j&#8217;ai vu, la version Scala est exactement aussi rapide que la version Java, il n&#8217;y a aucunes différences. C&#8217;est aussi l&#8217;avantage d&#8217;un langage avec typage fort, nous reparlerons de Scala bientôt.</p>
<p>Les tableaux de résultat :<br />
<a href="http://www.touilleur-express.fr/wp-content/groovy_plusplus.gif"><img src="http://www.touilleur-express.fr/wp-content/groovy_plusplus.gif" alt="" title="groovy_plusplus" width="633" height="398" class="alignnone size-full wp-image-3078" /></a></p>
<p><strong>Sources</strong><br />
<a href="http://www.pubbs.net/grails/201001/25655/">Mail d&#8217;Alex à la liste Grails</a><br />
<a href="http://groovy.dzone.com/announcements/first-preview-static-compiler">First preview of static compiler for Groovy is available</a><br />
<a href="http://groovy.dzone.com/articles/how-come-groovy-overperform">How come that Groovy++ overperform Java?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/02/08/grovvy-plus-plus/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Gym avec Groovy, exercice 1</title>
		<link>http://www.touilleur-express.fr/2010/01/26/gym-avec-groovy-exercice-1/</link>
		<comments>http://www.touilleur-express.fr/2010/01/26/gym-avec-groovy-exercice-1/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 07:59:09 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[groovy]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=2928</guid>
		<description><![CDATA[Merci de participer ce matin à notre petite série d&#8217;exercice sur Groovy. Après un échauffement, nous allons travailler les abdos-fixtures, faire quelques moulinets de Closures, s&#8217;étirer avec des astuces sur les fichiers, bref que du bon code pour débuter. Je vous prends en main cette semaine, avec chaque jour un petit exercice simple afin de vous réhabituer à un bon langage, léger
Après avoir pris votre tapis&#8230; de souris, venez vous assoir devant moi, et écouter attentivement. Les exercices sont adaptés du livre &#171;&#160;Groovy Recipes&#160;&#187; par Scott Davis pour ceux qui ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.touilleur-express.fr/wp-content/tag_groovy_150_150.jpg"><img src="http://www.touilleur-express.fr/wp-content/tag_groovy_150_150.jpg" alt="" title="tag_groovy_150_150" width="150" height="150" class="alignleft size-full wp-image-2944" /></a>Merci de participer ce matin à notre petite série d&#8217;exercice sur <a href="http://groovy.codehaus.org">Groovy</a>. Après un échauffement, nous allons travailler les abdos-fixtures, faire quelques moulinets de Closures, s&#8217;étirer avec des astuces sur les fichiers, bref que du bon code pour débuter. Je vous prends en main cette semaine, avec chaque jour un petit exercice simple afin de vous réhabituer à un bon langage, léger<br />
Après avoir pris votre tapis&#8230; de souris, venez vous assoir devant moi, et écouter attentivement. Les exercices sont adaptés du livre &laquo;&nbsp;<a href="http://pragprog.com/titles/sdgrvr/groovy-recipes">Groovy Recipes</a>&nbsp;&raquo; par Scott Davis pour ceux qui veulent pratiquer de leur côté.</p>
<h2>La surchage pondérale d&#8217;opérateur</h2>
<p>Grâce à Java, je sais que ce petit problème de surcharge pondérale n&#8217;était plus trop d&#8217;actualité. Pourtant nous allons voir ensemble qu&#8217;avec <a href="http://www.groovy.org">Groovy</a>, la surcharge d&#8217;opérateur est une chose très pratique. Pour cela, nous allons travailler avec la date.</p>
<p>Notre série d&#8217;exercices se déroulera dans une salle toute neuve hébergée sur Google App Engine (prononcez eng-i-neu) développée avec <a href="http://gaelyk.appspot.com/">Gaelyk</a> par <a href="http://www.touilleur-express.fr/?s=guillaume+laforge">Guillaume Laforge</a>. Ouvrez donc <a href="http://groovyconsole.appspot.com/">la Groovy Web Console</a> et débutons par quelques exercices simples pour travailler la surcharge d&#8217;opérateur. Tapez simplement le texte  ci-dessous puis appuyez sur &laquo;&nbsp;<em>Execute script</em>&laquo;&nbsp;. Je note avec le symbole &laquo;&nbsp;=>&nbsp;&raquo; le résultat de l&#8217;opération.</p>
<pre class="brush:groovy">
def today=new Date()

=> Mon Jan 25 07:57:43 UTC 2010
</pre>
<p>La surcharge d&#8217;opérateur est une fonction très pratique en Groovy. Imaginons que vous souhaitez connaître la data dans 7 jours. L&#8217;opérateur &#8216;+&#8217;  étant surchargé dans le cas d&#8217;une Date, il est alors possible d&#8217;écrire ce code:</p>
<pre class="brush:groovy">
def today=new Date()
println today
=> Tue Jan 26 08:28:33 UTC 2010

def tomorrow=today.next()
println tomorrow
=> Wed Jan 27 08:28:33 UTC 2010

def nextWeek=tomorrow+7
println nextWeek
=> Wed Feb 03 08:28:33 UTC 2010

def yesterday=today.previous()
println yesterday
=> Mon Jan 25 08:28:33 UTC 2010
</pre>
<p>Derrière l&#8217;opérateur plus, Groovy appelle la fonction next(). Voici une liste des opérateurs et des méthodes correspondants à ces opérateurs en Groovy :</p>
<pre class="brush:groovy">
Opérateur		Méthode
a==b or a!=b	a.equals(b)
a + b	 		a.plus(b)
a - b			a.minus(b)
a * b			a.multiply(b)
a / b			a.div(b)
a % b			a.mod(b)
a++ ou ++a		a.next()
a-- ou --a		a.previous()
a &#038; b			a.and(b)
a | b			a.or(b)
</pre>
<p>Les opérateurs suivants sont plus communs, surtout lors de la manipulation des Listes :</p>
<pre class="brush:groovy">
Opérateur		Méthode
a[b]			a.getAt(b)
a[b]=c			a.putAt(b,c)
a &lt;&lt; b			a.leftShift(b)
a >> b			a.righShift(b)
a < b ou a > b 	a.compareTo(b)
a &lt;= b / a >= b	a.compareTo(b)
</pre>
<p>La manipulation des listes est encore plus simple en Groovy qu&#8217;en Java. Il est donc possible d&#8217;écrire par exemple ce bout de code (tiré du livre Groovy Recipes par Scott Davis).</p>
<pre class="brush:groovy">

def today=new Date()

(1..7).each{
println today++
}

=>
Mon Jan 25 09:31:41 CET 2010
Tue Jan 26 09:31:41 CET 2010
Wed Jan 27 09:31:41 CET 2010
Thu Jan 28 09:31:41 CET 2010
Fri Jan 29 09:31:41 CET 2010
Sat Jan 30 09:31:41 CET 2010
Sun Jan 31 09:31:41 CET 2010
</pre>
<p><em>Note: Ce code ne marchera que sur votre machine en local en utilisant groovyConsole. </em></p>
<h2>Passage sur le dos, parlons des listes</h2>
<p>Avez-vous noté la notation (1..7) dans l&#8217;exercice précèdent ? C&#8217;est ce que l&#8217;on appelle une <em>Range</em> en Groovy. Pratique non ?</p>
<p>Passons à un exercice plus intéressant, et plus proche de ce que vous allez pratiquer avec Groovy d&#8217;ici quelques semaines : la manipulation des listes, des Maps et des Sets en Groovy.</p>
<h3>Création d&#8217;une liste</h3>
<p>La syntaxe est simple. Une liste est créé en utilisant les crochets. C&#8217;est une ArrayList simple, ni plus, ni moins.</p>
<pre class="brush:groovy">
def touilleurThemes=["Java","Apple","Scrum","Groovy"]

println touilleurThemes
=> [Java, Groovy, Scrum, Apple]

println touilleurThemes.size()
=> 4

touilleurThemes &lt;&lt; "Web 2.0"
println touilleurThemes
=> [Java, Groovy, Scrum, Apple,Web 2.0]

// Récuperer le premier élement
println touilleurThemes.first()
=> Java
println touilleurThemes[0]
=> Java
</pre>
<h3>Itérer une liste en Groovy</h3>
<p>Les closures sont utilisées lors de l&#8217;itération d&#8217;une liste. Voici quelques exemples d&#8217;itérations de la liste :</p>
<pre class="brush:groovy">
// Itération simple
def touilleurThemes=["Java","Groovy","Scrum","Apple"]
touilleurThemes.each{nom->
 println nom
}
=>Java
Groovy
Scrum
Apple

// Verson simplifié, it est une variable implicite
// Itération encore plus simple
def touilleurThemes=["Java","Groovy","Scrum","Apple"]
touilleurThemes.each{
 println it
}
</pre>
<p>Il reste possible d&#8217;itérer la liste en utilisant la syntaxe de Java 5 si vous préférez celle-ci :</p>
<pre class="brush:groovy">
def touilleurThemes=["Java","Groovy","Scrum","Apple"]
for(String item : touilleurThemes) {
println item
}

=>Java
Groovy
Scrum
Apple
</pre>
<h3>Trier, ranger, manipuler une liste</h3>
<p>Les listes sont des objets facilement manipulables. Il est possible de les trier, de les découper, de dépiler un élément comme sur une Queue, de rechercher un pattern, bref de faire un grand nombre d&#8217;opérations très pratique. Plutôt qu&#8217;un long discours, regardez attentivement ces exemples de code. Vous me ferrez 2 séries de 10, avec une grande respiration entre chaque exercice.</p>
<pre class="brush:groovy">

// Trier une liste avec sort
// Le tri est permanent, la liste originale est triée
def languages=["Java","Groovy","Scala","Lisp","Clojure","Perl","Python"]
languages.sort()
languages.each{ println it }

=>Clojure
Groovy
Java
Lisp
Perl
Python
Scala

// Retourner une liste, cette fois-ci la liste originale
// ne sera pas modifiée.
def revertedList=languages.reverse()
revertedList.each{ println it }

=>
Scala
Python
Perl
Lisp
Java
Groovy
Clojure

// 3 Dépiler le dernier élément
def languages=["Java","Groovy","Scala","Lisp","Clojure","Perl","Python"]
println  languages.pop()
=> Python

// 4 Concatenation
def languages=["Java","Groovy","Scala","Lisp","Clojure","Perl","Python"]
def newLanguages=["Ruby","Goo","Javascript"]

languages+=newLanguages
println languages
=> [Java, Groovy, Scala, Lisp, Clojure, Perl, Python, Ruby, Goo, Javascript]

languages-=newLanguages
println languages
=> [Java, Groovy, Scala, Lisp, Clojure, Perl, Python]
</pre>
<p>Il est possible aussi de joindre une liste en une seule String, ou même de spécifier un séparateur par exemple. Très pratique lorsque vous souhaitez écrire une ligne au format CSV à partir d&#8217;une liste de résultats :</p>
<pre class="brush:groovy">
def languages=["Java","Groovy","Scala","Lisp","Clojure","Perl","Python"]

println languages.join()
//JavaGroovyScalaLispClojurePerlPython

println languages.join(",")
//Java,Groovy,Scala,Lisp,Clojure,Perl,Python
</pre>
<p>Les closures peuvent aussi être utilisées pour rechercher un élément rapidement dans une liste. Imaginons que vous souhaitez retrouver l&#8217;ensemble des noms commençant par la lettre J :</p>
<pre class="brush:groovy">
def languages=["Java","Groovy","Scala","Lisp","Clojure","JRuby","Jython"]
def resultList = languages.findAll {it.startsWith("J")}
resultList.each{println it}

=>Java
JRuby
Jython
</pre>
<p>Les listes de chiffres sont faciles à manipuler, il est possible d&#8217;additionner la série, de rechercher la valeur maximum ou minimum :</p>
<pre class="brush:groovy">
def ages=[23,34,45,12,46,21,42,56,18]

println ages.max()
=> 56
println ages.min()
=> 12
println ages.sum()
=> 297
println "Moyenne: " + ages.sum()/ages.size()
=>33
</pre>
<p>La méthode <strong>collect</strong> permet de créer une nouvelle liste en concaténant un Objet à chacun des éléments de la liste initiale.</p>
<pre class="brush:groovy">
def ages=[23,34,45]
def resultList=ages.collect{ it += " ans"}
resultList.each{println it}

=>23 ans
34 ans
45 ans
</pre>
<h3>L&#8217;opérateur Spread (*)</h3>
<p>L&#8217;opérateur Spread (marqué avec une astérisque *) est un opérateur courant utilisé pour exécuter une méthode sur chacun des éléments d&#8217;une liste, ou pour aussi distribuer les éléments d&#8217;une liste à une méthode. Il y a 2 variantes. L&#8217;opérateur spread seul (*) et l&#8217;opérateur spread-dot (noté *.).<br />
L&#8217;opérateur spread seul peut être utilisé pour passer une liste d&#8217;argument à une méthode. Il va itérer chacun des éléments et les passer un à un. C&#8217;est peu commun donc je n&#8217;en parlerai pas plus ici. L&#8217;opérateur spread-dot est plus courant. Dans l&#8217;exemple ci-dessous, le caractère *. signifie : prend chacun des éléments de la liste et effectue un appel à la méthode toUpperCase, stocke le tout dans une nouvelle liste.</p>
<pre class="brush:groovy">
def languages=["Java","Groovy","Goo"]

// L'opérateur Spread dot
def resultList=languages*.toUpperCase()

// Affiche la nouvelle liste
resultList.each{println it}

=> JAVA,
GROOVY,
GOO
</pre>
<h1>Conclusion</h1>
<p>Voilà c&#8217;est tout pour ce matin. Nous verrons la suite demain. Passez une bonne journée !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/01/26/gym-avec-groovy-exercice-1/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Grails en quelques mots</title>
		<link>http://www.touilleur-express.fr/2009/12/19/grails-en-quelques-mots/</link>
		<comments>http://www.touilleur-express.fr/2009/12/19/grails-en-quelques-mots/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 23:31:00 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Startup]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=2678</guid>
		<description><![CDATA[ Je travaille depuis quelques mois avec le framework Web Grails.  Cela fait quelques semaines que je m&#8217;en sers presque 8 heures par jour. Je vous propose un petit tour du propriétaire.
Grails est un framework Web basé sur le langage Groovy clairement orienté productivité. J&#8217;ai ramené 4 livres de Devoxx sur Groovy et Grails, et le meilleur ouvrage pour rentrer dedans reste &#171;&#160;Grails in Action&#160;&#187; de Glen Smith et Peter Ledbrook. 470 pages plus tard vous serez en mesure de construire une application industrielle, et il vous manquera un ...]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.touilleur-express.fr/wp-content/tag-150-150-grails1.jpg" alt="tag-150-150-grails" title="tag-150-150-grails" width="150" height="150" class="alignleft size-full wp-image-2685" /> Je travaille depuis quelques mois avec le framework Web Grails.  Cela fait quelques semaines que je m&#8217;en sers presque 8 heures par jour. Je vous propose un petit tour du propriétaire.</p>
<p><a href="http://www.grails.org">Grails</a> est un framework Web basé sur le langage Groovy clairement orienté productivité. J&#8217;ai ramené 4 livres de Devoxx sur Groovy et Grails, et le meilleur ouvrage pour rentrer dedans reste &laquo;&nbsp;<a href="http://www.manning.com/gsmith/">Grails in Action</a>&nbsp;&raquo; de Glen Smith et Peter Ledbrook. 470 pages plus tard vous serez en mesure de construire une application industrielle, et il vous manquera un peu de détails sur Groovy, facilement couvert par exemple avec &laquo;&nbsp;<a href="http://pragprog.com/titles/sdgrvr/groovy-recipes">Groovy Recipes</a>&nbsp;&raquo; de Scott Davis.</p>
<p>Grails s&#8217;installe en 5 minutes, se découvre en 30 minutes et se maîtrise en une semaine. Je me dis que si mon aventure de Startup ne marche pas, je pourrai toujours écrire un livre sur le sujet en Français. C&#8217;est vous dire si j&#8217;ai envie de vous en parler.</p>
<p><strong>Introduction à Grails</strong><br />
Grails m&#8217;est tombé dessus car j&#8217;avais besoin d&#8217;une solution pour démarrer rapidement, valider rapidement (et éventuellement me planter rapidement). Je me surprends à tester des bouts de code, à écrire des choses comme &laquo;&nbsp;Books.findByAuthor(&#8216;Guillaume Laforge&#8217;)&nbsp;&raquo; et à voir que Grails génère le code de ce finder pour moi&#8230; Envie d&#8217;Ajax ? je transforme mes tags form en remoteForm et ça marche. Envie de faire un formulaire avec 4 écrans ? Spring Webflow est intégré, le flow est écrit en Groovy, rien de plus simple&#8230; Et c&#8217;est comme cela depuis 3 semaines&#8230; Je n&#8217;arrête pas de m&#8217;étonner de la maturité et de la puissance de ce framework Web.</p>
<p><strong>Avec ou sans état ?</strong><br />
Grails comme Play! se classe dans la catégorie des frameworks Webs sans état. Il y a bien entendu une session, des scopes pour vous aider à travailler. Mais là où Wicket et JSF sont orientés composants, Grails est clairement orienté Web / HTTP. Il n&#8217;y a pas la notion d&#8217;Application et il n&#8217;y a pas la notion de composants comme en Wicket ou JSF2 par exemple. Nous pouvons donc dire que Grails est adapté pour la réalisation de projets plutôt Web, et il n&#8217;est pas forcément le plus adapté pour réaliser une application riche. Il y a pourtant des applications basées sur du Flex pour la couche de présentation qui travaillent avec une partie serveur en Grails pour les services. Cette alchimie fonctionne donc aussi.</p>
<p><strong>Fan des conventions au lieu de la configuration</strong><br />
Grails tire ses origines du framework Rails du monde Ruby. Mais il utilise le langage Groovy qui tourne sur la JVM. Ses cousins ? JRuby on Rails, Clojure, le framework Lift du monde Scala, et Play! du monde Java. C&#8217;est un framework Web clairement orienté productivité et simplicité. Pour moi, il fait parti des frameworks webs de 4ème génération. Il y a d&#8217;abord eu les JSPs, les Servlets et les Applets. Puis ensuite Struts avec les premiers frameworks MVC de type 2. Ensuite l&#8217;apparition des RIAs (<a href="http://www.touilleur-express.fr/2008/07/04/rich-internet-application-ou-pourquoi-on-vous-parle-de-ca/">Rich Internet Applications</a>) avec GWT, JSF, Wicket. Et donc maintenant je crois dur comme fer à ces nouveaux frameworks Webs, qui reviennent sur les bases du protocole HTTP pour offrir des performances et de la simplicité.</p>
<p>Grails est sorti en 2006. Il y a des sites en production comme <a href="http://www.businessworld.in/">Businessworld</a>, Sky.com ou encore <a href="https://www.escapeer.com/">Escapeer</a>. La page <a href="http://www.grails.org/Testimonials">Testimonials</a> donne une idée de quelques projets réalisés avec Grails et Groovy.</p>
<p>Groovy est le point fort de Grails. Je vous parlais de trouver des livres quelques lignes plus hauts. Vous pouvez aussi écrire des bouts de code comme par exemple:<br />
<code><br />
Book.findAllByDatePublishedGreaterThanAndTitleLike(myDate,"Grails par le Touilleur Express") </code></p>
<p>Grails sera capable de générer le code Hibernate, Spring et Groovy afin de trouver tous les livres dont la date de publication est postérieure à une date, et dont le titre ressemble à ce que je précise&#8230; Lorsque je vous dis que vous allez gagner du temps, vous commencez à me croire ?</p>
<p><strong>Grails utilise des standards</strong><br />
Grails utilise Groovy, et ensuite le couple Hibernate/Spring de base. Il est assez facile d&#8217;ajouter de nouvelles librairies grâce à des plugins. Dans mon projet par exemple j&#8217;utilise Drools. Je n&#8217;ai eu besoin que de 10 minutes pour créer un controleur simple et une règle Drools pour tester une idée.</p>
<p><strong>Les idées de Grails</strong><br />
Ce qui suit est tiré du livre &laquo;&nbsp;Grails in Action&nbsp;&raquo;. Il y a 7 idées clés à comprendre pour adopter Grails:<br />
- Convention au lieu de la Configuration<br />
- Philosophie Agile<br />
- Des fondations solides<br />
- Scaffolding et moteur de template<br />
- Intégration avec Java<br />
- Une communauté et des plugins<br />
- La Productivité améliore la qualité et réduit le risque d&#8217;erreur</p>
<p>Concernant <strong>l&#8217;aspect convention au lieu de configuration,</strong> cela revient à vous dire que pour gagner du temps, il faut suivre ce que dis le framework. J&#8217;ai juste un mot à dire aux gens qui font du Maven2, mais qui ne veulent pas ranger leurs fichiers dans src/main/java, qui désactivent les tests, qui veulent lancer des scripts Ant avec Maven : <strong>arrêtez Maven</strong>.<br />
Vous n&#8217;avez rien compris à sa philosophie, vous pleurez car &laquo;&nbsp;Maveneu il rameuu&nbsp;&raquo; alors que si vous aviez pris le soin de lire l&#8217;excellent livre &laquo;&nbsp;Apache Maven&nbsp;&raquo;, vous ne seriez pas comme un gosse avec le pantalon mouillé. Si vous commencez à bidouiller l&#8217;outil, c&#8217;est que vous n&#8217;avez pas lu la documentation, que vous n&#8217;avez pas écouté ce que vous disent les développeurs. A ce titre, je trouve que les livres que j&#8217;ai lu m&#8217;ont énormément aidés par rapport à la doc de Grails, qui ne distille pas assez la philosophie, à mon sens. Donc si vous voulez me suivre : achetez des livres sur Grails.</p>
<p>Grails est simple : une entité Survey est toujours stockée dans le répertoire domain. Cela permet à Grails de gérer l&#8217;object via Hibernate pour vous. Un controlleur est nommé SurveyController, et il est placé lui-aussi dans un endroit attendu par Grails. Si vous ajouter une méthode &laquo;&nbsp;completeSurvey&nbsp;&raquo;, celle-ci est alors accessible automatiquement via une url comme &laquo;&nbsp;/survey/completeSurvey&nbsp;&raquo;. Si vous créez une nouvelle entité &laquo;&nbsp;Answer&nbsp;&raquo;, Grails se charge de créer la table en base de données. Vous n&#8217;avez pas généré de fichiers pour tout ce qui est CRUD ? Grails le fait tout seul. Pour l&#8217;affichage des pages, il suffit de créez un fichier &laquo;&nbsp;/views/survey/completeSurvey.gsp&nbsp;&raquo; et il sera alors automatiquement chargé&#8230;</p>
<p>C&#8217;est bien de la Convention par dessus la Configuration et surtout pas de la Convention &laquo;&nbsp;au lieu de&nbsp;&raquo; la Configuration. Si vous voulez utiliser vos fichiers de mapping Hibernate : oui c&#8217;est possible. Mais par défaut : vous n&#8217;en n&#8217;avez pas besoin. Tout ce qu&#8217;il est possible de faire de manière répétitive et générique, c&#8217;est offert. Et comme vous aurez besoin de mettre le nez dedans, vous pouvez aussi le faire.</p>
<p>J&#8217;en suis à 16 classes pour mon domaine, à 2700 lignes de codes, 19 contrôleurs, et en 3 semaines j&#8217;ai déjà une application qui tourne&#8230; Je vous assure que je vous montrerai tout cela dans une vidéo très bientôt.</p>
<p><strong>Grails est adapté au développement Agile</strong>. En fait je pense même que l&#8217;on peut dire que c&#8217;est un framework Web Agile. Les tests unitaires comme les tests fonctionnels sont faciles à écrire. Le fait de pouvoir créer un War, c&#8217;est aussi très pratique. Je vous explique cela : j&#8217;ai installé un Tomcat sur une machine, avec une base MySQL. Sur mon Mac, en ligne de commande il suffit que je tappe &laquo;&nbsp;grails war production&nbsp;&raquo; pour que cela me construise un fichier WAR, qu&#8217;il me suffit de déployer ensuite sur Tomcat pour la version en production. A aucuns moments je n&#8217;ai eu besoin de mettre le nez dans un quelconque fichier web.xml&#8230;<br />
Au quotidien je ne construis pas de WAR. Je tappe simplement &laquo;&nbsp;grails run-app&nbsp;&raquo; et un serveur Jetty démarre, intégré à Grails. Lorsque je code, je n&#8217;arrête presque pas le serveur. En fait, lorsque vous changez un bout de page GSP, celle-ci se rafraîchit tout en gardant votre session. Si vous ajoutez une nouvelle méthode dans votre contrôleur, l&#8217;url est disponible et vous pouvez continuer à coder. Il n&#8217;y a qu&#8217;en cas de plantages que je relance parfois le serveur, lorsque ma session est pourrie. Je trouve que la remontée d&#8217;erreur pourrait encore faire des progrès par rapport à Play! mais c&#8217;est déjà pas mal.</p>
<p><strong>Grails est basé sur des fondations solides.</strong> Spring et Hibernate. Spring 3 depuis la toute dernière version 1.2.RC2 que je teste en ce moment. En fait vous ne voyez pas Hibernate et Spring, mais vous savez que vous pouvez aller voir si nécessaire. Le moteur de scheduling ? C&#8217;est Quartz. Le moteur de recherche ? Lucene et Compass pour les entités. Le moteur de construction ? SiteMesh&#8230; Bref il n&#8217;y a pas d&#8217;innovations. Nous parlons bien de techniques que vous connaissez déjà. Imaginez simplement ceci : écrire moins de code, travailler plus vite.</p>
<p><strong>Le moteur de scaffolding et de templating</strong>. J&#8217;adore Spring MVC. Je m&#8217;en suis servi l&#8217;été dernier pour mon projet sur Google App Engine (<a href="http://touilleur.appspot.com">http://touilleur.appspot.com</a>), projet que je ne finirai pas faute de temps. Grails est assez radical par rapport à Spring MVC. Là où vous auriez quelques beans annotés, des fichiers de configuration, un peu d&#8217;Hibernate et une configuration avec la base, Grails fait la même chose en quelques minutes.<br />
<code><br />
grails create-app myapp<br />
...<br />
...<br />
grails run-app<br />
</code><br />
Ouvrez votre navigateur : http://localhost:8080/myapp, c&#8217;est prêt. Ensuite si vous voulez ajouter un nouveau contrôler :<br />
<code><br />
grails create-controller MonControleur<br />
</code><br />
C&#8217;est tout !</p>
<p>Lorsque vous créez une nouvelle entité, un nouvel objet du domaine, il est facile aussi pour Grails de vous générez automatiquement tout ce qui est CRUD. C&#8217;est ce que l&#8217;on appelle le scaffolding. Ce n&#8217;est pas destiné à remplacer votre application. En fait voici comment je travaille : je génère d&#8217;abord mes entités avec des idées à tester. Ensuite je crée un controleur pour cette entité en mode &laquo;&nbsp;scaffold&nbsp;&raquo;. Cela me permet de tester mon objet, de valider les relations one-to-one, one-to-many, many-to-many et de m&#8217;assurer que tout marche. Enfin, je refais un vrai contrôleur pour mon application finale, et je ne touche pas à ce que Grails m&#8217;a généré. Je recopie quelques petits bouts de code pour gagner du temps, mais c&#8217;est là que je code vraiment mon application. Cela me fait gagner un temps fou.</p>
<p><strong>L&#8217;intégration avec Java</strong> est là pour rassurer les bons pères de famille. Il y a un répertoire Java. Vous pouvez y placer ce que vous voulez. Pour peu qu&#8217;une librairie de votre ERP soit en Java, et qu&#8217;il soit nécessaire d&#8217;écrire un peu de code orienté Service, Grails vous aménage un espace dédié pour le faire, et se débrouille pour injecter vos services Java dans les contrôleurs Grails&#8230; C&#8217;est très pratique. Je m&#8217;en suis servi pour une partie avec du Drools, que j&#8217;ai migré vers du Groovy car finalement, c&#8217;est plus simple.</p>
<p><strong>Grails a une communauté</strong>. C&#8217;est bête, mais lorsque le lundi matin vous êtes seul dans votre bureau de 7m2, croyez-moi vous êtes super content de voir qu&#8217;il y a pleins de gens qui se servent de Grails sur Internet. Google est ton ami. La documentation est bonne. Le produit vit, et la liste de diffusion users est très active. J&#8217;ai appris beaucoup en lisant les échanges ces dernières semaines. Enfin côté livre je vous le disais tout à l&#8217;heure, il y a de très bons livres en Anglais. Si j&#8217;avais le temps et le courage, je me lancerai bien dans l&#8217;écriture d&#8217;un livre en Français. Mais je suis trop bavard&#8230; Pas possible pour moi.</p>
<p>Enfin pour terminer, le 7e point noté par les auteurs de Grails in Action, c&#8217;est l&#8217;aspect de productivité et la possibilité de valider ou non ses idées très rapidement. Pour notre projet qui sera en ligne l&#8217;été prochain, je me remercie chaque jour d&#8217;avoir pris Grails pour gagner du temps, faire des démonstrations qui marchent chaque semaine, jeter sans souci du code écrit en 3 jours au lieu de 2 semaines, bref je peux dormir tranquillement la nuit. Est-ce que tu comprends que je peux virer des idées foireuses car elles ne m&#8217;ont coutés que 2 jours au lieu de 2 semaines ? Un vrai projet de Startup c&#8217;est beaucoup d&#8217;essais. Personne ne vous dira si ce que vous faîtes c&#8217;est bien ou pas. Il faut avoir cette possibilité de changer de cap très rapidement, encore une fois dans le cadre d&#8217;une Startup pour moi.</p>
<p><strong>Conclusion</strong><br />
Pour terminer, je vous laisse ici ce soir. Je vous montrerai un peu de Grails, du vrai code, pas un &laquo;&nbsp;Hello World&nbsp;&raquo;, plutôt une application écrite en quelques heures, afin de vous faire comprendre ce qui a retenu mon attention.</p>
<p>Je pense aussi que nous, <strong>développeurs Javas</strong>, devons nous remettre en question d&#8217;urgence. En voyant des projets sur PHP ou Ruby on Rails, j&#8217;ai un peu la gueule de bois avec mon Java. Je pense que pour le développement d&#8217;applications Webs, il faut revoir notre manière de penser, notre manière de travailler. J&#8217;ai même du mal à croire au succès de Struts hier, de Wicket/Tapestry/JSF en ce moment&#8230; Comment pouvons-nous rouler des mécaniques alors que d&#8217;autres langages sont bien meilleurs pour faire du développement webs ? Que d&#8217;autres frameworks sont bien mieux pensés et bien moins prétentieux que ce que nous vendons depuis 3-4 ans à nos clients ? Comment avons-nous pu vendre des développements avec du Struts, des JSPs à des clients finaux ? Comment ?</p>
<p>Imaginez-vous entrain d&#8217;expliquer aux clients que les développeurs  sur certains projets doivent construire un WAR, arrêter et relancer leur serveur d&#8217;application avant de voir leur résultat&#8230; alors que c&#8217;est inutile avec Grails (et d&#8217;autres)&#8230;</p>
<p>Et encore, je ne vous ai même pas encore dit que j&#8217;étais aussi tombé amoureux de Groovy&#8230;</p>
<p>J&#8217;en garde pour la prochaine fois.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/12/19/grails-en-quelques-mots/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Jazoon : Gradle la présentation qui aura lieu jeudi soir&#8230;</title>
		<link>http://www.touilleur-express.fr/2009/06/23/jazoon-gradle-la-presentation-qui-aura-lieu-jeudi-soir/</link>
		<comments>http://www.touilleur-express.fr/2009/06/23/jazoon-gradle-la-presentation-qui-aura-lieu-jeudi-soir/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 22:24:20 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1552</guid>
		<description><![CDATA[Cher lecteur du Touilleur Express. Après avoir publié comme tu le sais de nombreuses fois à 2h du matin pour que tu aies ton numéro du Touilleur à lire au petit matin, sache que j&#8217;ai un nouveau concept à te présenter. J&#8217;ai assisté à la présentation qui va avoir lieu ce jeudi à Paris chez Zenika. Et donc tu peux soit attendre jeudi et te faire ta propre opinion, soit lire et voir tout le mal que je pense du speaker. Note que je viens de spoiler un peu&#8230; mince.
Alors ...]]></description>
			<content:encoded><![CDATA[<p>Cher lecteur du Touilleur Express. Après avoir publié comme tu le sais de nombreuses fois à 2h du matin pour que tu aies ton numéro du Touilleur à lire au petit matin, sache que j&#8217;ai un nouveau concept à te présenter. J&#8217;ai assisté à la présentation qui va avoir lieu ce jeudi à Paris chez Zenika. Et donc tu peux soit attendre jeudi et te faire ta propre opinion, soit lire et voir tout le mal que je pense du speaker. Note que je viens de spoiler un peu&#8230; mince.</p>
<p>Alors sur le fond tout d&#8217;abord, je garde la forme pour la suite. Hans Dockter est le responsable du projet <a href="http://www.gradle.org">Gradle</a>, un ancien commiter de JBoss IDE, et un formateur chez Skill Matters. La présentation sera animée, avec du code et un exemple intéressant à suivre.<br />
Tout d&#8217;abord la première question  : pourquoi Gradle ?<br />
Ah il y a une autre question avant dans la salle : c&#8217;est quoi Gradle ?<br />
Gradle est un système de build écrit en Groovy qui permet de construire une application, de la packager, de gérer les releases, la version sur le repository du code source, bref de faire ce que fait Ant/Maven. Il utilise d&#8217;ailleurs les dépendances de Maven sans problèmes (qui a dit &laquo;&nbsp;pas comme maven&nbsp;&raquo; ?)</p>
<p>Hans Dockter a présenté Gradle en axant dans sa première partie les défauts des autres outils comme Ant ou Maven. Là où il a tout à fait raison, c&#8217;est que Ant est bien trop simple. Il demande ainsi à la salle si nous avons une idée du nombre d&#8217;éléments de la DTD d&#8217;un script Ant ? la réponse est 5 : Tasks, Properties,  et j&#8217;ai oublié les 3 autres&#8230; Bref cela fait que pour des tâches répétitives, il faut systématiquement définir ses tâches, comme JUnit. Bon ok.</p>
<p>Gradle vise à rendre l&#8217;impossible, possible. A rendre le possible -> facile. Et le facile -> élégant. Il explique que le modèle des scripts Ant date des années 97-2000, que depuis nous avons besoin d&#8217;une solution plus souple. Alors ensuite Maven.</p>
<p>Maven 2 offre beaucoup de fonctionnalités supplémentaires, voir peut-être trop d&#8217;après lui. Le support des plugins, des dépendances transitives, le build-by convention, bref tout ceci fait que Maven est plutôt un bon système. Il reproche simplement la verbosité du XML, le fait qu&#8217;il soit difficile de n&#8217;exécuter que certaines tâches, la complexité de certains plugins, le manque de consolidation dans la manière de gérer et configurer les plugins, bref trois fois rien&#8230;</p>
<p>Alors arrive Gradle. A cet instant de la présentation cher lecteur, je suis un peu dubitatif. J&#8217;ai horreur des gens qui vendent un médicament en critiquant les autres médicaments au lieu de parler de la maladie. J&#8217;étais donc assez fatigué d&#8217;entendre depuis 15mn du vent sur &laquo;&nbsp;<em>Ant il est tout pourri</em>&nbsp;&raquo; et &laquo;&nbsp;<em>Maven nous emmène jamais au heaven</em>&laquo;&nbsp;&#8230; A ma gauche j&#8217;ai quand même <a href="http://blogs.codehaus.org/people/vmassol/">Vincent Massol</a> de XWiki, l&#8217;un des CastCodeurs, mais surtout l&#8217;un des auteurs de <a href="http://www.amazon.fr/Maven-Developers-Notebook-Vincent-Massol/dp/0596007507">Maven: A Developer&#8217;s Notebook</a>, livre à lire d&#8217;urgence. Et je sens que Vincent n&#8217;est pas traversé par le saint-esprit de Gradle. Je me trompe Vincent ?</p>
<p>Hans Docket ouvre (enfin) son IDE favori (IDEA IntelliJ) sur sa machine favorite (Mac Book Pro) et il est temps de voir la tête d&#8217;un script Gradle.</p>
<pre>
task hello < < {
    println 'Hello world!'
}
</pre>
<p>Après avoir défini une "task", comme il l'explique rapidement : un script Gradle est un script... Groovy. Cela donne accès à toute l'API, ce que je trouve bien. Disons que vous souhaitez afficher l'heure dans votre build, nul besoin d'écrire un quelconque plugin, un simple println ladate et c'est tout.</p>
<p>La gestion des dépendances entre Task est limpide :
</pre>
<pre>
task hello < < {
    println 'Hello world!'
}
task intro(dependsOn: hello) << {
    println "I'm Gradle from Jazoon"
}
</pre>
<p>Si j'exécute ce code voici ce que cela donne :
</pre>
<pre>
> gradle -q intro
Hello world!
I'm Gradle from Jazoon
</pre>
<p>Prenons ensuite un script build.gradle complet pour vous montrer ce que cela donne :</p>
<pre>
usePlugin 'java'

sourceCompatibility = 1.5
version = '1.0'
manifest.mainAttributes(
    'Implementation-Title': 'Gradle Quickstart',
    'Implementation-Version': version
)

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

test {
    options.systemProperties['property'] = 'value'
}

uploadArchives {
    repositories {
       flatDir(dirs: file('repos'))
    }
}
</pre>
<p>On est d&#8217;accord pour dire que c&#8217;est clairement moins verbeux qu&#8217;un script Ant ou Maven.<br />
Simple et efficace.</p>
<p>Par la suite il explique que Gradle est construit par Gradle, que la documentation par exemple est testée. Les exemples de code qui sont dans le manuel de Gradle sont testés par Gradle ! La documentation est ainsi mise à jour sur le site Internet de Gradle automatiquement, la classe non ?</p>
<p><strong>La critique, la critique, la critique</strong><br />
Sans langue de bois : mauvais speaker. Un peu fouillis, on sens que Gradle vaut le coup d&#8217;être regardé mais ce n&#8217;est pas la bonne personne pour en parler. Les exemples de scripts m&#8217;ont donné cependant envie d&#8217;y jeter un oeil, et il a de bons arguments intéressants&#8230; mais bon, voilà.</p>
<p>Du côté de Gradle lui-même j&#8217;ai un truc qui ne m&#8217;a pas plus : la lenteur. Son script HelloWorld démarre poussivement en 2 secondes. Désolé mais mon système de build doit être rapide. Si je vois que ce système qui me fait remplacer 1 fichier pom.xml de 60 lignes par un script de 20 lignes multiplie par 3 le temps de compilation : poubelle.</p>
<p>Allez voir jeudi soir la présentation chez Zenika, et prenez une autre opinion que la mienne, qui est très personnelle. On est sur un blog personnel, je peux largement me planter, mais je ne crois pas à Gradle pour l&#8217;instant.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/23/jazoon-gradle-la-presentation-qui-aura-lieu-jeudi-soir/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jazoon : Groovy seven usage patterns</title>
		<link>http://www.touilleur-express.fr/2009/06/23/jazoon-groovy-seven-usage-patterns/</link>
		<comments>http://www.touilleur-express.fr/2009/06/23/jazoon-groovy-seven-usage-patterns/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 16:02:08 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[jazoon]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1540</guid>
		<description><![CDATA[Première conférence : Groovy, Seven Usage Patterns par Dierk König.
L&#8217;objectif de cette présentation est de nous montrer 7 cas d&#8217;utilisations réels de Groovy dans le monde de l&#8217;entreprise. Voici une photo prise durant la séance :

#1 SuperGlue
Groovy permet de créer rapidement des applications simples en utilisant l&#8217;API de base. Dierk nous montre cela en écrivant en quelques lignes un lecteur de flux RSS qui affiche dans une fenêtre de type Swing la liste des derniers billets. Groovy est un moyen rapide de créer de l&#8217;assemblage. Il montre la lecture d&#8217;un ...]]></description>
			<content:encoded><![CDATA[<p>Première conférence : <a href="http://jazoon.com/en/conference/presentationdetails.html?type=sid&#038;detail=7580">Groovy, Seven Usage Patterns</a> par Dierk König.</p>
<p>L&#8217;objectif de cette présentation est de nous montrer 7 cas d&#8217;utilisations réels de Groovy dans le monde de l&#8217;entreprise. Voici une photo prise durant la séance :<br />
<img src="http://www.touilleur-express.fr/wp-content/img_4126.jpg" alt="img_4126" title="img_4126" width="500" height="324" class="alignnone size-full wp-image-1541" /></p>
<p>#1 SuperGlue<br />
Groovy permet de créer rapidement des applications simples en utilisant l&#8217;API de base. Dierk nous montre cela en écrivant en quelques lignes un lecteur de flux RSS qui affiche dans une fenêtre de type Swing la liste des derniers billets. Groovy est un moyen rapide de créer de l&#8217;assemblage. Il montre la lecture d&#8217;un flux XML et le traitement du DOM, puis ensuite la partie Swing. Vraiment intéressant.</p>
<p>#2 Liquid Heart<br />
Ce pattern d&#8217;usage vise à nous montrer comment réutiliser la couche métier d&#8217;une application existante pour réutiliser les services avec du Groovy. La démonstration nous montre comment retirer du code métier écrit en dur pour le remplacer par du script Groovy. Chez mon client actuel nous nous en servons pour le calcul du risk par exemple. Ici Dierk nous montre comment externaliser le calcul de bonus d&#8217;un salarié dans un script Groovy chargé par Java à l&#8217;exécution, et évalué selon les paramètres. Cela vous permet de rendre très configurable certaines parties de votre couche métier.</p>
<p><img src="http://www.touilleur-express.fr/wp-content/img_4124.jpg" alt="img_4124" title="img_4124" width="450" height="409" class="alignnone size-full wp-image-1543" /></p>
<p>#3 Keyhole Surgery<br />
Ce pattern discutable vise à ouvrir une porte cachée dans l&#8217;application afin d&#8217;exécuter du Groovy. Il montre ainsi une application Web Java classique avec des utilisateurs. Une servlet sécurisée (hem&#8230;) permet d&#8217;exécuter du code Groovy directement via le navigateur. Dans l&#8217;exemple qu&#8217;il montre, il s&#8217;en sert pour remettre à zéro des paniers d&#8217;utilisateurs qui sont invalides.<br />
Groovy étant un langage de script, il est possible d&#8217;intervenir dans votre application Web à distance.</p>
<p>#4 Smart Configuration<br />
Groovy est bien plus intelligent que des fichiers de configuration XML. L&#8217;un des cas d&#8217;usage qu&#8217;il nous montre ensuite est donc la configuration d&#8217;une application en script Groovy. L&#8217;injection et la configuration en devienne plus facile.</p>
<p>#5 Unlimited Openness<br />
Plus qu&#8217;un pattern, Dierk parle maintenant de l&#8217;accès au code. Il nous recommande dans la mesure du possible de laisser le code ouvert, quoiqu&#8217;en Groovy je crois que de toutes les façons c&#8217;est le cas. Il nous montre l&#8217;exemple d&#8217;un moteur de blog écrit en Groovy, que sa société (Canoo) a porté facilement, car le code est accessible. Chaque besoin client étant spécifique, pourquoi ne pas laisser le code ?</p>
<p>#6 House-Elf Scripts<br />
Pour la suite de sa présentation il s&#8217;appuie sur les Elfs de maison d&#8217;Harry Potter. Ce sont ces petits gars qui font le sale boulot pour vous, qui ne rechignent pas à la tâche. Groovy est parfait pour automatiser les tâches répétitives comme l&#8217;intégration, la construction, la gestion de release. Il nous encourage à aller regarder de ce côté. Cela tombe bien, je compte aller voir Graddle cet après-midi.</p>
<p>#7 Prototype<br />
Enfin pour terminer, Groovy est un langage particulièrement adapté pour la création de prototype. L&#8217;interface Swing se fait rapidement avec Griffon, une application Web se fait rapidement avec Grails, c&#8217;est l&#8217;essence même de Groovy.</p>
<p>Au final en sortant j&#8217;ai appris encore de nouvelles choses sur Groovy. Lorsque Dierk tapait cependant son programme en Groovy, j&#8217;ai vu qu&#8217;il s&#8217;en sortait car il maîtrise son API à la perfection. L&#8217;aspect dynamique doit cependant vous faire prendre conscience que la maîtrise de Groovy demande un peu plus de temps.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/23/jazoon-groovy-seven-usage-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Premiers pas avec Grails 1.1.1 et Google AppEngine</title>
		<link>http://www.touilleur-express.fr/2009/06/09/premiers-pas-avec-grails-111-et-google-appengine/</link>
		<comments>http://www.touilleur-express.fr/2009/06/09/premiers-pas-avec-grails-111-et-google-appengine/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 12:05:24 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1419</guid>
		<description><![CDATA[Ah là là&#8230; dire qu&#8217;à la fin de la lecture de ce billet j&#8217;aurai complètement changé votre vision du Web&#8230; Je comprends mieux maintenant Didier Girard de SFEIR, il y a un avant et un après Google AppEngine&#8230; Mais bon, soyons patient et voyons ce que nous pouvons faire aujourd&#8217;hui. Ce qui suit est inspiré, pour ne pas dire affreusement copié sur ce que Guillaume Laforge a présenté le 28 mai dernier lors de la conférence Google I/O à San Francisco. J&#8217;ai simplement adapté la présentation en français, je l&#8217;ai ...]]></description>
			<content:encoded><![CDATA[<p>Ah là là&#8230; dire qu&#8217;à la fin de la lecture de ce billet j&#8217;aurai complètement changé votre vision du Web&#8230; Je comprends mieux maintenant Didier Girard de SFEIR, il y a un avant et un après Google AppEngine&#8230; Mais bon, soyons patient et voyons ce que nous pouvons faire aujourd&#8217;hui. Ce qui suit est inspiré, pour ne pas dire affreusement copié sur ce que Guillaume Laforge a présenté <a href="http://www.youtube.com/watch?v=NEnniZTdOYk">le 28 mai dernier lors de la conférence Google I/O</a> à San Francisco. J&#8217;ai simplement adapté la présentation en français, je l&#8217;ai fait fonctionner, pour le reste tout le crédit va à Guillaume.<br />
<div id="attachment_1427" class="wp-caption alignnone" style="width: 401px"><img src="http://www.touilleur-express.fr/wp-content/glaforge.jpg" alt="Guillaume Laforge Google IO 2009" title="glaforge" width="391" height="325" class="size-full wp-image-1427" /><p class="wp-caption-text">Guillaume Laforge Google IO 2009</p></div></p>
<p>A la fin de cet article vous serez en mesure de déployer sur Google AppEngine une petite application simple.</p>
<p><strong>Installer Grails</strong><br />
<a href="http://grails.org/Download">Téléchargez</a> et installer Grails 1.1.1. Pour ma part, sur Mac OS j&#8217;ai ensuite édité mon fichier .bash_profile afin de déclarer le chemin d&#8217;installation de Grails, et fixer la version de Java à la version 5 pour éviter quelques soucis plus tard avec Google AppEngine et DataNucleus.<br />
Voici le contenu du fichier $HOME/.bash_profile</p>
<pre name="code">
export M2_HOME=/usr/share/maven
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home
export GRAILS_HOME=/Users/nicolas/Dev/grails/grails-1.1.1
export APPENGINE_HOME=/Users/nicolas/Dev/appengine-java-sdk-1.2.1
export PATH=$PATH:$GRAILS_HOME/bin
</pre>
<p>Vérifiez que Grails est correctement installé avant d&#8217;aller plus loin:</p>
<pre>
macbook-pro-de-nicolas-martignole:~ nicolas$ export GRAILS_HOME=/Users/nicolas/Dev/grails/grails-1.1.1
macbook-pro-de-nicolas-martignole:~ nicolas$ export PATH=$PATH:$GRAILS_HOME/bin
macbook-pro-de-nicolas-martignole:~ nicolas$ grails -version
Welcome to Grails 1.1.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /Users/nicolas/Dev/grails/grails-1.1.1

Base Directory: /Users/nicolas
Running pre-compiled script
Script not found: Version
macbook-pro-de-nicolas-martignole:~ nicolas$
</pre>
<p>Les observateurs ont remarqué certainement la variable APPENGINE_HOME. Il est temps de télécharger Google AppEngine, après avoir demandé un compte. Suivez attentivement les explications de la page principale de <a href="http://code.google.com/intl/fr/appengine/">Google AppEngine</a>. Une fois le téléchargement effectué, j&#8217;ai simplement décompressé l&#8217;archive tar.gz dans un répertoire, puis ensuite j&#8217;ai configuré la variable APPENGINE_HOME afin qu&#8217;elle pointe vers le répertoire de GAE (Google AppEngine).</p>
<p><strong>Créer sa première application Grails</strong><br />
Grails vous permet de créer rapidement une application et de la tester. Allons-y, placez-vous dans un nouveau répertoire vide et créez votre première application grails, appelée ici gaetex:</p>
<pre>
grails create-app gaetex
</pre>
<p>Lorsque nous utilisons Google AppEngine, nous devons désinstaller le plugin JPA et désinstaller le plugin Hibernate. Le plugin JPA génère un fichier persistence.xml qui vient en conflit avec celui utilisé par le mode JPA du plugin Google AppEngine. Concernant Hibernate, nous n&#8217;en avons pas besoin ici.<br />
Pour cela il suffit d&#8217;exécuter les 2 commandes Grails suivantes en vous mettant d&#8217;abord dans le répertoire gaetex que nous venons de créer  :</p>
<pre>
cd gaetex
grails uninstall-plugin hibernate
grails uninstall-plugin jpa
</pre>
<p>Notez qu&#8217;en principe, le plugin jpa n&#8217;est pas installé, j&#8217;ai ajouté cette commande au cas où vous l&#8217;auriez installé aussi.</p>
<p><strong>Installer Google AppEngine</strong><br />
L&#8217;installation de Google AppEngine est simple. Assurez-vous simplement que la variable APPENGINE_HOME pointe vers votre répertoire d&#8217;installation de GAE puis lancer la commande d&#8217;installation du plugin App-Engine :</p>
<pre>grails install-plugin app-engine</pre>
<p>Ce qui donne sur ma machine:</p>
<pre>
macbook-pro-de-nicolas-martignole:gaetex nicolas$ echo $APPENGINE_HOME
/Users/nicolas/Dev/appengine-java-sdk-1.2.1
macbook-pro-de-nicolas-martignole:gaetex nicolas$ grails install-plugin app-engine
...
...
</pre>
<p><strong>Tester le tout</strong><br />
Vérifions que tout fonctionne en démarrant le serveur Jetty intégré à Grails. Dans le répertoire gaetex, lancez grails:</p>
<pre>grails app-engine</pre>
<p>Connectez-vous à votre machine (<a href="http://localhost:8080/">http://localhost:8080/</a>) et vous devriez voir votre première page Grails s&#8217;afficher.</p>
<p><strong>Créer une première entité</strong><br />
Nous allons maintenant créer une entité Book, et générer ensuite la partie vue et contrôleur. Avec Google AppEngine, il n&#8217;est pas possible de placer ses Entités directement dans le répertoire &laquo;&nbsp;grails-app/domain&nbsp;&raquo;. Il est nécessaire d&#8217;utiliser un package. J&#8217;ai donc fait comme Guillaume durant sa démonstration, j&#8217;ai créé une entité Book dans le package &laquo;&nbsp;demo&nbsp;&raquo; avec la commande suivante :</p>
<pre>grails create-domain-class demo.Book</pre>
<p>Il serait intéressant maintenant d&#8217;ajouter deux attributs &laquo;&nbsp;title&nbsp;&raquo; et &laquo;&nbsp;author&nbsp;&raquo; à notre Book.</p>
<p>Editez le fichier gaetex/grails-app/domain/demo/Book.groovy avec un éditeur de texte, et ajoutez simplement 2 attributs pour le titre et l&#8217;auteur du livre :</p>
<pre name="code" class="groovy">
package demo

import javax.persistence.*;
// import com.google.appengine.api.datastore.Key;

@Entity
class Book {

    @Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	Long id

	// Added by Nicolas Martignole
	String title
	String author

    static constraints = {
    	id visible:false
	}
}
</pre>
<p>Avec ces deux attributs en place, nous allons maintenant générer un controlleur et tester à nouveau notre application.<br />
Lancez la commande de génération du controleur et des vues:</p>
<pre>grails generate-all demo.Book</pre>
<p>Puis relancez ensuite le serveur Grails :</p>
<pre>grails app-engine</pre>
<p>Voici ce que cela donne après avoir créé quelques livres (au logo prêt) :<br />
<img src="http://www.touilleur-express.fr/wp-content/capture_grails.jpg" alt="capture_grails" title="capture_grails" width="567" height="431" class="alignnone size-full wp-image-1420" /></p>
<p>Vous pouvez retrouver la même chose avec la voix de Guillaume à partir de la minute 50 sur la vidéo <a href="http://www.youtube.com/watch?v=NEnniZTdOYk">YouTube</a> de la présentation.</p>
<p><strong>Déployer son application Grails sur Google AppEngine</strong><br />
Voici la liste des étapes:<br />
 1) créer une application sur Google AppEngine<br />
 2) modifier le fichier grails-app/conf/Config.groovy et ajouter une ligne avec le nom de votre application<br />
 3) packager et préparer l&#8217;application<br />
 4) effacer un fichier parasite (probleme à résoudre)<br />
 5) utiliser le script appCfg.sh pour fournir votre email et votre mot-de-passe Google<br />
 6) ensuite simplement mettre à jour avec le plugin google-app-engine de Grails</p>
<p>Voyons en détail chaque étape:</p>
<p>1) Rendez-vous sur &laquo;&nbsp;Google AppEngine&nbsp;&raquo; afin de faire une demande, puis ensuite de créer votre application. L&#8217;application id doit être unique, ce pourra être par exemple testgrails1234<br />
2) Ouvrir le fichier Config.groovy se trouvant dans votre application et définissez l&#8217;application id que vous venez de mettre</p>
<pre>
google.appengine.application="touilleur"
</pre>
<p>3) Lancer la création du package avec les commandes suivantes:<br />
Il faut fixer la version à un nombre entier car GAE n&#8217;accepte pas les numéros de version type x.y.z</p>
<pre>
grails set-version 1
grails app-engine package
</pre>
<p>4) Effacer le fichier &laquo;&nbsp;datastore-indexes.xml&nbsp;&raquo; sans quoi voici l&#8217;erreur que vous rencontrerez:</p>
<pre>
macbook-pro-de-nicolas-martignole:gaetex nicolas$ /Users/nicolas/Dev/appengine-java-sdk-1.2.1/bin/appcfg.sh update target/war
Reading application configuration data...
Bad configuration: XML error validating target/war/WEB-INF/datastore-indexes.xml against /Users/nicolas/Dev/appengine-java-sdk-1.2.1/docs/datastore-indexes.xsd
  Caused by: cvc-elt.1: Cannot find the declaration of element 'datastore-indexes'.
Please see the logs [/tmp/appcfg16875.log] for further information.
</pre>
<p><strong>Pour résoudre ce problème, effacez le fichier datastore-indexes.xml</strong> avant de relancer la commande appcfg.sh (voir étape suivante)</p>
<pre>
rm target/war/WEB-INF/datastore-indexes.xml
</pre>
<p>5) Lancer la première fois seulement la mise à jour avec l&#8217;utilitaire appcfg.sh de Google AppEngine comme suit:</p>
<pre>
$APPENGINE_HOME/bin/appcfg.sh update target/war
</pre>
<p>Renseigner votre adresse mail Google ainsi que votre mot de passe. Il suffit de mettre son login en fait (mdupont et pas mdupont@gmail.com).</p>
<p>6) Ensuite à chaque fois que vous souhaitez mettre à jour votre application vous pourrez utiliser le plugin de Gae dans Grails, plugin qui ne marche pas la première fois avec l&#8217;authentification en se plantant. C&#8217;est pour cette raison qu&#8217;il faut utiliser l&#8217;utilitaire appcfg.sh la première fois.</p>
<pre>
grails app-engine deploy
</pre>
<p>Si tout se déroule sans problèmes vous devriez alors mettre en ligne votre première application !!!</p>
<p>L&#8217;url de votre application sera http://&lt;applicationid&gt;.appspot.com</p>
<p>Si vous voulez tester un exemple d&#8217;application : <a href="http://petclinic-grails.appspot.com/">PetClinic with Grails</a></p>
<p><strong>Conclusion</strong><br />
Comptez 1h la première fois, puis ensuite 10 minutes pour refaire cet exercice. J&#8217;ai été vraiment séduit par la simplicité de Grails, et cette intégration avec Google App Engine. Celui-ci est gratuit jusqu&#8217;à un certain nombre de requêtes par jour, et croyez-moi vous avez largement de quoi tester votre code sans devoir payer, toujours dans l&#8217;esprit Google.<br />
Je crois vraiment à un nouveau type de développement rapide d&#8217;applications, à la monétisation de compétences en Groovy et en Grails. Pour ma part je travaille en ce moment sur une application pour le Touilleur Express, un mix de LinkedIn avec une touche de Google Calendar, un esprit de Geek et bien entendu, toujours la pâte Touilleur Express.</p>
<p>Guillaume Laforge travaille aussi sur Gaelyk, un framework léger qui facilite l&#8217;intégration de Google App Engine si vous souhaitez n&#8217;écrire qu&#8217;en Groovy votre application Web, sans utiliser Grails. Il cite aussi <a href="http://code.google.com/p/iui/">le framework iUI</a> qui est un framework Javascript destiné à faciliter l&#8217;écriture d&#8217;application pour l&#8217;iphone, hébergé sur Internet. Cela revient à ne pas passer par l&#8217;AppleStore, à simplement offrir un service type iPhone mais hébergé sur Internet directement.</p>
<p><strong>Références</strong><br />
- <a href="http://code.google.com/intl/fr/appengine/">Page d&#8217;accueil Google App Engine</a><br />
- <a href="http://appengine.google.com/">Page pour créer sa première application GAE</a><br />
- <a href="http://grails.org/plugin/app-engine">Plugin GAE Grails</a> le site à surveiller<br />
- <a href="http://groovyconsole.appspot.com/">Groovy Web Console</a> permet de taper du Groovy, application Google App Engine<br />
- <a href="http://myowngroovy.appspot.com/">My Own Groovy</a> par Guillaume Laforge avec quelques applications pour tester<br />
- <a href="http://appgallery.appspot.com/">Portail des applications Google App Engine</a></p>
<p><strong>Problèmes connus</strong><br />
Il y a un certain nombre de soucis pour l&#8217;instant sur le plugin Google App Engine pour Grails au moment où j&#8217;écris ces lignes (juin 2009). Ne vous lancez pas dans ce test si vous ne maîtrisez pas un minimum Grails. Je n&#8217;ai testé que la version JPA, je ne sais pas si la version JDO est plus ou moins stable.</p>
<p>Pour terminer je vous recommande de regarder la présentation de Guillaume Laforge sur YouTube:</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/NEnniZTdOYk&#038;hl=fr&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NEnniZTdOYk&#038;hl=fr&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/09/premiers-pas-avec-grails-111-et-google-appengine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java et Groovy 1.6.1 supportés sur Google AppEngine</title>
		<link>http://www.touilleur-express.fr/2009/04/08/java-et-groovy-161-supportes-sur-google-appengine/</link>
		<comments>http://www.touilleur-express.fr/2009/04/08/java-et-groovy-161-supportes-sur-google-appengine/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 05:35:06 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[groovy]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1074</guid>
		<description><![CDATA[Ce matin la nouvelle s&#8217;est propagée via Twitter en quelques heures. @DidierGirard a annoncé ce matin vers 06h00 l&#8217;information, j&#8217;ai vu aussi que les JavaPosses avaient assisté à un événement (@DickWall). C&#8217;est surtout Guillaume Laforge qui est fier d&#8217;annoncer que Groovy sera supporté par Google AppEngine. SpringSource a publié ce matin un tutorial en anglais pour écrire sa première Groovlet et la déployer sur GoogleAppEngine, qui est un serveur d&#8217;application déployé en cloud-computing. D&#8217;ici une semaine nous devrions avoir un Gwitter, twitter écrit en Groovy au rythme où vont les ...]]></description>
			<content:encoded><![CDATA[<p>Ce matin la nouvelle s&#8217;est propagée via Twitter en quelques heures. <a href="http://twitter.com/DidierGirard">@DidierGirard</a> a annoncé ce matin vers 06h00 l&#8217;information, j&#8217;ai vu aussi que les JavaPosses avaient assisté à un événement (<a href="http://twitter.com/dickwall">@DickWall</a>). C&#8217;est surtout <a href="http://twitter.com/glaforge">Guillaume Laforge</a> qui est fier d&#8217;annoncer que Groovy sera supporté <a href="http://appengine.google.com/start">par Google AppEngine</a>. SpringSource <a href="http://blog.springsource.com/2009/04/07/write-your-google-app-engine-applications-in-groovy/">a publié ce matin un tutorial</a> en anglais pour écrire sa première Groovlet et la déployer sur GoogleAppEngine, qui est un serveur d&#8217;application déployé en cloud-computing. D&#8217;ici une semaine nous devrions avoir un Gwitter, twitter écrit en Groovy au rythme où vont les choses !</p>
<p>Didier a déjà publié une news sur <a href="http://www.insideit.fr/post/2009/04/08/Java-et-Groovy-sont-maintenant-supportes-par-Google-App-Engine">son blog,</a> je le laisse donc passer devant, le Touilleur Express vous donnera d&#8217;autres informations demain dans la soirée.</p>
<p>Stay Tuned !<br />
Il y a encore d&#8217;autres choses à venir.</p>
<p>Voir :<br />
<a href="http://blog.springsource.com/2009/04/07/write-your-google-app-engine-applications-in-groovy/">L&#8217;annonce sur le blog SpringSource du support de Groovy</a><br />
<a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html">http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/04/08/java-et-groovy-161-supportes-sur-google-appengine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Nouveau : un podcast le Touilleur Express</title>
		<link>http://www.touilleur-express.fr/2008/11/15/nouveau-un-podcast-le-touilleur-express/</link>
		<comments>http://www.touilleur-express.fr/2008/11/15/nouveau-un-podcast-le-touilleur-express/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 11:23:48 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[exo]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[podcast]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=489</guid>
		<description><![CDATA[C&#8217;est fait, le premier podcast du Touilleur Express est en ligne sur sa page dédiée. Le premier épisode vous propose d&#8217;écouter Guillaume Laforge, le chef de projet du langage Groovy. SpringSource a annoncé le 11 novembre dernier le rachat de sa société, G2One.inc. A l&#8217;occasion de la journée &#171;&#160;Les Rencontres Spring&#160;&#187; nous avons été invité par SFEIR à rencontrer plusieurs personnes de SpringSource. J&#8217;ai enregistré une petite interview de guillaume avec Olivier Croisier, auteur du blog &#171;&#160;The Coder&#8217;s Breakfast&#171;&#160;.
Voici des pointeurs vers des sujets abordés dans le podcast :

article sur ...]]></description>
			<content:encoded><![CDATA[<div id="attachment_501" class="wp-caption alignnone" style="width: 310px"><a href="http://www.touilleur-express.fr/wp-content/nicolas_martignole_guillaume_laforge.jpg"><img src="http://www.touilleur-express.fr/wp-content/nicolas_martignole_guillaume_laforge-300x187.jpg" alt="N.Martignole et G.Laforge" title="nicolas_martignole_guillaume_laforge" width="300" height="187" class="size-medium wp-image-501" /></a><p class="wp-caption-text">N.Martignole et G.Laforge</p></div>
<p>C&#8217;est fait, le premier podcast du Touilleur Express est en ligne sur <a href="http://www.touilleur-express.fr/podcast_page/">sa page dédiée</a>. Le premier épisode vous propose d&#8217;écouter Guillaume Laforge, le chef de projet du langage Groovy. SpringSource a annoncé le 11 novembre dernier le rachat de sa société, G2One.inc. A l&#8217;occasion de la journée &laquo;&nbsp;Les Rencontres Spring&nbsp;&raquo; nous avons été invité par SFEIR à rencontrer plusieurs personnes de SpringSource. J&#8217;ai enregistré une petite interview de guillaume avec Olivier Croisier, auteur du blog &laquo;&nbsp;<a href="http://olivier.croisier.free.fr/blog/">The Coder&#8217;s Breakfast</a>&laquo;&nbsp;.</p>
<p>Voici des pointeurs vers des sujets abordés dans le podcast :</p>
<ul>
<li><a href="http://www.infoq.com/news/2008/11/springsource-g2one">article sur InfoQ</a></li>
<li><a href="http://glaforge.free.fr/weblog/">Le Blog de Guillaume</a></li>
<li><a href="http://www.exoplatform.com/portal/public/en/">The eXo Platform</a></li>
<li><a href="http://www.pilotsystems.net/actus/benjamin-mestrallet-exo-platform-prix-jeune-dirigeant-technologie">Benjamin Mestrallet, fondateur d&#8217;eXo, gagne le prix du jeune dirigeant de la Technologie</a></li>
</ul>
<p>A venir prochainement : interview avec Peter Cooper-Ellis. La qualité n&#8217;étant pas assez bonne, je vous proposerai une transcription de notre rencontre avec Peter prochainement.</p>
<p>En attendant voici une photo prise chez SFEIR, avec donc de gauche à droite : Peter Cooper-Ellis, moi-même et enfin <a href="http://olivier.croisier.free.fr/blog/">Olivier Croisier</a>.<br />
<div id="attachment_490" class="wp-caption alignnone" style="width: 310px"><a href="http://www.touilleur-express.fr/wp-content/img_5744.jpg"><img src="http://www.touilleur-express.fr/wp-content/img_5744-300x200.jpg" alt="Interview Peter Cooper-Ellis avec Nicolas Martignole et Olivier Croisier" title="Interview Peter Cooper-Ellis avec Nicolas Martignole et Olivier Croisier" width="300" height="200" class="size-medium wp-image-490" /></a><p class="wp-caption-text">Interview Peter Cooper-Ellis avec Nicolas Martignole et Olivier Croisier</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2008/11/15/nouveau-un-podcast-le-touilleur-express/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>La rentrée : groovy</title>
		<link>http://www.touilleur-express.fr/2008/09/02/la-rentree-groovy/</link>
		<comments>http://www.touilleur-express.fr/2008/09/02/la-rentree-groovy/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 11:28:43 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[mule]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=280</guid>
		<description><![CDATA[Un peu d&#8217;actualité sur Paris et quelques liens à regarder.
La prochaine soirée du Paris Java User Group aura lieu mardi soir prochain à Paris à l&#8217;ISEP à partir de 19h15 autour du langage Groovy présenté par Guillaume Laforge, chef de projet de Groovy et membre de l&#8217;OSSGTP. L&#8217;intérêt de Groovy est à mon avis de dépasser l&#8217;étape de langage de script pour vraiment apporter à la plateforme Java un langage dynamique. Guillaume est aussi spec-lead de la JSR-241 qui vise à standardiser Groovy au sein de la plateforme Java. Groovy ...]]></description>
			<content:encoded><![CDATA[<p>Un peu d&#8217;actualité sur Paris et quelques liens à regarder.</p>
<p>La prochaine soirée du Paris Java User Group aura lieu <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20080909">mardi soir prochain à Paris à l&#8217;ISEP à partir de 19h15</a> autour du langage Groovy présenté par Guillaume Laforge, chef de projet de Groovy et membre de l&#8217;OSSGTP. L&#8217;intérêt de Groovy est à mon avis de dépasser l&#8217;étape de langage de script pour vraiment apporter à la plateforme Java un langage dynamique. Guillaume est aussi spec-lead de la <a href="http://jcp.org/en/jsr/detail?id=241">JSR-241</a> qui vise à standardiser Groovy au sein de la plateforme Java. Groovy permet de retirer pas mal de code d&#8217;assemblage et de s&#8217;approcher de la mouvance des langages de script amorcée avec Java 6.</p>
<p>On ne peut pas parler de Groovy sans parler de <a href="http://grails.org/">Grails</a>, le framework MVC basé sur Groovy. La deuxième partie de la soirée sera donc consacrée à la présentation de Grails par Fabrice Robini, architecte chez Octo.<br />
J&#8217;attends avec impatience de voir un peu une présentation en live de Grails. J&#8217;espère que Fabrice pourra refaire ce que Jean-François Hélie et Christian Blavier nous avaient proposé <a href="http://www.touilleur-express.fr/2008/06/11/compte-rendu-de-la-soiree-spring-pjug/">en juin dernier</a>.</p>
<p>Le 18 septembre se déroulera aussi le <a href="http://code.google.com/intl/fr_ALL/events/developerday/2008/home.html">Google Developer Day 2008</a> à l&#8217;ENSA. Les sessions sur GWT et sur AppEngine pourraient intéresser pas mal de monde. Je ne manquerai pas de vous en faire un petit compte-rendu.</p>
<p>Si vous voulez vous regarder quelques petites vidéos sympathiques, je vous conseille de regarder les vidéos de <a href="http://jazoon.com/">Jazoon 2008</a> une conférence dont je vous avais parlé <a href="http://www.touilleur-express.fr/tag/jazoon/">il y a quelques mois déjà</a>.</p>
<p>A propos de vidéo, si vous souhaitez regarder tranquillement un screencast de votre MacBook Pro préféré, le site <a href="http://parleys.com">Parleys.Com</a> héberge un certain nombre de vidéo sur l&#8217;écosystème Java, Spring, Mule, JBoss et compagnie. Je vous recommande par exemple <a href="http://parleys.com/display/PARLEYS/Home#talk=12058635;title=Mule%202%20and%20Beyond;slide=1">la présentation de Mule 2</a> de Ross Masson ou <a href="http://parleys.com/display/PARLEYS/Home#talk=8112;title=Spring%202.0%20and%20Beyond;slide=1">l&#8217;intervention de  Rod Johnson</a> sur Spring 2.<br />
Au passage on note que le site a été réalisé avec Adobe Flex et qu&#8217;il existe même une version AIR. Pas mal non ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2008/09/02/la-rentree-groovy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

