• (pas) Fan de...

    ... non, mais alors pas du tout fan de la navigation en onglet dans Firefox (et maintenant IE).

    Encore une discussion bien stérile entre amis ce soir, à propos de Firefox cette fois-ci... Le plus beau dans cette discussion, fut, bien évidemment (je pense que les fans de firefox en reviennent toujours à cela) : la navigation par onglets ! Décrit comme une révolution, j'ai toujours eu le plus grand mal à m'en servir, à tel point que je l'ai desactivée sous IE7. Peut-être que je suis idiot mais je trouve qu'avoir une navigation horizontale parmis mes pages ouvertes n'est vraiment pas pratique...

    Avant de me faire engueuler pour l'exemple que je vais donner ci-dessous veuillez noter que : ce n'est absolument pas un comparatif entre IE et Firefox, je ne veux surtout pas dénigrer Firefox qui est un très bon browser, je veux juste comparer la navigation en onglets et la navigation en fenêtres. Si c'est IE qui est choisi pour ce que je trouve bien et Firefox pour ce que je trouve mal, c'est juste parce que j'utilise beaucoup plus le browser Microsoft (ben oui, vous avez oublié que je suis un MS-zealot ?) et donc que j'ai désactivé la fonction de navigation par onglet dans IE et pas dans Firefox et que je n'ai pas envie de reparamétrer ces options juste pour un screenshot. Bien entendu, il est aussi possible d'utiliser Firefox en mode "fenêtres".

    Pour peut-etre mieux me faire comprendre quand je dis que je ne trouve pas cela pratique, j'ai pris un screenshot de ma barre de tâche à 16h aujourd'hui, ou du moins de la partie présentant les différentes pages ouvertes sous IE, puis j'ai réouvert ces mêmes pages sous Firefox.

    Donc, voici comment je peux retrouver l'une de mes fenêtres sous IE (ou sous Firefox) après avoir desactivés les onglets :

    Et voici ce que cela donne en mode navigation par onglet (vous allez devoir cliquer sur l'image, cela ne tiens pas dans l'écran :

    Que croyez-vous que je préfère pour retrouver facilement et rapidement une page que j'ai déjà ouverte ?

    Si vous vous demandez si j'ai VRAIMENT besoin de 14 pages web en même temps, la réponse est bien entendu "pas vraiment". Il s'agit juste de la façon dont je travaille, et croyez moi, la c'est "seulement" 14 pages...

    En tout cas, messieurs les acharnées de Firefox, parlez-moi du respect des standards, d'une stabilité plus grande ou de tout autre VRAI point fort de votre produit fétiche et arrêtez donc de présenter l'un des plus grand défaut (pour moi, bien évidemment) de Firefox comme une révolution ! Comme quoi, l'utilisabilité est un sujet très épineux et ce qui peut plaire à certains est parfaitement inutilisable pour d'autres...

    PS : pour être très franc, la navigation par onglet, et le fait qu'elle soit activée par défaut dans Firefox est la principale raison pour laquelle je n'ai pas adhéré à ce produit, y compris lorsque je n'avais que IE6 à me mettre sous la dent...

  • Redirection de dossier par un VirtualPathProvider

    L'un des grands points forts de Asp.net 2.0, c'est la simplicité avec laquelle ont peut étendre le système. Parmis les nombreuses possibilités d'extensions possible, je vous propose de nous servir des HttpModules et des VirtualPathProviders pour effectuer une chose toute simple : la redirection de certains path de votre site web vers d'autres dossiers.

    Imaginons par exemple, que vous ayez un très grand nombre d'images de produits : vous souhaitrez certainement ne pas les stocker directement dans votre application web - les mises à jours devenant vite des galères ingérables dans le cas contraire - mais plutôt dans un autre dossier. Vous avez alors deux possibilités :

    • écrire un HttpHandler qui accèdera au fichier et l'enverra dans la stream de sortie
    • écrire un VirtualPathProvider dont le but est de de "virtualiser" - ah bah, tiens, VirtualPathProvider, Virtualiser, j'l'avais pas vu :) - l'accès aux fichiers.

    Les blogs et forums regorgeant d'exemples pour la premiere solution, c'est l'utilisation d'un VirtualPathProvider qui sera détaillé dans la suite de ce billet.

    Si l'on regarde la signature - simplifiée pour ne présenter que ce qui nous interesse ici - de la classe VirtualPathProvider nous trouvons 4 méthodes très intéressantes :

       public abstract class VirtualPathProvider 
       {
            public virtual bool DirectoryExists(string virtualDir);
            public virtual bool FileExists(string virtualPath);
            public virtual VirtualDirectory GetDirectory(string virtualDir);
            public virtual VirtualFile GetFile(string virtualPath);
       }

    En implementant ces méthodes, nous allons pouvoir rediriger l'accès à un fichier 'virtuel' (disons par exemple ~/Factures/F200601003.pdf) vers un path "reel" (e:\data\legal\factures\200601003.pdf). Pour cela, il est indispensable de surcharger FileExists et GetFile, les méthodes concernant les directory n'étant ici pas très utiles. Voici le code de la classe :

       public class MyVirtualPathProvider : VirtualPathProvider
       {
            private string _virtualDir;
            private string _realDir;
            public MyVirtualPathProvider(string virtualDir, string realDir)
            {
                _realDir = realDir;
                _virtualDir = virtualDir;
            }
            internal string ToRealPath(string virtualPath)
            {
                virtualPath = VirtualPathUtility.ToAppRelative(virtualPath);
                if(virtualPath.StartsWith(_virtualDir, 
    StringComparison.InvariantCultureIgnoreCase)) return virtualPath.Replace(_virtualDir, _realDir); return null; } public override bool FileExists(string virtualPath) { string realPath = ToRealPath(virtualPath); if (realPath!=null && File.Exists(realPath)) return true; return Previous.FileExists(virtualPath); } public override VirtualFile GetFile(string virtualPath) { string realPath = ToRealPath(virtualPath); if (realPath!=null && File.Exists(realPath)) return new MyVirtualFile(realPath, virtualPath); return Previous.GetFile(virtualPath); } }

    Comme vous pouvez le constater, celle-ci est assez simple : le constructeur permet de définir le path virtuel à remplacer et le path réel correspondant, la méthode ToRealPath se charge de convertir le path, FileExists retourne simplement true si le fichier reel existe, seule la méthode GetFile est un tout petit peu plus complexe, puisqu'elle fait appel à une autre classe MyVirtualFile. Un certain nombre de points sont à prendre en compte lors de l'écriture de cette classe :

    • Comme nous le verrons d'ici peu, les VirtualPathProvider sont enregistrés globalement pour une application et ne sont pas montés/associés à un path particulier, il convient donc de ne répondre qu'aux demandes pour lesquelles nous avons quelque-chose à dire.
    • Toutes les requêtes qui ne nous concerne pas doivent être passées au VirtualPathProvider suivant -ooops, "précédent" - dans la pile. Celui-ci est disponible par l'intermédiaire de la propriété Previous.
    • Il est aussi nécessaire d'écrire une classe dérivant de VirtualFile  qui se chargera de l'accès effectif au fichier. La seule méthode à surcharger importante de cette classe est la méthode Open qui doit renvoyer une Stream sur les données du fichier.
       public class MyVirtualFile : VirtualFile
       {
            private string _realPath;
            public MyVirtualFile(string realPath, string virtualPath)
                : base(virtualPath)
            {
                _realPath = realPath;
            }
            public override System.IO.Stream Open()
            {
                return File.OpenRead(_realPath);
            }
       }
    

    Pour que tout cela fonctionne, il ne nous reste plus qu'à "enregistrer" un MyVirtualPathProvider auprès du moteur de asp.net. Cela est assez simple, mais doit être fait à certains endroits très précis : il faut qu'il soit enregistré avant toute requête. Pour cela, le plus simple est certainement de le faire au sein de la méthode Application_Start du global.asax

       void Application_Start(object sender, EventArgs e) 
       {
            System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(
                new MyVirtualPathProvider("~/Factures/", "e:\\data\\legal\\factures\\"));
       }

    Et voila ! Maintenant, toutes les requêtes pour un fichier sous le dossier virtuel ~/Factures sera intercepté par notre VirtualPathProvider et le fichier obtenu depuis un autre dossier. Il est bien entendu possible d'utiliser d'autres systèmes de stockage : en base de données, dans un coffre-fort numérique, en génération dynamique - le choix d'un VirtualPathProvider étant alors quelque peu discutable -, les possibilités ne sont peut-être pas infinies mais devraient correspondre à la plupart des besoins.

  • Ca me fait encore plus rire maintenant...

    J'ai eu un commentaire amusant sur mon post précédent raillant la campagne anti-vista (à propos des DRMs) :

    Es-tu capable de lire un article technique ? si oui alors instruis toi avant de parler.

    Eh bien, après avoir répondu sous la forme d'un commentaire, je me suis dit que ca valait même le coup d'en faire un petit billet...

    Alors, la réponse courte est "non", la réponse longue est :

    ca ne fait que 15 ans que je suis développeur (j'arrondi un peu, mais c'est dans ces eaux là : je ne me souviens plus ni de la date et heure de mon premier développement ni du programme, c'est moins marquant que d'autres "premières fois" :p) multi-plateformes - avec une préférence pour Windows de plus en plus marquée depuis 5/7 ans - alors, pour l'instant je ne connais que quelques petits trucs simples : COM/DCOM/COM+, Java, les apis Windows, les apis x-window, les différents systèmes de cryptage, SOAP/SOA/SaaS & les web-services, SAP, Generix, les EJBs, T-SQL/MDX & SQL Server (bon d'accord, je ne suis pas un expert), PLSQL & Oracle, bash, VB, COBOL, les assembleurs x86 & PowerPC, C, C++, Pascal, ADA, FORTRAN, smalltalk, les plateformes Windows et Linux (et en tant qu'utilisateur "de base" : MacOS, les minis IBM, OpenVMS...), Ajax, Javascript, Flex, .net, WPF et j'en oublie certainement parce que c'est pénible d'essayer de se souvenir tout ce que l'on a pu faire...

    Promis, je m'attaque à DocTechnique dès qu'ils sortent la version 3.0, parce que dans les versions précédentes il manquait le garbage collector. 

    PS : d'un autre coté, cela ne m'empêche pas, comme tout consommateur, de detester les DRMs et d'être désolé que les industries du films et de la musique croient encore que nous sommes tous des cons (notez qu'ils n'ont pas tort : combien d'entre nous on refait leur videothèque en entier en DVD et vont devoir recommencer avec Bluray et/ou HD DVD ?) Maintenant, faut-il déplorer que Vista incorpore ces technologies ? ben vu que la plupart des cartes graphiques vont incorporer HDCP d'ici 1 ou 2 ans, je ne vois pas où se situe le problème.

    D'autant plus que, si on gratte un peu, je suis sûr qu'une partie non négligeable des gens qui relaient le message précédemment cité, doivent posséder un iPod et acheter des trucs sur iTunes... no comment...