You are browsing the archive for 2010 May.

Cassandra au NoSql User Group

3:14 pm in Les Conférences by Claude Falguière

La soirée du 26 Mai du NoSql User Group à Paris était consacrée à Cassandra. C’était une soirée très attendue car elle avait été annulée pour cause de volcan islandais, puis déplacée pour cause de lundi de Pentecôte. Enfin voilà, finalement, une cinquantaine de personnes sont là pour entendre parler de Cassandra par un des membres du projet.

Cassandra est projet Open Source de l’Apache Sofware Foundation. C’est un système de gestion de base de données qui fait partie de la grande tribu des NoSql, et dans cette tribu il est un représentant de la famille Key-Value.

Key Value ? NoSql ? Si ces mots sont nouveaux pour vous, vous pouvez vous reporter à la présentation de NoSql que Tim Anglade, un des deux organisateurs du NoSql User Group à Paris, dans une soirée précédente.

La présentation sur Cassandra se trouve là. Elle aborde le modèle de données de Cassandra et une partie intéressante sur la distribution des données sur les différentes instances du cluster. Et Cassandra est écrit en Java, ce qui justifie qu’on en parle ici.

La soirée était intéressante pour la présentation elle même mais aussi pour les discussions qui ont suivi avec ceux qui mettent en oeuvre en ce moment des applications avec Cassandra ou d’autres types de base NoSql.

Si ce domaine vous intéresse vous pouvez suivre la mailing list du NoSql User Group. Il est animé par Olivier Mallasi d’Octo Technology et Tim Anglade.

Au Paris JUG de Juin, cheveux bleus == bière à volonté

5:08 pm in L'actualité by Claude Falguière

hollyCummins-h114Pour fêter la venue d’Holly Cummins, le Paris JUG a lancé un pari sur son blog.

Si vous venez avec les cheveux bleus (teintés ou pas mais sans perruque), le Paris JUG vous offre les bières à volonté lors de la 3ième mi-temps de la soirée de Juin.
Pour fêter ça, on a fait passer Duchess chez le coiffeur, et elle arbore maintenant une superbe chevelure bleu elle aussi.
duchessfr_bleu_grd

PSUG#1 La première du Scala User Group

5:15 pm in Les Conférences by Claude Falguière

LogoScalaLe Paris Scala User Group a fait sa première réunion le 18 mai.  50 personnes étaient inscrites et une bonne quarantaine étaient présentes parmi lesquelles quelques personnalités (Nicolas Martignole, Emmanuel Bernard, Sébastien Douche, Romain Maton par exemple). J’ai dignement représenté Duchess France dans cette première et j’espère que vous viendrez nombreuses (bon allez, nombreux aussi pour nos lecteurs) pour les suivantes.

Merci à Benoît Dissert pour m’avoir transmis ses notes que j’ai partiellement utilisées et à Alexi Agahi pour ses photos. Je remercie également les personnes qui ont posté des liens où des informations complémentaires sur la mailing list su PSUG.

Comme je connais très peu Scala, vous pouvez  lire cet article même si vous êtes débutants. Alexandre et les autres experts Scala n’hésitez pas à corriger ce qui serait faux.

Présentation du Groupe

PSUG-mai-1Le Paris Scala User Group a été créé par Alexis Agahi et Alexandre Bertails. Alexandre est bien connu par ici puisqu’il a déjà fait une présentation du W3C au JUG en mai.

Si vous êtes motivés pour vous investir dans une communauté, ce groupe cherche des volontaires.

Le Paris Scala User Group a une communauté Google Group sous le nom paris-scala-user-group. Il a à ce jour 85 membres et je vous recommande de rejoindre ce groupe si Scala vous intéresse.

Pour cette première, Xebia a prêté une salle de 50 places dans ses locaux et nous a offert une collation.

Le sujet du jour

Alexandre a voulu nous faire part de son retour d’expérience sur les projets qu’il réalise en Scala au W3C. Plusieurs projets de son équipe sont faits en Scala ou en Lift, en particulier le nouveau validateur CSS.

Le thème qu’il a choisi aujourd’hui est l’injection de dépendance en Scala. Comme il a un tout petit peu oublié de présenter le thème avant de rentrer dans le vif du sujet il a fait une présentation après coup et je reprend donc simplement l’”introduction” qu’il a fait sur la mailing list.

  • le premier message était au sujet des frameworks Java. Déjà, ils fonctionnent en Scala. Mais il faut comprendre les problèmes que ça amène, en particulier le fait que ça peut introduire beaucoup d’erreurs car on tombe en dehors du système de type. De plus, ils sont trop intrusifs : soient ils apparaissent dans le code (annotations), soit il faut utiliser des setters (Spring/XML)… En tout cas, on ne visualise pas les dépendances dans le code métier.
  • j’ai donc cherché à montrer comment les traits de langage de Scala, avec un peu de réflexion, peuvent être utilisés pour arriver à la même chose. Le but est de ne pas sacrifier le typage, de pouvoir se reposer sur la phase de check du compilateur et d’exprimer les dépendances par des types et non la documentation.
  • la profusion des méthodes montrait qu’il n’y a pas aujourd’hui de solution vraiment satisfaisante, ce que je n’ai jamais cherché à cacher, puisque je cherche encore pour mes besoins personnels une solution “opérationnelle” et élégante en terme de modélisation. Par exemple : garder la sémantique introduite par les self-reference pour parler des environnements/dépendances à injecter.

Pour ses examples de code, il s’est inspiré du code Scala d’un outil d’interface à leur DVCS (et oui on boucle un peu en ce moment, voir aussi les DVCS au JUG).   Même si leur choix s’est porté sur  Mercurial, le code ne dépend pas d’un DVCS en particulier …  jusqu’au moment où il faut tester.

L’exemple que nous avons étudié avec Alexandre  montre comment injecter les instances du DVCS et de l’environnement requis au moment du test soit en utilisation seulement les capacités de Scala et différents patterns, soit en utilisant Guice comme framework d’injection de dépendance.

L’environnement de développement et les outils

La session a été l’occasion de discussion intéressantes sur les outils.

Alexandre a écrit un tutorial sur l’installation sous Linux d’un environnement de développement Scala basé sur SBT (Simple Build Tool) et Emacs (ou vi).

Si vous n’êtes pas sous Linux, il faudra un peut vous débrouiller mais a priori tout ça  fonctionne aussi avec les versions portées. Il y a quelques billets de Xebia qui traitent aussi de l’installation d’environnement pour Scala

Comme il y avait beaucoup à dire sur les éditeurs de texte et SBT,  ils ont une section à part.

Scala

S’il faut vous rafraichir un peu la mémoire sur Scala, vous pouvez vous reporter aux présentations du JUG en avril. Le tutorial cité ci-dessus vous aidera à installer Scala.

ScalaTest

ScalaTest permet d’écrire les tests unitaires pour Scala.

Un test très basique pour vérifier que l’environnement fonctionne.

import org.scalatest.FunSuite

class Test extends FunSuite {
<div style="padding: 0px 20px 0px 20px">test("") {
<div style="padding: 0px 20px 0px 20px">assert(true)</div>
}</div>
}

Guice

Guice est un framework d’injection de dépendance léger. Même si ce framework est Java à la base, il peut être utilisé dans du code Scala.

Emacs et les IDE

Emacs est un éditeur de texte assez ancien sans support de la complétion par exemple.

Alors pourquoi Emacs ?

EmacsSnapshot Alexandre aime bien Emacs qui est l’éditeur de référence du W3C. Il dispose d’une intégration avec SBT qui permet par exemple de se positionner dans le code à partir des messages d’erreur. Ce qui manque surtout c’est une intégration avec l’outillage de test. Il y a également un  module de templating de code pour Emacs,  yasnippet, qui facilite l’écriture du code (vidéo de démo)

Il n’a pas été convaincu par les plugins Scala des IDE comme Eclipse. Le typage est statique en Scala mais l’inférence de type donne parfois des résultats surprenants et complexes à déterminer pour les plugins. Les plugins ne gèrent pas toujours bien.

Les choses vont changer avec Scala 2.8 et la possibilité pour les IDE de s’interfacer avec le moteur Scala pour échanger des informations et faire de la complétion intelligemment.

De nouveaux outils arrivent et en particulier ENSIME, un projet Google Summer of Code, qui va proposer un nouvel environnement Scala pour Emacs. La vidéo de démo est très impressionnante.

Des alternatives ?

D’autres personnes dans l’assistance utilisent Eclipse avec le plugin Scala et semblent en être contents. Vous pourrez trouver ici les plugins pour les différents IDE.

Francois Armand a également contribué sur la mailing list en fournissant des pointeurs pour utiliser Scala dans un environnement plus “familier”.

Il y a un plugin Scala pour eclipse, qui fonctionne de mieux en mieux (notez bien la tournure de la phrase). Il ne fonctionne qu’avec les dernière version de Scala (2.8), et il est dispo ici: http://www.scala-ide.org/

Il y a aussi un plugin Maven/Scala, dispo ici: http://scala-tools.org/mvnsites/maven-scala-plugin/

Et si tu veux vraiment télécharger plein de dépendances et faire du Scala-prêt-pour-l’entreprise, ca c’est le pom de base que j’utilise pour mes projets Scala: http://fanf42.blogspot.com/2010/05/maven2-bootstrap-pomxml-for-scala-with.html

SBT – Simple Build Tool

Simple Build Tool est un outil dont la fonctionnalité est équivalente à Maven : Il réalise les tâches nécessaires à la fabrication du produit (compilation, tests, etc) et gère les dépendances via Ivy.

Ivy est un gestionnaire de dépendances. Il permet de trouver la version de librairie requise et de la télécharger dans le projet ainsi que ses dépendances. Ivy comme Maven gère un cache local.

Pourquoi SBT ?

SBT est plus léger que Maven. Pour Scala il est préférable car il ne recompile pas tout à chaque fois contrairement à Maven.

C’est un outil qui prend de l’importance. Les nouveaux projets du W3C sont faits sur SBT et plusieurs projets Open Source sont passés à SBT.

Il est utilisé en Scala ici mais marche aussi pour Java, ainsi que pour utiliser des frameworks Scala tels que Lift.

sbt-tree-2SBT a repris les mêmes conventions que Maven. La structure du projet est à peu près la même. La gestion de dépendances est un peu plus souple et permet par exemple d’utiliser un zip comme repository.

Comment configurer le projet SBT ?

Contrairement à Maven qui est configuré via des fichiers XML, SBT est configuré
via un fichier de propriétés build.properties qui spécifie entre autre les versions à utiliser et via une classe Scala Project.scala qui décrit les dépendances du projet.

import sbt._
class Project(info: ProjectInfo) extends DefaultProject(info) {
<div style="padding: 0px 20px 0px 20px">val scalatools = "scala-tools" at "http://scala-tools.org/repo-snapshots"
val scalatest = "org.scalatest" % "scalatest" % "1.0.1-for-scala-2.8.0.Beta1-with-test-interfaces-0.3-SNAPSHOT" % "test-&gt;default"

val guice = "com.google.inject" % "guice" % "2.0"</div>}

Cette classe déclare deux dépendances avec ScalaTest, le framework de test unitaire, et Guice, le framework d’injection de dépendance.

La ligne val "scala-tools" at "http://scala-tools.org/repo-snapshots" est assez intéressante car elle montre la puissance de Scala pour faire des DSL.  Le at correspond à une méthode at. Mais une chaîne n’a pas de méthode at. Scala va chercher dans l’environnement, ici DefaultProject, une classe qui a une méthode at acceptant une chaîne et habiller la chaîne "scala-tools" pour en faire un instance de cette classe.
On trouve des constructions équivalentes pour l’utilisation des expressions régulières, par exemple "\(.*)@(.*)".r .

Cette technique basée sur les conversions implicites est décrite sous le nom de Pimp my library par Martin Odersky le créateur de Scala.

SBT utilise la version 2.7 de Scala par defaut dans sbt mais ont peut changer cette version dans build.properties

Comment utiliser SBT ?

SBT s’utilise en lançant la commande sbt qui ouvre un shell.

Les principales actions sont

  • reload : recharge les définitions du projet si elles ont changées
  • update : résout les dépendances et retrouve les bonnes librairies. Elles sont copiées dans le projet mais Ivy gère également un cache local
  • test : compile le code et les tests puis exécute les tests via une série de dépendances de tâches
  • test-only montest permet de relancer automatiquement le test à chaque fois que le fichier est sauvé
  • run : qui exécute une classe ou par défaut la seule classe avec un main

On peut aussi définir ses propres goals et builder plusieurs cibles en même temps.

Si on a compris quelque chose de cette soirée, même quand on n’a pas trop d’expérience de Scala, c’est qu’il faut s’intéresser à SBT. Même Nicolas Martignole ( Le Touilleur Express ) a fait une intervention favorable en constatant que SBT fait moins peur pour la maintenabilité du build que Gradle.

Dans le vif du sujet

PSUG-mai-2Bon là, ça se complique. Pour les gens qui ne connaissaient quasiment pas Scala, c’est allé très vite et comme les diverses stratégies d’implémentations n’étaient pas très bien balisées, on a été rapidement perdus.

Les prochaines sessions devraient être plus accessibles car il s’avère qu’il y a une forte proportion de gens sans expérience de Scala dans le groupe.

L’ensemble du code de la session est sur un repository Mercurial https://dvcs.spartacusse.org/hg/di-scala. Si vous n’avez pas de client Mercurial, le lien zip en haut de la page permet de tout récupérer en un gros zip ou vous pouvez aussi lire les fichiers.

L’exemple de départ

Dans tous les exemples, le code manipule un DVCSManager qui permet d’enregistrer une instance de DVCS (via save) et de la retrouver plus tard (via get).  Les tests utilisent une instance de type Mercurial (Hg) .

Un peu de décodage sur le code de Basic.scala

  • En Scala, les noms de fichiers ne sont pas liés au nom de classe ou de package
  • Le fichier n’a pas a avoir le même nom que la classe, il peut y avoir plusieurs classes dans le même fichier
  • Le nom de package n’a pas besoin de correspondre à l’arborescence de répertoire sur disque
  • Les imports peuvent apparaître n’importe où dans le fichier

Comme le code est destiné à une présentation, le test et le code sont dans le même fichier.

Les traits sont une sorte d’hybride entre des interfaces Java et des mixins.
Ils permettent de décrire le comportement que devra implémenter la classe mais aussi de fournir des implémentations de méthodes qui seront greffées dans le code de la classe qui implémente le trait. Il est ainsi possible d’hériter de comportement de plusieurs classes différentes.
Vous pouvez en apprendre plus avec ces deux ressources en anglais et en français.

La première partie décrit les entités du domaine sous la forme de traits.

trait Repository { val reponame:String }

Un trait très simple qui défini un repository générique et indique qu’il doit avoir un nom. Vous noterez que contrairement à Java le type suit le nom de la variable.

Un exemple un peu plus compliqué, le DVCSManager générique. L’implémentation réelle devra  fourir les 4 opérations listées en def.  def et val introduisent des membres du trait. La différence est que def permet la redéfinition alors que val ne le permet pas.

trait DVCSManager {
<div style="padding: 0px 10px 0px 10px">type T &lt;: Repository
def getAllRepositories():List[T]
def save(repo:T):Unit
def get(reponame:String):T
def apply(reponame:String):T</div>
}

Humm, un premier exemple de syntaxe bizarre Scala. type T &lt;: Repository défini que le  T qui apparait dans les signatures des opérations qui suivent. T doit être une instance d’un type T dérivé de Repository mais son type réel sera défini plus tard. Cela ressemble vaguement à un générique pour le moment, mais il y a une différence subtile. Le type T ici est une classe bien particulière dont le choix est reporté et non pas quelque chose qui implémente T qui pourrait être différent d’une opération à l’autre.

Un function object est un objet que l’on peut utiliser comme une fonction.
Pour en savoir plus sur les function objects

La méthode apply a une signification un peu particulière. Elle donne à DVCSManager la capacité d’être un function object. C’est ce qui permet d’écrire val repo = DVCSManager("test") dans le test. Le résultat sera d’initialiser le repository.

Le trait HgManager implémente le DVCSManager pour Mercurial.

trait HgManager extends DVCSManager {
<div style="padding: 0px 10px 0px 10px">self: LDAPEnv with ApacheEnv with HgEnv =&gt;
type T = HgRepository
val repos = scala.collection.mutable.Map[String, HgRepository]()
def getAllRepositories():List[HgRepository] = repos.valuesIterator.toList
def save(repo:HgRepository):Unit = { repos += (repo.reponame -&gt; repo) }
def get(reponame:String):HgRepository = repos(reponame)
def apply(reponame:String):HgRepository = new HgRepository(reponame, this)</div>
}

C’est ici que l’on va définir le type de T en écrivant type T = HgRepositor. La ligne self: LDAPEnv with ApacheEnv with HgEnv =&gt; pose comme pré-condition à la création de l’instance qu’il existe dans l’environnement de la classe des instances de LDAPEnv, ApacheEnv,HgEnv. On ne pourra pas créer d’instance utilisant ce trait si ça n’est pas le cas.

Vous noterez le this dans new HgRepository(reponame, this). C’est la dépendance dont Alexandre voudrait bien se débarrasser en utilisant l’injection de dépendances.
Le self permet une forme d’injection de dépendances avec en plus un contrôle plus fort sur le typage.

Pour finir avec le domaine, la classe qui implémente le repository Mercurial HgRepository. Il s’agit ici d’une véritable classe. case class la rend un peu plus Scala et apporte quelques facilités.

case class HgRepository(val reponame:String, env:LDAPEnv with ApacheEnv with HgEnv) extends Repository {
<div style="padding: 0px 10px 0px 10px">// do some stuff using the environment
println(env.hgrepodir.getAbsolutePath)</div>
}

Cette classe a un constructeur à plusieurs arguments donc le second est une instance qui mixe LDAPEnv, ApacheEnv et HgEnv. Dans la section précédente, on voit que c’est un HgManager qui est passé. Par la présence du self on peut être sûr qu’il satisfait ces critères.

Le test ne préjuge pas du type de repository. Ce type est définit dans l’environnement.

test("") {
<div style="padding: 0px 10px 0px 10px">val repo = DVCSManager("test")
DVCSManager.save(repo)
val persistedRepo = DVCSManager.get("test")
assert(repo === persistedRepo )</div>
}

Le === est équivalent à == en Java mais rend l’affichage de la comparaison plus lisible en indiquant aussi ce qui était attendu/reçu.

Diverses statégies ont été utilisées pour placer une instance de HgManager et des object “Env” dans l’environnement en limitant les dépendances.
La forme la plus évidente est val DVCSManager:DVCSManager = new HgManager with Env. Il s’agit d’un mixin entre le HgManager et un trait Env. A noter on ne peut mixer que des traits.

Env initialise les valeurs qui jusque là étaient seulement déclarées.

trait Env extends LDAPEnv with ApacheEnv with HgEnv {
<div style="padding: 0px 10px 0px 10px">val hgrepodir:File = new File("/hgrepodir")
val apachedir:File = new File("/apachedir")
val ldapurl:String = "http://..."
val ldapbinddn:String = "root"
val ldapbindpassword:String = "pwd"</div>
}

Self et lazy

Un premier essai de simplification a consisté à déplacer la création du HgManager dans Env comme on peut le voir dans BasicBis.scala. On pourrait dans ce cas se contenter de mixer Env avec le test.

BOUM !

En fait, ça ne marche pas. Une dépendance cyclique apparaît. Env déclare DVCSManager qui a son tour a besoin de Env.

Pour éliminer la dépendance cyclique, il faut utiliser des “lazy val” comme dans ScalaSelfRef. Mais ça introduit d’autres complications.

BOUM !

Cette fois ci il ne trouve pas d’instance de HgRepository dans l’environnement alors qu’elle semble y être. Le self déclare seulement des types mais ne fournit pas d’implémentation. Le new HgManager n’a pas d’existence tant que le méthode n’est pas portée par une instance. Même si le HgRepository semble créé par def apply(reponame:String):HgRepository = new HgRepository(reponame) with LDAPEnv with ApacheEnv with HgEnv, il faut quand même instancier explicitement le HgManager par val DVCSManager:DVCSManager = new HgManager with Env.

Cet exemple pas à pas montre qu’il n’est pas toujours évident de comprendre quel type seront inférés et si une instance convenable sera trouvée ou pas dans l’environnement.

Une constatation est que le modèle marche bien tant que l’on est dans des cas de figure simples avec des new partout. Mais les factories posent problème.

Cake pattern

Là j’ai été un peu larguée. N’ayant pas révisé le Cake Pattern à l’avance, je ne m’avancerai pas à retranscrire les débats dans le détail.

Vous pourrez trouver l’exemple de code dans CakePattern.scala
L’initialisation de l’environnement est maintenant à la charge du <code>ComponentRegistry</code>.

Un bon point de départ est l’article de Jonas Bonér sur les diverses techniques d’injection de dépendance. Il contient également la référence sur l’article initial de Martin Odersky, le créateur de Scala.

Le principe du Cake Pattern est de créer un composant qui encapsulent les environnement dont on a besoin. Tout ça fait une sorte de mille-feuille. Si on regarde, le code exemple chaque trait ou classe reçoit un composant qui l’englobe.

Ce modèle simplifie les choses pour celui qui utilise les composants car il n’a plus de besoin de mixins et peut se reposer sur le choix de celui qui a fait le composant.  Mais est lourd à implémenter pour celui qui fournit les composants.

ScalaDoc a beaucoup utilisé le Cake pattern et en est un peu revenu car c’est difficile à maintenir. Ce modèle a tendance a créer un objet qui fait tout avec des tas de fonctions externes autour.

Closure

Un autre modèle basé sur des closures à été évoqué. Il est décrit par Debashishg Gosh dans cet article.

L’exemple de code qui correspond est Closure.java.

La closure se trouve là

<div style="margin: 0px 10px 0px 10px;padding: 5px 10px 5px 10px;border:solid thin;border-color: grey">trait HgManager extends DVCSManager {
...
<div style="padding: 0px 10px 0px 10px">def apply(_reponame:String):HgRepository = new HgRepository {
<div style="padding: 0px 10px 0px 10px">val reponame:String = _reponame
lazy val env = self</div>
}</div>
}</div>

Le principe est plus proche de Java. On passe un objet avec des trous qu’on complètera plus tard.

Guice

Le code qui illustre l’utilisation de Guice est dans Guice.scala

Le code a été modifié pour s’intégrer à Guice et fini par ressembler beaucoup à un java.

class HgManager @Inject() () extends DVCSManager {
<div style="padding: 0px 10px 0px 10px">self: MixedEnv =&gt;
...
@Inject val hgRepoFactory:HgRepositoryFactory = null
def apply(reponame:String):HgRepository = hgRepoFactory.create(reponame)</div>
}

Guice est parfois un peu perdu car une classe Scala peut générer beaucoup de classe Java et Guice ne sait pas toujours laquelle utiliser.

Structural Typing

L’exemple utilisant le structural typing est dans StructuralTyping.scala

<div style="margin: 0px 10px 0px 10px;padding: 5px 10px 5px 10px;border:solid thin;border-color: grey">abstract class ToBeTested extends FunSuite {
<div style="padding: 0px 10px 0px 10px">self: { val DVCSManager:DVCSManager } =&gt;

test("") {
<div style="padding: 0px 10px 0px 10px">val repo = DVCSManager("test")
DVCSManager.save(repo)
val persistedRepo = DVCSManager.get("test")
assert(repo === persistedRepo)</div>
}</div>
}
class Test extends ToBeTested with Env</div>

Le structural typing est { val DVCSManager:DVCSManager } =&gt;. C’est une sorte de duck typing.
C’est un moyen d’éviter de créer un trait juste pour positionner cette valeur. Mais cette technique a pour inconvénient de reposer totalement sur la Reflection Java et pose des problèmes de performance.

Conclusion

Aucune des solutions n’est totalement satisfaisantes. Quelques méthodes à la Java fonctionnent bien mais perdent la simplicité d’écriture de Scala. Les solutions plus Scala fonctionnent dans les cas simples mais sont conçues pour faire des new sans utiliser de factory. Les comportements peuvent être différents en fonction de l’ordre d’initialisation.
Si on pousser trop loin l’injection de dépendance, ça devient compliqué

La spécification JSR330 sur l’injection de dépendance pourrait améliorer les choses en apportant le support de l’injection de dépendance directement dans la JVM.

Paris JUG de mai : Build, Share & Deploy jusqu’au bout de la nuit

8:59 pm in Les Conférences by Claude Falguière

Un retour sur la soirée Share, Build & Deploy en plusieurs articles car c’était un peu long pour tenir en un seul.

Ils sont datés un peu en désordre sur le site alors j’ai refait un article chapeau. Vous pourrez aussi naviguer entre les pages par les liens en bas des articles.

Paris JUG de mai : Build, Share & Deploy jusqu’au bout de la nuit (5)

3:40 pm in Les Conférences by Claude Falguière

Le tirage au sort de l'invitation Jazoon par Ellène

Le tirage au sort de l'invitation Jazoon par Ellène

Pendant la mise en place des speakers de Deployit, le tirage au sort pour l’invitation de developpez.com à Jazoon par  Ellène Dijoux. 5 personnes ont été sélectionnées. Le résultat définitif sera sur la liste Users du JUG.

Vous avez partagés vos fichiers, réalisé les livrables. Il reste maintenant une opération assez pénible : déployer sur les plates-formes où seront les utilisateurs, que ce soit en recette ou en production.

DeployIt : automatiser les déploiement d’application Java

Guillaume Bodet et Benoit Moussaud nous ont présenté Deployit de l’éditeur XebiaLabs. Une présentation plus calme mais toujours très professionnelle.

Ce progiciel commercial est le fruit d’une coopération KLM Air France et capitalise sur des années d’expérience du déploiement d’application Java sur tout types d’environnements.

Déployer c'est amener les éléments des boîtes de gauche dans les boîtes de droite

Déployer c'est amener les éléments des boîtes de gauche dans les boîtes de droite

Dans beaucoup de cas, il ne suffit pas de pousser un ear. Il faut transférer un ensemble de composants applicatifs pour que l’application fonctionne dans son environnement : des configuration de ressource JDBC, des providers de sécurité, des fichiers de configuration, des ressources statiques, des mises à jour pour les CDN (Content Delivery Network). La situation peut s’avérer véritablement complexe sur des plates-formes de production avec des clusters et des fermes de plusieurs machines.

Le produit est bâti sur moteur dans lequel on va déclarer toutes les opérations. Le produit est écrit en Java et déployé sous la forme d’une Web Application. L’IHM est réalisée en Flex, mais il existe aussi des modes de pilotage par ligne de commande et une intégration Maven et Eclipse.

Le moteur embarque des plugins, basés sur une API publique. Les opérations sur les middleware JEE sont fournis de base. Les plugins permettent d’intégrer des composants plus exotiques. Les plugins sont écrits en Java ou en Jython.

Cette API plugin  fait partie du modèle économique.  Le but est de construire une AppStore pour ces plugins et de permettre un partage de revenus pour les fournisseurs de plugins.

Les composants techniques

Le Configuration Item Repository (ou CIR) est une base de données qui référence toutes les informations sur les environnements. C’est un  CMDB dans une organisation ITIL.

Les Runbooks encapsulent  primitives sur les middlewares ou les composants techniques cibles.

Au milieu se trouve le Moteur de Résolution. Il scanne l’application, consulte les environnement et calcule un scenario a partir des runbooks. Le moteur les assemble dans un scénario plus complexe.

Le processus

1er concept – l’application : Le truc qu’on veut déployer, c’est à dire une application  livrée, un ear, un war et tout le bazar

2ème concept – l’environnement : c’est un ensemble de middlewares, serveurs d’applications, serveurs web … plus ou moins compliqué

3ème concept – le déploiement : il associe les 2 via le moteur de résolution qui calcule ce qu’il faut  faire

Autres caractéristiques techniques

Deployit est agentless.

Les opérations se font à distance sans déploiement d’agents sur les cibles en utilisant des protocoles standards (ssh, scp, jmx, jdbc, etc) ou les outils de management intégrés des serveurs d’applications (Twiddle pour JBoss,  wsadmin pour WebSphere Application Server, wstl pour Weblogic). Il requiert  ssh sur la machine distante. C’est standard sous UNIX/Linux mais peut poser problème sous Windows. Toutefois sous Windows Deployit peut fonctionner sur smb (Samba) et telnet, mais dans des conditions de sécurité dégradées car ces protocoles sont peu sûrs.

Il trace toutes les opérations effectuées.

La démo de Deployit par Benoît Moussaud, Selenium teste

La démo de Deployit par Benoît Moussaud, Selenium teste

Il est extensible et customisable via les plugins pour s’adapter aux processus des entreprises car chacune à des processus légèrement différent des autres.

La démo

Benoit Moussaud a décidé de nous faire une démo de l’intégration Maven et non pas de l’IHM.

Le but est de réaliser les étapes suivantes dans un serveur d’intégration continue Hudson : builder une application (le bien connu Pet Clinic), la déployer avec sa DataSource sur deux plates-formes, réaliser un test fonctionnel avec Selenium, un test de performance avec JMeter et reporter le résultat dans Hudson. A la fin des tests les cibles sont nettoyées.
Benoit nous montre qu’en définissant le plan de déploiement il est possible de déployer son application assez facilement grâce à des profils défini dans deployit.

Le plugin ajoute Deployit deploy dans la phase intégration test de Maven.

Les étapes à suivre sont décrites dans le plan de déploiement par du XML. Par exemple pour la plate-forme de test  fonctionnel avec Selenium  :
1 war tomcat
1 machine
Associe des ressources middleware type JDBC

Les runbooks indiquent au moteur de résolution que pour déployer le war et faire le test  il doit : arrêter Tomcat / attendre / déployer le war / démarrer / Executer  Selenium / désinstaller le war et éventuellement retirer la ressource JDBC si elle n’est utilisée par personne / arrêter Tomcat

Et un pas de salsa de Guillaume Bodet pour finir

Et un pas de salsa de Guillaume Bodet pour finir

La deuxième démo est plus compliquée puisqu’il y a un server web Apache et une base MySql en plus, mais c’est le même principe.

Un produit a considérer si vous avez des déploiements réguliers et complexes plutôt que de bidouiller des scripts.

Questions

Et si on veut pas payer ?

Le socle est payant en version complète mais il existe une version Community téléchargeable gratuitement qui n’a pas le support de la sécurité et n’est donc pas utilisable en production. Cette version permet d’évaluer le produit sur des plates-formes moins sensibles et de mettre au point les plugins. Il est très simple à installer pour test.

XebiaLabs étudie la possibilité de passer le noyau Deployit en Open Source Software.

Une question a été posée sur l’atomicité du déploiement. Les ressources ne sont pas transactionnelles. Donc en cas de problème, Deployit revient en arrière en réinstallant la version précédente. Ce qui implique qu’il ne faut jamais faire d’incrémental. On livre tout et le moteur de résolution sautera les étapes inutiles.

Le gros souci est la base. Les scripts de retour en arrière sur les bases de données marchent souvent mal. La recommandation de Guillaume Bodet est d’intégrer dans le processus une image avant de la base de données pour pouvoir restaurer en cas de problème.

La 3ième mi-temps

22h, Fin d’une soirée bien remplie. On range les chaises, on plie le matériel. Il ne nous reste plus qu’à partir en 3ième mi-temps.

Cette fois ci pas de wave. Vous trouverez d’autres comptes rendus là

A la prochaine !
JUG_20100511_SBD_poster3mitemps

Précédent : la présentation Maven 3

Les textes sont d’Ellène Dijoux et Claude Falguière. Les photos sont de José Paumard et Claude Falguière.

Paris JUG de mai : Build, Share & Deploy jusqu’au bout de la nuit (4)

3:00 pm in Les Conférences by Claude Falguière

Petit tour au buffet avant d’attaquer la deuxième partie de soirée.

Comme d’habitude, c’est encore là qu’on apprend des tas de choses, et qu’on peut revenir un peu au réalités : Quel est le revers de la médaille ? quand va-t-on me laisser l’utiliser ?

Pour fêter son 10ième client de l'eXpress Board, Nicolas Martignole finance le buffet.

Est ce que j"ai dis que pour fêter son 10ième client de l"eXpress Board, Nicolas Martignole finance le buffet ?

Tout le monde est très sage ce soir. 21h, ils sont tous remontés dans la salle de conférence à l’heure dite, sans le coup de sifflet rituel d’Antonio. Très motivés par Maven 3 ?

Maven 3

Nicolas De loof et Arnaud Héritier, tous les deux commiters Maven, nous ont préparé un véritable show en duo basé sur les rôles de Jamy et Fred dans l’émission  C’est pas sorcier.

Arnaud où est ton pull jaune ?

Arnaud où est ton pull jaune ?

Allez Marcel, ‘On va migrer vers Maven 3′  !

Nicolas De loof est très bon dans son rôle. Il a réussi à nous faire vivre ses relations compliquées avec son pote  Jason qui veut faire plein de trucs avec Maven. Il parle de  Jason van Zyl le fondateur de Maven. Présentation très vivante, sur un sujet qui n’était pas évident vous allez le voir.

Maven 3 est compatible avec toutes les versions précédentes. Plus de tests ont été faits pour le rendre plus robustes et assurer la compatibilité. Dans 99,99 % des cas ça passe tout seul. Dans les autres cas, ce sont des problèmes dus aux descripteurs de projet, car ils sont plus stricts en Maven 3. Et aussi Maven Site ne marche pas en Maven 3. C’est plus la peine de leur dire : ils savent.

Maven 3 a été entièrement refondu. L’objectif N°1 était d’améliorer la compatibilité.

L’équipe Maven a appris de ses erreurs. Maven 1 était immaintenable. Maven 2 a fait table rase, plus maintenable, un support des plugins. Une joli architecture mais pas souple et peu extensible, difficile à aborder pour les gens qui veulent rentrer dans le code. Nicolas nous partage les déboires qu’il a pu rencontré lors du développement de son plugin GWT.

Les nouveautés

Quelques modifications prévues : supprimer Plexus, mal documenté et peu utilisé en dehors de Maven, pour le remplacer par un IoC standard base sur la JSR 330. Spring ou sont Guice est envisagés, mais rien de clair pour le moment.

Nicolas de loof: Ils sont pas beaux mes wagons ?

Nicolas de loof: Ils sont pas beaux mes wagons ?

Maven passe enfin sur Java 5 et va donc enfin pouvoir utiliser les Generics. Le code est plus propre. Les documentations ont été améliorées, en particulier pour distinguer les API publiques et privées.

Le modèle de plugin de Maven 3 est plus interactif. Le plugin Aggregator qui servait à coordonner des opérations entre modules est supprimé. Une nouvelle fonction le Build plan va rendre les plugins plus adaptables au contexte. Le build plan permettra au plugin de comprendre ce qui va se passer lors de son exécution et ils pourront se configurer en fonction de ces informations.  Un exemple : le build plan pourra lister les tests à faire avant de commencer ce qui évitera de les jouer plusieurs fois parce qu’on ne sait pas s’ils ont été faits ou pas. Les builds plans devraient  éviter d’avoir besoin d’Aggregator.

Cela promet une meilleure intégration dans Eclipse. Maven 2 ne permettait que de réaliser des builds complets. Les build plus adaptables de Maven 3 permettront de laisser Eclipse faire ce qu’il sait faire dans les étapes du build (compiler par exemple) et de ne réaliser dans Maven que ce qui reste. Le plugin Eclipse les retirera du build plan, ce qui évitera les conflits.

Maven rencontre OSGI. Maven Tycho implémente la gestion des modules et des dépendances basée sur OSGI. Eclipse est basé sur un modèle OSGI. Le moteur qui installe et les gère les dépendances est Eclipse P2 (pour Provisioning Platform). Grâce à Tycho, Maven aura une meilleure intégration avec Eclipse et les repositories de bundle OSGI au format P2.  Le plugin Eclipse M2Eclipse s’appuie sur Tycho.

Le POM devient polyglotte. Il pourra être écrits dans d’autres langages qu’XML (Python, Groovy). une nouvelle syntaxe va également permettre de définir des exclusions globalement et non pas au niveau de chaque dépendance.

Les logs sont plus lisibles.

La possibilité de faire des mixins c’est à dire  d’avoir des héritages multiples et non plus strictement hiérarchiques.

Les performances sont améliorées, en particulier par la possibilité de paralléliser certaines parties du build. C’est Maven qui analyse les branches parallélisables et les points de synchronisation. Par exemple, sur un bi-core, le temps passe de 11mn en Maven 2, à 10 mn en Maven 3 et 6 mn en Maven 3 sur les 2 cores en parallèle. Bien sûr tout celà dépend de la présence ou pas d’éléments parallélisables. Cette possibilité est aussi intéressante pour les fermes d’intégration continue (comme Hudson) qui hébergent des builds complexes et longs.

Arnaud, Nicolas et Antonio en train de comploter pour savoir comment ils allaient faire pour donner le bouquin à une fille.

Arnaud, Nicolas et Antonio en train de comploter pour savoir comment ils allaient faire pour donner le bouquin à une fille.

De nouveaux outils : une  console Maven Shell qui permet d’avoir un résultat en couleur, et accélère un peu les builds en évitant de relancer la JVM et en mettant en cache les descripteurs Maven. Elle permet aussi de configurer des environnements Maven distincts selon les projets.

Pourquoi passer à Maven 3 ?

Il n’y a pas de fonctionnalité renversante, mais ça fonctionne mieux et plus vite. Le nouveau plugin Eclipse M2Eclipse devrait permettre aussi de gagner du temps et est à tester.

Maven 3 est en béta 1 pour le moment. L’équipe travaille toujours à porter les composants qui ne marchent pas comme Maven Site et eclipse:eclipse et attends vos retours.

L’organisation est toujours assez dirigée par le haut par Sonatype, et par Jason le pote à Nicolas,  mais elle se professionnalise et les processus sont plus clairs. Maven dispose d’une très forte communauté de développeurs et d’utilisateurs sénior.  Après la refonte en Maven 3 de nouveaux développeurs arrivent. C’est une bonne nouvelle, la communauté revie.

Vous pouvez retrouver les deux trublions dans leur livre Apache Maven aux éditions Pearson. Chose à noter, il est en français, c’est rare;

Un exemplaire a été donné à une des Duchess.

Appel pour l’ISEP

Antonio a profité du micro pour faire un appel pour l’ISEP. L’ISEP met ses locaux à disposition du JUG gracieusement. Le JUG vous propose de le remercier en réalisant des présentations ou des cours de quelques heures pour les étudiants de  l’ISEP sur des sujets  que vous maîtrisez. Ces cours ont lieu dans la journée.

N’hésitez pas à contacter l’équipe du JUG si vous avez des idées ou des propositions.

21h30 plus qu’une présentation, mais si on fait tout ça c’est bien pour déployer non ?

Précédent : la présentation Git Suivant : la présentation Deployit

Les textes sont d’Ellène Dijoux et Claude Falguière. Les photos sont de José Paumard et Claude Falguière.

Paris JUG de mai : Build, Share & Deploy jusqu’au bout de la nuit (3)

12:54 pm in Les Conférences by Claude Falguière

Pour faire suite à la présentation des DVCS en général, David va nous emmener dans une visite de Git.

Une très belle présentation, soutenue par Maître Yoda (il faut une citation de Maître Yoda par session au JUG) et des démos de gestion de configuration en live (incroyable non ?)

Git, la gestion de conf qui vous veut du bien !

David Gageot est CTO d’AlgoDeal, un site qui permet de mettre au point et valoriser ses propres stratégies boursières basées sur des techniques quantitatives. Il nous a présenté Git qu’il utilise depuis le début du projet.

David Gageot sur le point de dégainer l"effaceur de mémoire des Men In Black pour nous faire oublier tout ce que l'on sait sur les VCS

David Gageot sur le point de dégainer l"effaceur de mémoire des Men In Black pour nous faire oublier tout ce que l"on sait sur les VCS

Tout d’abord David et son équipe ne travaillent pas du tout de la même manière que Sébastien. Il nous en dira un peu plus sur la fin, mais sur le principe tout le monde met à jour tout le temps. C’est ça aussi la souplesse d’un DVCS.

Un autre avantage est qu’il peut être totalement autonome. Il a la totalité de son projet avec tout l’historique en local sur sa machine et peut nous faire des démos sans avoir accès aux serveurs de sa société, ce qui est impensable avec d’autres VCS. D’un point de vue plus pratique, ça permet de travailler dans le train par exemple.

David va nous présenter quelques raisons très motivantes pour passer à Git. Flashage de la mémoire à la Men in Black et on y va.

Le tube de l’été : Git bisect

L’histoire commence un matin face à l’impossibilité de faire fonctionner mvn eclipse:eclipse.

C’est une fonction qu’on n’utilise pas très souvent (elle sert à initialiser les projets eclipse) et semble cassée silencieusement depuis un bon moment. Mais il sait que la version 1.1.3 fonctionnait. Quand a-t-on cassé le build ? et à cause de quoi ? La traque commence.

Trouver le commit en cause en testant les versions une par une en remontant le temps entre le HEAD et la 1.1.3 va prendre beaucoup de temps. Une stratégie plus efficace consiste à ne tester que certaines versions en utilisant une méthode dichotomique. Manuellement, c’est fastidieux de calculer la version médiane. Mais voilà, Git vient avec plein d’outils magiques, dont git bisect
Git bisect va calculer tout seul un plan de test des versions en utilisant la dichotomie et tester la commande qu’on lui indique sur ces différentes versions.

Petite démo sur notre build cassé en faisant tester mvn eclipse:eclipse à chaque pas. git bisect annonce qu’il va trouver en 8 coups. Au bout de quelques essais git bisect a trouvé la première version qui ne marche plus. Il s’agit de la version dans laquelle le plugin  Maven Enforcer a été mis en place et configuré pour n’autoriser que Maven 3. Petite recherche complémentaire, c’est un bug connu.

David nous apprend la chorégraphie du git bisect, la danse de cet été au JUG Summer Camp. On ouvre les bras sur les builds 1.3.12 à 1.4.2 et on tranche au milieu sur le 1.2.22, et on recommence avec 1.2.22 à 1.3.12 ...

David nous apprend la chorégraphie du git bisect, la danse de cet été au JUG Summer Camp. On ouvre les bras sur les builds 1.3.12 à 1.4.2 et on tranche au milieu sur le 1.2.22, et on recommence avec 1.2.22 à 1.3.12 ...

L’outil est assez bluffant et depuis David ne peut plus s’en passer pour chercher les régressions.

Question d’Emmanuel Bernard du podcast Les Cast Codeurs : “Et si t’as pas de test , tu fais comment ?”. Et bien s’il manque un test, tu rajoutes un test et tu l’envoie dans le passé en faisant du cherry picking. Quand  je vous disais qu’on est en pleine Science Fiction ! Mais c’est réel.

Le build incassable

Le souci lorsque l’on travaille à plusieurs c’est que ce qu’on livre même si ça marche localement peut ne pas fonctionner avec d’autres livraisons faites dans la même période. Pour ça on a mis en place des solutions compliquées appelées serveurs d’intégration, Hudson le plus souvent,  pour jouer le build sur le repository commun puis afficher un statut (les voyants bleu/jaune/rouge).

Et puis comme le build casse plus ou moins souvent, on doit gérer des stats, qui affichent des soleils ou des petits nuages en fonction des statuts des dernières exécutions. Ces serveurs d’intégration sont des machines dédiées. Les services  tombent, il faut les monitorer, avoir des fermes de machines pour tenir la charge. Bref, on rajoute des complications par dessus des complications.

Et si tout bêtement les builds ne cassaient pas ?
Si vous passez chez Algodeal un jour, passez voir leur serveur d’intégration. C’est une oeuvre d’art. Mais il ne sert à rien, les builds ne sont jamais cassés. Science-Fiction ? Magie ?

En même temps, c'était joli la météo du build.

En même temps, c'était joli la météo du build.

L’intégration des livraisons est vérifiée en amont sur un principe de private build. Certains serveurs d’intégration comme Team City proposent ce type de fonction. Lorsqu’un développeur fait un commit, il est d’abord appliqué dans un bac à sable, et si ça marche le vrai commit est fait. Mais Team City impose des contraintes, par exemple utiliser IntelliJ IDEA.

Algodeal a mis en place le même principe en utilisant la possibilité d’avoir des dépôts multiples et la flexibilité de Git sur la gestion des contenus.

Chaque développeur a sur sa machine son dépôt personnel et un dépôt qui est une copie du projet qui sert au build privé.  Il pousse des mises à jour pour intégration sur le dépôt sur sa copie du projet.  Un script prend en charge le build et la propagation sur le dépôt commun si le build a marché.

Plus de serveur d’intégration centralisé, plus de machine dédiée, plus de Hudson, plus de voyant vert/rouge, et surtout plus de build cassés.

Démo de Gource

David nous a ensuite fait une rétrospective de son projet sous Gource. C’est un outil graphique qui permet de visualiser l’évolution d’un projet Git dans le temps : l’arrivée de nouvelle personnes, l’arborescence du projet, les changements. C’est encore un outil magique, même si c’est plus contemplatif qu’utile.

Le projet d’Algodeal est marqué par quelques feux d’artifices. Tout d’abord les deux changements de nom de la société, d’Algodeal à Tech4Quant, puis de Tech4Quant à Algodeal. Ne doutant de rien David a renommé tous les packages Java à chaque fois.  Il a aussi réorganisé les projets Maven un matin pour en multiplier le nombre par 2. Et Git s’en est bien sorti, là où un VCS standard aurait créé une monstrueuse panique.

Comment démarrer avec Git ?

David Gageot fera une présentation plus approfondie à Agile France 2010 le 31 Mai et le 1er Juin. Vous pouvez aussi le suivre sur son blog JavaBien.

Un peu de lecture ? L’excellent Pro Git chez Apress vous apprendra comment revoir toute votre conception de la gestion de configuration avec Git.

Il existe aussi une documentation assez complète sur Internet.

Et puis finalement rien de vaut l’utilisation pour se faire une idée. Git ne nécessite pas de serveur centralisé, d’administrateur. Il suffit d’installer une des versions de Git selon son OS et vous pouvez démarrer tout de suite avec un dépôt local.  Il existe même une version portable si vous n’avez de droits de super user.

Vous voulez démarrer Git en travail collaboratif ? Github vous permettra de participer à des projets open source ou de créer votre propre projet.

Pour relativiser un, peu l’enthousiasme de David, Git pour le moment ne bénéficie pas encore de la même intégration dans les outils que SVN dans les outils de développement. En particulier sous Windows, il n’existe à peu près que la ligne de commande. Mais ça va venir, et on présent que ça sera bien.

20h30, il est temps d’aller voir ce buffet.

Précédent : la présentation DVCS Suivant : la présentation Maven3

Les textes sont d’Ellène Dijoux et Claude Falguière. Les photos sont de José Paumard et Claude Falguière.

Paris JUG de mai : Build, Share & Deploy jusqu’au bout de la nuit (2)

12:15 pm in Les Conférences by Claude Falguière

Premier sujet de cette première partie, les DVCS. Ça sonne un peu comme un titre de Justice, mais ça veut dire Distributed Version Control System ou en français Gestionnaires de Configuration Logicielle Distribués.

Ces outils permettent de gérer plusieurs dépôts de code que l’on peut synchroniser avec d’autres dépôts en push (j’envoie mes mises à jour sur un dépôt distant) ou en pull (un dépôt distant vient chercher les mises à jour chez moi).

DVCS

Onon Palui, aussi connu sous le nom Sébastien Douche, nous a fait un retour d’expérience très enlevé sur sa vie avant les DVCS et avec les DVCS, supporté par une présentation très graphique à la typographie très travaillée.

Onon Palui, un expert Python, qui ne fait pas de Java mais vient régulièrement au JUG !

Onon Palui, un expert Python, qui ne fait pas de Java mais vient régulièrement au JUG !

Petit sondage à main levée pour commencer : qui utilise SVN, CVS, ClearCase, Perforce ? On peut constater qu’une majorité de personnes dans la salle utilisent Subversion (SVN).

A son arrivée comme Technical Leader dans une startup SecurActive en 2007, Sébastien avait son kit de survie. Pour lui, la gestion de version du code source est le premier filet de sécurité. Les tests sont le second. Il transportait ses deux outils fondamentaux avec lui de société en société : Trac et Subversion.

Ils fabriquent un logiciel à partir d’une page blanche. On ne sait pas quelle direction prendre, on prend des culs de sac, fait beaucoup de refactoring, des POC.

En un an et demi Subversion est devenu synonyme de souffrance. Jusqu’au jour fatal où il a été impossible de faire une démo. Et là, Onon Palui s’est dit : ça ne peut pas continuer comme ça ! Pourquoi ?

Pourquoi tant de souffrance ?

Le processus classique d’un développeur c’est checkout – code – commit. Ce qu’il a constaté en observant les développeurs avec qui il travaillait c’est qu’il passaient beaucoup de temps dans des micro-merges.

Les développeurs font des commits très souvent pour livrer le moindre changement : une correction de faute d’orthographe, une modification mineure. Ces commits fréquents obligent les autres à prendre constamment en compte les modifications des autres sur des fonctions qui ne sont pas encore finalisées.

Il peut même se développer une course qui consiste à commiter le plus vite possible, avant les autres pour ne pas avoir à merger les modifications des autres dans son code. Et encore plus de commits, encore plus de merges …

Mais pourquoi ces micro-merges ?

Les développeurs livrent souvent pour historiser leur code et avoir un backup. Mais lorsqu’ils le font ils sont confrontés au merge. Plus il y a de changements à merger, plus c’est compliqué. Donc fragmenter et merger souvent permet de réduire la douleur.

Mais normalement les branches devraient permettre à chacun de travailler en isolation et en sécurité sur sa branche de code. Les branches seraient la solution ?

Qui fait des branches sur Subversion ? (Silence dans la salle). Personne ne fait de branches sur Subversion car les merges de branches SVN sont un cauchemar.

Donc pas de branches. Finalement Subversion est fait pour faire de l’historisation et pas de la gestion de configuration.

Trouver autre chose ?

Sébastien Douche: "Je ne suis pas un numéro !"

Sébastien Douche: "Je ne suis pas un numéro !"

Sébastien est un coach Agile. Son objectif est de supprimer le passage développement – livraison pour avoir un environnement stable sur lequel on peut faire des démos tout le temps, et surtout faire des démos de fonctions en cours d’élaboration et pas encore intégrées.

La clé : l’isolation. Sébastien a donc commencé à étudier les DVCS. L’année clé a été 2005, l’année où Linus Torvald a créé Git.

Subversion reprend en les améliorant les principes de CVS qui date des années 80. Il faut changer de point de vue. Nettoyer le cerveau. Repenser les choses.

1ère notion a revoir : comment travaille-t-on ?

Un développeur est confronté à 3 workflows :

- un workflow organisationnel : la réalisation du produit dans sa globalité impose une gestion de repository qui peut se faire sur plusieurs modes : dépôt centralisé, existence de dépôts privés intégrés en pull par des intégrateurs dans le dépôt officiel, dépôts pyramidaux à la Linux, dépôts multiples resynchronisés sous contrôle pour les projets délocalisés.

- un workflow personnel : comment on travaille tout seul. Une branche par fct, par bug fix, par patch …

- un workflow inter-personnel : comment on travaille avec les développeurs autour de soi, échange par le dépôt central, échange de patch, cherry picking

Application concrète : le dépôt central n’autorise parfois pas les mises à jour. C’est le cas de la plupart des projets OpenSource où l’intégration des modifications se fait par échange de patch. Faute de pouvoir, faire un commit sur ces patchs, les développeurs doivent faire des copies de sauvegarde du code manuellement. Avec Git, les développeurs peuvent faire un commit sur leur dépôt local, même s’ils ne font pas un push de ces modifications vers le dépôt central.

2ième notion à revoir : la nature des objets manipulés

Les DVCS sont orienté contenu et non change set.

Les VCS (ou gestionnaire de configuration logicielle) classiques , sont orienté ChangeSet. Ils identifient des changements apportés à des fichiers. Lorsqu’un de ces fichiers a été modifié depuis le commit précédent, le VCS stocke un diff entre les deux états successifs du fichier. Il ne connait jamais vraiment l’état complet d’une version, il ne connait que des états successifs d’un fichier. Lorsque les noms changent, le VCS supprime un fichier et crée un autre fichier.

Les DVCS (ou gestionnaire de configuration logicielle distribués) identifient des contenus. Un contenu à une position dans l’arborescence, une nom et une empreinte (un checksum MD5 de son contenu). Au commit, le DVCS fait un snapshot de tous les fichiers de la version. Si le fichier n’a pas changé, la version pointera sur l’ancienne copie, si  le contenu du fichier a changé, la version pointera sur le nouveau contenu. Comme les noms sont dissociés des contenus, lorsque les noms changent, seuls les index sont modifiés.

Application concrète : le renommage massif. Il est très très lourd sous Subversion, car il implique la suppression et la création de nouveaux fichiers. Avec un DVCS, les fichiers changeront seulement de noms.

Quels bénéfices ?

Les DVCS permettent de gérer une branche par fonction développée. Pas de mélange des fonctions et donc un code plus stable. Il est également possible de faire des validations supplémentaires fonction par fonction (revue de code, démo)

Dans sa société,
1 – les développeurs se concentrent sur leur code
2 – flexibilité : ils choisissent les outils qu’ils veulent
3 – push par fonction
4 – revue de code systématique par fonction livrée
5 – phase de démo avant push par fonction livrée
6 – moins de stress !
7 – projet beaucoup plus stable

Conclusion : SVN est une torture, Libérez vous ! Tentez Git

Dans le cas où votre infrastructure n’aurait pas l’esprit aussi ouvert que Sébastien Douche, Git permet des bindings vers Subversion pour avoir un workflow personnel en amont du workflow organisationnel.

Nicolas Martignole présente l'eXpress Board et le sponsoring du buffet pendant qu'Antonio aide David Gageot à équiper son micro

Nicolas Martignole présente l'eXpress Board et le sponsoring du buffet pendant qu'Antonio aide David Gageot à équiper son micro

Sébastien Douche organise également Agile France 2010 le 31 mai et 1er juin.

Annonce du sponsoring du buffet par l’eXpress Board

Un petit speech de Nicolas Martignole (aka Le Touilleur Express) sur l’eXpress Board, le site d’annonce d’emploi qu’il vient de créer. Pour fêter son 10ième client, il nous offre le buffet. Il a aussi fait un compte rendu de la soirée qui se trouve .

Mais avant, on enchaîne avec Git, il n’est que 20h !

Précédent : l’Avant JUG et la présentation W3C Suivant : la présentation Git

Les textes sont d’Ellène Dijoux et Claude Falguière. Les photos sont de José Paumard et Claude Falguière.

Paris JUG de mai : Build, Share & Deploy jusqu’au bout de la nuit (1)

12:07 pm in Les Conférences by Claude Falguière

Session très Rock n’ Roll pour cette soirée de Mai du Paris JUG sur des sujets un peu … comment dire, enfin bref vous verrez, beaucoup de sujets et on se s’est pas ennuyés.

Pour commencer, l’Avant JUG à 18h30

L’Avant JUG

JUG_20100511_SBD_pano_avantjug

Beaucoup de monde cette fois ci : de gauche à droite, José Paumard, Nicolas De loof en orange, deux personnes qui accompagnaient des Duchess, et en vert Arnaud Héritier, puis des Duchess, Laure Némée, Katia Aresti Gonzalez, Audrey Neveu, Ylin Xu, Catherine Hurbain, Blandine Bourgois, Mathilde Lemée et Claude Falguière.

Le serveur veut qu'on lise la doc !

Le serveur veut qu'on lise la doc !

Avant JUG assez mixte cette fois-ci. José Paumard de l’équipage du JUG avait prévu de nous rejoindre pour parler un peu du JUG. Nicolas et Arnaud sont des speakers et ils peaufinaient leur présentation au Vavin. Laure est allée leur proposer de nous rejoindre. Et les deux autres personnes sont venues avec des Duchess.

De quoi avons nous parlé ? De l’absence de JUG en Espagne avec Katia (d’ailleurs il va falloir faire quelque chose), de l’adoption des langages fonctionnels, et de Scala en particulier.

Arrivée au JUG

19h il faut y aller, pour ne pas rater la présentation de 19h15

Waouh ! La salles est pleine. 200 personnes sont venues.

200 personnes motivées pour faire de la gestion de conf vous ne verrez pas ça tous les jours !

Cette fois-ci Olivier Croisier qui s’occupe d’habitude des waves en live n’a pas pu venir. Donc Ellène et Claude on pris plein de notes pour pouvoir faire un compte rendu assez complet de ce qui s’est fait et dit. Du coup, ce retour sur la soirée est sur plusieurs pages, une par présentation à peu près.
Reviens nous Olivier, c’est trop de boulot pour nous ;-)

Présentation du W3C

Alexandre Bertails travaille depuis quelques mois au W3C. Le World Wide Web Consortium (W3C) a été crée en 1994 par les inventeurs du Web Tim Berners-Lee (Directeur) et Jeffrey Jaffe (CEO).

Alexandre Bertails fait sa présentation pendant que David et Zouheir vont au secours du déroulant qui est tombé

Alexandre Bertails fait sa présentation pendant que David et Zouheir vont au secours du déroulant qui est tombé

C’est un organisme international à but non lucratif qui définit les protocoles et les normes du Web. Il chargé de promouvoir et d’assurer la compatibilité des technologies comme HTML, XML, XHTML, RDF, SOAP ou CSS.

Le W3C est présent dans le monde entier avec 18 bureaux dans le monde (même en Afrique), 65 groupes, 400 membres.

Alexandre Bertails fait partie d’une équipe de 60 personnes (dont 40% de français !) et il travaille plus précisément dans la System Team. 12 personnes travaillant partiellement pour des outils pour :

  • l’équipe : emails, logiciels internes, stockage des données
  • les membres : publication web, téléconférence, wiki, blogging
  • le public : validateurs, blog, forums, hosting code.

Le W3C fonctionne très bien. Le web est une activité rentable et les financements ne manquent pas. 17 ans après, le web est accessible à tous et partout.

Quelques conseils pour finir : Contribuer au W3C, aller voir le site entièrement réalisé selon les standards du Web , suivre HTML5.

Fin trop rapide de sa présentation.

Si Scala vous intéresse également, Alexandre fera une présentation sur Scala pour la première session du Scala User Group le mardi 18 mai.

Annonce du tirage au sort pour l’invitation de developpez.com à Jazoon

Petit intermède avant d’entrer dans le vif du sujet : Eric Siber de developpez.com (ricky81.developpez.com) présente le tirage au sort du soir : une entrée de 3 jours à Jazoon. une conférence Java qui se tient à Zurich.

Et ce n’est pas fini, il n’est que 19h30 …

Suivant : la présentation DVCS

Les textes sont d’Ellène Dijoux et Claude Falguière. Les photos sont de José Paumard et Claude Falguière.

Paris JUG de Mai : découvrez Deployit

8:37 pm in L'actualité by Duchess France

Et voilà la dernière partie du triptyque. Vous avez partagé votre code avec Git ou votre DVCS préféré, compilé, testé et fabriqué le packagé avec Maven 3. Maintenant, il va falloir déployer.

Deployit est un outil destiné à faciliter le déploiement des applications JEE sur les plates-formes de recette et production.

Lorsqu’il y a beaucoup d’environnements et/ou des processus complexes tels que la nécessité de déployer également des schémas de base de données ou des données, ces opérations peuvent devenir terriblement complexes.

Il permet d’organiser les étapes que l’on aurait fait manuellement en facilitant les choses :

  • centraliser les scripts et les ressources déployées,
  • avoir des scripts out-of-the-box pour les opérations courantes,
  • étendre les fonctions avec ses propres scripts,
  • gérer les paramètres spécifiques et les données d’authentification des différents environnements utilisés.

C’est un produit intéressant à connaître si vous êtes confrontées à des demandes d’automatisation des processus de livraison et d’installation.

La présentation Deployit sera assurée par Guillaume Bodet Directeur Technique de Xebia.

Nous espérons vous voir nombreuses mardi.  Attention les inscriptions pour la soirée Share, Build & Deploy du Paris JUG le 11 mai ouvrent bientôt !

Et bien sûr comme les mois précédents nous pourrons en discuter à l’Avant JUG un peu avant le début de la conférence à 18h30 et au buffet entre les deux séries de présentation.  N’hésitez pas à rester aussi au restaurant pour la troisième mi-temps, on en apprend presque autant en discutant autour d’un plat que pendant la conférence ;-)