Build 2019 –Top 5 des petits outils innovants pour les dev

All developer things with Scott Hanselman

J’ai assisté à cette session qui avait pour but de donner un peu de visibilité à certains projets ou expérimentations qui n’étaient pas encore suffisamment finalisés ou positionnés pour avoir leurs propres sessions à la conférence Build. C’est Scott Hanselman qui a eu cette bonne idée pour les faire connaitre et récolter rapidement du feedback. Pour certains d’ailleurs, l’engouement de la communauté sera clé pour leur survie.

Voici donc mon top 5 coup de cœur. N’hésitez pas à me partager vos avis et commentaires.

No 1: Try .NET

L’objectif de Try .NET est de vous permettre de proposer du contenu interactif dans lequel le lecteur peut interagir avec du code .NET, le modifier et l’exécuter directement depuis son navigateur. On parle ici d’une exécution locale qui ne requiert pas de communications vers un quelconque serveur qui exécuterait le code et retournerait les résultats! Ce projet utilise la technologie Blazor.

Cela peut sembler anodin écrit aussi simplement mais cette technologie rend possible certains scénarios d’utilisation très intéressants. En voici deux exemples:

  1. Vous vous apprêtez à donner un atelier ou un dojo de formation sur C#. Vous devez prévoir des machines pour les participants, installer Visual Studio sur chacune d’elles, s’assurer que vous avez des licences etc. Avec Try .NET, les choses sont beaucoup plus simples. Tout ce qu’il vous faut, c’est un navigateur web. Les participants l’utilisent pour visualiser le contenu de la formation et écrire les bouts de code qui correspondent à ce qui est demandé dans les exercices. Ils peuvent éditer le code, l’exécuter et valider qu’ils obtiennent bien les résultats attendus.

  2. Vous fournissez une librairie de code via Nuget et vous désirez publier une documentation interactive qui permet à vos futurs consommateurs de découvrir des exemples d’utilisation qu’ils peuvent exécuter live sans avoir à installer ou configurer quoi que ce soit. Mieux encore, ils peuvent modifier les codes exemples et expérimenter votre librairie directement à partir de la page de documentation!

Comment ça fonctionne ?

En tant que fournisseur de contenu, vous écrivez vos documents au format Markdown (MD). Ceux-ci mélangent habillement le texte et des sections de code délimitées par une succession de trois accents graves (« `). Vous pouvez déposer ces fichiers dans un repo Git pour les rendre accessibles à vos consommateurs. Bien que cela n’a pas été explicitement dit lors de la session, j’imagine qu’il sera possible aussi d’exposer ce contenu sur un site. Ci dessous

trydotnet_md
Une section de code imbriquée dans le texte explicatif

En tant que consommateur, vous téléchargez le contenu sur votre poste de travail (git clone par exemple), ensuite vous lancez une invite de commandes, vous vous déplacez dans le répertoire qui contient les fichiers MD et vous exécutez la commande dotnet try. Votre navigateur démarre, effectue son rendu et vous pouvez commencer à lire le contenu et surtout expérimenter le code.

trydotnet_json
Version interactive de la documentation de Newtonsoft.Json dans laquelle vous pouvez directement essayer des codes exemples qui utilisent la librairies!

Comment puis-je l’essayer ?

Try .NET est un projet open source disponible sur Github à l’adresse suivante : https://github.com/dotnet/try

Si vous voulez l’essayer, il y a déjà trois exemples de contenus interactifs. Clonez le repo à l’adresse suivante https://github.com/dotnet/try/tree/master/Samples

En conclusion

Je trouve que c’est un outil fabuleux qui ouvre des perspectives très intéressantes pour offrir du contenu interactif dont le but est d’apprendre, de parfaire sa connaissance ou d’expérimenter .NET. C’est un outil idéal pour les équipes dont la mission est de former, soutenir ou outiller d’autres équipes de développement.

Microsoft va mesurer l’engouement de la communauté pour ce projet. N’hésitez pas à l’essayer et à y contribuer.

No 2 : Le retour (timide) des Windows Powertoys

Si par le passé, vous avez déjà utilisé des Powertoys sur d’anciens systèmes d’exploitation comme Windows 95, NT ou Windows XP, il est probable que vous en gardiez un excellent souvenir. Les powertoys sont de petits outils qui améliorent votre productivité ou votre efficacité. Le genre d’outils pour lesquels on développe rapidement une addiction.

Windows 10 n’a jamais eu de Powertoys officiels… jusqu’à maintenant

Deux premiers ont été présentés. Il n’y a pas encore de quoi pavoiser mais c’est une excellente nouvelle et un bon début.

Le premier se nomme MTND (Ugh!) et permet de déplacer une fenêtre dans un nouveau bureau créé à la volée. Il suffit de laisser le pointeur de la souris au-dessus de l’icône qui permet de maximiser une fenêtre. Après une fraction de seconde, un bouton apparait. Si vous cliquez dessus, la fenêtre est déplacée vers un nouveau bureau et occupe le plein écran.

powertoy_MTND
Permet de déplacer votre fenêtre

Le second se nomme Windows Key Shortcut Guide et permet d’afficher une carte des raccourcis Win + touche du clavier disponibles sous Windows 10. Super utile si on tient compte que la plupart d’entre nous ne connait pas 10% des raccourcis disponibles!

shortcut_guide
La liste des raccourcis Windows apparaît en plein écran

Ils seront open source et disponibles sur Github à l’été 2019 à l’adresse suivante : https://github.com/Microsoft/Powertoys

Actuellement la page README.MD du repo liste les prochains powertoys qui sont au carnet de produit. Je vous laisse le soin de les découvrir!

No 3 : DOS but not DOS

DOS but not DOS est une réécriture complète de l’invite de commandes CMD que nous avons depuis la nuit des temps sous Windows.

Vous allez me dire : « Pourquoi une nouvelle version ? » Hé bien en voici les motivations principales

  • La vitesse d’affichage a été grandement améliorée par l’utilisation de DirectX/DirectWrite. Vous bénéficiez maintenant de l’accélération matérielle de votre carte graphique. À première vue, cela semble étrange d’améliorer la vitesse d’affichage d’une boîte DOS. Mais finalement pas tant que cela: il se trouve que le défilement de texte est pour beaucoup responsable de la lenteur d’exécution de scripts en mode interactif. Pour s’en convaincre il suffit de visualiser l’exécution d’un dir /s sur un répertoire volumineux! Le temps d’exécution dans la nouvelle fenêtre de commande est visiblement plus rapide.
  • L’utilisation de DirectX permet de proposer une fenêtre de commandes avec un look et des fonctions plus modernes : possibilité de zoomer sur le contenu, effets de transparence pour le fond de fenêtre. Rien d’essentiel mais c’est visuellement plus attrayant. Durant la démo, le présentateur a aussi annoncé la venue prochaine d’une nouvelle police de caractères à taille fixe dont le nom est Cascadia Code. La mise à disposition d’une nouvelle police de caractère un événement assez rare qui mérite d’être souligné.

  • Elle s’intègre parfaitement au nouveau Windows Terminal qui propose des onglets dans lesquels on peut ouvrir simultanément plusieurs fenêtres de terminal de types différents comme Powershell, Ubuntu ou encore Azure Cloud Shell

DosbutnotDOS
Pour démontrer la vitesse d’affichage, l’équipe a développé une version de Pong en mode texte avec des émojis

No 4 : Exécutables .NET autoportants

Cette fonctionnalité avait déjà été présentée l’année dernière mais ne s’est toujours pas rendue entre nos mains depuis. Le principe est de produire un exécutable .NET qui contient toutes les dépendances nécessaires à son exécution en ce compris le framework .NET ciblé. L’énorme intérêt est clairement la portabilité de votre application qui s’exécutera aisément sur n’importe quelle machine Windows.

L’inconvénient par contre est que l’exécutable a une taille considérable (168Mb durant la démo). Scott a expliqué que certaines optimisations de type Tree Shaking devaient encore être faites pour éliminer de l’EXE les DLLs du framework qui ne sont pas utilisées par l’application.

Quoi qu’il en soit c’est une fonctionnalité intéressante qui va permettre aux entreprises qui ont de grosses applications Windows Forms ou WPF, de continuer à les distribuer aisément sous Windows 10.

No 5 : Configuration des préférences de nettoyage du code par profil.

Visual Studio 2019 va permettre la configuration de profil de nettoyage dans lequel vous allez pouvoir indiquer quels types de nettoyage de code doivent être exécutés dans tel ou tel contexte. C’est une addition intéressante qui permettra d’adapter le ré usinage en fonction d’un projet, en fonction du fait que vous travaillez sur un projet professionnel ou personnel etc.

cleanup_profiles
L’écran qui permet de configurer les options de nettoyage pour chaque profils

Le présent et le futur de la plateforme .NET

net_robot

Hier j’ai assisté à la présentation de Scott Hanselman et Scott Hunter à propos du roadmap de .NET et des outils de développement. Voici les faits saillants

Commençons d’abord par un constat: je ne me souviens pas avoir vu une seule diapositive à propos du Framework .NET. Une version 4.8 est en préparation mais clairement ce n’est plus là que se passe le show. Aujourd’hui j’ai pu m’entretenir de ce point avec Immo Landwerth qui est le Program Manager de .NET. Il m’a confirmé que pour l’instant il n’y avait pas de plan pour une version subséquente mais que cela ne voulait pas dire pour autant qu’il n’y en aurait plus dans le futur. Clairement le focus est sur .NET Core.

Pas de panique, les bonnes nouvelles s’en viennent 🙂

Tout d’abord .NET se porte très bien. Sur la dernière année, Microsoft a mesuré un gain de 1 millions de développeurs .NET actifs supplémentaires. Ce gain impressionnant peut être attribué à plusieurs facteurs:

  • Le succès grandissant de .NET Core et ASP .NET Core
  • La politique d’ouverture menée par Microsoft incluant le virage open source amorcé par la compagnie
  • Le fait que .NET Core et C# est un duo gagnant en termes de polyvalence. Aujourd’hui .NET Core et C# permettent de développer des applications et services web, des applications consoles et de l’IoT. Très bientôt d’autres types de développement seront supportés. Plus à ce sujet dans la suite de ce billet.

.NET Core 2.1

Fraîchement sorti, .NET Core 2.1 apporte son lot d’améliorations dans le framework proprement dit mais aussi à la périphérie avec Entity Framework Core et ASP .NET Core.

Digne de mention:

  • L’introduction de la classe Span<T> permet d’optimiser les scénarios de transformation de sous-ensemble de données stockées dans des zones de mémoires contigües et ce sans compromis sur la performance.
  • Optimisation des communications réseaux. Des améliorations notables ont été réalisées dans l’implémentation des Socket, des classes HttpClient et SslStream qui permettent de gains de 200% sur certains benchmark, principalement sous Linux.
  • Introduction du Windows Compatibilty Pack qui donne accès à quelques 20 000 fonctions API de Windows complémentaires au lot que .NET Standard 2.0 apportait déjà. Ce pack devrait faciliter la migration d’applications à .NET Core.

.NET Core 2.1 s’immisce aussi dans le développement IoT. Tout d’abord il est compatible avec les processeurs ARM32 ce qui lui permet de s’exécuter sur des cartes électronique ou appareils IoT comme le Raspberry Pi. Il peut aussi s’exécuter sur Ubuntu (>= v18.04), sur la distribution Alpine (>= v3.7) et Windows 10 IoT et dans des containers Linux.

Les téléviseurs Samsung qui embarquent l’OS Tizen 4.0 sont maintenant capables d’exécuter des applications .NET Core. Scott Hanselman nous demande de ne pas coller des stickers .NET Core sur les téléviseurs Samsung présents dans les Showrooms de nos magasins favoris 🙂

Le futur

core30.jpg

La prochaine version majeure de .NET Core sera la v3.0. L’intérêt principal de cette version réside dans le fait qu’elle va élargir notre terrain de jeu puisqu’il sera dès lors possible de développer des applications de bureau (UWP, WinForms et WPF) et des applications d’intelligence artificielle grâce au support du framework ML .NET

Les applications de bureaux

Revenons au support des applications de bureau. C’est une annonce majeure. Non seulement nous pourrons porter nos applications Winforms et WPF vers .NET Core mais aussi nous pourrons les améliorer en exploitant les nouveaux contrôles UWP Fluent Design au travers des XAML Islands. Cela permettra de rendre les applications patrimoniales plus attractives, plus conviviales et mieux intégrées à Windows 10.

Mais ce n’est pas tout: .NET Core offre des gains de performances qui rendent les applications de bureau jusqu’à 2.5x plus rapides. Durant la démo, une application Winforms a été exécuté à la fois en .NET 4.x et en .NET Core 2.1. La différence de performance était clairement perceptible. Cette vélocité accrue pourrait être un autre incitatif à convertir une application de bureau vers .NET Core.

Cerise sur le gâteau, Microsoft planche aussi sur un moyen d’empaqueter une application .NET Core dans une sorte de conteneur applicatif (rien à voir avec les conteneurs Docker je précise) Le conteneur prendra la forme d’un exécutable qui contiendra l’application elle-même, les parties de .NET Core nécessaires à son exécution ainsi que les librairies externes utilisées. L’objectif est de permettre l’exécution côte-à-côte de plusieurs applications utilisant des versions différentes de .NET Core. Dans sa version finale, l’outil de packaging sera capable d’identifier les espaces de noms et références externes qui ne sont pas exploités afin de réduire au maximum la taille du conteneur.

Machine Learning .NET (ML .NET)

ML .NET est un framework de machine learning utilisé en interne depuis plusieurs années chez Microsoft qui se trouve maintenant être out-sourcé. .NET Core permettra d’en tirer parti. Voici l’URL officielle du site collaboratif qui vous permettra d’en savoir plus.

Les outils

Microsoft veut clairement offrir les meilleurs outils de développement quelques soient les langages et plateformes utilisés. 3 IDE sont offerts: Visual Studio, Visual Studio Mac et VS Code.

Voici quelques améliorations de Visual Studio à venir:

  • Amélioration du fonctionnement du test runner de Visual Studio avec des mises à jour asynchrones des résultats de l’exécution des tests alors que ceux-ci sont en cours d’exécution.
  • Possibilité de faire du pas à pas dans le code de librairies Nuget en allant directement télécharger le source correspondant dans le répo Git d’où est issus le composant. Cela est rendu possible par l’introduction de l’URL du répo et de l’identifiant du commit ayant servi à la création du paquet Nuget directement dans le fichier .nuspec
    nuspec_git
  • Prise en charge des fichiers .editorconfig dans lesquels il est possible de définir ses conventions d’écriture de code. Le compilateur Roslyn interprète les paramètres présents dans ces fichiers et vérifie que les conventions sont respectées. Pour chaque règle il est possible d’indiquer le niveau de sévérité associé: ne rien faire, générer un avertissement ou générer une erreur.
  • Les développeurs Web vont finalement pouvoir profiter de fonctions de ré-usinage de code à l’intérieur de pages aspx et razor.
  • VS permettra de construire des images Docker en se passant du projet Docker-compose
  • Une extension de Visual Studio va permettre le support de Kubernetes et le déploiement d’images dans AKS.

La vidéo de cette présentation est maintenant disponible sur Channel 9

 

Sonarqube – Plugin VB.NET Gratuit

sonarLogo

Sonarqube est un outil plus qu’intéressant pour gérer les métriques de code de manière centralisée. Il permet de voir du même coup d’œil les analyses statiques de code de plusieurs langages comme C#, JavaScript, Java et plusieurs autres. Le principal élément d’intérêt dans cet outil est de pouvoir évaluer et quantifier la dette technique d’une application.

Le problème?

L’organisation pour laquelle je travaille était très intéressée par l’outil (bon d’accord, disons que c’était moi plus que les autres…), mais un élément était bloquant pour vraiment évaluer l’outil : l’analyse du langage VB.NET coutait 6000 euros et est maintenant inclus dans un package pour entreprise qui requiert un abonnement. Bref, difficile de valider l’utilité de l’outil quand notre dette réside probablement dans le code patrimonial qui a été fait depuis plusieurs années, principalement en VB.NET.

 

Radin ou ingénieux?

Les motivations derrière la découverte que j’ai faite peuvent laisser place à interprétation mais, en analysant le code du plugin C#, j’ai pu remarquer que l’équipe SonarSource avait publié tous les éléments pour créer notre propre plugin VB.NET sans trop d’efforts. Un bon travail de copier-coller et le tour est joué.

 

Résultat (GitHub)

J’ai placé les sources dans GitHub dans un « fork » du repository de SonarSource que vous trouverez à l’emplacement suivant. J’hésite encore à faire une pull request pour leur proposer de le rendre gratuit pour tous.

https://github.com/karoldeland/sonar-csharp/commit/a1d748832f6fba1a940288450c436a50f63e1088

 

Pour arriver à compiler le plugin VB.NET, juste à suivre les instructions pour le plugin C#. Bonne chance avec Maven ! 🙂

Suis-je seul à trouver ce hack super cool? 🙂

Petits trucs…

J’ai aussi pu intégrer mon nouveau plugin dans TFS 2017 à l’aide des tâches fournies dans le « marketplace ». Toutefois, comme l’exécution des tests unitaires pour tous mes projets étaient conservés dans un fichier unique (C# et VB.NET combinés), on doit faire l’importation du fichier trx par un seul des deux plugins .NET. Pour la couverture de code, on peut importer le même fichier .coveragexml par les deux plugins et tout fonctionne correctement.

Nouveautés de Entity Framework Core 2.0

Qu’est-ce que EF Core ?

EF Core 2.0 est un framework qui permet de faire le lien entre le modèle d’une base de données relationnelle et un modèle orienté objet en mémoire. EF vous affranchit d’écrire le code SQL qui permet de charger des données de la BD vers les objets et d’appliquer les changements apportés à vos objets dans la BD.

EF Core est léger, extensible et portable. Il tourne sous Windows, Linux, MacOs, iPhone, Android et toute la gamme des appareils Windows : Xbox, Windows Phone, Surface etc

La prochaine version à venir est la 2.0. Elle s’appuiera sur .NET Core 2.0. A ce propos, Rowan Miller a été assez clair sur le fait que les efforts d’innovations se concentreront sur Entity Framework Core alors que Entity Framework 6 (disponible uniquement sous Windows et Full framework) bénéficiera uniquement des correctifs nécessaires à son bon fonctionnement.

EF_landscape

Quel avenir pour Entity Framework?

Entity Framework a été introduit pour la première fois avec .NET Framework 3.5. Il y a eu un certain nombre de livraisons depuis et nous sommes maintenant en version 6.1.

Entity Framework cible le Framework .NET et est donc uniquement destiné aux applications Windows. EF Core est une implémentation plus récente qui se base sur .NET Standard et donc destiné à une audience plus large.

Les deux framework continueront leurs évolutions en parallèle. Il n’y a donc pas lieu de paniquer d’autant qu’actuellement il y a 90% d’utilisateurs de Entity Framework pour 10% d’utilisateurs de EF Core.

EF_EFCore

Les nouvelles fonctionnalités

Les fonctions

EF Core introduit un nouveau point d’extensibilité qui sont les fonctions. Les fonctions sont accessibles via une propriété appelée Functions sur l’objet EF. Elles permettent d’utiliser des opérateurs ou des fonctions SQL directement dans une requête LINQ. Microsoft ouvrira le bal avec l’implémentation d’une fonction Like qui correspond au LIKE du langage SQL.

Voici un exemple d’utilisation:

var villes = from v in context.Villes
             where EF.Functions.Like(v.Nom, “%QU”)
             select v

Global query filter

Un filtre de requête global est une expression qu’on peut associer à une entité dans le but qu’elle soit automatiquement injectée à chaque fois qu’une requête SELECT concernant cette entité est exécutée.

Par exemple si dans un contexte de vente, je travaille toujours avec des articles en stock et disponibles à la vente, je pourrai écrire ce qui suit :

public class ContexteVente : DbContext
{
	public DbSet<Article> Articles { get; set; }
	public DbSet<Vente> Ventes { get; set; }
	protected override void OnModelCreating(ModelBuilder modelBuilder)
	{
		modelBuilder.Entity<Articles>()
			.HasQueryFilter(a => a. EstDisponibleVente && a.Quantite > 0);
	}
}

Flexible Mapping

Il arrive parfois qu’une entité possède un attribut qu’il ne fait pas de sens d’exposer au travers d’une propriété publique. Par exemple cet attribut pourrait avoir une utilisation réservée pour le système et on ne désire pas donner la possibilité au développeur de la manipuler. Le flexible mapping fait référence au fait qu’il sera possible de faire le lien entre une colonne d’une table et un champ privé d’une entité.

Dans mon exemple précédent, la propriété EstDisponibleVente est un booléen que je pourrais décider de ne pas rendre accessible en modification. Je pourrais donc dégrader cette propriété publique vers un champ privé et ensuite introduire une propriété conceptuelle dans le modèle pour quand même être en mesure de l’utiliser sous la couverte.

Voici une illustration :

public class Article
{
	bool _estDisponibleVente;
	int Quantite {get; set;}
	//...
}

public class ContexteVente : DbContext
{
	public DbSet<Article> Articles { get; set; }
	public DbSet<Vente> Ventes { get; set; }

	protected override void OnModelCreating(ModelBuilder modelBuilder)
	{
		modelBuilder.Entity<Articles>()
			.Property<bool>("EstDisponibleVente");
			.HasField("_estDisponibleVente");

		modelBuilder.Entity<Articles>()
			.HasQueryFilter(a => EF.Property(a,"EstDisponibleVente") && a.Quantite > 0);
	}
}

Compiled queries

Il sera bientôt possible de compiler une requête LINQ via du code. Vous vous en doutez, l’objectif sera de gagner en performance quand on se trouve à exécuter une requête un grand nombre de fois.

Le processus qui permet de déterminer l’ordre SQL associé à une requête LINQ se fait en 4 étapes :

  1. Construire l’arbre de la requête LINQ
  2. Calculer un hash de l’arbre
  3. Utiliser ce hash pour interroger la cache pour récupérer la requête SQL correspondante
  4. Si la requête SQL n’est pas dans la cache, alors la construire et la placer dans la cache

Les étapes 3 et 4 sont optimales puisque la requête SQL sera construite une seule fois pour plusieurs exécutions. Par contre, dans EF Core 1.1, les étapes 1 et 2 sont répétées à chaque exécution.

La compilation des requêtes permettent de s’assurer que les étapes 1 et 2 ne sont exécutées qu’une seule fois.

Voici un exemple de code qui montre comment précompiler:

private static Func _customerById =
	EF.CompileQuery((CustomerContext db, int id) =>
		db.Customers
		.Include(c => c.Address)
		.Single(c => c.Id == id));
...

using (var db = new CustomerContext())
{
	var customer = _customerById(db, 147);
}

Context pooling

Il s’agit encore là d’une optimisation interne du framework par rapport à l’exécution de requêtes. EF Core 1.1 crée systématiquement un nouveau contexte à chaque nouvelle exécution d’une requête LINQ. Dans 2.0 il sera possible d’activer l’utilisation d’un pool de contextes au sein de l’injecteur de dépendance. De cette manière chaque contrôleur de requête se fera injecter une instance de contexte existante plutôt que dans créer une.

Cette optimisation s’active en appelant la méthode AddDbContextPool sur la classe ServiceCollectionen remplacement d’une appel à AddDbContext.

Durant la démonstration, un test de charge de requêtes LINQ sans pool de contexte donnait à une vitesse de traitement d’un peu plus ou moins 9000 requêtes par seconde. L’activation du pool permettait de monter aux environs de 11200 requêtes par seconde.

Cette optimisation n’est pas active par défaut parce qu’elle pourrait avoir un impact sur votre code. En effet EF Core nettoie l’instance du contexte avant de le replacer dans le pool. Ceci implique que l’optimisation rend impossible l’utilisation du contexte comme un moyen de persister de l’information entre deux requêtes. Pour des scénarios avancés d’utilisation du contexte, l’optimisation ne fonctionne pas!

Ce billet est un résumé de la session donnée par Rowan Miller lors du Build 2017 sur les nouveautés de Entity Framework Core 2.0.