Le mystérieux cas de la navigation à la définition de vues ASP.NET MVC défectueux

Vous vous souvenez de mon mystérieux problème de coloration syntaxique dans mes vues ASP.NET MVC? Il s’avère que je n’avais pas tout dit à ce sujet.

En plus du problème que j’ai précédemment mentionné avec mes vues MVC, un nouvel irritant s’est ajouté suite à cette mise à jour à MVC 5.2. Le raccourci clavier me permettant de naviguer directement, à partir d’un contrôleur, à une vue avait disparu.

resharper

Oui, oui! Disparu! Pouf! Je n’étais simplement plus capable de l’utiliser. Misère!

Au minimum, ce que je pouvais affirmer de cette situation c’est que la fonctionnalité était fournie par l’extension ReSharper. Comme il n’y a pas de fumée sans feu. Je me doutais bien que la situation était produite par la mise à jour à MVC 5.2 et que ReSharper ne devait pas le digérer correctement.

Ceci étant dit, avant de crier au loup, j’ai été faire mes devoirs. Au moment que la situation s’est produite, j’avais la plus récente version de ReSharper installé sur mon poste et la totalité de mes extensions était à jour (par le menu Outils\Extensions et mises à jour). Alors, d’où pouvait donc provenir le problème?

La mise à jour manquante

Avant tout, je dois avouer que, une fois que j’ai trouvé la solution. Ma réaction a été celle-ci:

Cette fonctionnalité de ReSharper est possible grâce à un mécanisme appelé External Annotations. Cela permet à ReSharper de faire de l’analyse sur des bouts de codes spécifiques.

Or, pour chaque nouvelle version d’ASP.NET MVC, ces annotations doivent être mises à jour. Mais par où passe-t-on pour avoir cette nouvelle version des annotations?

Dites bonjour au gestionnaire d’extensions de ReShaper!

resharper-extensions

Remarquez qu’il s’agit de la même interface que pour le gestionnaire d’extensions de Visual Studio, mais utilisé spécifiquement pour ReSharper. C’est à cet endroit que vous pouvez y mettre à jour vos annotations externes et même installer d’extensions supplémentaires.

J’espère que vous aurez appris quelque chose en lisant ceci et que ce sera utile à quelqu’un!

Vie de développeur – Une petite leçon de SQL Server

Cette semaine, j’ai eu droit à une belle leçon de vie avec SQL Server. Quelque chose qui replace l’orgueil du développeur au bon endroit.

En fait, ce n’est pas tant que j’ai commis une grave erreur. Il s’agit plus que j’aie pris connaissance d’un concept qui m’était inconnu jusqu’à présent. Pourtant, il s’agit d’une fonctionnalité au cœur même de SQL Server.

À la fin de ce billet, il y a de bonnes chances que vous vous aillez appris quelque chose aussi. En tout cas, moi j’ai appris quelque chose!

L’histoire

Comme beaucoup d’histoires de ce genre, tout a commencé par un problème qui ne devait pas en être un. C’est quand vous vous dites: « Voyons, ça devrait marcher! » qu’il y a anguille sous roche.

Tout a commencé lorsque j’ai entrepris de me créer une base de données avec Entity Framework. Pour une raison que j’ignorais, à chaque fois que j’exécutais mon application, la base de données créée basée sur mon modèle de données était en mode SINGLE_USER. Cela faisait en sorte qu’au bout de quelques appels SQL, la connexion précédente bloquait toute nouvelle connexion à la base de données.

C’est à moment que le festival de la recherche Google a débuté… et j’en suis revenu bredouille. Il n’y avait littéralement PERSONNE qui avait expérimenté mon problème avant.

Le plus intrigant dans cette situation, c’est qu’il est très suspect d’associer Entity Framework à cette problématique. Après tout, l’ORM est seulement le messager entre la base de données et vous.

Une révélation

À partir de ce moment, j’avais déjà passé pas mal de temps à tripoter les différentes fonctionnalités d’initialisation de base de données d’Entity Framework sans succès.

L’étape suivante de mon plan de match était de voir ce que donnerait la création d’une base de données à la main avec la commande SQL CREATE DATABASE. Il s’agit aussi de l’instant que j’ai eu la révélation. Il s’avérait que même les bases de données créées manuellement étaient créées en mode SINGLE_USER. Tiens, tiens, comme c’est curieux!

Mes recherches m’ont rapidement mené à la base de données système nommée model. Son nom est assez explicite pour deviner à quoi elle sert.

Une base de données pour les gouverner tous

La base de données model est utilisée comme gabarit pour les bases de données que vous allez créer sur votre instance SQL. Chacune des personnalisations que vous ferez sur celle-ci sera intégralement répliquée sur vos nouvelles bases de données.

Mon problème et ma solution étaient situés exactement là. model était justement en mode SINGLE_USER. Cela faisait en sorte que cette configuration était rapatriée sur mes nouvelles bases de données.

La question, qui va rester sans réponses, est: comment ai-je réussi à appliquer cette configuration sur cette très importante base de données? Jusqu’à cette heure, je suis sans explications.

Et puis, alors, avez-vous appris quelque chose de cette leçon d’humilité?

La configuration de mon nouveau PC

Dernièrement, j’ai mis en branle le projet de m’assembler un nouvel ordinateur. Avec l’aide d’un ami, j’ai minutieusement sélectionné les pièces pour mon nouveau meilleur ami. Comme le dit l’adage ancien: le meilleur ami du geek est son ordinateur. Tant qu’à acquérir un nouvel ordinateur, aussi bien qu’il soit de qualité.

Mon but principal avec ce nouvel ordinateur est de mettre à jour celui que j’avais précédemment. Loin de moi l’idée de me construire la bombe ultime. À part la mise à jour de carte vidéo et l’ajout d’une quantité significative de mémoire vive, mon vieux Intel Core 2 Duo E6400 faisait sentir son âge.

Mise à part la nécessaire mise à jour de performance, je tenais à ce que mon nouvel ordinateur possède une configuration qui produit un minimum de bruit ambiant. Chez moi, mon ordinateur est situé dans une pièce qui est près du salon où la famille passe une majorité de son temps. Nous ne voulions pas l’entendre du tout!

Une autre contrainte que je devais respecter. Il s’agit d’une limite de 1000$ sur mon achat. Pour arriver à mes fins, j’ai choisi de ne pas mettre à jour ma carte vidéo qui avait moins de trois ans de vie et de conserver ma paire de moniteurs existants. Cela m’a permis de concentrer ma mise à jour sur la nouvelle boîte ainsi que les principales pièces qui vont à l’intérieur.

Sans plus attendre, voici ce que j’ai retenu pour ma nouvelle configuration.

Sans les taxes, le total a été de 999.86$. Disons que j’ai pas mal visé dans le mile côté budget! Il faut aussi dire qu’au moment où j’ai acheté certaines pièces étaient en liquidation ou simplement en rabais. Cela m’a donné un solide coup de main.

Du silence

Afin de me permettre d’avoir une configuration dite « silencieuse », je me suis fié à deux pièces en particulier. Les deux ventilateurs Noctua et 140MM ainsi que la boîte d’alimentation électrique Seasonic.

Les ventilateurs Noctua, malgré leur couleur brune, sont réputés pour leur roulement silencieux. Installés à l’avant de mon boîtier, ces ventilateurs permettent d’obtenir une circulation d’air optimale et une pression positive à l’intérieur du boîtier. Le principal avantage de la pression positive est de m’assurer qu’il va y avoir un minimum de poussière à l’intérieur du boîtier.

Question d’en ajouter sur le bruit, j’ai opté pour une boîte avec une apparence sobre. Mais encore, côté silence la Corsair 330R est dotée de panneaux coussinés atténuant le bruit dégagé à l’intérieur de la boîte.

Et la performance, elle?

Je l’ai mentionné en introduction. Mon but est loin d’avoir à mon bureau un monstre qui transforme l’électricité en bits. Après tout, ma principale activité depuis quelque temps est d’écrire sur ce blogue.

Malgré mes critères, j’ai quand même été en mesure de tirer mon épingle du jeu sur ce côté. Pour le processeur, le suffixe K mentionne que les fréquences sont débloquées afin de permettre l’overclocking. L’ironie c’est que cette édition était moins dispendieuse que l’édition régulière en raison d’un rabais à la vente.

Il s’agit aussi du même constat pour la carte mère. Modèle UD3H est synonyme de « Ultra Durable ». Les composantes de la carte mère sont de légèrement de meilleure qualité. Encore une fois, je l’ai eu à rabais. Elle me revenait moins chère que la GA-Z87X-D3H.

Côté performance, la cerise sur le sundae est le disque dur SSD. En 2014, il n’y a pas de raisons de ne pas en avoir un. Le meilleur rapport qualité-prix se situe environ à 0.50$ le gigaoctet.

Vie de développeur web – L’URL qui avait un paramètre en trop

Voici une anecdote qui m’a étonnamment donné du fil à retordre cette semaine.

Au travail, nous utilisons déjà JIRA pour faire le suivi de nos tâches internes. Dans le passé, nous avons essayé diverses initiatives pour faire le suivi des correctifs pour les anomalies identifiées par le client. Courriels, un Google Document ou même juste le bon vieux téléphone dans les cas extrêmes.

À tous les coups, c’est l’étape de faire le triage de ces tâches qui nous rend la vie difficile.

L’idée est d’intégrer le plug-in JIRA Issue Collector qui permet, à même votre site, de soumettre des anomalies et de collecter quelques statistiques sur le contexte de la soumission (navigateur, page web, etc.).

Est-ce que vous voyez où je m’en vais avec cette histoire? L’intégration du plug-in est pourtant très simple. Vous procédez à quelques configurations sur une page pour la mise en marche du plug-in et vous intégrez une déclaration de script JavaScript qui est générée automatiquement par l’outil de configuration.

Cependant, pour une raison que j’ignorais, au bout d’une heure, j’ai commencé à comparer ma situation à celle de Rocky Balboa.

Rocky-Bolboa-IV[1]

Je n’arrivais simplement pas à faire fonctionner le sapristi de script sur ma page! Au point où j’en étais, j’avais déjà tenté, en vain, les solutions suivantes:

  • Intégrer le script sur mon site en désactivant le JavaScript
  • Créer une page HTML simple en y intégrant le strict minimum pour faire fonctionner le script selon la documentation
  • En faire part à un collègue qui a fait une intégration similaire dans le passé pour voir ce qui se passe.
  • Demander à un collègue, choisi au hasard dans le bureau, pour exécuter ma page HTML simple sur son poste.
  • Demander au collègue d’à côté de réviser mes essais précédents.
  • Reconfigurer le script du côté de JIRA afin de m’assurer que je ne suis pas fou.

Toujours sans succès. À ce point-là, j’ai entamé la quête pour décompiler le code fourni par le JavaScript afin de mieux comprendre son fonctionnement et finir par mettre le doigt sur ce qui ne fonctionne pas. Après tout, le web est une grande boîte ouverte.

Comme prévu, le code en question semblait en ordre. À l’exception d’un petit détail qui m’intriguait. Le paramètre d’URL utilisé pour lier ma configuration JIRA à ce qui sera exécuté sur mon site ne semblait pas être mis en mémoire. Encore là, le code en question était tout ce qui semblait de plus normal.

C’est au moment que j’étais sur le point d’abandonner complètement le dossier que je fais un dernier appel au collègue d’à côté. En faisant un topo de la situation, son attention se porte sur l’URL qui m’avait été fournie par le générateur de script.

L’URL avait la forme suivante: https://jira.com/s/5a9bd87b2535fbcebec42cad94544d8c-T/fr_FR-ga0u8z/6325/147/1.4.11/_/download/batch/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector.js?locale=fr-FR?collectorId=abd34452

Cela fait déjà depuis presque cinq cents mots que j’en parle. Êtes-vous capable d’identifier la source du problème?

Il y a une anomalie dans le générateur de script du plug-in! Il semble que le cas où le script est configuré pour s’afficher en Français génère une URL avec deux points d’interrogation pour les paramètres d’URL.

C’est ainsi que j’ai découvert que l’URL avait un paramètre en trop! Une fois le deuxième point d’interrogation remplacé par une esperluette (&), le script a fonctionné à merveille!

Que mon témoignage serve d’exemple pour d’autres!

Le matin, très tôt, je m’entraîne à la course à pied avant d’aller au boulot

La course à pied est le sport le plus naturel à pratiquer. Vous n’avez pas besoin d’instrument en particulier pour en faire. Il suffit d’avoir une paire de souliers. En plus, elle n’a même pas besoin d’être bonne.

Votre corps a tout ce qu’il faut pour s’initier à ce sport. Avez-vous deux jambes avec deux pieds? Félicitations, vous avez tout ce qu’il vous faut pour y arriver. Cependant, il ne faut pas croire que la course à pied est quelque chose de facile. Il faut seulement savoir comment bien s’y prendre.

Parenthèse obligatoire

Il y a de ça plus d’un an que je me suis initié à la course à pied. Je sors courir environ quatre fois par semaine, le matin, avant de partir pour le boulot.

Ce que j’ai retenu de cette expérience est qu’aussi simple que semble la course à pied, lorsqu’on entreprend un entraînement de ce genre, il faut être préparé. Je me considère comme un débutant. Même que, à me comparer avec des coureurs plus expérimentés, j’ai encore beaucoup de croûtes à manger.

Le but de ce billet est de faire état de ce que j’ai appris et mis en place pour atteindre mon but de courir une distance de 10 kilomètres en un temps de moins de 60 minutes.

Pour ceux qui se demandent, à ma dernière course de la saison, j’ai complété une distance de dix kilomètres en un temps de 57:14.4. J’en étais fier!

Au début

J’ai commencé mon initiation à la course à pied comme beaucoup de gens que je connais. Un beau jour, j’ai voulu aller courir dehors pour voir comment ça irait.  Étant un peu sportif, je m’étais dit que ça n’irait pas si mal. J’ai donc enfilé mes souliers de sport et j’ai été courir.

Ce fut une catastrophe monumentale.

Au bout de trois kilomètres, j’avais les jambes qui voulaient abandonner mon corps et le cœur qui était sur le point de démissionner. J’en ai eu pour trois jours à me remettre de cette course tellement j’avais les jambes pleines d’acide lactique. J’y suis retourné de la même façon à trois reprises dans le même mois avec le même résultat.

À la lumière de cette expérience, c’est là que je me suis dit que je ne m’y étais pas nécessairement pris de la bonne manière.

Ce qu’il faut avoir

Ma principale motivation à courir était de pouvoir faire une activité sportive le matin, avant d’aller au travail. Alors, pour arriver à cette fin, j’ai eu à mettre mon cadran à 5h00 du matin afin d’être prêt pour sortir dehors dès 5h30. Ensuite, cela me laisse environ une heure pour réaliser ma course matinale. Au retour à la maison, je n’ai qu’à prendre ma douche et filer pour le boulot.

En effet, à certaines périodes de l’année, j’ai eu l’occasion de me lever et courir avant même le lever du soleil. Et puis, pour ceux qui se demandent, je me couche relativement tôt. Vers 21h, pas mal tous les jours. C’est la routine!

Pour les jours où je sors courir, je prépare les choses suivantes avant de me coucher.

  • Préparation de mon verre de jus d’orange de mon bol de céréales (pour qu’il ne me reste que le lait à couler).
  • Sortir les vêtements dont je vais avoir besoin pour l’entraînement (t-shirt, shorts et bas)
  • Préparation de ma ceinture de course : gourdes d’eau, pièces d’identité et clés de maison.

Le matin, je n’ai qu’à me lever, manger, m’habiller et sortir dehors pour aller courir. Il faut un minimum de distractions entre vous et la poignée de porte. Sinon, vous allez vous égarer et finir par ne pas sortir dehors.