Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Menus de XP trop rapides à la détente

Une petite astuce simple en passant...

Vu que le monde entier n'a pas encore basculé sous Vista (malgré des avantages certains) et que ce bon vieil XP se rencontre encore un peu partout cette astuce devrait en intéresser plus d'un !

J'ai eu le cas sur l'un de mes portables et j'ai eu beaucoup de mal à trouver la réponse d'où l'intérêt de la publier même si ce n'est pas l'affaire du siècle.

Le symptôme : vos menus sous XP s'ouvrent très vite, bien trop vite, et c'est très agaçant. Il existe pourtant une façon bien simple de régler le problème, simple une fois que l'on sait, comme souvent en matière de technique (et même en général !).

Lancez Regedit pour accéder à la registry, puis ouvrez les noeuds HKEY_CURRENT_USER, Control Panel, Desktop. Stop, on y est ! Dans le volet de droite chercher la clé: MenuShowDelay. Regarder la valeur, elle doit être bien basse. La valeur "agréable" (chacun ses goûts bien entendu) se situe entre 200 et 500 en balayant large. Bien entendu vous pouvez mettre moins si vous recherchez l'effet contraire (accélérer l'affichage des menus) ou beaucoup plus si vous préférez déclencher les ouvertures de menu par des clics volontaires au lieu des ouvertures automatiques.

Si la clé n'existe pas, créez là, de type REG_SZ (donc chaîne de caractères).

Voilà, comme je le disais en intro, c'est pas le scoop du millénaire, mais personnellement ça m'a franchement changé la vie sur ce portable. Si j'en sauve juste un seul de la crise de nerf, je serai heureux :-)

Stay tuned !

Le coin des bonnes adresses Microsoft

La nouvelle année est l'occasion de mille nouvelles promesses et bonnes résolutions qui seront souvent fort peu suivies d'effet ! Ainsi va la nature humaine.

Si se former, s'intéresser aux nouveautés, rester au top de la technologie fait partie de votre liste de bonnes résolutions pour 2008 alors soyeux heureux, j'ai un bon moyen pour qu'au moins vous puissiez tenir cette promesse ! Comment ? En suivant les liens de cette collection d'adresses indispensables !

Bonne lecture !

ThèmesDescriptionAdresse
Architecture Une vision des dernières technologies et applications, donnant des idées et des exemples sur la manière de les intégrer avec succès dans la mise en oeuvre des architectures. www.microsoft.com/architecture/
Framework Centre d'information .NET Framework msdn.microsoft.com/netframework
Micro Framework Vous connaissez le Compact Framework, mais le Micro Framework (ou embedded framework) ? Vous saurez tout en suivant ce lien ! msdn2.microsoft.com/en-gb/embedded/bb267253.aspx
ASP.NET Centre d'information et de ressources ASP.NET www.asp.net/
IIS Centre d'information et de ressources MS Internet Information Services www.iis.net
Learning center Le centre de formation MS sur toutes les technos de l'éditeur www.microsoft.com/learning
Sécurité Centre d'information sur la sécurité (articles, webcasts...). A ne pas négliger ! msdn2.microsoft.com/en-us/security/aa973363.aspx
SQL Server Toute l'information sur SQL Server www.microsoft.com/sql/default.mspx
Sync Framework ADO.NET Entity Framework, ADO.NET Data Services (Astoria), que des choses importantes ! msdn2.microsoft.com/en-us/data
MS United Communication Microsoft UC offre une palette de choix dans la manière dont les communications et la collaboration des logiciels sont implémentées, gérées et maintenues.
www.microsoft.com/uc/default.mspx
VS 2008 L'IDE star a aussi son site ! msdn2.microsoft.com/en-us/vstudio/default.aspx
Windows Server 2008 Le nouveau serveur Windows www.microsoft.com/windowsserver2008/
Vista Toute l'info sur cet OS www.microsoft.com/windowsvista/businesses/default.mspx
MSDN L'incontournable site d'information de Microsoft www.msdn.com

Le DVD des TechEd est arrivé !

Pour les chanceux qui ont participé aux TechEd Developers 2007 qui se sont tenues à Barcelone du 5 au 9 novembre (voir mes billets à ce sujet), la boucle est enfin bouclée avec l'arrivée du DVD dans nos chaumières !

La bonne surprise c'est qu'il s'agit de 2 DVD et non d'une seul puisque la pochette contient aussi celui des TechEd IT Forum, événement qui se tenait au même endroit la semaine suivante (12-16 novembre). En raison malgré tout des coûts liés à un séjour de deux semaines certainement peu d'entre nous ont pu participer aux deux événements chacun ayant choisi celui qui lui semblait le plus proche de ses besoins immédiats. Néanmoins, les participants de l'IT Forum seront certainement très heureux de visualiser les vidéo des sessions des TechEd Developers, l'inverse sera tout aussi vrai. Il faut donc remercier Microsoft de n'avoir pas mesquiné en envoyant à tout le monde les deux DVD !

L'année commence donc bien et même si les vidéos étaient disponibles sur le Web pour les participants (nouveauté 2007) dès la semaine suivante les TechEd, chacun appréciera le confort d'un DVD ne nécessitant pas forcément d'être connecté en ADSL pour voir ou revoir les meilleures conférences.

Bonnes fêtes de fin d'année !

La trève des confiseurs est un rituel sacré, au sens propre pour certains, au sens purement laïc et festif pour les autres. Que vous fassiez partie des premiers ou des seconds, je vous souhaite d'excellentes fêtes de fin d'année.

L'année qui s'achève a été riche en annonces. L'année 2008 qui va s'ouvrir sera l'une des plus exitantes dans notre métier, l'année de LINQ, de l'Entity Framework, de Silverlight, de Astoria (Adot.net data services), de Blend 2.0, et de toutes ces nouveautés extraordinaires ! Vivement 2008 !

Passez de bonnes fêtes !

 

Multithreading simplifié

Le multithreading c'est l'épouvantail du développeur. Vous en parlez, hop! tout le monde s'en va de la machine à café... et s'il y en a un qui ne part pas , c'est le genre fanatique qui va débaler une science opaque sur les AppDomains, les mutex et autres mots qui fâchent, du coup, c'est vous qui partez :-)

Je carricature à peine...

C'est tout le problème du multithreading. Pratiqué avec simplicité c'est une technique de plus en plus indispensable pour tirer partie des microprocesseurs multicoeurs et fluidifier les interfaces, mais voilà, comment faire simple avec une telle technique ?

Les puristes vous diront qu'il faut absolument comprendre la technique, et qu'en suite c'est facile... Un peu comme Coluche qui expliquait dans l'un de ses sketchs que son professeur de violon lui avait dit d'apprendre à jouer avec des gants de boxe parce que quand on les enlève ça semble facile...

Je ne vais pas vous dire qu'une démarche rigoureuse est inutile, j'ai un module de multithreading avancé dans mes plans de cours et, bien entendu, voir les choses en profondeur au sein d'une formation est le seul moyen de maîtriser cette technique. Mais il existe aussi des façons simples d'introduire un peu de multitâche dans vos applications.

Il s'agit du composant BackgroundWorker des Windows Forms. Certes le sujet tranche avec mes billets généralement plus orientés vers les super nouveautés hypra fraîches à tel point qu'elles sont même parfois en bêta... Mais il faut bien maintenir les applications existantes, les améliorer, et pour cela il existe, comme le BackgroundWorker des solutions pratiques qui ne nécessitent pas d'installer le framework 3.5 puisque cette classe a été fournie avec .NET 2.0.

De plus, ce composant Windows Forms n'impose pas de connaître les mécanismes du multithreading, il suffit de programmer ces événements comme un bouton. Trop facile ? Peut-être que cela choquera les puristes parce que "cela cache la réalité de ce qui se passe vraiment dans la machine", je leur répondrais que faire du C# au lieu de faire de l'assembleur c'est un peu pareil... Là où je les rejoindrais c'est que, bien entendu, la classe backgroundWorker ne doit pas être utilisée à tord et à travers. Si l'on désire concevoir des classes gérant finement le multitâche, il faut réellement comprendre et donc apprendre. Mais dans de nombreux cas, le BackgroundWorker pourra vous être utile et rendre plus fluide vos applications Windows Forms sans avoir à entrer dans les détails d'une technique un peu aride.

Mais trève de mots, le plus simple c'est de jouer avec ce composant pour se rendre compte de son utilité. Pour facilité la.. tâche... je vous ai préparé un petit projet VS 2005 qui montre comment se servir de backgroundWorker : BGW.zip (41,83 kb)

Un peu de douceur multitâche dans ce monde de multicoeurs...

LINQ à toutes les sauces !

Je suis en train de boucler mon article de présentation de LINQ. Au départ je pensais m'en sortir en une dizaine de pages, mais j'en suis à plus du double... juste pour faire le tour des principales possibilités et sans détailler la syntaxe (ce n'est pas le but de cet article).

J'ai eu maintes fois l'occasion de vous dire ici que LINQ est l'innovation la plus fantastique que j'ai vue depuis longtemps dans un langage. Vous en saurez plus en lisant le prochain article qui sera en ligne ce week-end, mais pour vous prouver que LINQ peut servir partout et tout le temps voici deux exemples à contre-courant de l'idée qu'on se fait des utilisations possibles de LINQ :

Cas 1 : Lister les services actifs de Windows.

C'est bête mais balayer et filtrer une simple liste comme celle là (et de bien d'autres du même genre retournées par le framework .NET ou par vos applications), c'est produire du code pas très marrant... Avec LINQ ça devient :

using System.ServiceProcess; 
var srv = from s in ServiceController.GetServices()
         where s.Status == ServiceControllerStatus.Running
         select s.DisplayName;
ListBox1.DataSource = srv.ToList();

 
Je trouve ça élégant, pas vous ?

Cas 2 : Remettre à unchecked tous les Checkbox d'une form

Balayer certains contrôles d'une fiche n'est là non plus pas l'endroit où l'on s'attend à trouver du LINQ... Et pourtant ! Imaginons une fiche de saisie avec des tas de checkbox et un bouton "raz" de remise à zéro de la fiche. Balayer tous les contrôles de la fiche pour ne sélectionner que les checkbox n'est pas un code bien complexe mais avec LINQ ça devient tellement plus chouette !

var cb = (from Control c in this.Controls select c).OfType<CheckBox>();
foreach (var c in cb) c.Checked=false;
 

C'est pas plus joli et plus clair écrit comme ça ? (et encore on pourrait se passer de la variable "cb" et intégrer directement la requête LINQ après le "in" du "foreach")?

Bref, LINQ j'adore. Et j'espère bien que le papier à venir va vous transformez en fans vous aussi ! alors... Stay tuned !

Kit gratuit d'entraînement pour Visual Studio 2008 et le framework 3.5

Microsoft a mis en téléchargement public un kit d'entraînement pour VS 2008 et le framework 3.5.

Le fichier pèse environ 120 Mo, vous pouvez le télécharger en cliquant ici.

Le contenu

Ce training kit est en fait le contenu de formation qui a déjà été donnée sur 5 jours à un certain nombre de partenaires Microsoft ces mois derniers. Il contient 20 hands-on-lab, 28 présentations et une vingtaine de démos scriptées pour se former au produit et à ses nouveautés.

Le contenu a été mis et jour pour refléter la réalité de la version finale (distribuée aux abonnées MSDN depuis ce mois-ci en attendant la mise sur la marché en février prochain - vous pouvez donc utiliser la bêta 2 en téléchargement gratuit dans ce laps de temps si vous n'êtes pas abonné MSDN).

Les sources d'info complémentaires

Le petit supplément de Monsieur Plus : je vous rajoute en prime les liens de plusieurs vidéos complémentaires au kit :

Rien que du bon, mais en anglais. Pour les francophiles/phones anglophobes il faudra attendre mes articles à venir.. Alors : Stay Tuned !

SQL Server 2008 et le type FileStream - résumé de la conférence DAT304 des TechEd 2007

Gérer des données "raw" tels que des fichiers multimédia, de la documation, etc, dans une base de données est un sujet qui divise les développeurs depuis longtemps. SQL Server 2008 va (enfin) mettre fin à cette dispute de principe !

DAT304 - Managing Unstructured Data in SQL Server 2008: Introducing the Filestream Datatype

Je n'ai suivi que partiellement cette conférence, il faudra d'ailleurs que je profite de la diffusion en ligne des vidéos pour les participants aux TechEd pour la regarder en totalité. Ce qui m'intéressait c'était l'info elle-même qui se résume à un nouveau type champ dans SQL Server. Mais c'est une avancée de taille, je vais vous expliquer pourquoi en quelques lignes...

Le duel blob vs file system pour les données raw

En effet, il y a d'une côté les tenants du "tout file system" c'est à dire le stockage des fichiers en dehors de la base de données avec juste le stockage des noms de fichiers dans la base elle-même. Pour: la simplicité, la gestion des flux du file sytem généralement plus performante que les blobs. Contre: le manque cruel de consistence, pas de contexte transactionnel, backups à faire séparément, etc, etc. Je fais partie des "anti" d'ailleurs.

De l'autre côté il y a ceux qui préfèrent le stockage en blob. Pour : consistence des données, contexte transactionnel, backup unique, etc. Je pour pour cette solution en général. Contre : les blobs sont moins rapide en lecture / écriture de flux que le file system, certains SGBD imposent des limites à la taille des blobs. Si on fait abstraction de ce dernier argument (il suffit d'utiliser une base n'ayant pas cette limite, par exemple SQL Server 2005 ou même Firebird/Interbase), le léger inconvénient de la rapidité (qui reste modeste et peu gênant dans la plupart des cas) est largement, à mon avis et par expérience, compensé par les avantages de cette technique. Reste qu'on peut faire mieux...

Mélanger le meilleur des deux solutions 

C'est justement ce que propose SQL Server 2008 avec le nouveau type FileStream qui est une extension de VARBINARY(MAX) qui s'en distingue par un attribut lors de la création du champ.

Le principe est simple : on marie le meilleur des deux solutions existantes. On prend la souplesse (gestion des quotas par ex) et la rapidité du file system (NTFS obligatoirement) et on l'associe à la cohérence des données de la solution blob. En gros, SQL Server 2008 stocke les fichiers dans le file system mais assure l'accès à ces fichiers comme à n'importe quel autre champ ce qui permet la gestion transactionnelle, le backup unique et centralisé.

Conclusion 

Une solution simple et performante à un problème de plus en plus crucial, les utilisateurs devant de plus en plus gérer des données lourdes (photos, documents digitalisés, vidéos...) en synchronisme parfait avec les bases de données. Une fichier client peut comporter une photo, une fiche article une vidéo de présentation, tout cela n'est plus "exotique", cela devient une contrainte légitime d'exploitation.

Pour l'instant SQL Server 2008 est en bêta, mais comme son nom l'indique il devrait être bientôt sur le marché...

Encore une bonne idée, ingénieuse et simple à mettre en oeuvre. Je trouve que les équipes de dev de MS ont vraiment l'âme créative depuis qu'on est entré dans ce que j'appelle "l'ére .NET". Souhaitons que ça dure le plus longtemps possible !

A+ pour un nouveau billet. Stay tuned !

DeepFish, votre PDA va ferrer un gros poisson !

Deepfish vous ne connaissez pas encore ?

C'est le futur navigateur Web pour Windows Mobile de Microsoft. Il fonctionnera donc sur toutes les plateformes mobiles acceptant l'OS Microsoft, PDA, Smartphones, ou Pocket PC's.

La grande nouveauté dans ce produit n'est pas juste de pouvoir naviguer, ce qu'on peut déjà faire avec la plupart des machines mobiles sous Windows Mobile. La véritable innovation c'est qu'on peut surfer sur tous les sites web en voyant la page exactement comme on la verrait sous IE ou Firefox sur un PC "normal", donc sur tous les sites du Web de la planète !

Fini la programmation spéciale des sites Web pour être utilisables par des unités mobiles ! C'est un grand pas en avant, une solution élégante à un problème jamais résolu. On se souviendra de l'échec du WAP par exemple dont les SSII parisiennes chantaient les louanges à chaque client dans l'espoir de décrocher des contrats.. C'était juste avant l'explosion de la "bulle internet"...

Terminé donc les fausses solutions coûteuses. Seul hic à la solution Deepfish, à mon sens, c'est que toutes les requêtes internet doivent passer par un proxy Microsoft pour être traitées. C'est là en effet que se cache l'astuce de Deepfish : toutes les pages sont prétraitées par ce proxy qui les retaille pour qu'elles s'affichent sur votre PDA comme sur un PC. Combien de proxies MS va-t-il installer dans le monde pour que le système reste fluide ? D'autres sociétés auront-elles le droit de proposer leurs propres proxies sur la même technologies ? Quid de la confidentialité des requêtes centralisées par le proxy ? Deepfish n'est encore qu'une bêta et ces questions trouveront certainement réponses naturellement dans les mois à venir. Je n'ai pas non plus balayé 100% des sites MS sur le sujet et peut-être certains lecteurs de ce billet savent-ils des choses que j'ignore. Dans ce cas, n'hésitez à compléter l'info en laissant un commentaire, c'est aussi fait pour ça !

Une petite vidéo sur Youtube montrant Deepfish à l'oeuvre sur un petit portable :


P1000844_xvid
envoyé par edupin

Une autre vidéo créée par le labo MS de SupInfo (Lire leur billet sur Deepfish)

Présentation de Deepfish

Bon (micro) surf sur votre smarphone !

Entity Framework Application Patterns. Résumé de la conférence DAT303 Teched 2007

Hier je vous ai résumé la conférence DAT201 qui présentait l'Entity Framework. Aujourd'hui je vous parlerai plus brièvement d'une autre conférence. Cette brièveté du résumé ne doit pas vous induire en erreur : la conférence DAT303 de Pablo Castro, Technical Lead, est peut-être la meilleure à laquelle j'ai assitée.

D'abord Pablo est un jeune gars sympa. Ensuite malgré un fort accent cubain ou mexicain il a soutenu une conf à un rythme d'enfer tout en étant d'une grande clareté, une vraie conf technique comme je les aime, faite par un passionné qui connaît son affaire. Enfin, cette conférence dépassait le cadre de la présentation générale pour parler vrai et pratique. Là, Pablo m'a appris des choses sur l'Entity Framework. Des trucs pas simples à découvrir tout seul, une conférence qui fait vraiment gagner du temps et de la compétence. Merci Pablo !

Si le résumé sera court c'est que 95% de la conférence de Pablo était basée sur du code. Vous imaginez bien qu'il n'était pas possible de prendre le tout en sténo dans la pénombre de la salle de conf... J'ai revisionné aujourd'hui la conf (puisque toutes les sessions principales ont été filmées), et franchement même assis dans mon bureau à l'aise il nétait pas possible de noter la totalité des manips, toutes essentielles. J'ai d'ailleurs demandé à Pablo s'il pouvait avoir la gentillesse de m'envoyer le code source de ces démos, et s'il accèpte je les mettrais en téléchargement ici.

Donc de quoi s'agissait-il ?

Bien entendu de l'Entity Framework, depuis mon billet d'hier vous devez savoir de quoi il s'agit (sinon foncez lire ce dernier, ne vous inquiétez je ne bouge pas, vous pourrez revenir ici plus tard :-) ).

Mais il n'était plus question ici de parler en général ou même en détail du fonctionnement de EF, il s'agissait de voir comment s'en servir "en vrai" dans trois conditions :

  • En 2 tiers
  • Dans une application Web
  • Au sein d'une architecture 3-tiers

En effet, le principal problème de toute surcouche est de manger un peu plus de CPU et de mémoire que la couche du dessous. C'est la règle en informatique, plus c'est pratique et puissant, plus la machine doit pédaler. Et même si EF est très efficace et très optimisé, ce qu'il fait en plus possède forcément un coût. Il est donc essentiel de pouvoir maîtriser ce coût en faisant des économies là où cela est possible.

La bonne nouvelle c'est que EF le prévoit et que la mise en oeuvre est simple. La moins bonne nouvelle c'est que la chose devient un poil plus "mystique" et qu'il faut réfléchir un peu plus. Mais un informaticien paresseux des neurones est soit en chômeur en puissance, soit un ex-informaticien au RMI...

Change tracking et Identity resolution

Deux mécanismes peuvent être économisés (et les ressources CPU/RAM qui vont avec) : Le change tracking et l'identity resolution. Le premier, détection des changements, permet à l'EF de savoir quels objets ont été modifiés pour savoir comment appliquer les mises à jour à la base de données. Si certaines entités (ou grappes d'entités) ne seront pas modifiées on peut alors se passer du mécanisme de détection des changements... L'identity resolution, ou résolution des identités est utilisée pour identifier de façon formelle toutes les instances des entités. Il est en effet primordial pour le système de savoir à quel(s) enregistrement(s) de la base de données corespond(ent) l(es) entité(s) sinon il est impossible d'envisager des fonctions comme le refresh, l'update ou le delete...

Heureusement EF est très bien conçu et il est possible de stopper ces mécanismes là où on le désire. Ce court billet (qui devient déjà long...) n'entrera pas dans les détails, je prépare un article sur la question, format plus adapté à un long exposé technique avec exemples de code.

Des entités qui passent les frontières... 

Un autre problème se pose, notamment dans les applications en multi-tiers : lorsqu'une instance d'entité est passée en dehors du système, EF en perd la trace... Imaginons un serveur applicatif qui utilise EF pour accéder à une base de données afin d'offrir des services de type WCF (ex remoting, pour simplifier) ou même des services Web. Les changements dans les objets ont lieu en dehors même de la machine qui utilise EF. Le lien est cassé et si l'objet revient au serveur applicatif qui doit en retour mettre à jour la base de données, EF ne le connaîtra plus et ne pourra pas l'intégrer à son mécanisme de mise à jour de la base.

Là encore EF permet de contourner le problème. La façon de le faire sera aussi décrite dans le papier en cours de préparation, soyez patients !

Compilation LINQ 

Enfin, Pablo a montré comment économiser des ressources du côté de LINQ cette fois-ci en utilisant la possibilité de compiler la requête sous la forme d'un delegate qu'il suffit ensuite d'appeler. L'utilisation des expressions Lambda et l'utilisation des interfaces idoines permettent même d'avoir une requête compilée mais paramétrique dont le résultat peut être réutilisé dans une autre requête LINQ. Pas de magie, et peu de code à taper pour réaliser tout cela. En revanche, une fois encore, cela ne s'improvise pas si on ne connaît pas l'astuce.

Conclusion

Une conférence riche, dense et instructive. Je pourrais en parler encore des pages entières mais sans la contrepartie du code exemple et des explications qui vont avec ce billet deviendrait vite ennuyeux. Je préfère m'arrêter là et réserver les détails d'implémentation pour l'article que je prépare sur ce sujet. Bien entendu il sera annoncé ici et sera téléchargeable gratuitement comme d'habitude.

Une dernière chose, Pablo nous a fait voir un peu Astoria, un procédé permettant d'exposer une (partie d'une) base de données en HTTP dans un formalisme XML. Une sorte de Web service généré automatiquement pour chaque classe et qui, par des GET ou des POST permet d'accéder aux données mais aussi de mettre à jour les données dans un mécanisme de type accès à une page Web ! Je n'ai pas eu le temps de creuser la question ni de faire tourner de bêta de Astoria, mais soyez sûrs que dès que j'en aurais fini avec mon tri de toutes les conférences des TechEd, Astoria sera au programme !

Plein de nouveautés encore à venir, so, stay tuned !