Thursday, December 10, 2009

30 Eclipse plugins

As I was surfing on eclipse.org, I found this link which contains a selection a plugins. I've already tried someone which are very interesting. So, do like me : enhance your Eclipse!

http://www.ajaxline.com/best-eclipse-plugins

Saturday, October 24, 2009

A script I found to install Flash on Ubuntu 9.10 64bits

#!/bin/bash
# Script created by
# Romeo-Adrian Cioaba romeo.cioaba@spotonearth.com
# Super minor updates by jason.melton[at]gmail[dot]com
# Updates by Alejandro Cuervo 3[at]cuervo[dot]net
# more very minor updates by damien[at]groovey[dot]com
# Released under GPL

echo "Closing Firefox"
sudo killall -9 firefox

echo "Downloading and instaling Getlibs for required libraries"
wget http://www.boundlesssupremacy.com/Cappy/getlibs/getlibs-all.deb
sudo dpkg -i getlibs-all.deb

echo "Removing previous installs of flash:"
sudo apt-get remove -y --purge flashplugin-nonfree gnash gnash-common mozilla-plugin-gnash swfdec-mozilla libflashsupport nspluginwrapper
sudo rm -f /usr/lib/mozilla/plugins/*flash*
sudo rm -f ~/.mozilla/plugins/*flash*
sudo rm -f /usr/lib/firefox/plugins/*flash*
sudo rm -f /usr/lib/firefox-addons/plugins/*flash*
sudo rm -rfd /usr/lib/nspluginwrapper

echo "Installing ia32-libs and nspluginwrapper"
sudo apt-get install ia32-libs nspluginwrapper

echo "Getting libs"
sudo getlibs -p libcurl3
sudo getlibs -p libnss3-1d
sudo getlibs -p libnspr4-0d

echo "Installing Flash Player 10"
cd ~
wget http://fpdownload.macromedia.com/get/flashplayer/current/install_flash_player_10_linux.tar.gz
tar zxvf install_flash_player_10_linux.tar.gz
sudo mv libflashplayer.so /usr/lib/mozilla/plugins/
sudo nspluginwrapper -i /usr/lib/mozilla/plugins/libflashplayer.so

echo "Linking the libraries so that firefox can see them."
sudo ln -sf /usr/lib/nspluginwrapper/plugins/npwrapper.libflashplayer.so /usr/lib/mozilla/plugins/
sudo ln -sf /usr/lib/nspluginwrapper/plugins/npwrapper.libflashplayer.so /usr/lib/firefox-addons/plugins/

echo "Done :-)"
echo "You may re-start Firefox now"

Tuesday, October 20, 2009

Functional Programming For The Rest of Us

Today, Marco gave me a link to a post made to understand what is functional programming (you know that Microsoft F# is arriving?) :


Thanks Marco!

Friday, October 02, 2009

I realized I was a "ScrumButt" Master

I've just finished the two days long training session to be a Scrum Master. These two days were lead by Jeff Sutherland (in collaboration with Xebia France) . Of course, don't imagine that you will be great a Scrum Master at the end of the session. As Jeff said, were you a good driver just after obtaining youri driving license?

In this post, I will try to summarize notes I took during the course. It's not exhaustive but it wil give you a global idea of what is Scrum and what should do a Scrum Master.

But, before starting, let's return to the title of this post : "I realized I was a ScrumButt Master". Humm... what's that? Jeff said something very interesting . He asked people about who had already tried Scrum. Many ones in the assistance raised their hand. So, why were they here? ... Ok, let's do another test : can you give me the average velocity of your team? Only two answers iin allt the room. And that's why I was here. As many people, I tried Scrum but not entirely. This is commonly called "ScrumButt" (don't ask me about the two "t", I don't know). And that's why I failed my first Scrum project. Without using all concepts, it smells Scrum, it has got the color of Scrum but it's not Scrum. You see?

Sorry for non-french people, I will continue this article in my mother tongue (which is definitely not Java!).

Après nous avoir demandé de présenter notre voisin, Jeff a fait un rapide sondage histoire de savoir qui travaillait déjà en Scrum (ou, en tout cas, qui avait l'impression d'en faire comme je l'ai dit plus haut...). Il a ensuite reventilé les tables pour avoir des groupes homogènes. C'est un des principes de Scrum : l'équipe ne doit pas comporter de personne qui se démarque. Jeff entend gagner en productivité avec une équipe moyenne.


Scrum, c'est quoi?

Première étape de la formation : présentation du « framework » Scrum. Signalons le tout de suite : pour Jeff, Scrum n'est pas une méthode mais plutôt un cadre de travail pour gagner en performance. Bizarre tout de même, j'ai beau faire le tour de la question, ça ressemble pas mal à de la méthode tout ça. Enfin, on ne va pas chipoter sur les mots. Bref, voici un condensé de ce fameux « framework » :


Les acteurs :

  • Le Product Owner. En bon français, c'est le chef produit. Enfin... c'est celui qui veut faire faire quelque chose et qui sait ce que ce quelque chose doit faire.

  • Le Scrum Master. Il anime l'équipe. Il est là pour s'assurer que tous les membres travaillent vers le même objectif. Ce n'est donc pas un « chef » d'équipe dans le sens hiérarchique mais un animateur. Cela peut vous choquer mais c'est dingue le nombre de CdP que j'ai croisés dans ma vie professionnelle qui se prenaient pour des petits chefs... Pourtant, même armé de son diagramme de Gantt, le chef de projet n'est-il pas avant tout au service de son équipe? Et Scrum est assez clair sur le sujet car l'équipe est autogérée.

  • Le reste de l'équipe projet. Je dit bien « le reste » parce que le Scrum Master en fait partie. Typiquement dans le cadre d'un projet de développement, il développe 50% de son temps. Il est donc pleinement impliqué et ne se contente pas de poser des jalons et de vérifier qu'ils sont respectés! D'autre part, l'équipe (Scrum Master inclut donc) a un rendement optimal si elle est composée de 5 à 7 membres. Au delà, cette productivité s'effondre. Et le mythe du mois-homme dans tout ça? Où il est le bébé fait en un mois par neuf femmes???

  • Accessoirement, Jeff a insisté sur la nécessité d'avoir un recours à un DBA dans les projets de développement. Il a aussi rappelé qu'un bon architecte est un architecte qui code! Et oui, il doit montrer à l'équipe que ce qu'il a conçu tient la route.


Comment est découpé le projet dans le temps :

  • Le Sprint. Tout Scrum tourne autour de ça. Un sprint est une unité de découpage temporel du projet avant lequel tout le monde se met d'accord sur ce qui va être fait, pendant lequel l'équi et à la fin duquel l'équipe remet au Product Owner un livrable. Un projet Scrum est composé d'une succession de Sprints. Là, vous devez commencer à sentir la différence avec du projet ordinaire ; Scrum impose de livrer tout au long du projet et non pas à la fin. Dans la pratique, on fait souvent des Sprints de deux semaines. Mais tout est possible. Pendant la formation, Jeff nous a fait faire des Sprints de 3 minutes!

  • Le Planning Meeting. Cette réunion se fait avec toute l'équipe projet + le Product Owner. L'objectif est de savoir ce que l'équipe va devoir réaliser pour le Sprint à venir.

  • La Démo : A chaque fin de Sprint, l'équipe doit montrer au Product Owner ce qu'elle a réalisé. Seules les tâches totalement terminées font partie de la démo. La notion de « terminé » est vraiment importante. Par principe, on ne retravaille pas sur ce qui a été livré dans un Sprint précédent donc, autant bien soigner son code dès le début. Rework is Baaaaad. M...kay....

  • La Retrospective. Petit test : cela fait combien de temps que vous n'avez pas fait de débriefing après un projet? Humm... vous aussi... Et bien en Scrum, on le fait tout le temps! Bref, après la démo, l'équipe fait un point sur ce qui s'est bien ou mal passé histoire de pouvoir s'améliorer au prochain Sprint.

  • Le Daily Meeting ou « Stand-up meeting » ou « appelez le comme vous voulez du moment que cela ne dépasse pas 15 minutes ». Ce point équipe quotidien permet à chaque membre de décrire ce qu'il a fait la veille et ce qu'il compte faire aujourd'hui. Généralement, ces micros réunions se font debout (ça évite que les participants « s'installent » dans la réunion).


Les outils du Scrummer :

  • Un paquet de Post-It (on ne rigole pas) pour rédiger les « User Stories ». Les User Stories sont les fonctionnalités attendues. Habituellement, chaque « User Story » est donc notée sur un Post-It collé au mur. Jeff a insisté : pas d'Excel! Chaque fiche comprend :

    • L'objectif recherché (le « ça doit faire quoi »)

    • Le « How to demo ». Comment tester que cela fonctionne. OBLIGATOIRE! Une fonctionnalité non testable est une fonctionnalité non livrable!

    • Un chiffre pour indiquer sa priorité par rapport aux autres fonctionnalités. C'est la « Business Value ». Pensez toujours à ce qui va rapporter le plus de valeur à votre business!

    • Un nombre de points indiquant sa charge de réalisation (Courez tout de suite lire la section sur le planning poker pour découvrir illico comment on la calcule, vous ne serez pas déçu). Ces points s'appellent des Sprint Points. Au fait, vous avez vu? On ne compte pas en temps comme d'habitude mais de Sprint Points. On verra plus tard comment estimer en temps la valeur d'un Sprint Point.

    Afin de toujours s'assurer qu'une User Story est pertinente, Jeff nous a donné l'acronyme INVEST. Ainsi, une User Story doit être :

    • Independant

    • Negotiate

    • Valuable

    • Estimable

    • Small

    • Testable

  • Un bout de mur pour coller les Post-Its. L'espace de collage est découpé en zones bien distinctes pour y accueillir :

    • Le Product Backlog : il comprend l'ensemble des User Stories du projet. Il est créé par le Product Owner qui les priorise en fonction de leur « Business Value ». L'idée sera bien sûr de réaliser en premier les fiches apportant le plus de valeur métier tout en tenant compte bien sûr de leur complexité de réalisation.

    • Le Sprint Backlog. En bon français, c'est quoi qu'est ce qu'on va livrer à la fin du Sprint :) Lors de la réunion de planificaction du Sprint, on pioche dans les Post-Its du Product Backlog.

  • Un tableau ou un paperboard pour y tracer le BurnDown Chart. C'est un outil très puissant et très simple à réaliser. Il permet de suivre le « reste à faire » du projet et de voir si l'équipe se porte bien. Prenez votre Product Backlog et faites le total des Sprint Points des User Stories. Reportez le sur votre graphique en ordonnées. En abscisse, mettez les Sprints. A chaque fin de Sprint, recalculez de nombre de points restants à faire et reportez le sur le graphique. Et ainsi de suite... Vous avez votre BurnDown Chart. Comment l''interprêter? Si votre courbe est linéaire, c'est que l'équipe travaille de façon homogène. Vous pouvez en plus avoir une idée précise de la date de fin de projet. Si la courbe fléchit, oh la la alerte rouge... il passer en Emergency Sprint Procedure

Les indicateurs du projet :

  • La vélocité de l'équipe. C'est sa capacité à produire. En outre, c'est le nombre de Spring Points qu'elle est capable de réaliser en un Sprint. Donc, plus vous connaissez votre équipe, plus vous savez combien de points elle peut réaliser en comparaison avec les Sprints précédents. On appelle ça le « yesterday's weather ». Par conséquent, évitez de faire rentrer/sortir des ressources en cours de projet; ça casse toute l'estimation de vélocité. Je vous ai préparé une petite section sur « Comment calculer la vélocité de son équipe » plus loin.

  • Le BurnDown Chart. Je ne reviens pas dessus. Ce graph synthétise pas mal de choses : le reste à faire, le durée du projet, l'état de santé de l'équipe, etc...

  • Le « Rework ». Sur l'un des BurnDown Charts que Jeff nous a présenté, il a fait apparaître le coût du code non conforme qui doit être repris. Cela permet de conserver un oeil sur la qualité des Sprints précédents. En principe, le « rework » doit rester faible car l'une des règles d'or de Scrum est de ne pas négocier sur la qualité. Négligence de la qualité = rework. Rework = surcoût.

  • Le stress de l'équipe. Et oui, il faut y penser. Jeff nous a conseillé de ne pas charger à plus de 70% de leur capacité les membres de l'équipe et à veiller à ce qu'ils ne fassent pas trop d'heures. En effet, stress ou fatique = rework. Rework = surcoût, etc..., etc...


Enfin, j'en ai fini pour la présentation générale du « framework » Scrum. Place au jeu à préssent.


Le planning Poker

C'est l'un des temps forts pour moi de cette formation. L'objectif est d'estimer la réalisation de chaque User Story. Seule l'équipe joue; pas le Product Owner. Première étape, distribution des cartes. Chaque joueur a en main une série de carte dont les chiffres sont une adaptation libre de la suite de Fibonacci. On place une User Story au milieu de la table. Chacun met une carte indiquant son estimation de charge. On retourne toutes les cartes et on compare les résultats. Si il y a moins de 3 points d'écart entre les cartes, la charge de la User Story sera la moyenne de toutes les cartes. Si il y a plus de 3 points d'écart, c'est que l'objectif de la User Story n'est pas compris par toute l'équipe. Dans ce cas, on en discute puis on revote. Et ainsi de suite.... Cela peut paraître étrange mais c'est terriblement efficace.

A la fin de notre exercice, toute la table était d'accord sur le chiffrage et sur ce qu'elle allait faire. Le planning Poker est un bel exemple de travail d'équipe. J'ai beaucoup apprécié.


Calculer la valeur d'un Sprint Point en jours,

heures, minutes, secondes...

Ah, c'est bien beau de faire du poker et de distribuer des Sprint Points mais il y a bien un moment où il va falloir convertir tout ça en temps; notamment pour savoir combien de Sprint Points vous allez pouvoir espérer réaliser pendant un Sprint. Voilà ce que nous a appris Jeff sur le sujet :

Prenez votre plus petite User Story (celle qui est estimée à 1) et découpez la en tâches toutes petites. Toute l'équipe estime alors en temps la charge pour réaliser toutes ces « pitites » tâches. Faites la somme de tout ça et Bingo! Vous avez la valeur d'un Sprint Point.

Je ne vous cache pas que je suis un peu sceptique sur la méthode de calcul. Prendre le plus petit pour l'extrapoler au plus grand... Bon, de toute façon, comme je ne sais pas comment faire autrement, je vais m'en tenir à cela pour le moment.


Calculer la vélocité de l'équipe

Pour rappel, la vélocité de l'équipe est le nombre de Sprint Points qu'elle peut réaliser dans un Sprint. Ca peut paraître bête à rappeler mais la vélocité peut changer d'un Sprint à l'autre. Pourquoi? Tout simplement en fonction des congés ou indisponibilité des uns et des autres.

Bon, commençons simplement. Dès lors qu'on connait la durée d'un Sprint, la taille de l'équipe et la valeur en temps d'un Sprint Point, le calcul le plus simple est le suivant :

Vélocité brute de fonderie = nombre de jours-homme sur le Sprint / valeur en temps d'un Sprint Point

Jusque là, tout va bien. Maintenant, Jeff nous a précisé que le Scrum Master ne doit pas être considéré comme développant à plus de 50%. Donc, pour une équipe de 5 personnes, seuls 4,5 sont prix en compte.

Nombre de JH corrigé = durée du Sprint x (nombre de personnes dans l'équipe - 0.5)

Ensuite, il a rajouté deux choses : soit le ScrumMaster connait l'équipe est dans ce cas, il en connait déjà sa vélocité (le « yesterday's weather » comme on dit dans l'métier...), soit l'équipe est nouvelle et, dans ce cas, on applique des ratios de facto.


Cas 1 : l'équipe est nouvelle

Jeff nous propose d'appliquer deux ratios simples. Pour le premier Sprint, on plafonne la vélocité à 60% de sa valeur théorique. Pour le second, on passe à 70% et dès le troisième, on est à 100%.

Vélocité théorique = nombre de JH corrigé / valeur en temps d'un Sprint Point

Vélocité Sprint 1 = velocité théorique - 40%

Vélocité Sprint 2 = vélocité théorique - 30%

Vélocité dès le Sprint 3 = vélocité théorique

Exemple : une équipe de 5 personnes sur des sprints de 2 semaines. La valeur d'1 point est de 1,5 jours. Je pense ne charger le ScrumMaster qu'à 50%.

Vélocité théorique = 4,5 x 5 x 2 / 1,5 = 30

Vélocité Sprint 1 = 30 - 40% = 18

Vélocité Sprint 2 = 30 - 30% = 21

Vélocité dès le Sprint 3 = vélocité théorique = 30


Cas 2 : l'équipe a de la bouteille (yesterday's weather)

Dans le cas d'une équipe dont la vélocité est connue, il suffit d'appliquer une règle de 3 pour calculer la vélocité du Sprint à venir en fonction du nombre de jours-homme travaillés. Et voilà que j'introduit un nouveau terme : le Focus Factor.


Focus Factor = vélocité précédente / nombre de JH réalisés

Vélocité prochain Sprint = nombre de JH prochain Sprint x Focus Factor


Exemple : Reprenons l'équipe de 5 personnes précédente. Le nombre de points réalisés dans le Sprint précédent où les semaines étaient complètes est de 30. Imaginons maintenant que, dans le Sprint à venir, il y a un jour férié. Le nombre de jours-homme à venir sera de 4,5 x 5 + 4,5 x 4 = 40,5. Si pour 45 jours-homme, la vélocité était de 30, alors pour 40,5, elle sera de 40,5 x 30 / 45 = 27.


Enfin, tout ça n'est jamais qu'une règle de 3.... Scrum reste avant tout du bon sens avec un peu de bling-bling dessus.


Que faire quand le projet dérape ?

C'est une question qui est revenue souvent pendant les deux jours de formation. A cette question, Jeff propose de faire les choses suivantes (dans l'ordre) :

  1. Trouver ce qui ne va pas. Pour cela, Jeff nous a fait travailler sur le « Toyota A3 Process ». Dans la pratique, l'exercice qu'il nous a demandé consiste à mettre à plat un problème sur une feuille A3 organisée en zones bien distinctes. Chaque zone permet d'aller peu plus loin dans la résolution du problème. Une autre technique est celle du « 5 whys ». En gros, une personne expose ce qui ne va pas et on lui demande « pourquoi » jusqu'à temps qu'elle remonte à la source du problème. Quoi qu'il en soit, je crois que Jeff a bien été clair : en Scrum , pour être efficace, il faut éliminer tous les obstacles (quitte à aller au conflit!). « Remove impediments, remove impediments, remove impediments! »

  2. Trouver quelqu'un pour tester.

  3. Retirer la User Story du Sprint

  4. Si aucune solution ci dessus n'est satisfaisante, annuler le Sprint!

Parmi les questions posées par Jeff, il y a eu la suivante : que faire si le Product Owner ne vient jamais au réunions? Réponse : trouver un autre Product Owner. Sachez aussi qu'il peut se faire représenter par un tiers (appelé « proxy »).

Autre question concernant le Product Owner : que faire si plusieurs Product Owners travaillent sur le projet? (C'est en effet parfois nécessaire lorqu'un Product Owner seul n'est pas suffisant pour fournir assez de matière à l'équipe de développement). Dans ce cas, il faut impérativement un Chief Product Owner neutre pour éviter les conflits d'intérêt.

Que faire si l'équipe fait plus de 10% de support? Avouez que ça vous en bouche un coin ça. Contrairement au Waterfall, Scrum intègre directement les élements perturbateurs de la vraie vie tels que le support. Et Jeff a été assez clair sur le sujet. Il dit : dans la pratique, il faut considérer que l'équipe ne travaille réellement qu'à 50% sur le projet. Dans ces 50%, il y a 30% de « new », 10% de « old » (maintenance) et 10% de support. Si les 10% de maintenance ou de support sont dépassés, le Sprint doit être annulé, les problèmes consignés dans une liste des points bloquants (« impediments list ») et le Sprint doit être replanifié.

Que faire si, dans l'équipe, un membre travaille énormément, refuse de venir aux réunions sous prétexte qu'il fait déjà les ¾ du projet à lui tout seul? Réponse : le sortir de l'équipe. Scrum s'appuie sur la notion d'équipe. Si quelqu'un ne joue pas le jeu, il pénalise l'équipe et réduit sa vélocité. Même s'il est très bon!


Aidez votre Product Owner, il vous le rendra!

Le Product Owner est indispensable; alors, autant en prendre soin.

L'équipe de développement peut l'aider à préparer le Sprint suivant à hauteur de 10% de son temps. Pour que les Sprint s'enchainent, il faut bien de toute façon que le Product Backlog soit à jour. Ainsi, à la moitié du Sprint, commencez à aider votre Product Owner à préparer le Product Backlog pour le Sprint suivant.

Pour sa part, le Product Owner doit vous assister en particulier sur la première moitié du Sprint pour comprendre dans le détail les User Stories.

N'oubliez pas qu'une User Story « gros grain » peut être découpée en plus petites User Stories du moment qu'elle n'est pas dans le Sprint Backlog en cours. Cela peut notamment permettre de boucher les trous lorsqu'il reste de la place dans le Sprint Backlog en réunion de planification.

Pour rappel : le Product Owner n'a pas le droit de modifier les User Stories du Sprint Backlog! Paroles de Jeff. En revanche, il peut changer une User Story non réalisée du Product Backlog par une autre de poids équivalent (nombre de Spring Points). C'est le concept « change for free » de Scrum.


Mise en pratique : le XP Game

Ces deux jours de formation se sont terminés par un XP Game; histoire de mettre en pratique un peu de ce qu'on avait vu jusque là. Le jeu était assez amusant. Pour commencer, il a fallu estimer tout un tas de tâches à réaliser (gonfler des ballons, faire des chapeaux en papier, des châteaux de cartes, etc...). Ensuite, nous avons fait nos réunions de planification pour déterminer ce qu'on allait mettre dans chaque Sprint à venir de façon à obtenir une « Business Value » maximale. en un temps restreint Puis, place au Sprint, suivi des demos et retrospective. Le tout avec un zeste de concurrence car Jeff comptabilise les Business Points obtenus pour chaque équipe. Autant dire qu'on s'est bien lâchés. A la fin, il y avait des ballons partout au sol et surtout la preuve par l'exemple que toute la théorie Scrum fonctionne. Et oui, on a tenu la vélocité calculée et nos estimations étaient juste. Par dessus tout, j'ai vraiment eu le sentiment de travailler en équipe dans un objectif commun. C'est probablement un point fort de Scrum : ramener l'esprit d'équipe en entreprise.


Pour conclure

Une très bonne formation même si j'ai senti qu'elle avait du mal à décoller la première demie journée. Au final, je crois que tout le monde aurait bien voulu repartir avec Jeff dans sa valise. Pour preuve, les deux jours se sont terminés par une séance photo avec la star de Scrum. Alors que conclure si ce n'est vous conseiller de suivre cette formation...

Thanks a lot Jeff.


Pour aller plus loin :

http://www.infoq.com/resource/news/2007/06/scrum-xp-book/en/resources/ScrumAndXpFromTheTrenches_French.pdf



Thursday, September 24, 2009

Use exotic Maven repositories with your local mirror

This is a little tip you must know if you have an "in-house" maven repository mirros (such as Artifactory) and if you want to access to an exotic one.

What's an exotic repository? My definition of that is a repository hosted by a developer isolated somewhere on the web. Of course, it's not a mirror of the official one. By the way, you should not declare it on you "in-house" mirror but simply write the following lines in your pom.xml :

<repositories>
<repository>
<id>violet.repo</id>
<name>Violet's Maven repository (public access)</name>
<url>http://violet.sourceforge.net/maven2/repo/</url>
</repository>
</repositories>



Now, imagine you try to retrieve an artefact. Muupp... error! You miss to declare an exclusion in your settings.xml to inform Maven that it should not use your local mirror to get it. Thus, this is an example of what to do :

<mirrors>
<mirror>
<id>artifactory</id>
<mirrorof>*,!violet,!wicketstuff,!google</mirrorof>
<url>http://localserver:8080/artifactory/repo</url>
<name>Artifactory</name>
</mirror>
</mirrors>


You understood the "!" character? M...kay... That's all for today.

Want to trace network activity of your Microsoft Windows platform?

A good starting point is Fiddler :

http://www.fiddler2.com

Of course, it's free.

Sunday, September 20, 2009

Speed Up your FireFox on Linux

You can't imagine how Firefox loves to write temporary files. I realized it on my Acer Aspire One with its ugly 8GB SSD. An excellent tip I read on the web consists in mounting a directory in memory and configuring FF to use it.

Let's go :

sudo gedit /etc/fstab

Add the following line :

tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0

In Firefox, open this internal URL :

about:config

Right click to add a new string entry :

browser.cache.disk.parent_directory

Set its value to

/tmp

Reboot your machine and appreciate...

Of course, this tip is certainly portable on Microsoft Windows with softwares like RamDrive even if I presented it on Linux.

Thursday, September 10, 2009

Installing an Apache Tomcat cluster

I'm currently reviewing some scripts to install a Tomcat cluster. A nice way to do that is to have a common Tomcat installation and the minimum needed for each node. There's a an excellent introduction on the subject by Filip Kanik :

http://www.springsource.com/webinar/large-scale-tomcat-deployments

Then, you will find here an example of the run.sh file introduced by Filip :

http://sirinsevinc.wordpress.com/2009/07/20/deploying-multiple-tomcat-instances/

Monday, July 27, 2009

Where is my Tomcat Adapter for WTP in Eclipse 3.5 (Galileo) ?

I downloaded Galileo a few days ago. But, when I tried to test my webapp on my favourite Tomcat, I discovered that it missed the corresponding adapter. Wooo... After some searches (thanks to Google), I found the easiest way to install it and (by the way) all the other adapters. From the WTP update site (http://download.eclipse.org/webtools/updates/), select and install JST Server Adapters.

That's all!

Tuesday, June 30, 2009

Move a project from an SVN repository to another one

Today, I need to move a project from a first subversion repository to a second one. To do that, you need to have an access to your SVN server.

So, we will use the following commands :
  • svnadmin dump to backup the repositories (I insist on 'repositories'. I think it's important to have backups of all repos before doing such operations)
  • svndumpfilter to reduce the backup scope to a single project because the dump can only be done on the entire SVN repository
  • svnadmin load (I think you can guess what this wonderful command does)
To understand this commands, it's important to know that svnadmin uses standard inputs and outputs. Thus, we can combine commands with pipes.


Let's save our project (with all its history, tags, branches...)

svnadmin dump /home/subversion/svn/repo/ | svndumpfilter include myproject > svn.myproject.dump

Now, let's backup our target repository :

svnadmin dump /home/subversion/svn/new_repo/ > svn.new_repo.dump

And let's import the project on this target repository :

cat svn.myproject.dump | svnadmin load /home/subversion/svn/new_repo/

Important note : when you use svndumpfilter, the keyword you give to the filter is only a prefix. That's very important because if you have similar project names, you must excluse the ones you don't want like that :

cat svn.myproject.dump | svndumpfilter exclude myproject2 > svn.myprojectonly.dump

Wow, that's all!

Wednesday, June 17, 2009

Modify your host networking interface with Virtual Box OSE 2.0.4

In the previous post, I talked about how to start a Windows XP image downloaded from Microsoft to be able to test your web application with Internet Explorer.

On Ubuntu 8.04 and Virtual Box OSE (Open Source Edition) 2.0.4, there are some fixes to do before being able to work with the hosted mode network interface.

I took the following instructions from the french Ubuntu forum (http://forum.ubuntu-fr.org/viewtopic.php?id=217680).

1) install bridge-utils and uml-utilities (sudo apt-get)
2) add the vboxusers usergroup to your user :

$ sudo usermod -a -G vboxusers

3) Create a bridge by modifying you /etc/network/interfaces file

For DHCP conf

$ sudo gedit /etc/network/interfaces
auto eth0
iface eth0 inet manual

auto breth0
iface breth0 inet dhcp
bridge_ports eth0

# The loopback network interface
auto lo
iface lo inet loopback

For static IP conf

$ sudo gedit /etc/network/interfaces
auto eth0
iface eth0 inet manual

auto breth0
iface breth0 inet static
bridge_ports eth0
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1

# The loopback network interface
auto lo
iface lo inet loopback

Note that your dns should be declared in the /etc/resolv.conf file.

4) Add your virual interfaces toAjouter vos interfaces virtuelles dans le fichier : /etc/vbox/interfaces

$ sudo gedit /etc/vbox/interfaces
# Each line should be of the format :
# []
vbox0 breth0
vbox1 breth0
vbox2 breth0

5) Reboot (startup is longer due to this new interfaces)

6) Open your virtual box settings. Go to network pârameters, Select host interface and declare the following parameters :

Interface Name : vbox0
Setup Application : /etc/network/if-pre-up.d/virtualbox-ose
Terminate Application : /etc/network/if-post-down.d/virtualbox-ose

Internet Explorer free under Ubuntu Linux with VirtualBox

This is a title I found on a blog (http://www.railsgeek.com/). You all know this kind of crisis when delivering a web application developed on your favourite Linux with FireFox : your piece of software crashes on Internet Explorer. You also know how it's difficult to have a IE quickly running on your Ubuntu. Perhaps you tested IE4Linux but it's an old projet. Thanks to Microsoft (yes, I can say this), you have a solution from now.

1) Go to the Microsoft download website : http://www.microsoft.com/downloads
2) Enter 'vpc images' in the search text field
3) You will have an answer titled :

IE App Compat VHD
VPC Hard Disk Images for testing websites with different Internet Explorer versions on Windows XP and Windows Vista

4) Click on the link and download an image (I took IE7-XPSP3.exe)
5) Rename it with the rar extension (ie IE7-XPSP3.rar) and unrar it
6) Install VirtualBox with Synaptic. This excellent software is able to read Microsoft Virtual PC image disk (VHD)
7) The first time you start your Windows, you will probably have a blue screen on processr.sys. So, restart in safe mode with the command prompt.
8) Find and rename processr.sys

cd \WINDOWS\system32\drivers
ren processr.sys processr.old

9) Reboot and install the Virtual Guest Additions

Ultimate note : after guest additions installation, my VBox crashed and refused to restart due to a problem when accessing to the disk image. To fix this, I found the following solution which consists on converting de Virtual PC disk image to a VMWare one using QEMU like this :

qemu-img convert XP\ SP3\ with\ IE7\ 2009-Apr.vhd -O vmdk XPSP3.vmdk

Thursday, June 11, 2009

In love with my linux shell

Just a tiny link to a really interesting website which concentrate common and useful linux command lines :

http://www.commandlinefu.com

Thanks Marco for this URL!

Tuesday, June 02, 2009

An easy way to export java classpath on linux

Simple but powerful, you just need to be in your lib folder and type :

export CLASSPATH=$(pwd)/*

That's all!

Friday, April 10, 2009

Zenika Wicket Contest / Concours Wicket Zenika

It's exceptional but I wrote this post in french. It's about a contest which proposed to developed a tiny Apache Wicket project with another framework. I tried to implement it with SmartGWT.

Bon et bien voilà : je livre mon appli ZenContact migrée en GWT. Je vous préviens, je ne vais pas trop mâcher mes mots. L'objectif du concours est assez clair : refaire une petite appli de gestion de contacts réalisée à l'occasion d'une présentation Wicket au Paris JUG; le tout avec un petit défi en plus car cette présentation menée par Zenika n'a duré qu'une heure.

Bref, devant l'enthousiasme général, j'ai entrepris de la refaire en GWT. Et comme il fallait aller vite, j'ai choisi de m'appuyer sur des outils et API pour avoir le moins à coder possible. Je fixe rapidement la stack de travail : Eclipse 3.4, Maven 2, SmartGWT. Bon, c'est parti! New maven project -> template gwt. Je teste l'application générée par le plugin Maven. Jusque là tout est OK. Un bonheur.

Je n'ai jamais travaillé avec SmartGWT mais ça a l'air assez riche. Je garde toujours firefox en arrière plan avec la démo de l'API. Je copie-colle des bouts de code et en 3 heures j'ai mon formulaire, mon tableau éditable, le drag and drop, le date picker et tout le reste. Pas mal... Je décide d'arrêter là pour le premier jour.

Le code du tableau triable/editable avec drag and drop : impressionnant non?
contactGrid = new ListGrid();
contactGrid.setWidth(300);
contactGrid.setHeight(224);
contactGrid.setAlternateRecordStyles(true);
contactGrid.setShowAllRecords(true);
contactGrid.setCanReorderRecords(true);
contactGrid.setCanDragRecordsOut(true);
contactGrid.setDragDataAction(DragDataAction.COPY);
contactGrid.setDataSource(this.datasource);
contactGrid.setAutoFetchData(true);
contactGrid.setCanEdit(true);
contactGrid.setEditEvent(ListGridEditEvent.DOUBLECLICK);
contactGrid.setEditByCell(true);


Le lendemain, je passe à l'intégration des pages de l'application Wicket d'origine dont je reprends les 3 fichiers html. Premier problème : j'ai trois pages. Ca fait 3 modules GWT. Pour rappel, pour les petites applications GWT, tout se met dans un seul et même module. Tant pis, je conserve les pages; ça sera l'occasion de me lancer dans la communication entre modules, je ne l'ai jamais fait. Pour cela, j'opte pour une solution pipotesque qui consiste par passer par un cookie. En principe, tout doit rouler car j'ai repéré que SmartGWT travaille tout en JavascriptObject transformables en chaines JSON. Vous voyez où je veux en venir... Et c'est là que les ennuis commencent. Impossible de convertir simplement ma datasource. Je commence à chercher dans la documentation SmartGWT... ah, j'oubliais : il n'y en a pas en dehors de la démo! Je regarde donc du côté de l'API. Le moins que l'on puisse dire, c'est que ça ne manque pas de méthodes. C'est riche, très riche, tellement riche que je ne sais pas quoi en faire. Les petits tours dans le code source me refroidissent vite fait car SmartGWT utilise JSNI à outrance dans la mesure où il ne fait que du wrapping de javascript. Après quelques heures, je trouve la solution. Fin de l'épisode du jour.

Je laisse le projet de côté pendant quelques jours avant de m'y remettre pour le packager. Je reteste quand même vite fait avant. Et là : deuxième problème. Mon tableau n'affiche plus de données. Bizarre. Je m'arrache les cheveux à coup de debugger. Tout a l'air correct.... Je n'y comprends rien. Je recherche du côté de la démo de SmartGWT et me rends finalement compte d'une ligne récurrente dans pas mal d'exemples de code. Un « setAutoFetchData(true) ». Je teste mon code avec ça : bingo! Ca marche! Je réalise à présent qu'en plus d'être trop riche, SmartGWT n'est pas dans un état fini. Je m'imagine dans un contexte de production à chercher ce genre de bug... Bon,avec tout ça, je n'ai pas eu le temps de packager. J'arrête les frais pour aujourd'hui.

De retour sur le code, je redécouvre GWT (je n'en fait plus depuis quelques mois). Pour rappel, 1 module compilé = 1 emplacement pour les fichiers générés. Mais avec mes trois pages, ça ne va pas du tout. Par exemple, WelcomePage.html se retrouve dans tous les répertoires et, comme les liens entre les pages restent relatifs à chaque module, je ne peux pas passer d'un module à l'autre. Bref, je recherche comment faire sur le forum GWT et implémente une petite solution assez simple me permettant de ne travailler qu'avec un seul module.

Enfin, c'est fini! L'application n'est pas complètement bouclée mais je n'irai pas plus loin. Il est d'ailleurs temps d'écrire mes conclusions sur le projet.

Tout d'abord, j'ai été impressionné par les progrès d'intégration des développements GWT dans Eclipse. Cela est clairement dû à l'intégration Maven. Et oui, Maven, on peut dire ce qu'on veut dessus mais c'est tout de même l'esperanto de l'IDE.
Ensuite, j'ai été surpris par la rapidité de prise en main de SmartGWT. La démo est bien faite même si le code source montré n'est pas complet et qu'il faut vite télécharger la suite. Ce framework propose des fonctionnalités très poussées. C'est très agréable... au début seulement. Rapidement, on voit bien que l'API est trop riche. Ca part dans tout les sens. Elle n'est pas guidante et c'est dommage car le code produit au final est plutôt satisfaisant. Cela provoque une courbe de développement chaotique. Au premier bug, c'est l'explosion du temps de développement et la chute de cheveux assurée. Et par dessus cela, comme on est sous GWT, le temps de compilation est (très long) et chaque test devient un calvaire.

Alors, quid de la solution GWT par rapport à la version Wicket? Et bien vous l'aurez compris, je déconseille l'utilisation de SmartGWT pour le moment. L'API n'est pas mature. Elle a toutefois l'intérêt d'être très bling-bling pour les démos. Pour ce qui est de GWT, l'intérêt se situe sur son orientation « client centric ». Et oui, l'application dans sa version actuelle tourne sur un simple serveur Apache lorsque Wicket demande un Tomcat. Mais quelle lenteur ce compilateur Javascript/Java! Finalement, cette expérience confirme l'avis que m'était fait sur ces deux frameworks :
GWT est un excellent framework pour les applications à interactivité utilisateur forte. Ses capacités de manipulations des objets DOM et de gestion des évènements du navigateur sont excellentes.
Dans le cas d'une application de gestion classique, Wicket est un choix bien plus judicieux. L'utilisation des « Model », la gestion des conversations, le développement loin de javascript (qui est quand même un vrai langage de merde!), l'intégration Spring, l'internationalisation, le code source clair sont autant de points qui font du développement avec Wicket un vrai bonheur.

Pour finir en quelques mots : Wicket c'est une Renault. Ca marche plutôt bien au quotidien. GWT, c'est une Ferrari. C'est beau une Ferrari. La super éclate le week-end. Mais pour aller chercher le pain, ce n'est pas forcément le mieux.

Télécharger le projet compilé (à dézipper + trouver le WelcomePage.html) : zencontact_gwt.zip
Télécharger le code source : zencontact_gwt_src.zip

Wednesday, April 08, 2009

Why can I access to port 8080 only from localhost on Ubuntu?

To achieve the previous post, I had some problems today to access to my tomcat server from another machine. Ping OK but telnet 8080 KO... Humm, this smells firewall rules. Bingo! I didn't considered iptables as a firewall but it's one!

So, if you are in a secure network area, you can disable it temporarily with the following command :
sudo iptables -F
You can go further by reading this how-to page : https://help.ubuntu.com/community/IptablesHowTo

Tuesday, April 07, 2009

TCP Port 80 blocked on Ubuntu

While working on project, I had to bind my Tomcat to port 80 (instead of deploying an Apache and configuring its mod_jk). But, as you should know, Unix systems contains default security rules. Ports below 1024 are only allowed to the root user. Humm... it was time to work with iptables!

The following commands would show you how to add a rule to redirect request on port 80 to port 8080 and how to remove this rule.

Adding a rule :

sudo iptables -t nat -I OUTPUT --src 0/0 --dst [YOUR_IP_HERE] -p tcp --dport 80 -j REDIRECT --to-ports 8080

Saving it :

sudo iptables-save

Listing rules :

sudo iptables -t nat --line-numbers -n -L

This will show rules ordered by REDIRECT, PREROUTING, POSTROUTING and
OUTPUT. Each line start wil a number.

Deleting a rule :

sudo iptables -t nat -D [REDIRECT, PREROUTING, POSTROUTING or OUTPUT] number

Ex : sudo iptables -t nat -D OUTPUT 1

Friday, February 06, 2009

Why is agile software development like teenage sex?

Today, Romain Gauthier (OCTO Technology, for the moment) sent me a funny post on Agile development. I really like Agile methods but it's so funny that I had to paste it here :

Why is agile software development like teenage sex?
  • It's on everyone's mind all the time.
  • Everyone is talking about it all the time.
  • Everyone thinks everyone else is doing it.
  • Almost no one is really doing it.
The few who are doing it are:
  • doing it poorly
  • hopeful it will be better next time
  • not practicing it safely
Unfortunately, it sticks to reality... Bahhh, Romain, I hate you. You tried to shake me but I will continue to promote SCRUM.

Source : http://dnicolet1.tripod.com/agile/index.blog?entry_id=1877790

Tuesday, February 03, 2009

How your XML parser can detect encoding?

I've just fined a tiny article which describe how XML parsers detect document encoding. I hope you already know this but it always good to read it again. In a few words, parsers use the first document characters which are the same in all xml document and try different ways to read them and evaluate encoding.
http://www.xfront.com/specifying-encoding/index.html


Thursday, January 22, 2009

Maven best practices

Today, my friend Marco sent me a great blog entry on Maven best practices. In a few words, it says :

  1. Automate Snapshot Deployment by integrating your project in a CI system (like Hudson)
  2. Isolate Local Repositories using use -Dmaven.repo.local=xxxx option to define the unique local repositories for each build.
  3. Regularly Purge Local Repositories (mvn dependency:purge-local-repository)
  4. Enable Batch Mode with the -B option to reduce log size
  5. Enable Full Stack Traces (-e) when there's a build error
  6. Print Test Failures to Standard Output (in your settings.xml : true)
  7. Always check for Snapshots (-U option); useful when your project is split in modules and libraries. This ensures you always have the last dependency library release on your project.

Click here to see the full post : http://blogs.sonatype.com/people/2009/01/maven-continuous-integration-best-practices/

Thanks Marco!

Tuesday, January 06, 2009

Making Eclipse look better on Ubuntu

I started today to find the simplest way to make my Eclipse look better on Ubuntu. I've got a laptop (so, I'm used to work with an LCD screen). Here is my solution :

Step 1 : install the ttf-liberation package
Step 2 : open your system->preferences->apparence menu. Go to the font tab and change fonts like that :

Application/Document/Desktop font: Liberation Sans, size 9
Window title font: Liberation Sans Bold, size 10
Fixed with font: Liberation Mono, 10

Select the LCD screen optimization features (including in the User Details options).

That's all!