Groovy
Qui je suis? <ul><li>J’ai inventé Groovy </li></ul>J’entretiens une relation extraconjugale avec Guillaume Laforge J’ai éc...
Agenda <ul><li>PARTIE I – Introduction </li></ul><ul><ul><li>Origines et principes de base </li></ul></ul><ul><li>PARTIE I...
Partie 1:  Introduction Origines et principes de base
Introduction <ul><li>Précision importante </li></ul><ul><ul><li>Groovy == langage de programmation </li></ul></ul><ul><ul>...
Introduction <ul><li>Manifeste </li></ul><ul><ul><li>Groovy est un langage de programmation dynamique et agile pour la mac...
Historique <ul><li>Personnel </li></ul><ul><ul><li>2003 James Strachan,  le fondateur </li></ul></ul><ul><ul><li>2004 Guil...
Installation <ul><li>Environnement </li></ul><ul><ul><ul><li>$JAVA_HOME </li></ul></ul></ul><ul><ul><ul><li>$GROOVY_HOME <...
Anatomie d’un script // monScript.groovy //  def maVariable = 3 def uneClosure = {  it * it } println ‘Bonjour monde!’ L’i...
Partie 2:  Qu’est-ce que Groovy? Survol du langage
Type de données de base <ul><li>Tout est  Objet   (pour vrai de vrai cette fois-ci!) </li></ul><ul><ul><li>pas de type pri...
Types de données de base <ul><li>Strings </li></ul><ul><ul><li>java.lang.String ‘’ </li></ul></ul><ul><ul><li>groovy.lang....
Expressions régulières <ul><li>Sucre syntaxique par-dessus: </li></ul><ul><ul><li>java.util.regex.Matcher / Pattern </li><...
Structures de contrôle <ul><li>La vérité, rien que la vérité … </li></ul><ul><ul><li>true == références objets non-nulle <...
Structures de contrôle (2) <ul><li>Boucler </li></ul><ul><ul><li>le while( expr ) est identique à celui de Java </li></ul>...
Structures de contrôle (3) <ul><li>Un  switch  beaucoup plus puissant qu’en Java : </li></ul>switch (x) { case 7:  println...
GDK <ul><li>Plusieurs types de Java deviennent plus  Groovy ! </li></ul>java.io.File: eachLine (Closure closure) eachFile ...
Support natif des collections <ul><li>Les listes </li></ul><ul><ul><li>opérateur  subscript  [] =  getAt()/putAt() </li></...
Support natif des collections (2) <ul><li>Les  maps </li></ul><ul><ul><li>permet la syntaxe .dot sur les clés </li></ul></...
Support natif des collections (3) <ul><li>Les  ranges </li></ul><ul><ul><li>une liste de valeurs séquentielles </li></ul><...
Closures <ul><li>Wikipedia </li></ul><ul><li>« In computer science, a closure is a function that is evaluated in an enviro...
Closures (2) <ul><li>En Groovy </li></ul><ul><ul><li>Une &quot;closure&quot; c'est un bout de code: </li></ul></ul><ul><ul...
Programmation objet <ul><li>Identique à Java … sauf: </li></ul><ul><ul><li>les  inner class  ne sont pas supportées </li><...
Programmation objet <ul><li>GroovyBeans </li></ul><ul><ul><li>Ajoute au formalisme des JavaBeans </li></ul></ul><ul><ul><u...
Programmation  META  objet <ul><li>Sous le capot de Groovy: </li></ul><ul><ul><li>toutes les classes ont une méta-classe <...
Partie 3:  Que fait-on avec Groovy? Applications concrètes du langage
Builders <ul><li>Principes basés sur le célèbre patron de conception (GOF 97) </li></ul><ul><ul><li>Permet de construire d...
Builders <ul><li>Applications usuelles </li></ul><ul><ul><li>MarkupBuilder </li></ul></ul><ul><ul><li>AntBuilder </li></ul...
XML <ul><li>2 Objets Groovy pour faciliter le  parsing  de structures XML </li></ul><ul><ul><li>groovy.util.XMLParser </li...
GSQL <ul><li>Accès aux SGBD </li></ul><ul><ul><li>package groovy.sql.* </li></ul></ul><ul><ul><li>2 façons de rendre SQL G...
GANT <ul><li>Gant permet de construire des scripts de build à l’aide d’Ant, mais écrits en Groovy </li></ul><ul><ul><li>« ...
Services Web <ul><li>Module  GroovyWS </li></ul><ul><ul><li>Enrobe le cadre d’application Apache CXF </li></ul></ul><ul><l...
Services Web import groovyx.net.ws.WSClient  def proxy = new WSClient(&quot;http://localhost:6980/MathService?wsdl&quot;, ...
Tester avec Groovy <ul><li>GroovyTestCase </li></ul><ul><ul><li>JUnit est enchâssé dans l’environnement d’exécution de Gro...
Tester avec Groovy <ul><li>Tester avec d’autres outils </li></ul><ul><ul><li>Unit tests </li></ul></ul><ul><ul><ul><li>Tes...
Partie 4:  Conclusion La fin … vraiment?  Ou seulement le début?
State of the «groovy» nation <ul><li>Version </li></ul><ul><ul><li>Dernière livraison: 1.1 RC 2 </li></ul></ul><ul><ul><li...
Défis à venir <ul><li>Surfer sur la vague sans perdre pied! </li></ul><ul><ul><li>maintenir le rythme effréné des livraiso...
Voir la lumière … <ul><li>Grails </li></ul><ul><ul><li>Cadre d’application web agile </li></ul></ul><ul><ul><li>Assemblage...
Références <ul><li>Bouquins </li></ul><ul><ul><li>Groovy in action </li></ul></ul><ul><ul><li>Dierk König,  2007 </li></ul...
Références <ul><li>Sur la grande toile </li></ul><ul><ul><li>http://groovy.codehaus.org </li></ul></ul><ul><ul><li>http :/...
Références <ul><li>La Blogoshère </li></ul><ul><ul><li>Guillaume Laforge </li></ul></ul><ul><ul><li>Jason Rudolph </li></u...
Des questions? Merci à tous [email_address]
Prochain SlideShare
Chargement dans…5
×

Présentation Groovy

3 899 vues

Publié le

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 899
Sur SlideShare
0
Issues des intégrations
0
Intégrations
31
Actions
Partages
0
Téléchargements
73
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Présentation Groovy

  1. 1. Groovy
  2. 2. Qui je suis? <ul><li>J’ai inventé Groovy </li></ul>J’entretiens une relation extraconjugale avec Guillaume Laforge J’ai écrit un super bouquin sur Groovy Je siège sur l’ expert group de la JSR-241 Je suis committer sur Groovy Jean-Sébastien Bournival Architecte de systèmes Nurun Mon blog: http ://js.jipiju.com
  3. 3. Agenda <ul><li>PARTIE I – Introduction </li></ul><ul><ul><li>Origines et principes de base </li></ul></ul><ul><li>PARTIE II - Qu'est ce que Groovy? </li></ul><ul><ul><li>Comment se décline ce langage </li></ul></ul><ul><li>PARTIE III - Que fait-on avec Groovy? </li></ul><ul><ul><li>Applications concrètes du langage </li></ul></ul><ul><li>PARTIE IV – Conclusion </li></ul><ul><ul><li>Références, questions </li></ul></ul>
  4. 4. Partie 1: Introduction Origines et principes de base
  5. 5. Introduction <ul><li>Précision importante </li></ul><ul><ul><li>Groovy == langage de programmation </li></ul></ul><ul><ul><li>Grails == framework de développement web utilisant Groovy </li></ul></ul>
  6. 6. Introduction <ul><li>Manifeste </li></ul><ul><ul><li>Groovy est un langage de programmation dynamique et agile pour la machine virtuelle Java (JVM) </li></ul></ul><ul><li>« Groovy is Java » </li></ul><ul><ul><li>Graeme Rocher </li></ul></ul><ul><ul><li>Grails project lead </li></ul></ul>Groovy Java Java Virtual Machine bytecode
  7. 7. Historique <ul><li>Personnel </li></ul><ul><ul><li>2003 James Strachan, le fondateur </li></ul></ul><ul><ul><li>2004 Guillaume Laforge, le récupérateur </li></ul></ul><ul><ul><li>2007 G2One, le catalyseur </li></ul></ul><ul><li>JSR 241 </li></ul><ul><ul><li>Supportée par IBM, Oracle, Sun, ASF, ThoughtWorks </li></ul></ul>
  8. 8. Installation <ul><li>Environnement </li></ul><ul><ul><ul><li>$JAVA_HOME </li></ul></ul></ul><ul><ul><ul><li>$GROOVY_HOME </li></ul></ul></ul><ul><ul><ul><li>$PATH = $PATH;$GROOVY_HOMEin;$JAVA_HOMEin </li></ul></ul></ul><ul><ul><ul><li>~/.groovy/lib </li></ul></ul></ul><ul><li>Outils </li></ul><ul><ul><ul><li>Interpréteur (groovy.sh) </li></ul></ul></ul><ul><ul><ul><li>Shell (groovysh.sh) </li></ul></ul></ul><ul><ul><ul><li>Console Swing (groovyConsole.sh) </li></ul></ul></ul>
  9. 9. Anatomie d’un script // monScript.groovy // def maVariable = 3 def uneClosure = { it * it } println ‘Bonjour monde!’ L’instruction return est optionnelle Packages importés par défaut: groovy.lang.* groovy.util.* java.lang.* java.util.* java.io.* java.net.* Java.math.BigDecimal Java.math.BigInteger Le point virgule et les paranthèses sont optionnels System.out est implicite Ce script ne contient pas de classe: lors de l’exécution, il sera enrobé dans la méthode run() d’un objet de type Script
  10. 10. Partie 2: Qu’est-ce que Groovy? Survol du langage
  11. 11. Type de données de base <ul><li>Tout est Objet (pour vrai de vrai cette fois-ci!) </li></ul><ul><ul><li>pas de type primitif </li></ul></ul><ul><ul><li>typage dynamique (ou pas) </li></ul></ul><ul><ul><li>autoboxing </li></ul></ul><ul><ul><ul><li>méthode java qui prend un int en paramètre </li></ul></ul></ul><ul><ul><li>l’opérateur ‘==‘ veut dire equals() … pour tout le monde, pour l’identité, il faut utiliser la méthode is() </li></ul></ul>
  12. 12. Types de données de base <ul><li>Strings </li></ul><ul><ul><li>java.lang.String ‘’ </li></ul></ul><ul><ul><li>groovy.lang.GString “” </li></ul></ul><ul><li>Aussi </li></ul><ul><ul><li>Slashy // </li></ul></ul><ul><ul><li>Triple quote ‘’’ et “”” </li></ul></ul>
  13. 13. Expressions régulières <ul><li>Sucre syntaxique par-dessus: </li></ul><ul><ul><li>java.util.regex.Matcher / Pattern </li></ul></ul><ul><li>Opérateurs ‘~’ ‘=~’ et ‘==~’ </li></ul>// java.util.regex.Pattern def pattern = ~/.ou/ // java.util.regex.Matcher def matcher = ('hibou pou chou genou' =~ pattern) assert matcher.size() == 4 assert 'hibou' ==~ /.*ou/
  14. 14. Structures de contrôle <ul><li>La vérité, rien que la vérité … </li></ul><ul><ul><li>true == références objets non-nulle </li></ul></ul><ul><ul><li>true == list/map non-vide </li></ul></ul><ul><ul><li>true == string non-vide </li></ul></ul><ul><ul><li>true == un matcher ayant un match </li></ul></ul><ul><ul><li>true == Valeur numérique différente de zéro </li></ul></ul><ul><ul><li>true == true (la valeur booléenne) </li></ul></ul><ul><li>Aussi: </li></ul><ul><ul><li>l’instruction if () == celle de Java </li></ul></ul><ul><ul><li>idem pour les try {…} catch() {…} </li></ul></ul>
  15. 15. Structures de contrôle (2) <ul><li>Boucler </li></ul><ul><ul><li>le while( expr ) est identique à celui de Java </li></ul></ul><ul><ul><li>pas de do {…} while ( expr ) en Groovy </li></ul></ul><ul><ul><li>for ( variable in iterable ) { instr } </li></ul></ul>def matcher = '12xy5' =~ /d/ for (match in matcher) { println match } def myString = 'Saku Koivu' for (i in 0..<myString.size()) { ... }
  16. 16. Structures de contrôle (3) <ul><li>Un switch beaucoup plus puissant qu’en Java : </li></ul>switch (x) { case 7: println &quot;7&quot;; break; case 2.3: println &quot;2.3&quot;; break; case &quot;dog&quot;: println &quot;dog&quot;; break; case [1, 2, 'alf']: println &quot;in list&quot;; break; case (3..6): println &quot;in range&quot;; break; case Integer: println &quot;Integer&quot;; break; case ~&quot;ca.*&quot;: println &quot;regex&quot;; break; }
  17. 17. GDK <ul><li>Plusieurs types de Java deviennent plus Groovy ! </li></ul>java.io.File: eachLine (Closure closure) eachFile (Closure closure) java.util.Date: minus(int days) plus(int days) java.lang.String: toURL() java.util.Collection: count(Object value) find(Closure closure) findAll(Closure closure)
  18. 18. Support natif des collections <ul><li>Les listes </li></ul><ul><ul><li>opérateur subscript [] = getAt()/putAt() </li></ul></ul><ul><ul><li>opérateur Spread *. </li></ul></ul><ul><ul><li>permet l’utilisation d’index négatifs </li></ul></ul>def sakuList = [] sakuList = ['fi','en'] sakuList << 'fr' assert sakuList instanceof java.util.List
  19. 19. Support natif des collections (2) <ul><li>Les maps </li></ul><ul><ul><li>permet la syntaxe .dot sur les clés </li></ul></ul><ul><ul><li>utilisation de valeur par défaut </li></ul></ul>def sakuMap = [:] sakuMap = [ 'team':'mtl', 'goals':12, 'languages':['fi', 'en'] ] println sakuMap.team assert sakuMap instanceof java.util.Map
  20. 20. Support natif des collections (3) <ul><li>Les ranges </li></ul><ul><ul><li>une liste de valeurs séquentielles </li></ul></ul><ul><ul><li>opérateur .. et ..< </li></ul></ul><ul><ul><li>utilisation: boucles, switch , et closures </li></ul></ul>def range = 5..8 assert range.size() == 4 for (i in range) { println &quot;Hello ${i}&quot; }
  21. 21. Closures <ul><li>Wikipedia </li></ul><ul><li>« In computer science, a closure is a function that is evaluated in an environment containing one or more bound variables. When called, the function can access these variables. The explicit use of closures is associated with functional programming and with languages such as ML and Lisp.» </li></ul><ul><li>Fonction Lambda de Lisp. </li></ul>(define (derivative f dx) (lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
  22. 22. Closures (2) <ul><li>En Groovy </li></ul><ul><ul><li>Une &quot;closure&quot; c'est un bout de code: </li></ul></ul><ul><ul><ul><li>assigné à une variable ou anonyme </li></ul></ul></ul><ul><ul><ul><li>exécuté ultérieurement </li></ul></ul></ul><ul><ul><ul><li>de type groovy.lang.Closure </li></ul></ul></ul><ul><li>Utilisation typique </li></ul><ul><ul><li>List (.each()) </li></ul></ul><ul><ul><li>File (.eachLine(), .eachFile()) </li></ul></ul><ul><ul><li>… </li></ul></ul>
  23. 23. Programmation objet <ul><li>Identique à Java … sauf: </li></ul><ul><ul><li>les inner class ne sont pas supportées </li></ul></ul><ul><ul><li>le scope par défaut des classes/méthodes/attributs est public </li></ul></ul><ul><ul><li>paramètres positionnels, et nommés </li></ul></ul><ul><ul><li>surcharge d’opérateurs permise </li></ul></ul><ul><ul><li>safe dereferencing operator ‘?.’ </li></ul></ul>
  24. 24. Programmation objet <ul><li>GroovyBeans </li></ul><ul><ul><li>Ajoute au formalisme des JavaBeans </li></ul></ul><ul><ul><ul><li>get/set sous-entendu pour préserver l’encapsulation </li></ul></ul></ul><ul><ul><ul><li>opérateur @ </li></ul></ul></ul><ul><ul><li>Expando, ou un GroovyBean « vierge » </li></ul></ul><ul><ul><ul><li>ajout dynamique d’attributs et méthodes ( closures ) </li></ul></ul></ul>
  25. 25. Programmation META objet <ul><li>Sous le capot de Groovy: </li></ul><ul><ul><li>toutes les classes ont une méta-classe </li></ul></ul><ul><ul><li>une méta-classe permet, entre autres, d’intercepter des appels à des méthodes inexistantes </li></ul></ul>classe méta-classe appel de methode()
  26. 26. Partie 3: Que fait-on avec Groovy? Applications concrètes du langage
  27. 27. Builders <ul><li>Principes basés sur le célèbre patron de conception (GOF 97) </li></ul><ul><ul><li>Permet de construire des structures de type «arbre» </li></ul></ul>def builder = new MarkupBuilder() builder.'web-app' { 'display-name' 'My Webapp' } <web-app> <display-name>My Webapp</display-name> </web-app>
  28. 28. Builders <ul><li>Applications usuelles </li></ul><ul><ul><li>MarkupBuilder </li></ul></ul><ul><ul><li>AntBuilder </li></ul></ul><ul><ul><li>GraphicsBuilder </li></ul></ul><ul><ul><li>SwingBuilder </li></ul></ul><ul><ul><li>… </li></ul></ul>
  29. 29. XML <ul><li>2 Objets Groovy pour faciliter le parsing de structures XML </li></ul><ul><ul><li>groovy.util.XMLParser </li></ul></ul><ul><ul><li>groovy.util.XMLSlurper </li></ul></ul><ul><li>Utiliser des librairies Java est tout aussi recommandé! </li></ul><ul><ul><li>DOM4J, par exemple </li></ul></ul>new XmlSlurper().parse(new File('C:/dev/data/file.xml'))
  30. 30. GSQL <ul><li>Accès aux SGBD </li></ul><ul><ul><li>package groovy.sql.* </li></ul></ul><ul><ul><li>2 façons de rendre SQL Groovy: </li></ul></ul><ul><ul><ul><li>Nature </li></ul></ul></ul><ul><ul><ul><ul><li>groovy.sql.GroovyResultSet </li></ul></ul></ul></ul><ul><ul><ul><li>DataSets </li></ul></ul></ul><ul><ul><ul><ul><li>groovy.sql.DataSet </li></ul></ul></ul></ul>
  31. 31. GANT <ul><li>Gant permet de construire des scripts de build à l’aide d’Ant, mais écrits en Groovy </li></ul><ul><ul><li>« Look Ma! No XML! » </li></ul></ul><ul><ul><li>Utilise les tâches d’Ant </li></ul></ul><ul><ul><li>Il existe un plugin pour Hudson </li></ul></ul>target ( default : 'This is the default target.' ) { if (System.getenv ( ).'JAVA_HOME') { anotherTarget() } }
  32. 32. Services Web <ul><li>Module GroovyWS </li></ul><ul><ul><li>Enrobe le cadre d’application Apache CXF </li></ul></ul><ul><li>Client et serveur se définissent de façon Groovy, c’est-à-dire simple et concise </li></ul><ul><ul><li>groovyx.net.ws.WSServer </li></ul></ul><ul><ul><li>groovyx.net.ws.WSClient </li></ul></ul>
  33. 33. Services Web import groovyx.net.ws.WSClient def proxy = new WSClient(&quot;http://localhost:6980/MathService?wsdl&quot;, this.class.classLoader) def result = proxy.add(1.0 as double, 2.0 as double) import groovyx.net.ws.WSServer def server = new WSServer() server.setNode(&quot;MathService&quot;, &quot;http://localhost:6980/MathService&quot;) Serveur Client
  34. 34. Tester avec Groovy <ul><li>GroovyTestCase </li></ul><ul><ul><li>JUnit est enchâssé dans l’environnement d’exécution de Groovy </li></ul></ul><ul><ul><li>Ajoute plusieurs méthodes assert* </li></ul></ul><ul><ul><li>GroovyTestSuite s’intègre à merveille avec les IDE </li></ul></ul><ul><ul><li>Il est tout aussi facile de rouler une batterie de tests avec Ant ou Maven </li></ul></ul>
  35. 35. Tester avec Groovy <ul><li>Tester avec d’autres outils </li></ul><ul><ul><li>Unit tests </li></ul></ul><ul><ul><ul><li>TestNG </li></ul></ul></ul><ul><ul><li>Services web </li></ul></ul><ul><ul><ul><li>Canoo WebTest </li></ul></ul></ul><ul><ul><ul><li>SOAPUI </li></ul></ul></ul><ul><ul><li>Coverage </li></ul></ul><ul><ul><ul><li>Cobertura </li></ul></ul></ul>
  36. 36. Partie 4: Conclusion La fin … vraiment? Ou seulement le début?
  37. 37. State of the «groovy» nation <ul><li>Version </li></ul><ul><ul><li>Dernière livraison: 1.1 RC 2 </li></ul></ul><ul><ul><li>1.1 final devrait être à nos portes </li></ul></ul><ul><li>Présence </li></ul><ul><ul><li>Spring </li></ul></ul><ul><ul><li>Jboss Seam </li></ul></ul><ul><ul><li>IBM project ZERO </li></ul></ul><ul><ul><li>OpenEJB </li></ul></ul><ul><ul><li>ServiceMix </li></ul></ul><ul><ul><li>Grails </li></ul></ul><ul><ul><li>Hudson </li></ul></ul><ul><ul><li>Canoo Web Test </li></ul></ul><ul><ul><li>SoapUI </li></ul></ul>
  38. 38. Défis à venir <ul><li>Surfer sur la vague sans perdre pied! </li></ul><ul><ul><li>maintenir le rythme effréné des livraisons </li></ul></ul><ul><ul><li>maintenir le niveau élevé de la qualité </li></ul></ul><ul><li>Documentation </li></ul><ul><ul><li>la communauté le réclame: une documentation à jour, mieux organisée </li></ul></ul><ul><li>Performance </li></ul><ul><ul><li>bien que cet aspect ait été amélioré depuis quelques livraisons, beaucoup de travail reste à faire </li></ul></ul>
  39. 39. Voir la lumière … <ul><li>Grails </li></ul><ul><ul><li>Cadre d’application web agile </li></ul></ul><ul><ul><li>Assemblage de frameworks connus de l’écosystème Java </li></ul></ul><ul><ul><li>Applique les principes de productivité de Rails en lui chipant plusieurs idées ( À tout seigneur, tout honneur. ) </li></ul></ul><ul><ul><li>À suivre … </li></ul></ul>
  40. 40. Références <ul><li>Bouquins </li></ul><ul><ul><li>Groovy in action </li></ul></ul><ul><ul><li>Dierk König, 2007 </li></ul></ul><ul><ul><li>ISBN 1-932394-84-2 </li></ul></ul><ul><ul><li>Groovy programming </li></ul></ul><ul><ul><li>Kenneth Barclay/John Savage, 2006 </li></ul></ul><ul><ul><li>ISBN 978-0-12-372507-3 </li></ul></ul><ul><ul><li>Groovy Recipes </li></ul></ul><ul><ul><li>Scott Davis, Coming soon! </li></ul></ul>?
  41. 41. Références <ul><li>Sur la grande toile </li></ul><ul><ul><li>http://groovy.codehaus.org </li></ul></ul><ul><ul><li>http ://www.groovyblogs.org </li></ul></ul><ul><ul><li>http://www.aboutgroovy.com </li></ul></ul><ul><ul><li>http://www.g2one.com </li></ul></ul><ul><ul><li>http://jcp.org/en/jsr/detail?id=241 </li></ul></ul><ul><ul><li>Groovy User Groups </li></ul></ul><ul><ul><ul><li>Vancouver http://groovyvan.com/ </li></ul></ul></ul><ul><ul><ul><li>Londres http://skillsmatter.com/menu/539 </li></ul></ul></ul><ul><ul><ul><li>Melbourne http://tech.groups.yahoo.com/group/groovy-melbourne/ </li></ul></ul></ul><ul><ul><ul><li>Stuttgart http://www.jugs.de/sig-groovy.html </li></ul></ul></ul><ul><ul><ul><li>Minnesota http://groups.google.com/group/groovymn </li></ul></ul></ul><ul><ul><ul><li>Montréal? </li></ul></ul></ul>
  42. 42. Références <ul><li>La Blogoshère </li></ul><ul><ul><li>Guillaume Laforge </li></ul></ul><ul><ul><li>Jason Rudolph </li></ul></ul><ul><ul><li>Glen Smith </li></ul></ul><ul><ul><li>Sven Haiges </li></ul></ul><ul><ul><li>Scott Davis </li></ul></ul><ul><ul><li>Venkat Subramaniam </li></ul></ul><ul><ul><li>Geertjan Wielenga </li></ul></ul><ul><ul><li>Jeremy Rayner </li></ul></ul><ul><ul><li>Mark Palmer </li></ul></ul><ul><ul><li>Jeff Brown </li></ul></ul><ul><ul><li>Andres Almiray </li></ul></ul><ul><ul><li>… </li></ul></ul><ul><li>http://glaforge.free.fr/weblog/ </li></ul><ul><li>http://www.jasonrudolph.com/blog/ </li></ul><ul><li>http ://blogs.bytecode.com.au/glen/ </li></ul><ul><li>http://svenhaiges.de/ </li></ul><ul><li>http://www.davisworld.org/ </li></ul><ul><li>http://www.agiledeveloper.com/blog/ </li></ul><ul><li>http://blogs.sun.com/geertjan/ </li></ul><ul><li>http://javanicus.com/blog2/ </li></ul><ul><li>http://www.anyware.co.uk/2005/ </li></ul><ul><li>http://javajeff.blogspot.com/ </li></ul><ul><li>http://jroller.com/aalmiray/ </li></ul>
  43. 43. Des questions? Merci à tous [email_address]

×