ReBuild 2015 + Session “Le debug sous Visual Studio 2015”

image

Cette année encore le ReBuild aura lieu à Nantes : Rendez-vous le jeudi 1er octobre au cœur de Nantes pour plus de 40 conférences présentées par des passionnés des technologies Microsoft (Experts, MVP …)

J’y aurais le plaisir de vous présenter une session sur le débogage avec Visual Studio 2015 (ce que vous savez déjà et ce que vous ne saviez pas encore mais que vous serez content de savoir Sourire)

Plus d’informations sur www.rebuild.fr.

Et pour les inscriptions c’est ici : http://bit.ly/1FaAjnD

Au 1er octobre !!

Hyper-V et la configuration des commutateurs virtuels

J’aurais aussi pu intituler ce post : « Le temps passé à essayer de comprendre comment marche la gestion du réseau dans Hyper-V … »

Après avoir reçu mon nouveau PC sous Windows 8.1, je souhaitais me créer des VM (notamment pour des développements et des tests sous Windows 10).

J’ai eu énormément de problèmes entre les notions d’interne, externe, carte réseau, carte réseau héritée jusqu’à ce que Julien Villeneau me fournisse le lien suivant qui m’a réglé tous mes problèmes comme par magie : https://www.credera.com/blog/technology-insights/microsoft-solutions/using-your-windows-8-wireless-connection-inside-hyper-v/ 

 

Autotyper où comment assurer lors de présentations

Si vous avez l’habitude de faire des présentations devant du public et qu’il vous est nécessaire de taper de grandes quantités de texte en direct alors AutoTyper est fait pour vous.

Cette implémentation est librement inspirée d’une idée de Mistu Furuta, présentée par Eric Vernié aux TechDays et surtout au Rebuild 2014 (http://www.rebuild.fr).

Mais Kezako cet outil ?

Cet outil remplace n’importe quelle appui sur une touche du clavier par du texte pré-saisi.
Vous me direz : « Quel intérêt de faire comme ça ? j’ai mon Notepad / OneNote / Evernote / ouvert avec les exemples de code et je fais des Copier / Coller.  » ou bien « Si c’est pour coder dans Visual Studio, préparer tes snippets à l’avance et tu feras pareil ».
Oui mais non : les 2 intérêts de cette application sont :

  1. De ne pas faire d’erreur de saisie (ce qui n’est jamais désagréable quand vous avez déjà à gérer votre stress)
  2. Mais surtout, les participants de votre session voient le texte s’afficher au fur et à mesure que vous tapez (peu importe ce que vous tapez du moment que vous appuyez sur des touches : un singe pourrait très bien faire l’affaire ;))

L’expérience a montré que ce fonctionnement était beaucoup plus didactique pour l’assistance qui arrive à lire et comprendre ce que vous faites à peu près aussi vite que vous tapez. On évite aussi l’effet « Copier / Coller » avec un gros morceau de code / de texte qui apparaît sans avoir le temps de comprendre ce que cela signifie.

Mode de fonctionnement :

Le principe est très simple : une fois l’application lancée, vous pré-remplissez le texte que vous souhaitez taper dans la zone de saisie de l’application. Le lancement du remplacement des frappes sur les touches de clavier se fait ensuite dès que vous aurez coché la case « Enabled ».
Ce remplacement est effectif tant que l’intégralité du texte n’a pas été saisi ou que vous appuyez sur la touche Escape.

Prochaines versions :

La prochaine version permettra de paramétrer une dizaine de blocs de texte en switchant facilement entre ces textes.

Le code en C# est ici complètement disponible, n’hésitez pas à participer si vous le souhaitez :)

TechDays 2015 – Le bilan

Voilà les TechDays 2015 sont terminés. Je n’y ai passé que 2 jours mais voici le bilan que j’en tire :

TL;DR :

“Enormément d’ouverture mais peu de réelles innovations”

Version détaillée

Hormis la première plénière (soporifique à souhait …), l’ensemble des sessions auxquelles j’ai assisté était de très bonne qualité, y compris celles où je n’étais clairement pas à ma place (dédicace spéciale à Julien et la session “La programmation concurrente par flux de données” …).

Premier jour

J’ai pu assister aux 3 sessions sur ASP.Net 5 (qui va avec .Net 4.6 ..), MVC 6 & Entity Framework 7 (suivez la logique de numérotation). J’en retiens :

  1. Une réelle volonté de faire de l’Open Source : Entre la Web API exposée en REST, depuis un PC sous Linux appelant SqlServer via Entity Framework, l’intégration des framework Javascript les plus connus avec Visual Studio 2015 (AngularJS, BootStrap, JQuery)
  2. Le futur du Web selon Microsoft qui se compose
    • D’applications Full Javascript pour la partie IHM
    • D’un Back Office .Net exposant des API en Rest

Ceci donne l’impression que Microsoft se rapproche énormément de ce qui se fait dans le mode Java au sens large et je pense que ce n’est pas une mauvaise chose : on sent bien ici la patte de Satya Nadella et de son credo “Cloud First, Mobile First” où la plateforme de développement n’a finalement peu d’importance.

J’ai terminé cette journée par la session “Coding 4 fun” toujours impressionnante avec son code qui ne sert pas toujours :

  • Comment faire avancer des voitures sur une route en jouant avec le template d’une ListBox en WPF par Mitsu
  • Comment développer un “PonyProxy” pour éliminer du Web toutes les images et textes grossiers par David Catuhe
  • Comment afficher des “tuitts” sur un damier par Etienne Magraff

Un tout petit bémol sur cette session : j’aimais bien aussi l’époque où Mitsu partait de rien pour développer quelque chose sous nos yeux ébahis. Par contre elle est d’ores et déjà disponible sur le replay https://techdays.microsoft.fr/live/default.aspx

Deuxième jour

La plénière avec Nicolas Petit était cette fois ci beaucoup plus intéressante avec encore beaucoup d’ouverture et le “Venez comme vous êtes” de Microsoft (pas celui de MacDo). J’ai apprécié la reconnaissance des erreurs de Microsoft en faisant le parallèle avec la chanson de Nirvana : “Come as you are, as you were, as I want you to be” où justement Microsoft nous proposait de venir chez eux mais un peu comme ça les arrangeait …

Seulement 2 sessions m’ont bien plu sur cette journée :

  • Technologies “web” d’aujourd’hui et de demain. En résumé
    • Aujourd’hui : HTML5, CSS3, SVG, WebGl, Javascript
    • Demain : Améliorations du Javascript et du HTML
  • Présentation Windows 10. En résumé :
    • gratuit pendant 1 an
    • 1 seul OS pour les réunir tous (les matériels)
    • Le retour du menu démarrer
    • L’intégration de Cortana
    • Un déploiement encore simplifié

Et pour finir, le traditionnel “Geek is in da {new} house” présentant tout ce que l’on peut faire en terme de domotique (nourrir son chat, détecter de trop grandes consommations d’eau via une mini caméra branchée sur son compteur …) pour quelqu’un d’un peu geek. Cette session est déjà disponible en replay sur https://techdays.microsoft.fr/live/default.aspx. Allez-y Sourire

Conclusion

Même si le côté Marketing de Microsoft pouvait être agaçant les autres années, il manque cette année des annonces ou démonstrations “Whaou”, quelque chose qui vous scotche au siège et qui vous fait dire “Ca déchire, je ne veux travailler qu’avec ces technos là”. Il n’y a pas eu de grande

Pour finir, le Premier jour petit truc en plus : si possible inscrivez vous avec un mail correspondant à un mail abonné à un compte MSDN, cela vous permet d’entrer en premier dans quasiment toutes les salles …

Ouverture (complète) du code source de la CLR

5752191166_5d28e6ce39_z

Microsoft vient de mettre en ligne l’ensemble du code source de la CLR .Net (incluant le Runtime + classe de base)

Comme annoncé en Novembre 2014 par Scott Guthrie, Microsoft continue sa stratégie d’ouverture : chaque développeur disposait déjà via Visual Studio 2013 Community Edition d’un outil de développement complet et performant, d’un outil de compilation ouvert (Roslyn).

Ce qui est encore plus intéressant est la volonté de Microsoft (avec l’aide de la communauté Mono) de porter aussi le framework sous Linux. J’attends cela avec impatience et la possibilité de développer nativement des applications multi-OS.

N’hésitez pas à aller jeter un coup d’oeil sur le code disponible à l’adresse suivante : https://github.com/dotnet/coreclr.

Côté classes de base (répertoire https://github.com/dotnet/coreclr/tree/master/src/mscorlib/src), on y trouve par exemple les implémentations de :

  • la classe “String” et l’utilisation des Contract permettant d’interagir avec le compilateur et l’IDE
  • la classe “Boolean” avec l’implémentation de la méthode TryParse (et ses différentes optimisations)
  • les classes “int (Int32)”, “long (Int64)”

C’est sympa de voir qu’un certain nombre de pratiques plutôt qualifiées de moyenne sont pas mal utilisées dans leur code :

  • Beaucoup de compilation conditionnelle (normale pour attaquer plusieurs cibles)
  • Beaucoup de code “unsafe” (normal pour les performances)

Pour ceux que ca intéresse, il était déjà possible de rentrer en debug dans le code source du framework. Plus d’infos ici.

Mettre en place du “Call-Back” avec WCF

1459055735_3480b4050e_z

Récemment Julien m’a demandé comment il était possible de mettre un place un système de communication bi-directionnel en WCF. Comme j’avais un peu de temps, je lui ai fais une petite application de démonstration dont je partage avec vous les quelques subtilités.

L’idée est de réaliser une application très basique avec 2 fonctionnalités :

  • n clients se connectant en fournissant leur nom (Abonnement au serveur)
  • 1 serveur capable d’émettre des messages (via la console) à tous ses clients abonnés.

L’implémentation se fait en 3 grandes étapes correspondant chacune à un projet différent

1ère étape : Définir les interfaces de communication (Projet Interfaces)

Comme toujours en WCF, on commence par définir les interfaces de communication.

Il nous faut 1 interface qui corresponde aux échanges du client vers le serveur (Abonnement d’un client) :

[sourcecode language= »csharp » padlinenumbers= »true »]
[ServiceContract(CallbackContract = typeof(ICallBack))]
public interface IServeur
{
[OperationContract()]
void Connecter(string nom);
}
[/sourcecode]

Hormis les traditionnels attributs ServiceContract & OperationContrat, on notera la présence de la propriété CallbackContract permettant de définir l’interface que pourra utiliser le serveur pour rappeler ses clients :

[sourcecode language= »csharp »]
public interface ICallBack
{
[OperationContract()]
void RecevoirMessage(string message);
}
[/sourcecode]

Dans notre cas, le serveur appellera la méthode RecevoirMessage de chacun de ses clients en lui passant le message émis.

2ème étape : Créer le serveur (Projet Serveur)

Côté serveur, on dispose de 2 classes :

  • Program : Gestion de la console et hébergement du serveur via le classique ServiceHost
[sourcecode language= »csharp »]
static void Main()
{
Console.WriteLine("Démarrage du serveur");

Serveur svr = new Serveur();
using (ServiceHost host = new ServiceHost(svr))
{
host.Open();

Console.WriteLine("Entrez un message (‘fin’ pour terminer)");
string msg = null;
while ((msg = Console.ReadLine()) != "fin")
{
svr.EmettreMessage(msg);
// peut être écrit aussi : (host.SingletonInstance as Serveur).EmettreMessage(msg);
}
}
}

[/sourcecode]

A chaque fois qu’un message est tapé sur la console, celui-ci est ré-émis vers tous les clients (Méthode EmettreMessage)

Pour simplifier la configuration du serveur a été faite avec l’outil de configuration WCF accessible via un clic droit sur le fichier app.Config, option “Modifier la configuration WCF” :

image

  • Serveur :
[sourcecode language= »csharp »]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class Serveur : IServeur
{
Dictionary<string, ICallBack> _lstCallBacks = new Dictionary<string,ICallBack>();

public void Connecter(string nom)
{
Console.WriteLine("Connection de " + nom);
_lstCallBacks.Add(nom, OperationContext.Current.GetCallbackChannel<ICallBack>());
}

public void EmettreMessage(string msg)
{
foreach (ICallBack cb in _lstCallBacks.Values)
{
cb.RecevoirMessage(msg);
}
}
}
[/sourcecode]

Ce code présente les particularités suivantes :

  • Présence de l’attribut ServiceBehavior sur la classe avec la propriété InstanceContexteMode positionnée à Single: Le service est alors exposé en tant que singleton. C’est toujours la même classe qui est appelée et qui contient tous les callbacks des clients.
  • _lstCallBacks : la liste des tous les clients abonnés. Chaque instance correspond à un proxy vers le client et a été récupérée pendant la connexion du client via la méthode OperationContext.Current.GetCallbackChannel<ICallBack>().
  • La méthode EmettreMessage se contente ensuite de boucler sur la liste des CallBacks pour émettre les messages vers les clients. C’est la partie techniquement la plus compliquée mais heureusement pour nous, c’est WCF qui se charge de tout Sourire

3ème étape : Créer le client (Projet client)

Pour simplifier la démo (et le déboguage), une seule application a été créée pour simuler 4 clients :

image

2 points importants sur cette application :

  1. La classe CallBack implémentant l’interface ICallBack : c’est la classe qui sera appelée par le serveur. L’objet CallBack côté serveur correspond à un proxy vers une instance de CallBack côté client.
  2. La “plomberie” WCF. Toute l’initialisation est faite par code (et non par paramétrage : je vous le laisse en exercice Clignement d'œil) :
[sourcecode language= »csharp »]
var factory = new DuplexChannelFactory&lt;IServeur&gt;(_lstCallBacks[nom]);
factory.Endpoint.Address = new EndpointAddress(&quot;net.tcp://localhost:12345&quot;);
factory.Endpoint.Binding = new NetTcpBinding();
factory.Open();
var c = factory.CreateChannel(new EndpointAddress(&quot;net.tcp://localhost:12345&quot;));
c.Connecter(nom);
[/sourcecode]

Télécharger le projet

Pour plus de détails, n’hésitez pas à télécharger le projet ici.

Implémentation personnelle des “BigNumbers”

3216290796_18f53fb0fa_b

Aujourd’hui je vous présente une implémentation personnelle (et naïve) des “BigNumbers” démarrée il y a longtemps (sous forme de stage à l’école et repris à mon compte pendant mon temps libre)

“Diagramme de classe” et principe général d’implémentation

Celle-ci se présente sous forme de 2 classes :

  • BigInt : permet de gérer des entiers à peu près aussi grand que l’on souhaite. (En fait, la limitation technique est de 8589934588 chiffres)
  • BigRat : permet de gérer des rationnels sous forme de fractions de BigInt

La base de cette implémentation est l’écriture du nombre en base 10000 avec stockage de chaque “chiffre” (chiffre allant de 0 à 9999) dans un tableau. Je vous accorde que la notion de chiffre est ici discutable : je souhaitais juste reprendre la notion mathématique associée.

Par exemple, 4578965561230 sera stocké en interne sous forme d’un tableau de 4 éléments:

  • Elément 0 : 1230
  • Elément 1 : 6556
  • Elément 2 : 5789
  • Elément 3 : 4

On a bien 4578965561230  = 4 * (10000 ^ 3) + 5789 * (10000 ^ 2) + 6556 * (10000 ^ 1) + 1230 * (10000 ^ 0).

Réécriture des opérations

Ce qui a été intéressant dans cette réécriture, c’est d’optimiser un minimum le code (même si de base l’implémentation n’est pas la meilleure : Cf. dernier paragraphe).

Ainsi le codage de l’opérateur ++ a été optimisé pour être plus efficace qu’un bête “+1”.

Je vous laisse aussi imaginer la réécriture de la division qui est assez facile à poser mais légèrement plus compliqué à écrire (rien d’impossible mais quelques tâtonnements pour les cas “tordus”)

J’en ai aussi profité pour ajouter des méthodes permettant le calcul :

  • de l’ensemble des diviseurs d’un entier
  • du PPCM de 2 nombres (utilisé pour les simplifications de fractions dans les BigRat)
  • du PGCD de 2 nombres

Surcharge des opérateurs

Le deuxième point aussi très intéressant a été de se pencher sur la surcharge des opérateurs : +, –, *, / de manière classique mais aussi ++, –, les opérateurs de comparaison et pour finir les casts explicites ou implicites.

Exemple d’écriture de surcharge d’opérateurs :

[sourcecode language= »csharp » padlinenumbers= »true »]
// Surcharge de l’opérateur *
public static BigInt operator *(BigInt bi1, BigInt bi2)
{
}

// Surcharge de l’opérateur >> (Shift)
public static BigInt operator >>(BigInt bi, int iCount)
{
}

// Cast explicite d’un BigInt vers un double
// Ex : double d = (double) bi;
public static explicit operator long(BigInt bi)
{
}

// Cast implicite d’un double vers un BigInt
// Ex : BigInt b = 10;
public static implicit operator BigInt(long i)
[/sourcecode]

Optimisations à faire

Bien que fonctionnant correctement et avec des performances acceptables, il serait utile de revoir l’implémentation de base pour profiter au maximum de ce que fournit déjà un ordinateur. A ce titre, je pense que la division fonctionne mais n’est pas du tout optimisée.

Une implémentation qui semblerait pas mal serait :

  1. Soit de continuer à utiliser un tableau contenant cette fois des entiers non signés
  2. Soit de passer par un BitArray pour pouvoir manipuler directement tous ces octets

Je pense qu’en passant par une de ces implémentations tous les calculs seraient accélérés : la complexité passerait alors dans l’écriture en base 10 du résultat.

Si vous avez envie de vous y frotter, allez y : le code est disponible sous codeplex : http://bignumbers.codeplex.com Sourire

Ajouter des headers HTTP dans l’enregistrement d’un test sous Visual Studio

12436943915_dd9f34a696_z

J’ai récemment eu à mettre en place des tests de charge sur une application ASP.Net dont une bonne partie des appels se faisait avec de l’Ajax.
Lors de l’enregistrement tout se passait bien mais à l’exécution j’avais systématiquement une erreur d’exécution ASP.Net incompréhensible.

J’ai d’abord mis en cause un paramètre étrange sur mes URLs : elles contenaient tous un paramètre “_” dont la valeur était égale au nombre de millisecondes écoulées depuis le 1er janvier 1970. Après quelques recherches, je me suis rendu compte que ce paramètre était uniquement rajouté par jQuery pour forcer certaines versions d’Internet Explorer à ne pas mettre en cache la requête (Cf. http://stackoverflow.com/questions/2749560/why-does-jquery-ajax-add-a-parameter-to-the-url)

Après comparaison via ce fabuleux outil qu’est fiddler ( et que j’essaierai de présenter un jour …), je me suis rendu compte que les requêtes rejouées ne présentaient pas le header X-Requested-With valorisé à XMLHttpRequest. Une fois ce header rajouté sur toutes les requêtes qui le nécessitait, tout à tourné comme sur des roulettes.

Pour ceux et celles qui ne souhaiteraient pas rajouter ce header sur toutes les requêtes, il existe la possibilité de forcer l’enregistrement via une clé de registre de certains headers lors de l’enregistrement d’un test par Visual Studio.

Tout est décrit (en anglais) sur cette page : http://blogs.microsoft.co.il/shair/2011/02/02/how-to-include-http-headers-in-web-test-recording/

En résumé, voici les points à retenir :

  1. L’outil d’enregistrement des tests web considère uniquement les headers suivants par défaut :
    * SOAPAction
    *  Pragma
    * x-microsoftajax
    * Content-Type
  2. Il est possible de forcer l’enregistrement de n’importe quel header via la clé de registre “HKEY_CURRENT_USERSoftwareMicrosoftVisualStudio10.0EnterpriseToolsQualityToolsWebLoadTest” et la modification de la valeur de « RequestHeadersToRecord(par défaut : SOAPAction;Pragma;x-microsoftajax;Content-Type;Referrer;Accept-Encoding;Accept-Language;User-Agent »)

ReBuild 2014 : Rappel

N’oubliez pas le 2 octobre 2014 : c’est le ReBuild 2014 (déclinaison locale des TechDays)soit :

image

Le Hub Créatic et ses 6600 m2

1 atrium de 215 m2


1  Conférence plénière​

40 Sessions techniques​ (dont une “Coding for fun sous Excel”)

1 concours de développement

15 MVP (Microsoft Most Valuable Profressional) / MSP (Microsoft Student Partner)

38 Speakers

15 Stands partenaires​​

 

Les inscriptions se font ici.

Plus d’informations sur www.rebuild.fr.

ReBuild 2014 : Challenge Docteur Souris

Accueil

Amis développeurs, Nokia vous propose un challenge pour soutenir l’association Docteur Souris dont sa principale mission est de mettre en place les conditions d’accès au loisirs « numériques » pour tous les enfants hospitalisés. A l’heure actuelle, l’association équipe 25 hôpitaux avec plus de 1100 ordinateurs et tablettes fonctionnant chaque jour avec plus de 10 000 enfants qui en bénéficient.

Le challenge consiste à créer une multitude d’applications ludiques à destination des enfants hospitalisés comme des mini-jeux ou des applications de loisirs créatifs. Un seul mot d’ordre : DISTRACTION afin de les faire oublier leur quotidien parfois difficile à supporter.

Les 3 meilleures applications gagneront un Lumia et la remise des prix sera faite lors du ReBuild 2014 au HubCreatic.

Toutes les informations complémentaires sur ce challenge : https://www.dvlup.com/Challenge/61892775-0561-4c57-a24a-94bf4417d264

A vos Visual Studio (ou Xamarin Studio)