Let There Be Code RSS 2.0
# Thursday, March 22, 2012

image

Si vous n’avez pas encore installé Windows 8 et testé le développement d’applications Metro avec Visual Studio 11, alors le moment est venu !

Microsoft organise au mois d’avril un DevCamp dans 8 villes de France et nous aurons l’occasion de nous croiser dans le sud à Bordeaux (05/04), Toulouse (26/04) et Marseille (19/04).

Au programme de la journée, travaux pratiques sur le développement d’application Windows 8 avec Visual Studio 11, nous sommes là pour vous aider et répondre à vos questions.

L’évènement est gratuit, il vous faut venir avec votre PC et les prérequis installés, Windows 8 et Visual Studio 11, disponible en téléchargement ici : http://msdn.microsoft.com/fr-fr/windows/apps.

Rendez-vous sur le site des DevCamps pour vous inscrire dans votre ville : http://msdn.microsoft.com/fr-fr/devcamp

Thursday, March 22, 2012 4:29:35 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Windows 8
# Friday, February 24, 2012

imageCette année je n’étais pas présent sur le parcours ALM mais sur le parcours Windows Phone.

Du côté ALM, Bewise a présenté un témoignage client, basée sur notre expérience projet avec Airbus. Cette session a été animé par Sacha Leroux (Bewise) et Christophe Vignolle, chargé de diriger les projets liés au marketing et à la vente d’avions chez Airbus.

Bien évidemment le parcours ALM proposait une multitude de sessions : Qualité logicielle, industrialisation, automatisation, tests fonctionnels, lab management... Vous pouviez également découvrir les nouveautés de Visual Studio 11 aux côtés de Florent Santin et Etienne Margraff.

 

Du côté du développement Windows Phone, avec Christopher Maneu nous avons présenter le développement d’une application métier/d’entreprise sur WP7.5. Pendant cette session nous avons démontré que les nouvelles fonctionnalités disponible avec Mango permettent de développer des applications pour les entreprises répondant à leurs contraintes (sécurité, confidentialité, modularité, saisie au Km…). Le tableau ci-dessous résume assez bien les besoins métiers et les API utilisées :

image

 

Et enfin, avec Sébastien Pertus, nous avons présenté l’utilisation d’une base de données SQL CE dans une application WP7.5. L’utilisation d’une base de données SQL CE sur Windows Phone nécessite le développement d’un modèle Linq To SQL en Code First. Nous avons également parlé des problématiques de déploiement, de migration et de synchronisation.

Le contenu des Techdays (webcast, slides) sera disponible courant mars, sur le site http://www.microsoft.com/france/mstechdays. Pour vous divertir je vous conseille fortement de visionner la session Coding4Fun (que l’on ne présente plus) mais également la session “The geek is in da house! Comment se faire la maison du futur avant les autres!” avec un David Catuhe en pleine forme!

Friday, February 24, 2012 11:05:34 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Techdays 2012
# Friday, December 23, 2011

image

Si vous aussi vous rechercher une solution pour effectuer des recherches dans les fichiers de code source de TFS, voici un article qui devrait vous intéresser.

Dans cet article, nous mettons en place une solution d’indexation des source TFS basée sur la recherche Full Text de SQL Server et Team Build.

Friday, December 23, 2011 11:37:38 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
TFS
# Monday, June 27, 2011

imageSuite à la sortie du Kinect Windows SDK, Microsoft France organise demain, mardi 28 juin, un après midi du développement pour vous faire découvrir ce SDK. Alors si vous n’êtes pas encore inscrits, dépêchez-vous, ça se passe par ici.

Je présenterai pour ma part le pilotage d’une scène 3D temps réel avec Kinect.

Monday, June 27, 2011 5:02:28 PM (Romance Daylight Time, UTC+02:00)  #    Voir Commentaires
Kinect
# Friday, March 11, 2011

La problématique est dans le titre : comment peut-on lancer l’exécution d’une build à partir d’une autre ? D’autre part, j’aimerai également que la build maitre, attende la fin de l’exécution de la build enfant, et en fonction de son statut qu’elle s’arrête ou continue.

La première chose à faire est de développer une activité Workflow Foundation qui va permettre de lancer l’exécution d’une build :

  • Créer un nouveau projet de type Activity Library
  • Ajouter les références suivantes : Microsoft.TeamFoundation.Client, Microsoft.TeamFoundation.Build.Client
  • Ajouter une Code Activity. Voici le code de notre activité :
   1:  [BuildActivity(HostEnvironmentOption.All)]
   2:  public sealed class QueueDemoDefinitionBuildActivity : CodeActivity
   3:  {
   4:      private const string TfsCollectionUri = "http://localhost:8080/tfs/defaultcollection";
   5:      private const string BuildDefinitionName = "DemoDefinition";
   6:      private const string TeamProjectName = "Demo";
   7:   
   8:      public OutArgument<IQueuedBuild> Build { get; set; }
   9:   
  10:      protected override void Execute(CodeActivityContext context)
  11:      {
  12:          var collection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(TfsCollectionUri));
  13:          collection.EnsureAuthenticated();
  14:   
  15:          IBuildServer buildServer = (IBuildServer)collection.GetService(typeof(IBuildServer));
  16:   
  17:   
  18:          var buildDefinition = buildServer.GetBuildDefinition(TeamProjectName, BuildDefinitionName);
  19:   
  20:   
  21:          var buildRequest = buildDefinition.CreateBuildRequest();
  22:   
  23:          var queuedBuild = buildServer.QueueBuild(buildRequest);
  24:          
  25:          Build.Set(context, queuedBuild);
  26:      }
  27:  }

 

Le principe est simple :

  • On récupère le service de build depuis la collection de projets.
  • On récupère ensuite la définition de la build.
  • Et enfin on met en file la build via la méthode QueueBuild.

Dans notre activité, on remarque le paramètre de sortie Build de type IQueuedBuild que l’on “set” à la fin de l’activité. Nous verrons par la suite à quoi il va servir.

Il ne reste plus qu’à compiler, à déployer notre assembly dans le source control et enfin d’indiquer au contrôleur de Build où se trouvent notre custom assembly.

Pour illustrer cet exemple, j’ai créé un nouveau template de build xaml dans lequel je fais simplement appel à ma nouvelle activité comme ceci :

image

Pour récupérer le paramètre de sortie de cette activité, il nous faut déclarer une variable au niveau de la séquence :

image

Ensuite dans les propriétés de l’activité QueueDemoDefinitionBuildActivity on récupére le paramètre de sortie dans notre variable :

image

Comme je le disais au début de mon post, je veux que ma build maitre attende le résultat de la build enfant.

Nous avons donc besoin d’une boucle While. Sa condition de sortie est que le statut de la build est soit annulé soit terminé :

image

Dans le Body de cette boucle nous allons ajouter une activité de type Delay, de manière à attendre quelques secondes (ou minutes) avant de revérifier le statut. Nous avons également besoin d’appeler la méthode Refresh sur notre objet IQueuedBuild. En effet les propriétés de notre variable ne se mette pas automatiquement à jour. Un appel à la méthode Refresh est donc nécessaire.

Les 2 activités dont nous avons besoin sont présentes dans la toolbox à cette endroit :

image

Dans l’activité While, on ajoute une activité de type séquence, puis on ajoute les activités Delay et InvokeMethod comme ceci :

image

On paramètre l’activité Delay :

image

Pour l’activité InvokeMethod, il faut indiquer l’objet sur lequel la méthode doit être appelée, en l’occurrence QueuedBuild et le nom de la méthode, Refresh. La méthode Refresh prend en paramètre d’entrée une valeur de l’énumération QueryOptions. Dans les propriétés de l’activité InvoMethod, il est possible de renseigner les paramètres d’entrée et de sortie :

image

Une fois que l’on sort de la boucle, cela signifie que la build est terminée. Mais la propriété Status de l’objet QueuedBuild ne nous dis pas si la build est dans l’état Fail ou Success. Pour celà il faut accéder à la propriété suivante : QueuedBuild.Build.Status. Mais encore une fois il faut appeler la méthode Refresh sur la propriété Build :

image

Et maintenant, on met à jour le statut de la build maitre en fonction du résultat de la build enfant à l’aide d’une activité SetBuildProperties,

image

que l’on paramètre de cette manière :

image

Une fois notre workflow de build terminé, on crée une définition de build basée sur ce template :

image

Avant de lancer l’exécution de la build, il faut vérifier que le service de build à la possibilité d’exécuter plusieurs build simultanément. Si ce n’est pas le cas, lorsque la build maitre va lancer l’exécution de la build enfant, la build enfant va attendre que la première soit terminée pour s’exécuter. Et la première va attendre que la build enfant soit terminée aussi… Donc pour vérifier ça, ouvrir la console d’administration de TFS sur le serveur de Build et vérifier la concurrence des builds au niveau des propriétés du contrôleur :

image

On peut maintenant tester et lancer la Master Build. Si on regarde le log d’exécution, on peut voir notre boucle d’attente pendant que l’autre build s’exécute :

image

Depuis la liste des builds en cours d’exécution on aperçoit nos 2 builds :

image

Et enfin au niveau des résultats, si la build enfant échoue alors la master échoue également :

image

Friday, March 11, 2011 5:19:34 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
TFS
# Friday, March 04, 2011

Le millésime 2011 de la Bewise Day Conference est annoncé pour le 7 avril et se déroulera au casino Barrière à Toulouse.

Vous pouvez d’ores et déjà vous y inscrire depuis le site BDC2011 et suivre l’évènement depuis sa page facebook.

Cette année j’animerai une session sur Windows Azure et vous me retrouverez également sur l’ATE Windows Azure.

Une petite vidéo de teasing où comme souvent dans les vidéos de Bewise nous apercevons notre ami Guillaume L. :

Friday, March 04, 2011 10:16:00 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
BDC 2011

Avec l’un de mes collègues, nous avons récemment eu un débat autour de cette question, que nous avons fini par élucider. Voici le contexte : nous avons une classe A et une classe B, aucun héritage n’existe entre ces 2 classes, par contre nous redéfinissons l’opérateur de cast explicite de cette manière :

   1:  public class B
   2:  {
   3:  }
   4:   
   5:  public class A
   6:  {
   7:      public static explicit operator B(A a)
   8:      {
   9:          return new B();
  10:      }
  11:  }

Une fois que nous avons défini ces 2 classes, il est tout à fait possible d’effectuer un cast entre un objet A et un objet B :

   1:  A a = new A();
   2:   
   3:  B b = (B)a;

 

Maintenant que ce passe-t-il si on instancie une liste d’objets A et que l’on appelle la méthode d’extension Cast<T> comme ceci :

   1:  var list = new List<A>() { new A(), new A() };
   2:  list.Cast<B>().ToList();

 

Et bien à l’exécution, notre opérateur de cast explicite n’est pas appelé. Par contre une exception InvalidCastException est levée. La première réponse que l’on m’a donné était de dire que la méthode d’extension Cast<T> ne fait pas un cast…

Utilisons notre outil préféré (ou presque puisqu’il va bientôt devenir payant… ;)) Reflector. En reflectant la méthode Cast<T>, on peut voir qu’elle fait appel à la classe CastIterator. Celle-ci est tout simplement un itérateur sur notre collection qui dans la méthode MoveNext affecte à l’objet courant l’objet casté :

image

Donc oui la méthode Cast<T> fait un cast… d’après le code C#.  Car en fait, plus précisément, elle fait une opération de type unbox.any, comme le montre le code IL suivant :

image

C’est justement là qu’est notre problème. La classe CastIterator ne connait pas notre type A et elle itère sur une liste de type IEnumerable. Donc pour la classe CastIterator, nos objets sont de type System.Object. A cet endroit, un cast est effectué entre un objet de type System.Object et un type TResult. Du coup il fait un unbox (équivalent à l’opérateur castclass).

Décompilons maintenant le code écrit au tout début de ce post, qui caste notre variable de type A en type B :

image

Nous voyons bien que le compilateur a trouvé notre opérateur explicite et donc l’appelle pour effectuer la conversion.

Pour reproduire ce qu’il se passe au niveau du CastIterator, il suffit d’écrire ceci :

   1:  A a = new A();
   2:   
   3:  object o = a;
   4:   
   5:  B b = (B)o;

Et ici, le compilateur fait appel à l’opérateur castclass et non à notre opérateur de cast explicite :

image

Pour palier ce problème nous avons 2 solutions. La 1ère consiste à effectuer le cast soit même dans un Select :

   1:  var list = new List<A>() { new A(), new A() };
   2:  var result = list.Select(a => (B) a);

La seconde solution consiste a utiliser le mécanisme de Reflection pour retrouver l’existence de l’opérateur. On peut ainsi définir la méthode d’extension suivante :

   1:  public static class EnumarableExtensions
   2:  {
   3:      public static MethodInfo GetMethod(Type toSearch, string methodName, Type returnType, BindingFlags bindingFlags)
   4:      {
   5:          return Array.Find(toSearch.GetMethods(bindingFlags), delegate(MethodInfo inf) { return ((inf.Name == methodName) && (inf.ReturnType == returnType)); });
   6:      }
   7:   
   8:      public static IEnumerable<T> DynamicCast<T>(this IEnumerable list)
   9:      {
  10:          foreach (var obj in list)
  11:          {
  12:              Type ot = obj.GetType();
  13:              MethodInfo meth = GetMethod(ot, "op_Implicit", typeof(T), BindingFlags.Static | BindingFlags.Public);
  14:   
  15:              if (meth == null)
  16:              {
  17:                  meth = GetMethod(ot, "op_Explicit", typeof(T), BindingFlags.Static | BindingFlags.Public);
  18:              }
  19:   
  20:              if (meth == null)
  21:                  yield return (T)obj;
  22:              else
  23:                  yield return (T)meth.Invoke(null, new[] { obj });
  24:          }
  25:   
  26:      }
  27:  }

Et notre appel se fait ainsi :

   1:  var list = new List<A>() { new A(), new A() };
   2:  var result = list.DynamicCast<B>();

 

Et voilà un mystère d’élucidé! :)

Friday, March 04, 2011 7:00:00 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
C#
# Thursday, March 03, 2011

imageAvec Entity Framework, et les outils de mapping objets relationnels de manière générale, les développeurs écrivent facilement des requêtes Linq To Entities sans savoir le SQL qui est réellement exécuté côté serveur.

On perd la maitrise du SQL exécuté, et ceci peut faire peur à nos chers administrateurs SQL. Dans cette article je vous propose de comparer les plans d’exécution des requêtes générées par Entity Framework et des requêtes que nous aurions écrit à la main.

Thursday, March 03, 2011 10:48:38 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Entity Framework 4.0 | SQL Server
# Friday, February 04, 2011

imageLabs est un site dédié aux technologies Microsoft dont le but est de partager nos connaissances et notre passion.

Vous y retrouverez tous les articles, projets, KB, études de cas ainsi que les blogs des consultants de Bewise.

N’hésitez pas à nous envoyer vos retours.

Friday, February 04, 2011 9:00:00 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Bewise
# Tuesday, February 01, 2011

Capture J-7 avant l’édition 2011 des Techdays. Je serai au rendez-vous et j’animerai avec Alain Marty la session TFS Basic sur le parcours ALM.

Vous pourrez également me croiser du côté des exposants et des partenaires Inner Circle et Azure Circle toute la journée du 8 février.

Pour retrouver tous les speakers Bewise c’est pas .

Tuesday, February 01, 2011 2:20:45 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Techdays 2011
Archive
<May 2012>
SunMonTueWedThuFriSat
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2012
Benoît Laut
Sign In
All Content © 2012, Benoît Laut
DasBlog theme 'Business' created by Christoph De Baene (delarou)