mercredi 31 mars 2010

Extraction des META informations de SQL Server

Comment utiliser les vues INFORMATION_SCHEMA pour extraire des informations à propos des contraintes, triggers, etc.
Extracting META information from SQL Server (INFORMATION_SCHEMA) est un super article, plein d'exemples de Lorenzo Alberton.
A lire!

mardi 30 mars 2010

LinuTop - des mini-pc sous Ubuntu

Avoir un pc près à l'emploi dans son salon est quelque chose qui peut se révéler fort utile.
Avoir la connaissance encyclopédique d'Internet à disposition en moins de 10 secondes à deux pas du sofa est quelque chose de fabuleux.
Il y aura bien entendu les acharnés de l'informatique qui auront un bureau et PC aussi gros que possible, ou encore un portable avec des cables qui trainent un peu partout.

Pou les autres, il reste les clients légers, des mini-pc économiques en place, en consommation électrique et les en bruit.
Bien pratiques, ces clients légers sont maintenant accessibles au grand public à prix abordable (entre 200 et 400 eur).

Bien évidemment, comme dans bien d'autre domaines informatiques, il reste encore la question du système d'exploitation. La guerre fait rage entre les protagoniste de Microsoft, d'Apple et du monde libre.

Personnellement, en guise de client internet de type léger, j'utilise une distribution Ubuntu qui est libre, gratuite, facile d'utilisation et de maintenance. Sans aucuns anti-virus, ce client internet fonctionne depuis deux ans sans problème, sans inquiétude et sans tracas informatique (pas besoin d'être informaticien).
Il est donc normal de vouloir, pour mon client léger, du matériel supportant Ubuntu.



LinuTop s'inscrit dans cette lignée. C'est un client léger basé sur une distribution Ubuntu?



Plus d'information sur le site de LinuTop ou sur la fiche technique de LinuTop 3.

mercredi 17 mars 2010

String.Join - comment utiliser intelligement les Watch de Visual Studio

Voila un exemple issu d'un cas bien pratique.

Au cours de mon travail, je me suis retrouvé à documenter les cas d'utilisation d'une fonction permettant de tester les interactions médicamenteuses.
Cette fonction, visible ci-dessous, prends quelques paramètres donc certains sont des listes de string (les CNK étant les codes barre identifiant les médicaments).
public static List<InteractionOverview> GetDrugInteraction(
   string LangCode, 
   string ArticleCNKNr, 
   List<string> HistCNk, 
   List<string> delivCNK)

Bref, documenter un scénario ou un nouveau médicament au cours d'une vente (et impliquant la comparaison avec l'historique) représente certes 4 paramètres mais des listes qui peuvent devenir bien longues.

Copier le contenu de ces listes dans un document (pour documentation, tests ultérieurs ou comparaison) peut vite devenir fastidieux.
La capture suivante montre l'état d'un des 4 paramètres dans le débogueur.
J'avais une dizaine de cas à documenter... avec des ventes successives (on repasse donc par la même fonction et rajoutant à chaque fois un nouvel article à la vente).


Même les "Watch" ne peuvent pas se montrer bien utile... sauf si on les utilisent intélligement.

Utilisation intelligente du watch
Un watch permet de visualiser une valeur d'objet, variable, etc durant un processus en cous de débogage.
Un watch permet également d'afficher le contenu d'une expression! Et ca, c'est vachement utile.

En utilisant  une expression et String.Join, j'ai réduit mon travail de capture à une opération trivial, rapide et simple... tout ce qu'il me fallait pour travailler vite, efficacement et sans erreur.

Le watch de la mort qui tue 
Le principe est simple.
  1. On concatène les valeurs des arrays avec String.Join
  2. On concatène les paramètres (et résultats des String.Join) dans une string.
"ArtCnk: "+ArticleCNKNr.ToString()+"; HistCnk: "+String.Join(", ", HistCNk.ToArray() )+"; DelivCNK: "+String.Join( ", ", delivCNK.ToArray() )

Ce que le watch produit
ArtCnk: 1677780; HistCnk: 0119065, 0129890, 0129908, 0245415, 1077718, 1652049, 1652064, 1690262; DelivCNK: 1571272, 1542935, 2179612, 0102376

ArtCnk: 1265453; HistCnk: 2021848, 2024156, 2034981, 2035541; DelivCNK: 2024156, 1468552, 2322238, 0453480
Avec de tels résultats, la capture d'information devient vraiment trivial :-)

mardi 16 mars 2010

Ne pas oublier que...

Ceux qui font du bien, ils le font avec amour.
Mais quand ils font du mal, ce n'est généralement pas fait exprès.
Françoise Ch. 15 mars 2010

jeudi 4 mars 2010

Variance et ContraVariance en .Net

Quelques articles explicant les principes de Covariance et Contravariance dont l'implémentation est parachevée en C#4.
La Covariance et ContraVariance permet de faire un casting implicite pour supporter les types dérivés ou ancêtre (1*) lors d'appel de méthodes d'interfaces.
La Covariance et Contravariance s'applique également aux assignation de delegate.

(1*) Ce cas est décrit de façon plus claire dans les exemple du second lien.

Soit les classes suivantes:
  • T0 = Actor
  • T1 dérivée de T0 = Person
  • T2 dérivée de T1 = Employe
En utilisant le type <T1> dans une interface générique (ex: IEnumerable<T1>):
la CoVariance implique qu'une fonction Z peut retourner un élément de type T2 (casting implicite).
La contraVaiance indique qu'une fonction Y peut accepter un parametre de type T0 (casting implicite).
Dans les deux cas, si le procédé de CoVariance et ContraVariance n'existait pas, les deux cas décris ci-avant ne compileraient pas (le type alors toléré étant strictement T1).

Je vous invite à consulter les deux articles suivants pour plus d'information.