jeudi 18 décembre 2008

Coding Dojo à Grenoble


Dans le cadre du CARA, nous organisons un Coding Dojo à Grenoble.
Mais qu'est ce donc que cela: il s'agit d'un lieu d'entrainement (d'où le terme de dojo) pour pouvoir étudier, tester et apprendre des techniques et des langages de code. Fini la prise de risque sur un projet, venez vous entrainer dans un lieu sûr, sans risque, entouré des meilleurs professionnels de la région (c'est à dire vous ;o) ).
Attention il ne s'agit pas d'une formation 'classique' avec un professeur et des élèves attentifs, ici tout le monde participe et tout le monde s'enrichit !!!
  • Vous rêvez d'apprendre Ruby sous Linux mais vous codez votre projet en C#.
  • Si vous parlez de langage fonctionnel à votre chef de projet il va vous regarder avec des yeux comme des soucoupes.
  • Si TDD vous évoque T'es Dans la Déprime sur un projet en cycle en V.
  • Si vous voulez vivre des sensations eXtrem Programming.

Bref, si ces phrases vous interpellent c'est qu'il est temps de venir nous rejoindre.

Les informations et l'inscription se passent ici.

jeudi 11 décembre 2008

MSP un an après

Il y a un plus d'un an je participais à l'aventure Mon Service Public et je réalisais avec quelques uns le kit d'intégration SSO pour l'administration française selon les protocoles de la Liberty Alliance.
Aujourd'hui notre code passe enfin en production :o)
Quelques liens qui en parlent :
Le site Mon Service Public
Le Sénat
Monde Public.

Un sacré projet qui nous a permis de valider pas mal de concepts et d'affiner les procédures de développement chez Orange Labs. Alalala la constructon d'artefacts multi-JDK sous Maven2, fut un poème ;o)
Bon week-end

lundi 8 décembre 2008

Scott Ambler sur InfoQ


Dans cet entretien Floyd Marinescu,responsable éditorial d'InfoQ, interroge Scott Ambler, Responsable de l'équipe pour la Mise en oeuvre des Developpements Agiles à IBM, sur l'état actuel des choses dans la communauté Agile, notamment en ce qui concerne sa mise en oeuvre, et sur les perspectives de l'Agilité.

L'entretien est disponible ici: Scott Ambler On Agile’s Present and Future (38 min.)

mardi 2 décembre 2008

Lean Training avec Alan Shalloway


La société Net Objectives propose une série de webinaires gratuits sur le Lean présentés par Alan Shalloway.

Il s'agit d'une série de 6 session d'environ 90 minutes dont voici les sujets :

  • Session 1
    Introduction to Lean Software Development
    * Lean as fast-flexible-flow
    * Lean principles of software development
    * The importance of value stream mapping
    * Exercise: Value Stream Mapping

  • Session 2
    Five Reasons for Agility
    * Add business value quickly
    * Clarify needs of the customer
    * Better project management
    * Quick wins, quick learning
    * Better for development
    Product Portfolio Management
    * Driving from business value
    * Minimizing work in progress
    * Smaller projects add more value

  • Session 3
    Lean as a Guide for Agile Methods
    * Just In Time
    * Contrasting Waterfall with Agility

  • Session 4
    QA's role in Lean Agile Software Development

  • Session 5
    How Business Analysts can help their teams

  • Session 6
    Lean Anti-Patterns

pour s'inscrire ça se passe ici.

mercredi 26 novembre 2008

Le retour des Exigence non fonctionnelles

Blog Pictures | acobox.comJe viens de lire un post de Mike Cohn sur la gestion des exigences non-fonctionnelles. Son contenu ainsi que ses réponses aux commentaires ne sont pas sans rappeler les articles de Scott que j'ai traduits :
On voit bien qu'après la première phase d'adoption des méthodes agile, arrive le temps de la maturité et le passage à des 'gros' projets et les questions que cela soulève. En gardant l'esprit ouvert et en restant souple on passera ce cap lui aussi alors soyons Agiles.

NdT: Sinon j'ai apprécié le terme contrainte plutôt qu'exigence non-fonctionnelle que je trouve un peu pataud.

mardi 25 novembre 2008

Gestion des exigences complexes

Blog Pictures | acobox.comLa traduction du mois est de retour avec un nouvel article de Scott dans le Doctor Dobb's Journal sur la gestion des exigences complexes. Scott nous expose ici la limitation des simples histoires d'utilisateur et les différents cas qui peuvent se produire pour lesquels il faut avoir une vision plus macroscopique du projet. La mise en œuvre des épopées ("epics")est l'une des premières solution qu'il propose mais cela ne suffit pas toujours surtout lorsque les projets grossissent.
Bref un bon article sur le passage à l'échelle des méthodes agiles ;o)
Bonne lecture.


Pour ceux qui n'aiment pas slideshare, il est aussi disponible sur Google Docs ici.

mardi 18 novembre 2008

Agile et CMMI c'est officiel

Blog Pictures | acobox.comDepuis le temps que l'on en parle, David Anderson avait laissé entendre que c'était à l'étude mais je ne pensais pas que ça sortirait si vite. Et oui agilistes en herbe et papys des NTIC c'est fait fait, c'est officiel !!!Le SEI dans un rapport technique intitulé CMMI® or Agile: Why Not Embrace Both!, Technical Note (CMU/SEI-2008-TN-003 clarifie la position du CMMI par rapport aux pratiques Agiles: travaillons ensemble vers un meilleur développement logiciel !!!!
Merci à
Hillel Glazer (Entinex, Inc.)
Jeff Dalton (Broadsword Solutions Corporation)
David Anderson (David J. Anderson & Associates, Inc.)
Mike Konrad
Sandy Shrum

PS : si vous voulez le retour d'Alex ou les commentaires de QualityStreet

mardi 4 novembre 2008

Flash Spécial : les Agilistes écrivent de la documentation!

Free blog image | acobox.comL'article de Scott Ambler intitulé Newsflash: Agilists Write Documentation! sur Dr. Dobb's Journal remet en cause les idées reçues autour de l'Agilité:
Oui lorsqu'on est Agile on écrit de la documentation.
Oui une équipe agile modèlise.
Oui un projet agile est structuré autour d'une architecture.
Je tiens à remercier Scott Ambler et Jon Erickson (du Dr. Dobb's Journal) qui ont gracieusement accepté ma requête pour pouvoir publier cette traduction.
La voici donc :


Pour ceux qui n'ont pas un compte slideshare, vous pouvez le voir ici.

lundi 3 novembre 2008

Développeur : l'artiste du 21ème siècle

Free blog image | acobox.comVendredi soir je surfais tranquillement sur Infoq lorsque j'ai vu une présentation intitulée The Lego Hypothesis. Les lego ayant bercés mon enfance, j'ai commencé à regarder la présentation du néo-zélandais James Noble. La présentation était intéressante sur plusieurs points : tout d'abord il nous présentait la naissance de l'ingénierie logiciel en 1968, puis la structure de gros programmes dans différents langages. Ce qu'il démontre c'est que nos programmes sont structurés comme des romans. Et là je ne peux m'empêcher de penser à cette notion qui me taraude depuis longtemps sur le processus de création et cette intuition qui fait que je pense depuis longtemps qu'un bon développeur est avant tout un artiste (ou un bâtisseur de cathédrales). De nombreux articles ont été écrits à ce sujet mais là on avait une 'preuve' formelle.
Finalement quand on écrit un programme on est le 'nègre' du notre client, essayant d'écrire sa biographie avec ses histoires (d'utilisateur). Or on n'imagine pas qu'une telle écriture se fasse d'un seul jet, que l'auteur après quelques heures de discussion se mette à écrire le roman qui sera lu une seule fois juste avant la publication.
Si on poursuit la métaphore on voit bien qu'il va falloir écrire des chapitres que l'on va faire relire au fur et à mesure à notre client pour vérifier qu'on reste bien conforme à ce qu'il attend. Qui a prononcé le mot 'itérations' ? ;o).
On peut surement améliorer le parallèle mais tout ceci montre avec évidence, s'il en fallait encore, la pertinence des méthodes agiles.

jeudi 30 octobre 2008

Quittons l'esprit Chimpanzé pour les Bonobos


Hier j'ai eu la chance de participer à un webinaire: "Are Agilists the Bonobos of Software Development?" animé par Linda Rising et organisé par l'ITMPI. Ce séminaire avait été présenté à Agile 2006 et on trouve une interview qui en reprend les principaux points sur InfoQ.

Elle y compare la culture des Chimpanzés (patriarcale, avec un mâle dominant organisée autour du rapport de force) et celle des Bonobos (plus douce et plus communautaire). Elle montre ensuite comment les pratiques agiles (notamment le pair-programming) relèvent plus de la culture Bonobo alors que les systèmes hiérarchiques eux sont plus chimpanzés. Il semblerait qu'appliquer les techniques bonobo permette un meilleur flot d'informations et une meilleure confiance en soi. Éléments qui manquent pour une féminisation du développement informatique.

Une présentation bien rafraichissante en ces temps de pluie et de brouillard.

lundi 27 octobre 2008

Qui apporte la glue technique sur un projet Agile ?


Un petit billet que m'a inspiré l'article suivant:
Who plays the role of technical producer on Agile teams?.

Ce n'est pas sans rappeler la conversation que j'avais eue avec Hervé. Lorsque je lis de nombreux articles sur l'Agilité et ses corolaires je me pose souvent la question "Mais qui s'occupe de l'aspect technique de l'introduction de l'Agilité dans l'équipe ?". On a des coaches agiles, des scrum masters, ... mais qui valide que l'équipe applique correctement le TDD ? Qui vérifie la qualité du code ?
Certains me répondront surement que c'est là la responsabilité de l'équipe et j'en conviens tout à fait. Mais si l'équipe doit, en plus d'apprendre à se gérer elle-même, mettre en oeuvre des bonnes pratiques qui sont tout sauf évidentes (le tests first par exemple, l'intégration continue, les mesures de qualité de code, l'analyse statique, etc.) elle ne s'en sortira pas bien. C'était d'ailleurs la conclusion d'Hervé (et je suis bien d'accord avec lui) : il faut un leader technique, pendant du coach agile, sur les projets agiles surtout dans les premières mises en oeuvre de l'agilité par une équipe.

En bref, pour paraphraser l'article du début, avoir le meilleur groupe de musique du monde ne suffit pas, il faut aussi un bon producteur.

jeudi 16 octobre 2008

Netbeans 10 ans déjà


Cela fait 10 ans que Netbeans existe :o))
Je regarde en arrière et je me rends compte à quel point le temps a passé.
Le temps où avoir 512 Mo de RAM sur un PC était un luxe. Eclipse n'existait pas et on avait VisualAge écrit en Smalltalk. Ça ramait dans tous les sens, les EJB 2.0 et 2.1 nous faisaient des misères, ....
Joyeux anniversaire Netbeans, pour télécharger ça se passe ici

mercredi 15 octobre 2008

Agile Tour Grenoble 2008: Retrospective


J'ai pu participer à 3 des présentations de l'Agile Tour 2008 à Grenoble.
Tout d'abord :

  • eXtrem Programming – Retour d'expérience après 6 années de pratiques - J-M. Voisin, Allianz Global Investor : un retour d'expérience fort intéressant où j'ai pu m'apercevoir qu'Allianz était dans la même ligne qu'Orange Labs sur le choix des outils et des pratiques. Le chiffre du jour : un projet en XP entraine un surcoût de 15% à la réalisation mais l'équipe qui passait de 50% de son temps en maintenance en est à moins de 10% (environ 1 bug par mois).

  • Senteurs Agiles - T.Lissajoux, Octo : un atelier vraiment enrichissant et un jeu de cartes tout simplement génial. J'ai hâte de pouvoir en obtenir une version :o)).

  • Agilité et AvioniqueE. Chenu, Thales Avionics : depuis le temps que je voulais voir Emmanuel en vrai. C'est là qu'on voit le gouffre entre le monde de l'avionique et celui du SI. L'expression 'application critique' prend tout son sens. Une expérience intéressante car elle donne des clefs pour convaincre nos chers décideurs.

lundi 13 octobre 2008

Master he is breathing


Et oui le voilà, il est tout beau, il est tout chaud notre premier plugin Maven est enfin sorti en version 1.0.
J'espère que vous allez tous pouvoir en profiter :o))
Ça se passe ici.

vendredi 10 octobre 2008

Agile Grenoble 2008 - Quelques photos.....

Voici quelques photos prises par Alexandre Boutin, dont ces deux là où nous sommes en pleine action avec Rémy ;o) :



Devinez qui travaille chez Orange Labs et qui travaille chez Silverpeas ;o)

Agile Tour Grenoble 2008 - les slides

En attendant la rétrospective voici les slides que nous avons présentés Rémy et moi-même sur le retour d'expérience de la mise en place d'outils d'ingénierie logicielle à Orange Labs :

La présentation :



Sinon les documents sont aussi disponibles sur slideshare (pour ceux qui ont un compte) :

  • en pdf.

  • en powerpoint pour ceux qui veulent profiter des animations.

lundi 6 octobre 2008

Dépasser les exigences fonctionnelles sur les projets de développement Agile

L'article de Scott Ambler intituléBeyond Functional Requirements On Agile Projects sur Dr. Dobb's Journal est très intéressant car il ne se contente pas de s'occuper de la partie réalisation au jour le jour d'un projet mais le prend dans sa globalité et présente différentes stratégies pour prendre en compte les exigences non fonctionnelles.
J'ai donc décidé de le traduire afin qu'il soit relayé auprès des communautés francophones.
Je tiens à remercier Scott Ambler et Jon Erickson (du Dr. Dobb's Journal) qui ont gracieusement accepté ma requête pour pouvoir publier cette traduction.
La voici donc : Dépasser les exigences fonctionnelles sur les projets de développement Agile

Suite au commentaire de Miguel :
Pour ceux qui n'ont pas un compte slideshare, vous pouvez le voir ici.

Agile Tour Grenoble 2008


Il passera à Grenoble cette année : pour une fois qu'on n'a pas un évènement uniquement parisien. J'ai la grande chance de présenter avec Rémy nos expériences à Orange Labs pour mettre en place des outils facilitant le développement Agile.
Pour les horaires ça se trouve ici. Nous serons à la séance de 17h15 à 18h00 dans l'Amphi Simplicité.
Pour venir suivez le guide ici.
@jeudi donc.

lundi 29 septembre 2008

Changement d'avatar

Comme me l'a fait remarquer Rémy mon joyeux avatarn'était pas sous licence LGPL mais sous Creative Commons by-nc-sa. Ce qui signifie que je me devais de signaler qui en était l'auteur et le site d'origine (sous l'image), que l'usage commercial en était prohibé. Bref ça devenait compliqué surtout quand on essaye d'être cohérent et de l'utiliser partout.
Je reviens donc à mes premières amours (licence poétique) et me revoilà chimiste et libre. J'en remercie Batux, l'auteur et son choix de licence.
Je retourne à mes slides car il ne reste plus qu'une grosse semaine avant l'heure fatidique.

jeudi 25 septembre 2008

Bad code m'a tuer

Etre professionnel c'est faire du bon code quitte à tricher et à ne pas en avertir son chef. Voilà une philosophie qui me parle :o))



Our industry is plagued by an epidemic of very bad code.

Robert Martin (known as Uncle Bob), founder of ObjectMentor.
Uncle Bob rulezzzzzzzzzzzzz :o)

La source JAOO.

lundi 22 septembre 2008

Agile s'exporte en dehors de l'informatique

C'était une tendance que l'on a observé à l'Agile 2008 dont voici les commentaires de ceux qui ont eu la chance d'y participer : agilethinking et Lyssa Adkins.
Lors de ma discussion post-présentation, j'ai été surpris de constater que chez nous cela se pratique aussi (déjà devrais je dire vu que l'on a souvent plusieurs années de retard sur les USA). J'y ai rencontré un chef de projet qui essayait de mettre l'Agilité en oeuvre dans le monde du BTP. Bien sûr moyennant une adaptation du vocabulaire ;o)

vendredi 19 septembre 2008

Les slides

Je vais essayer de retravailler tout cela après l'Agile Tour, histoire d'enlever le superflu ;o) et pour que ça rende mieux :

Références

Voici les références que j'ai citées lors de ma présentation :
Henrik Kniberg et son fameux Scrum form the trenches :
http://blog.crisp.se/henrikkniberg/

David Anderson et sa présentation à l'Agile 2008 pour une mise en place des kanbans Lean pour ajouter une chaine de pull à de l'Agile classique : la présentation et la transcription partielle.

Mary Poppendieck pour la partie management et lean.


http://video.google.com/videoplay?docid=-5105910452864283694
http://www.infoq.com/presentations/poppendieck-agile-leadership
http://www.infoq.com/interviews/poppendieck-lean-2007

Mike Cohn pour la gestion du backlog.
Et enfin Scott Ambler (dont je parle 2 billets plus bas) sur l'état de l'Agile dans le monde de l'informatique.

Et enfin Emmanuel Chenu pour sa mise en oeuvre de l'Agilité et de Scrum.

mardi 16 septembre 2008

Scott Ambler

Je vous ai déjà parlé à de nombreuses reprises de ce cher canadien Scott Ambler. Il était présent à Agile 2008 (lui :-( ) et a donné quelques chiffres clef sur la communauté Agile glanés à partir de l'étude du Doctor Dobb's Journal.
La présentation est visible en ligne sur InfoQ et on peut trouver une partie des slides ici.
J'attends avec impatience son prochain article dans lequel il devrait nous fournir une analyse encore plus complète de ses chiffres. Une nouvelle traduction en perspective ;o).

Ma première conférence

En attendant la superbe conférence à l'Agile Tour Grenoble 2008 de Rémy et moi-même sur le retour d'expérience d'Orange Labs quant à la mise au point autour de Maven 2 d'une forge à logiciels Agile, je vais donner ce jeudi ma toute première conférence au CESI à Lyon.
Je compte y aborder l'Agilité surtout d'un point de vue développeur. Hélas je n'ai pas vu la conclusion d'Uncle Bob, un des mentors que j'adore. J'ai hâte de voir ça et de lire son Clean Code: A Handbook of Agile Software Craftsmanship où on trouvera encore plein de sources d'inspiration pour le codeur de base que je suis.
@jeudi donc les lyonnais.
@bientôt pour les autres.

jeudi 11 septembre 2008

Humour à 2 roupies .....

mercredi 3 septembre 2008

15 jours sans posts, et pourtant je n'ai pas chomé ;o), je vous propose donc quelques présentations (in English).
La présentation de David Anderson : Future Directions for Agile lors de la conférence Agile 2008 est vraiment excellente.
Ses réflexions sur l'évolution de l'agilité et l'intégration dans un contexte d'entreprise vont dans le même sens (de mon point de vue) que les remarques de Scott Ambler dont je vous recommande la newsletter sur Doctor Dobb's Journal. La présentation Evolving Agile de Scott lors de Javapolis 2007 vaut aussi le coup d'oeil.
Bons visionnages

mardi 12 août 2008

Humour Agile

Juste parce que ça m'a fait sourire en ces temps d'acronymes à tire-la-rigo:
Assole Driven Development

vendredi 1 août 2008

Les projets au forfait vont ils à l'encontre de l'éthique ?

L'article de Scott Ambler intitulé Is Fixed-Price Software Development
Unethical?
sur Dr. Dobb's Journal m'est appau comme une révélation. Il donne enfin une liste d'arguments chiffrés pour nous inciter à quitter le monde du projet au forfait 'classique' (où tout est figé).
J'ai donc décidé de le traduire afin qu'il soit relayé auprès des communautés francophones.
Je tiens à remercier Scott Ambler et Jon Erickson (du Dr. Dobb's Journal) qui ont gracieusement accepté ma requête pour pouvoir publier cette traduction.
La voici donc : Les projets au forfait vont ils à l'encontre de l'éthique ?

lundi 28 juillet 2008

Mon premier DOJO

Vendredi soir j'ai pu participer à mon premier DOJO de code grâce à deux étudiants brésiliens d'Alfredo Goldman : Hugo et Mariana.
Mais qu'est ce qu'un dojo de code me direz vous ?
Ironiquement c'est un concept français qui revient dans nos contrées. En effet le premier dojo fut créé à Paris (il est d'ailleurs toujours en activité) par Laurent Bossavit.
Vendredi soir, nous étions donc une petite dizaine dans une salle de l'Ensimag encore allumée en ce mois de vacances. Pour commencer le sujet proposé était une introduction à Ruby et au Test Driven Developpement (via rspec).
L'audience était consistuée à la fois de membres du laboratoire qui nous accueillait ainsi que de quelques développeurs que j'oserai qualifier de professionnels ;o).
Une bonne ambiance qui nous a fait ainsi entrer dans le monde Ruby. C'était en tout cas un réel plaisir d'apprendre ainsi.
Alfredo j'attends avec impatience les supports et les liens afin qu'on puisse remettre cela à la rentrée.

vendredi 25 juillet 2008

Documentation documentation ....

Les aller-retours permanents entre le code et la documentation sont pour moi une perte de temps et d'énergie (Muda selon Lean). D'ailleurs c'est pour cette raison qu'XP préconise de réduire au maximum la documentation et de la faire au plus près du code.
Qui n'a pas utilisé le retro-engineering des outils UML pour produire les diagrammes nécessaires plutôt que de les maintenir au fur et à mesure du développement ?
D'où l'idée qui coniste à produire automatiquement la documentation à partir du code, ainsi on aurait une documentation continue et toujours en adéquation avec le code. C'est d'ailleurs ce que propose Paul Duvall dans son dernier article "Automation for the people: Pushbutton documentation".
Dans le même esprit j'avais déjà expérimenté UMLGraph mais cela restait laborieux. L'outil Apiviz semble un pas en avant vers la bonne solution. J'espère le tester rapidement ;o)
Bon week-end.

jeudi 24 juillet 2008

Introduction à Hudson

Il y a quelques mois j'avais écrit une introduction à l'installation d'Hudson mais je n'arrivais pas à la partager sur ce blog :o(.
Ce matin j'ai eu une illumination et grâce à GoogleDocs la voici :
Mise en place de Hudson

jeudi 10 juillet 2008

Google Lively

Google vient de lancer Lively une forme simplifiée de Second Life, vivement le partage d'application à la Wonderland

mercredi 9 juillet 2008

Vidéos toujours

Pour continuer dans les présentations Agile chez Google avec quelques pointures :
Mike Cohn avec Agile Estimations :



Voilà qui devrait permettre d'approfondir les échanges de la réunion de juin du Club Agile de Grenoble.

mercredi 2 juillet 2008

Mary Poppendieck: The role of leadership in software development

Une vidéo excellente et très claire sur l'histoire du management:


On comprend bien d'où l'on vient et où on espère aller :o)
Un grand bravo à Mary et Tom Poppendieck.

Le modèle de Dreyfus

Ce modèle pour caractériser l'acquisition des connaissances (essentielle dans la capitalisation d'une équipe Agile) semble avoir le vent en poupe dernièrement dans le monde informatique.
Andy Hunt célèbre pour son The Pragmatic Programmer: From Journeyman to Master explique sa vision dans l'interview suivante :



Pour plus d'informations :

mercredi 11 juin 2008

Un petit dessin qui n'est pas sans me rappeler quelqu'un :


Il vient du site suivant : Geekscottes

mercredi 28 mai 2008

MOJO me voici ;)

Et voilà notre plugin Maven: scmchangelog-maven-plugin est enfin arrivé dans la sandbox de MOJO sur codehaus :).
Un grand merci à Arnaud Héritier qui a permis cela !!!
Pour rappel ce plugin permet de produire un changelog dynamiquement en parsant les commentaires de votre outils de gestion de configuration. Pour l'instant Subversion et Mercurial sont supportés mais j'espère bien intégrer de nouveaux produits.
Avec je l'espère un nouveau projet opensource bientôt, je vais peut être enfin quitter le monde propriétaire ......

Le lien scmchangelog-maven-plugin :)

lundi 19 mai 2008

Rendre Jackrabbit configurable avec Spring-module

Voici une amélioration du RepositoryFactoryBean pour Jackrabbit de spring-modules qui permet d'utiliser un fichier .properties pour remplacer des clefs dans le fichier de configuration repository.xml :



import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.jcr.Repository;

import org.apache.jackrabbit.api.JackrabbitRepository;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springmodules.jcr.RepositoryFactoryBean;
import org.xml.sax.InputSource;

/**
 * FactoryBean for creating a JackRabbit (JCR-170) repository through Spring
 * configuration files. Use this factory bean when you have to manually
 * configure the repository; for retrieving the repository from JNDI use the
 * JndiObjectFactoryBean {@link org.springframework.jndi.JndiObjectFactoryBean}.
 * Sample configuration :
 <code>
 *&lt;bean id="repository" class="BetterRepositoryFactoryBean"&gt;
 * &lt;!-- normal factory beans params --&gt;
 *   &lt;property name="configuration" value="classpath:repository.xml" /&gt;
 *   &lt;property name="homeDir" value="file:///c:/tmp/jackrabbit" /&gt;
 *   &lt;property name="configurationProperties"&gt;
 *     &lt;list&gt;
 *     &lt;value&gt;classpath:/first.properties&lt;/value&gt;
 *     &lt;value&gt;classpath:/second.properties&lt;/value&gt;
 *     &lt;/list&gt;
 *   &lt;/property&gt;
 * &lt;/bean&gt;
 *</code>
 *
 @see org.springframework.jndi.JndiObjectFactoryBean
 @author Costin Leau
 @author Emmanuel Hugonnet
 *
 */
public class BetterRepositoryFactoryBean extends RepositoryFactoryBean {

  /**
   * Default repository configuration file.
   */
  private static final String DEFAULT_CONF_FILE = "repository.xml";

  /**
   * Default repository directory.
   */
  private static final String DEFAULT_REP_DIR = ".";

  /**
   * Properties configuration the repository.
   */
  private List configurationProperties;
  /**
   * Home directory for the repository.
   */
  private Resource homeDir;

  /**
   * Repository configuration created through Spring.
   */
  private RepositoryConfig repositoryConfig;

  /**
   @see org.springmodules.jcr.RepositoryFactoryBean#createRepository()
   */
  protected Repository createRepository() throws Exception {
    // return JackRabbit repository.
    return RepositoryImpl.create(repositoryConfig);
  }

  /**
   @see org.springmodules.jcr.RepositoryFactoryBean#resolveConfigurationResource()
   */
  protected void resolveConfigurationResource() throws Exception {
    // read the configuration object
    if (repositoryConfig != null)
      return;

    if (this.configuration == null) {
      log.debug("no configuration resource specified, using the default one:"
          + DEFAULT_CONF_FILE);
      configuration = new ClassPathResource(DEFAULT_CONF_FILE);
    }

    if (homeDir == null) {
      if (log.isDebugEnabled())
        log.debug("no repository home dir specified, using the default one:"
            + DEFAULT_REP_DIR);
      homeDir = new FileSystemResource(DEFAULT_REP_DIR);
    }
    if (getConfigurationProperties() != null) {
      String goodConfig = replaceVariables(loadConfigurationKeys(),
          getConfiguration(configuration)true);
      repositoryConfig = RepositoryConfig.create(new InputSource(
          new StringReader(goodConfig)), homeDir.getFile().getAbsolutePath());
    else {
      repositoryConfig = RepositoryConfig.create(new InputSource(configuration
          .getInputStream()), homeDir.getFile().getAbsolutePath());
    }
  }

  /**
   * Performs variable replacement on the given string value. Each
   <code>${...}</code> sequence within the given value is replaced with the
   * value of the named parser variable. If a variable is not found in the
   * properties an IllegalArgumentException is thrown unless
   <code>ignoreMissing</code> is <code>true</code>. In the later case,
   * the missing variable is not replaced.
   *
   @param value
   *          the original value
   @param ignoreMissing
   *          if <code>true</code>, missing variables are not replaced.
   @return value after variable replacements
   @throws IllegalArgumentException
   *           if the replacement of a referenced variable is not found
   */
  public static String replaceVariables(Properties variables, String value,
      boolean ignoreMissingthrows IllegalArgumentException {
    StringBuffer result = new StringBuffer();

    // Value:
    // +--+-+--------+-+-----------------+
    // | |p|--> |q|--> |
    // +--+-+--------+-+-----------------+
    int p = 0, q = value.indexOf("${")// Find first ${
    while (q != -1) {
      result.append(value.substring(p, q))// Text before ${
      p = q;
      q = value.indexOf("}", q + 2)// Find }
      if (q != -1) {
        String variable = value.substring(p + 2, q);
        String replacement = variables.getProperty(variable);
        if (replacement == null) {
          if (ignoreMissing) {
            replacement = "${" + variable + '}';
          else {
            throw new IllegalArgumentException("Replacement not found for ${"
                + variable + "}.");
          }
        }
        result.append(replacement);
        p = q + 1;
        q = value.indexOf("${", p)// Find next ${
      }
    }
    result.append(value.substring(p, value.length()))// Trailing text
    return result.toString();
  }

  /**
   * Shutdown method.
   *
   */
  public void destroy() throws Exception {
    // force cast (but use only the interface)
    if (repository instanceof JackrabbitRepository)
      ((JackrabbitRepositoryrepository).shutdown();
  }

  /**
   @return Returns the defaultRepDir.
   */
  public Resource getHomeDir() {
    return this.homeDir;
  }

  /**
   @param defaultRepDir
   *          The defaultRepDir to set.
   */
  public void setHomeDir(Resource defaultRepDir) {
    this.homeDir = defaultRepDir;
  }

  /**
   @return Returns the repositoryConfig.
   */
  public RepositoryConfig getRepositoryConfig() {
    return this.repositoryConfig;
  }

  /**
   @param repositoryConfig
   *          The repositoryConfig to set.
   */
  public void setRepositoryConfig(RepositoryConfig repositoryConfig) {
    this.repositoryConfig = repositoryConfig;
  }

  /**
   @return Returns the configuration properties.
   */
  public List getConfigurationProperties() {
    return configurationProperties;
  }

  /**
   @param configurationProperties
   *          The configuration properties to set for the repository.
   */
  public void setConfigurationProperties(List resources) {
    this.configurationProperties = resources;
  }

  /**
   * Load all the configuration properties
   *
   @return
   */
  protected Properties loadConfigurationKeys() {
    Iterator iter = configurationProperties.iterator();
    Properties props = new Properties();
    ResourceLoader loader = new DefaultResourceLoader(this.getClass()
        .getClassLoader());
    String location = "";
    while (iter.hasNext()) {
      try {
        location = (Stringiter.next();
        props.load(loader.getResource(location).getInputStream());
      catch (IOException e) {
        log.info("Error loading resource " + location, e);
      }
    }
    return props;
  }

  /**
   * Load a Resource as a String.
   @param config the resource
   @return the String filled with the content of the Resource
   @throws IOException
   */
  protected String getConfiguration(Resource configthrows IOException {
    StringWriter out = new StringWriter();
    Reader reader = null;
    try {
      reader = new InputStreamReader(config.getInputStream());
      char[] buffer = new char[8];
      int c = 0;
      while ((c = reader.read(buffer)) 0) {
        out.write(buffer, 0, c);
      }
      return out.toString();
    finally {
      if (reader != null) {
        reader.close();
      }
    }
  }
}


mercredi 30 avril 2008

Jackrabbit et les tests unitaires

Je travaille actuellement avec Jackrabbit. J'utilise spring-modules ce qui me permet de facilement instancier mon repository. Cependant comment avoir un repository pour mes tests unitaires. Grâce à ce post j'ai un respository de test tout simple.
Voici donc les éléments clefs de mon fichier de configuration :

<FileSystem
class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
<param name="path" value="${rep.home}/repository" />
</FileSystem>

et

<PersistenceManager
class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
<param name="persistent" value="false" />
</PersistenceManager>

et voilà :)

mardi 29 avril 2008

Waterfall ou Agile

Un lien vers une vidéo plus que sympathique.

Rusty & Kate

mardi 15 avril 2008

Estimations

Voila un excellent article qui donne à réfléchir sur l'estimation d'un projet/d'une tâche et comment traduire cela dans un intervalle d'incertitude.
Sowftware Estimation

jeudi 10 avril 2008

Créer une référence JNDI sur une BasiDataSource









      InitialContext ic = new InitialContext();
      // Construct BasicDataSource reference
      Reference ref = new Reference("javax.sql.DataSource",
          "org.apache.commons.dbcp.BasicDataSourceFactory"null);
      ref.add(new StringRefAddr("driverClassName""org.postgresql.Driver"));
      ref.add(new StringRefAddr("url",
          "jdbc:postgresql://localhost:5432/postgres"));
      ref.add(new StringRefAddr("username""postgres"));
      ref.add(new StringRefAddr("password""postgres"));
      ref.add(new StringRefAddr("maxActive""4"));
      ref.add(new StringRefAddr("maxWait""5000"));
      ref.add(new StringRefAddr("removeAbandoned""true"));
      ref.add(new StringRefAddr("removeAbandonedTimeout""5000"));
      ic.rebind("jdbc/Silverpeas", ref);



Java2html


mardi 1 avril 2008

Comment vendre la qualité à son responsable

Une petite vidéo intéressante où l'on donne des trucs et astuces pour faire accepter à sa direction de prendre en compte la qualité :

mercredi 12 mars 2008

Mock mock mock

Comment tester une application J2EE 1.3 (et oui :-(( ) hors conteneur. Heureusement que l'on trouve pas mal de projets sympathiques sur le web :


  • Je conseille fortement Mock Javamail pour tester l'envoi et la réception de mail, il est très très simple d'utilisation et facilite grandement la vie.

  • L'implémentation FileSystem de JNDI permet d'avoir un espace de nommage très facilement.

  • Enfin pour la partie plus J2EE j'ai utilisé Mockrunner même si les factories ne sont pas compatibles JNDI et qu'il faille ajouter une instance d'ObjectFactory.
    Sans oublié les classes de tests de base que fournit Spring et qui sont un plaisir notamment pour les DAOs).


Si on couple tout cela à EasyMock on est capable de faire du TDD correctement.