Configurer son Visual Studio Code pour React

Dans cet article, je vais me concentrer sur une liste d’extensions pour Visual Studio Code indispensables pour les développeurs React / JavaScript afin d’accélérer votre vitesse de développement.

Visual Studio Code ou VS Code est l’un des éditeurs de code le plus populaire à l’heure actuelle ; gratuit, léger et open-source, il particulièrement optimisé pour le développement d’applications Web. En outre, il fournit des fonctionnalités indispensables telles qu’IntelliSense, qui n’étaient auparavant disponibles que dans des IDE lourds comme Eclipse ou Visual Studio 2017.

Le succès de VS Code comparé à d’autres éditeurs comme Atom, Sublime Text provient entre autres de son « Marketplace » qui permet de personnaliser son éditeur à ses besoins et ses projets. Ainsi grâce à la communauté open-source, l’éditeur prendre en charge presque tous les langages de programmation, framework et technologies de développement et propose de nombreuses librairies et outils.

Cette liste d’extensions reflète l’état actuel de l’écosystème des extensions VS Code de fin 2019. Elle est construite autour des mes expériences professionnelles et n’est en rien exhaustive. Je vous encourage à la compléter et de partager vos extensions les plus utiles en commentaire !

Import Cost

Cette extension affichera dans l’éditeur la taille du paquet importé. L’extension utilise webpack avec babili-webpack-plugin afin de détecter la taille importée.

blog ai3 import-cost Configurer son Visual Studio Code pour React

Une très bonne extension pour prendre conscience de la taille des librairies que l’on importe dans nos projets et faire des meilleurs choix afin d’améliorer performance et responsivité de nos applications web.

JavaScript (ES6) code snippets

Si vous souhaitez améliorer votre vitesse de développement et en avez marre de réécrire les mêmes choses, cette extension est faites pour vous !

Cette extension vous rajoute des raccourcis clavier pour écrire plus vite du code répétitif en Javascript / React comme les constructeurs, les imports et exports, la déclarations de fonctions anonymes, etc.. . La liste des raccourcis est très complète et vous offre une vraie marge de progression pour l’accélérer vos développements.

blog ai3 image-3 Configurer son Visual Studio Code pour React
Exemple de raccourcis proposés par JavaScript ES6 code snippets

TsLint

Un Linter est un outil qui analyse statiquement du code et vérifie que celui-ci respecte un certain nombre de règles.

L’intérêt est multiple :

  • Vous êtes assuré de la constance du code, qu’il s’agisse de bonnes pratiques ou de considérations plus esthétiques : autant de points plus ou moins triviaux dont vous n’aurez plus à vous soucier directement.
  • Vous êtes toujours à jour sans avoir à faire d’effort, les mises à jour du Linter prenant en considération les évolutions des bonnes pratiques de développement.
  • En cas d’erreur de syntaxe dans votre code, l’analyse statique de ce dernier échouera, et l’erreur en question vous sera remontée : c’est un garde-fou supplémentaire

Cet outil est très simple à mettre en place et assure une bonne qualité de votre code. Un outil indispensable ! 

Path Intellisense

Ce plugin complète automatiquement les noms de fichiers permettant d’économiser de précieuses seconde ; qui bout à bout se transformeront vite en heures économiser !

blog ai3 path-intellisense Configurer son Visual Studio Code pour React

Au premier abord, ce plugin ne semble pas extraordinaire ou d’une grande importance mais une fois désinstallée on remarque très vite son absence.

GitLens

GitLens surcharge les fonctionnalités de Git intégrées à Visual Studio Code. Il vous aide à visualiser l’auteur du morceau de code en un coup d’œil via des annotations, de naviguer et d’explorer de manière transparente dans vos répertoires Git, d’obtenir de précieuses informations grâce aux puissantes commandes de comparaison.

blog ai3 gitlens-preview Configurer son Visual Studio Code pour React

Prettier

Prettier est un formateur de code. Contrairement au litter, ce plugin ne s’occupe que de la partie esthétique du code, il assure un style/mise en page cohérent en analysant votre code et en le réimprimant avec des règles que vous aurez configurées comme par exemple la longueur de ligne maximale, la taille d’une tabulation etc…

Très pratique si vous êtes sur un projet avec de nombreux développeurs, car il permet à chacun de coder comme il le souhaite sans avoir à porter d’attention à la mise en page puis le code est réagencer pour assurer une lecture et une compréhension plus consistante du code pour l’ensemble de l’équipe.

Debugger for Chrome

Extension permettant de déboguer votre code JavaScript directement depuis VS Code avec le navigateur Google Chrome ou d’autres navigateur prenant en charge le protocole Chrome DevTools ; remplaçant ainsi le débogage un peu pénible depuis l’inspecteur dans la console de Chrome.

blog ai3 demo Configurer son Visual Studio Code pour React

Peacock

Modifiez subtilement la couleur de votre espace de travail. Idéal lorsque vous avez plusieurs instances de code VS et que vous souhaitez identifier rapidement laquelle est laquelle.

blog ai3 peacock Configurer son Visual Studio Code pour React

Bracket Pair Colorizer

Cette extension permet d’identifier les parenthèses et accolades correspondantes avec des couleurs. Ce qui permet d’accélérer la lecture du code.

blog ai3 consecutiveExample Configurer son Visual Studio Code pour React

Voici un petit exemple avant / après l’application de l’extension. Le changement est subtile mais une fois adopté, il est difficile de s’en séparer !

blog ai3 image-1-1024x407 Configurer son Visual Studio Code pour React
Avant – Après

Implémenter un service Windows avec TopShelf

Un article de Benoit Benardin

Lors de l’implémentation d’une tache de fond, se pose toujours la question Console App + Schedule ou Service Windows. L’un est plus facile développer car plus facile à débugger, l’autre apparait plus propre et plus en accord avec une solution d’entreprise.

Mais saviez-vous que ce choix est obsolète avec des librairies comme TopShelf ?

blog ai3 astonished Implémenter un service Windows avec TopShelf

Le but de ce post sera justement de vous montrer cela avec un petit tuto.

  • On commence par créer un projet Visual Studio de type Console Application

blog ai3 topshelf1-300x240 Implémenter un service Windows avec TopShelf

  • On ajoute les package Nugget suivant:
    • TopShelf
    • TopShelf.Log4Net   

blog ai3 topshelf2-300x116 Implémenter un service Windows avec TopShelf

blog ai3 topshelf3-300x80 Implémenter un service Windows avec TopShelf

  • On crée une classe pour héberger notre service Windows : MyService.cs
    • Puis on rajoute 2 méthodes: Start() et Stop().
    • Ce sont ces méthodes qui seront appelées au démarrage et à l’arrêt du service.

blog ai3 topshelf4-300x150 Implémenter un service Windows avec TopShelf

  • Ensuite on crée une classe statique pour héberger la configuration de TopShelf : ConfigureService.cs
    • Il faut rajouter une méthode Configure().
    • C’est dans cette méthode que l’on décide du nom du service, du compte utilisé et qui appeler au démarrage et à l’arrêt du service
    • Il est donc normal de l’on fasse appel à notre classe de service aux méthodes Start() et Stop() créées précédemment.

 

blog ai3 topshelf5 Implémenter un service Windows avec TopShelf

  • Reste à rajouter dans le Program.cs de notre console application, l’appel à la configuration de notre service dans la méthode Main.

blog ai3 topshelf6-300x89 Implémenter un service Windows avec TopShelf

A ce niveau, nous avons un service fonctionnel et pour le tester, nous avons 2 choix :

  • Presser F5 pour le débugger comme l’importe quelle Console App

blog ai3 topshelf7-300x199 Implémenter un service Windows avec TopShelf

  • Le déployer en service Windows en ouvrant une commande (CMD) en administrateur local et en naviguant vers le .exe de notre app compilée :

blog ai3 topshelf9-300x63 Implémenter un service Windows avec TopShelf

  • Puis :
    • Utiliser la Commande « DemoTopshelf.exe install » pour créer le service windows et l’installer

blog ai3 topshelf8-300x159 Implémenter un service Windows avec TopShelf

    • Ou « DemoTopshelf.exe uninstall » pour le retirer

blog ai3 topshelf10-300x195 Implémenter un service Windows avec TopShelf

Voila ! Le meilleur des 2 mondes servi sur un plateau : il y a rien de plus facile que de débugger une console APP et lors du déploiement la commande pour transformer notre projet en service windows est des plus simples !

 

*Applaudissement*, *Standing Ovation*, *Jet de fleurs*

 

Mais on ne va pas s’arrêter là… On va pousser un peu plus loin. Il nous faut de quoi logguer (obligatoire pour un service Windows et tous les projets en général…. hein….. à bon entendeur …. )

blog ai3 suitknockout Implémenter un service Windows avec TopShelf

Vous avez remarqué qu’on a rajouté le package nugget TopShelf.Log4Net ? Il s’agit du package d’une des solutions de log les plus connue, adaptée à TopShelf. Et vous allez voir, l’intégration est vraiment simple:

  • Pour notre exemple, on commence par rajouter un fichier à notre projet : log.config. Ce fichier va héberger la configuration de Log4net. C’est pour l’exemple, vous êtes pas obligé de faire comme cela chez vous.

blog ai3 topshelf11-300x183 Implémenter un service Windows avec TopShelf

  • N’oubliez pas dans les propriétés du fichier de configuration de dire à Visual Studio de copier le fichier dans le dossier d’Output

 

  • Reste à retourner dans la classe de configuration de notre service : ConfigureService.cs et rajouter la ligne pour configurer Log4Net via notre fichier log.config

blog ai3 topshelf12-300x174 Implémenter un service Windows avec TopShelf

  • Et enfin de faire notre petite classe de logger.

blog ai3 topshelf13-300x133 Implémenter un service Windows avec TopShelf

Done ! Vous avez un console app facile à débugger, qui se transforme en service Windows à la demande. Le tout avec le mécanisme de log qui va bien.

blog ai3 topshelf14 Implémenter un service Windows avec TopShelf

Si besoin, la petite application de démo est disponible ICI

Docker, buller c’est l’avenir !

Le 30 Mai dernier, Gabriel Ivanes (consultant chez Ai³) organisait une Tech’ Session sur Docker. Selon Wikipedia : « Docker est un logiciel libre qui automatise le déploiement d’applications dans des conteneurs logiciels. Selon la firme de recherche sur l’industrie 451 Research,  » Docker est un outil qui peut empaqueter une application et ses dépendances dans un conteneur isolé, qui pourra être exécuté sur n’importe quel serveur Linux » ». Ce concept révolutionne le monde du développement et de l’applicatif. Pour en savoir plus, voici cette Tech’ Session co-animée par Stéphane (de Docker).

Microservices : KISS for all !

Le 14 Mai dernier, Gabriel Ivanes (consultant Ai3) nous a présenté les Microservices, lors d’une Tech Session. Mais, les Microservices, c’est quoi ? D’après Wikipedia : «  les microservices sont un style d’architecture logicielle à partir duquel un ensemble complexe d’applications est décomposé en plusieurs processus indépendants et faiblement couplés, souvent spécialisés dans une seule tâche. Les processus indépendants communiquent les uns avec les autres en utilisant des API langage-agnostiques. » Cette nouvelle approche du développement est une vraie révolution. D’ailleurs, certains grands noms de l’IT (Netflix, Amazon, Azure…) l’ont adopté depuis longtemps. Pour en savoir plus, je vous invite à suivre cette Tech Session !

Découvrir DevOps

D’après Wikipedia : « Le devops est un mouvement visant à l’alignement de l’ensemble des équipes du système d’information sur un objectif commun, à commencer par les équipes de dev ou dev engineers chargés de faire évoluer le système d’information et les ops ou ops engineers responsables des infrastructures (exploitants, administrateurs …« .  Le 13 Avril dernier, lors d’une Tech Session, Gabriel Ivanes (consultant chez Ai3) nous en disait plus sur ce mouvement qui change fondamentalement  la façon de collaborer dans les équipes de développement.

Exchange 2016 Series – Certificat SSL

Bonjour tous le monde ! Dans ce nouvel article, je vous propose d’aborder le sujet sensible qu’est le choix des certificats SSL et des bonnes pratiques à suivre lors d’un déploiement Exchange 2016.

Exchange 2016 communique avec les clients, applications et les autres serveurs sur une variété de protocoles réseau tels que http, SMTP, IMAP et POP. La plupart de ces communications, particulièrement les clients et applications, impliquent une authentification basée sur l’identification par nom d’utilisateur et mot de passe. Lorsque les informations d’identification sont envoyées sur le réseau, elles sont envoyées « en clair », signifiant que ces informations peuvent potentiellement être interceptées et lues par une personne malintentionnée. D’autres informations transmises durant la session peuvent être également sensibles et enclin à être utilisées si l’interception est possible.

Pour sécuriser ces communications Exchange 2016 utilise les certificats SSL pour crypter le trafic réseau entre le serveur, les clients et les applications. Ceci inclus :

  • Outlook se connectant via Outlook Anywhere (RPC-over-HTTP) ou MAPI-over-HTTP
  • Les navigateurs Web se connectant à Outlook sur le Web (OWA)
  • Les appareils mobiles se connectant via ActiveSync pour accéder aux boîtes aux lettres et calendriers.
  • Les applications se connectant aux services Web Exchange (EWS) pour consulter les disponibilités et autres
  • Les clients de messagerie se connectant en POP ou IMAP
  • Le trafic SMTP cryptés en TLS entre les serveurs Exchange et les autres serveurs de messagerie

Lors de la première installation d’Exchange 2016, il génère un certificat SSL auto-signé qui est alors activé pour IIS (les services HTTPS comme OWA, EWS et ActiveSync), SMTP, POP et IMAP. Le certificat auto-signé permet au serveur d’être « sécurisé par défaut » et de commencer à crypter les communications réseau de suite après son démarrage, mais il est seulement censé être utilisé temporairement jusqu’à que vous provisionniez les certificats SSL pour votre environnement.

Lors du déploiement d’Exchange 2016 vous devez planifier de remplacer le certificat auto-signé par un certificat SSL valide pour votre scénario de déploiement. Ceci implique un investissement allant d’une centaine de dollars (ou €) à plusieurs milliers de dollars (ou €) dépendant de votre scénario d’espace de noms d’accès client, le type de certificat que vous achetez, et le type de d’autorité de certification auquel vous vous adressez.

Il fortement recommandé de ne pas conserver le certificat auto-signé ou de désactiver SSL pour les services Exchange.

Certificat SSL – Prérequis

Il y a trois prérequis basiques pour un certificat SSL dans un déploiement Exchange 2016.

  • Noms de serveur/domaine correct – le certificat SSL doit contenir les espaces de noms (aka, URLs, alias, noms de domaines) correspondant au nom auquel les clients tentent de se connecter (par exemple, les utilisateurs tapant « webmail.contoso.com » dans leur navigateur web pour pouvoir accéder à Outlook web app)
  • Période de validité du certificat – chaque certificat SSL a une période de temps fixée durant laquelle il est considéré comme valide. Lorsque le certificat SSL atteint sa date d’expiration il devra être renouvelé pour continuer à fonctionner.
  • Une autorité de certification de confiance – les clients feront uniquement confiance aux certificats qui sont issues d’une autorité de certification de confiance. C’est une des raisons pour laquelle le certificat auto-signé ne correspond généralement pour une utilisation en production, parce que vos clients ne feront pas confiance au certificat publié par votre serveur Exchange. Il existe un large panel d’autorités de certification publiques auprès desquelles vous pouvez acquérir des certificats.

Choisir une autorité de certification est assez simple, et la période de validité sera déterminé par la durée pour laquelle vous achetez le certificat (en général minimum 12 mois). Cela signifie que le point de décision pour la planification de vos certificats SSL se reposera sur le choix de vos espaces de noms.

Espace de noms pour les certificats SSL

L’approche la plus simple pour les espaces de noms Exchange 2016 Server est d’utiliser un seul espace de noms pour tous les services HTTPS.

En plus de l’espace de noms HTTPS, il est courant d’utiliser un espace de noms séparé pour chacun des services SMTP, POP et IMAP, bien qu’il ne soit pas nécessaire de le faire. Il y a également le CNAME de l’Autodiscover à considérer et le domaine racine également.

Par exemple, dans un environnement simple où le nom de domaine utilisé pour les adresses de messagerie est contoso.com, et en prenant en compte toutes les considérations citées précédemment, les espaces de noms pourraient être planifiées comme :

  • Webmail.contoso.com (pour HTTPS, SMTP, POP et IMAP)
  • Autodiscover.contoso.com (pour le CNAME de l’Autodiscover)
  • Contoso.com (pour le domaine racine des recherches autodiscover)

La pratique recommandée est d’inclure uniquement les alias en tant qu’espace de noms sur les certificats SSL et pas le FQDN des serveurs.

Note : Concernant la présence du ou des FQDNs des serveurs dans les certificat SSL, il est clair que cela est supporté mais ce n’est cependant pas une bonne pratique car dans les grands environnements il est important de réduire les coûts et les frais généraux administratifs. De plus, dans les grands environnements les services sont configurés avec des espaces de noms qui résolvent des adresses IP Virtuelles (Load Balancing) et utiliser un nom de serveur dans les URLs peut amener à vous causer des problèmes lors de future migration.

En raison des récents changements apportés aux règles d’émission de certificat, vous pouvez également vous trouver dans l’impossibilité de demander un certificat SSL pour un nom de domaine qui n’est pas routable sur Internet ou que vous ne possédez pas légitimement (par exemple, domain.local).

Quel type de certificat acquérir ?

Les autorités de certification tels que Digicert peuvent vous vendre une variété de types de certificat, et certaines autorités de certification différents noms pour ce qui est sensiblement la même chose.

  • Le certificat SSL standard contient un seul nom et est généralement le moins cher à acquérir, cependant ils ne sont pas adaptés même avec une conception d’espace de noms la plus simple.
  • Le certificat SSL Wildcard vous permet de sécuriser de multiple noms sur un domaine sans avoir à spécifier les noms exacts dans le certificat. Bien que qu’ils soient souvent une option à moindre coût, les certificats Wildcard peuvent poser des problèmes de compatibilité avec certains scénarios d’intégration avec d’autres systèmes, ainsi que de ne pas être adapté aux configurations POP et IMAP sécurisées.
  • Le certificat SAN ou UC (Unified Communications) est le type de certificat recommandé. Le certificat SAN peut contenir de multiple noms. Par exemple, un certificat UC peut inclure jusqu’à 4 noms à un prix normal, avec en option la possibilité d’ajouter jusqu’à un total de 25 noms avec un coût supplémentaire. Bien que le coût d’un certificat SAN/UC soit plus important qu’un certificat Wildcard, vous rencontrerez moins de problème de compatibilité avec le certificat SAN/UC, aussi longtemps que le certificat contienne les bons noms. Si toutefois lors de votre planification d’espace de noms vous faite une erreur ou, vous rencontrez le besoin de modifier l’espace de noms, la plupart des fournisseurs vous permettrons de republier le certificat gratuitement. Pour certain cette opération à un coût J.

La pratique recommandé est de provisionner le moins de certificat SSL possible et ce, pour simplifier l’administration ainsi que de réduire le plus possible les coûts à l’achat. Donc bien qu’il soit possible d’avoir des certificats pour chacun des services (http, SMTP, POP et IMAP), il est recommandé d’utiliser qu’un seul certificat contenant tous les noms à moins que vous ne soyez dans un scénario bien spécifique. De même qu’il est recommandé d’utiliser le même certificat pour tous les serveurs Exchange qui seront configuré avec le même espace de noms.

C’est ainsi que se termine cet article. J’espère que les informations fournies tout au long de ce post pourront vous être utiles lors de vos prochains déploiement d’Exchange 2016 !

Génération Y : comportement inné ou une posture ?

Vous avez du certainement entendre beaucoup de choses et participer à plusieurs discussions sur la génération Y. Mais qu’est-ce que représente véritablement cette génération Y ? Qu’est-ce qu’on connait véritablement sur cette génération ? Et la génération Z, qu’est-ce qu’elle représente par rapport à son prédécesseur ? Est-ce seulement une question de génération ou un état d’esprit ?

Je me suis posé cette multitude de questions en regardant quelques vidéos d’intervention d’Emmanuelle Duez, le nouveau gourou de l’intégration de la génération Y dans les grandes entreprises. Bref, elle compte changer le monde de l’entreprise en expliquant aux dirigeants pourquoi ils ont besoin de la génération Y au sein de leur entreprise et comment cette génération fonctionne dans sa tête.

 

Mais depuis le temps que l’on parle de la génération Y, une nouvelle génération, la génération Z a surgi et l’enjeu dans quelques années sera leur intégration au sein de ces mêmes entreprises. Aura-t-on un autre leader sur la question de la génération Z (ne me demandez pas pourquoi Z, j’en sais rien J) ? Y aurait-il un gourou pour chaque génération ? Et si ce n’était pas une question de génération mais d’état d’esprit et d’époque ?

Pour plus d’info : https://www.youtube.com/watch?v=0Yx1r0PgV8c  (avancez jusqu’à la 28 eme minute pour voir le discours d’Emmanuelle Duez)

Qu’est-ce que la génération Y ?

 

« La génération Y regroupe des personnes nées approximativement entre le début des années 1980 et le milieu des années 19901. » (Source Wikipedia).

Les médias ont fait couler beaucoup d’encre sur le sujet. La plupart du temps, cette génération est mal perçue par les médias et par les entreprises. On parle de fainéants, des personnes qui ne savent pas s’ennuyer, des personnes instables, ou bien on dit juste « atypiques » et sortant de la bouche de certains ce n’est pas vraiment un compliment, croyez-moi.

 #FromWhereIStand : une question de point de vue.

 

Lorsque j’étais en première année de Master en Communication et Information stratégique, j’ai rédigé un mémoire sur la transformation numérique au sein d’une entreprise de CAC 40. Et dans ce mémoire, j’ai évidemment parlé de la génération Y comme un fédérateur de ce changement. Dans un chapitre j’ai décrit les caractéristiques de la génération Y et lors de ma soutenance, mon professeur m’a dit : « Vous avez eu l’intelligence de montrer que la génération Y n’était pas si bien que cela, qu’ils étaient capricieux ». Il s’agissait d’un compliment et cela ne lui arrivait pas souvent d’en faire, du coup je l’ai accepté humblement. Mais en fait, il s’agissait d’une mauvaise interprétation : je n’avais pas l’intention de dénigrer ou bien de critiquer cette génération. Pour moi, les caractéristiques que je venais d’énumérer n’étaient ni des défauts, ni des qualités, mais des caractéristiques de cette génération, c’était un fait. Il s’agissait juste d’un point de vue, de quel côté on se trouvait. Mais bon, je ne peux pas dire que ma responsable de Master était quelqu’un de très ouvert d’esprit non plus.

D’un autre côté, lorsque j’ai effectué mon alternance, j’avais une tutrice qui était la digne représentante de la génération Y même si elle était née avant les années 80. Elle adorait twitter, gérait les réseaux sociaux parfois mieux que moi, avait une imagination et une créativité débordante, elle était impatiente et hyper active, bref cette femme avait plusieurs vies en même temps.

Comment comprendre ce phénomène de la génération Y alors qu’on peut apporter pleins d’exemples de ce genre ? De même, toutes les personnes nées entre 80 et 90 ne sont pas fan des jeux vidéo, TOUS ne veulent pas changer de boîte ou de métier tous les 3 ans.

Je pense, que ce n’est pas une question de génération mais de vision et d’état d’esprit. De sensibilité ou même tout simplement une question d’intelligence émotionnelle (ça sera le sujet du prochain billet… peut être J).

 

blog ai3 Y-vs-Z Génération Y : comportement inné ou une posture ?

Alors reprenons quelques clichés que l’on peut trouver sur la génération Y dans les médias et même dans les manuels, pour les défaire un par un avec un esprit pragmatique :

LA GENERATION Y EST IMPATIENTE

J’assume, je suis impatiente. La plupart du temps j’ai l’impression de ne pas avancer assez rapidement, que les gens autour de moi ne sont pas assez rapides, que cela soit dans ma vie personnelle ou dans ma vie pro. Et c’est normal ! le monde d’aujourd’hui va trop vite, la période d’innovation est seulement de 6 mois, tous les ans nous avons des dizaines de nouveaux modèles de téléphone. Il faut s’adapter à ce rythme effréné et donc comme on est habitué que tout aille vite, lorsque l’on rencontre une « lenteur », bah on s’impatiente.

LA GENERATION Y NE SAIT PAS S’ENNUYER

J’ai entendu cette phrase venant d’une femme de cinquantaine d’années. Elle avait l’air de dire que s’ennuyer parfois c’était bien. Je crois que m’ennuyer est la pire des punitions qui puisse m’arriver. Surtout au travail.

Ce n’est pas normal de s’ennuyer au travail. Aujourd’hui les femmes travaillent de plus en plus (et heureusement), occupent de plus en plus de postes à responsabilités (même s’il y a encore beaucoup de chemin à parcourir sur ce sujet…) et il est hors de question de ne pas s’épanouir au travail. Auparavant les hommes occupaient des postes pas forcément épanouissants car il fallait nourrir la famille et bien souvent ils étaient les seuls à le faire. Mais aujourd’hui, lorsqu’une personne ne s’épanouit pas au travail elle cherche à s’échapper ailleurs même dans un contexte de crise comme ce que nous vivons actuellement.

LA GENERATION Y VEUT AVOIR UNE VIE EN DEHORS DE SON TRAVAIL

Aujourd’hui, la société a évolué. Depuis, peu les hommes sont autorisés à avoir des jours de congés paternité à la naissance de leur bébé. La parentalité ne relève plus exclusivement de la femme. Donc, l’équilibre vie privée/vie pro devient extrêmement important. Et justement le contexte difficile du marché du travail, l’instabilité des emplois fait que les personnes se posent de plus en plus de questions sur leur vie au quotidien et se disent que si demain on risque de perdre notre job, autant s’amuser en même temps, car on ne sait pas ce que la vie va nous réserver demain. Donc oui, on a besoin de nos WE prolongés  du mois de Mai pour se faire du bien J

LA GENERATION Y EST UNE BANDE DE FAINEANTS

Non. C’est juste que les horaires de 9h à 17h ne font plus de sens.  La génération Y a vu leurs parents travailler beaucoup et souvent au détriment de leur vie privée. On ne veut plus vivre de cette sorte. Les nouvelles technologies et nouveaux modes de travail permettent de travailler à distance à n’importe quelle heure, d’être mobile et joignable à tout moment. Si on n’arrive pas à dormir la nuit on peut toujours ouvrir notre petit tableau Excel pour travailler dessus et le Manager n’est plus sur notre dos derrière pour comptabiliser nos horaires. Le principe de travail a changé : tout ce qui compte c’est le résultat.

LA GENERATION Y NE RECONNAIT PAS L’AUTORITE

Nuance : la génération Y ne reconnaît pas l’autorité illégitime, je m’explique. Le temps où un dirigeant en était un parce qu’il avait fait une des grandes écoles de Paris, c’est fini et heureusement. Aujourd’hui, les personnes talentueuses se trouvent partout, car le savoir est universel. Donc, ce qui a vraiment de l’importance aujourd’hui dans les entreprises, c’est une possession de certaines caractéristiques de personnalités (v. intelligence émotionnelle). Le leadership est le mot d’ordre. Nous sommes capables de nous former de manière autonome sur plusieurs sujets juste en suivant des MOOCs, les diplômes ne veulent pas dire grand-chose aujourd’hui. Seul le leadership compte.

blog ai3 Boss-vs-Leader Génération Y : comportement inné ou une posture ?

Pour conclure, la génération Z qui arrivera bientôt sur le marché du travail sera différente et aura ses propres caractéristiques. Et cela sera tout à fait normal : ils n’ont pas connu l’URSS, ni la fusée Soyouz, les francs, les frontières entre les pays européens, la disquette et ni la cassette. Forcément, ils vont réfléchir différemment, car leur passé culturel, sociologique, politique et personnel ne sera pas le même que le nôtre. Vive nos diversités, nos différences et nos divergences d’opinion. Il faut que nous nous adaptions au changements perpétuels, y compris les entreprises pour pouvoir attirer les nouveaux talents et pour permettre à la nouvelle génération de repenser le monde à leur manière, avec les moyens de l’époque.

blog ai3 Gen-Z Génération Y : comportement inné ou une posture ?

 

 

 

 

 

 

 

Raspberry Pi : Piloter un robot en C# via le port GPIO

Le robot

blog ai3 pi2go-lite-front-300x232 Raspberry Pi : Piloter un robot en C# via le port GPIO  blog ai3 pi2go-lite-rear-300x246 Raspberry Pi : Piloter un robot en C# via le port GPIO  blog ai3 pi2go-lite-top-300x255 Raspberry Pi : Piloter un robot en C# via le port GPIO

Le raspberry pi 2 dispose d’un port GPIO (General-purpose input/output) avec lequel il est possible de piloter toute sorte de périphériques, par exemple un robot comme le Pi2Go Lite. Le robot est motorisé et est possède un ensemble de capteurs. Lors du montage, le raspberry pi 2 est monté sur le robot avec 6 piles afin qu’il se déplace en toute autonomie.

Le port GPIO est composé de 40 pins et mis à part les pins dédiées à un usage spécifique, elles peuvent toutes être utilisées pour lire ou écrire les valeurs high (1) ou low (0).

D’un point de vue logiciel, le Pi2Go est livré avec une API écrite en Python. Le défi posé dans le cadre de ce billet est de porter l’ensemble de l’API ainsi que toutes les couches inférieures vers notre langage favori : le C#.

L’ensemble des points abordés dans ce billet ont été implémentés et les sources sont disponibles sur le Github du projet.

 

Voyons un peu plus en détail les composants du Pi2Go Lite. Vous allez voir qu’il est un bon cas d’école pour apprendre à contrôler le port GPIO du Pi parce qu’il dispose de composants posant chacun des problématiques différentes de programmation. En voici la liste :

  • 4 LEDs (2 à l’avant et 2 à l’arrière), Ecriture de High pour allumer une LED et Low pour l’éteindre.
  • 2 capteurs infrarouges : Si un obstacle proche est détecté, alors une valeur High est lue sur la pin concernée.
  • 2 moteurs permettant de propulser le rover. Afin de faire varier la vitesse de rotation des moteurs il est nécessaire d’implémenter la modulation de largeur d’impulsion (PWM en anglais).
  • Un sonar ultrasonique pour mesurer la distance de l’obstacle devant le robot. Le principe du sonar ultrasonique est de lancer une impulsion (écriture), puis d’attendre l’écho en retour (lecture). Plus la distance entre le rover et l’obstacle est grande, plus l’écho est longue à revenir. Connaissant la vitesse du son, il est facile de calculer la distance de l’obstacle.
  • Le module additionnel Pan and Tilt permet d’ajouter une caméra (compatible avec le pi 2) qu’il est possible d’orienter verticalement et horizontalement grâce à 2 servos. Les servos peuvent être positionnés de 0 à 90° en envoyant un signal selon une certaine fréquence qui indique la position souhaitée.

 

Nous allons maintenant voir quels sont les logiciels chargés de piloter tous ces composants.

Les logiciels livrés avec le Pi2Go Lite

Outre le matériel, le Pi2Go Lite est livré avec des logiciels qui sont conçus pour s’exécuter sur le Pi 2 via une distribution Linux. Pour ma part j’utilise Raspbian, qui est une Debian spécialement préparée pour le Pi 2.

Les logiciels fournis sont principalement destinés à être utilisés par le langage Python :

  • RPi.GPIO : Il s’agit d’une librairie qui permet de piloter le port GPIO. Cette librairie est développée en Python, mais les fonctions bas niveau son écrites en C. Outre l’activation – désactivation des pins et la lecture des pins, elle gère aussi le PWM qui régule la vitesse des moteurs des roues.
  • ServoBlaster : Un programme écrit en C, dédié au pilotage des servos moteurs permettant de changer la position de la caméra.
  • Une librairie Pyhton écrite par les concepteurs du Pi2Go qui repose sur RPi.GPIO et ServoBlaster pour proposer des fonctions haut niveau comme : allumer les LEDs, avancer / reculer, tourner à droite / gauche, mesurer la distance de l’obstacle le plus proche, orienter la caméra (haut, bas droite, gauche).
  • Le programme qui est chargé de faire l’interface homme  / machine. Il s’agit d’un script Python qui s’exécute en ligne de commande. Il permet de piloter le robot grâce aux touches du clavier.

Voici une vue d’ensemble de la stack logicielle à réécrire en C# :

blog ai3 Pi2Go-Lite-Original-Software-stack1-300x181 Raspberry Pi : Piloter un robot en C# via le port GPIO

Diagramme représentatif de la stack logicielle fournie avec le robot

 

Réécriture de la stack en C#

Heureusement, il est possible d’exécuter un programme .Net  sous Linux grâce à Mono, le pendant Open Source du framework .Net. Mono s’exécute parfaitement sur Raspbian. Il fait même partie des packages de base que l’on peut installer grâce au gestionnaire de paquets « APT » !

 

Au passage : pourquoi ne pas avoir utilisé Windows 10 IoT ?

J’ai bien tenté de porter le programme sur Windows 10 IoT, et l’implémentation est nettement plus simple que sous Linux, mais l’API de Windows ne permet pas d’utiliser certaines pins qui sont nécessaires au Pi2Go Lite 🙁

 

L’un des principal défaut de l’architecture logicielle originale, est qu’elle repose sur un assemblage d’outils et de librairies peu cohérentes et non unifiées. Par exemple, la commande des servos fait appel à un outil nommé « ServoBlaster » qui est lancé en ligne de commande via le script Python.

Dans cet article, nous avons pour objectif de développé un framework unifié et capable de prendre en compte l’ensemble des problématiques en évitant la duplication de code.

Ainsi l’architecture cible retenue est découpée en 4, chaque couche reposant sur la couche de niveau inférieur :

  1. Gestion bas niveau du port GPIO
  2. Pilotes (PWM pour les moteurs, Servos, Sonar etc.)
  3. Libraire haut niveau de contrôle du robot
  4. Programme IHM

Dans le cadre de ce post, je décrirai uniquement le fonctionnement de la gestion du port GPIO. Les autres composants seront détaillés ultérieurement dans d’autres posts qui seront publiés sur ce blog.

 

Gestion du port GPIO

Le fonctionnement du port GPIO est simple. Avant toute opération sur une pin, il est nécessaire de définir le mode d’accès : Input ou Output et ensuite on peut procéder à la lecture ou à l’écriture de d’une valeur.

Sous Linux, il existe plusieurs méthodes pour accéder au port GPIO :

  • En écrivant dans les fichiers du sysfs

Cette méthode a pour avantage d’être très simple et est accessible à tout langage capable de lire ou écrire dans des fichiers. Chaque pin est présentée sous la forme d’un fichier dans lequel on lit ou écrit pour communiquer.

Même si les performances sont suffisantes dans la majorité des cas, elle ne permet pas d’envoyer un signal à une fréquence suffisante pour, notamment, commander les servos de la caméra.

Elle est implémentée dans la classe SysfsLinuxGpioPort du projet.

 

  • Accès direct à la mémoire (DMA)

Avec le noyau Linux, il est possible d’activer un device « /dev/mem » qui est une représentation de l’ensemble de la mémoire RAM de l’ordinateur sous la forme d’un fichier. Dans le cas d’un usage classique d’un ordinateur ce device n’a pas lieu d’être activé et si c’était le cas cela représenterait une énorme faille de sécurité.

Dans le cadre d’un OS dédié au pilotage d’un robot, c’est très intéressant car cela permet d’accéder directement aux registres des périphériques sans librairie intermédiaire. Toutes les librairies C qui ont besoin de performances optimales, comme par exemple ServoBlaster, utilisent cette méthode.

Pour implémenter cette méthode, il est nécessaire de mapper le fichier « /dev/mem » dans la mémoire du processus courant en utilisant mmap. Après cette opération le processus peut librement écrire n’importe où dans la mémoire… et ensuite on peut commencer l’arithmétique des pointeurs. Ce qui n’est pas chose aisé après plusieurs années de C#, mais l’exercice est intéressant.

Je vous laisse découvrire le code de cette implémentation dans la classe DmaLinuxGpioPort.

 

Suite…

Nous avons vu comment est implémenté la gestion du port GPIO. Dans un prochain post, je décrirai comment sont implémentés les pilotes de chaque composant ainsi que l’écriture d’un contrôle à distance grâce aux WebSockets.

MongoDB avec C#

A-propos de l’article

On constate un intérêt grandissant pour l’utilisation de couches de données noSQL. L’article ici présente l’utilisation d’un des systèmes les plus connus du marché MongoDB et notamment la version 3.

Présentation de MongoDB

Qu’est-ce que MongoDB?

MongoDB est une base de données orientée document sponsorisée par 10gen. Elle est utilisée notamment chez Foursquare, SourceForge et Bit.ly.
Mongo stocke les documents au format BSON (JSON binaire supportant un peu plus de types de valeur) et fournit un shell javascript pour accéder aux données et faire les opérations d’administration. De nombreux drivers sont implémentés notamment pour Java, .Net, PHP, Javascript
La notion de base orientée document signifie que les objets stockés sont représentés sous la forme d’un document BSON (pas seulement une map de style clef/valeur) permettant facilement de se mapper sur les objets que l’on manipule dans nos programmes. On pourrait le comparer à un stockage d’une représentation XML d’une grappe d’objets.

Schemaless : Comparaison entre NoSQL MongoDb et les bases relationnelles classiques

Lorsqu’on développe une couche d’accès aux données, nous allons souvent devoir soit utiliser un ORM, soit utiliser un mapper qu’on aura développé nous-même, mais les deux feront le même travail à savoir la transformation et le mapping d’objet en relation.
De plus comme les bases de données classiques relationnelle ne permettent pas le stockage des données complexes (entité avec des tableaux, imbrication, collection), nous devons effectuer différentes requêtes SQL pour obtenir nos données ou les mettre à jour.
En vue de ces 2 points, le développement d’une couche d’accès aux données beaucoup de travail. Ces jours que nous perdons à implémenter une réponse technique et non fonctionnelle, nous pourrions les affecter au développement métier et ainsi satisfaire d’avantage notre client. 
Pour cela une seule solution, stocker les objets .NET telle qu’ils sont et demander à notre moteur de persistance de gérer pour nous ce travail.
Un rêve que MongoDB et les bases de données NoSQL permettent de tenir. C’est ce qu’on appelle le schemaless.

Qu’apporte Le sharding avec MongoDB ?

MongoDB depuis sa version 1.2 intègre une gestion de sharding. L’application de cette gestion permet d’avoir une scalabilité plus importante. Nos données sont toutes cohérentes, car on accède toujours à tout. Le concept du sharding n’est pas d’avoir plusieurs bases de données en master/master, mais une seule base de donnée qui répartie ses propres données dans les différentes instances. On se retrouve ainsi à posséder certaines données sur une instance et les autres sur une autre. Cet aspect n’est pas détaillé dans cet article.

Qu’apporte le GridFS ?

MongoDB embarque avec lui un système de fichiers complet. Ce système est GridFS. MongoDB est limité par document à 4Mo, mais on a vite besoin de stocker des documents plus importants. GridFS permet ça. On stocke donc tout document supérieur à 4 Mo sur le système de fichier GridFS. GridFS permet ainsi d’avoir le sharding sur ses fichiers. On a donc besoin de rsync entre plusieurs machines. GridFS fait le boulot pour soi. On pourrait facilement rapprocher GridFS à Hbase.

Un système de requêtes évolué

Enfin le vrai intérêt de MongoDB selon moi, surtout par rapport à Riak ou CouchDB, c’est sa gestion de requêtage. On peut requêter de façon très fine grâce à une grande quantité de mots-clé. On peut donc faire des requêtes aussi riches qu’en SQL, mais tout ça sur une base de données orientée Documents.
On peut par exemple chercher tous les documents qui possèdent plusieurs éléments dans un tableau
db.things.find( { a: { $all: [ 2, 3 ] } } );
Alors qu’en SQL on aurait plus fait un
select * from things where a LIKE ‘%2%’ AND a LIKE ‘%3%’ 
Mais cette dernière est finalement incomplète car ça marchera pour un champ « A » contenant un array [32] en SQL mais ne fonctionnera pas dans le cas de la requête MongoDB.
On peut aussi faire de la recherche en donnant une fonction Javascript
db.myCollection.find( { $where: « this.a > 3 » } );
C’est très modulaire et le nombre de mot clé ne cesse d’augmenter.

Prise en main sous .NET 4.5

Il existe de nombreux utilitaire, librairie pour communiquer avec MongodB, je vous conseille de rester au standard et d’utiliser le driver fournit par le projet MongoDB même.

Nous utiliserons le mécanisme classique des autres DAL. A savoir 
La connectionstring dans le web.config pour définir le serveur

Installation de MongoDB sur votre machine (instance unique)

  1. Avant de pouvoir commencer l’installation, il faut télécharger la dernière version de MongoDB. Pour ce faire, aller à l’adresse suivante : http://www.mongodb.org/downloads et choisissez le type d’installation que vous désirez.
  2. Pour lancer l’installation, il vous suffit de double-cliquer sur le paquet msi et de suivre les instructions affichées à l’écran
  3. Créez le dossier qui contiendra vos bases de données c:\data\db et un dossier log c:\data\log
  4. Créez un fichier de paramétrage vous permettant de configurer mongodb : mongod.conf
  5. Vous pouvez démarrer mongod en utilisant le programme mongod.exe se trouvant dans le dossier bin : mongod –config mongod.conf
  6. Vous pouvez également configurer mongod pour l’utiliser comme un service : mongod –config mongod.conf –install
  7. Configurez le mode de démarrage de mongod en automatique ou en manuelle : sc config mongod start=auto

Hébergement d’une base MongoDB avec réplication sur Windows Azure

Windows Azure ne supporte plus nativement MongoDb, vous disposez des services SAAS exemple mongolab, mais cela est payant, pour vous permettre de prendre en charge un cluster MongoDB gratuitement, vous devez créer 2 VM de base

    1. Créez une VM nommez la <votresociete>mgdb1
    2. Créez une autre VM nommez la <votresociete>mgdb2
    3. Associez un disque à chacune de vos VM de 30 Gb et associez la lettre f:

Répetez l’opération suivante sur chaque VM

      1. Connectez-vous sur votre première machine
      2. Formatez votre disque data
      3. Désactivez le contrôle IE.
      4. Ajoutez le site http://*.mongodb.org à la liste des sites de confiance
      5. Téléchargez la version 64bits
      6. Installez le msi
      7. MongoDb par défaut est installé dans le dossier C:\Program Files\MongoDB\Server\3.2\bin, créez une variable d’environnement Path pointant vers ce dossier
      8. Téléchargez OpenSSL et installez le, cela vous permettra de créer un certificat pour votre replication : https://slproweb.com/download/Win64OpenSSL_Light-1_0_2f.exe
      9. Créez 2 dossiers sur votre lecteur f : data et log
      10. Créez 1 dossier conf
      11. Ajoutez un fichier mongod.conf
      12. Ajoutez les paramètres nécessaires :
        • Port : numéro du port sur le quel écouté par défaut 27017
        • Dbpath : chemin d’accès aux données
        • replSet=rs0 : indique qu’on va utiliser une réplication
        • logpath : indique le chemin d’accès au fichier de log
        • logaappend indique la rotation
      13. si le nœud n’est pas le premier, créez le dossier keys et copiez le fichier mongodb-keyfiles du premier nœud.
      14. Installez mongodb en service mongod –config f:\conf\mongod.conf –install
      15. Démarrez le service mongdb net start mongodb
      16. Si c’est le premier nœud, Connectez-vous au serveur mongo et démarrez la réplication rs.initiate()
      17. Ouvrez un port au niveau du firewall pour pouvoir vous connecter au service MongoDB
      18. Configurez un endpoint au niveau de Windows azure pour la machine virtuelle sur le port TCP 27017
      19. Si c’est le premier nœud, Créez les utilisateurs administratifs sur le master
      20. Arrêtez l’instance de mongodb
      21. Créez sur le premier nœud uniquement un fichier clé pour être utilisé par chaque membre d’une réplication
        • Je vous conseille d’utiliser openssl mais vous pouvez utiliser d’autre mécanisme.
        • Copiez le fichier key généré sur chaque membre
        • Modifiez le fichier de configuration pour spécifier le fichier de clé à utiliser. keyFile
        • Refaire l’opération sur le premier serveur

Ajoutez un nœud à une réplication

      1. Depuis la machine host du nouveau nœud,
      2. Connectez-vous au nœud premier mongo -u siteRootAdmin –p –authenticationDatabase admin
      3. Utilisez la méthode rs.add(« nomdelamachine :27017 ») pour ajouter le nœud

Vérifiez la configuration d’une réplication.

      1. Depuis n’importe quel host
      2. Connectez-vous au premier nœud mongo -u siteRootAdmin –p –authenticationDatabase admin
      3. Utilisez la méthode rs.conf()

Développement de la couche d’accès aux données sous Visual Studio 2015

    1. Reprenez les librairies créées précédemment dans nos article 1 et 2,
    2. Dans le projet STPVideoPlayer.DataLayer, ajoutez les classes suivantes
      • EpisodeModel: pour décrire un épisode
      • LocalVideoModel : Pour décrire un fichier vidéo local
      • YoutubeModel : Pour décrire une vidéo ou une playlist hébergée sur youtube
      • TimeLineModel : Pour décrire une planification
    3. Installez le driver MongoDB depuis nuget au projet STPVideoPlayer.Data.MongoProvider
    4. Créez une classe TvPlayerRepository
    5. Implémentez le code nécessaire à notre fournisseur en implémentant l’interface ITvPlayerRepository

ExpandoObject : Dé sérialisation des fichiers XML et traitement POO sans prise de têtes

Qu’est-ce que Expando Object ?

La classe ExpandoObject est une implémentation du concept d’objet dynamique qui permet l’obtention, la définition et l’appel de membres. Si vous souhaitez définir des types qui ont leurs propres sémantiques de distribution dynamique, utilisez la classe DynamicObject. Si vous souhaitez définir comment les objets dynamiques participent au protocole d’interopérabilité et gèrent la mise en cache de la distribution dynamique rapide du DLR, créez votre propre implémentation de l’interface IDynamicMetaObjectProvider.

  • Espace de noms : System.Dynamic
  • Assembly : System.Core (dans System.Core.dll)
  • Hiérarchie d’héritage :
  • System.Object
  • System.Dynamic.ExpandoObject

Contexte fonctionnelle

Il est souvent demandé par le client de pouvoir importé un fichier de données au format XML. Il est donc plus aisé de pouvoir travailler en mode objet, cependant la transformation XML en objet pur pourrait demander beaucoup de temps de développement. 
ExpandoObject apporte une réponse à cette problématique en fournissant un mécanisme de désérialisation sans implémentation de code lourd et complexe.

Comment ça fonctionne ?

Helper

Le helper a pour responsabilité de lire le fichier XML et de retourner une collection d’objets de type ExpandoObject

Le fichier XML

Le fichier XML contient l’arborescence à désérialiser.

ImportProcessor

Cette classe a en charge la transformation et le mapping des objets ExpandoObject en entité (POCO)

Faites-le vous même (Visual Studio 2015 / C# 4.5)

  1. Ouvrez la solution Créez dans mon article précédent sur Unity : Microsoft Unity 4 / Généricité de la couche d’accès aux données
  2. Dans la librairie STPVideoPlayer.DataLayer, Ajoutez une classe helper ExpandoHelper, cet helper aura en charge de lire le fichier XML et d’appeler une classe de traitement pour la transformation des données
    Remarquons ici, l’utilisons de l’objet PluralizationService qui permet en utilisant la culture anglaise de pluraliser les noms ou de les singulariser
  3. Pour lire un fichier il suffira alors juste d’appeler la méthode ExpandoHelper.ReadDocument(xmlFile)

ExpandoHelper : [C#]