Calendar

<<  février 2010  >>
lumamejevesadi
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

View posts in large calendar
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010

(février 7, 2010 17:07)

Le 20 Janvier, Jonathan 'Peli' de Halleux était parmi nous pour présenter Stubs, Moles et Pex.

Pour une première session, nous pouvons dire que c'était un succès ! Nous avons mis à jour la page descriptive de l'évènement afin que vous puissiez trouver les photos de l'évènement et les slides de la session.

Continuez à nous suivre et à parler de nous autour de vous !

(décembre 14, 2009 23:17)

Searching for an english version to have details about this user group ? Go to look on the blog of Steve here

DotNetHub, c’est quoi ?

DotNetHub est un nouveau user group qui vient de voir le jour.
Créé par un groupe de francophones, ce user group a pour vocation l’apprentissage, le partage et l’échange de connaissance en Français autour des technologies .NET et des méthodologies Agile.
Notre objectif ? Parcourir la Wallonie et les terres francophones, pour partager avec vous et dans la langue de Molière les sujets brûlants qui feront de vous et de la Wallonie un partenaire majeur dans le monde informatique d’aujourd’hui.
Ce user group a deux vocations

  • Technique pour la partie .net à destination des développeurs, architectes, chefs de projets, ...
  • Méthodologique pour la partie agile toujours à destination des développeurs et profils techniques, mais également aux décideurs, responsables produits ou tout autre entrepreneur désireux de se lancer dans la création d’un outil informatique

Bref nous nous adressons à tout ceux qui de près ou de loin interragissent avec une équipe informatique et veulent collaborer sur le projet.Nous traiterons de sujets aussi variés que 

  • les langages de développement (C# par exemple)
  • les frameworks existants autour de .NET (Silverlight, ASP.NET MVC, Sync framework, …),
  • l’architecture (SOA, Domain Driven Design, Domain Specific Languages, …) 
  • les pratiques des méthodologies Agiles (eXtreme Programming, …)
  • le pilotage de projet, la gestion des relations client-fournisseur

DotNetHub, c'est qui ?

DotNetHub c'est un groupe de 6 francophones travaillant en .NET et / ou dans les méthodes Agiles depuis de nombreuses années, tous mus par une même passion : apprendre et transmettre !

Mais surtout, DotNetHub, c’est vous !
Vous qui travaillez déjà (ou qui travaillerez demain) en .NET en Agile.
Vous qui voulez apprendre et échanger autour de ces technologies.
Vous, qui viendrez vous connecter au Hub et le faire vivre !

DotNetHub, que proposons-nous ?

DotNetHub c’est beaucoup de choses, mais surtout un portail, des conférences, des dojos et des forums ouverts.

Un portail d’informations :
Sur le site de DotNetHub (http://www.dotnethub.be/), vous pourrez trouver toute une série d’informations via des news, blogging, articles, des supports de conférences ou encore des podcasts.
Ces différentes ressources seront publiées en Français ou en Anglais.

Des conférences :
A intervalle régulier, DotNetHub organisera des conférences traitant de nos différents sujets de prédilection. Ces conférences seront données soit par les membres de DotNetHub, soit par des speakers nationaux et internationaux, mais toujours en Français.
De même qu’un séisme arrive rarement seul, des répliques de ces conférences pourront se propager en Wallonie, à votre demande (Contactez nous sur board@dotnethub.be ?).
Attention, le nombre de place sera limité à chaque conférence.

Des dojos :
En arts martiaux, le dojo est la salle d’entrainement. Et comme la connaissance vient de la pratique, nous organiserons régulièrement des dojos (ou ateliers) où les différents participants mettront en application ensemble une technologie, un framework, …, et ce sous les conseils d’un facilitateur de session. On peut voir ces dojos comme des sessions de travaux dirigés.

Des forums ouverts :
L’association internationale Open Information Foundation a démocratisé les Open Space Discussion : séances de discussion ouvertes dont les participants sont avant tout les acteurs.
Comme nous pensons que le royaume est couvert d’experts (nous, vous, le développeur à côté de vous dont nous n’avions malheureusement pas l’adresse), et que l’on apprend encore plus efficacement avec un vrai retour d’expérience et une discussion à bâtons rompus, nous organiserons également ce type de session.
C’est vous qui pourrez proposer le sujet de ces sessions.

Vous voulez participer ?

Que ce soit comme participant (spectateur), speaker ou encore sponsor, vous êtes les bienvenus ! C'est vous qui ferez vivre DotNetHub. Aller sur notre site ou contactez-nous sur board@dotnethub.be !

(novembre 19, 2009 08:56)

Introduction

In many scenario, you will want to generate fields in an existing class of an existing assembly. Let's imagine for example that you want to do some lazy loading in your classes. As a consequence, in all of your properties you will have some code checking if your private backing field has already been loaded or not. For that, you will have two solutions : look the nullity of your backing field, or look a boolean variable "hasBeenLoaded". This second solution is the best. Indeed the nullity can be a valid value and retreiving a "null" from your database shall prevent you from doing another get in your database.

Of course, this solution will result in a lots of cumbersome code that you will need to propagate in all of your classes. So you will probably think "aspect" and so use an AOP framework like PostSharp to do all of this plumbing code. You will find many posts on Internet speaking of dealing with LazyLoading functionality in PostSharp, but they usually deal with the nullity of the backing field.

So how can we use PostSharp (I will use the 1.5 version for this example. The version 2.0 of PostSharp will probably simplify this solution) to generate a boolean field ?

This example (that should be seen more like a proof of concept) will probably make you think of many other cases where you will need to generate some code in an existing class. Here we will generate a simple variable in a class, but the code can be easily adapted to generate a field per existing property.

Let's create an aspect

With PostSharp, many high-level aspects already exist and they will be sufficient for many of your scenarios. However for code generation, you will need to go a bit more low level.

So in your project you will need to add a reference to PostSharp.Public (in the GAC) and to PostSharp.Core (that can be found in the installation folder of PostSharp). Now you can create your attribute :

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]

[MulticastAttributeUsage(MulticastTargets.Class, AllowMultiple = false)]

[RequirePostSharp("InjectCodeAttributePlugin", "InjectCodeAttributeTask")]

public class InjectCodeAttribute : MulticastAttribute { }

With the AttributeUsage attribute, I specify that this attribute will target only classes, and the MulticastAttributeUsage attribute tells that only the tagged class will be "aspected" (I could here decide that when I put my attribute on a class, it will get automatically propagated to all properties). I also specify the RequirePostSharp attribute. Indeed as we work low-level, we need to tell PostSharp what to do when seeing this attribute. So in this atribute, we specify the plugin file and the task related to our attribute.

The plugin file can be seen like a configuration file, listing tasks to perform and dependencies between them. Let's see the file we will create in our case. In our attribute, we have specified InjectCodeAttributePlugin, so it means that PostSharp will look for a file named InjectCodeAttributePlugin.psplugin. Let's create such a file in our project:

<?xml version="1.0" encoding="utf-8" ?>

<PlugIn xmlns="http://schemas.postsharp.org/1.0/configuration">

   <SearchPath Directory="bin/{$Configuration}"/>

   <TaskType Name="InjectCodeAttributeTask" 

             Implementation="LowLevelAspect.InjectCodeAttributeTask, LowLevelAspect">

      <Dependency TaskType="CodeWeaver"/>

   </TaskType>

</PlugIn>

What does it say ? Simply that the task InjectCodeAttributeTask (the name we specified in the RequirePostSharp attribute) will be implemented by a class of the same name, in a specific assembly and namespace. We also specify that our task will depend on a task called CodeWeaver. This is an out-of-the-box task of PostSharp that allow us to re-use the current weaver process. It's a best practice for nearly all the low level tasks you will create.

Let's create a task

So what does the task ? In my view, it can be seen as an orchestrator (or provider) of advices. And an advice is the object that will inject (weave) code in our class. Remember that we are doing low level aspects. So when we speak of code, we mean IL code.

Our task is an IAdviceProvider, meaning that it will provide PostSharp with the different advices we want to define (only one in our case : the one responsible for generating a new field). So the task's responsability is limited to two things:

  • As the task knows on which specific member it's weaving (type, method, ...), it can extract everything our advices will need for injection (types, methods, ...)
  • Iterate thru all the attributes (and attribute's targets) we have specified in our code to create the advices. Here is how we deal with that :

internal class InjectCodeAttributeTask : Task, IAdviceProvider

{

   /// <summary>

   /// Initialize the task.

   /// This is where we should extract some types or methods our advices will use

   /// </summary>

   protected override void Initialize()

   {

      base.Initialize();

   }

 

   void IAdviceProvider.ProvideAdvices(Weaver codeWeaver)

   {

      // Gets the dictionary of all custom attributes and more specifically, extract our attribute

      var annotationRepository = AnnotationRepositoryTask.GetTask(this.Project);

      var customAttributeEnumerator

         = annotationRepository.GetAnnotationsOfType(typeof(InjectCodeAttribute), false);

 

      // For each instance of our InjectCodeAttribute

      while ( customAttributeEnumerator.MoveNext() )

      {

         // Gets a reference to the attribute and then the type to which it applies

         // (Remember the MulticastAttributeUsage targets types !)

         InjectCodeAttribute attribute

            = (InjectCodeAttribute)

               CustomAttributeHelper.ConstructRuntimeObject(customAttributeEnumerator.Current.Value,

                                                            this.Project.Module);

         var type = (TypeDefDeclaration)customAttributeEnumerator.Current.TargetElement;

 

         // And we can add our advices

         codeWeaver.AddTypeLevelAdvice(new AddFieldAdvice(this, attribute, type),

                                       JoinPointKinds.AfterInstanceInitialization,

                                       new Singleton<TypeDefDeclaration>(type));

      }

   }

Note that we will complete later on the Initialize method. The JoinPointKinds enum of the AddTypeLevelAdvice is useless in our case. Its goal is to tell PostSharp where we want to inject code in the methods or classes. In our case creating our fields is independant of the existing code so we can be agnostic of the present code and so we just choose one of type-level JoinPointKinds.

So what do we want to generate ? We said a boolean field that can logically be decorated with an attribute CompilerGenerated. This is typically the kind of information we need for the Initialize method. Let's extract these informations.

   internal ITypeSignature SystemBoolean;

   internal IMethod CompilerGeneratedAttributeCtor;

 

   /// <summary>

   /// Initialize the task.

   /// This is where we should extract some types or methods our advices will use

   /// </summary>

   protected override void Initialize()

   {

      base.Initialize();

 

      var module = this.Project.Module;

      //1. Extract the System.Boolean type

      this.SystemBoolean = module.FindType(typeof(bool), BindingOptions.Default);

 

      //2. Extract the constructor (ie the method named ".ctor") of the CompilerGeneratedAttribute

      var compilerGeneratedAttribute = module.FindType(typeof(CompilerGeneratedAttribute), BindingOptions.Default);

      this.CompilerGeneratedAttributeCtor = module.FindMethod(compilerGeneratedAttribute, ".ctor");

   }

Note that for an attribute, we are not interested by the type itself, but by its constructor.

Let's create our advice

So let's go to our advice ! This is the class that will generate the field. This is the easiest part of our job !

internal class AddFieldAdvice : IAdvice

{

   private InjectCodeAttributeTask task;

   private InjectCodeAttribute attribute;

   private TypeDefDeclaration type;

 

   public AddFieldAdvice(InjectCodeAttributeTask task, InjectCodeAttribute attribute, TypeDefDeclaration type)

   {

      this.task = task;

      this.attribute = attribute;

      this.type = type;

   }

 

   int IAdvice.Priority

   {

      get { return this.attribute.AttributePriority; }

   }

 

   bool IAdvice.RequiresWeave(WeavingContext context)

   {

      return true;

   }

 

   void IAdvice.Weave(WeavingContext context, InstructionBlock block)

   {

      //1. Create a new field

      FieldDefDeclaration field = new FieldDefDeclaration();

      field.FieldType = this.task.SystemBoolean;

      field.Name = "HasBeenLoaded";

      field.Attributes = FieldAttributes.Public;

 

      //2. Add the field to the class' fields

      type.Fields.Add(field);

 

      //3. Add the attributes

      //(the field must be added to the class' fields)

      var ctor = this.task.CompilerGeneratedAttributeCtor;

      var compilerGenerated = new CustomAttributeDeclaration(ctor);

      field.CustomAttributes.Add(compilerGenerated);

   }

}

Note that we must add the field to the class' fields before we can add the attribute to our field. Otherwise we would get an exception telling that the field's parent is not known.

Ready to use our attribute !

Our attribute is now finished and we can test it !

So I just create a separate project (our attribute will be typically created in a framework DLL and not in your business DLL) referencing the DLL where my attribute reside and I add a basic class like this one :

[InjectCode]

public class MyAspectedClass { }

and I build it. But it does not work ! I have the following compilation error : Error 2 PostSharp: The plug-in "InjectCodeAttributePlugin" required by the type "LowLevelAspect.InjectCodeAttribute" was not found.
What happen is simple. PostSharp is searching for the file ".psplugin" but it cannot find it. So what to do ? You must know that by default PostSharp knows about the plugin files that are deployed on the machine under the "Plugin" folder (typically in C:\Program Files\PostSharp 1.5\PlugIns). But you can also give him a hint of where to find it. To do so, just edit your project file to add this property :

<PropertyGroup>

   <PostSharpSearchPath>..\LowLevelAspect\bin\Debug</PostSharpSearchPath>

</PropertyGroup>

In my case, LowLevelAspect is the name of the project where I defined my aspect. Note that you could also replace "Debug" with $(Configuration) to target either the Debug or the Release folder depending of the configuration you are building in

For this to work, you need of course to deploy your psplugin file. So you can just update the properties of your file to specify Copy to Ouput Directory : Copy Always.

So let's try again to compile. This time, it's ok !

We can now look to our class in the reflector and here what we get :

public class MyAspectedClass

{

   // Fields

   [CompilerGenerated]

   public bool HasBeenLoaded;

 

   // Methods

   public MyAspectedClass();

}

Pretty cool no ?

(novembre 16, 2009 23:24)

Quelques jours de retour après l'Agile Tour 2009 à Lille, nous voilà Norman et moi de retour à Bruxelles. Vous pourrez trouver ci-dessous les slides des deux conférences que nous avons donné.

Vous avez pris des notes pendant la session et vous avez bloggés sur l'évènement ?

Vous voulez continuer la discussion ?

N'hésitez pas à commenter sur cet article et à faire référence à votre propre blog et articles relatifs à l'évènement !

(octobre 21, 2009 22:13)

Encore une fois, les méthodologies agiles font leur tournée en 2009. Et une fois encore, de nombreuses dates sont disponibles partout dans le monde, et principalement en france. Et cette année, un arrêt est également prévu à Lille le 30 Octobre, et c'est gratuit ! Pour plus d'information, regardez leur site web pour avoir tous les détails sur cet évènement !
J'étais très occupé l'année dernière et j'ai donc manqué l'évènement, mais cette année, il était impensable pour moi de ne pas y aller !

Si vous voulez parler de tests, de méthodologies agile, d'intégration continue, ... Rejoignez-nous là bas ! Avec mon partenaire Norman Deschauwer, nous donnerons deux sessions:

Retour d'expérience : XP n'est-il applicable que dans des petits projets ?

Nous avons souvent l’image d’eXtreme Programming dans des projets de courte durée. Et à en juger par quelques chiffres (15 personnes pour plus de 8000 jours hommes), notre projet est en ligne directe avec les métriques des projets traditionnels et semble présenter un volume de travail frôlant ou dépassant les barrières standards des projets agiles.
Cependant, nous en avons fait un vrai projet XP, avec il est vrai quelques adaptations à la méthode pour satisfaire nos contraintes propres.
Nous aimerions montrer ici qu’un projet critique – dans le domaine financier – même durant plus de cinq ans peut tout à fait être réalisé en XP. Serait-ce même la solution à suivre ?

Nous parcourrons les différentes valeurs et pratiques d’eXtreme Programming afin de mettre en évidence la façon dont nous avons pu les mettre en place, tout en montrant les différents problèmes que nous avons pu rencontrer et comment nous les avons résolus.

Discussion ouverte : Que tester dans une application ?

Que doit-t-on tester dans une application ? Que ne doit-t-on pas tester ?
Quels types de test devons-nous faire ? Des tests orientés GUI ? Des tests unitaires ? Des tests orientés données ? Exploratoires ? Aléatoires ?
Allons-nous mettre en place des mocks ou non ? Tester la base de données ?
Les tests me permettent-ils vraiment de vérifier l’application ? Ou tout simplement de la designer ? De la documenter ?

Ecrire un test est très simple, mais amène vite de très nombreuses questions.
C’est donc bien une session sous la forme « d’Open Space Discussion » que nous voudrions « faciliter » ici, afin que notre expérience et la votre permette de répondre tous ensemble à quelques unes de ces questions.

Vous êtes intéressés par d'autres sujets ?

Un Open Space est prévu à la fin de la journée, et pour plusieurs heures. Avec Norman nous resterons un moment pendant cet open space. N'hésitez donc pas à nous contacter, nous serons très heureux de discuter avec vous de tout sujet traitant de l'agile, XP, Scrum, les tests, l'intégration continue, ...

Powered by BlogEngine.NET 1.2.0.0 | Theme by Pierre-Emmanuel Dautreppe