Timers en .NET

Dans le cadre d’un projet en C#, j’avais à lire des données dans un buffer n fois par secondes - rien de plus classique. Je me suis cependant rendu compte que cela nécessitait des Timers assez précis : si l’on perd ne serait-ce que 10 millisecondes par seconde à cause d’imprécisions du timer, le système devient rapidement impossible à gérer.

Or les différents types de Timers du .NET Framework ne fournissent qu’une précision maximale d’environ 20ms - et encore, cela dépend fortement du système hôte. C’est largement insuffisant pour de nombreuses applications où la gestion du temps est critique… Comment alors peut-on faire pour obtenir des ticks parfaitement réguliers ?

Il faut pour cela utiliser des Timers Multimédia. On désigne généralement sous ce nom les Timers faisant appel à des fonctions Win32 particulière, produisant des ticks très précis, mais assez couteux en temps processeur. Il n’existe hélas pas de Timer Multimédia dans le .NET Framework… On peut cependant faire une surcouche .NET à ces APIs, et ainsi utiliser des timers précis dans .NET. C’est ce que Leslie Sanford a fait, et cela fonctionne parfaitement.

L’inconvénient de ces Timers est bien sûr la non-portabilité, car ils marshallent directement les APIs Win32. Il est donc exclu de les faire fontionner sous PocketPC, SmartPhone, bref sous tout système non-Windows. Il doit y avoir moyen de les porter sous Linux, mais ce serait sans doute compliqué.

En tout cas cet article de Leslie Sanford est très instructif, et permet enfin d’avoir une synchronisation du temps correcte en C#.

The Multimedia Timer for the .NET Framework - The Code Project

CSS avancé dans un site de production

En utilisant un excellent tutoriel sur les Image Map de Stu Nicholls, dont j’ai déjà parlé dans ces colonnes, j’ai implémenté un site composé uniquement d’images et de zones réactives sur celles-ci, avec apparition de texte au survol, le tout en pur XHTML/CSS. Le tutoriel permet de ne pas se perdre et d’être sûr de fonctionner sous Internet Explorer.

Mais un autre point du cahier des charges était l’apparition de blocs de texte lors du clic, en plus du survol. Une solution est de faire un lien vers une page quasiment identique, mais comportant le bloc de texte ; ce n’est pas très élégant. J’ai donc utilisé les pseudo-classes CSS :active et :focus sur les zones réactives pour faire apparaître les zones de texte lorsque que les liens ont le focus - c’est à dire qu’ils ont été cliqués ou activé. La contrainte sur le XHTML est que tout le contenu texte du bloc à faire apparaître doit être contenu dans le lien réactif, il faut donc n’utiliser que des éléments inline. Mais au final, l’effet obtenu est assez réussi, le code élégant et surtout léger.

Quelques problèmes rencontrés néanmoins : les utilisateurs d’Opéra doivent maintenir le bouton de la souris appuyé pour voir le texte, à cause d’une bizarrerie de comportement de ce navigateur qui prend très mal en compte les liens actifs ; à noter également que les navigateurs Gecko 1.7 (comme Firefox 1.0*) n’affichent pas le texte lorsque l’on clique sur le texte de la zone réactive, il faut cliquer dans la zone mais pas sur le texte - ceci a été résolu dans Gecko 1.8 (et donc Firefox 1.5*). Tous ces comportements étranges peuvent sans doute être corrigés à l’aide d’un brin de Javascript non-obtrusif. Edit: C’est même un peu plus qu’un brin, mais le Javascript a été rajouté ; il dégrade sur la version “full CSS” si JS n’est pas activé.

Vous pouvez regarder le produit fini sur pourquoitucours.fr. Je requiers néanmoins votre indulgence car le site a été réalisé en très, très peu de temps ;)

Edit: Le site a depuis été remplacé par une autre version, réalisée par un autre développeur. Le lien donné n’a plus rien à voir avec moi, donc.

Menu déroulant en CSS uniquement

Si vous avez déjà essayé de faire un menu déroulant dans une page Web, vous avez sans doute constaté que c’est tout à fait réalisable en pur CSS (sans Javascript), mais qu’à cause des limitations d’Internet Explorer il fallait rajouter une surcouche de Javascript - ce qui empêche les visiteurs ayant désactivé Javascript d’utiliser le menu. Il est communément admis qu’un menu CSS-only n’est pas réalisable sous IE…

Hé bien Stu Nicholls a trouvé un moyen, et développé un menu déroulant sans Javascript, passant sous les principaux navigateurs, dont IE6 et IE7b. Il utilise pour cela une bizzarerie du rendu d’IE6, qui lui permet d’imbriquer des liens si ils sont contenus dans des tables. Grâce aux commentaires conditionels, le code général et la feuille CSS restent valides.

J’ai implémenté cette merveille du côté de Viens voir ce site !, ce sera en ligne d’ici quelques jours. Vous pouvez en attendant consulter la page de démonstration et d’explications de Stu Nicholls, The Ultimate CSS only Dropdown Menu. Enjoy !

Charts et Graphiques en C#

Dans le cadre d’un projet en C#, j’ai eu à représenter des courbes dans un repère - un peu comme sur l’écran d’un oscilloscope. J’ai donc dû me documenter sur les différentes possibilités d’afficher des graphiques, des courbes et des statistiques diverses en C#. Cela m’a conduit à plusieurs librairies et tutoriaux permettant d’atteindre ce but plus ou moins facilement.

Les librairies

NPlot

NPlot est une librairie de charts légère, mais semble-t’il assez complète. Sa courte page d’exemples est assez impressionante par le nombre d’options et de customisations possibles. Les graphiques produits peuvent être affichés dans un contrôle WindowsForm ou dans une page web ASP.NET. De plus, sa license personnalisée est compatible avec une utilisation commerciale et non contaminante - à l’inverse de la GPL. Malheureusement, il n’y a quasiment aucune documentation, ni, ce qui est bien pire, aucun exemple de code. Bref, par paresse, je n’ai même pas essayé. Mais l’auteur semble être en train de rédiger une documentation et des exemples complets ; NPlot peut donc être à surveiller.

ZedGraph

ZedGraph est une autre librairie OpenSource, plus puissante et plus complète que NPlot. Comme NPlot, elle est compatible WinForms et WebForms. Licencié sous LGPL, qui permet une inclusion à du code propriétaire sans problèmes particuliers, elle est très bien documentée (à l’aide de l’exellent NDoc), et surtout possède de nombreux exemples, ainsi qu’un tutoriel très complet sur Code Project. Bref, très complet, simple à utiliser… mais évidemment pas super légère, et ne convenant probablement pas à un usage PocketPC ou SmartPhone.

Tutoriaux

Création d’un contrôle utilisateur GDI+

Ce tutoriel, qui nous vient de Supinfo, explique comment créer un contrôle utilisateur utilisant GDI+. Cela permet en gros de créer un composant qui instanciera une surface et dessinera des primitives dessus. Le contrôle est ensuite exportable dans Visual Studio, et peut se configurer entièrement avec le Form Designer. Bref, un très bon pas-à-pas pour établir la structure d’un composant GDI+ générique.
Supinfo - Créer un contrôle utilisateur d’affichage des données

Charts minimalistes en C#

Ce second tutoriel, hébergé sur DevX, explique comme afficher des graphiques et des courbes statistiques en utilisant GDI+. Il détaille le système de changement de repère, la création d’échelles et de graduations, et bien plus encore. Le texte de l’article est assez avare en code, il faut penser à suivre les liens pour récupérer le code correspondant. C’est ce tutorial qui m’a été le plus utile pour arriver à mon propre composant.
Build a Reusable Graphical Charting Engine with C#

Conclusion

On trouve beaucoup de librairies .NET de Charts sur le web, mais beaucoup sont payantes, certaines reposent sur l’infâme controle ActiveX d’Office, difficilement réutilisable… J’espère avoir pu montrer toutes les possibilités offertes par les librairies gratuites, ainsi que la possibilité de construire sa propre librairie facilement.

Configurer son DNS avec BIND

Ceux qui font un peu d’administration serveur ont du se perdre assez fréquemment dans les méandres de BIND et des configurations DNS. Ce long tutorial, trouvé sur Howtoforge, vise à tout reprendre de zéro, et à faire réellement comprendre la manière dont le système DNS fonctionne. Après cette lecture, au moins, on sait ce que l’on fait quand on configure BIND, ce qui est très agréable.

Traditional DNS Howto