Passage sous Windows 10–Problèmes avec le Wifi

Je viens de passer mon PC sous Windows 10 (en migration et donc sans réinstaller tout) et tout s’est globalement bien passé à l’exception de la gestion du Wifi.

Au début, mon réseau Wifi n’était reconnu qu’après un reboot complet de la machine et puis au fur et à mesure je n’ai plus eu du tout d’accès au Wifi ce qui, pour un portable, est assez dommage (Merci la clé Wifi USB en attendant :) ).

D’après Internet, la principale cause de ce problème très courant provient de la présence d’un client VPN sur le Windows précédent : ce qui n’était pas mon cas.

Le plus étrange, c’est que les réseaux reconnus dépendaient des box : pas de problèmes pour reconnaître les LiveBox, SfrBox, NeufBox des voisins mais impossible de retrouver mon réseau Freebox.

Après plusieurs (longs) coups de fil et échange de mail avec le support de Dell, j’ai trouvé une solution qui semble marcher en modifiant le paramétrage de ma Freebox et en basculant le canal primaire du Wifi en « Canal automatique » (auparavant positionné sur 12 …). Cet écran se trouve dans le menu « Mode avancé » / « Wi-Fi » / « Configuration Radio » :

configWifiEt depuis tout marche comme sur des roulettes Sourire

J’attends tout de même un retour du support de Dell pour savoir comment faire l’équivalent côté Windows au cas où ceci se reproduirait avec d’autres réseaux …

 

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/ 

 

OVH & Office 365

Je viens d’acheter un compte Office 365 et je galèrais pour modifier les entrées DNS demandées par Microsoft (Je n’ai pas encore prévu de migrer mon compte Exchange chez eux …)

Côté Microsoft, les instructions (ajout d’enregistrement MX, TXT, SRV, CNAME) sont relativement claires (notamment sur les valeurs à saisir).

Côté OVH, ca a été plus laborieux, notamment parce que la plupart des copies d’écrans sont faites via l’ancien Manager… J’espère donc que cet article pourra vous aider à faire cette configuration.

Préparation

Quelque soit les informations à renseigner,il faut d’abord :

    • Se connecter à la console de gestion OVH
    • Basculer en mode « Expert »
    • Cliquer sur l’onglet « Zone DNS »
Enregistrement MX

D’après ma compréhension, cette étape sert à Microsoft à valider que vous avez bien la main sur les enregistrements DNS du domaine (utile pour la prochaine étape). Le résultat final est le suivant :

Le nom de domaine doit être suivi d’un point et la partie en jaune correspondant à l’information qui vous est donnée par Microsoft.

Enregistrement CNAME

Pas de particularités, le résultat est visible ci-dessous :

Enregistrement SRV

Voici la correspondance entre la terminologie d’OVH et celle de Microsoft :

  • Domaine : « service ». »protocole ». »domaine ».
  • TTL : TTL
  • Cible : « Priorité » « Poids » « Port » « Cible ».

Pour le domaine et la cible, ne pas oublier le « . » à la fin.

Voici notamment un lien qui m’a aidé à trouver la partie enregistrement SRV mais avec une ancienne console de gestion OVH : http://www.sedan-tech.com/configurer-les-enregistrements-dns-de-microsoft-office-365-chez-ovh/ .

Bon courage pour configurer votre Office 365 :)

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.

OneNote 2013 – Impossible de synchroniser un bloc-notes

Je suis toujours aussi fan de OneNote mais j’ai récemment eu un problème lors de la synchronisation avec mon compte OneDrive. Le symptôme est assez simple : lors du lancement de OneNote, le message suivant s’affichait systématiquement :

image

J’ai eu beau “Cliquez ici” comme le message m’invitait à le faire, je n’ai jamais pu avoir de fenêtre me permettant de re-saisir mon mot de passe.

Il semblerait que ce soit un problème connu qui peut arriver lorsque votre PC se met en veille. D’après Microsoft cela peut aussi arriver dans les cas suivants :

  • Ce problème peut se produire si vous n’avez pas installé les dernières mises à jour.
  • Vous n’êtes peut-être pas la dernière version de l’Assistant de connexion Windows Live.
  • Ce problème peut être provoqué par un conflit avec plusieurs ID Live.

Pour corriger cela, il suffit d’appliquer la méthode 3 présentée ici, c’est à dire “Supprimer les informations d’identification depuis le Gestionnaire d’informations d’identification Windows Live ID”

Sous Windows 7, la manipulation consiste à :

  1. Ouvrir le panneau de configuration :
     image
  2. Cliquer sur “Comptes d’utilisateurs”
    image
  3. Cliquer sur “Gérer vos informations d’identification”
    image
  4. Sélectionner l’identité correspondant à votre OneDrive (En général, elle s’appelle nom.prenom@mail.com (Identité Windows)” ) et cliquer sur “Supprimer de l’archivage sécurisé”
  5. Relancer OneNote et maintenant vous pouvez à nouveau saisir vos informations de connexion à OneDrive

Amusez-vous bien :)

Cliquer sur “Gérer vos informations d’identification”

Comment vider le journal de transactions d’une base de données en “Simple recovery Model”

12630279973_b2c2c9a7b7_z

Récemment,  j’ai eu besoin de vider complètement le journal de transactions d’une base de données pour cause de manque de place disque disponible (disque taillé au plus juste comme d’habitude Sourire)

 

Quelques rappels sur la notion de “Recovery Model” (Mode de récupération en bon français)

La gestion du journal de transactions est en effet très liée au mode de récupération.

Les 2 modes possibles sont :

  • Simple Recovery Model (simple) : Recycle automatiquement l’espace du journal afin de minimiser l’espace nécessaire. Dans ce mode et en cas de crash de la base, il n’est possible de récupérer les données que depuis la dernière sauvegarde.
  • Full Recovery Model (complet) :  Exige des sauvegardes du journal. Dans ce mode, l’ensemble des transactions faites depuis la dernière sauvegarde sont conservées dans le journal. Ainsi, en cas de crash, il suffit de repartir de la dernière sauvegarde puis de rejouer l’ensemble des transactions pour retrouver la base dans son état d’origine

Plus de détails, sur cette page.

Purge du journal des transactions pour une base “Full Recovery model”

Si vous avez bien lu plus haut, vous avez deviné qu’il suffit d’effectuer une sauvegarde de la base et du journal de transactions pour le tronquer.

Purge du journal des transactions pour une base “Simple Recovery model”

D’après la documentation (du moins de ce que j’en ai compris) il n’y a normalement rien à faire pour gérer le journal, celui-ci s’auto-nettoie (telle une pyrolyse sur un four moderne).

L’expérience a montré que ce n’est pas complètement vrai. Dans mon cas, le problème s’est souvent produit lors de la restauration d’une base de données de production sur un environnement de développement (probablement lié au passage d’un mode “Full” à un mode “Simple” ?).

2 manipulations sont à tenter pour la purge :

  1. Réduction de la taille du fichier journal par un DBCC SHRINKFILE
  2. Suppression et recréation de ce fichier journal

Réduction de la taille du fichier journal par un DBCC SHRINKFILE

Tout d’abord il est nécessaire d’affichage l’occupation du journal des transactions par la commande suivante :

Qui va vous donner ce genre de sortie :

C’est la colonne “Log Space Used (%)” qui va nous intéresser : celle-ci nous donne le pourcentage d’espace occupé dans le journal des transactions. Un nombre proche de 100% signifie donc que le journal des transactions est quasiment plein et qu’il est temps de le vider un peu (sauf si vous avez activé l”autogrow” du journal, mais même dans ce cas, votre disque peut être taillé trop petit).

Ce vidage se fait via la commande :

En cas de doute, le nom du journal est peut être récupéré par la commande :

Il vous suffit ensuite de ré-exécuter un DBCC SQLPERF(logspace) pour s’assurer que de la place a été libérée.

Suppression et recréation de ce fichier journal

Dans le cas où la commande précédente a échoué, il reste la méthode dite “bourrin” : celle-ci consiste à recréer un journal de transactions de 0.

Toutes ces manipulations se font depuis “Sql Server Management Studio”

Pour cela il faut commencer par détacher la base de données (Bouton droit, “Propriétés” sur la base de données) :

image

Pensez à supprimer toutes les connections existantes :

image

Important : c’est ici, qu’il ne faut pas oublier de supprimer physiquement (ou de renommer au cas où) le fichier journal. Généralement le fichier s’appelle “base”_log.ldf.

Il faut ensuite ré-attacher la base (“joindre” en français) :

image

Sur l’écran suivant, cliquer sur “Ajouter”, choisir le fichier “mdf” correspondant à votre base.

Sélectionner ensuite le fichier journal puis cliquer sur “Supprimer”.

image

SqlServer ne trouvant pas le fichier journal, il le recrée de 0. Notez le résultat sur la dernière base de données avant / après :

image

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.