Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

En voulant upgrader un hôte Hyper-V de Windows 2012 R2 à 2016, j'ai eu une petite surprise : Les configurations NIC Teaming doivent être supprimées avant l'upgrade et reconstruites après.

Si en plus vous avez la chance d'utiliser cette fonctionnalité avec des switchs managés, il faudra planifier quelques manipulations supplémentaires avant de passer à Windows Server 2016.

clip_image002

Bonnes migrations à vous ;)

Lors des Microsoft Expériences, j’ai eu l’opportunité de présenter avec Pierrick un talk très sympathique sur l’accessibilité : Tout pour mijoter de belles applications UWP accessibles à tous et partout

Comme promis, voici les slides que nous avions présenté Pierrick et moi : https://1drv.ms/p/s!AmH_MyeRP0S6m89eo3Mltck8lPOg0g

clip_image002 Je souhaitais vous faire part de ma joie de recevoir un nouveau MVP Award. Comme tous les ans, je l’annonce avec un peu de retard. Octobre étant toujours un mois très chargé pour moi.

Cette année, je suis passé de l’expertise "Microsoft Azure" à "Visual Studio and Development Technologies".

Merci à Microsoft pour cet honneur, et un

Microsoft Store Services SDK est le nouveau nom du SDK dédié à la monétisation d'applications UWP. Depuis son passage à la version 10.0.0, de gros changements sont à noter :

  • Fin du support Windows 8.1, ce SDK est orienté UWP à 100%.
  • Fin du AdMediatorControl (il faut utiliser le AdControl, la médiation se faisant côté serveur)
  • Il n'est plus utile de télécharger les packages NuGet des annonceurs.
  • Il n'y a plus de configuration des annonceurs dans l'application.
  • Le AdControl est une classe sealed (donc l'héritage est impossible… sniff).
  • Changements de namespaces.
  • Les events du AdControl ne sont pas les mêmes que ceux du AdmediatorControl.

Si comme moi vous aviez codé une classe partagée entre Windows 8.1 et 10 qui héritait du AdMediatorControl, il va falloir revoir votre code en profondeur. Pour les autres, quelques changements de namespace et d'events devraient suffire.

Côté Windows 8.1 : on peut rester sur la version 2.0.8 du Microsoft Advertising SDK for Windows and Windows Phone 8.x (ceci sans changer son code). Ce SDK peut aussi être utilisé pour passer au AdControl. À l'avenir, ce SDK n'évoluera plus. Seules des correctifs se sécurité pourront être apportés.

Bonne mise à jour ;)

Suite à l'update 3 de Visual Studio 2015, Universal Windows Platform est passée en version 5.2. Version qui a le très désagréable inconvénient de ne pas respecter toutes les règles du store, et qui peut provoquer un rejet lors de la publication d'un package.

Le store indique une erreur 1300 (conformément à la capture suivante). Et la documentions sur cette erreur, n'est pas très épaisse… On nous dit juste de préparer un nouveau package avec Visual Studio. A la seconde tentative qui échoue, on peut laisser tomber.

Le sujet à déjà pas mal animé les forums :

https://social.msdn.microsoft.com/Forums/en-US/6cecb739-f41c-4449-9182-54c40e067652/uwp-submission-failed-with-error-code-1300-and-no-appxsym-file-inside-appxupload-package?forum=wpdevelop

https://social.msdn.microsoft.com/Forums/en-US/e766a904-7346-4f76-bad2-852d3b301b0e/known-issue-version-52-of-microsoftnetcoreuniversalwindowsplatform-delisted-all?forum=Win10SDKToolsIssues

Des issues en rapport ont été créées sur GitHub.

https://github.com/dotnet/corefx/issues/9711

https://github.com/dotnet/corefx/issues/9743

 

Si vous avez mis à jour une application UWP cette semaine, une seule solution s'offre à vous pour le moment : revenir à UWP 5.1.

Pour cela, il suffit de lancer la gestion de package NuGet et de sélectionner ses projets et de demander l'installation de la version 5.1.0 (liste version, on sélectionne 5.1.0 et on click sur Install)

La UWP 5.2 a été retirée temporairement, il n'y a donc pas à craindre pour la suite qu'elle revienne avec ces méchants bugs.

Vous avez envie de découvrir l'accessibilité ? Vous voulez vous faire une idée de ce que peut être la vie avec un PC quand on a un handicap ?

Ne cherchez pas midi à quatorze heures. Pour commencer, il n'est pas utile de vous bander les yeux. Il n'est pas non plus utile d'installer cinquante utilitaires sur son PC, ou d'acquérir de couteuses licences.

Commencez en douceur. Choisissez l'un des deux défis suivants et tenez-vous-y une journée :

  1. Utiliser son PC uniquement avec le clavier.
  2. Utiliser son PC uniquement avec la souris.

Saurez-vous tenir une journée sans craquer ?

Note : contrairement à ce que l'on pourrait croire, le fait de se passer de la souris est souvent plus simple que de se passer du clavier.

Ma définition préférée de l'accessibilité c'est : « Simplifier l'accès aux services pour tous ».

Certain préfèreront des tournures plus longues, plus élaborées ou documentées. Personnellement, je préfère en rester à ces quelques mots essentiels qui traduisent toute la difficulté de la chose et son périmètre.

« Simplifier l'accès »

Avec un PC, on a accès à une infinité de possibilités, d'applications et de service. C'est génial. Mais est-ce pour autant simple d'accès ? Pas toujours !

Exemples d'application ou sites, dont l'accès n'est pas simple :

  • Textes écrits en pourpre ou violet sur fond noir (merci le mal de tête).
  • Navigation impossible au clavier. Comment faire si on ne peut pas utiliser une souris ?
  • Navigation impossible avec une tablette.
  • Plan d'accès d'un salon au format timbre-poste de 300x300px (c'est du vécu).

Et si l'on a un handicap lourd, c'est encore plus difficile. Si l'on est aveugle, nombre de sites ou d'applications sont tout simplement inutilisables. Avec un peu de travail, les développeurs pourraient les rendre accessibles.

« Tous »

On est tous concernés. Potentiellement à tout moment de notre vie, on peut se retrouver avec des difficultés pour effectuer une action ou une autre. Ceci peut être le produit d'un accident, d'une maladie, de l'âge.

En France, on associe presque toujours l'accessibilité à un handicap (vue, fauteuil roulant, amputation). Mais il y aussi ces contenus / applications / sites dont le contenu ne parle à personne ou presque. Exemples :

  • La notice de montage d'un meuble suédois.
  • La première déclaration d'impôts (pour certains, les suivantes aussi peuvent poser problème).
  • Les feuilles de paie.
  • …. Etc…

Dans ces cas-là, nous sommes tous en difficulté.

« Service »

Aujourd'hui, l'informatique est là pour rendre des services. En tout cas, c'est que l'on en attend. Quand votre application n'est pas accessible à un utilisateur, elle ne peut lui rendre aucun service. Pire, elle peut donner une mauvaise image de votre société et de votre travail. Il y a de fortes chances que ce ne soit pas ce que vous souhaitiez.

Conclusion

Pour conclure avec l'exemple ultime de ce que n'est pas l'accessibilité, ce serrait :

  • Une déclaration d'impôts rédigée en suédois.
  • Sur une page écrite en pourpre sur fond noir.
  • Avec une notice de 30 pages qui s'affichent dans un encart de 300 par 300 pixels.
  • Avec un bouton « valider » qui bouge dès qu'on l'approche.
  • Le tout étant inutilisable au clavier.

Voilà, en espérant avoir été accessible ;)

Sur de nombreux projets web, j’ai pu voir des personnes être bloquées pour rediriger les utilisateurs vers une page de login personnalisée. Elles avaient monté des authentifications Custom sans Forms. Pourtant, elles utilisaient la configuration de l’authentification Forms pour fixer la page de Login.

Exemple :

<system.web>
  <authentication mode="Forms">
    <forms loginurl="~/Login">
  </forms>
  </authentication>
</system.web>

Ceci n’est pas très élégant et peut compliquer la compréhension de vos intentions : « Authentification Forms, ou pas Forms ???? »

Heureusement, il existe une solution plus élégante : Coder un module de redirection. Ce module aura pour vocation de rediriger l’utilisateur dès que l’accès à une page lui est refusé. Ceci, sans avoir connaissance des processus d’authentification et d’autorisation.

Pour l’exemple, j’ai codé le module suivant :

- Dès qu’une erreur 401 est produite, on redirige l’utilisateur, vers la page de login.

- La page peut être configurée via les AppSettings.

Ce qui donne ceci :

using System;
using System.Configuration;
using System.IdentityModel.Services;
using System.Web;

namespace MyDemo.Modules
{
    public sealed class LoginPageHttpModule : HttpModuleBase
    {
        private const string LoginPageSettingsKey = "LoginPage";
        private const String LoginPageDefault = "~/Login";        
        private String _loginPage;

        /// 
        /// Chargement de la configuration
        /// 
        protected override void InitializePropertiesFromConfiguration()
        {
            // Utilisation des settings, si il sont présents
            _loginPage = ConfigurationManager.AppSettings[LoginPageSettingsKey] ?? LoginPageDefault;
        }

        /// 
        /// Initialisation du module
        /// 
        /// 
        protected override void InitializeModule(HttpApplication context)
        {
            // S'abonner pour connaitres les réponse données aux utilisateurs
            context.EndRequest += Context_EndRequest;
        }

        /// 
        /// Action en fin de request web
        /// 
        /// 
        /// 
        private void Context_EndRequest(object sender, EventArgs e)
        {
            // Test si il y a un refus d'autorisation
            if (HttpContext.Current.Response.StatusCode == 401)
            {
                HttpContext.Current.Response.Redirect(_loginPage);
            }
        }
    }
}

Côté configuration, il suffit d’ajouter le module à la liste des modules web

<system.webserver>
  <modules>
    <add name="LoginPageHttpModule" type="MyDemo.Modules.LoginPageHttpModule, MyDemo"/>
  </modules>
</system.webserver>

Et on peut définir sa page via les settings

<appsettings>
  <add value="~/Login" key="LoginPage"/>
</appsettings>

Voila ! Simple et efficace en WebForm comme en MVC ;)

 
		

Pour faire suite à mon précédent article sur l’update avec Entity Framework, voici une autre une idée qui a la peau dure : “pour supprimer des données avec EF, il faudrait systématiquement aller chercher en base l’entité avec toutes ses propriétés”.

Même si cela à longtemps été le cas, ceci est faux aujourd’hui. Avec EF, on peut effectuer une suppression en un seul DELETE.

Ceci peut se faire en quelques étapes clés :

1. Instancier un objet avec les valeurs voulues. Seul impératif: utiliser la clé primaire de l’enregistrement à supprimer (logique).

// Instanciation de l'entité à supprimer
Customer entity = new Customer
{
    Id = 10// ma clé primaire
};

 

2. Attacher l’entité au contexte de donnée.

// Attacher l'entité au context
_datacontext.Customers.Attach(entity);

 

3. Expliciter le fait que l’entité doit être supprimée.

// Recupération de l'entry et la marquer pour suppression
var entry = _datacontext.Entry(entity);
entry.State = System.Data.Entity.EntityState.Deleted;

 

5. Lancer l’enregistrement des modification, donc l’exeution du DELETE.

// Enregister les modifications
Boolean result = _datacontext.SaveChanges() > 0;

 

Et pour ceux qui voudraient avoir une idée de ce que cela peut donner dans une méthode complette :

public Boolean DeletCustomer(Int32 id)
{
    // Instanciation de l'entité à supprimer
    Customer entity = new Customer
    {
        Id = id,
    };

    // Attacher l'entité au context
    _datacontext.Customers.Attach(entity);

    // Recupération de l'entry et la marquer pour suppression
    var entry = _datacontext.Entry(entity);
    entry.State = System.Data.Entity.EntityState.Deleted;

    // Enregistrement
    return _datacontext.SaveChanges() > 0;
}

Avec MVC, Entity Framework a pris un essort incroyable. Les mauvaises pratiques aussi. Je profite de cet article pour tordre le coup à une idée qui a la peau dure : “pour mettre à jour des données avec EF, il faudrait systématiquement utiliser l’entité avec toutes ses propriétés”.

C’est est faux. Avec EF, on peut effectuer des mises à jour en choisissant les propriétés utiles.

Ceci peut se faire en quelques étapes clés :

1. Instancier un objet avec les valeurs voulues. Seul impératif: utiliser la clé primaire de l’enregistrement à mettre à jour. Le set sur les propriétés n’a pas besoin d’être fait lors de l’instanciation, ceci facilite juste l’écriture.

// Instanciation de l'entité à mettre à jour
Customer entity = new Customer
{
    Id = 10,// ma clé primaire
    Name = "Duc",
    FirtName = "Donald",
    Email = "faux.mail@outlook.com",
};

 

2. Attacher l’entité au contexte de donnée.

// Attacher l'entité au context
_datacontext.Customers.Attach(entity);

 

3. Expliciter les propriétés qui seront modifiées.

// Recupération de l'entry et marquages de propriété à mettre à jour
var entry = _datacontext.Entry(entity);
entry.Property(c => c.Name).IsModified = true;
entry.Property(c => c.FirtName).IsModified = true;
entry.Property(c => c.Email).IsModified = true;

 

4. (optionnel) Désactiver la validation Si on ne modifie pas certaine propriété qui ont des contraintes (ex: une propriété qui ne peut pas être null).

// Désactiver la validation 
// pour ne pas chercher à valider des donnée qui ne font pas partie de l'update
_datacontext.Configuration.ValidateOnSaveEnabled = false;

 

5. Lancer l’enregistrement.

// Enregister les modifications
Boolean result = _datacontext.SaveChanges() > 0;

 

Et pour ceux qui voudraient avoir une idée de ce que cela peut donner dans une méthode complette :

public Boolean UpdateCustomer(Int32 id, String name, String firstName, String email)
{
    // Instanciation de l'entité à mettre à jour
    Customer entity = new Customer
    {
        Id = id,
        Name = name,
        FirtName = firstName,
        Email = email,
    };

    // Attacher l'entité au context
    _datacontext.Customers.Attach(entity);

    // Recupération de l'entry et marquages de propriété à mettre à jour
    var entry = _datacontext.Entry(entity);
    entry.Property(c => c.Name).IsModified = true;
    entry.Property(c => c.FirtName).IsModified = true;
    entry.Property(c => c.Email).IsModified = true;

    // Enregistrement
    try
    {
        // Désactiver la validation 
        // pour ne pas chercher à valider des donnée qui ne font pas partie de l'update
        _datacontext.Configuration.ValidateOnSaveEnabled = false;
        // Enregister les modifications
        return _datacontext.SaveChanges() > 0;
    }
    finally
    {
        // Retour à la normale
        _datacontext.Configuration.ValidateOnSaveEnabled = true;
    }
}

Si existait un concours des fausses idées autour de l’utilisation d’un bloc Try, Catch, Finally en .net, j’en proposerais deux :

1. En cas d’exceptions “très particulières”, On peut sortir d’un Try sans aller dans un Catch générique. Il faut donc coder un Finally et utiliser des variable pour savoir si tout c’est bien passé.

Exemple C# :

// Je déclare des variable
// Je déclare aussi des variable pour savoir si tout c'est bien passé
Boolean toutVaBien = false;
try
{
    // Faire qqchose

    // Fin de qqhcose
    toutVaBien = true;
}
catch(Exception ex)
{
    // Je capture tout
}
finally
{
    // Je corrige mon context car je sais que tout ne s'est pas bien passé
    if (!toutVaBien)
    {

    }
}

Désolé, c’est faux. Si il y a exception, on passera par le catch. Ceci est valable, même si’il y a une exception système (on pourra même savoir ce qu’elle contient). Il n’y a pas d’exception “particulières”, “très particulières”, voir “trop particulières” qui puissent passer à côté du Catch.

Seul cas “possible” : le processus de l’application est coupé. Dans ce cas, le finallly ne sert à rien. Votre application est Off, un point c’est tout Winking smile

 

2. Il faut catcher finement ses exceptions pour avoir de meilleures performances et un impacte moindre sur les ressources système.

Exemple C# :

try
{
    // Faire qqchose
}
catch (MyTypedException ex1)
{
    // J'application la corretion générique
    Corriger();
}
catch (Exception ex2)
{
    // J'application la même corretion générique
    Corriger();
}

Désolé, c’est aussi faux. Ce code n’a aucun impact bénéfique. En plus, faire deux fois la même opération dans deux Catch différents. Ce qui induit une redondance inutile Winking smile

voilà, si vous avez d’autres blagues du genre, il ne faut pas hésitez à les partager.

Parmi les fonctionnalités de 2012R2, il en est une dont je ne pourrai plus jamais me passer. Il s'agit du « Network Interface Teaming ». Pour ceux qui auraient hiberné ces dernières années et qui ne connaitraient pas cette fonctionnalité, voici un lien vers la documentation : NIC Teaming Overview

En voulant configurer cette fonctionnalité avec un switch ProSAFE Plus, j'ai été désagréablement surpris par le manque d'informations techniques fourni par Netgear.

Côté switch, la configuration n'est pas très compliquée. Il faut juste savoir dans quel ordre effectuer les opérations.

Pour débuter, on doit passer par le lien  « LAG » (pour Link Aggregation Group) du menu « System ». Il faut ensuite se rendre sur « LAG Membership » pour sélectionner les ports réseau constituant un group.

Ex : pour le groupe 1, il faut sélectionner LAG ID=1. Pour associer les ports, il suffit de cocher la prise réseau voulue. Ensuite on utilise la commande « Apply ».

 

Pour que le groupe fonctionne, il faut ensuite passer par « LAG Configuration ». Cocher la ligne que l'on veut activer, et sélectionner « Enable » dans la liste déroulante. Puis « Apply ».

Côté Windows Server, Netgear ne permettant pas d'avoir une information technique complète sur la manière dont fonctionne le LAG, on ne peut pas savoir quel mode il faut appliquer au NIC Teaming. Pour arriver à avoir un agrégea de liens qui fonctionne correctement et de manière stable, il m'a fallu y aller au hasard et attendre L.

La logique qui voudrait que « dans le doute » on applique une configuration dynamique (mode LACP) n'a pas été payante. L'agrégat à fonctionné une petite heure avant de planter. Il m'a fallu rebooter le switch à distance pour que le serveur retrouve le réseau.

Le mode à utiliser est donc « Static Teaming ».

Note : le mode de « load balancing mode » ne concernant que le serveur, le switch n'a pas d'impact sur celui-ci.

À l'usage, le lien est stable et performant, que du bonheur ;)

Lors de la préparation d'un package pour le Windows Store, il est important d'avoir une politique de numérotation claire. Dans le cas où l'on prépare des packages pour plusieurs plateformes, ceci est encore plus important, car le store peut vous empêcher de publier votre application.

Pour ne pas se faire avoir, il faut bien saisir les trois règles de base :

  • Les nouvelles versions doivent avoir des numéros de versions plus élevés que les précédentes (logique)
  • Les packages des plateformes les plus récentes doivent avoir les numéros de versions les plus élevés.
  • La numérotation est libre. Il n'y a pas de règle sur les notions : majeur, mineur, révision, build.

Pour ne plus me poser de question, j'ai choisi d'appliquer systématiquement la stratégie suivante :

  • La première composante du numéro de version me sert à noter ma realese.
  • La seconde et la troisième composante me servent à numéroter la plateforme (10, 8.1, 8.0, 7.5 …etc… ). Exemple : Windows 10 devient 10.0. Vu que je commence à ne plus publier pour Windows 8.0, il n'est pas rare que pour Windows 8.1, j'utilise uniquement le numéro 8 sans ajouter de 1 sur le numéro de révision (troisième composante du numéro de version)
  • Le reste me sert en cas d'échec de certification de l'application.

Ainsi, pour une première version, j'aurai :

  • 1.10.0.0 pour une app UWP, donc pour Windows 10
  • 1.8.1 pour la version Windows 8.1 (si je pousse une Universal App avec une version Windows phone, je pousse un numéro de build en plus)
  • 1.8.0 pour la version Windows 8.0
  • Etc…

La version suivante sera alors numérotée :

  • 2.10.0.0 pour une app UWP, donc pour Windows 10
  • 2.8.1 pour la version Windows 8.1 (si je pousse une Universal App avec une version Windows phone, je pousse un numéro de build en plus)
  • 2.8.0 pour la version Windows 8.0
  • Etc…

 

Même si on respecte ces règles, lors de l'upload des packages, il n'est pas rare d'avoir des messages d'information de ce type :

Dans le cas présent, le premier message indique que l'on va remplacer un package. Ceci est donc normal.

Le second message se produit, car j'ai uploadé une version pour Windows 8.1 avant la version pour Windows 10. Le Store fait donc la comparaison entre mon nouveau package et l'ancien. Le message est donc tout à fait normal et disparaitra à partir du moment où j'aurai uploadé la version pour Windows 10.

Pour bien comprendre ce qui se passe à ce moment, il faut regarder en bas de page : on y voit clairement que la version pour Windows 8.1 est à remplacer, mais que la version pour Windows 10 n'a pas encore été uploadée.

Astuce : si on veut pousser une version pour Windows 8.1 sans pousser de mise à jour pour Windows 10, il faut donc jouer avec la dernière composante du numéro de version (la build)

 

Si je pousse le package pour Windows 10, j'obtiens l'affichage suivant. J'ai poussé tous les packages utiles. Je peux publier :

    

Heureux propriétaire d'un Band 2 remplacé par le SAV, je viens de me retrouver confronté à un problème peu ragoutant : l'application Microsoft Health n'arrive pas à joindre le Band. Moralité, le Band est inutilisable.

Heureusement, le problème est connu et l'astuce est toute simple. L'application Microsoft Health a un bug qui fait qu'il est impossible de coupler un Band 2 avec un Windows Mobile 10, si celui-ci n'utilise pas la langue anglaise en version US. Pour coupler son téléphone avec sont Band, il suffit donc de passer sa langue en anglais US, rebooter le téléphone et relancer le processus de couplage.

L'application détecte le Band du premier coup et le couplage peut se faire. Quand le processus est terminé, on peut changer la langue de son téléphone sans problèmes, le Band continu à se synchroniser normalement.

Dans SSIS, la manipulation de champ de type TEXT n’a rien de très compliqué. Étrangement, elle semble en rebuter plus d’un. Pour faciliter la chose, j’ai traduit ma snippet VB.net (oui au début de SSI, comme avec WF, il n’y avait que du VB).

Voici donc les 3 méthodes que j’utilise couramment pour  manipuler un champ TEXT. Dans SSIS, pour ce cas on a un DataType : DT_TEXT avec un CodePage : 1252, ce qui explique les encodages (à adapter en fonction des besoins)

 

Méthode pour lire un Blob et obtenir ne retour une String

///  
/// Lire un blob 
///  
///  
///  
private static String BlobToString(BlobColumn blob) 
{ 
    try 
    { 
        if (blob == null) 
        { 
            return null; 
        } 
        else 
        { 
            Int32 length = Convert.ToInt32(blob.Length); 
            Byte[] data = blob.GetBlobData(0, length); 
            return System.Text.Encoding.GetEncoding(1252).GetString(data); 
        } 
    } 
    catch (Exception ex) 
    { 
        Trace.TraceError(ex.Message); 
        return null; 
    } 
}

Méthode pour écrire une String dans un Blob :

///  
/// Ecriture d'un text dans un blob 
///  
///  
///  
private static void StringToBlob(String text, BlobColumn blob) 
{ 
    try 
    { 
        if (String.IsNullOrWhiteSpace(text)) return; 
 
 
        // Ecriture de la donnée 
        Byte[] data = System.Text.Encoding.GetEncoding(1252).GetBytes(text); 
        blob.AddBlobData(data); 
    } 
    catch (Exception ex) 
    { 
        Trace.TraceError(ex.Message); 
    } 
}

 

En bonus, la variante avec un StringBuilder :

///  
/// Ecriture d'un text dans un blob 
///  
///  
///  
private static void StringToBlob(StringBuilder sb, BlobColumn blob) 
{ 
    try 
    { 
        // Test le StringBuilder 
        if (sb == null || sb.Length <= 0) return; 
 
 
        // Test si on a un text utilisable 
        String text = sb.ToString().Trim(); 
        if (String.IsNullOrWhiteSpace(text)) return; 
 
 
        // Ecriture de la donnée 
        Byte[] data = System.Text.Encoding.GetEncoding(1252).GetBytes(text); 
        blob.AddBlobData(data); 
    } 
    catch (Exception ex) 
    { 
        Trace.TraceError(ex.Message); 
    } 
}

Si votre Band 2 a un petit problème ou défaut matériel, il peut être retourné gratuitement au support Microsoft. Bien entendu, si le problème est autre et qu'il n'est pas couvert par la garantie, des frais peuvent être occasionnés.

Le lien à connaitre pour cela :

https://www.microsoft.com/microsoft-band/fr-ca/support/troubleshoot

Une fois sur cette page, on doit choisir l'option 3, puis se laisser guider jusqu'à l'impression de l'étiquette de retour UPS.

Pour les personnes qui n'arrivent pas à lire le numéro de série du Band, celui-ci est imprimé sur l'étiquette en bas de la boite d'origine du Band (préfixé par SN).

Note : pensez à bien lire les consignes d'emballage et de préparation du Band. Il y est notamment expliqué qu'il ne faut pas utiliser la boite d'origine de celui-ci.

Le Microsoft Universal Ad Client SDK est aujourd'hui en version 2.0.4 et est utilisable avec Visual Studio 2013 et 2015.

Après quelques mois de galère, ce SDK est redevenu stable.

Les bugs présentés précédemment ne sont plus ;)

 

 

Visual Studio 2015 est en mesure de faciliter le déploiement de ses fonctionnalités. On peut par exemple, ne pas installer tout Visual Studio sur un PC pour limiter l'espace occupé sur celui-ci, et déployer les fonctionnalités manquantes le jour on l'en a besoin. Dans la pratique, il a quelques précautions et astuces à connaitre pour que le déploiement se passe bien.

Pour illustrer mes propos, j'ai utilisé un PC sur lequel je n'ai pas déployé toutes les fonctionnalités pour travailler sur UWP. La solution est celle de MyReader, elle contient donc des projets Windows 8.1, des projets partagés et des projets UWP.

A l'ouverture de ma solution, on voit bien que certains projets n'ont pas été chargés. Il s'agit des projets UWP.

 

Pour ajouter les fonctionnalités manquantes et pouvoir travailler avec les projets UWP, il suffit de faire un click droit sur l'un des projets. Ceci affiche le menu suivant.

Astuce 1 : Il est possible que la commande « Install Missing Feature(s) ». Dans ce cas, il faut utiliser la commande « Reload Projet ». Visual Studio tentera alors de recharger le projet. Si la fonctionnalité est bien manquante, la commande « Install Missing Feature(s) » devient visible si on fait à nouveau un click droit sur le projet.

 

Après activation de la commande « Install Missing Feature(s) », la boite suivante va s'ouvrir. On peut alors utiliser le bouton « Install » pour passer à la suite. Et fermer Visual Studio.

Astuce 2 : Il faut impérativement fermer Visual Studio juste après avoir utilisé le bouton « Installer ». Ceci n'est pas indiqué sur la boite de dialogue, il s'agit pourtant d'un impératif pour la suite. Normalement, on a le temps de ferme Visual Studio, avant la fin du SplashScreen suivant :

 

La fenêtre suivante est alors visible. Visual Studio a sélectionné les fonctionnalités manquantes. La liste des fonctionnalités manquantes peut donc varier d'un projet, ou d'un PC à l'autre. On peut utiliser le bouton « Next »

 

Puis « UPDATE »

Astuce 3 : « Next » ou « UPDATE » peuvent ne pas être utilisables. 2 situations peuvent conduire à ce blocage :

  • Vous n'avez pas fermé Visual Studio à temps.
  • Une autre instance de Visual Studio était ou est encore ouverte.

Il faut donc fermer tous ces Visual Studio ouverts (et ne pas hésiter à ouvrir le gestionnaire de tâches pour vérifier si un processus devenv.exe n'est pas en cours d'exécution). Si vous êtes dans ce cas, il n'y a qu'une solution : tout fermer et reprendre le processus au tout début. Exemple : j'ai eu le cas sur une Surface Pro 4 avec core I7, je ne fermais pas assez vite Visual Studio, il a donc fallu que je m'y reprenne à 2 fois pour lancer le processus d'ajout de fonctionnalités.

 

Pour la suite, on peut faire « Next »

 

Puis « Close »

 

Si on ouvre ensuite Visual Studio, notre solution devrait être utilisable.

Astuce 3 : Il est possible qu'un ou plusieurs projets ne soient pas chargés. Ce cas ne se produit pas systématiquement. Pour s'en sortir, il suffit de faire un click droit sur les projets concernés et d'utiliser la commande « Reload Projet ». Par la suite, vos projets seront chargés automatiquement.

 

Ceci est le dernier article de ma série dédiée à Windows to go en environnement virtuel :

BitLocker et Windows to go

Dans le contexte Windows To Go, BitLocker ne peut s'appuyer sur une puce TPM. Ceci est tout à fait logique, le matériel destiné à recevoir votre périphérique Windows To Go changeant régulièrement, vous ne pouvez pas vous appuyer sur celui-ci. Au démarrage, un périphérique Windows To Go a donc besoin que l'on saisisse un mot de passe pour déverrouiller celui-ci.

Concernant la mise en place, le plus sécurisant est bien évidemment de mettre en place le cryptage BitLocker lors de la préparation du périphérique. Le faire faire après ne peut vous garantir à 100% que les données qui étaient déjà présentes sur le périphérique seront sécurisées (ex : utilisation d'utilitaires de récupération de partitions).

La mise en place lors de la préparation du Windows To Go est aussi la plus pratique. Lors de mes tests, il m'est arrivé de ne pas pouvoir activer BitLocker sur un Windows To Go. Il s'agissait d'une version préliminaire de la mise à jour 1511 de Windows 10, je n'ai donc pas cherché plus loin. L'aventure ne m'a cependant pas rassuré sur la fiabilité de l'activation post déploiement. J'ai aussi rencontré un cas où Windows affichait continuellement une icône Warning sur le disque. BitLocker n'a jamais fini de crypter l'intégralité de la donnée. Dans ma grande bonté, je lui ai laissé un bon mois pour faire le job. Cela n'a pas résolu le problème. Sur le même matériel, avec BitLocker configuré lors de la préparation de Windows To Go, tout fonctionnait parfaitement.

 

Contexte des tests

Pour mes tests, j'ai utilisé 3 versions de Windows To Go :

  • Windows 8.1
  • Windows 10 RTM
  • Windows 10 avec la mise à jour 1511

J'ai utilisé deux versions de Windows 10 car Bitlocker a évolué entre la RTM et 1511. Il me semblait donc nécessaire de voir ci cela y avait un impact dans un environnement virtuel. Comme pour mes précédents tests, j'ai utilisé VmWare Player (en version 12 gratuite et payante sur Windows 7), Hyper-V (sur Windows 8.1 et 10)… et j'ai à nouveau donné sa chance à VirtualBox.

Concernant le matériel utilisé, j'ai testé un ensemble varié de clés et disques USB 3. Des matériels tout à fait classiques, sans cryptage matériel (faute de moyens L). Cependant, il m'a été remonté, que ceux-ci n'étaient pas utilisables en VM (merci à Shmuel et Damien)

 

Résultats

Les résultats ont été simples à analyser. Je m'attendais à faire un comparatif des performances entre les différentes solutions. Puis je me suis orienté vers un tableau « Marche » et « Ne marche pas ». Au fur et à mesure de mes tests, je me suis rendu compte que celui-ci devenait totalement futile. Mes tests ont fini par se traduire en une seule et simple phrase :

« Windows To Go avec BitLocker n'a en fait été utilisable que sur Hyper-V »

Au boot, VmWare affiche bien le prompt pour la demande du mot de passe, mais il s'arrête là. Après saisie de celui-ci, VmWare n'arrive plus à utilise le disque. Je ne m'attarderai pas trop sur VirtualBox qui n'aime toujours pas booter sur un disque physique.

Moralité, si l'on ne dispose pas d'un Hyper-V sur son PC, on ne peut pas profiter de l'OS de son PC et du Windows To Go sécurisé en même temps. Il faudra inévitablement booter sur le Windows To Go.

Voici un article que je rêve d'écrire depuis longtemps. Le sujet est assez vaste tout en restant centré sur deux mots qui s'opposent. On peut le constater en permanence dans les entreprises de services : fonctionnel et Technique

  • Est-il justifié de faire une différence entre personnels fonctionnels et techniques ?
  • Un « profile technique » peut-il vraiment échanger avec un « profile fonctionnel » ?
  • Combien de fonctionnels faut-il pour faire tourner en rond un technique ?
  • Combien de techniques faut-il pour faire avaler des couleuvres à un fonctionnel ?
  • Pourquoi considérerait-on systématiquement que fonctionnel et techniques ne sont pas au même niveau hiérarque ?
  • Pourquoi chacun n'en a rien à faire du travail de l'autre ?
  • Pourquoi chacun n'a pas confiance en l'autre ?
  • … etc …

Depuis des années, je suis convaincu que vouloir systématiquement faire un distinguo entre fonctionnel et technique est une absurdité sans nom. Dans la culture française, cela semble normal. Il faut des chefs, et il faut des exécutants. Peu importe si les uns comprennent les autres. La séparation « fonctionnel » contre « technique » me semble venir en grande partie de là.

Malheureusement pour ceux qui pensent ainsi, les « techniques » aussi appelés « techos », ne sont pas des cas sociaux. Ils apprennent, ils réfléchissent, ils ont fait des études. Pire encore, ils ont de l'expérience, et des idées. Si, un techos c'est ça en 2016. Bien évidemment, il y a le techos qualifié de « foncièrement mauvais ». Il ne veut pas de tout cela, et il fait ce métier pour des raisons alimentaires. C'est moche, mas cela existe, et parfois ce peut être due au fait de se faire continuellement bâcher par des fonctionnels (tellement intelligent « eux »). Oui, cette guéguerre futile fait des victimes.

Malheureusement, de l'autre côté du ring, on a voulu rester au même stade de l'évolution. Souvent, les plus expérimentés des fonctionnels ou chefs de projets, sont des anciens profiles techniques qui ont voulu quitter le technique pour s'élever (ou pour ne plus avoir de problèmes techniques à résoudre). Ils rappelleront peut-être parfois ce passé pour assoir leurs décisions. Après quelques années sans pratique, ils seront difficilement crédibles et ne feront qu'alimenter les histoires drôles des techos. Pour les plus jeunes, la voie royale semble être l'école de management (héritière du programme de l'école de commerce). Sur le papier, on y forme les esprits conquérants de demain. Pour quelques un, on offrira une visite chez le dentiste pour rallonger les dents. À d'autres, la faculté de dire « Google est ton ami » et de passer pour des stars. Heureusement, il y a toujours du bon grain parmi l'iveraie.

 

Les méthodes agiles, sauveuses de l'humanité pour les uns, bouc émissaire pour les autres

En 2016, ces les mots « technique » et « fonctionnel » doivent disparaitre de notre vocabulaire ! Il n'y a pas vraiment d'autre solution. Avec l'agilité, de bonnes idées sont arrivées. Leur appropriation et leurs adaptations auraient dû mettre fin à cette séparation. Malheureusement, on le voit bien dans la pratique, certains s'en sont servi pour déstructurer totalement toute notion d'organisation, de délais, et dire que si c'était le bordel, c'était à cause de l'agilité. Ce qui devait conduire à la responsabilisation de tous à conduit à la distension et au « lavage de mains collectif ».

Rien n'est de leur faute. Pire, dans certain cas, j'ai vu des responsables de projets dits « fonctionnels », expliquer qu'ils n'utiliseraient pas l'outil agile, car « trop technique » (ex : TFS et ses requêtes pourtant si pratiques pour suivre et anticiper l'évolution d'un projet). Le technique est devenu l'excuse du fonctionnel et vice versa.

Dans le même ordre d'idées, j'ai vu des « fonctionnels » ne pas vouloir utiliser Test Pro avec TFS, car trop « technique ». Lest tests sont donc fait approximativement, sans forcément suivre un plan de tests complet et sans jamais le reproduire, le tout sans rapport de test, juste un bug…. Comment voulez-vous que vos développeurs arrivent à reproduire les bugs et comprennent le contexte de ceux-ci ?

 

Quel avenir ?

Si on y réfléchit bien. Tant que les entreprises chercheront une compétence sans l'autre, on restera dans la même situation. Heureuses, on peut voir ici et là que les choses changent. De plus en plus d'entreprises cherchent des chefs de projets qui ont un vrai bagage technique, et des architectes qui comprennent les besoins fonctionnels des utilisateurs. Ils leur demandent de produire, assister les développeurs, recueillir le besoin tout en conduisant les projets. On admet enfin que les personnes qui réalisent ont besoin de comprendre ce qu'elles font et pour qui elles le font.

Alors, que va-t'y 'il devenir ce ceux qui veulent rester 100% fonctionnels, ou 100% techniques ?

Le 100% technique n'existe pas, car il réalise un besoin. Quoi qu'il arrive, il doit comprendre ce qu'il fait. Il faut donc enfin admettre qu'il comprend, et qu'il n'est pas qu'un exécutant. Avec le temps, vous vous rendez compte qu'il est frustré de coder des générateurs de fichier CSV pour les utilisateurs, alors qu'il sait leur fournir de vrais fichiers Excel. Si vous êtes l'ermite 100% techos qui code pour lui et non pour répondre à un besoin, vous êtes mal. Vous voulez rester tel un bœuf dans le sillon, cependant vous arrivez au bout de celui-ci. Fuyez ! Il n'y a pas d'issue pour vous L

Le 100% fonctionnel me semble avoir un avenir incertain dans l'entreprise. Comment justifier une charge à 100% toute la journée sur toute la durée des projets, si les équipes sont impliquées et savent s'auto gérer ? Le reporting ne prend plus autant de temps qu'avant. La production des graphes n'est plus aussi chronophage que dans les années soixante. Elle se fait même tout seule aujourd'hui. Et le recueil du besoin n'occupe pas à temps plein. Le fonctionnel « passe plats » ralentissant plus le projet qu'il en le fait avancer, il va falloir s'occuper autrement. Test, hotline, formation… il y a des possibilités. Cependant, le fonctionnel qui n'est pas en mesure de travailler en équipe et qui ne fait que se placer en « chef de » a peut-être du souci à se faire pour son avenir. Le « bore out » est proche.

 

Moralité

Ces deux profils n'existent pas. Ce sont des compétences que chacun doit avoir. On ne peut faire que si on sait faire, et on ne le fait que si on sait ce que l'on fait et pourquoi.

Dites au revoir au « fonctionnel » et au « technique », dites bonjour à « votre équipe » !



Les 10 derniers blogs postés

- Reprise des articles Codes-Sources de 2011 à 2013 par Blog de Jérémy Jeanson le 08-21-2018, 16:08

- Office 365: Modifier les jeux de couleur dans les Thèmes des pages classiques de SharePoint Online par Blog Technique de Romelard Fabrice le 08-08-2018, 17:27

- Office 365: Modifier les jeux de couleur dans les Thèmes des pages modernes de SharePoint Online par Blog Technique de Romelard Fabrice le 07-04-2018, 13:26

- Office 365: Script PowerShell pour fixer le Quota Warning de toutes les collections d’un tenant par Blog Technique de Romelard Fabrice le 07-03-2018, 14:16

- MVP Award 2018-2019 par Blog de Jérémy Jeanson le 07-02-2018, 20:39

- Reprise des articles de 2014 à aujourd’hui par Blog de Jérémy Jeanson le 06-20-2018, 13:00

- Office 365: Comment créer un sous-plan dans Office 365 Planner par Blog Technique de Romelard Fabrice le 06-14-2018, 17:19

- Office 365: Script PowerShell de création de sous-sites basés sur CSOM ou PnP par Blog Technique de Romelard Fabrice le 06-12-2018, 14:58

- Office 365: Comment exporter tous les comptes Azure Active Directory ayant une license via PowerShell par Blog Technique de Romelard Fabrice le 05-17-2018, 13:46

- PowerShell: Comment avoir le Country Name depuis un Country Code par Blog Technique de Romelard Fabrice le 05-17-2018, 13:20