yeah done by Mat. send yours to nop and be a popstar, comme qui dirait.
Sauvez un arbre, mangez un castor jeudi 11 mars 2010
mardi 02 mars 2010
15:48  » Lire un fichier en Python sans risquer l'UnicodeDecodeError - programmation
Chez mon client préféré, j'ai écrit un petit script en python pour bidouiller des fichiers. En gros, le script lit des fichiers et répartit leur contenu dans d'autres fichiers. Le script tournait à merveille, lancé par le très utile pycron, qui remplace avantageusement le planificateur de tâches de Windows (la différence majeure étant que pycron, lui, fonctionne), et tout allait pour le mieux dans le meilleur des mondes.

Après quelques semaines, le script ne fonctionnait plus. "Damned !" m'écriais-je alors que je constatais avec déception l'absence de log. Une petite intervention plus tard, nous voilà en possession du message d'erreur :
Traceback (most recent call last):
  File "C:ScriptsUpdateArchivesupdateArchives.py", line 12, in <module>
    for line in f:
  File "C:Python31libencodingscp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 21: character maps to <undefined>

Dans le for line in f: où se produit l'erreur, f est un fichier précédemment ouvert. J'ai donc identifié le fichier défectueux et, vérification faite dans plusieurs éditeurs de texte, constaté qu'effectivement, il y avait bien un caractère foireux dedans.
La solution, qui n'était pas vraiment facile facile à dénicher, consiste à ouvrir le fichier en spécifiant errors='ignore', indiquant par là au convertisseur de caractères que c'est pas la peine de brailler comme une chèvre et d'alerter tout le village quand il rencontre un caractère qu'il n'arrive pas à traduire, et qu'il n'a qu'à faire comme s'il ne l'avait pas vu.
Attention, le caractère n'est pas remplacé par un carré ou un point d'interrogation, il disparait complètement. Ce comportement me convenait, mais ça ne sera peut-être pas votre cas.

Au final, l'ouverture de fichier devient :
f = open(filename, "r", errors='ignore')

Au passage, je note que la doc de python est un peu bordélique : dans la section sur la fonction intrinsèque open, aucune mention n'est faite du paramètre errors. En revanche, la doc de codecs.open indique son existence, mais sans en préciser les valeurs possibles >_< Pour les connaitre, il faut lire la doc de codecs.register. Logique.

Si vous voulez observer le problème chez vous, j'ai écrit un script qui le reproduit.
permalien & reactions (0)
lundi 02 mars 2009
17:38  » POSTer des données en .NET sans header Expect - programmation, informatique
Symptôme : J'envoie des données à un serveur distant via HTTP, par exemple à l'aide la méthode System.NET.WebClient.UploadString, mais ce serveur me répond avec une erreur 417, accompagnée d'un message disant "Expectation failed".

Solution : Mettre System.Net.ServicePointManager.Expect100Continue à false.
En effet, le problème vient du fait que lors de l'envoi des données, l'en-tête "Expect: 100-continue" est envoyé au serveur, qui ne la comprend pas forcément : certaines versions de lighttpd, par exemple, renvoient systématiquement une erreur 417 lorsque la requête HTTP contient un en-tête Expect.
Mettre System.Net.ServicePointManager.Expect100Continue à false permet d'empêcher l'envoi de cet en-tête.
permalien & reactions (4)
lundi 12 janvier 2009
12:11  » Réinstaller IIS sous Vista - programmation, Asp.net
Pendant presque tout 2008, le serveur web de ma machine de développement (IIS) a refusé de conserver normalement les variables session. Elles étaient gardées en mémoire une fois sur sept et pour un temps indéterminé, ce qui a rendu les tests très laborieux et nerveusement éprouvants (essayer de se logguer sans succès 15 fois de suite pour tester un ajustement cosmétique merdique à 19h30 un vendredi soir, ça rend dingue >_<).
J'ai bien essayé de désinstaller/réinstaller IIS afin d'avoir quelque chose de propre, mais le fait que je retrouve ma configuration précédente après une réinstallation me laissait à penser que l'opération de désinstallation n'avais pas été effectuée correctement. Et j'avais raison, car il y a un ordre de désinstallation ! (vous ne rêvez pas, on est bien en 2009 sur un OS récent ¬_¬)
Une fois la désinstallation/réinstallation effectuée correctement, je me suis retrouvé avec un IIS tout nu que j'ai pu reconfigurer vite fait pour constater que la session fonctionnait correctement, viva, uhohoï ! \0/



Les coupables.


L'ordre adéquat m'a été suggéré par cette page, dont voici la traduction :
  1. Tout désinstaller dans le groupe "Services World Wide Web Services".
  2. Tout désinstaller dans le groupe "Outils d'administration Web".
  3. Tout désinstaller dans le groupe "Service d'activation des processus Windows".
  4. Supprimer tout ce que Windows vous laissera supprimer dans le répertoire C:\Windows\system32\inetsrv.
  5. Redémarrez la machine.
  6. Tout installer dans le groupe "Services Internet (IIS)\Service d'activation des processus Windows".
  7. Tout installer dans le groupe "Services Internet (IIS)\Outils d'administration Web".
  8. Tout installer dans le groupe "Services World Wide Web Services".


Have fun avec la session ! _0/
(/!\ attention, la session c'est bien, en abuser ça craint)
permalien & reactions (3)
mardi 14 octobre 2008
09:27  » Crosspage postback : PreviousPage est systématiquement à null ? - programmation, Asp.net
Symptôme : dans votre application ASP.NET, vous devez modifier un bouton qui faisait précédemment du postback classsique de façon à ce qu'il fasse du crosspage postback (autrement dit, qu'un clic sur le bouton provoque un postback sur une autre page que la page courante).
Vous donnez donc une valeur à la propriété PostbackUrl du bouton, et vous servez de la propriété Page.PreviousPage pour connaitre le contenu des contrôles de la page d'où vous venez. Seulement voilà, la propriété Page.PreviousPage est désespéremment nulle. Wtf ?! oO

Solution : vous avez probablement oublié d'enlever le handler sur l'évènement Click du bouton qui est présent dans la page d'origine.

Sinon rien à voir avec le crosspage postback, mais il y a quelques astuces ASP.NET intéressantes sur cette page : http://www.kevinjensen.com/2007/04/22/aspnet-20-hot-tips-and-tricks/
permalien & reactions (0)
vendredi 03 octobre 2008
16:05  » Hug a developer (or send one to hell) - programmation, haha
Faites des câlins aux développeurs qui souffrent...




... mais n'oublier pas d'envoyer les mauvais en enfer >:->



permalien & reactions (6)
mercredi 20 août 2008
12:33  » Opérateur ternaire en Visual Basic - programmation, informatique
Depuis le framework 3.5, Visual Basic dispose (enfin) d'un vrai opérateur ternaire ! \0/

Pour rappel, jusqu'à présent, ce qu'on avait de plus approchant était la méthode Iif provenant de VB6 Microsoft.VisualBasic.DLL. Le problème avec ça, c'est que comme il s'agit d'un appel de méthode, tous les paramètres sont évalués avant l'exécution du code. Autrement dit, si j'écris :
Dim pouet as string
Dim pinpon as string
pinpon = Iif(pouet IsNot Nothing, pouet.Trim(), String.Empty)
Je vais avoir droit à une belle NullReferenceException dans la figure : l'appel à pouet.Trim() étant évalué lors de l'appel à Iif, comme pouet n'est pas initialisé, l'exception est levée.

Aujourd'hui, tout cela est terminé, et on écrira le code précédent de la façon suivante :
Dim pouet as string
Dim pinpon as string
pinpon = If(pouet IsNot Nothing, pouet.Trim(), String.Empty)
La syntaxe est donc exactement la même, si ce n'est qu'on utilise if à la place iif et qu'on ne provoque pas d'exception :-)

Au passage, notez que si l'opérateur est utilisé avec seulement deux arguments, il agit comme le ?? du C#, autrement dit : "si le premier paramètre est à null, retourner le second paramètre, sinon retourner le premier. Exemple :
Dim pouet as string
Dim pinpon as string
pinpon = If(pouet, String.Empty)


Happy (safe) coding _0/
permalien & reactions (7)
mercredi 13 août 2008
15:35  » Cruise Control .NET : interroger plusieurs emplacements SourceSafe pour le même projet - programmation, informatique
Avant notre passage à Team Foundation Server, mon client utilisait SourceSafe pour versionner et stocker son code source. Du coup, j'avais monté un serveur d'intégration continue à l'aide de l'excellent Cruise Control .NET. Au cours de la configuration de CCNet, je me suis vite heurté à un problème : comment surveiller plusieurs emplacements du contrôleur de code source dans le même projet quand on ne peut mettre qu'une balise sourcecontrol dans le fichier de configuration ? Parce que gérer un emplacement c'est bien gentil, mais en général les applications qu'on développe s'appuient sur quelques autres composants maison, bien souvent hébergés à l'autre bout du contrôleur de code source.

J'avais probablement pas mal de caca dans les yeux ce jour-là, puisque je suis allègrement passé à côté de la page de la documentation de CCNet qui l'explique.
Mais comme je suis bien parti et qu'aujourd'hui je me sens d'humeur généreuse (qui ne le serait pas après une victoire acquise de haute lutte suite à trois jours d'âpres combats contre un IIS récalcitrant ?), je vous l'explique quand même.
L'astuce repose sur l'utilisation d'un type de sourcecontrol spécial portant le doux nom de multi. Dans ce type de sourcecontrol, on peut mettre une balise sourceControls, puis autant de balises liées à un contrôleur de code source que nécessaire.

Un petit exemple, parce qu'on dirait que vous ne comprenez rien à ce que je vous dis :
<cruisecontrol>
    <project name="Exemple" webURL="http://serveur-integration/server/local/project/Exemple/ViewLatestBuildReport.aspx">
        <workingDirectory>D:\Integration\Exemple</workingDirectory>
        <sourcecontrol type="multi">
            <sourceControls>
                <vss>
                    <project>$/Toto</project>
                    <username>integration</username>
                    <password>integration</password>
                    <ssdir>\\sourcesafe\sources\</ssdir>
                    <workingDirectory>D:\Integration\Exemple\Toto</workingDirectory>
                    <timeout units="minutes">15</timeout>
                </vss>
                <vss>
                    <project>$/DAL</project>
                    <username>integration</username>
                    <password>integration</password>
                    <ssdir>\\sourcesafe\sources\</ssdir>
                    <workingDirectory>D:\Integration\Exemple\DAL</workingDirectory>
                    <timeout units="minutes">15</timeout>
                </vss>
                <vss>
                    <project>$/OhGeorges</project>
                    <username>integration</username>
                    <password>integration</password>
                    <ssdir>\\sourcesafe\sources\</ssdir>
                    <workingDirectory>D:\Integration\Exemple\OhGeorges</workingDirectory>
                    <timeout units="minutes">15</timeout>
                </vss>
            </sourceControls> 
        </sourcecontrol>
        <tasks>
            <devenv solutionfile="Exemple.sln" configuration="release" executable="C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.com" />
        </tasks>
 
    </project>
</cruisecontrol>

C'est plus clair comme ça ?

Je ne vous fais pas le détail des balises, vous êtes grands, et en cas de souci il y a la doc du sourcecontrol "multi".

permalien & reactions (4)
mardi 03 juin 2008
14:38  » ASP.NET : les contrôles en session, c'est non. - programmation, informatique, Asp.net
Une mésaventure m'est récemment arrivée à cause d'un contrôle mis en session. Au moment de coder l'ajout du contrôle en session, j'avais bien senti une perturbation dans la Force, mais je n'arrivais à mettre le doigt sur ce qui me dérangeait... en même temps il était 4h30 du matin et c'était teeeeeeeellement pratique de procéder comme ça. J'ai donc vite oublié ce malaise, jusqu'à ce que le site se mette à crasher pour un oui pour un non. Le problème, c'est que c'était loin d'être le seul changement apporté au site, et on ne savait donc pas d'où venait le problème. On a donc dû faire appel aux shamans de chez Microsoft pour qu'ils déchiffrent les inscriptions runiques contenus dans le dump mémoire du serveur, ce qui a fini par nous amener à la conclusion suivante : il y a un chacal qui met n'importe quoi en session.
Zut, c'est moi :-/

Syndrome : votre site ASP.NET crashe un peu n'importe quand en levant des OutOfMemoryException

Cause possible : vous avez mis des contrôles en session et/ou en cache

Explication : imaginons qu'à chaque chargement de vos pages, vous mettiez en session une référence à un contrôle afin de pouvoir changer son contenu tranquillou par la suite (par exemple parce que vous voulez le faire en même temps que d'autres trucs dans un appel Ajax, mais que vous n'avez pas accès à toute l'arborescence des contrôles, et donc que vous pouvez toujours vous brosser pour faire un FindControl (parce que vous faites de beaux appels Ajax, et pas un truc de bourrin qui produit un postback complet de votre page)).
Tout seul sur votre serveur de développement, vous ne constaterez probablement pas de problème. En revanche, à plusieurs, ça devient problématique. En effet, lorsque vous mettez votre contrôle dans l'objet Session ou Cache, vous l'empêchez purement et simplement d'être désalloué par le garbage collector. "Aucun problème", vous dites-vous, "le contrôle sera détruit en même temps que la page qui le contient, c'est-à-dire dès la fin du rendu de la page". "Pas du tout" vous répondrais-je, "puisque l'objet Session/Cache contient toujours une référence vers votre contrôle, il sera considéré comme utilisé et ne sera donc pas collecté". Si ce n'était que pour un contrôle, ça ne serait pas grave, d'autant plus que, la référence étant écrasée à chaque chargement de page, il finira bien par être collecté. Seulement voilà, comme le contrôle est toujours "vivant", tous les objets qu'il référence le sont également, et leur mémoire ne peut donc pas être récupérée. Or, dans les contrôles ASP.NET, on trouve entre autres les propriétés Parent, qui donne une référence vers le contrôle parent, et Page, qui donne une référence vers l'objet Page contenant le contrôle. Autrement dit, lorsque vous mettez un contrôle en Session/Cache, vous empêchez le garbage collector de récupérer la mémoire pour toute la page contenant ce contrôle. Et quand je dis "toute la page", ça inclut tout ce que la page elle-même référence : contrôle, HttpContext, HttpRequest, HttpResponse, et caetera.
Bref, ça fait des sessions utilisateurs très volumineuses, et donc à plusieurs utilisateurs sur le même serveur, on atteint assez vite le point où il n'y a plus de mémoire, et patatras.

Je le répète une dernière fois : De contrôle en session/cache tu ne mettras point, parce que ça craint.
Si vous êtes plus sensibles aux haïkus :
Contrôles en session
Toute la page reste en mémoire
Mon serveur se meurt

Coïncidence amusante, quelques jours après l'incident, Tess Hernandez postait un article sur le sujet ^_^
permalien & reactions (0)
mercredi 30 avril 2008
10:23  » Programmation ? La barbe ! - programmation, haha, informatique
Tamir Khason s'était déjà intéressé au sujet il y a quelques années (et je l'aurais bien posté, mais la plupart des images avaient disparu du post à l'époque oO), et il a remis ça il y a deux jours, la question étant d'établir une corrélation entre les succès d'un langage de programmation et la pilosité faciale de son créateur.

Je pense que François Corbier devrait s'y mettre, ça marcherait du tonnerre (obligé, vu sa barbe).
permalien & reactions (4)
lundi 31 mars 2008
19:15  » Du raytracing dans DirectX 11 - programmation, informatique
D'après Slashdot, la version 11 de DirectX, qui pourrait arriver à la fin de cette année, supportera le rendu en mode raytracing en plus de l'habituelle rasterization.

Truc de ouf, j'trouve (ou serait-ce un poisson d'avril ?).
permalien & reactions (2)
mercredi 26 mars 2008
17:32  » Tests de site web avec Internet Explorer 6 - programmation
Comment faire pour tester un site web sous Internet Explorer 6 lorsqu'on a la version 7 d'installée ?
J'ai bien croisé une solution pour installer plusieurs versions du navigateur sur la même machine, mais elle ne me tentait guère, et surtout elle ne fonctionne pas sous Vista (OS sous lequel j'ai la joie et l'honneur de travailler chaque jour au bureau).

Heureusement, mère virtualisation vient à la rescousse des développeurs désespérés que nous sommes : en effet, Microsoft a mis à notre disposition des images de Windows XP SP2 et Vista avec au choix Internet Explorer 6, 7 ou 8 d'installé.
Vous aurez également besoin de Virtual PC (qui est gratuit) pour faire fonctionner les bestioles.
Attention, les images expirent le 3 juillet de cette année (pas de panique, elles seront remplacées par d'autres avant cette date, mais il faudra penser à les mettre à jour).

Plus d'excuses pour tester, maintenant :-)
permalien & reactions (2)
samedi 22 mars 2008
15:37  » Le code dont VOUS êtes le coupable - programmation
Je suis assez d'accord avec ce que raconte Jeff Atwood dans un de ses derniers posts.
Pour les anglophobes et ceux qui n'ont pas envie de le lire, voici un résumé : quand vous butez sur un problème de programmation, aussi tordu soit-il, n'oubliez jamais que c'est toujours de votre faute. Toujours (ou presque). Ce n'est pas la faute du compilateur, ni celle de votre IDE, encore moins celle de l'OS et probablement pas non plus celle des bibliothèques que vous utilisez. Non non, dans l'écrasante majorité des cas, c'est vous qui avez fait une bêtise.
Et c'est d'ailleurs un peu pour ça que je ne vois pas forcément d'un très bon oeil la mise à disposition des sources du framework .NET. Ce n'est pas une mauvaise chose en soi (en bon écureuil, si on me tends une noisette, je la prends), mais mal utilisé ça peut faire perdre beaucoup plus de temps que ça en fait gagner. On peut gagner du temps car jusqu'ici, lorsqu'on voulait savoir comment une partie du framework était faite, on devait dégainer Reflector et regarder. C'est vrai qu'en ayant les sources sous la main et en permettant de faire du pas-à-pas dedans, ça fera gagner du temps. Bon, pour ma part j'utilise toujours Reflector, mais admettons ^_^ Ce qui me fait peur, en revanche, c'est le développeur mal informé mais plein de certitudes. Vous en avez forcément au moins un dans votre entourage, vous savez, le genre de personne qui est toujours prompte à imputer les problèmes de ses programmes à "la gestion mémoire foireuse de .NET" ou à "ce satané framework qui fait n'importe quoi" (alors qu'il n'a, bien sûr, jamais cherché à se renseigner sur le sujet, mais ça ne l'empêche pas d'en parler). Lui va perdre beaucoup de temps avec ça, car il va pouvoir faire du pas-à-pas dans les sources du framework, perdre une demie-journée à valider que non, la méthode String.Replace n'a pas de problème, et finalement découvrir que le problème venait de son propre code.

Attention cependant à ne pas tomber dans l'excès inverse. Une fois que vous êtes absolument certains que votre code est irréprochable, il n'y a rien de mal à remettre en question les bases sur lesquelles vous avez construit votre programme. L'OS, le framework et les bibliothèques que vous utilisez sont développées par des humains comme vous à qui il arrive de se tromper, ils ne sont donc pas exempts de bugs. Mais c'est vraiment, vraiment, vraiment rare. En ce qui concerne le code de l'OS et du framework, ils sont utilisés quotidiennement par des milliers et des milliers de personnes, la probabilité que soyez le découvreur d'un bug est donc très proche de zéro. En ce qui concerne les bibliothèques, la probabilité est déjà plus élevée, mais toujours assez faible (c'est aussi très dépendant de la maturité de la bibliothèque, vous aurez naturellement plus de chances de trouver des bugs dans une version 2 que dans une version 10). Pour vous donner une idée, sur les quatre dernières années, j'ai trouvé un bug dans un composant de reporting de DevExpress, et c'est tout.

Alors s'il vous plait, n'oubliez pas, quand vous êtes confrontés à un problème qui semble insoluble : vérifiez bien votre code avant de rejeter la faute sur celui des autres.
permalien & reactions (2)
lundi 17 mars 2008
11:22  » Les indispensables du développement web - programmation, informatique
Si vous aussi vous développez des sites web et qu'on vous impose des exigences déraisonnables du genre "le site doit se charger rapidement" ou "le site doit être identique sous Internet Explorer et Firefox", ce post est fait pour vous.
J'ai remarqué ces derniers mois que le développeur web moyen, malgré un travail pas toujours facile, est rarement bien outillé. Pourtant, chercher une balise dans une soupe HTML de 400ko, tester une modification de CSS, débugger du Javascript, bref, toutes ces tâches qui vous font souffler un grand coup avant de vous y mettre, deviennent triviales pour peu qu'on soit bien outillé.
Voici donc la liste des outils que j'utilise quotidiennement pour me faciliter la vie.

Ceux que vous *devez* avoir :
Firebug : l'arme ultime du développeur web, sous forme d'extension pour Firefox. Vous chercher à voir le code html d'une cellule perdue au milieu d'un tableau dans un tableau dans un tableau dans un tableau ? Faites un clic droit sur cette cellule puis choisissez "Inspect element", et Firebug vous montrera tout. Vous voulez tester un changement de CSS ? Pas de problème, Firebug permet d'éditer les styles à la volée. Un développement Javascript à débugger ? Facile, vous pouvez mettre des points d'arrêt et faire du pas-à-pas dans le code.
YSlow : cette extension Firefox, qui peut s'intégrer à Firebug, permet de faciliter la mise en pratique des bonnes pratiques professées par Steve Souders et son équipe. Rien à ajouter, si ce n'est que si vous ne connaissez pas ces règles, allez les lire, ça vaut franchement le coup.
Web Developer Toolbar : encore une extension Firefox, plus orientée graphisme, puisqu'elle permet par exemple de redimensionner la fenêtre de votre navigateur de façon à simuler une certaine résolution d'écran, de désactiver le Javascript et/ou les CSS, de valider votre code auprès du W3C, d'afficher les bordures des tableaux/cellules, etc. Je pense n'utiliser que 10% des possibilités de cette extension, mais ces 10% suffisent largement à la faire figurer dans cette liste.
IETab : cette extension permet de tester vos créations sous Internet Explorer sans quitter Firefox. Le changement de moteur de rendu se fait en cliquant tout bêtement sur une icone, on ne fait pas plus simple.
IE Developer Toolbar : un semblant de Web Developer Toolbar dédiée à Internet Explorer. Rien d'aussi impressionnant que sa consoeure sous Firefox, mais c'est déjà un bel effort qui fait gagner beaucoup de temps.

Ceux dont on n'a pas besoin tous les jours mais qu'on est bien contents de trouver :
Ruler : une règle, qui vous permet facilement de mesurer des choses à l'écran (en pixels).
Fiddler : Cet outil permet de suivre toutes les échanges HTTP entre votre navigateur et l'internesque qui clique. Très pratique pour par exemple vérifier que la compression, le cache et les dates d'expirations fonctionnent bien. L'outil fonctionne tout seul avec Internet Explorer, mais avec Firefox il faudra modifier la configuration du proxy pour que ça fonctionne (mettre le proxy à localhost sur le port 8888).
SwitchProxy Tool : une extension Firefox qui permet de changer de réglages du proxy en un clic (je vous laisse deviner à quoi il est particulièrement utile) (indice : ça a un rapport avec Fiddler :-]).
TcpView : un des nombreux utilitaires des extraordinaires Mark Russinovich et Bryce Cogswell, qui permet de voir les connexions réseaux ouvertes sur une machine. C'est donc une espèce de netstat graphique, parce que de temps en temps c'est bien de pouvoir vérifier que "attends, je serai pas connecté au mauvais serveur de base de données, là ?".


Voilà, avec tout ça vous n'avez plus d'excuses, il faut faire des sites qui déchirent, maintenant :-)
permalien & reactions (2)
dimanche 09 mars 2008
13:02  » Dis papa, c'était comment chez Atari ? - programmation, jeux vidéo
C'était comme ça.
permalien & reactions (6)
musical cue : John Williams - Diagon Alley and The Gringotts Vault
mardi 12 février 2008
20:51  » Asp.net, Ikoula et authentification Forms - programmation, Asp.net
Symptome : vous disposez d'un hébergement MSDN chez Ikoula, et vous y avez installé un site en Asp.net qui utilise l'authentification Forms. Après vous être identifiés sur le site (quand ça fonctionne), votre session se termine brutalement après un temps aléatoire (mais compris dans les 5 minutes).
Vos logs vous indiquent :
  • Des erreurs de validation de viewstate (Validation of viewstate MAC failed...)
  • Des CryptographicException (Padding is invalid and cannot be removed...), en général sur WebResource.axd

Solution : renseigner vous-même dans le web.config les clés utilisées pour encrypter/décrypter les données qui transitent entre le client et le serveur. Voici une page qui génère le tag qui va bien (cette page provient d'un article sur la machine key), prêt à être copié/collé dans la balise <system.web> de votre fichier de configuration.

Par contre je ne comprends pas très bien pourquoi ça ne fonctionnait pas. Est-ce que le serveur décidait brusquement de changer de clé de cryptage entre deux aller-retour serveur ? Ca expliquerait pourquoi le viewstate était rejeté et les CryptographicException, mais ça me parait quand même bizarre...
permalien & reactions (2)
musical cue : Zero 7 - Warm Sound
samedi 22 décembre 2007
17:50  » Wiimote hacking - programmation, informatique
Johnny Lee, à qui l'on doit notamment la steadycam à 14$, joue beaucoup avec ses Wiimotes. A dire vrai, il joue avec plein de choses, mais aujourd'hui ce sont ses projets liés aux Wiimotes qui nous intéressent.

Voici une vidéo où il montre comment transformer ses doigts en Wiimote (ou presque) :



Vous vous souvenez de Surface ? Mais si, rappelez-vous, l'espèce de table magique de Microsoft. Une des fonctionnalités de la bête qui avait été mise en avant était le multi-touch, où le fait d'avoir un écran tactile sur lequel on peut interagir à plusieurs endroits en même temps (si vous ne vous souvenez pas, pensez iPhone, il en fait autant). D'après ce que j'ai pu lire un peu partout, ce genre de chose coûte cher. Johnny, lui, fait ça avec quelques dollars de matériel et une Wiimote :



Pour terminer, une démo de head tracking, autrement dit le fait de savoir où se trouve la tête du joueur et d'adapter l'image en conséquence de façon à présenter une image en "vraie" 3D (regardez la vidéo, c'est limpide une fois qu'on l'a vue ^_^), toujours avec l'aide d'une Wiimote :




Comme vous pouvez le voir Johnny est quelqu'un de très actif :-)
Si vous voulez suivre ses projets, il a créé un blog à cet effet.
permalien & reactions (4)
musical cue : Dario Marianelli - Knives And Bullets (And Cannons Too)
jeudi 20 décembre 2007
12:48  » Le try..catch n'est pas une structure de contrôle (@#!) - programmation, informatique
Les exceptions, c'est comme le fugu : si c'est bien cuisiné, c'est classe, sinon, on meurt.
Ayant récemment changé de mission, j'ai eu l'occasion de lire pas mal de code dernièrement, et disons que, pour garder la métaphore culinaire, c'est plus souvent du Tricatel que du Bocuse.
Ca n'est pas si atroce que ça (mais si j'en rajoute pas c'est pas drôle), cela dit j'ai trouvé quelques perles, et c'est l'une d'entre elles qui m'a amener à écrire ce post. Le morceau de choix qui m'a poussé à poster ici consistait à utiliser des blocs try..catch comme une structure de contrôle, autrement dit là où une paire de if aurait fait l'affaire.
Voici un petit exemple pour illustrer : on souhaite afficher le titre d'un livre (n'importe lequel) en français, et s'il n'y en a pas, en afficher un en anglais. S'il n'y en a pas non plus, on devra afficher un message d'erreur. Pour ce faire, nous avons à notre disposition une méthode GetBookTitles, qui nous renvoie tous les titres de livres dont on dispose dans la langue demandée. Ces titres sont renvoyés sous forme de tableau de chaines de caractères, et si aucun titre n'est disponible dans la langue demandée, ce tableau sera vide. On devra donc prendre garde à vérifier que le tableau n'est pas vide avant d'aller lire dedans... ou pas :
try
{
    string title = GetBookTitles("fr")[0];
    DisplayTitle(title);
}
catch
{
    try
    {
        string title = GetBookTitles("en")[0];
        DisplayTitle(title);
    }
    catch
    {
        string title = "Impossible de charger le titre.";
        DisplayTitle(title);
    }
}


Dans le premier bloc try, on récupère les titres de livres en français et on essaye tout de suite de lire le premier, sans vérifier qu'il existe. Si ça fonctionne, on affiche ce titre, sinon l'exécution passe au bloc catch. Ici, on applique la même technique pour récupérer les titres en anglais. Si ça ne fonctionne pas, on passe au bloc catch suivant, où on affiche le message d'erreur.

Voyons à présent le même code, écrit cette fois avec des if :
string[] titles = GetBookTitles("fr");
if(titles.Length &gt; 0)
{
    string title = titles[0];
    DisplayTitle(title);
}
else
{
    titles = GetBookTitles("en");
    if(titles.Length &gt; 0)
    {
        string title = titles[0];
        DisplayTitle(title);
    }
    else
    {
        string title = "Impossible de charger le texte.";
        DisplayTitle(title);
    }
}


On récupére les titres des livres en français. S'il y en a, on affiche le premier, sinon on récupère les titres des livres en anglais. S'il y en a, on affiche le premier, sinon on affiche un message d'erreur.

Quel code vous semble le plus facile à relire ? :-)

En vrai, on écrirait d'ailleurs plutôt ça :
string title = "Impossible de charger le texte.";
string[] titles = GetBookTitles("fr");
if(titles.Length == 0)
{
    titles = GetBookTitles("en");
}
if(titles.Length &gt; 0)
{
    title = titles[0];
}
DisplayTitle(title);


Et là, quel code vous semble le plus facile à relire ?

Au-delà des problèmes de lecture, et donc de maintenabilité, que pose l'emploi de cette technique vient s'ajouter le problème des performances. En effet, si le coût d'un bloc try..catch est nul tant qu'il n'y a pas d'erreurs, l'addition devient salée en cas de problèmes. Voici des captures d'écran d'une petite application de test que j'ai écrit. Je pense que les chiffres parlent d'eux-mêmes (si ça vous intéresse, vous pouvez télécharger le code source de l'application de test).



Si tout se passe bien, les deux méthodes sont quasi-équivalentes.




Si on ne dipose pas de la version française des titres de livres, le code est plus de 400 fois plus rapide lorsqu'on utilise des if.




Si on ne dispose des titres les livres dans aucune langue, bizarrement le if est encore plus rapide qu'avant (peut-être parce dans ce cas on n'a pas de lecture à faire dans un tableau ?), ce qui le rend 1200 fois plus rapide.


Je répète : dans le pire des cas, le code qui utilise des exceptions est 1200 fois plus lent que son homologue utilisant des if.

Voilà, conclusion : utiliser les exceptions comme structure de contrôle, c'est tordu et lent. J'espère que ça aura convaincu ceux d'entre vous qui écrivent ce genre de choses que ce n'est pas une bonne idée.
Mais vraiment pas.
permalien & reactions (3)
lundi 03 décembre 2007
23:19  » Désinstaller Visual Studio 2008 beta 2 - programmation
Comme je sais que avez tous un abonnement MSDN sur mininova, vous avez dû vous jeter sur la version finale de Visual Studio 2008, disponible depuis quelques jours. Si vous aviez précédemment installé la version beta 2, lisez le post de Scott Guthrie à propos de sa désinstallation, car on a vite fait de flinguer une installation de Windows en faisant n'importe quoi (la beta 1 m'a servi de leçon ^_^).

Si vous ne lisez pas l'anglisse ou que ça vous gonfle, en voici la substantifique moëlle : "y'a plein de trucs à désinstaller, et ce dans un certain ordre". Voilà.
J'ai donc suivi la liste du post que j'ai mentionné, et vous retrouverez ici la liste de ce que j'ai désinstallé : les noms diffèrent parfois de la liste orginale, et j'ai même supprimé certaines choses qui n'y figuraient pas, mais bon, mon OS est encore vivant donc je vous transmets la recette :)

MSDN Library for Visual Studio 2008 Beta 2 - ENU (n'oubliez pas d'exporter votre configuration dans un fichier avant de désinstaller si vous voulez pouvoir la restaurer plus tard) (ça se passe dans Tools -> Import and Export Settings ^_^)
Microsoft SQL Server Compact Edition 3.5*
Microsoft SQL Server Compact Edition 3.5 Design Tools*
Microsoft SQL Server Compact Edition 3.5 Design Tools*
Microsoft Visual Studio Codename Orcas Performance Collection Tools - ENU
Windows Mobile 5.0 SDK R2 for Pocket PC
Windows Mobile 5.0 SDK R2 for Smartphone
Crystal Reports 2007*
Visual Studio Asset System*
Microsoft Visual Studio Web Authoring Component
Visual Studio 2005 Tools pour Office Second Edition Runtime (m'a proposé de redémarrer ma machine, mais j'ai refusé)
Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime Language Pack *
Microsoft Visual Studio Tools for Office Runtime 3.0
Microsoft Document Explorer 2008 (le programme de désinstallation est titré "Microsoft Document Explorer 2007 Setup" ^_^)
Microsoft Document Explorer 2005
Microsoft Device Emulator version 3.0 - ENU
Microsoft .NET Compact Framework 3.5 Pre-Release
Microsoft .NET Compact Framework 2.0 SP2
.NET Framework 2.0 SDK*
Microsoft Visual Studio Codename Orcas Remote Debugger*
Microsoft Visual Studio 64bit Prerequisites Beta*
Microsoft .NET Framework 3.5 (Pre-Release Version)
La liste originale s'arrête ici
Microsoft Silverlight Tools Alpha for Visual Studio 2008 Beta 2
Microsoft Visual Studio Team System 2008 Team Suite - ENU (of course :) )

* : indique que je n'ai rien trouvé à supprimer qui correspondait à ce nom sur ma machine

Ceci fait, vous pouvez redémarrer votre machine, puis installer Visual Studio 2008 et la MSDN qui va avec.

Une dernière note, Scott Guthrie conseille de remettre à zéro la configuration de Visual Studio avant de l'utiliser. Au premier lancement, allez donc dans le menu Tools -> Import and Export Settings puis choisissez l'option "Reset Settings" (et n'oubliez pas que vous pouvez importer/exporter votre configuration de Visual Studio 2005 et 2008 beta 2, si vous la perdez c'est vraiment que vous l'avez fait exprès).

Voilà, allez faire des programmes de ouf, maintenant.
permalien & reactions (6)
musical cue : John Williams - The Forest Battle
lundi 05 novembre 2007
23:20  » Déclarer une variable membre statique en C++ (ou - programmation, informatique
Si vous aussi, après plusieurs années d'abstinence, vous replongez vos p'tites mains délicates dans la boue verdâtre et bouillonnante du C++, je vous promets de nombreuses séances d'arrachages de cheveux. Pour vous en éviter une et ainsi contribuer à leur préservation, voici un tutorial trodlabal intitulé :

Déclarer une variable membre privée statique en C++<



// Dans la classe, ça se passe comme on s'y attendrait
// (modulo le fait qu'on ne peut pas initialiser les variables si elles ne sont pas const)
class MaSuperClasse
{
public:
	static int m_publique;
 
private:
	static int m_privee;
};
 
// En revanche, ensuite ça devient surnaturel :
// Il faut *redéclarer* les variables
// (cette correction vous est offerte par snihf)
// avec du code en vrac, comme ça.
int MaSuperClasse::m_publique = 0;
int MaSuperClasse::m_privee = 0;
 
}

Voilà, moralité : C# et Java sont quand même bien confortables :)

Petite explication de cette bizarrerie par l'ami snihf :
Une variable membre d'instance d'une classe est déclaré dans la déclaration de la classe, et défini lors de l'instanciation de la classe. Pour un membre statique, il n'y a pas d'instanciation, il est donc nécessaire de le définir à part, dans un fichier de définitions.
permalien & reactions (5)
musical cue : Santana - Let The Children Play
dimanche 16 septembre 2007
19:43  » Fmod ex, WIN32, et l'édition de liens - programmation
Note pour plus tard : sous Windows, ne pas oublier de définir WIN32 avant d'essayer de linker son projet à la librairie fmodex_vc.lib, sous peine de se manger une brouettée d'erreurs d'édition de liens en la personne de notre LNK2019 préférée.

Je recopie une des erreurs pour nos amis les moteurs de recherche :
unresolved external symbol _FMOD_System_Create referenced in function "enum FMOD_RESULT __cdecl FMOD::System_Create(class FMOD::System * *)" (?System_Create@FMOD@@YA?AW4FMOD_RESULT@@PAPAVSystem@1@@Z) main.obj

Miam.
permalien & reactions (5)
musical cue : Nobuo Uematsu - Wutai Ruins
     précédent rien