Depuis la sortie de .NET Microsoft n'arrête plus sa course folle ! La plupart des technologies publiées faisaient partie d'un plan presque totalement connu à l'avance, comme WPF, WCF etc. Il a fallu du temps pour qu'émerge ses "modules" de .NET car même le plus puissant des éditeurs de logiciels du monde ne peut pas releaser la totalité d'une montagne comme .NET en un seul morceau. S'il était clair que WPF serait la nouvelle gestion des interfaces utilisateurs et que Windows Forms n'était qu'un "os à ronger" en attendant, le foisonnement des technologies tournant autour des données n'était pas forcément visible ni prévisible il y a quelques années. Et même aujourd'hui savoir ce qui existe et comment s'en servir avec l'ensemble des autres technologies n'est pas forcément une mince affaire !
Un petit dessin valant tous les discours, voici un diagramme qui tourne sur les blogs américains de Microsoft et que j'ai en partie traduit pour vous, en espérant que cela vous aidera à y voir plus clair !
Quelques précisions pour certains acronymes ou noms de technologies :
[Faite un clic-droit sur l'image et copiez-la pour l'afficher en 100% dans Word ou autre ]
Dans la jungle épaisse de MSDN on trouve des milliers de choses passionnantes, souvent par hasard car par définition une jungle est inextricable et MSDN n'échappe pas à la règle... Il est d'ailleurs parfois plus rapide et plus sûr de chercher une info dans Google pour trouver le lien dans MSDN que de chercher directement dans ce dernier ! Et pourtant... Cette jungle cache de nombreux trésors qui ne s'offrent qu'aux intrépides aventuriers osant s'enfoncer dans la moiteur tiède de l'information, sautant de lien-lianne en lien tel un Tarzan numérique...
Bon trève de plaisanterie, j'en reviens à l'essentiel : "Comment je fais ?".
Comment je fais "quoi" ? Allez-vous rétorquer. Tout. Plein de choses. Par exemple, Comment j'utilise l'Entity Framework, Comment je commence avec ADO.NET Data Service, Comment j'utilise le control LinqDataSource, Comment j'utilise le DataSet en multi-tiers ? Etc, etc.
Pour toutes ces questions il existe en réponse une vidéo, claire, expliquant par l'image et la parole ce qu'il faut savoir.
Bien entendu tout cela est en anglais et en concernera donc que les lecteurs capables de suivre une démo dans cette langue sans en perdre les trois quarts.
Si vous faites partie des heureux anglophones à qui ce genre de média ne fait pas peur, rendez vous sur la page des "How Do I?"...
[EDIT]
Le lien que je donne concerne les "How Do I" des données. Sylvain dans son commentaire à ce billet donne un autre lien concernant la série "How Do I" pour ASP.NET.
En fouillant sur MSDN on peut aussi trouver une série pour le "Native Coding" (C++ Win32), une autre pour Visual Studio, ou pour les Devices (Compact Framework), ou encore Office et les XML API, etc.
Toutes les séries "How Do I" ne sont pas forcément dotées de vidéos, en revanche, à la page suivante vous trouverez la liste de toutes les vidéos "How Do I" quel que soit le sujet abordé (à ce jour : ASP.NET, Ajax, Devices, Native Coding, Security, Silverlight, VB, VS, VS tools for Office, VSTS, Windows Forms, WPF).
[/EDIT]
Bonne vidéos
et Stay Tuned !
Aujourd'hui plus personne ne fait de sauvegarde sur CD ou DVD, ou très rarement : la capacité des disques durs est telle qu'il en faudrait une brouette pleine à chaque fois. Outre le prix délirant de telles sauvegardes, elles prennent un tout fou à faire et on le sait désormais que nous avons un peu de recul : les supports CD/DVD enregistrables ne sont plus lisibles une fois sur deux quand on a justement besoin de ce qui est dessus quelques années plus tard...
Résultat, tout le monde ou presque possède plusieurs disques durs internes et externes où les copies se multiplient.
Hélas, on s'aperçoit assez vite que cette stratégie a elle aussi ses limites : soit il faut systématiquement tout recopier, ce qui peut être très long pour des gros disques, soit il faut synchroniser les disques. Sinon, on se retrouve avec les mêmes fichiers en dix versions différentes sur plusieurs disques, et la bonne idée des sauvegardes se transforme parfois en cauchemard par l'écrasement d'un fichier par une version ancienne - erreur de manipulation fatale... (que celui à qui cela n'est jamais arrivé me lance le premier CD !).
Synchroniser. Le mot est donc lâché. Mais avec quoi ?
Personnellement j'ai longtemps utilisé un petit soft maison (en delphi) mais je n'ai jamais eu le temps de le finir comme je le voulais. J'ai aussi testé à une époque SynchronizeIt! un logiciel pas trop mal mais payant.
Aujourd'hui Microsoft nous offre gratuitement SyncToy 2.0, un outil de synchronisation de disques ou de répertoires paramétrable, simple d'emploi et permettant de balayer les principaux cas qui justifient d'utiliser une synchronisation, comme l'écho (l'esclave reflète le maître), la participation (l'esclave reçoit tout ce qui est nouveau du maître mais aucun fichier n'y est supprimé) etc.
Le logiciel offre un mode de prévisualisation qui permet de vérifier avant de lancer la synchro si tout semble ok.
Dès lors il est facile et rapide de synchroniser les disques de sa machine avec des disques externes. J'utilise par exemple un IOMEGA 1Tera externe comme "base" de sauvegarde de toutes les machines (chacune possède sur l'IOMEGA un répertoire à son nom où son disque Data est copié) ainsi qu'un Plextor 500 Mo portable qui duplique ma machine de base et avec lequel je vais partout en complément de mon portable.
Synchronizer tout ce petit monde (la station de musique et la station graphique en supplément) se fait maintenant en quelques clics et de façon fiable grâce à SyncToy.
Copier n'est pas jouer. En effet, c'est même vital. Alors pourquoi se priver d'un bel outil spécialisé et gratuit ?
Pour le télécharger c'est ici : SyncToy 2.0
[EDIT]
A noter: SyncToy fait parfaitement son travail mais dans certains cas il peut être lent, voire très lent. En général la synchro d'un gros disque s'effectue en tâche de fond, éventuellement déclenchée par une tâche planifiée et cela n'est donc pas très gênant. Mais ne soyez pas surpris si, lors d'une synchro notamment avec disque externe USB, l'opération prend plusieurs heures... En revanche avec des disques internes ou avec mon Plextor 500 qui marche en Sata, c'est très rapide.
Ceux qui trouveraient que ces attentes sont trop longues pour leurs besoins, ils peuvent aussi essayer le très bon AllWays Sync qui existe en version gratuite ici : http://allwaysync.com/index.html.
[/EDIT]
C'est pas une bonne nouvelle ça ?
... Alors Stay Tuned !
J'ai eu moulte fois ici l'occasion de dire tout le bien que je pense de LINQ, de sa puissance, de sa souplesse, de sa versatilité (de xml à SQL en passant par les objets et l'Entity Framework).
Mais une petite chose me chagrinait : toute cette belle puissance s'entendait "hard coded". Je veux dire par là que les expressions et requêtes LINQ s'écrivent en C# dans le code et qu'il semblait très difficile de rendre la chose très dynamique, sous entendu dépendant d'expressions tapées à l'exécution de l'application. En un mot, faire du LINQ dynamique comme on fait du SQL dynamique.
Ce besoin est bien réel et ne concerne pas que les sources SQL. Prenez une simple liste d'objets que l'utilisateur peut vouloir trier selon l'une des propriétés ou filtrer selon le contenu des objets... Comment implémenter une telle feature ?
Contourner ce manque en écrivant des parsers, en jonglant avec les expressions lamba et la réflexion n'est pas, il faut l'avouer, ce qu'il y a de plus simple. Mais rassurez-vous chez Microsoft des gens y ont pensé pour nous ! Seulement voila, la chose est assez confidentielle il faut bien le dire, et on ne tombe pas dessus par hasard. Ou alors c'était un jour à jouer au Lotto, voire à contrôler, selon les mauvaises langues, l'emploi du temps de sa femme !
La chose s'appelle "LINQ Dynamic Query Library", un grand nom pour une petite chose puisqu'il s'agit en réalité d'un simple fichier source C# à ajouter à ses applications. Mais quel fichier source !
Toute la difficulté consiste donc à savoir que ce fichier existe et mieux, où il se cache... C'est là que c'est un peu vicieux, la chose se cache dans un sous-répertoire d'un zip d'exemples Linq/C#, fichier lui-même astucieusement planqué dans la jungle des milliers de téléchargement de MSDN...
Sans plus attendre allez chercher le fichier cliquant ici.
Une fois que vous aurez accepté les termes de la licence ("I Accept" tout en bas à gauche) vous recevrez le fichier "CSharpSamples.zip". Dans ce dernier (dont tout le contenu est vraiment intéressant) aller dans le répertoire "LinqSamples" puis dans le projet "DynamicQuery" vous descendrez dans une autre sous-répertoire appelé lui aussi "DynamicQuery" (non, ce n'est pas un jeu de rôle, juste un téléchargement MSDN!). Et là, le Graal s'y trouve, "Dynamic.cs".
Copiez-le dans vos projets, et ajouter un "using System.Linq.Dynamic". A partir de là vous pourrez utiliser la nouvelle syntaxe permettant de faire du LINQ dynamique. A noter que dans le répertoire de la solution vous trouverez aussi un fichier "Dynamic Expressions.html" qui explique la syntaxe du parser.
Quelles sont les possibilités de LINQ Dynamic Query Library ?
C'est assez simple, pour vous expliquer en deux images je reprend deux captures écrans tirées du blog de Scott Guthrie (un excellent blog à visiter si vous parlez l'anglais).
Voici un exemple de requête LINQ (en VB.NET, si j'avais refait la capture cela aurait été du C#, mais je ne vais pas rouspéter hein ! )
Maintenant voici la même requête utilisant du LINQ dynamique :
Vous voyez l'astuce ? Le filtrage et le tri sont maintenant passés en chaîne de caractères... Bien entendu cette chaîne peut avoir été construite dynamiquement par code (c'est tout l'intérêt) ou bien saisie depuis un TextBox rempli par l'utilisateur.
Ici pas de risque d'attaque par "SQL injection", d'abord parce que LINQ n'est pas limité à SQL et que le problème ne se pose que dans ce cas, mais surtout parce que LINQ to SQL utilise des classes issues d'un modèle de données "type safe" et que par défaut LINQ to SQL est protégé contre les attaques de ce type. Pas de souci à se faire donc.
Pour terminer j'insisterai lourdement sur le fait que LINQ ne se limite pas aux données SQL, et que l'astuce de LINQ dynamique ici décrite s'applique même à LINQ to Object par exemple. Laisser la possibilité à un utilisateur de trier une List<> ou une Collection<>, de la filtrer, tout cela en mémoire et sans qu'il y ait la moindre base de données est bien entendu possible.
LINQ est vraiment une innovation majeure en matière de programmation, pouvoir le dynamiser simplement c'est atteindre le nirvana...
Je vous laisse vous jeter sur vos claviers pour expérimenter du LINQ dynamique, amusez-vous bien !
..et surtout.. Stay tuned !
Il n'y a pas que le "Set of" de Delphi qui peut donner le blues (voir ce billet pour comprendre), non, il y a pire, sous tous les langages, depuis toujours, sous tous les OS, l'informaticien a toujours eu le blues des générateurs d'état, et le blues, c'est peu dire...
[EDIT: Voir ce billet plus récent qui propose un tutor complet]
Les delphistes ont pesté contre QuickReport et ses bugs après avoir ronchonné sur ReportSmith (qui s'en souvient?), Borland l'a remplacé un jour par RaveReport, encore pire, Microsoft intègre de longue date Crystal Report qui n'a jamais eu les faveurs des développeurs (comment peut-il encore exister d'ailleurs si personne ne l'aime ? un mystère), sans trop rien dire tout en le disant sans le dire, Microsoft propose un service de génération d'état dans Sql Server. Quelle drôle d'idée que de le lier au serveur (même s'il y a une logique compréhensible) plutôt que d'en faire un produit à part réellement intégré à VS. Mais peu de gens s'en servent et MS ne semblent pas non plus le promouvoir avec force et vigueur...
Je suis convaincu que les Java-istes, les C-istes, et même les cobolistes (heeuu non, eux ils faisaient les états à la main avec des petites étoiles pour dessiner les cadres), enfin à part les cobolistes donc, je suis convaincu que tous les développeurs du monde ont toujours été déçus par les générateurs d'état.
La faute à qui ? A la nature même des états... Un état cela peut être tout et n'importe quoi. D'un simple "listing" à l'ancienne, jusqu'à la mise en page d'une ordonnance ou d'un rapport d'activité annuel, d'une facture à une liasse fiscale, d'un chèque à un mailing publicitaire... Une vraie liste à la Prévert ! Et chacun de ces documents a ses propres exigences, ses priorités, ses "non négociables". Un mailing avec enveloppe à fenêtre ou une liaisse fiscale pré-imprimée devront se reposer sur un outil très précis au niveau du placements des zones, pour un listing c'est la facilité et la rapidité de mise en page en colonnes, les sous-totaux, les regroupements, les ruptures qui seront essentiels..
Bref, le générateur d'état idéal et parfait n'existe pas. Il en existe de très mauvais (non, je te citerai pas de noms !), d'autres meilleurs, mais aucun n'est adapté à tous les besoins.
RDL vous connaissez ?
Report Definition Language. Une norme de description d'état dérivée de XML, voilà ce qu'est RDL. C'est sur ce langage d'ailleurs que repose le service générateur d'état de SQL Server 2005 et 2008, mais RDL existe en dehors de cette base de données. Et c'est tout là son intérêt !
La description de la norme de novembre 2005 se trouve ici, une lecture édifiante, mais peu passionnante il faut l'avouer.
Le site suivant (ici) regroupe des informations complémentaires sur RDL ainsi que le composant ReportViewer de Microsoft qui s'intègre à Visual Studio (une version VS 2005 et une pour VS 2008 existent).
On trouve même ici un moteur RDL autonome ainsi qu'un designer visuel évitant de trop mettre les mains dans XML. Gratuit et avec les sources, accompagné d'un serveur d'états, il s'agit là d'une base intéressante.
RDL et ses trops rares outils restent encore trop confidentiels, la puissance descriptive du langage est pourtant plus qu'intéressante, la possibilité de requêter des sources SQL mais aussi des services Web, des flux RSS, etc, n'est qu'une des facettes de cette puissante alternative aux générateurs d'état classiques.
RDL est-t-il le générateur d'état idéal ?
Difficile à dire car c'est avant tout un langage, mais justement, là est sa force : les états deviennent descriptifs, "générables" par programmation (fabriquer un fichier XML à coup de WriteLine dans un fichier texte est d'une simplicité enfantine), partageables (RDL est un format ouvert et publié), et les moteurs traitant RDL savent exporter les états en PDF, HTML, CSV, MHT, Texte, RTF, etc..
Il n'y a pas à l'heure actuelle (à ma connaissance) de superbes designers hyper sexy pour RDL (mais VS 2008 intègre un designer visuel, le saviez-vous ?!), l'information est difficile à trouver, c'est le côté "underground" de RDL.. Mais si comme tous les informaticiens de la planète (et peut-être même de quelques exoplanètes!) vous avez le blues du générateur d'état, alors jetez un oeil à RDL, il y a des chances que cela vous séduise. Dans tous les cas vous aurez au moins gagné un sujet de conversation hyper branché pour la machine à café !
Merci qui ? ...
Alors stay tuned !
La pluie et le beau temps, je parle de la météo et de ma station Lacrosse, vous l'aurez compris.
Et quand un geek possède un tel engin, par force il sort son compilateur pour bricoler. Inévitable.
Il tripote, il essaye et par force il y a des ratés, donc besoin de réparer les fichiers historiques issus de la machine.
Comme je sais n'être pas le seul à posséder une Lacrosse série 2300-2350 et que réparer le fichier "history.dat" est certainement un besoin courant et non comblé par les logiciels fournis avec la station, voici deux utilitaires :
-
History Inspector
pour inspecter, modifier les données, consolider les données du pluiviomètre, ...
-
DatMerger
pour fusionner deux historiques avec consolidation des données.
Il s'agit de logiciels fournis à titre expérimental, sans aucune garantie ni aucun support même si je reste à l'écoute de vos retours.
Le code source est fourni, deux projets VS 2005 (tout le monde n'a peut-être pas encore VS 2008) en C#.
Les séquences de lecture/écriture ont été reprises du logiciel eWs2300 d'Antoine Guilmard avec quelques modifications (donc ne mélanger les sources!) que je tiens à remercier pour la publication de son code.
C'est gratuit, avec le source. Les exécutables sont fournis aussi pour ceux qui n'ont pas VS2005/2008 sous la main. Mais il faudra alors installer le runtime de .NET 2.0 au minimum (téléchargeable gratuitement sur les sites de Microsoft).
Le tout est à télécharger à cette adresse : [consultez la page "Ressources" du site e-naxos en cliquant sur le logo "e-naxos" en haut à droite !]
La question m'a été posée plusieurs fois alors un petit billet s'impose : Comment installer l'Entity Framework pour Visual Studio 2008 ?
L'Entity Framework je vous en ai déjà beaucoup parlé ici, j'ai même puplié il y a quelques temps un long article sur la question (voir sur le blog dans le menu "pages" à droite, les articles à télécharger). C'est une fantastique révolution, une façon réellement nouvelle de marier le monde des données SQL et celui des objets. Mais encore faut-il avoir les outils pour "jouer" avec !
Et quand on n'est pas un spécialiste de la recherche sur le Web ou que l'on n'est pas anglophone (ce qui est hélas le cas en france, pays lanterne rouge en langues étrangères...) c'est un peu difficile de se dépatouiller, c'est vrai. Mais je suis là :-) Alors voici ce que vous devez installer et où aller le chercher :
-
-
-
-
Ca, c'est le minimum vital (pour VS 2008).
Ensuite vous pouvez compléter par les téléchargements suivants :
-
-
Complétez le tout par mon article sur Linq et l'Entity Framework en le faisant précéder par celui que j'ai écrit sur les nouveautés syntaxiques de C# 3.0 (indispensable pour comprendre certaines tournures de Linq). Vous pouvez aussi consulter les billets de ce blog consacré à cette question :
Avec tout ça je pense que serez parés pour cette nouvelle aventure !
Merci qui ? .. Allez pas la peine, je le fais de bon coeur, alors Stay Tuned !
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 !
Le voilà enfin ! [Updated ! Version 1.1 en ligne]
un PDF de 32 36 pages et 5 6 projets exemples sous VS 2008 pour vous présenter les différentes facettes de LINQ. Je n'en voyais plus le bout de cet article ! Non par lassitude, bien au contraire, mais parce que LINQ est d'une incroyable richesse et que je voulais vous en dire la maximum.
Sans entrer dans les détails trop techniques de la syntaxe (la doc Microsoft est très complète et n'a nul besoin d'une redite), cet article présente le pourquoi et le comment de LINQ au travers d'explications et d'exemples de code.
-
LINQ to Objects
-
LINQ to SQL
-
LINQ to Dataset
-
LINQ to XML
-
LINQ to Entities
Sans prétendre que toutes ces versions de LINQ n'auront plus de secret pour vous après avoir lu l'article, vous en saurez certainement plus pour mieux comprendre pourquoi il y a eu un avant LINQ et qu'il va y avoir un après LINQ...
Pour télécharger l'article cliquez ici !
Avant de lire cet article il est préférable de connaître les nouveautés syntaxiques de C# 3.0, si ce n'est pas votre cas vous pouvez télécharger mon précédent article.
Pour la liste de tous mes billets sur LINQ cliquez ici.
Note de la version 1.1 : table des matières ajoutée + plus de détails sur Linq to Entities et un projet utilisant la bêta 3.
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 !