Intégration Continue en .Net

Bonjour les fans de .Net et d’intégration continue!
J’affectionne Hudson en ce moment, et je l’applique de plus en plus pour .Net. Je l’utilise en ce moment pour analyser le code et “gronder” les membres du projet qui codent “mal”.
A défaut d’avoir un plugin Sonar pour .Net, Hudson et son plugin Violations fait déjà pas mal de bon rapports.
Ce plugin supporte pas mal d’outils comme FXCop ou StyleCop. Concernant ce dernier, le plugin bug avec les chemins absolus et les “\”, j’aimerai bien le corriger mais je n’ai pas trop le temps :)
J’ai regardé les sources de ce plugin, et ça semble assez simple.
HudsonMonitor

Ma petite application Winform qui lit le flux RSS pour afficher l’état des projets.
En ce moment c’est bien rouge… mais ça peut aussi être jaune ou vert ;)

Il supporte aussi CPD qui détecte les Copier/Coller (sans doute la source de bug la plus importante dans équipe), mais il ne supporte pas le C#… Idem, j’aurai bien aimé avoir le temps de l’implémenter.
J’ai vu que TeamCity avait sa propre tâche “Duplicates Finder“, mais ça n’a pas l’air d’être indépendant.
NDepend est magique et répond à ce besoin, mais il est payant, et non supporté par Hudson.
J’ai eu aussi envie de tester Gendarme. Encore une fois, si le temps me le permet, j’ajouterai bien le support des rapports Gendarme dans le plugin Hudson-Violations. En attendant, je peux toujours convertir le XML de Gendarme en XML FXCop (je n’ai pas encore étudié la faisabilité).
Je sais que faire évoluer Hudson ou CPD ou encore Sonar nécessite des connaissance en Java.
Mais le constat est que ces outils sont matures en Java, et les “pâles copies” en .Net ne sont pas à la hauteur (comme CC.Net par exemple).
L’investissement est très variable entre les différents projets (Violation, Sonar, etc), mais je suis convaincu qu’il en vaut le coup.
Et vous, qu’en pensez-vous?
Faut-il absolument faire du .Net pour du .Net? et s’investir sur un CC.Net vieillissant?
Hudson est-il un bon choix d’investissement?
Ne faut-il pas mieux privilégier l’investissement sur Sonar pour les rapports d’analyse?
Et la question la plus important: y a-t-il des personnes motivées par ça?
Je pense même que ça mérite un “meta-projet opensource” avec son site web, qui regroupe les outils de build et d’analyses de code en .Net, afin d’offrir une solution “packagée” pour .Net.

ALT.Net sur l’AOP

Je vous invite à venir à la session ALT.Net sur l’AOP présenté par Romain Verdier le Mercredi 17 juin.

Pour vous mettre dans le bain et vous permettre de vous informer sur le sujet avant la réunion, voici un exemple d’AOP super simple avec Postsharp : http://bit.ly/71pej

Dans le cadre de mon projet actuel, l’AOP aurait pu m’aider à décorer les méthodes qui nécessitent de l’impersonation (accès à des ressources critiques qui nécessite donc un compte privilégié) ou à gérer la sécurité+log+erreurs au niveau des WebServices (CheckClientCertificate+Log+SoapException).

J’utilise souvent l’AOP avec Spring.net, qui utilise la méthode “création de proxy dynamiquement” ou appelé aussi “dynamic weaving”.

Cette méthode consiste à créer des proxy dynamiquement qui encapsulent l’objet cible en ajoutant le code des aspects aux bons endroits. La limite de l’approche avec Spring.Net est que l’on perd en performance à la création de ces proxy, on ne peut exposer qu’une seule interface, et cela oblige à utiliser Spring.net pour se faire injecter l’instance.

Postsharp lui, fait tout à la compilation, c’est ce que l’on appelle le “static weaving”. L’avantage est que l’on gagne en performance, on ne dépend pas de la façon d’instancier la classe, et la manière d’ajouter des aspects se fait par code (par attributs) se qui peut s’avérer plus agréable que de les déclarer dans un XML (ce que fait Spring.net). L’inconvénient est que cela oblige à posséder le code source de l’objet à “aspectiser” et de le compiler avec les aspects.
On peut citer AspectDNG qui utilise aussi le “static weaving”.

Aspect# utilise le “dynamic weaving” tout comme Spring.net. Ils utilisent tous la réflexion à l’aide de System.Reflection.Emit (fourni par défaut avec .Net) pour créer les proxy dynamiquement. Aspect# le fait par l’intermédiaire de Castle.DynamicProxy (utilisé aussi par NHibernate ou RhinoMock).

Le débat à la session ALT.Net va certainement porter sur Réflexion vs Introspection: la réflexion est moins bonne en performance que l’introspection, car elle nécessite de charger tout le code en mémoire, alors que l’introspection analyse directement l’IL. Voici un petit post sur le débat: http://bit.ly/2xq6aB

Romain a travaillé sur Mono.Cecil.Decompiler avec Jean-Baptiste Evain, il va donc sans doute nous parler des avantages de l’introspection avec Mono.Cecil. Voici un autre post sur le sujet sur le blog de JB.

Voila, j’espère que vous serez ainsi mieux armés pour assister à la session :)

ALT.Net: Adaptive Object Modeling

Mardi 19 Mai a eu lieu la session ALT.Net sur l’Adaptive Object Modeling présenté par Sébastien Ros.
Je voulais simplement dire que j’étais content d’assister à cette rencontre : la présentation de Sébastien était courte et intéressante (et drôle en plus !). En résumé : le type de présentation qui ne nous laisse pas le temps de s’endormir.
Cela nous a aussi permis de débattre de divers sujet à la fin de la présentation : nous avons voté pour des sujets qui nous intéressent, puis nous nous somme divisé en 2 groupes pour en débattre. Cette formule nous permet de changer de groupe si le sujet finit par nous ennuyer :)
Bref, j’ai bien aimé cette rencontre qui revient sur l’esprit des premières. En plus, Octo nous a bien accueillis avec de succulents petits-fours :p

ALT.Net +   Petits-fours =   Smiley

Lisez la suite de cette entrée »

Jaxer

Aaaaah, je me souviens du bon vieux temps ou je découvrais le développement Web, lors de mon premier stage d’étude, sur une application PHP…
J’avais déjà découvert les joies des incompatibilités des navigateurs: à l’époque, Netscape était le navigateur officiel, et je me battais pour qu’on utilise IE5…
Je m’étais amusé à copier/coller des petits bouts de javascript à droite à gauche, sans trop comprendre ce qu’ils faisaient, afin d’avoir une interface plus user-friendly…
J’étais en admiration sur des applets Java beaucoup plus ergonomiques que mes bouts de Javascripts…
Et je bavais sur des sites entièrement Flash, magnifiques, et performants (quand c’était bien fait…)

Puis j’ai entendu parler de DHTML: “la grosse blague”, ce sont les mots que j’ai sans doute prononcés quand j’ai su que ce n’était qu’un nom marketing pour le couple Html+Javascript.

Aujourd’hui on parle de Web 2.0 ou d’Ajax. On parle aussi d’Adobe Air, ou de Silverlight (on va éviter de parler de JavaFX). Finalement, pas de grosse révolution, mais plutôt une “évolution”.
Lisez la suite de cette entrée »

Publié dans Développement. Mots-clefs : , , , . 2 Commentaires »

Cloud computing

OK, je ne suis pas original, je parle d’un sujet “dans le vent” : le Cloud Computing

Cloud Computing: introduction avec Azure et Amazon

Grâce à la présentation chez Fastconnect par Romain, j’ai pu découvrir les joies de Azure. C’est la solution Cloud de Microsoft qui est bien sûr très orientée .Net + VisualStudio.

On parle ici de “Plateform as a Service” puisque Azure nous offre de quoi héberger nos applications (web ou service) à l’aide d’une architecture “cloud”.
On développe des applications qui effectuent des calcules distribués sur X machines, ou on héberge X sites web ASP.Net dont la charge est répartie entre eux.
En plus d’offrir une architecture “scalable”, on a droit à certains services “bas niveau” comme le service de stockage de données binaires (full REST), une queue ou un stockage “à la BigTable“. On peut ensuite bénéficier de services plus “haut niveau” comme “Live Search” ou “Live Calendar“.

Par comparaison, Amazon avec EC2 propose un service “Cloud” orienté “Hardware as a Service” car on loue ici à des machines virtuelles, vierges ou avec des choses pré-installé (comme Linux Apache Msql PHP). La puissance de ces machines est aussi “scalable” à la demande, et on ne paie que ce que l’on utilise.
A la différence d’Azure, où la partie “Hardware” est complètement masquée (IIS7, WindowsServer2008, etc.). Azure offre une interface web d’administration pour surveiller l’utilisation du CPU ou de la mémoire, et on peut rapidement changer le nombre d’instances d’un site web à la demande.
Ceci dit, Amazon offre aussi des couches techniques comme le service de stockage Amazon S3.

Bref, le Cloud ce n’est pas qu’un hébergeur de site web ou une Dedibox, c’est surtout le fait de bénéficier des serveurs des gros mastodontes tel qu’Amazon ou Microsoft pour louer la puissance dont on a besoin, et profiter d’applications et de services pré-installés utilisables tout de suite. C’est aussi la possibilité d’utiliser des services techniques (Database, etc.) ou haut niveaux (Map, Calendar, etc.).

Nouvelle solution de Cloud avec Aptana

Azure offre de quoi développer un site ASP.Net Scalable rapidement, mais je vais faire le chieur en voulant développer une application Rails sous Eclipse!

C’est la que j’ai découvert Aptana Cloud.
Lisez la suite de cette entrée »

Publié dans Développement. Mots-clefs : , , , . 2 Commentaires »

GUICE : un framework de DI pour Java

Je pense que la Dependency Injection est une valeur fondamentale à l’écriture d’un programme, et je l’utilise tous les jours.
Je suis un adorateur (voir expert) de Spring/Spring.Net, et j’affectionne l’écriture de la structure du programme en XML.

Mais cette technique est très largement contestée :

  • nécessite un éditeur XML “intelligent” (ce qui est le cas grâce à SpringIDE) pour la complétion de la structure mais aussi des types.
  • interprétation au Runtime, et donc erreurs potentielles découvertes qu’au dernier moment.
  • verbeux
  • mauvaises performance (lecture du XML…)

Ça a aussi ses avantages, c’est pour ça que je reste adorateur de Spring, mais ce n’est pas le sujet…

J’ai déjà souvent eu ce débat avec Romain dans le monde .Net (voir http://ninject.org).
Je connais très mal les alternatives à Spring dans le monde Java, mais je connais celle de Google : Guice.

Voici un tuto/introduction très convaincante.

Pour ceux qui ne connaissent pas Ninject ou Guice, voici un peu le principe :
Au lieu de rédiger un XML, on utilise massivement les annotations (attributs en .Net) pour spécifier les injections. Ceci est aussi possible en Spring (technique dite Autowire) mais l’utilisation du XML reste nécessaire pour personnaliser plus finement les dépendances entre instances.
Dans le cas de Guice, au lieu de rédiger un XML, on créer une classe Module qui réalise le mapping entre une interface et la classe concrète à instancier/injecter.
On peut spécifier bien plus de chose que cela, mais je vous laisse lire l’article pour découvrir par vous même.

Pour ceux qui veulent suivre le débat “Spring vs Guice” ou “XML vs Code”, voici le point de vue de la documentation officielle de Guice.

Publié dans Développement. Mots-clefs : , , , . 1 commentaire »

Encore un nouveau langage : FAN

En lisant un article d’introduction du langage FAN je trouve intéressant que ce dernier soit compatible .NET et Java.
En ce moment, .Net se voit enrichir de nombreux langages, aussi bien statiques (F# par exemple) que dynamiques (Iron Python). Les langages “standards” étant C#, VB.Net et C++/CLI.
Quand on développe sur la JVM, le langage “standard” reste Java. Mais cela ne veut pas dire qu’on a pas le choix : Scala, Jython, Groovy

aa496123net_logoen-usmsdn10java_logo = FAN ?

Lisez la suite de cette entrée »

Publié dans Développement. Mots-clefs : , . 1 commentaire »

Quel langage pour l’avenir : C#4 ou Oxygene (Delphi)

Suite au post de Romain sur l’avenir du langage C#, je voulais non seulement répondre, mais en profiter pour parler brièvement d’un autre langage .Net : Oxygene.

C#4 ?

Romain a trouvé une citation un peu abusive mais qui m’est pourtant tout de suite venu à l’esprit concernant C#4 :

The dynamic keyword is going be abused so much… C# is on its way to becoming PHP.

Pour la petite histoire, je viens de passer 2 jours à coder du Javascript… coder?? Débuguer surtout!
Je ne sais pas si suis allergique aux langages dynamiques, mais ça me frustre au plus au point de ne pas savoir quel sont les membres que possède un objet, et de devoir le vérifier au Runtime
J’ai passé 2h car j’ai fait une faute de frappe sur le nom d’un membre, ce qui ne plante pas, mais comme cela créer dynamiquement un nouveau membre avec ce nouveau nom, j’ai passé beaucoup de temps à comprendre pourquoi sa valeur était “null”.

C’est pour ça que les aspects “dynamiques” me font peur pour la maintenance des futures programmes C#4.
Ceci dit, le mot clé “var” existe déjà en C#3, et je n’ai pas vu quelqu’un en abuser (d’ailleurs, est-ce que la nouvelle version de Resharper suggère toujours de remplacer les types par des var ??!!).
Toujours pour diluer mes propos, il est vrai que dans la réalité on a besoin d’utiliser différents langages pour différents besoin, alors pourquoi ne pas tout réunir en un seul…
Mais j’aimerai éviter ça :

Pétage de cable

Parfois je me dit aussi que “C# is on its way to becoming C++“. Je n’ai pas beaucoup d’expérience en C++, et de ce fait j’ai parfois du mal à comprendre certains codes.
Mais j’ai surtout l’impression que les possibilités du langage sont tellement nombreuses, qu’on a pas 2 codes source C++ “dans la même prose”, ce qui devient vite difficile à lire. Pouvoir faire 1 chose de 10 manières différentes, n’est en mon sens pas un bon truc.

Mais en pratique, les nouvelles fonctionnalités de C# ne sont utilisées que par une “élite” qui a un besoin très précis. Dans mon travail actuel, les gens ne savent pas encore faire du Linq, et j’ai l’impression que je suis le seul a avoir VRAIMENT migrer sur C#3. Donc, avant que quelqu’un découvre les nouveautés de C#4 et en abuse….

Ah, si, il y en a 1… et c’est le genre de personne à faire une chose d’une certaine façon “juste parce que c’est possible”, si vous voyez ce que  je veux dire… et là, ça devient vraiment dangereux, et on fini par avoir du code incompréhensible car il a détourné une fonctionnalité de son but initial.

Je dois être vieux jeux, mais je préfère parfois la méthode “classique et lisible” même si elle est plus verbeuse. Pourtant, je me laisse séduire, et je deviens vite fan des méthodes d’extension et des expressions lambda. C’est comme si mes 2 personnalités entraient en conflit quand je me dit :


return toto??tata;
// ou
return toto!=null?toto:tata;
// ou
if(toto != null)
return toto;
else
return tata;

Il est clair que je préfère la première solution, mais on m’a défait fait la remarque :

euh, tu peux l’écrire avec le “if”, je trouve ça plus lisible.

Et oui, il faut aussi s’adapter au niveau de lecture de l’équipe.

Mais là, je ne parle que du langage C#, pas des possibilité de la VM ou du Framework. S’il est possible d’interagir entre .Net et Javascript, alors je suis aux anges, mais il existe sans doute d’autres moyens “peut être plus contraignant” que d’ajouter de la dynamicité dans le langage C#. (On génère bien des “stub” pour communiquer en COM !)

Mais au finale, je me laisse prendre au jeux, et finalement je suis fan des expressions lamdba, Linq, les méthodes d’extensions, juste parce que ça s’écrit plus rapidement et que je suis fainéant.

Oxygene ?

Parce que je suis bavard, je voulais en profiter pour parler non pas de C#, mais de Oxygene.

delphiprismscreenshot

Un peu d’histoire : le créateur de Delphi a aussi été le créateur de C# : Anders Hejlsberg
Petit lien car ça ne fait pas de mal : Anders qui parle du future de C# (je sais, tout le monde l’a déjà vu).

J’ai commencer à coder en Delphi au Lycée (je ne compte pas les années Basic sous AsmstradCPC6128 ;) ).
Delphi était magique à l’époque : langage Pascal Objet, IDE avec un puissant Designer pour application Windows, framework riche…

Puis le monde a évolué : Anders Hejlsberg a quitté Borland pour aller chez Microsoft.
A l’époque, Microsoft a voulu faire leur propre “Java” : J++.
Anders a commencer par travailler la dessus, mais Microsoft est entré en conflit avec Sun concernant ce J++, et c’est comme ça que .Net naquis.
Anders inventa alors C# pour l’occasion, et J++ fut porté sous .Net sous le nom de J#.

Les années noirs pour Borland ont commencé, les entreprises se tournant vers Microsoft et .Net.
Mais je suis resté à coder en Delphi 7 dans mon ancienne société, alors que .Net en était déjà à sa V2. Période de ma vie (en tant que codeur) très frustrante: pas de “foreach”, pas de “generics”, programmation par interface difficile, etc.

Pour Borland, ce fut de pire en pire : ils ont fini par migrer Delphi en .Net, et ont alors inclue le SDK de Microsoft .Net dans leur IDE… comme si Delphi en tant que langage était mort, et que “Delphi 2008″ ne servait surtout qu’à développer en C#. Sans compter les frameworks tel que VCL.Net en conflit avec ceux de .Net comme Winforms.

Je n’ai pas travaillé avec Delphi 2008, mais je l’ai un peu testé. Malgré de gros problème de performance, cet IDE était déjà 1000 fois mieux que VisualStudio : refactoring poussé, historique “à la svn” à chaque sauvegarde/innactivité d’un source, Designer plus sympa, etc.

Mais finalement, Borland a laissé son IDE à Codegear et la mort de Delphi semblait proche. C’est pour cela que mon ancienne société a choisi de passer de Delphi7 à VisualStudio/C#.

Puis, récemment en surfant, j’ai découvert Oxygene.

Et je me suis dit : “haha, la résurrection de Delphi?”
Ce langage est dérivé de Delphi (comme une nouvelle version en quelque sorte), possède toutes (?) les fonctionnalités du langage C#3 comme Linq, etc.
Mais il ajoute aussi son lot de nouveauté que j’adore :

  • éviter les tests de nullité inutile :

if(truc.parent != null && truc.parent.parent != null)
toto = truc.parent.parent;
// devient
toto = truc:parent:parent;
  • ne pas choisir entre un “for” et un “foreach” car on a besoin d’un compteur

Combien de fois ais-je du ajouter un compteur dans un foreach (et risqué d’oublier le ++) et au final me résigner à utiliser le bon vieux “for”. En Oxygene, le foreach peut gérer l’index :


for each u in Users index i do begin
// et on se sert de i

Maintenant, Oxygene fait du buzz sur le net… enfin surtout “Delphi Prism“.

Finalement, l’IDE de Codegear est abandonné, et Delphi Prism s’intègre à VisualStudio (utilisé comme une application Eclipse RCP).
On retrouve le langage Oxygene, mais aussi un certains nombre de framework pour pouvoir faire des applications multi-plateform à l’aide de Mono.
Et pour faire plaisir aux ex-Delphi-istes, le package inclue une API d’interoperabilité entre .Net et les applications pure Delphi Win32.
Pour plus d’infos : http://www.delphi.org/2008/10/delphi-prism/

Il ne me reste plus qu’à tester tout ça :) Est-ce que ça veut dire que je vais abandonné C# pour revenir flirter avec Delphi?

Publié dans Blabla, Développement. Mots-clefs : , , , . 2 Commentaires »

Mono : nouveau standard ?

Pour ce qui ne sont pas au courant ou qui n’aurai pas vu la vidéo de la PDC, voici l’article d’InfoQ sur Mono.Simd.
J’aime bien le titre “Mono: Going Beyond the Standard”, et c’est de ça que je vais parler…

J’ai posé la question lors de la soirée ALT.Net en présence de Jean-Baptiste Evain, à savoir si on ne va pas se retrouver avec 2 standards : .Net et Mono.
ATTENTION, je ne parle pas des spécifications de la VM ou du langage C#, mais des assembly fournies en standard avec le SDK.

Lisez la suite de cette entrée »

Publié dans Développement, linux. Mots-clefs : , , . Leave a Comment »

Google-chrome rocks!!!

Cela fait du buzz en ce moment, Google sort son navigateur Google-Chrome, et pour l’illustrer l’annonce est faire sous forme de BD!!

Premièrement, j’adore la style “BD”, car comme on le dit : “un schéma vaut parfois mieux qu’un long discours”. Et on comprend tout de suite ce qu’ils veulent dire quand on voit la représentation “imagé”.

J’aime bien donner mon point de vue, et je vais surtout m’attarder sur l’aspect “interface utilisateur” et “Web vs Desktop”.
Lisez la suite de cette entrée »

Publié dans Blabla. Mots-clefs : , , . 1 commentaire »