<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-94188845412029417</id><updated>2011-12-31T02:23:59.053-08:00</updated><category term='ruby'/><category term='exigences'/><category term='matériel'/><category term='installation'/><category term='bonnes pratiques'/><category term='javascript'/><category term='gentoo'/><category term='développement web'/><category term='service en ligne'/><category term='sécurité'/><category term='apple'/><category term='perl'/><category term='sauvegardes'/><category term='emploi'/><category term='maven'/><category term='psychologie'/><category term='BSD'/><category term='français'/><category term='inspections'/><category term='nintendo ds'/><category term='greffon'/><category term='modèles'/><category term='firefox'/><category term='programmation'/><category term='python'/><category term='windows'/><category term='iptv'/><category term='intelligence artificielle'/><category term='conception'/><category term='langage'/><category term='linux'/><category term='algorithmie'/><category term='méthodes'/><category term='gestion de contenu'/><category term='portage'/><category term='orienté objet'/><category term='emacs'/><category term='ant'/><category term='mysql'/><category term='java'/><category term='gestion de projet'/><category term='commerce'/><category term='embarqué'/><category term='télécommunications'/><category term='google chrome'/><category term='journalisation'/><category term='qualité'/><category term='wikipedia'/><category term='tests'/><category term='productivité'/><category term='bases de données'/><category term='microsoft office'/><category term='réseau'/><category term='homebrew'/><category term='closure'/><category term='RoR'/><category term='article'/><category term='inadaptation d’impédance objet-relationel'/><category term='architecture du SI'/><category term='mathématique'/><title type='text'>Jérôme Radix Blog</title><subtitle type='html'>&lt;i&gt;Un blog en français sur l'informatique et les divers moyens d'en faire quelque chose...&lt;/i&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>80</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-3559190401989706035</id><published>2011-07-14T14:48:00.000-07:00</published><updated>2011-08-01T12:23:26.290-07:00</updated><title type='text'>Linux - Comment convertir des vidéos MP4 (YouTube, DailyMotion...) en MP3 en leur appliquant un gain normalisé à 89dB (ReplayGain)</title><content type='html'>Les sites d'hébergement de vidéos comme YouTube ou Dailymotion contiennent un grand nombre de vidéos correspondant à de la musique : soit des clips vidéo, soit uniquement la musique et des photos statiques en guise de vidéo. Il peut être intéressant de récupérer la musique de ces vidéos et d'en faire des fichiers audio pour les écouter sur votre lecteur audio préféré.&lt;br /&gt;&lt;br /&gt;Tout d'abord il faut télécharger les vidéos de YouTube ou Dailymotion sur votre disque dur au format MP4. Pour cela vous pouvez utiliser les nombreuses extensions de votre navigateur préféré vous permettant de faire cela. Sous Firefox, j'utilise &lt;a href="https://addons.mozilla.org/fr/firefox/addon/video-downloadhelper/"&gt;Video Download Helper&lt;/a&gt;. Sous Chromium, j'utilise &lt;a href="http://www.chromeextensions.org/other/easy-youtube-video-downloader/"&gt;Easy YouTube Video Downloader&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;Attention à ne pas utiliser le nom de fichier d'enregistrement par défaut proposé par ces extensions car il y a souvent des caractères spéciaux qui ne sont pas forcément supportés par votre système de gestion de fichier.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dans le cas de Easy YouTube Video Downloader, le nom de fichier par défaut contient en premier caractère, un caractère spécial invisible à l'oeil nu mais pourtant bien présent (je le vois avec Dired sous Emacs). Pour être sûr de ne pas avoir de problème, renommez ENTIÈREMENT le fichier. Dans XFCE Thunar par exemple, sélectionnez le fichier et faites la combinaison de touches suivante : F2 Ctrl-a Suppr. Puis saisissez votre nom de fichier.&lt;br /&gt;&lt;br /&gt;Vous êtes sous Linux Ubuntu, vous voulez convertir un ensemble de fichier vidéo MP4 provenant de YouTube ou Dailymotion, en fichier audio MP3. Vous voulez aussi que le niveau sonore de vos MP3 soit normalisé à 89dB tel que défini par &lt;a href="http://en.wikipedia.org/wiki/Replay_Gain"&gt;ReplayGain&lt;/a&gt;.&lt;br /&gt;Cette normalisation est importante pour éviter de devoir monter ou baisser le niveau sonore de votre lecteur de MP3 à chaque changement de morceau.&lt;br /&gt;&lt;br /&gt;Tout d'abord, installez les modules suivants via le Gestionnaire de Paquets Synaptic :&lt;br /&gt;&lt;br /&gt;- ffmpeg&lt;br /&gt;- sox&lt;br /&gt;- libsox-fmt-all&lt;br /&gt;- mp3gain&lt;br /&gt;&lt;br /&gt;Ensuite, créez vous un fichier &lt;span class="Apple-style-span"&gt;MP4toMP3&lt;/span&gt; avec le contenu suivant :&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;#!/bin/sh&lt;br /&gt;for i in *.mp4; do&lt;br /&gt; echo "$i"&lt;br /&gt; ffmpeg -i "$i" -vn -acodec copy "${i%mp4}m4a"&lt;br /&gt; sox "${i%mp4}m4a" "${i%mp4}mp3"&lt;br /&gt; rm "${i%mp4}m4a"&lt;br /&gt; mp3gain -c -r "${i%mp4}mp3"&lt;br /&gt;done&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Donnez les droits d'exécution à ce fichier :&lt;br /&gt;&lt;pre class="brush:bash"&gt;chmod a+x MP4toMP3&lt;/pre&gt;&lt;br /&gt;Et voilà ! Placez vous dans le répertoire qui contient vos MP4 et lancez ce fichier de script MP4toMP3. Le script va convertir tous les fichiers MP4 du répertoire en MP3 et appliquer un gain normalisé à 89dB (ReplayGain).&lt;br /&gt;&lt;br /&gt;Attention, il s'agit bien de l'application du gain sur tout le fichier, pas du stockage d'un "tag" REPLAYGAIN dans le fichier MP3. Comme cela, le fichier a le même niveau sonore quelque soit le lecteur MP3, même si ce dernier ne supporte pas la norme ReplayGain.&lt;br /&gt;&lt;br /&gt;Vous pouvez maintenant lire tous ces fichiers audio avec votre lecteur MP3 préféré.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-3559190401989706035?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/3559190401989706035/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=3559190401989706035' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3559190401989706035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3559190401989706035'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/07/linux-comment-convertir-une-video-mp4.html' title='Linux - Comment convertir des vidéos MP4 (YouTube, DailyMotion...) en MP3 en leur appliquant un gain normalisé à 89dB (ReplayGain)'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2573941400852934199</id><published>2011-07-01T06:20:00.001-07:00</published><updated>2011-07-01T06:20:00.141-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Apache Ant/Ivy versus Maven : Quel outil de construction maîtriser sur le long terme ?</title><content type='html'>&lt;div style="text-align: left;"&gt;Un projet démarre toujours un peu dans l'euphorie, et bien souvent dans le stress dès la première minute où vous vous rendez compte que vous êtes en retard sur les échéances dès la réunion de lancement du projet avec votre client.&lt;/div&gt;&lt;div&gt;    &lt;p dir="ltr" style="text-align:left"&gt;&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;Dans ces conditions, il est déjà intéressant d'avoir dès le début du projet, un squelette d'application "vide" mais "fonctionnant", du code et tout son outillage (son attirail) s'exécutant sans aucune fonctionnalité particulière.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;On veut tous passer du temps à ajouter des fonctionnalité à un logiciel, pas perdre son temps à mettre en place une architecture standardisée comme Oracle Java EE par exemple. L'avantage d'un tel standard est de proposer des briques et des protocoles standards pour la plupart des applications d'entreprise : une couche présentation (JSF, Struts), une couche métier (EJB3), une couche de persistance (JPA2), des modèles de conceptions tout prêt à être utilisés (Java blueprints), etc.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;Ce qui fait que pour la plupart des applications d'entreprise, c'est à dire de gestion de l'information, il n'y a même plus à concevoir quoique ce soit : il ne reste plus qu'à programmer les règles métier et le fonctionnel. Il s'agit d'ailleurs de plus en plus de "configuration" ou de "génération" des composants standards et outils "sur étagère" plutôt que de "programmation" proprement dite.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;C'est à la fois une bonne chose (la réutilisation se généralise) et une moins bonne chose pour l’ingénieur en informatique: la conception devient un art mineur et rare dans le monde de l'entreprise. Ce qui a pour conséquence d'offrir de plus en plus de travail à des techniciens et analystes métiers, plutôt qu'à des ingénieurs. Architecte Java ne veut maintenant plus rien dire si ce n'est pour désigner quelqu'un qui connait l'architecture standard Java et sait la mettre en place. &lt;b&gt;Ce n'est plus quelqu'un qui conçoit, mais quelqu'un qui applique&lt;/b&gt;. Un architecte logiciel à proprement parlé n'est et ne doit pas être lié à des standards : il doit être capable de définir l'architecture adéquat à un besoin donné en respectant toutes les contraintes qualités qu'on est en droit d'attendre aujourd'hui d'une application logicielle.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;Dans ce contexte, il est important de maîtriser à fond quelques outils qui seront présents quelque soit le type de logiciel. Il s’agit de tous les outils de développement : EDI, outils de construction, outils d’analyse de la qualité du code, outils de tests du code, outils de gestion des versions, d’intégration continue. Il est intéressant de passer du temps à maîtriser complètement ces outils, car ils ne seront pas remis en cause dans une dizaine d’année.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;Pour ma part, dans le monde Java, je me suis concentré sur les outils suivants : Apache Ant et Ivy, JUnit, Checkstyle, PMD, Jenkins et les bibliothèques standards de la version Java SE.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;De plus, j’essaie de maîtriser complètement mon EDI préféré : Emacs.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;Par contre, même des technologies dites standards, ne le seront plus au bout de 5 ans, comme par exemple les technologies suivantes  qui sont devenus obsolètes :&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;- toute la couche client de Java SE (AWT, Swing, Java Sound, Java2D, Applets, ImageIO, Accessibility) est maintenant &lt;a href="http://www.infoq.com/news/2011/06/jfx2-public-beta"&gt;remplacée par JavaFX 2&lt;/a&gt;.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;- toutes les vieilles couches serveur sont obsolètes : EJB 1 et 2 remplacées par EJB3, les anciennes version d’hibernate remplacées par JPA, même &lt;a href="http://www.journaldunet.com/developpeur/java-j2ee/les-rendez-vous-manques-de-spring/la-strategie-mal-ficelee-de-springsource.shtml"&gt;Spring devient obsolète face à JSR-330&lt;/a&gt; (supporté par Spring après coup via des astuces) et de nouveaux frameworks qui suivent cette nouvelle norme comme par exemple Google Guice.&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;&lt;/p&gt;    &lt;p dir="ltr" style="text-align:left"&gt;Et bien sur, tout ça sera à revoir dans 5 à 10 ans. Ce qui fait tout drôle aux nouveaux venus dans le monde de l’entreprise informatique, c’est qu’ils vont être confronté à de nombreuses applications qui n’auront même pas franchi le gouffre entre Java 1.4 et Java 5. De nombreuses applications Java peuvent maintenant être appelées des « application legacy » au même titre que des applications codées en Cobol.&lt;/p&gt;&lt;p dir="ltr" style="text-align:left"&gt;Il faut donc s'attendre à tout et maîtriser des outils suffisamment souples, extensibles et personnalisables pour s'adapter à tout type de situation. Ce qui ne va pas dans le sens des outils qui se basent surtout sur des "conventions" plutôt que sur de la configuration, comme par exemple Maven qui structure déjà un projet Java.&lt;/p&gt;&lt;p dir="ltr" style="text-align:left"&gt;Dès que vous sortez de la convention et du comportement standard des plugin Maven, vous allez devoir hacker un plugin Maven pour vous adapter à votre contexte projet. Maven est intéressant pour démarrer un projet rapidement mais dès qu'un projet se complexifie, il y aura toujours des tâches très spécifiques et "tordues" à accomplir. C'est le propre d'un projet qui a son identité propre : si ce n'était pas le cas, ce ne serait pas un projet de développement, mais uniquement un projet de génération de code ou d'installation de composants sur étagère.&lt;/p&gt;&lt;p dir="ltr" style="text-align:left"&gt;Mon vécu sur les outils Ant/Ivy et Maven m'a appris que Ant, par sa simplicité, sa personnalisation, son extensibilité et sa simplicité permet de survivre à des projets complexes et historiquement chargés. Maven, (considéré par certains comme &lt;a href="http://stackoverflow.com/questions/1077477/why-do-so-few-people-use-maven-are-there-alternative-tools/1077547#1077547"&gt;l'EJB2 des outils de construction&lt;/a&gt;) permet de démarrer rapidement des projets complets sans avoir à se poser trop de questions sur comment est construit réellement le logiciel. Mais avec le temps qui passe, on est toujours confronté à ces questions précises sur ce qui se passe réellement en arrière plan, et comment changer ces détails.&lt;/p&gt;&lt;p dir="ltr" style="text-align:left"&gt;Bref, Maven me semble aller dans le sens inverse du principe &lt;a href="http://fr.wikipedia.org/wiki/Keep_it_Simple,_Stupid"&gt;KISS&lt;/a&gt;. De plus Ant/Ivy est aussi "puissant" et générique qu'on le souhaite si on passe ne serait-ce que le temps d'un seul livre, à apprendre ce qu'il est capable de faire :&lt;/p&gt;&lt;p dir="ltr" style="text-align:left"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;a href="http://www.amazon.com/Ant-Action-Covers-1-7-Manning/dp/193239480X"&gt;&lt;img src="http://3.bp.blogspot.com/-0dA-l8EdrYw/TgXob_XAsUI/AAAAAAAAAWY/Igy9O4HCg6k/s400/ant_in_action.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5622155277403992386" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 332px; height: 400px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;a href="http://www.amazon.com/Ant-Action-Covers-1-7-Manning/dp/193239480X"&gt;Ant In Action&lt;/a&gt; est un bon livre sur Apache Ant/Ivy et va jusqu'au bout de la logique de Ant pour montrer qu'on peut tout faire avec et ce en faisant un minimum d'adhérence aux spécificités d'un projet. J'ai adoré construire de bout en bout un fichier build très simple mais très puissant et surtout très lisible : je suis capable de faire tous les types de traitement que je souhaite et réutiliser mon fichier build.xml dans chacun de mes projets.&lt;/div&gt;   &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2573941400852934199?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2573941400852934199/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2573941400852934199' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2573941400852934199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2573941400852934199'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/07/apache-antivy-versus-maven-quel-outil.html' title='Apache Ant/Ivy versus Maven : Quel outil de construction maîtriser sur le long terme ?'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-0dA-l8EdrYw/TgXob_XAsUI/AAAAAAAAAWY/Igy9O4HCg6k/s72-c/ant_in_action.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-3535556709463774389</id><published>2011-06-25T05:32:00.000-07:00</published><updated>2011-06-25T05:39:31.480-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iptv'/><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><category scheme='http://www.blogger.com/atom/ns#' term='réseau'/><title type='text'>Digital Transmission Content Protection sur Wikipedia Français</title><content type='html'>J'essaie régulièrement de &lt;a href="http://www.jeromeradix.com/2008/10/contribuer-en-franais-wikipedia.html"&gt;soumettre des articles en Français à Wikipedia&lt;/a&gt; dans les domaines que je connais. Je viens de créer aujourd'hui la page &lt;a href="http://fr.wikipedia.org/wiki/Digital_Transmission_Content_Protection"&gt;Digital Transmission Content Protection&lt;/a&gt;, mécanisme de protection du contenu diffusé sur des appareils multimédias notamment par un protocole comme &lt;a href="http://fr.wikipedia.org/wiki/DLNA"&gt;DLNA&lt;/a&gt;. Cela sert notamment dans le domaine de l'&lt;a href="http://fr.wikipedia.org/wiki/TV_sur_IP"&gt;IP TV&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-3535556709463774389?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/3535556709463774389/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=3535556709463774389' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3535556709463774389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3535556709463774389'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/06/jessaie-regulierement-de-soumettre-des.html' title='Digital Transmission Content Protection sur Wikipedia Français'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-460794592355242092</id><published>2011-05-20T05:26:00.000-07:00</published><updated>2011-05-20T05:42:04.068-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivité'/><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Comment apprendre quelque chose le plus rapidement possible ?</title><content type='html'>Quelle est la seule et unique manière d’apprendre quelque chose dans ce bas monde ?&lt;span style="font-weight: bold;"&gt; La pratique&lt;/span&gt;. Seule la pratique permet d’acquérir au plus profond de soi les éléments d’un domaine de compétence particulier.&lt;br /&gt;&lt;br /&gt;La pratique passe par l’exécution d’exercices. Dans ce contexte, les formations doivent se baser principalement sur les exercices plutôt que de long discours théoriques. La théorie s’assimile par la pratique, et on peut très bien introduire les nouveaux concepts au fur et à mesure, chaque exercice mettant en œuvre les éléments acquis dans le passé et 1 ou 2 nouveaux éléments à acquérir.&lt;br /&gt;&lt;br /&gt;Un livre électronique pour l’apprentissage du langage Python reprend ces principes et propose de passer par une série d’exercices plutôt que de faire l’énoncé de toutes les particularités du langage. Il s’agit de &lt;a href="http://learnpythonthehardway.org/"&gt;Learn Python the Hard Way&lt;/a&gt;. Cela semble vraiment la manière la plus efficace et donc la plus rapide pour « apprendre » à programmer en Python.&lt;br /&gt;&lt;br /&gt;L’auteur conseil de ne pas faire de copier/coller car un des éléments essentiels d’un programmeur est de savoir taper sur son clavier. C’est évident, mais c’est finalement un des secrets de la productivité : &lt;a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html"&gt;savoir taper à la machine&lt;/a&gt; et puis aussi : maitriser ses &lt;a href="http://www.jeromeradix.com/2008/08/systme-de-suivi-dun-dveloppement.html"&gt;outils de développement&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-460794592355242092?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/460794592355242092/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=460794592355242092' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/460794592355242092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/460794592355242092'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/05/comment-apprendre-quelque-chose-le-plus.html' title='Comment apprendre quelque chose le plus rapidement possible ?'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4163986514385740143</id><published>2011-03-16T08:48:00.000-07:00</published><updated>2011-03-16T09:48:27.528-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Comment exécuter du code par projet dans Emacs</title><content type='html'>Pour personnaliser Emacs, les emacsiens que nous sommes ont l'habitude de mettre toute notre personnalisation dans le fichier &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;~/.emacs&lt;/span&gt;&lt;/span&gt; sans même avoir besoin de structurer ce fichier. Or j'ai besoin de gérer une configuration particulière par projet, le terme projet correspondant ici à un ensemble cohérent de fichiers permettant de produire un certain nombre de livrables clairement identifiés (un peu comme le fichier &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;build.xml&lt;/span&gt;&lt;/span&gt; pour Apache Ant).&lt;br /&gt;&lt;br /&gt;Dans Emacs, il existe quelques fonctions bien pratiques pour faire cela. Par exemple, j'ai besoin de définir localement et de façon spécifique selon le fichier ouvert, certaines variables comme la variable &lt;span style=";font-family:courier new;font-size:85%;"  &gt;compile-command&lt;/span&gt; pour un projet écrit un python. Je veux une configuration bien particulière pour ce projet. Pour cela, j'utilise les &lt;a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html#Directory-Variables"&gt;Variables de Répertoire&lt;/a&gt; et met le code suivant dans mon .emacs : &lt;pre class="brush:emacs"&gt;(dir-locals-set-class-variables 'python-dev&lt;br /&gt; '((python-mode . (&lt;br /&gt;     (eval .&lt;br /&gt;         (set&lt;br /&gt;             (make-local-variable 'compile-command)&lt;br /&gt;             (concat "python " (buffer-file-name))))))))&lt;br /&gt;&lt;br /&gt;(dir-locals-set-directory-class&lt;br /&gt;"c:/Users/jrx/src/tests/" 'python-dev)&lt;/pre&gt; Je construit la variable locale &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;compile-command&lt;/span&gt;&lt;/span&gt; avec le nom du fichier affiché dans le buffer. Cela marche pour tous les fichiers qui sont dans le répertoire défini par l'instruction dir-locals-set-directory-class &lt;span style="font-weight: bold;"&gt;et tous ses sous-répertoires&lt;/span&gt;. On peut bien sûr imaginer sortir les instructions &lt;span style=";font-family:courier new;font-size:85%;"  &gt;set&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;make-local-variable&lt;/span&gt;&lt;/span&gt; dans une fonction à part histoire de clarifier les choses.&lt;br /&gt;&lt;br /&gt;On peut aussi créer des fichiers &lt;span style=";font-family:courier new;font-size:85%;"  &gt;.dir-locals.el&lt;/span&gt; dans chaque répertoire que l'on veut personnaliser, mais je n'aime pas trop ça parce qu'on se met à écrire dans un répertoire projet des fichiers qui n'ont rien à voir avec le projet en soi. Et puis, il peut y avoir des répertoires où on n'a pas les droits en écriture.&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4163986514385740143?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4163986514385740143/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4163986514385740143' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4163986514385740143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4163986514385740143'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/03/emacs-et-la-personnalisation-par-projet.html' title='Comment exécuter du code par projet dans Emacs'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-7615390447050345384</id><published>2011-02-12T01:39:00.000-08:00</published><updated>2011-02-12T01:39:00.514-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathématique'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Gérer une équipe comme on devrait enseigner les mathématiques</title><content type='html'>Qu'est-ce qui est vraiment au fondement même de l'informatique ? D'où viennent les véritables progrès de cette discipline ? L'informatique paraît encore jeune et beaucoup de nouveautés apparaissent mais est-ce vraiment des innovations ou de simple créations ?&lt;br /&gt;&lt;br /&gt;La plupart des choses qu'on appelle nouveauté en informatique, ne sont en fait que de nouvelles créations sans originalité fondamentale : un nouveau framework Web, de nouvelles librairies performantes, des nouveaux langages pour dire toujours la même chose.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Les véritables nouveautés en informatique ne viennent que d'une seule source : les mathématiques.&lt;/span&gt; On a beau chercher recréer des centaines de fois la roue, ce n'est toujours qu'une roue, et un framework Web est toujours un framework Web. La science informatique (&lt;span style="font-style: italic;"&gt;computer science&lt;/span&gt;) est la branche des mathématiques qui a pour seul objectif le progrès et la nouveauté.&lt;br /&gt;&lt;br /&gt;Or les mathématiques sont souvent mal perçues, car plus considérées comme un moyen de sélection à l'école plutôt que l'outil parfait pour la résolution des problèmes. La justification de l'apprentissage de certains concepts en mathématique à l'école est uniquement basée sur le fait que l'élève en aura besoin pour les classes supérieures. Mais comment faire comprend à un gamin qu'il faut qu'il s'intéresse et s'investisse dans les mathématiques uniquement parce qu'il risque d'utiliser ce savoir dans 2 ans ? Un peu de psychologie enfantine fait aisément comprendre que ça ne peut pas le motiver.&lt;br /&gt;&lt;br /&gt;Ce qui motive le plus, c'est de résoudre des problèmes pratiques pour lesquels l'élève peut se sentir investi d'une responsabilité ou d'une curiosité naturelle. Les cours de mathématiques pourraient être adapté pour proposer à l'élève un apprentissage progressif en poussant l'élève à se poser les bonnes questions et demander au professeur des outils pour l'aider à résoudre son problème.&lt;br /&gt;&lt;br /&gt;Une très bonne (et très belle en plus) réflexion sur le sujet est la présentation &lt;a href="http://prezi.com/aww2hjfyil0u/math-is-not-linear/"&gt;Math is not linear&lt;/a&gt; du professeur de Mathématique &lt;a href="http://axiomstoteachby.blogspot.com/2009/08/prezi-presentation.html"&gt;Alison Blank&lt;/a&gt;. Faire toucher du doigt aux élèves ce qui est intéressant dans les mathématiques est vraiment une tâche primordiale d'un professeur. Dans l'idéal le professeur ne fait qu'aider les élèves en leur offrant des problèmes intéressants, en provoquant des questions qui poussent à réfléchir, en donnant, quand le besoin se fait sentir les outils nécessaires pour la résolution des problèmes.&lt;br /&gt;&lt;br /&gt;Le parallèle peut être fait avec les personnes en charge de gérer une équipe. Le plus important pour un gestionnaire est de savoir faire fonctionner une équipe, déléguer sans imposer un diktat qui n'aurait pour conséquence que la démotivation. &lt;span style="font-weight: bold;"&gt;Le mieux en tant que chef d'un projet est de savoir poser les bonnes questions et les bons problèmes pour que chaque membre de l'équipe propose leur propres solutions et prennent volontairement leurs responsabilités&lt;/span&gt;. C'est ici que l'expérience du chef de projet est primordiale car il doit savoir détecter dans toutes les solutions ou propositions, les problèmes à venir, les manques éventuels, et doit pouvoir mettre en perspective les solutions vis à vis des objectifs du projet (périmètre, délais, coûts, qualité, communications, ressources, risques et achats).&lt;br /&gt;&lt;br /&gt;Mais le chef de projet doit résister à la tentation de dire ce qu'il faudrait faire, même s'il a une idée précise de la solution. Si sa solution est la meilleure, elle réapparaitra d'elle même dans les réponses des membres de l'équipe. Le chef de projet sera souvent surpris du fait que sa solution n'est finalement pas toujours la meilleure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-7615390447050345384?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/7615390447050345384/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=7615390447050345384' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7615390447050345384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7615390447050345384'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/02/gerer-une-equipe-comme-on-devrait.html' title='Gérer une équipe comme on devrait enseigner les mathématiques'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1116728661290392092</id><published>2011-02-05T04:42:00.000-08:00</published><updated>2011-02-05T04:42:00.460-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='développement web'/><category scheme='http://www.blogger.com/atom/ns#' term='sécurité'/><category scheme='http://www.blogger.com/atom/ns#' term='productivité'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Comment bien utiliser OpenID</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fr.wikipedia.org/wiki/OpenID"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 120px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/TUK8djXEg2I/AAAAAAAAAVw/aDGMOtWw4Xk/s400/320px-OpenIDLogo.svg.png" alt="" id="BLOGGER_PHOTO_ID_5567219305277588322" border="0" /&gt;&lt;/a&gt;L'enfer est pavé de bonnes intentions, c'est bien connu. &lt;a href="http://en.wikipedia.org/wiki/OpenID"&gt;OpenID&lt;/a&gt; est une bonne intention qui, si vous ne la maitrisez pas, vous rendra la vie infernale. J'ai eu la douloureuse occasion de m'en rendre compte récemment quand j'ai décidé d'attribuer un vrai nom de domaine (www.jeromeradix.com) à mon blog ici présent (jradix.blogspot.com). Mal m'en a pris ! J'avais naïvement cru que tout cela se passerait sans douleur, c'est tout l'inverse qui se passa.&lt;br /&gt;&lt;br /&gt;Ce blog étant porté (à la date de ce billet) par blogger.com, je profite automatiquement d'un système de consolidation des autorisations pour l'identifiant OpenID du blog : http://jradix.blogspot.com/&lt;br /&gt;&lt;br /&gt;J'ai utilisé cet identifiant OpenID dans de nombreux sites web. Résultat : tous ces sites Web me connaissent en tant que jradix.blogspot.com, pas en tant que jeromeradix.com ! &lt;span style="font-weight: bold;"&gt;Quand j'ai associé mon nouveau nom de domaine à mon blog, j'ai n'ai plus eu aucune possibilité de me connecter&lt;/span&gt; sur tous les sites utilisant mon OpenID jradix.blogspot.com.&lt;br /&gt;&lt;br /&gt;Le seul moyen de retrouver mes comptes sur les sites Web est donc de passer par ce processus très fastidieux :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;remettre mon blog sur jradix.blogspot.com&lt;/li&gt;&lt;li&gt;me connecter en OpenID jradix.blogspot.com sur le site Web duquel je veux changer/ajouter l'openID jeromeradix.com&lt;/li&gt;&lt;li&gt;une fois connecté, je remets mon blog sur jeromeradix.com&lt;/li&gt;&lt;li&gt;je demande ensuite au site de modifier l'OpenID de mon compte (ou ajouter un nouvel OpenID) pour utiliser jeromeradix.com&lt;/li&gt;&lt;li&gt;le site me demande alors de saisir le nouvel OpenID du compte (jeromeradix.com) et essaye d'authentifier cet ID&lt;/li&gt;&lt;li&gt;je suis redirigé sur la page blogger.com d'autorisation d'accès au site pour mon OpenID jeromeradix.com&lt;/li&gt;&lt;li&gt;le site met alors à jour l'OpenID du compte dans sa base de données.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;On voit bien ici, les limites d'un tel processus. &lt;span style="font-weight: bold;"&gt;Si vous avez une centaine de sites Web sur lesquels vous avez un compte associé à votre OpenID, il va falloir aller sur chacun de ces sites et recommencer l'opération.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Heureusement, je n'ai pas un grand nombre de comptes protégés par OpenID, utilisant plutôt &lt;a href="http://www.jeromeradix.com/2008/09/keypass-openid-et-mots-de-passe-dur.html"&gt;Keepass pour générer/stocker mes mots de passe&lt;/a&gt;. Keepass limite le risque de se faire voler ses comptes car vous pouvez avoir un mot de passe fort différent pour chaque compte. Si un de vos comptes est compromis pour je ne sais quelle raison (malveillance interne au site Web suite à la démission d'un prestataire furieux, ... ces choses arrivent plus souvent qu'on ne veut bien le croire ! regardez Wikileaks...) seul ce compte est perdu, les autres restent sécurisés car ils n'ont pas le même mot de passe.&lt;br /&gt;&lt;br /&gt;Avec OpenID, vous centralisez l'accès à tous vos comptes sur tous vos sites Web. Si par malheur, votre compte OpenID est perdu, vous perdez tous vos comptes sur tous les sites en même temps. Tout cela sans parler du &lt;a href="http://en.wikipedia.org/wiki/OpenID#Security_and_phishing"&gt;risque de Phishing inhérent à OpenID&lt;/a&gt;, ou de &lt;span style="font-weight: bold;"&gt;la nécessité impérieuse aujourd'hui de réduire votre dépendance et promouvoir votre indépendance&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;Pour celui qui veut encore utiliser OpenID, de bonnes pratiques s'imposent donc à lui malgré tout :&lt;br /&gt;&lt;br /&gt;- Définir un ID OpenID sur son propre nom de domaine : cela veut dire acheter un nom de domaine et héberger une page contenant deux balises &amp;lt;link&amp;gt; dans le &amp;lt;head&amp;gt; :&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;link rel="openid.server" href="http://www.blogger.com/openid-server.g"&amp;gt;&amp;lt;/link&amp;gt;&lt;br /&gt;&amp;lt;link rel="openid.delegate" href="http://jradix.blogspot.com/"&amp;gt;&amp;lt;/link&amp;gt;&lt;/pre&gt;&lt;br /&gt;La première ligne indique le serveur dans lequel vous stocker vos autorisations OpenID (pour moi, c'est le serveur blogger.com). La deuxième ligne indique quel est le compte OpenID sur ce serveur d'autorisations qui doit être utilisé pour représenter par délégation votre OpenID. J'ai mis ça dans la page correspondant à www.jeromeradix.com.&lt;br /&gt;&lt;br /&gt;- S'enregistrer sur tous les sites Web avec l'OpenID correspondant à votre nom de domaine : pour moi, je me connecte maintenant avec l'OpenID : http://www.jeromeradix.com/&lt;br /&gt;&lt;br /&gt;Ainsi, grâce à ça, vous n'êtes plus dépendant de votre fournisseur de service OpenId, ni de l'hébergeur de votre site Web. Vous pouvez très bien changer les deux et toujours retrouver vos comptes sur les différents sites sur lesquels vous vous êtes enregistré en OpenID.&lt;br /&gt;&lt;br /&gt;Pour plus d'information, consulter la page &lt;a href="http://blog.stackoverflow.com/2009/01/using-your-own-url-as-your-openid/"&gt;Using your own URL as your OpenID&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La leçon de tout ça, est de savoir de qui vos comptes dépendent : de votre fournisseur de nom de domaine ? de l'hébergeur de votre site Web ? du service OpenId qui héberge vos autorisations ? de votre carte de crédit qui a déjà expirée et qui est pourtant la seule qui est enregistrée chez votre fournisseur de nom de domaine ?&lt;br /&gt;&lt;br /&gt;A peser le pour et le contre, je pense que je vais préférer gérer mon compte/mot de passes avec Keepass et me faire personnellement des backups comme nous décrit très bien &lt;a href="http://www.jwz.org/doc/backups.html"&gt;jwz&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A noter aussi que &lt;a href="http://www.infoq.com/news/2011/01/OpenID"&gt;des doutes et des abandons&lt;/a&gt; apparaissent aussi chez les promoteurs de la première heure de l'OpenID.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1116728661290392092?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1116728661290392092/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1116728661290392092' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1116728661290392092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1116728661290392092'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/02/comment-bien-utiliser-openid.html' title='Comment bien utiliser OpenID'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/TUK8djXEg2I/AAAAAAAAAVw/aDGMOtWw4Xk/s72-c/320px-OpenIDLogo.svg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1629653686168422977</id><published>2011-01-29T05:24:00.000-08:00</published><updated>2011-01-29T05:24:00.439-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivité'/><category scheme='http://www.blogger.com/atom/ns#' term='service en ligne'/><title type='text'>Comment créer un flux RSS à partir de n'importe quelle page Web</title><content type='html'>Le service &lt;a href="http://stackoverflow.com/"&gt;StackOverflow.com&lt;/a&gt; a cela de magnifique qu'il permet de faire émerger de l'ensemble vague et indistinct des interrogations que se posent les informaticiens entre eux, les meilleurs questions et les meilleures réponses à celles-ci. Nombreuses sont, pourtant les questions sans intérêts ou trop particulières pour être bénéfique aux lecteurs curieux. La plupart du temps ces questions trouvent leur réponse dans les manuels de référence en ligne de chaque outil. Un simple &lt;a href="http://en.wikipedia.org/wiki/RTFM"&gt;RTFM&lt;/a&gt; suffirait, mais, bonté de la nature humaine, des âmes charitables prennent le temps de former les nouveaux venus à l'informatique. C'est aussi et surtout pour faire monter leur &lt;a href="http://stackoverflow.com/faq#reputation"&gt;compteur de réputation&lt;/a&gt;. Ce n'est pas un mal en soi de pouvoir conjuguer vanité des uns et ignorance des autres et qu'en jaillisse une vérité.&lt;br /&gt;&lt;br /&gt;Tous les sujets imaginables sont abordés, il faut donc s'exercer à rechercher finement ce qui est intéressant pour soi-même sans être submergé par des questions qui ne nous concerne pas. L'outil de recherche de stackoverflow est puissant, il permet de faire une recherche par tag (en saisissant &lt;span style=";font-family:courier new;font-size:85%;"  &gt;[python]&lt;/span&gt; par exemple), de ne choisir que les questions qui ont un nombre de votes supérieur à une valeur (par exemple &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;vote:5&lt;/span&gt;&lt;/span&gt;), etc. La &lt;a href="http://stackoverflow.com/search"&gt;FAQ sur les options de recherche&lt;/a&gt; est ici la bienvenue.&lt;br /&gt;&lt;br /&gt;Pour pouvoir m'instruire à parler couramment le python, j'ai entrepris de consulter régulièrement les meilleurs questions et réponses concernant ce langage. Pour ce faire, stackoverflow.com ne permettant pas d'avoir de flux RSS correspondant à une recherche particulière, je me suis construit mon propre flux RSS grâce à l'outil en ligne &lt;a href="http://feed43.com/"&gt;feed43.com&lt;/a&gt;. Ce service permet de récupérer le code source d'une page web et d'en extraire du contenu grâce à des modèles de correspondance (&lt;span style="font-style: italic;"&gt;matching patterns&lt;/span&gt;). On peut ensuite mettre en forme ce contenu dans un flux RSS qu'on pourra réutiliser dans n'importe quel lecteur de flux RSS. Feed43.com va régulièrement consulter la page Web en question et va mettre à jour le flux RSS en conséquence. Et voilà, on a donc les moyens de créer des flux RSS pour n'importe quelle page/service du web qui n'en propose pas.&lt;br /&gt;&lt;br /&gt;Par exemple, je me suis créé un &lt;a href="http://www.feed43.com/interesting_python_questions.xml"&gt;flux RSS&lt;/a&gt; rassemblant de bonnes questions (votes &gt;= 5) sur python ([python]) ayant une réponse acceptée par l'auteur de la question (hasaccepted:1) et n'étant pas fermée pour diverses causes (closed:0). Dans feed43.com, j'ai configuré le flux de cette manière :&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_dJYBJhDg2Hk/TUFypjmfG_I/AAAAAAAAAVA/wJLz2w45SLc/s1600/screenshot_2011-01-27_14-19-55.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 236px;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/TUFypjmfG_I/AAAAAAAAAVA/wJLz2w45SLc/s400/screenshot_2011-01-27_14-19-55.png" alt="" id="BLOGGER_PHOTO_ID_5566856672663510002" border="0" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_dJYBJhDg2Hk/TUFy5-IkaXI/AAAAAAAAAVI/u6GGC5MerLI/s1600/screenshot_2011-01-27_14-20-10.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 354px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/TUFy5-IkaXI/AAAAAAAAAVI/u6GGC5MerLI/s400/screenshot_2011-01-27_14-20-10.png" alt="" id="BLOGGER_PHOTO_ID_5566856954663692658" border="0" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_dJYBJhDg2Hk/TUFzBb-w2UI/AAAAAAAAAVQ/nBP27Ofqvh4/s1600/screenshot_2011-01-27_14-20-26.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 383px;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/TUFzBb-w2UI/AAAAAAAAAVQ/nBP27Ofqvh4/s400/screenshot_2011-01-27_14-20-26.png" alt="" id="BLOGGER_PHOTO_ID_5566857082934712642" border="0" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_dJYBJhDg2Hk/TUFzHgyFmiI/AAAAAAAAAVY/iEG-we7oJkE/s1600/screenshot_2011-01-27_14-20-51.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 178px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/TUFzHgyFmiI/AAAAAAAAAVY/iEG-we7oJkE/s400/screenshot_2011-01-27_14-20-51.png" alt="" id="BLOGGER_PHOTO_ID_5566857187302939170" border="0" /&gt;&lt;/a&gt;Je peux maintenant avoir dans mon &lt;a href="http://www.google.fr/reader/"&gt;lecteur de flux RSS préféré&lt;/a&gt;, les meilleures questions python avec réponse.&lt;br /&gt;&lt;br /&gt;Grâce à feed43 je me suis constitué quelques flux RSS à partir de sites web qui n'en proposent pas, notamment pour analyser des résultats de recherche sur &lt;a href="http://www.feed43.com/7140646313167101.xml"&gt;pajemploi&lt;/a&gt; (pour avoir les changements dans les salaires minimum en vigueur), sur &lt;a href="http://www.feed43.com/6088503736304770.xml"&gt;ZDnet&lt;/a&gt; (pour n'avoir que les news Open Source)... Ce service est bien sûr dépendant des modifications des pages consultés : votre flux ne marchera plus si les pages scrutés ont été refondues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1629653686168422977?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1629653686168422977/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1629653686168422977' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1629653686168422977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1629653686168422977'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/01/comment-creer-un-flux-rss-partir-de.html' title='Comment créer un flux RSS à partir de n&apos;importe quelle page Web'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/TUFypjmfG_I/AAAAAAAAAVA/wJLz2w45SLc/s72-c/screenshot_2011-01-27_14-19-55.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1054524395835344631</id><published>2011-01-22T11:21:00.001-08:00</published><updated>2011-01-26T02:34:11.983-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gentoo'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><title type='text'>Comment s'arrêter en plein milieu d'une installation Linux Gentoo</title><content type='html'>Malgré &lt;a href="http://jradix.blogspot.com/2008/12/gentoo-linux-grandeur-et-dcadence-de.html"&gt;les aléas&lt;/a&gt; que j'ai eu à subir dans le passé avec Gentoo, je me suis mis en tête de lui redonner encore sa chance avec un autre de mes vieux PC, un ordinateur portable Turion64 / 512 Mo de mémoire.&lt;br /&gt;&lt;br /&gt;M'étant &lt;a href="http://jradix.blogspot.com/2010/12/python-en-remplacant-de-perl.html"&gt;converti&lt;/a&gt; à cette nouvelle religion qu'on appelle Python, j'apprécie d'autant plus Gentoo Portage, système de gestion de paquets codé en ce langage.&lt;br /&gt;&lt;br /&gt;Le &lt;a href="http://www.gentoo.org/doc/fr/handbook/"&gt;manuel Gentoo&lt;/a&gt; est complet et décrit chaque étape de l'installation. Il n'y a pas d'installateur ("installer" pour les anglicisants) proprement dit comme on peut avoir l'habitude sur les autres distributions Linux ou *BSD : chaque étape est manuelle. On amorce ("boot") l'ordinateur sur un CDROM Gentoo minimal, et grâce aux quelques commandes de base disponibles, on installe petit à petit des partitions, des systèmes de fichiers, le réseau, le système portage...&lt;br /&gt;&lt;br /&gt;Chaque étape est manuelle, ça à l'avantage de permettre une configuration personnalisée pour chaque élément du système. De plus, on apprend beaucoup plus facilement à repérer ce qui constitue votre système et où sont placés les principaux fichiers de configuration.&lt;br /&gt;&lt;br /&gt;Un désavantage de cette méthode c'est que vous ne pouvez pas lancer l'installation et attendre que ça se finisse complètement à la fin. Vous devez passer par chaque étape manuellement. Pour réaliser une installation propre de Gentoo, en prenant en compte le temps qu'il vous faut pour adapter la configuration à vos besoins et votre ordinateur, il vous faudra environ une demi-journée. Et puisque rien n'est automatisé, soit vous faites l'installation de bout en bout, soit vous êtes contraints pour les autres aspects de votre vie (vie familiale, besoins naturels...) de cesser toute activité. Dans ce dernier cas, je conseille de faire au moins toutes les étapes jusqu'au &lt;a href="http://www.gentoo.org/doc/fr/handbook/handbook-x86.xml?full=1#book_part1_chap6"&gt;changement de la racine du système&lt;/a&gt; ("chroot").&lt;br /&gt;&lt;br /&gt;Après ça, vous pouvez vous arrêter quand bon vous semble et arrêter votre ordinateur, par un "halt" ou un "reboot" par exemple. Quand vous voudrez continuer votre installation, vous n'aurez plus qu'à amorcer sur le CD, et réaliser les quelques opérations suivantes :&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# Montez toutes les partitions de votre nouveau&lt;br /&gt;# système sur les répertoires adéquats, par exemple :&lt;br /&gt;mount /dev/hda5 /mnt/gentoo&lt;br /&gt;mount /dev/hda7 /mnt/gentoo/var&lt;br /&gt;mount /dev/hda8 /mnt/gentoo/tmp&lt;br /&gt;mount /dev/hda9 /mnt/gentoo/usr&lt;br /&gt;mount /dev/hda10 /mnt/gentoo/home&lt;br /&gt;&lt;br /&gt;# Activez le swap sur la partition de swap de votre&lt;br /&gt;# nouveau système&lt;br /&gt;swapon /dev/hda6&lt;br /&gt;&lt;br /&gt;# Montez les répertoires proc et dev&lt;br /&gt;mount -t proc none /mnt/gentoo/proc&lt;br /&gt;mount -o bind /dev /mnt/gentoo/dev&lt;br /&gt;&lt;br /&gt;# Changer la racine du système en cours&lt;br /&gt;chroot /mnt/gentoo /bin/bash&lt;br /&gt;env-update&lt;br /&gt;source /etc/profile&lt;br /&gt;export PS1="(chroot) $PS1"&lt;/pre&gt;&lt;br /&gt;Et voilà, vous pouvez maintenant reprendre le cours de votre installation manuelle Gentoo là où vous l'aviez laissée avant d'arrêter votre ordinateur.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1054524395835344631?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1054524395835344631/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1054524395835344631' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1054524395835344631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1054524395835344631'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/01/comment-sarreter-en-plein-milieu-dune.html' title='Comment s&apos;arrêter en plein milieu d&apos;une installation Linux Gentoo'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-7301539876717231650</id><published>2011-01-20T07:23:00.000-08:00</published><updated>2011-01-26T02:08:23.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='langage'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Le langage de programmation le plus en vogue en 2010</title><content type='html'>Il semblerait que je sois un être moyen puisque je suis la tendance au plus près : il y a quelques mois, je passais de mon langage favori, Perl, à &lt;a href="http://jradix.blogspot.com/2010/12/python-en-remplacant-de-perl.html"&gt;un nouveau language favori : Python&lt;/a&gt;. Il s'avère que nombreux sont ceux qui font ce même chemin. C'est notamment ce que montre l'index TIOBE des languages les plus utilisés dans le monde. TIOBE vient d'attribuer une distinction à Python : &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;Meilleur langage de 2010&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;En effet, Python est le langage qui, en 2010, a le plus progressé en terme de nombre d'utilisateurs et de &lt;span style="font-style: italic;"&gt;part de marché&lt;/span&gt;. Il est même passé devant C#. On peut noter que PHP est juste au dessus mais est plutôt dans une tendance baissière. &lt;span style="font-weight: bold;"&gt;Les personnes à TIOBE note bien que ce sont beaucoup de &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://www.mongueurs.net/"&gt;mongeurs de perl&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; qui se sont converti à Python&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Python est devenu le standard "de facto" pour le scripting système (étant en cela, un successeur de Perl), mais il est utilisé pour beaucoup plus de types d'application différents aujourd'hui. [...] Comme Python est facile à apprendre, de plus en plus d'universités utilisent Python pour enseigner les languages de programmation"&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-7301539876717231650?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/7301539876717231650/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=7301539876717231650' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7301539876717231650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7301539876717231650'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/01/il-semblerait-que-je-sois-un-etre-moyen.html' title='Le langage de programmation le plus en vogue en 2010'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-7810622726629698598</id><published>2011-01-19T00:46:00.000-08:00</published><updated>2011-01-26T02:35:03.019-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greffon'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Un greffon de recherche Firefox pour les manuels Linux</title><content type='html'>N'ayant pas trouvé de greffon Firefox de recherche intéressant sur les manuels Linux, je me suis construit le greffon &lt;a href="https://docs.google.com/leaf?id=0B5sFcxHlakLxODdjZjFkNTctYzdlZC00OGNkLWE1OGUtZGJlNmMyOGZjODQw&amp;amp;hl=fr&amp;amp;authkey=CIXY_64B"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;linux-die-net.xml&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;b&gt; &lt;/b&gt;suivant à mettre dans &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;C:\Program Files\Mozilla Firefox\searchplugins&lt;/span&gt;&lt;/span&gt; :&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"&amp;gt;&lt;br /&gt;&amp;lt;ShortName&amp;gt;Linux Manuals&amp;lt;/ShortName&amp;gt;&lt;br /&gt;&amp;lt;Description&amp;gt;Linux Manuals on linux.die.net&amp;lt;/Description&amp;gt;&lt;br /&gt;&amp;lt;InputEncoding&amp;gt;UTF-8&amp;lt;/InputEncoding&amp;gt;&lt;br /&gt;&amp;lt;Url type="text/html" method="GET" template="http://www.die.net/search/"&amp;gt;&lt;br /&gt;&amp;lt;Param name="q" value="{searchTerms}"/&amp;gt;&lt;br /&gt;&amp;lt;Param name="sa" value="Search"/&amp;gt;&lt;br /&gt;&amp;lt;Param name="ie" value="UTF-8"/&amp;gt;&lt;br /&gt;&amp;lt;Param name="cx" value="partner-pub-5823754184406795%3A54htp1rtx5u"/&amp;gt;&lt;br /&gt;&amp;lt;Param name="cof" value="FORID%3A9"/&amp;gt;&lt;br /&gt;&amp;lt;Param name="siteurl" value="www.die.net%2Fsearch%2F#914"/&amp;gt;&lt;br /&gt;&amp;lt;/Url&amp;gt;&lt;br /&gt;&amp;lt;SearchForm&amp;gt;http://linux.die.net/&amp;lt;/SearchForm&amp;gt;&lt;br /&gt;&amp;lt;/SearchPlugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Relancer Firefox et il doit maintenant être disponible dans votre liste des moteurs de recherche.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-7810622726629698598?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/7810622726629698598/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=7810622726629698598' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7810622726629698598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7810622726629698598'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2011/01/un-greffon-de-recherche-firefox-pour.html' title='Un greffon de recherche Firefox pour les manuels Linux'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4619271612498713273</id><published>2010-12-09T06:47:00.000-08:00</published><updated>2011-01-26T02:09:04.361-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='closure'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithmie'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Closures - Partie 1</title><content type='html'>Alors que certains langages se posent encore &lt;a href="http://www.infoq.com/news/2010/11/oracle-java-jsr"&gt;des questions existentielles&lt;/a&gt; sur l'incorporation ou pas (et à quelle date) de &lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;closures&lt;/a&gt;, cette capacité d'un langage de haut niveau est largement déployée au sein des langages dits dynamiques (moins péjoratif que langage 'script'), sans parler des langages fonctionnels pour lesquels les &lt;span style="font-style: italic;"&gt;closures &lt;/span&gt;sont aussi naturelles que les &lt;a href="http://en.wikipedia.org/wiki/Higher-order_function"&gt;fonctions d'ordre supérieur&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sur le Web, il n'est pas rare de voir des exemples explicatifs de ce que sont les closures, mais plus rarement des exemples d'application des closures à des cas concrets. Je vais, dans plusieurs billets de ce blog, essayer de vous fournir un aperçu de cas concrets où l'utilisation des closures est intéressante.&lt;br /&gt;&lt;br /&gt;Avant de commencer, il est bien sur nécessaire de clarifier ce qu'on entend par &lt;span style="font-style: italic;"&gt;closure&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Au départ étaient les mathématiques et tout était clair et non-ambigüe. Ils donnèrent au nom de 'fermeture' (&lt;span style="font-style: italic;"&gt;closure&lt;/span&gt;)une &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-15.html#footnote_Temp_154"&gt;définition algébrique&lt;/a&gt; : Un ensemble d'éléments est dit fermé (&lt;span style="font-style: italic;"&gt;closed&lt;/span&gt;) sous une certaine opération si l'application de cette opération aux éléments de l'ensemble produit un élément qui est encore un élément de l'ensemble.&lt;br /&gt;&lt;br /&gt;Puis vinrent les informaticiens qui par leur nature &lt;a href="http://uncyclopedia.wikia.com/wiki/Lazy_Programming"&gt;fainéante&lt;/a&gt;, firent des raccourcis honteux : la communauté Lisp employa le mot &lt;span style="font-style: italic;"&gt;closure&lt;/span&gt; pour décrire un concept complètement différent : une &lt;span style="font-style: italic;"&gt;closure &lt;/span&gt;est une technique d'implémentation pour représenter des procédures ayant des &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html#%_idx_590"&gt;variables libres&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;De cette non-conformité au concept mathématique provient une partie de l'incompréhension qu'ont la plupart des programmeurs de base. Et puisqu'il faut rester concret quand on fait de l'informatique, voici l'exemple de base pour créer une &lt;span style="font-style: italic;"&gt;closure&lt;/span&gt;, qu'on retrouve dans tous les articles d'introduction. L'exemple est en Python 2.7 :&lt;br /&gt;&lt;pre class="brush:py"&gt;def multiplier(nb):&lt;br /&gt;   def multi(value):&lt;br /&gt;       return value * nb&lt;br /&gt;   return multi&lt;/pre&gt;Ici, &lt;span style="font-family:courier new;"&gt;multi &lt;/span&gt;est la &lt;span style="font-style: italic;"&gt;closure&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;multiplier &lt;/span&gt;est la fonction fabricant la &lt;span style="font-style: italic;"&gt;closure&lt;/span&gt;. La plupart du temps, il s'agit d'encapsuler dans une fonction la création de la &lt;span style="font-style: italic;"&gt;closure&lt;/span&gt;. La &lt;span style="font-style: italic;"&gt;closure&lt;/span&gt; dispose alors des variables locales de la fonction dans laquelle elle a été créée. On peut appeler &lt;span style="font-family:courier new;"&gt;multiplier&lt;/span&gt;, l'usine à closures ('&lt;span style="font-style: italic;"&gt;closure factory&lt;/span&gt;').&lt;br /&gt;&lt;br /&gt;On peut utiliser cette closure de cette façon :&lt;br /&gt;&lt;pre class="brush:py"&gt;&amp;gt;&amp;gt;&amp;gt; multi10 = multiplier(10)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; multi10(2)&lt;br /&gt;20&lt;/pre&gt;C'est un peut comme si on appelait l'usine à fabriquer des closures pour configurer au moment de l'exécution (&lt;span style="font-style: italic;"&gt;runtime&lt;/span&gt;) une fonction particulière et d'en produire donc de toute sorte.&lt;br /&gt;&lt;br /&gt;Comme il s'agit ici d'encloisonner des variables dans un &lt;span style="font-style: italic;"&gt;scope &lt;/span&gt;particulier à la closure, on peut très bien définir le même comportement en utilisant la notion de classe classique. L'exemple ci-dessous converti en classe donne :&lt;br /&gt;&lt;pre class="brush:py"&gt;class MultiplierFactory:&lt;br /&gt;   def __init__(self, nb):&lt;br /&gt;       self.nb = nb&lt;br /&gt;   def multiply(self, value):&lt;br /&gt;       return self.nb * value&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; multi10 = MultiplierFactory(10).multiply&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; multi10(2)&lt;br /&gt;20&lt;/pre&gt;&lt;br /&gt;C'est une façon de créer des pseudo-classes anonymes, sachant qu'une classe ne sert qu'à gérer la &lt;a href="http://jradix.blogspot.com/2009/09/loriente-objet-plus-quun-cache-misere.html"&gt;'globalité' de certaines variables&lt;/a&gt;. Pour continuer le parallèle entre une &lt;span style="font-style: italic;"&gt;closure &lt;/span&gt;et une classe, il va être possible, de façon beaucoup plus succincte d'exprimer des &lt;a href="http://en.wikipedia.org/wiki/Behavioral_pattern"&gt;modèles de conception comportementaux&lt;/a&gt; en closure.&lt;br /&gt;&lt;br /&gt;Une closure n'est pas simplement une fonction anonyme qu'on se passe de variable en variable. Pour réellement parler de closure, il faut qu'il y ait en jeu des variables libres telles que &lt;span style="font-family:courier new;"&gt;nb &lt;/span&gt;dans l'exemple précédent.&lt;br /&gt;&lt;br /&gt;A noter aussi qu'une closure ne s'exécute qu'au dernier moment, lors de son appel explicite. La configuration de la fonction n'a pas nécessité de faire fonctionner du code source de cette fonction.&lt;br /&gt;&lt;br /&gt;C'est par exemple, intéressant quand on veut programmer par évènements et appels en retour (&lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt;). Par exemple, sans closure, on pourrait essayer de coder quelque chose comme ça, mais ce code ne peut pas marcher :&lt;br /&gt;&lt;pre class="brush:py"&gt;from threading import Timer&lt;br /&gt;&lt;br /&gt;def show_message(msg):&lt;br /&gt;   print msg&lt;br /&gt;&lt;br /&gt;def set_alarm(msg, timeout):&lt;br /&gt;   Timer(timeout, show_message(msg))&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; set_alarm("Réveille Toi !", 3)&lt;br /&gt;Réveille Toi !    ---&amp;gt; s'affiche instantanément&lt;/pre&gt;En effet, &lt;span style="font-family:courier new;"&gt;Timer(timeout, show_message(msg))&lt;/span&gt; va appeler &lt;span style="font-family:courier new;"&gt;show_message(msg)&lt;/span&gt; avant d'appeler Timer. Timer va donc être appelé avec le résultat de l'appel à &lt;span style="font-family:courier new;"&gt;show_message(msg)&lt;/span&gt;, ce qui n'est pas ce que l'on veut. Par contre, avec une closure, on peut écrire le code de cette manière :&lt;br /&gt;&lt;pre class="brush:py"&gt;from threading import Timer&lt;br /&gt;&lt;br /&gt;def set_alarm(msg, timeout):&lt;br /&gt;   def show_message():&lt;br /&gt;       print msg&lt;br /&gt;   t = Timer(timeout, show_message)&lt;br /&gt;   t.start()&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; set_alarm("Réveille Toi !", 3)&lt;br /&gt;&lt;br /&gt;Au bout de 3 secondes on a :&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; Réveille Toi !&lt;/pre&gt;Ce bout de code permet d'éviter l'emploi d'une variable globale &lt;span style="font-family:courier new;"&gt;msg&lt;/span&gt;, qu'il serait alors difficile de maintenir cohérente dans un environnement multithread par exemple.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4619271612498713273?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4619271612498713273/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4619271612498713273' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4619271612498713273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4619271612498713273'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/12/closures-partie-1.html' title='Closures - Partie 1'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1377239404883114429</id><published>2010-12-02T02:56:00.000-08:00</published><updated>2011-01-26T02:09:41.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='langage'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Python en remplaçant de Perl</title><content type='html'>Je me suis mis récemment au &lt;a href="http://www.python.org/"&gt;langage python&lt;/a&gt;. J'avais des préjugés sur ce langage au moment où j'ai entendu dire qu'il fallait respecter la tabulation pour que le programme fonctionne. Je voyais là le signe d'un langage complètement arriéré, digne des plus beaux langages de grand papa, notamment COBOL qui obligeait à respecter la tabulation, la taille des lignes, des sections particulières...&lt;br /&gt;&lt;br /&gt;Comment ce fait-il que des gens aient choisi un tel retour en arrière pour créer ce langage ? En fait, il s'agit surtout d'une incompréhension. La tabulation en elle-même peut être celle que l'on souhaite mais la tabulation sert à définir le début et la fin des blocs de lignes de codes. C'est en fait un moyen astucieux de définir des blocs sans avoir à utiliser de symbole particulier comme { } par exemple :&lt;br /&gt;&lt;pre class="brush:py"&gt;def fib(n):    # write Fibonacci series up to n&lt;br /&gt; """Print a Fibonacci series up to n."""&lt;br /&gt; a, b = 0, 1&lt;br /&gt; while a &amp;lt; n:&lt;br /&gt;     print a,&lt;br /&gt;     a, b = b, a+b&lt;/pre&gt;Moins je tape de caractère, mieux je me porte. C'est un principe fondamental de la programmation : le meilleur programme c'est celui qui n'a pas de ligne de code.&lt;br /&gt;&lt;br /&gt;Après m'être &lt;a href="http://docs.python.org/tutorial/index.html"&gt;auto-formé à python&lt;/a&gt;, je me suis aperçu que python est aussi souple que mon autre langage de prédilection : Perl. Python comme Perl, centralise les packages disponibles au sein d'un même répertoire appelé &lt;a href="http://pypi.python.org/"&gt;PyPI&lt;/a&gt;. Sous Perl, c'est le répertoire &lt;a href="http://www.cpan.org/"&gt;CPAN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La différence philosophique entre Perl et Python se situe au niveau des slogans qu'ils utilisent : Perl a choisi le TMTOWTDI (There's more than one way to do it) tandis que Python, justement, est parti sur le slogan "There should not be more than one way to do it". Et finalement, sur le long terme, c'est payant pour Python. Le langage Python reste simple et évite toutes les tortures mentales introduites par Perl. Cela permet à plusieurs programmeurs de travailler sur un même code, la maintenance est facilitée. De plus, quand vous arrêté de faire du perl, ne serait-ce que 6 mois par exemple, vous perdez la connaissance que vous avez des bricolages possibles de Perl, et les détails commencent à vous échapper.&lt;br /&gt;&lt;br /&gt;Perl est bien si vous en fait régulièrement, que vos programmes n'ont pas besoin d'une architecture orienté-objet (bien qu'il soit possible de faire de l'&lt;a href="http://www.amazon.com/Object-Oriented-Perl-Comprehensive-Programming/dp/1884777791"&gt;orienté-objet avec du Perl&lt;/a&gt;, mais c'est vraiment une horreur à écrire).&lt;br /&gt;&lt;br /&gt;Perl, par toutes ses particularités et ses bricolages, a permis la constitution d'une communauté soudée, car assez élitiste finalement, Elite dans le sens de : qui maitrise tous les aspects de perl.&lt;br /&gt;&lt;br /&gt;Je crois que je vais définitivement arrêter de coder en Perl mes programmes, et passer sur Python parce que je n'ai plus le temps de réapprendre les tortures mentales nécessaire à la programmation en Perl.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1377239404883114429?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1377239404883114429/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1377239404883114429' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1377239404883114429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1377239404883114429'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/12/python-en-remplacant-de-perl.html' title='Python en remplaçant de Perl'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-9142231099363138124</id><published>2010-11-29T05:46:00.000-08:00</published><updated>2011-01-26T02:10:20.748-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='psychologie'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Hypocrisie et gestion de projet</title><content type='html'>Quel est le plus vieux métier du monde ?&lt;br /&gt;&lt;br /&gt;Non, ce n'est pas péripatéticien, &lt;span style="font-weight: bold;"&gt;c'est le métier de chef de projet&lt;/span&gt;. Depuis la nuit des temps, l'Homme a souhaité une vie meilleure, a projeté son être vers un avenir plus radieux, a ambitionné de créer ce qui n'existe pas encore.&lt;br /&gt;&lt;br /&gt;Sous un qualificatif pompeux (tout le monde veut être chef à la place du chef aujourd'hui) se cache le métier le plus ingrat qui soit quand on borne sa définition à ce qui se fait dans une société de service par exemple.&lt;br /&gt;&lt;br /&gt;En effet, l'intérêt d'un projet est de profiter des biens faits produits par ce projet, soit de façon directe (utilisation des produits et services), soit de façon indirecte (gagner de l'argent sur les bénéfices offerts par les produits du projet)&lt;br /&gt;&lt;br /&gt;Un autre intérêt est l'estime de soi, une certaine fierté d'avoir réussi à produire quelque chose de nouveau dans ce monde. Les personnes dont l'égo est habitué à recevoir de tels émoluments seront satisfaites par le simple fait d'avoir terminé un projet.&lt;br /&gt;&lt;br /&gt;Dans beaucoup de sociétés, notamment les sociétés de service, &lt;a href="http://dchaffiol.free.fr/info/chefprj/art_chefprjprinc_t.htm"&gt;chef de projet n'est pas un grade, mais une fonction&lt;/a&gt;, au même niveau que développeur débutant, architecte ou expert d'un domaine.&lt;br /&gt;&lt;br /&gt;Par définition, &lt;span style="font-weight: bold;"&gt;un chef de projet est responsable de tout&lt;/span&gt;. S'il ne  respecte pas ses &lt;a href="http://jradix.blogspot.com/2009/08/dates-cibles-et-echeances-compromis.html"&gt;engagements initiaux&lt;/a&gt;, il sera tenu pour responsable et souffrira des conséquences. S'il réussi son projet en temps et en coût, aucun remerciement, aucune gratitude ne sera offert au chef de projet victorieux.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://appart.sedryck.com/index.php?post/2007/11/21/20-un-chef-de-projet-en-hiver-3"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/TPOy5JVYXWI/AAAAAAAAAUQ/z-y-5Ha-XhI/s400/case_1.png" alt="" id="BLOGGER_PHOTO_ID_5544972261051096418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nombreux sont ceux qui, informaticiens à la base, se dirigent vers la gestion de projet, très souvent leurrés par la dénomination de "chef" quand il faut lire "gestionnaire". L'emprunt d'une telle carrière par une personne de culture scientifique comme l'est l'informaticien peut être semé d'embuches, de désillusions et de déconvenues.&lt;br /&gt;&lt;br /&gt;Dans toute société, l'hypocrisie est au cœur du système pour fluidifier, apaiser, permettre les relations interpersonnelles. Ce n'est pas forcément une mauvaise chose que les gens ne disent pas toutes les vérités à tout le monde. &lt;span style="font-weight: bold;"&gt;Si nous vivions dans un monde sans hypocrisie, le chaos ne serait jamais très loin&lt;/span&gt; car plus de rêve ne serait possible, tout le monde serait ramené immédiatement à la raison triomphante, froide, inhumaine.&lt;br /&gt;&lt;br /&gt;Dans ce monde du double langage, il est donc important de rappeler quelques règles à suivre quand on est en face de comportements hypocrites, pour que la vérité apparaisse, sans froisser les égos et rompre les communications.&lt;br /&gt;&lt;br /&gt;L'article &lt;a href="http://www.projectperfect.com.au/white-paper-hypocrisy-in-project-management.php"&gt;Hypocrisy in Project Management&lt;/a&gt; de l'équipe &lt;a href="http://www.projectperfect.com.au/"&gt;Project Perfect&lt;/a&gt; en Australie, analyse justement cette hypocrisie inhérente à toute activité commerciale, donc humaine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-9142231099363138124?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/9142231099363138124/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=9142231099363138124' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/9142231099363138124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/9142231099363138124'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/11/hypocrisie-et-gestion-de-projet.html' title='Hypocrisie et gestion de projet'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/TPOy5JVYXWI/AAAAAAAAAUQ/z-y-5Ha-XhI/s72-c/case_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-815764251525581718</id><published>2010-05-28T00:00:00.000-07:00</published><updated>2011-01-29T13:56:37.838-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matériel'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>iPad versus le Livre</title><content type='html'>Que faudrait-il pour que je me mette à lire la majorité de mes livres sur un iPad ?&lt;br /&gt;&lt;br /&gt;Les qualités d'un livre sur papier sont nombreuses :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ultra-résistant : je peux le jeter contre les murs (ça peut arriver si l'auteur méprise le lecteur que je suis), je peux l'emmener à la plage le laisser dans le sable en plein soleil, le tordre dans tous les sens. Le livre a aussi l'avantage de ne jamais tomber en panne et est relativement résistant sur le long terme.&lt;/li&gt;&lt;/ul&gt;J'ai dans ma bibliothèque le livre &lt;a href="http://fr.wikipedia.org/wiki/Sainte_Jeanne_%28pi%C3%A8ce_de_th%C3%A9%C3%A2tre%29"&gt;Sainte Jeanne&lt;/a&gt; de Georges Bernard Shaw. C'est un livre ancien tel qu'on peut maintenant facilement les acheter sur des sites web comme &lt;a href="http://www.chapitre.com/"&gt;chapitre.com&lt;/a&gt; ou &lt;a href="http://www.abebooks.fr/"&gt;abebooks.fr&lt;/a&gt;. Ce livre date de 1932 et est toujours aussi lisible qu'à l'époque de son impression. Chez mes parents, j'ai trouvé des livres de poche des années 1960 qui sont, certes, en moins bon état que le "Sainte Jeanne" mais tout aussi lisible.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ultra-pratique : ne tombe jamais en panne, n'a pas besoin de pile ou de batterie, je peux passer à n'importe quelle page en un seul et très léger mouvement de doigts. Je peux marquer les pages qui m'intéressent, je peux gribouiller, écrire dessus ou souligner des lignes. Je peux offrir cet objet réel qu'est le livre à une personne et y apposer un petit mot.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ultra-plaisant : je peux lire un livre pendant des heures, voire des jours entiers sans avoir mal aux yeux, que ça soit en plein jour et plein soleil ou la nuit, à la lumière d'une lampe de chevet. Un livre de poche pèse dans les 300g je peux le tenir à bout de bras dans tous les sens, il permet une bonne prise en main.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;très peu cher : un livre de poche ou un livre de taille moyenne est très peu cher. Je peux prêter mon livre à tout ceux que je connais sans qu'ils aient besoin de quoique ce soit. Je peux même revendre mon livre sur amazon ou ebay et rendre ce livre encore moins cher à l'utilisation. Je peux relire le livre autant de fois que je le désire. Je n'ai pas de problème d'obsolescence technologique, je peux donc garder mon livre jusqu'à la fin de ma vie sans avoir peur de ne plus pouvoir le lire.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Si on met en parallèle tous ces avantages, est-ce que l'iPad tiens la comparaison ?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;résistance : bien que conçu pour être un appareil électronique portable, l'iPad n'est pas conçu comme un PC durci (rugged computer) aux normes militaires par exemple. Je ne vous conseille pas de laisser votre iPad en plein soleil toute une journée sur la plage dans le sable ou encore moins de le laisser tomber régulièrement de vos mains.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;pratique : les batteries de l'iPad, comme toutes les batteries, finiront par s'user et devront être changée, pour un prix élevé bien sur (car &lt;a href="http://en.wikipedia.org/wiki/Ipad#Power_and_battery"&gt;l'utilisateur ne peut pas changer lui même les batteries&lt;/a&gt;). Qui dit pile, dit rechargement. Bien qu'il ait une bonne autonomie, (on parle de 10 heures de vidéo ou 140 heures d'audio), c'est toujours très court par rapport à un livre qui a une autonomie aussi longue ... que votre vie !&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;plaisir : j'ai beau avoir essayer tous types d'écrans, quand il s'agit de lire pendant des heures, d'être plongé dans un récit et de ne pas en décrocher, le seul moyen viable est l'utilisation d'un écran non rétro-éclairé. L'éclairage d'un écran, bien que pratique pour l'informatique générale ne permet pas une lecture longue d'un texte. Je peux passer toute ma journée à travailler sur écran, mais l'activité de lecture est différente, elle nécessite de se concentrer sur un espace réduit d'un écran et de faire défiler ses yeux sur des caractères et ce, dans la durée. Lire sur du papier est bien plus plaisant que lire sur un écran rétro-éclairé.&lt;/li&gt;&lt;/ul&gt;Sur ordinateur, je suis parfois amené à lire de long passages de texte ardus comme des lignes de codes. Je le fais sur un éditeur configuré pour afficher le texte en blanc sur noir, ou plutôt, en saumon clair sur vert foncé. Ce sont les couleurs les plus agréables que j'ai pu trouver pour coder pendant des longues heures. Je ne suis pas sure que l'iPad propose de configurer complètement l'apparence du texte sachant qu'iBookstore contiendra des livres des éditeurs classiques sur papier et que ces derniers imposeront l'apparence de leurs livres.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;prix : Le modèle économique de l'Apple iPad :&lt;/li&gt;&lt;/ul&gt;- justifier un prix élevé du produit (il va coûter dans les 500 euros en France) grâce à une marque forte qui flatte l'acheteur (un des ressorts du luxe)&lt;br /&gt;&lt;br /&gt;- mettre une taxe à chaque utilisation du produit pour lire un livre, le prêter, etc. La taxe doit être suffisamment faible pour être indolore pour le client. Mais la taxe doit être à tous les niveaux.&lt;br /&gt;&lt;br /&gt;Je n'ai pour le moment pas trouvé beaucoup de livres sur l'&lt;a href="http://en.wikipedia.org/wiki/IBookstore"&gt;iBookstore&lt;/a&gt; mais ça peut s'arranger avec le temps. Je n'ai vu que des &lt;a href="http://itunes.apple.com/us/genre/mobile-software-applications/id6018?mt=8"&gt;livres gratuits où valant 0,99$&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://itunes.apple.com/us/app/alice-for-the-ipad-lite/id364746811?mt=8#"&gt;Alice au pays des merveilles&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://itunes.apple.com/us/app/twilight-the-graphic-novel/id364025321?mt=8"&gt;Twilight&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je ne pense pas que ça soit le prix de base des livres de qualités qui pourront être mis dans l'iPad. Les éditeurs pourront faire des économies de papier, mais pas de distribution : au lieu que ce soit les distributeurs traditionnels qui se sucrent sur les prix des livres, ce sera Apple. Un livre de poche aujourd'hui vaut entre 2 et 7 euros. La différence ne sera jamais très grande entre le prix d'un livre sur iPad et le prix d'un livre papier.&lt;br /&gt;&lt;br /&gt;De plus, comment faire pour prêter un livre sous iPad ? et comment revendre un livre ?&lt;br /&gt;&lt;br /&gt;En bref : l'iPad est moins intéressant sur toutes les caractéristiques d'un livre papier. Mais il y a quand même des éléments intéressants pour certaines personnes (pas moi, malheureusement) :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.wikipedia.org/wiki/IPad"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 267px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/S_-5S6m63dI/AAAAAAAAATk/PVrP0EHAlhw/s400/800px-IPad_eBook_reader.jpg" alt="" id="BLOGGER_PHOTO_ID_5476299406527094226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Avec un iPad, vous pouvez lire dans le noir complet, vu que c'est rétro-éclairé. Personnellement, je me vois mal lire dans le noir complet.&lt;br /&gt;&lt;br /&gt;Avec l'iPad vous pouvez avoir pleins de livres sous la main, disponibles en 1 seul clic. Personnellement, je ne lis au maximum que 2 ou 3 livres en parallèle, et les mettre dans un sac n'est pas un surpoids énorme quand je pars en voyage. En général je ne lis qu'un livre à la fois. L'argument comme quoi on a plus besoin d'avoir une énorme bibliothèque chez soi ne me convainc pas : avoir une bibliothèque ne me gène pas, cela me permet de revoir en quelques coups d'œil l'ensemble de me livres.&lt;br /&gt;&lt;br /&gt;Avec l'iPad, il est beaucoup moins cher d'avoir des livres en couleur. Cela est intéressant quand on veut lire des bandes dessinées. Mais quand il s'agit de "beaux livres" d'art, une reproduction sur papier est bien plus belle et précise qu'une reproduction sur un écran rétro-éclairé.&lt;br /&gt;&lt;br /&gt;Pour que l'iPad devienne plus intéressant face aux livres, il faudrait :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;mettre suffisamment de cellules photovoltaïques pour permettre de fonctionner sans batteries... mais ça semble assez difficile vu la taille de l'objet.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;durcir l'objet aux normes militaires : avec de telles normes, on a plus du tout peur de casser ou d'emporter son iPad n'importe où.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;permettre des hyperliens directs vers toutes les références citées. Mais là encore, si tout est payant dans le monde iPad, sauter de référence en référence signifie sauter de livre en livre, donc de taxe en taxe. On n'est plus dans un modèle gratuit du web mais dans un modèle de contenu payant. ça peut être intéressant pour des chercheurs, ou autres étudiants, mais pas pour le lecteur de base que je suis.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;permettre un modèle économique similaire au livre : achat / prêt / revente.&lt;/li&gt;&lt;/ul&gt;A noter aussi que l'iPad n'est &lt;a href="http://en.wikipedia.org/wiki/Newton_%28platform%29"&gt;en rien une  nouveauté&lt;/a&gt;, et qu'il existe de &lt;a href="http://en.wikipedia.org/wiki/Tablet_pc"&gt;nombreux concurrents&lt;/a&gt; :  on se demande d'ailleurs ce que fait le CSA car tous les médias parlent  d'Apple comme si c'était un phénomène unique, alors que de nombreuses  autres marques existent. Je pensais qu'il était interdit de citer des  marques pendant les émissions ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-815764251525581718?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/815764251525581718/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=815764251525581718' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/815764251525581718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/815764251525581718'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/05/ipad-versus-le-livre.html' title='iPad versus le Livre'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/S_-5S6m63dI/AAAAAAAAATk/PVrP0EHAlhw/s72-c/800px-IPad_eBook_reader.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-5684163056051394127</id><published>2010-04-09T13:29:00.000-07:00</published><updated>2011-01-26T02:11:53.354-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Règles pour le Codage</title><content type='html'>Ce que je trouve très intéressant dans un livre technique c'est quand celui-ci liste explicitement de "bonnes pratiques" que l'on sent sortir tout droit de l'expérience de l'écrivain.&lt;br /&gt;&lt;br /&gt;L'œuvre majeure dans ce domaine est bien sur &lt;a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670"&gt;Code Complete 2&lt;/a&gt; mais je suis tombé sur une page Web contenant une liste très intéressante, tirée du livre &lt;a href="http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880"&gt;Programming Pearls&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Il s'agit de l'&lt;a href="http://www.cs.bell-labs.com/cm/cs/pearls/apprules.html"&gt;Annexe 4 : Rule for Coding&lt;/a&gt; qui est une retranscription d'une liste que l'auteur, &lt;a href="http://en.wikipedia.org/wiki/Jon_Bentley"&gt;Jon Bentley&lt;/a&gt;, avait constitué en 1982 dans son livre "Writing Efficient Programs". Oui, 1982 !!! et toutes ces pratiques sont toujours valides. &lt;span style="font-weight: bold;"&gt;Qui peut se targuer d'une telle longévité de ses conseils en matière informatique ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quand vous lirez ces règles, vous vous direz certainement que c'est évident, que vous mettez déjà en pratique ce genre d'heuristiques programmatoires. Oui, mais Jon Bentley a réussi à mettre des noms aux activités que nous menons tous les jours quand nous programmons. Comme dirait le poète, une chose n'existe pas si elle n'a pas de nom. Mettre &lt;a href="http://jradix.blogspot.com/2008/08/terminologie-de-la-communaut-des.html"&gt;des noms à tous les aspects de l'activité de programmation&lt;/a&gt; sert à faire reconnaitre le véritable travail qui est effectué. Sans cela, la programmation, pour le non-informaticien reste du ressort de la magie.&lt;br /&gt;&lt;br /&gt;Aujourd'hui, 2010, le problème n'est plus vraiment de ressortir toutes ces "bonnes pratiques", toutes ces règles. La difficulté réside dans &lt;span style="font-weight: bold;"&gt;l'application systématique de ces règles&lt;/span&gt;. Comment faire pour que tous les programmeurs d'un projet de développement logiciel connaissent, utilisent, appliquent toutes ces règles de façon exhaustive ? Comment, au niveau de l'activité d'assurance qualité, vérifier l'application complète de ces règles pour l'ensemble de code concerné sans devenir un tortionnaire envers ceux qui programment ?&lt;br /&gt;&lt;br /&gt;La programmation se base sur le mécanisme d'abstraction pour permettre de construire des systèmes complexes et &lt;span style="font-weight: bold;"&gt;gérables par des êtres humains&lt;/span&gt;. Or le revers de la médaille "abstraction" est le fait que chaque programmeur peut cacher l'implémentation d'une fonction sous des aspects de code fonctionnant correctement.&lt;br /&gt;&lt;br /&gt;Le meilleur moyen pour qu'un programmeur mette en œuvre les règles et les bonnes pratiques est de lui fournir des outils lui permettant de tester par lui-même la qualité de son code. Car, comme l'optimisation est la cause de tout mal en se bas-monde, il faut optimiser, et donc essayer d'appliquer les règles explicitement que si on constate un problème de performance. Il est donc utile de repérer dès la conception de l'architecture les points clés dont dépendent les performances attendue. La qualité de tous ces points clés doit être soigneusement vérifiée.&lt;br /&gt;&lt;br /&gt;Ainsi, lors de la façon de définition de l'architecture, il faut non seulement définir les éléments statiques, dynamique et l'allocation des ressources matérielle, mais en plus, &lt;span style="font-weight: bold;"&gt;identifier les éléments critiques&lt;/span&gt; en terme de performance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-5684163056051394127?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/5684163056051394127/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=5684163056051394127' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5684163056051394127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5684163056051394127'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/04/regles-pour-le-codage.html' title='Règles pour le Codage'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-699822978278743737</id><published>2010-03-17T01:58:00.001-07:00</published><updated>2011-01-26T02:12:08.396-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matériel'/><title type='text'>Ecran mat ou brillant ?</title><content type='html'>Je me suis toujours demandé &lt;span style="font-weight: bold;"&gt;pour quelle raison la tendance actuelle est de vendre des écrans brillants plutôt que des écrans mats&lt;/span&gt;. Les écrans brillants reflètent toutes les sources de lumière et rend très désagréable le travail sous des néons (cas très courant faut-il le rappeler).&lt;br /&gt;&lt;br /&gt;Je ne suis pas sure que le coût soit véritablement différent à la production entre un écran brillant et un écran mat. Peut-être que les gens achètent plus des écrans brillants parce que "ça en jette". Personnellement, autour de moi, la plupart des personnes préfèrent des écrans mats.&lt;br /&gt;&lt;br /&gt;C'est d'ailleurs aussi la préférence de AnandTech dans leur &lt;a href="http://www.anandtech.com/mobile/showdoc.aspx?i=3770"&gt;revue du Netbook Asus Eee PC 1001P&lt;/a&gt; :&lt;span class="content"&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="content"&gt;"The screen also has a matte finish, thankfully one  of the few computers to forego the trend of featuring a glossy screen.&lt;/span&gt;" (L'écran a aussi une finition mate, heureusement l'un des rares ordinateurs à renoncer à la tendance à faire figurer des écrans brillants).&lt;br /&gt;&lt;/blockquote&gt;Ce nouveau Eee PC a un écran vraiment incroyable à en croire les &lt;a href="http://www.anandtech.com/mobile/showdoc.aspx?i=3770&amp;amp;p=3"&gt;performances mesurées&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;img src="file:///F:/tmp/moz-screenshot.png" alt="" /&gt;&lt;img src="file:///F:/tmp/moz-screenshot-1.png" alt="" /&gt;&lt;img src="file:///F:/tmp/moz-screenshot-2.png" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.anandtech.com/mobile/showdoc.aspx?i=3770&amp;amp;p=3"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 245px;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/S6CcssRd41I/AAAAAAAAATc/g6b8xaFmZKA/s400/22038.png" alt="" id="BLOGGER_PHOTO_ID_5449527840730899282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Assurément un des meilleurs netbook du moment...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-699822978278743737?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/699822978278743737/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=699822978278743737' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/699822978278743737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/699822978278743737'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/03/ecran-mat-ou-brillant.html' title='Ecran mat ou brillant ?'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/S6CcssRd41I/AAAAAAAAATc/g6b8xaFmZKA/s72-c/22038.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-6288514655642366608</id><published>2010-02-17T18:10:00.001-08:00</published><updated>2011-01-26T02:13:12.467-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commerce'/><title type='text'>Microsoft, l'anti-pattern économique</title><content type='html'>A tout ceux qui voit en Microsoft un exemple à suivre, un modèle d'entreprise, à tout ceux qui croit que Microsoft a des clients parce qu'il a de bons produits, je recommande la lecture de deux graphiques :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.businessinsider.com/henry-blodget-microsoft-still-shoveling-2-billion-a-year-into-the-online-money-pit-2010-1"&gt;Microsoft perd toujours 2 milliards par an pour sa division Online Services&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.businessinsider.com/chart-of-the-day-windows-mobile-apple-blackberry-share-2010-2"&gt;L'effondrement du secteur Mobile de Microsoft&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Où on apprend entre autres choses le coût d'achat d'un point de marché des moteurs de recherche (bing) : 667 millions de $ et que perdre 2 milliards de $ par an pour un produit qui ne marche pas n'est pas un problème pour Microsoft.&lt;br /&gt;&lt;br /&gt;Quand Microsoft génère autant d'argent de son Trust Windows/Office, il plonge allégrement dans l'irréalisme économique. Microsoft semble vraiment incapable de faire du business rentable sur internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-6288514655642366608?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/6288514655642366608/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=6288514655642366608' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6288514655642366608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6288514655642366608'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/02/microsoft-lanti-pattern-economique.html' title='Microsoft, l&apos;anti-pattern économique'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1319100810774382590</id><published>2010-01-16T00:13:00.000-08:00</published><updated>2011-01-26T02:20:14.750-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Déplacement de code invariant de boucle</title><content type='html'>L’optimisation de code est un vaste sujet, car il s’agit plus d’un art que d’une théorie axiomisée. Elle n’est que la conséquence des limitations auxquelles sont confrontés les informaticiens.&lt;br /&gt;&lt;br /&gt;Il est bien connu que l’optimisation prématurée est la source de tous les malheurs, mais il est quand même recommandé de connaître les limites des outils et langages que l’on utilise pour pouvoir coder juste au premier coup.&lt;br /&gt;&lt;br /&gt;Avec les &lt;a href="http://fr.wikipedia.org/wiki/Rich_Internet_Application"&gt;RIA&lt;/a&gt;, ils est maintenant nécessaire d’écrire des &lt;a href="http://jradix.blogspot.com/2009/08/ajax-et-performance-un-oxymore.html"&gt;portions de code relativement importantes en Javascript&lt;/a&gt; alors que ce langage n’était prévu à l’origine que pour dynamiser un peu les pages Web statiques.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Javascript n’a pas été conçu pour réaliser des optimisations de code en amont de son exécution &lt;/span&gt;comme pourrait le faire un compilateur C ou Java. Une des optimisations à faire absolument est le &lt;span style="font-weight: bold;"&gt;déplacement du code invariant de boucle&lt;/span&gt; (« &lt;a href="http://en.wikipedia.org/wiki/Loop-invariant_code_motion"&gt;Loop-invariant code motion&lt;/a&gt; »).&lt;br /&gt;&lt;br /&gt;Par exemple si vous avez du code comme ça :&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;for (i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;  x = y + z;&lt;br /&gt;  a[i] = 6 * i + x * x;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Alors il vaut mieux le réécrire comme ci-dessous sous peine de laisser l’interpréteur Javascript recalculer à chaque itération des valeurs invariantes :&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;x = y + z;&lt;br /&gt;t1 = x * x;&lt;br /&gt;for (i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;  a[i] = 6 * i + t1;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Ce genre d’optimisation est généralement bien réalisé par les compilateurs C ou Java mais Javascript n’a pas ce genre d’intelligence. Le déplacement de code invariant de boucle est une des optimisations préconisées par Jon Bentley dans &lt;a href="http://www.cs.bell-labs.com/cm/cs/pearls/apprules.html"&gt;Programming Pearls&lt;/a&gt;, livre O combien recommandé dans ce domaine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1319100810774382590?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1319100810774382590/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1319100810774382590' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1319100810774382590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1319100810774382590'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/01/deplacement-de-code-invariant-de-boucle.html' title='Déplacement de code invariant de boucle'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-8297917880790168610</id><published>2010-01-11T08:24:00.000-08:00</published><updated>2011-01-26T02:14:06.091-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='homebrew'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo ds'/><title type='text'>Répertoire de sons pour vos homebrew...</title><content type='html'>Je surfais par hasard sur la toile, à la recherche de sons gratuitement réutilisable pour une création multimedia sur Nintendo DS.&lt;br /&gt;&lt;br /&gt;Je suis tombé sur ce &lt;a href="http://www.stonewashed.net/sfx.html"&gt;répertoire de liens vers des sites collection de sons&lt;/a&gt; divers et variés.&lt;br /&gt;&lt;br /&gt;C'est un bon point de départ pour ceux qui font du homebrew sur Nintendo DS ou autre, et qui cherche des sons réutilisable sans frais.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-8297917880790168610?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/8297917880790168610/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=8297917880790168610' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8297917880790168610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8297917880790168610'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2010/01/repertoire-de-sons-pour-vos-homebrew.html' title='Répertoire de sons pour vos homebrew...'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4957262056011229595</id><published>2009-10-30T07:13:00.000-07:00</published><updated>2011-01-26T02:14:39.473-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Quelle est votre opinion la plus controversée sur la programmation ?</title><content type='html'>Je me baladais l’autre jour sur &lt;a href="http://stackoverflow.com/"&gt;stackoverflow.com&lt;/a&gt;, le site de questions/réponses de &lt;a href="http://www.codinghorror.com/"&gt;Jeff Atwood&lt;/a&gt; que tout le monde attendait (vu le nombre de questions et réponses déjà présentes sur le site). Il y a toujours des questions qui cherchent à polémiquer, à créer des controverses, à relancer des guerres maintes fois débattues (la guerre des éditeurs, des OS…).&lt;br /&gt;&lt;br /&gt;Je suis tombé par hasard sur cette question : &lt;a href="http://stackoverflow.com/questions/406760/whats-your-most-controversial-programming-opinion"&gt;Quelle est votre opinion la plus controversée sur la programmation ?&lt;/a&gt; Autant dire que ça doit inspirer pas mal de monde… et en effet, des pages et des pages d’opinions les plus diverses sont reliées à cette question.&lt;br /&gt;&lt;br /&gt;Plusieurs opinions m’ont paru intéressantes, voici traduit en français celles de la première page, donc celles les plus intéressantes, puisque c’est l’objectif de stackoverflow.com de faire remonter le plus en haut les meilleures réponses aux questions :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; La seule “bonne pratique” que vous devez utiliser tout le temps est “Utilisez votre cerveau”.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les programmeurs qui ne codent pas pendant leur temps libre pour s’amuser ne deviendront jamais aussi bon que ceux qui le font.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; La plupart des commentaires dans le code sont en fait une forme pernicieuse de duplication de code.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les programmeurs ne sont pas tous nés égaux. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; XML est très surfait.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; “Trouver sur google” (googling) est bien.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Je n’arrive pas à comprendre pourquoi les gens pensent que Java est absolument le meilleur langage de programmation à enseigner en université&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Si vous ne connaissez qu’un seul langage, quel que soit le niveau de connaissance de celui-ci, vous n’êtes pas un bon programmeur&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; La performance compte.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les instructions “print” sont une manière valide de débugguer du code.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les “Getters” et les “Setters” sont bien trop utilisés&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; SQL est du code. Traîtez-le comme tel.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Votre travail est de vous mettre au chômage.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Si vous êtes un développeur, vous devez être capable d’écrire du code.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; La lisibilité est la chose la plus importante de votre code&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les diagrammes UML sont très surfaits.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; L’utilisation de la notation hongroise doit être punie par la mort&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les modèles de conception font plus de mal à une bonne conception qu’ils ne l’aident effectivement.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les tests unitaires ne vous aideront pas à écrire du bon code.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Ecrivez des méthodes courtes.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; C’est acceptable d’écrire du code jetable de temps en temps.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Moins de code est mieux que plus de code.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; PHP craint ;-)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Code == Conception&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Il n’y a rien de mal à mettre des binaires dans le système de contrôle de code source.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Le développement logiciel n’est qu’un job.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Chaque développeur doit être familiarisé avec l’architecture des ordinateurs modernes&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les architectes / concepteurs de logiciels sont très surfaits.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Il n’y a pas d’approche « taille unique pour tout le monde » du développement.&lt;/li&gt;&lt;/ul&gt;Et ce n’est que la première page ! C’est du même acabit pendant 13 pages. On peut noter les autres opinions suivantes qui ont le mérite de provoquer aussi la controverse et force à réfléchir sur la futilité ou l’utilité de nos pratiques au jour le jour :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La plupart des programmeurs professionnels craignent un max.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Vous devez savoir taper à la machine pour être un programmeur&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; C++ est l’un des pires langages de programmation jamais conçu&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Le monde a besoin de plus de GOTOs&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les &lt;a href="http://jradix.blogspot.com/2008/07/les-vues-et-le-contrle-daccs-fin-aux.html"&gt;programmeurs fainéants sont les meilleurs programmeurs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les architectes qui ne codent pas sont inutiles&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les programmeurs qui passent leur journée à répondre à des questions sur Stackoverflow ne font probablement pas le travail pour lequel ils sont payés.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les mauvais programmeurs sont Langage-Agnostiques&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jradix.blogspot.com/2009/09/inadaptation-dimpedance-objet.html"&gt; Les données sont le système.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Les utilisateurs ne sont pas idiots, vous l’êtes.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; La documentation générée est presque tout le temps totalement inutile&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Vous n’avez pas toujours besoin d’une base de données&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Chaque développeur doit passer plusieurs semaines, voire des mois, à développer des systèmes sur papier avant de commencer à construire des systèmes sur électronique. Ils doivent aussi être forcés à utiliser leur système.&lt;/li&gt;&lt;/ul&gt;Tout cela est un méli-mélo de sagesse populaire, d’opinions tout faites, l’intérêt étant que tout porte à controverse, ça permet de se confronter à ce que ressent profondément notre profession (pour certains) ou notre « art » (pour les autres).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4957262056011229595?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4957262056011229595/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4957262056011229595' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4957262056011229595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4957262056011229595'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/10/quelle-est-votre-opinion-la-plus.html' title='Quelle est votre opinion la plus controversée sur la programmation ?'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-3637112612563426166</id><published>2009-10-13T06:10:00.000-07:00</published><updated>2011-01-26T02:15:15.152-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de données'/><title type='text'>Bases de données temporelles</title><content type='html'>Quand il s'agit de gérer des périodes de temps, SQL n'est pas très bien pourvu, et le modèle relationnel classique ne s'y prête pas naturellement. Sans essayer de passer par du TSQL2 et de s'attacher une technologie que finalement peu de monde utilise (l’utilisez-vous ?, je ne l’ai jamais vu en pratique sur des applications d'entreprise), on peut, avec malice, trouver des solutions pour représenter les différents états dans le temps d'un fait.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://goeasteurope.about.com/od/czechrepublic/ss/oldtownprague_2.htm"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/StR_58Lwt6I/AAAAAAAAASc/FpsD7hGVkgc/s400/AstronomicalClock.png" alt="" id="BLOGGER_PHOTO_ID_5392075287254054818" border="0" /&gt;&lt;/a&gt;Tout est affaire de point de vue. Si vous avez une application tournant au dessus d’un modèle relationnel, il n’est pas nécessaire de modifier le code de celle-ci pour permettre l’historisation automatique des données manipulées.&lt;br /&gt;&lt;br /&gt;Il n’y a qu’à remplacer les tables à historiser par des vues :&lt;br /&gt;&lt;ul&gt;&lt;li&gt; la vue a exactement les mêmes colonnes que la table qu’elle remplace&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; la vue est construite au dessus d’une table d’historisation contenant les mêmes colonnes qu’initialement, plus 2 nouvelles colonnes :&lt;/li&gt;&lt;/ul&gt;                - DEBUT&lt;br /&gt;              - FIN&lt;br /&gt;&lt;ul&gt;&lt;li&gt; [DEBUT;FIN[ correspond à l’interval de temps pendant lequel l’entité a la même valeur (dans ses autres colonnes) (attention : DEBUT est inclus, FIN est exclu)&lt;/li&gt;&lt;/ul&gt;On peut vouloir stocker le temps-valide ou le temps transaction :&lt;br /&gt;&lt;br /&gt;* Le &lt;span style="font-weight: bold;"&gt;temps-valide&lt;/span&gt; (ou « temps logique ») dénote la période de temps durant laquelle un fait est vrai par rapport avec la réalité.&lt;br /&gt;&lt;br /&gt;* Le &lt;span style="font-weight: bold;"&gt;temps-transaction&lt;/span&gt; (ou « temps physique ») est la période de temps pendant laquelle un fait est stocké dans la base de données.&lt;br /&gt;&lt;br /&gt;* La &lt;span style="font-weight: bold;"&gt;donnée bitemporelle&lt;/span&gt; combine à la fois le temps-valide et le temps-transaction.&lt;br /&gt;&lt;br /&gt;A noter que ces deux périodes de temps n'ont pas à être égales pour un fait unique. Imaginez que nous ayons une base de données temporelle stockant des données relatives au 18ème siècle. Le temps-valide de ces faits se situe quelque part entre 1701 et 1800, tandis que le temps transaction débute quand on insère le fait dans la base de données, par exemple le 21 janvier 1998.&lt;br /&gt;&lt;br /&gt;L’objectif est de pouvoir consulter la base de données à un instant T. Pour cela, il faut faire attention d’historiser aussi les données dépendantes par contrainte.&lt;br /&gt;&lt;br /&gt;Les bases temporelles permettent souvent de différencier les &lt;a href="http://jradix.blogspot.com/2009/09/inadaptation-dimpedance-objet.html"&gt;programmeurs sur framework  des programmeurs sur base de données&lt;/a&gt;. Un programmeur sur base de données va implémenter une base de données temporelle avec des vues et des triggers, offrant une vue propre des données à un instant T. Le programmeur sur framework va implémenter les règles de gestion du temps en Java au lieu d’utiliser des triggers et des vues et va aboutir, avec une grande probabilité, à une machine à gaz inmaintenable au bout de 3 mois.&lt;br /&gt;&lt;br /&gt;Les vues et les triggers des bases de données sont des outils puissants et naturels pour implémenter :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;le contrôle d’accès fin aux données, &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;l’historisation des données sous la forme de base de données temporelle.&lt;/li&gt;&lt;/ul&gt;Il est vain d’essayer de reproduire ces fonctionnalités au niveau de la couche applicative. Bizarrement, la mise en place de base de données temporelle est rarement évoquée sur &lt;a href="http://asktom.oracle.com/"&gt;asktom.oracle.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pour info, j'ai traduit la page &lt;a href="http://en.wikipedia.org/wiki/Temporal_database"&gt;Temporal database&lt;/a&gt; (&lt;a href="http://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_temporelle"&gt;Base de données temporelle&lt;/a&gt;) dans Wikipedia, histoire de combler à mon humble mesure le vide sidéral des &lt;a href="http://jradix.blogspot.com/2008/10/contribuer-en-franais-wikipedia.html"&gt;articles informatiques en Français&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pour en savoir plus sur les bases de données temporelle, autant consulter la &lt;a href="http://troels.arvin.dk/db/rdbms/links/#temporal"&gt;liste de liens de Troels&lt;/a&gt; ou encore cette &lt;a href="http://www.info.fundp.ac.be/libd/jibd/Intro-BDT.pdf"&gt;Introduction aux bases de données temporelles&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-3637112612563426166?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/3637112612563426166/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=3637112612563426166' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3637112612563426166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3637112612563426166'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/10/bases-de-donnees-temporelles.html' title='Bases de données temporelles'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/StR_58Lwt6I/AAAAAAAAASc/FpsD7hGVkgc/s72-c/AstronomicalClock.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-5844732759598048089</id><published>2009-09-28T06:59:00.000-07:00</published><updated>2011-01-26T02:22:25.947-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><category scheme='http://www.blogger.com/atom/ns#' term='inspections'/><title type='text'>Efficacité des tests unitaires</title><content type='html'>Les tests unitaires ne sont pas une solution à un problème, mais plutôt&lt;span style="font-weight: bold;"&gt; le symptôme de notre incapacité à produire du code correct dès le premier jet&lt;/span&gt;. Quand la même personne réalise le test unitaire et le code à tester, elle a toujours du mal à s'auto-critiquer, même en voulant honnêtement produire le code le plus propre possible. Un code est beaucoup plus critiqué, explicité, quand ce n'est pas la même personne qui code et qui teste. Cela me rappelle une étude citée par Steve McConnell dans "Code Complete 2nd Edition" qui m'apparut alors comme une révélation :&lt;br /&gt;&lt;blockquote&gt;"Le test logiciel a une efficacité limité quand elle est utilisée seule - le taux moyen de détection d'erreur est seulement de 30 pourcent pour les tests unitaires, 35 pourcents pour les tests d'intégration et 35 pourcents pour des beta-tests de petits volumes. Par contre, &lt;span style="font-weight: bold;"&gt;l'efficacité des inspections de la conception et du code est de 55 et 60 pourcents&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;(Jones, Capers. 1996. "Software Defect-Removal Efficiency," IEEE Computer, April 1996)."  -- Code Complete, 21.1. Overview of Collaborative Development Practices&lt;/span&gt;&lt;/blockquote&gt;L'inspection de code, formelle ou pas, est plus efficace que les tests unitaires et d'intégration. Avec de bonnes &lt;a href="http://jradix.blogspot.com/2008/06/larme-absolue-de-la-qualit-la-checklist.html"&gt;checklists&lt;/a&gt;, il est très intéressant de provoquer des critiques constructives sur chaque aspect d'une architecture et du code correspondant, en commençant par les plus sensibles. De plus, une personne porte beaucoup plus de soins à son code quand il sait que celui-ci va être inspecté par une autre personne. Une fois le squelette d'une architecture revue, il devient moins critique de relire tout le code développé sur celle-ci. Et on peut accélérer le développement comme nous le rappelle &lt;a href="http://www.jwz.org/"&gt;Jamie Zawinski&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;"Les tests unitaires semblent biens en principe. Avec un rythme de développement tranquille, c'est certainement la voie à prendre. Mais quand on regarde de plus près, "nous devons aller de zéro à terminé en six semaines", et bien, je ne peux pas le faire à moins d'enlever quelque chose. Et ce que je vais enlever sont tous les trucs qui ne sont pas absolument critiques. Et les tests unitaires ne sont pas critiques. S'il n'y a pas de tests unitaires, le client ne s'en plaindra pas".&lt;span style="font-style: italic;"&gt; -- &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.amazon.com/gp/product/1430219483"&gt;Coders at Work&lt;/a&gt;&lt;/blockquote&gt;Quand les délais de livraison sont très courts par rapport à l'ampleur du code à développer, le ratio nombre de fonctionnalités sur le temps devient tel que le respect des délais est entièrement déterminé par la rapidité de frappe des développeurs sur leur clavier.&lt;br /&gt;&lt;br /&gt;Et dans ce cas là, s'il n'y a pas de temps pour faire des tests unitaires, autant avoir des codeurs expérimentés codant juste du premier coup, ou sachant trouver la source de n'importe quel problème en un temps fini. Mais quand on en est à ce niveau, c'est qu'on n'est pas sure d'avoir du boulot si le logiciel à produire ne sort pas à la date cible.&lt;br /&gt;&lt;br /&gt;Il peut être raisonnable de choisir de coder des solutions "Quick &amp;amp; Dirty" dans une première phase pour pouvoir respecter les délais tout en sachant qu'on contracte une &lt;a href="http://jradix.blogspot.com/2008/06/dette-technique-technical-debt.html"&gt;dette technique&lt;/a&gt; importante qu'il faudra un jour payer dans une prochaine release sous peine de voir le logiciel se scléroser complètement.&lt;br /&gt;&lt;br /&gt;Mais quel projet informatique, une fois parti sur le chemin séduisant du "quick &amp;amp; dirty" est prêt à payer sa dette pour revenir à un système "sain" de corps (le code) et d'esprit (la conception) ? Tant que le paiement des intérêts de la dette technique permette de continuer à développer de nouvelles fonctionnalités dans les temps impartis, qui se soucie de rembourser la dette ? s'il n'y a aucun intérêt business de nettoyer le code et l'architecture, mieux vaux continuer à coder comme avant.&lt;br /&gt;&lt;br /&gt;J'ai rarement vu une maintenance d'un logiciel prenant régulièrement du temps sur chaque release pour corriger/mettre au propre des parties du code. J'ai toujours vu des applications devenir de grosses machines à gaz et être à terme refondue entièrement (la dette technique de l'application disparaît alors complètement). C'est peut-être malheureux à dire, mais c'est la sombre réalité du monde de l'informatique : la plupart des applications sur lesquelles nous sommes amenés à intervenir ont une énorme dette technique, et on a rarement l'espoir de voir s'améliorer une application sans que celle-ci soit entièrement refondue.&lt;br /&gt;&lt;br /&gt;Il faut s'y faire, et autant apprendre à coder juste et de façon défensive dès le premier coup.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-5844732759598048089?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/5844732759598048089/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=5844732759598048089' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5844732759598048089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5844732759598048089'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/09/efficacite-des-tests-unitaires.html' title='Efficacité des tests unitaires'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4388520336370751941</id><published>2009-09-17T08:00:00.000-07:00</published><updated>2011-01-26T02:19:25.585-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inadaptation d’impédance objet-relationel'/><title type='text'>Inadaptation d’impédance objet-relationel : plus qu'une inadaptation, une incompréhension</title><content type='html'>Cet été 2009, &lt;a href="http://tkyte.blogspot.com/"&gt;Thomas Kyte&lt;/a&gt;, expert développement sous Oracle bien connu, s’est largement étendu sur son site &lt;a href="http://asktom.oracle.com/"&gt;AskTom&lt;/a&gt; de questions/réponses, sur l’inadaptation d’impédance objet-relationel (&lt;a href="http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch"&gt;object-relational impedance mismatch&lt;/a&gt;). Sur un ton direct et tranchant, il nous délivre &lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1858995900346985943"&gt;son point de vue sur la place des « applications »&lt;/a&gt; notamment Java EE et de leurs rôles dans la gestion des données. Il fini par énoncer cette règle à suivre absolument :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Ne laissez aucun développeur qui code en Java, Visual Basic, C et autres langages de ce genre, écrire du code contenant SELECT, INSERT, UPDATE, DELETE ou MERGE dedans&lt;/span&gt;. Donnez leur accès à une série de procédures stockées qui retournent les données dont ils ont besoin, ou qui traitent les transactions nécessaires au système lui-même.&lt;br /&gt;&lt;/blockquote&gt;Assez radical il est vrai, Tom ne considère les applications au dessus des bases de données que comme de simples interfaces homme-machine (en gros, de simples JSP ou pages PHP suffisent pour faire interagir un client avec le serveur de données). Pour lui, autant ne pas donner aux applications un accès direct aux tables, au modèle de données parce que les applications vont et viennent rapidement mais les données,… &lt;a href="http://97-things.near-time.net/wiki/database-as-a-fortress"&gt;&lt;span&gt;les données vivent pour toujours !&lt;/span&gt;&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;… je peux à la rigueur mettre tout le SQL dans la base de données au lieu que dans du XML, ce n’est ni un gros problème pour moi ni un gros gain d’un côté technique…&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cela m’indique (« ni un gros gain ») que vous n’avez pas fait de bases de données depuis longtemps. Votre application – la chose pour laquelle vous vous concentrez aujourd’hui en 2009 – elle n’existera plus vers 2013. Mais la donnée, elle, sera toujours là. Et si vous avez caché tout ce qui concerne les données dans votre application obsolète écrite dans un langage mort, avec des frameworks que personne ne considère plus utiliser (rappelez-vous, c’est 2013, plus 2009 maintenant) – vous nous forcerez à l’en arracher entièrement et à le recommencer.&lt;br /&gt;&lt;/blockquote&gt;Le reste des réponses de Tom est du même acabit. C’est comme si le monde était séparé en deux : les programmeurs sur framework et les programmeurs sur base de données. En entreprise, la plupart des applications existent pour gérer l’information, gérer des données. Les traitements associés sont rarement compliqués et ne font jamais appel à des experts en algorithmie.&lt;br /&gt;&lt;br /&gt;Dans quel cas a-t-on réellement besoin d'&lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping#Pros_and_cons"&gt;une machine à gaz ORM&lt;/a&gt; ? Quels sont les clients qui analysent leur métier en termes d’objets ? Parmi ces clients, quels sont ceux qui comprennent toutes les notions, aspects et pièges de l’orienté-objet ?&lt;br /&gt;&lt;br /&gt;J’ai rencontré il y a quelques temps, en 2007, un client pour lequel j’ai du réaliser un audit de sécurité sur son application Java. Quand arrive le moment de lire le code source de l’application (qui date de 2002), un effroi (les englishs diraient, « &lt;a href="http://thedailywtf.com/"&gt;WTF&lt;/a&gt; » à ce moment là) m’envahi quand je réalisai que ce qui avait été codé était &lt;span style="font-weight: bold;"&gt;un véritable serveur d’application complet codé à la main, spécifiquement pour ce client !&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ah, les développeurs s’en étaient donné à cœur joie pour créer cette majestueuse machine à gaz, capable de gérer des composants aussi complexes que des EJB 1.0, inmaintenables et inmaintenu actuellement, puisque plus personne n’a plus le temps de se pencher sur son fonctionnement, les développeurs initiaux ayant changés au moins 3 fois de société de service entre temps. Et puis, ce n’est pas un simple serveur d’application minimaliste qui a été codé, mais un énorme tas de technologies du moment comme par exemple, CORBA et IIOP qui étaient en vogue au moment du développement de cette application.&lt;br /&gt;&lt;br /&gt;J’aurais pu me dire que tout cela était nécessaire à l’époque, notamment pour supporter une charge importante, des changements de configuration fréquents, un clustering, de la réplication de sessions, de l’intégration d’autres systèmes… Que nenni ! Toute cette machinerie ne sert qu’à gérer une cinquantaine de tables dans une base oracle et ne fait qu’1 ou 2 appels vers des WebServices, 1 intégration avec un LDAP… et puis c’est tout !&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.despair.com/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 335px;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SqVmDseS83I/AAAAAAAAASU/cUlUYNJj_-w/s400/conformity.png" alt="" id="BLOGGER_PHOTO_ID_5378817543627797362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Autant dire que tout ce code Java ne sert strictement à rien !&lt;/span&gt; Et coûte énormément à maintenir… Une simple application générée par « &lt;a href="http://www.oracle.com/technology/products/database/application_express/"&gt;Oracle Application Express&lt;/a&gt; » aurait suffit. Je vous passe les autres détails de l’architecture de cette application, qui révèle bien que le client n’a pas du tout investi sur sa base de données mais uniquement sur des programmes en Java… Pour quelle raison ? J’ai beau tourner maintes et maintes fois la question dans ma tête je ne vois pas de raison logique à tout ça. C’est certainement une question de mode du moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4388520336370751941?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4388520336370751941/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4388520336370751941' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4388520336370751941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4388520336370751941'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/09/inadaptation-dimpedance-objet.html' title='Inadaptation d’impédance objet-relationel : plus qu&apos;une inadaptation, une incompréhension'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dJYBJhDg2Hk/SqVmDseS83I/AAAAAAAAASU/cUlUYNJj_-w/s72-c/conformity.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1257417829611579104</id><published>2009-09-10T08:00:00.000-07:00</published><updated>2011-01-26T02:23:04.950-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modèles'/><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><title type='text'>Template, Modèle de Construction, Code Snippet : une réutilisation nécessaire</title><content type='html'>Quelle est la plus importante habitude à prendre dans sa carrière d’informaticien ? On passe souvent des heures voire des jours à faire fonctionner un morceau de code, et on apprend toujours beaucoup de choses pendant ce processus de conception. La conception a cela de &lt;a href="http://en.wikipedia.org/wiki/Wicked_problem"&gt;pervers&lt;/a&gt; qu’&lt;span style="font-weight: bold;"&gt;on ne connaît la bonne solution qu’une fois qu’on la conçue&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ainsi, la conception est toujours un processus assez long et périlleux, il est donc plus que nécessaire de capitaliser sur ses expériences et les expériences des autres. La meilleure application étant celle pour laquelle on n’a à développer aucune ligne de code,  la capitalisation qu’on entend ici est donc &lt;span style="font-weight: bold;"&gt;la constitution d’un ensemble de « modèles » (&lt;/span&gt;&lt;a style="font-style: italic; font-weight: bold;" href="http://en.wikipedia.org/wiki/Template_%28software_engineering%29"&gt;templates&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;) ou « d’extrait de code » (&lt;/span&gt;&lt;a style="font-style: italic; font-weight: bold;" href="http://en.wikipedia.org/wiki/Snippet_%28programming%29"&gt;code snippet&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;) configurables, personnalisables et extensibles à souhait.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quand on y pense, même pour des applications simples à concevoir comme des sites Web au dessus d’une base de données, il y a tellement d’exigences et de contraintes à prendre en compte (comme par exemple, la disponibilité, la sécurité, les performances…) qu’un cerveau humain n’est pas la plus fiable des machines pour les concevoir. Ne serait-ce que du simple fait qu’un être humain n’est pas constant et oublie vite les détails.&lt;br /&gt;&lt;br /&gt;Ce qui motive le plus un informaticien à faire de la conception c’est l’objectif de ne jamais avoir à recoder deux fois la même chose, ou, mieux encore, ne jamais recoder deux choses similaires. Le copier/coller de code à la main (pratique la plus répandue dans notre profession, bien plus que l’exercice de réflexion) est à généraliser dans le cadre de la construction. Les « templates » permettent de générer des milliers de lignes de code et ce, sans l’introduction de bug si votre modèle est parfait.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://gadgetvice.com/2009/04/24/que-donnent-un-photocopieur-et-un-reflex-numerique-coupes-en-2/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/Sp7svamiM-I/AAAAAAAAASM/T495d68_EAw/s400/photocopieur_et_apn_coupe_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5376995304465904610" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Les templates : bien mieux qu'une photocopieuse...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;La programmation orienté modèle (&lt;a href="http://en.wikipedia.org/wiki/Template_Oriented_Programming"&gt;Template-oriented programming&lt;/a&gt;) devient de plus en plus pertinente du fait de la standardisation des solutions et des conceptions sous-jacentes, notamment par l’application des « &lt;a href="http://en.wikipedia.org/wiki/Design_pattern"&gt;modèles de conception&lt;/a&gt; ». A l’instar des modèles de conception, les templates de code pourraient s’appeler des « &lt;span style="font-weight: bold;"&gt;modèles de construction&lt;/span&gt; », puisqu’il s’agit de standardiser/automatiser la construction d’application. Autrement dit, il devient facile de récupérer des applications correctement codées comme, par exemple, les exemples d’application fournis par Spring (situées dans le bundle Spring) ou dans le &lt;a href="https://glassfish-samples.dev.java.net/"&gt;Java EE SDK&lt;/a&gt;, d’en créer des modèles de code et d’automatiser la création d’application standard en fonction d’un modèle conceptuel des données et des traitements.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La meilleure pratique à s’imposer dès son plus jeune âge dans le métier est donc la transformation de code s’exécutant (« &lt;span style="font-style: italic;"&gt;running code&lt;/span&gt; ») en code réutilisable pour d’autres projets&lt;/span&gt;. Personnellement, je me suis construit une petite application Web pour recueillir tous mes templates, et me permettre de générer du code en fonctions de configurations et de modélisation des informations à gérer. Mais ce genre d’outil se retrouve dans pratiquement tous les IDE dignes de ce nom par exemple Visual Studio, Eclipse, Emacs (avec aussi les abbrevs par exemple) ou dans d’autres outils innombrables (par exemple &lt;a href="http://www.codesmithtools.com/"&gt;CodeSmith&lt;/a&gt;) …&lt;br /&gt;&lt;br /&gt;J’essaie de passer du temps en fin de projet pour réutiliser de tout code qui a été programmé à la main. Comparez le temps nécessaire pour transformer du code en template et le temps que l’on peut gagner quand on va générer des applications avec ces nouveaux templates, et vis-à-vis du nombre de fois qu’on va générer ce code. On y gagne dans la plupart des cas. Il faut bien sur, faire attention à &lt;a href="http://jradix.blogspot.com/2009/01/proprit-intellectuelle-et-dveloppement.html"&gt;la licence associée au code source&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Qu’est-ce qui sépare un développeur d’un développeur expérimenté ? Le nombre de « modèles de construction » à sa disposition et sa capacité à &lt;a href="http://en.wikipedia.org/wiki/Automatic_programming"&gt;programmer automatiquement&lt;/a&gt;. Faire soi-même un système de génération de code source ou d’application complète permet de maîtriser ce que l’on génère pour mieux en connaître les limites.&lt;br /&gt;&lt;br /&gt;Qu’est-ce qui sépare un développeur expérimenté d’un guru respectable et respectée ? Le guru fait de la génération de code qui génère du code qui génère du code… &lt;span style="font-weight: bold;"&gt;Il fait de la production de modèle de construction, un processus récursif&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;On peut extraire des modèles à partir de ses expériences sur des projets, mais on peut tout autant tirer parti des expériences des autres, à partir des exemples donnés dans les livres techniques. Toute lecture d’un livre doit s’accompagner d’un enrichissement de son système de génération de code. A chaque fois que je crée un modèle, je me demande « qu’est-ce qui peut être différencié dans ce code : qu’est-ce qui peut être demandé par un client, qu’est-ce qui est du ressort de l’implémentation uniquement ».&lt;br /&gt;&lt;br /&gt;Les templates peuvent être utilisés pour autre chose que la génération de code comme par exemple :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;générer automatiquement de la documentation (avec des formats de fichier sous format texte comme le RTF, XML par exemple)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;générer automatiquement de la configuration de middleware comme la configuration d’Apache httpd ou tomcat, ou la configuration de progiciels…&lt;/li&gt;&lt;/ul&gt;Le domaine d’application de la génération de fichier est sans limites… Un système de gestion de templates peut servir aussi à se souvenir de l’ensemble des paramètres à saisir, l’ensemble de questions à se poser, comme une &lt;a href="http://jradix.blogspot.com/2008/06/larme-absolue-de-la-qualit-la-checklist.html"&gt;checklist&lt;/a&gt; ce qui permet de ne rien oublier.&lt;br /&gt;&lt;br /&gt;A chaque fois que je code quelque chose j’essaie de me poser la question : &lt;span style="font-weight: bold;"&gt;est-ce que je serai capable de reproduire ce code dans 5 ans sans réfléchir ?&lt;/span&gt; Pour être sur de pouvoir ressortir ce code plusieurs années après, je le transforme en template et mon système doit permettre de générer du code qui s’exécute sans problème ou doit fournir des instructions suffisamment claires pour l’intégrer ou l’exécuter.&lt;br /&gt;&lt;br /&gt;Et après ça, je peux oublier ce bout de code et dormir sur mes deux oreilles…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1257417829611579104?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1257417829611579104/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1257417829611579104' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1257417829611579104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1257417829611579104'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/09/template-modele-de-construction-code.html' title='Template, Modèle de Construction, Code Snippet : une réutilisation nécessaire'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dJYBJhDg2Hk/Sp7svamiM-I/AAAAAAAAASM/T495d68_EAw/s72-c/photocopieur_et_apn_coupe_01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-7310364486960649438</id><published>2009-09-03T08:00:00.000-07:00</published><updated>2011-01-26T02:23:39.714-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='orienté objet'/><title type='text'>L'orienté objet : plus qu'un cache misère</title><content type='html'>Quels sont les caractéristiques principales d'un programme écrit par un néophyte ? des noms de variables incompréhensibles ? aucune organisation du code ? La pire, et malheureusement la plus fréquente, car inhérente à l'incompréhension de la notion d'abstraction, c'est &lt;span style="font-weight: bold;"&gt;l'utilisation généralisée de variables globales&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;L'emploie de variables globales, faut-il le rappeler, est considéré comme une mauvaise pratique, du fait même de sa "non-localité" : une variable globale peut être modifiée de n'importe où (sans même parler de sa &lt;a href="http://jradix.blogspot.com/2009/02/systeme-embarque-et-programmation.html"&gt;volatilité&lt;/a&gt;), et n'importe quelle partie d'un programme peut en être dépendante. Cela rend donc le programme inmaintenable à partir d'une certaine taille.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://texgraph.forumpro.fr/geometrie-du-plan-f8/pavage-hyperbolique-du-demi-plan-de-poincare-t220.htm"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 381px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SowBL4s9HxI/AAAAAAAAASE/hNlLZkQp8HY/s400/pavage12.png" alt="" id="BLOGGER_PHOTO_ID_5371669759257288466" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Vulgaire pédanterie d'un béotien en mathématique : l'emploi de variables globales et les dépendances qu'il instille entre  toutes les parties d'un programme me fait penser visuellement à un &lt;a href="http://texgraph.forumpro.fr/geometrie-du-plan-f8/pavage-hyperbolique-du-demi-plan-de-poincare-t220.htm"&gt;pavage hyperbolique du disque de Poincaré&lt;/a&gt;. Il montre bien que toute chose est dépendante d'une autre et change de couleur aux croisements des autres dépendances.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;L'orienté-objet force à l'abstraction mais n'empêche pas les variables globales de proliférer. Au delà d'éléments globaux d'une application, l'emploie de variables globales s'est immiscé subrepticement au cœur des classes d'objet, et le paradigme Orienté-Objet en a fait son beurre.&lt;br /&gt;&lt;br /&gt;On pourrait même croire que, suite à la reconnaissance, par toute la communauté des programmeurs, de l'emploie de variables globales comme mauvaise pratique, des êtres mal intentionnés auraient inventés un paradigme leur permettant de &lt;span style="font-weight: bold;"&gt;programmer localement avec des variables globales&lt;/span&gt;, de restreindre, en fait, les variables globales à quelques fonctions.&lt;br /&gt;&lt;br /&gt;L'orienté-objet n'est qu'une manière déguisée de programmer en utilisant des variables globales. Il pousse (mais n'oblige pas) à s'intéresser aux invariants de classe et d'objet, de savoir, en fait, gérer des variables globales pour qu'elles ne posent aucun problème lors de l'appel des méthodes.&lt;br /&gt;&lt;br /&gt;Nombreux ont été les échecs quant à la préservation de l'intégrité des données d'une classe vis à vis de ses méthodes. Il est apparu, avec le temps, des principes de construction d'une classe, qui permettent de mettre de l'ordre dans la gestion de ces variables globales, locale à un objet ou à une classe d'objet. Ces &lt;a href="http://www.objectmentor.com/omSolutions/oops_what.html"&gt;principes&lt;/a&gt; ont été clairement exprimés par Robert C. Martin dans ses livres et sur &lt;a href="http://www.objectmentor.com/omSolutions/oops_what.html"&gt;le site Web de sa société Object Mentor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Les principes de conception de classes orientée-objet sont regroupés au travers de la mnémonique &lt;span style="font-weight: bold;"&gt;SOLID&lt;/span&gt;, et permettent ainsi de surpasser la difficulté de maintenir des données globales dans un objet :&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;S&lt;/span&gt; : Single Responsability Principle (SRP) : There should never be more than one reason for a class to change.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;O&lt;/span&gt; : Open-Closed Principle (OCP) : A module should be open for extension but closed for modification.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;L&lt;/span&gt; : Liskov Principle (LSP) : Subclasses should be substitutable for their base classes&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;I&lt;/span&gt; : Interface Segregation Principle (ISP) : Many client specific interfaces are better than one general purpose interface&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;D&lt;/span&gt; : Dependency Inversion Principle (DIP) : Depend upon Abstractions. Do not depend upon concretions.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;a href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin"&gt;Robert C. Martin&lt;/a&gt; énonce aussi des principes d'architecture des modules (packages) très intéressants qui permettent de mieux gérer les dépendances des modules entre eux à fin de tenir la plus grande promesse de l'orienté objet : la réutilisabilité.&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt; Release Reuse Equivalency Principle (REP)&lt;/li&gt;&lt;li&gt;Common Closure Principle (CCP)&lt;/li&gt;&lt;li&gt; Common Reuse Principle (CRP)&lt;/li&gt;&lt;li&gt; Acyclic Dependencies Principle (ADP)&lt;/li&gt;&lt;li&gt; Stable Dependencies Principle (SDP)&lt;/li&gt;&lt;li&gt; Stable Abstractions Principle (SAP)&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;Ces principes sont tout aussi importants que ceux relevant de la conception de classes, et &lt;a href="http://en.wikipedia.org/wiki/Software_package_metrics"&gt;des outils&lt;/a&gt; permettent de vérifier de façon automatique dans la plupart des cas, qu'on ne les enfreint pas. C'est le cas de &lt;a href="http://www.clarkware.com/software/JDepend.html"&gt;JDepend&lt;/a&gt; dans le monde Java, &lt;a href="http://www.ndepend.com/"&gt;NDepend&lt;/a&gt; pour le monde .NET, &lt;a href="http://pdepend.org/"&gt;PHP Depend&lt;/a&gt;, &lt;a href="http://search.cpan.org/%7Etimb/Module-Dependency-1.86/"&gt;Module::Dependency&lt;/a&gt; pour Perl...&lt;br /&gt;&lt;br /&gt;C'est bien le genre de métrique qu'on a envi, en tant que chef de projet, de mettre dans les 'hooks' de subversion et de bloquer tout commit qui ne les satisferait pas. Quand on a la responsabilité d'un projet pour lequel on vous a affecté sans possibilité de discuter, des débutants, on croit toujours pouvoir être Big Brother et scruter le moindre faits et gestes des développeurs, en leur mettant par exemple, comme dans les sous-doués passe le bac, une bonne décharge électrique à chaque fois qu'ils essaient de commiter du code pas convenable.&lt;br /&gt;&lt;br /&gt;Le problème c'est que tout ces principes ne sont pas toujours mis en œuvre dans les modules et librairies de base des langages comme Java notamment (par exemple, la fameuse classe Date qui au fur et à mesure des versions de java s'est vue refondre entièrement sans jamais atteindre une bonne implémentation, des fous sont même allez jusqu'à déposer un &lt;a href="http://www.freshpatents.com/Java-date-class-objects-dt20080724ptan20080177784.php?type=description"&gt;brevet logiciel pour refondre cette classe&lt;/a&gt;. La description du brevet est instructive sur les limites de la classe Date)&lt;br /&gt;&lt;br /&gt;Ceci dit, une orientation objet bien maîtrisée peut aboutir aux nobles objectifs qu'elles s'était fixés dans la mesure où l'on sait que l'on joue avec le feu des variables globales.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-7310364486960649438?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/7310364486960649438/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=7310364486960649438' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7310364486960649438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7310364486960649438'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/09/loriente-objet-plus-quun-cache-misere.html' title='L&apos;orienté objet : plus qu&apos;un cache misère'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SowBL4s9HxI/AAAAAAAAASE/hNlLZkQp8HY/s72-c/pavage12.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1936416707253966095</id><published>2009-08-27T08:00:00.000-07:00</published><updated>2011-01-26T02:24:23.200-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='méthodes'/><title type='text'>De l'agilité des légos et des logiciels afférents</title><content type='html'>Il faut bien avouer cette sombre évidence : &lt;span style="font-weight: bold;"&gt;un informaticien cherche toujours à ramener son travail à un jeu de légo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://googlified.com/doodle-50-years-of-lego/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SoSGjROTkGI/AAAAAAAAAR0/J6kHko2E_5w/s400/google-lego-calendar.jpg" alt="" id="BLOGGER_PHOTO_ID_5369564596209422434" border="0" /&gt;&lt;/a&gt;Loin d'être un &lt;a href="http://fr.wikipedia.org/wiki/Trouble_obsessionnel_compulsif"&gt;trouble obsessionnel compulsif&lt;/a&gt;, il lui semble que le monde devrait être plus simple, et devrait normalement se soumettre à la réduction induite par la modélisation.&lt;br /&gt;&lt;br /&gt;Si la construction d'application s'apparentait à des Légos &lt;a href="http://www.infoq.com/presentations/OSGi-for-Application-Developers-Neil-Bartlett"&gt;comme le sous-entend OSGi&lt;/a&gt;, on n'aurait pas besoin de développeur, il suffirait d'emboîter des composants les uns dans les autres. Or, l'innovation d'une application n'est pas là. Vous pouvez faire de très belles constructions en légo, mais l'utilité de celles-ci restera à démontrer par l'expérience. Le simple rapprochement de fonctionnalités dans une combinaison originale peut s'avérer intéressante dans certains cas, et toute une profession s'en contente largement en attendant la prochaine véritable innovation.&lt;br /&gt;&lt;br /&gt;Au delà de la réduction à un jeu de légo, nombreux sont ceux qui cherchent à insuffler une marque de sérieux à une activité dénigrée dès qu'on prononce son nom : la programmation. Le mot programmation est connoté négativement par tous les professionnels et clients du secteur informatique. Ce terme ramène trop à la base de l'activité, au travail le plus bas niveau et pourtant le seul qui produise de la valeur réelle : la création d'un programme en vue de le faire exécuter par l'automate informatique. Pour cacher la dure réalité d'&lt;a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html"&gt;une profession de tapeur à la machine&lt;/a&gt;, nombre d'informaticiens ou pseudo-informaticiens se vêtissent d'un &lt;a href="http://jradix.blogspot.com/2008/09/jargon-effets-de-mode-et-confusions.html"&gt;jargon&lt;/a&gt; sans cesse renouvelé pour mieux périmer les vieux termes et ceux qui les utilisent encore.&lt;br /&gt;&lt;br /&gt;Aujourd'hui, seules les méthodes "agiles" sont considérées comme crédibles. &lt;span style="font-weight: bold;"&gt;Une pratique de développement logiciel qui ne s'apparente pas au mouvement "Agile" est à priori suspecte&lt;/span&gt;. L'ajout d'un adjectif comme agile à des noms déjà vagues, prête souvent à confusion, car cela pousse à croire que les objets en questions sont relatifs. Cela s'apparente au relativisme ambiant : le relativisme culturel que des intégristes religieux cherchent à promouvoir pour justifier leurs agissements dans certaines contrées, ou comme dernièrement, le Président de la République Française  avec sa "Laïcité positive" (sous entendu, il existe une laïcité  négative). Une méthode agile exclue toutes les autres et les ramène au rang de méthodes forcément non-agiles, donc lourdes, dépassées, ...&lt;br /&gt;&lt;br /&gt;Hep, Hep, toi qui veux être dans le coup, sache que "Agile" est maintenant un terme dépassé, il faut parler de &lt;a href="http://arxta.net/"&gt;ARxTA&lt;/a&gt; ... "Agile", comme tout &lt;a href="http://lexicom.free.fr/"&gt;terme-réclame&lt;/a&gt; est utile aux professionnels, tant pour les clients que pour les fournisseurs de solutions. Cela permet de rapprocher des points vus autour de mots clés clairement identifiés, ce qui créé une sorte de communauté avec ses codes, son jargon, ses pratiques, techniques et traditions : une véritable culture en sorte.&lt;br /&gt;&lt;br /&gt;Au delà de ces mouvements passionnés, des individualités surgissent, émergent, montre les nouvelles cimes à atteindre par leurs actions au jour le jour. Il est toujours étonnant de voir que malgré les énormes entreprises commerciales aux bénéfices records (même en ces temps de crise), &lt;span style="font-weight: bold;"&gt;de simples individus arrivent à imposer leurs créations comme autant de nouvelles évidences pour la profession&lt;/span&gt;. C'est pourtant dans de petits bureaux, dans de non moins petites salles IRC de discussions que se forgent les technologies de demain. Une startup sait qu'elle est sur la bonne voie quand elle peut produire son application sans recours à des fonds extérieurs, ces fonds ne servant qu'à accélérer plus ou moins un &lt;a href="http://www.paulgraham.com/startupmistakes.html"&gt;mouvement incessant et irréductible&lt;/a&gt;, dirigé vers la réussite.&lt;br /&gt;&lt;br /&gt;Pour illustrer la capacité d'un individu à produire de petites merveilles, j'ai pensé vous faire profiter de la voix cristalline de &lt;a href="http://fr.wikipedia.org/wiki/Imogen_Heap"&gt;Imogen Heap&lt;/a&gt; qui, aidé par un &lt;a href="http://en.wikipedia.org/wiki/Timeline_of_Apple_Macintosh_models"&gt;MacBook&lt;/a&gt; il est vrai, arrive, à elle seule, à oindre de saintes notes de ses propres mains dans nos &lt;span class="stab2"&gt;esgourdes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/25VGdNU3nrU&amp;amp;hl=fr&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/25VGdNU3nrU&amp;amp;hl=fr&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Non, on a beau dire que la perfection n'est pas de ce monde, mais &lt;a href="http://jradix.blogspot.com/2008/08/le-chemin-bien-sinueux-de-lexcellence.html"&gt;le chemin de l'excellence&lt;/a&gt; cherche à nous y mener en tout cas, chaque jour nous ramenant à la dure réalité et à notre propre dépouillement face à la grandeur des exigences et contraintes de nos applications. Ce n'est pas ce qu'on appelle le &lt;a href="http://fr.wikipedia.org/wiki/Sisyphe"&gt;mythe de Sisyphe&lt;/a&gt; ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1936416707253966095?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1936416707253966095/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1936416707253966095' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1936416707253966095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1936416707253966095'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/08/de-lagilite-des-legos-et-des-logiciels.html' title='De l&apos;agilité des légos et des logiciels afférents'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SoSGjROTkGI/AAAAAAAAAR0/J6kHko2E_5w/s72-c/google-lego-calendar.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-8853259934696067239</id><published>2009-08-20T08:00:00.001-07:00</published><updated>2011-01-26T02:24:39.803-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Grippe A (H1N1) : l'avez-vous mise dans les risques de votre projet ?</title><content type='html'>La &lt;a href="http://fr.wikipedia.org/wiki/Grippe_A_%28H1N1%29_de_2009"&gt;grippe A (H1N1)&lt;/a&gt; va (ou est déjà) arriver massivement en France, avec normalement un pic en septembre 2009. Ce n'est pas une grippe qui semble plus grave qu'une autre mais elle a la particularité d'être très contagieuse. Ce qui veut dire qu'&lt;span style="font-weight: bold;"&gt;il y a un risque réel d'avoir 5 % à 15 % des effectifs des projets absent 1 ou 2 semaines un jour ou l'autre pour arrêt maladie&lt;/span&gt;. Ce peut être aussi des parents qui s'absentent pour garder leurs enfants car ceux-ci ne peuvent plus être reçus à l'école pour cause de &lt;a href="http://www.lemonde.fr/societe/article/2009/08/18/lutte-contre-la-grippe-a-luc-chatel-veut-rassurer-les-familles-avant-la-rentree-scolaire_1229522_3224.html"&gt;grippes trop nombreuse dans leur classe&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fr.wikipedia.org/wiki/Grippe_A_%28H1N1%29_de_2009"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 340px; height: 400px;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/Sov4XEICeRI/AAAAAAAAAR8/aVeqQcIIK1E/s400/H1N1.jpg" alt="" id="BLOGGER_PHOTO_ID_5371660055697586450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En bref, &lt;span style="font-weight: bold;"&gt;la probabilité d'avoir des ressources en moins sur les projets est très fort&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;e&lt;/span&gt; et doit normalement être prise en compte dans votre suivi des risques, sous peine d'avoir de grosses surprises et d'autant plus grosses déconvenues sur les estimations des délais de livraison.&lt;br /&gt;&lt;br /&gt;Si vous pensez pouvoir arguer que vos retards de livraisons sont dus à la grippe et que votre client ne va pas ciller face à cet argument, bien à votre aise de ne pas suivre ce risque et de laisser aller vos projets tels qu'ils sont aujourd'hui.&lt;br /&gt;&lt;br /&gt;Dans le cas contraire, il est temps de suivre le risque, de se préparer à contrer les absences, ainsi que &lt;span style="font-weight: bold;"&gt;renégocier les modalités de livraison avec vos clients&lt;/span&gt; : vous pouvez toujours tenir vos délais et enlever certaines fonctionnalités de la listes des fonctionnalités obligatoires à livrer (les mettre alors dans la listes des fonctionnalités "si possible").&lt;br /&gt;&lt;br /&gt;En tout cas, il faut être clair avec le client sur ce risque pour éviter toute surprise mal venue.&lt;br /&gt;&lt;br /&gt;Il est toujours inquiétant de voir que dans certaines sociétés, le rythme des projets et des livraisons envisagées n'a pas baissé, voire a même augmenté pour répondre à la crise. Mais c'est prendre un gros risque que d'ignorer ce qui va arriver de façon quasi certaine. &lt;span style="font-weight: bold;"&gt;Le fait qu'on ne maîtrise pas les impacts de la grippe n'est pas une excuse pour ne pas les anticiper&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Que vous soyez chef de projet, directeur de projet ou simple exécutant, pensez à voir l'impact de votre absence ou de l'absence de vos confrères sur les projets sur lesquels vous travaillez. Je serais vous, je ne prendrais pas d'engagement inconsidérés durant la période de cette rentrée 2009. Mais qui prend d'ailleurs d'engagements inconsidérés ? Le tout est de considérer que&lt;span style="font-weight: bold;"&gt; les changements sont inévitables sur les projets&lt;/span&gt;, et il s'agit de &lt;a href="http://jradix.blogspot.com/2008/06/prvision-de-changement-de-besoin.html"&gt;les gérer explicitement&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-8853259934696067239?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/8853259934696067239/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=8853259934696067239' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8853259934696067239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8853259934696067239'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/08/grippe-h1n1-lavez-vous-mise-dans-les.html' title='Grippe A (H1N1) : l&apos;avez-vous mise dans les risques de votre projet ?'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dJYBJhDg2Hk/Sov4XEICeRI/AAAAAAAAAR8/aVeqQcIIK1E/s72-c/H1N1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-6684207537132846535</id><published>2009-08-13T08:00:00.000-07:00</published><updated>2011-01-26T02:24:52.071-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Dates cibles et échéances : compromis comme promis</title><content type='html'>Tout le monde a, un jour, travaillé sur un projet si mal défini ou si maladroitement suivi qu'on a plus qu'une seule envie : quitter le radeau avant qu'il ne coule. Vu la proportion  gigantesque de projets ne respectant ni ses délais, ni son périmètre initial ou ses coûts (&lt;a href="http://net.educause.edu/ir/library/pdf/NCP08083B.pdf"&gt;source&lt;/a&gt;), il est très probable que vous ayez déjà participé à ce genre de fiasco.&lt;br /&gt;&lt;br /&gt;Dans les projets à la dérive, les échéances (deadlines) sont souvent dépassées, faisant éclater des disputes sans fin dans le but de trouver des coupables, mais surtout pas d'essayer de remettre de l'ordre pour la suite du projet.&lt;br /&gt;&lt;br /&gt;Quand ces horribles projets finissent par mourir définitivement (et ça peut prendre beaucoup de temps !), il est toujours intéressant de se pencher dessus à froid, pour essayer de comprendre ce qui n'a pas marché. Ce travail de reflexion à posteriori (les anglosaxons aiment bien utiliser le terme « &lt;a href="http://www.michaelgreer.com/postmortem.htm"&gt;project post-mortem&lt;/a&gt; ») est malheureusement trop rarement effectué, ou seulement de façon incomplète.&lt;br /&gt;&lt;br /&gt;Sur plusieurs de ces projets, on s'aperçoit que les échéances ont été définies avant même d'estimer quoique ce soit sur le projet. De plus, ces dates n'ont jamais été remises en causes pendant toute la durée du projet. Est-ce que ce sont réellement des échéances (deadlines) ou seulement des dates cibles (« target dates ») ? &lt;span style="font-weight: bold;"&gt;Une date cible est bien différente d'une échéance&lt;/span&gt;. C'est ce que décrit clairement &lt;a href="http://www.idinews.com/CHW.html"&gt;Conrad Weisert&lt;/a&gt; dans son article « &lt;a href="http://www.idinews.com/deadline.html"&gt;Les échéances et dates cibles des projets : 5 conseils pour éviter le désastre&lt;/a&gt; » :&lt;br /&gt;&lt;blockquote&gt;La plupart des « échéances » (deadlines) ne sont en fait que des dates cibles. &lt;span style="font-weight: bold;"&gt;La différence réside dans ce qui survient si la date n'est pas respectée&lt;/span&gt; :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;quand une échéance est ratée, il ne reste plus aucun intérêt à compléter l'engagement. Par exemple :&lt;ul&gt;&lt;li&gt;s'inscrire à une compétition&lt;/li&gt;&lt;li&gt;publier le catalogue de Noël prochain&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Quand une date cible est ratée, les conséquences peuvent être aussi désastreuses que pour une échéance, mais vous avez toujours à finir le travail. Si « date cible » semble trop vague pour vous, alors remplacez cette expression par « date de fin » ou « date de livraison ».&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;Encore faut-il gérer correctement la planification d'un projet de développement pour pouvoir définir des dates cibles ou des échéances. Cela nécessite de maîtriser un tant soit peu l'&lt;a href="http://en.wikipedia.org/wiki/Cost_Estimation_in_Software_Engineering"&gt;art délicat de l'estimation&lt;/a&gt; et d'être en mesure d'offrir des preuves de celle-ci.&lt;br /&gt;&lt;br /&gt;Sur &lt;a href="http://www.idinews.com/"&gt;son site&lt;/a&gt;, Conrad revient sur ces notions importantes, en relation avec la gestion de projet et le développement logiciel. &lt;a href="http://www.idinews.com/burdenproof.html"&gt;L'estimation n'est pas qu'une affaire d'expérience&lt;/a&gt;. C'est aussi et surtout le moyen de montrer par « a + b » qu'un projet tiens la route et saura tenir ses délais. Or &lt;span style="font-weight: bold;"&gt;seul celui qui dit que quelque chose peut être fait doit en apporter la preuve&lt;/span&gt;. Un client ou une division Marketing d'une entreprise se doit d'être ambitieux quant à la définition du produit et à ses dates de livraison ou de mise sur le marché. Or ce n'est ni le client ni cette division marketing qui vont prouver qu'on est capable de réaliser ses rêves. C'est au chef de projet (ou au chargé d'affaire dans le cas de sous-traitances de développement) de trouver des solutions qui puissent répondre au mieux aux exigences et contraintes exposées.&lt;br /&gt;&lt;br /&gt;La définition de plan permet d'éclaircir le projet et de notamment exprimer de nouvelles exigences et contraintes liées aux solutions. Ce n'est qu'en face des éléments issues de toutes les parties que l'investisseur (le client, la division marketing...) lance le projet.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jradix.blogspot.com/2008/08/les-affres-de-la-gestion-de-projet-de.html"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 232px; height: 283px;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/Snyot3TIE4I/AAAAAAAAARc/4cCkdooyOMA/s400/compromis.png" alt="" id="BLOGGER_PHOTO_ID_5367350361810539394" border="0" /&gt;&lt;/a&gt;Dans le cadre de la sous-traitance de production (pour le &lt;a href="http://jradix.blogspot.com/2008/08/les-affres-de-la-gestion-de-projet-de.html"&gt;développement logiciel au forfait&lt;/a&gt; par exemple), il est facile pour un chef de projet de se faire imposer des dates cibles du simple fait:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;de la relation contractuelle qui existe entre le client et son cahier de charge d'un côté, et le fournisseur et sa volonté de gagner le contrat de l'autre (souvant « à tout prix »).&lt;/li&gt;&lt;li&gt;de la rédaction de la réponse à l'appel d'offre par une personne (un « chargé d'affaire ») autre que celui qui va mener le projet jusqu'à son terme.&lt;/li&gt;&lt;/ul&gt;Même dans le cas de sous-traitance, &lt;span style="font-weight: bold;"&gt;il est souhaitable que la réponse à l'appel d'offre soit ambitieuse et rédigée par une personne autre que le chef de projet&lt;/span&gt;, car ce dernier a naturellement tendance à voir énormément de risques et à avoir une attitude extrêmement prudente, encore plus s'il n'est pas « intéressé » personnellement (oui, oui, par cette basse chose qu'on appelle « l'argent ») au projet. Mais c'est au final, au chef de projet de ramener tout le monde à la réalité.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-6684207537132846535?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/6684207537132846535/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=6684207537132846535' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6684207537132846535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6684207537132846535'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/08/dates-cibles-et-echeances-compromis.html' title='Dates cibles et échéances : compromis comme promis'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/Snyot3TIE4I/AAAAAAAAARc/4cCkdooyOMA/s72-c/compromis.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2787140098838227658</id><published>2009-08-06T08:00:00.000-07:00</published><updated>2011-01-26T02:25:35.003-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='développement web'/><title type='text'>AJAX et Performance : un oxymore</title><content type='html'>N'avez-vous pas l'impression qu'AJAX (Asynchronous Javascript and XML) nous ramène en un temps où les ressources matérielles étaient chères et lentes, où les compilateurs ne savaient rien optimiser et qu'il était difficile de fiabiliser son code ? &lt;span style="font-weight: bold;"&gt;Développer en Ajax, c'est retrouver le bidouillage d'antan, quand il fallait lutter à chaque pas contre les limites du système cible&lt;/span&gt;. Oui, ce satané Javascript qui a plus à voir avec Lisp qu'avec Java, est bien la cause de ce problème. Où plutôt la mise en œuvre de ce langage dans un paradigme (AJAX) créé dans le but unique de palier aux problèmes d'un autre paradigme (le Web) pour obtenir des applications d'un paradigme historiquement éprouvé (le Client-Serveur).&lt;br /&gt;&lt;br /&gt;En effet, les technologies supportant l'AJAX sont plus qu'inefficaces, elles sont inappropriées. &lt;span style="font-weight: bold;"&gt;Les navigateurs Web ne sont pas conçus à la base, pour être des plateformes d'exécution d'application&lt;/span&gt;.&lt;br /&gt;Javascript a été mis en place dans les navigateurs (Netscape Navigator à l'origine) pour palier à l'aspect statique des pages et du protocole orienté document qu'est HTTP.&lt;br /&gt;&lt;br /&gt;Pour que Javascript s'exécute rapidement, il a donc fallu implémenter un interpréteur très simple et ne réalisant que peu d'optimisations. &lt;span style="font-weight: bold;"&gt;On ne retrouve pas en Javascript les optimisations que l'on considère comme évidentes dans n'importe quel autre compilateur&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://video.yahoo.com/watch/4141759/11157560"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 299px;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/Snyb-k-UJXI/AAAAAAAAARU/1UpUR9azT9Q/s400/crockford.png" alt="" id="BLOGGER_PHOTO_ID_5367336355298026866" border="0" /&gt;&lt;/a&gt;Il faut donc coder en Javascript d'une manière spécifique, en connaissance de cause. Cette leçon nous est donnée par &lt;a href="http://www.crockford.com/"&gt;Douglas Crockford&lt;/a&gt; dans sa présentation « &lt;a href="http://video.yahoo.com/watch/4141759/11157560"&gt;Ajax Performance&lt;/a&gt; ». Il nous donne quelques exemples puis exprime la philosophie générale de l'optimisation Ajax : Alors qu'il est logique de penser qu'il faut toujours essayer d'avoir des algorithmes de complexité en O(1), O(log n) plutôt que O(n), O(n&lt;sup&gt;2&lt;/sup&gt;) ou O(e&lt;sup&gt;n&lt;/sup&gt;), &lt;span style="font-weight: bold;"&gt;l'important est d'avoir n le plus petit possible quelque soit la complexité&lt;/span&gt;. Le client Ajax n'est là que pour présenter une vue réduite des données du serveur.&lt;br /&gt;&lt;br /&gt;Ce qui est étonnant c'est l'intitulé de la série de présentation de Douglas qui s'appelle « Javascript : the good parts ». Je comprend bien qu'il veuille prêcher pour sa paroisse, son langage de prédilection, mais heureusement qu'il a un œil critique sur sa technologie fétiche et montre bien qu'il faut aller bien loin pour trouver de « bons côtés » à Javascript. Il a du vouloir attirer tous les zélotes de l'Ajax et du javascript à sa présentation pour mieux leur montrer les limites de leurs croyances. Car &lt;span style="font-weight: bold;"&gt;toute « nouvelle » technologie , s'apparente plus à l'émergence d'une secte qu'à une avancée scientifique majeure&lt;/span&gt;. AJAX n'est plus très nouveau d'ailleurs.&lt;br /&gt;&lt;br /&gt;Heureusement la réalité est toujours là et les « bonnes pratiques » informatiques sont toujours d'actualité même en Javascript. Douglas ne fait que reprendre à raison les principes éprouvés de l'optimisation de code.&lt;br /&gt;&lt;br /&gt;On a beau critiquer Javascript, on peut aussi l'apprécier pour ses aspects qui le différencient tant de Java justement, comme par exemple : l'&lt;a href="http://books.google.com/books?id=VOS6IlCsuU4C&amp;amp;lpg=PP1&amp;amp;dq=javascript%2C%20the%20definitive%20guide&amp;amp;hl=fr&amp;amp;pg=PA150#v=onepage&amp;amp;q=&amp;amp;f=false"&gt;héritage par prototype&lt;/a&gt;, la programmation fonctionnelle que l'on peut en faire, notamment, grâce aux &lt;a href="http://fr.wikipedia.org/wiki/Fonction_d%27ordre_sup%C3%A9rieur"&gt;fonctions d'ordre supérieur&lt;/a&gt;. &lt;span style="font-weight: bold;"&gt;Le Javascript est, de fait, un des langages les plus utilisés aujourd'hui&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ça peut être amusant de faire de l'Ajax (c'est d'ailleurs quelque chose que nombre de développeurs réalisaient il y a de cela déjà bien longtemps, avant même qu'on y mis un nom dessus) mais franchement, aujourd'hui, &lt;span style="font-weight: bold;"&gt;ce qui est le plus productif c'est de ne carrément pas coder du tout&lt;/span&gt; : utiliser des outils pour générer les interfaces graphiques et des applications.&lt;br /&gt;&lt;br /&gt;Qu'on le veuille ou non, le coût d'un développeur français est tellement élevé par rapport à un développeur indien (7 à 10 fois son prix) par exemple qu'il devient complètement improductif de lui demander de développer à la main des applications Ajax.&lt;br /&gt;&lt;br /&gt;En france, à Montpellier, il y a &lt;a href="http://fr.wikipedia.org/wiki/PC_SOFT"&gt;PC SOFT&lt;/a&gt;  (un nom de boîte qu'on imagine sans hésitation sortir des années 80) qui produit &lt;a href="http://www.pcsoft.fr/webdev/"&gt;WEBDEV&lt;/a&gt; dans le même esprit que &lt;a href="http://www.pcsoft.fr/windev/"&gt;WINDEV&lt;/a&gt;. Parmi mes collègues développeurs, rare sont ceux qui préconise de développer avec de tels outils de génération d'application. J'ai l'impression qu'ils disent cela parce que WINDEV est vieux et que tout ce qui est vieux en informatique devient plus ou moins ringard.&lt;br /&gt;&lt;br /&gt;Personnellement, leur nouvel outil WEBDEV semble intéressant pour produire des applications Web / AJAX sans coder quoi que ce soit. Pour la plupart des petites et moyennes applications, c'est largement suffisant car ce sont essentiellement des applications de gestion de l'information. Dans le cas de besoins spécifiques, on peut toujours développer spécifiquement une extension et l'intégrer à l'application.&lt;br /&gt;&lt;br /&gt;Il existe aussi &lt;a href="http://www.oracle.com/technology/products/database/application_express/index.html"&gt;Oracle Application Express&lt;/a&gt; pour la génération automatique d'application au dessus d'une base Oracle sans écrire une seule ligne de code. Ce composant est souvent disponible chez les client qui ont achetés des licences database serveurs, sans qu'ils le sachent vraiment. &lt;span style="font-weight: bold;"&gt;Le client paie cher des technologies dont seulement 10% sont réellement utilisées (et ces 10% se retrouvent souvent aussi bien en Open Source...)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tout cela va dans le sens de &lt;span style="font-weight: bold;"&gt;considérer XML, HTML, CSS et Javascript comme étant du binaire illisible&lt;/span&gt; qu'il s'agit de traiter uniquement via des outils de haut-niveau et des ateliers de génie logiciel (AGL). Seul les développeurs de composants et d'atelier logiciels ont à se pencher sur ces technologies au jour le jour.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2787140098838227658?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2787140098838227658/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2787140098838227658' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2787140098838227658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2787140098838227658'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/08/ajax-et-performance-un-oxymore.html' title='AJAX et Performance : un oxymore'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/Snyb-k-UJXI/AAAAAAAAARU/1UpUR9azT9Q/s72-c/crockford.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-8812988219110126804</id><published>2009-04-15T06:13:00.000-07:00</published><updated>2011-01-26T02:26:15.046-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivité'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Travailler de manière productive</title><content type='html'>Faisant parti d’un grand groupe de &lt;a href="http://jradix.blogspot.com/2009/02/les-telecoms-et-leurs-acronymes.html"&gt;télécommunication&lt;/a&gt;, je suis amené à être en contact avec de nombreux interlocuteurs, pour les divers projets que je mène en parallèle. Par jour je reçois entre 50 et 100 emails nouveaux. Mon travail est asservi par de nombreuses « deadlines », des échéances qu’on ne peut louper sous peine de retarder le projet de 4 à 6 mois.&lt;br /&gt;&lt;br /&gt;Pour gérer un tel flux d’informations, d’actions à entreprendre, et de travail à réaliser, il faut s’organiser. Par la force des choses, j’ai du adapter ma façon de travailler pour rendre les choses maîtrisables et efficace.&lt;br /&gt;&lt;br /&gt;Tout d’abord, mon outil principal, quand je fais de la direction de projet (ou de programmes dans certains cas), c’est mon client email : Outlook en l’occurrence. Par bien des aspects, cet outil peut en énerver plus d’un, mais, par d’autres, il devient indispensable et irremplaçable par d’autres outils du marché (que ça soit opensource ou non).&lt;br /&gt;&lt;br /&gt;Quand mon flux d’email quotidien ne dépassait pas les 20 emails par jours, je triais chaque email reçu en fonction de son projet associé, et du type d’email. Mais quand on en est à plus de 50 emails par jours, &lt;span style="font-weight: bold;"&gt;le tri devient inutile voire constitue une perte de temps certaine&lt;/span&gt;. Quand on se rend compte que la durée de vie d’un email est parfois très courte (quelques minutes) à quoi bon trier.&lt;br /&gt;&lt;br /&gt;La solution : &lt;span style="font-weight: bold;"&gt;ne plus trier ses emails et faire de la recherche full-text&lt;/span&gt; ou par champs dans tout vos emails. Pour ne pas surcharger le serveur d’email, j’archive tous les emails du serveurs qui ont plus d’1 jour. L’archivage consiste à mettre les emails du serveur sur mon disque local dans un répertoire Outlook du même nom : Inbox. Oui, &lt;span style="font-weight: bold;"&gt;tout est dans Inbox, je ne trie plus rien&lt;/span&gt;, à quoi bon perdre du temps quand on peut faire une recherche détaillée sur l’ensemble de ses emails.&lt;br /&gt;&lt;br /&gt;Bien sur, inutile de compter sur l’outil de recherche fulltext de Outlook qui est complètement désuet par rapport à l’ampleur de la tâche : rechercher un email particulier dans une archive contenant plus de 2 ans d’emails (20Go de données) est impossible pour l’outil standard Outlook. Il vous faut un outil de recherche bien plus puissant. Et j’ai trouvé ça avec Lookout, outil maintenant disparu mais que le développeur original de l’outil à &lt;a href="http://www.belshe.com/2007/12/06/how-to-install-lookout-on-outlook-2007/"&gt;montré comment l’installer par soi-même via une petite manip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;J’ai réussi à installer Lookout sur Outlook 2003 sans problème en suivant la procédure. Et maintenant je n’utilise plus que cet outil pour faire de la recherche fulltext. Rendez-vous compte, avec son puissant système d’indexation basé sur Lucene.NET, &lt;span style="font-weight: bold;"&gt;il est capable de me retrouver un email par tous mes emails en moins d’une seconde !&lt;/span&gt; C’est vraiment un outil pratique quand on a gérer des tonnes d’emails. En plus, il permet de faire des recherches compliquées sur les emails, par exemple, selon les valeurs de certains champs (To, From, Subject…)&lt;br /&gt;&lt;br /&gt;Pour s’y retrouver parmi les emails, j’utilise aussi les Flags et les vues. Si je détecte des actions à réaliser lors de la lecture d’un email, je me pose la question : est-ce que l’action prend moins de 2 minutes à réaliser (cf. &lt;a href="http://en.wikipedia.org/wiki/Getting_things_done"&gt;GTD&lt;/a&gt;). Si oui, alors &lt;span style="font-weight: bold;"&gt;je fais l’action tout de suite&lt;/span&gt;, sinon, je flaggue l’email :&lt;br /&gt;&lt;blockquote&gt;o En Rouge : pour une tâche à faire ASAP&lt;br /&gt;&lt;br /&gt;o En Orange : pour une tâche qui peut être remise à plus tard (peut attendre)&lt;br /&gt;&lt;br /&gt;o En Vert : pour une tâche que je dois déléguer&lt;br /&gt;&lt;br /&gt;o En bleu : pour une tâche déléguée pour laquelle j’attends une réponse&lt;br /&gt;&lt;br /&gt;o En violet : pour un email qu’il faut que je lise mais qui peut me prendre du temps&lt;/blockquote&gt;Quand un email nécessite plusieurs tâches, ou si la tâche n’est pas évidente d’après l’email, je crée un nouvel email que je m’envoie et retrouve donc dans mon Inbox. Je luis attribue alors un flag comme décrit ci-dessus. Pour chaque tâche j’essaie de mettre aussi la « Due date », l’échéance à respecter pour finir la tâche.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0142000280"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 297px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/Sc91jqmzgeI/AAAAAAAAAPE/VZDZYnFaC9U/s400/200px-Getting_Things_Done.jpg" alt="" id="BLOGGER_PHOTO_ID_5318598940540764642" border="0" /&gt;&lt;/a&gt;Avec une telle organisation, adaptée de &lt;a href="http://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0142000280"&gt;Getting Things Done&lt;/a&gt; de David Allen, je suis capable de gérer des centaines d’emails par jour tout en « prioritisant » mon travail et permettant ainsi de travailler de long moment sur une seule activité tout en sachant qu’est-ce qu’il me reste à faire après, sans oublier une seule tâche.&lt;br /&gt;&lt;br /&gt;Ce qui est important dans tout ça, c'est de déterminer &lt;span style="font-weight: bold;"&gt;quelles sont les tâches qui ont vraiment de l'importance&lt;/span&gt; et celles qui n'en ont pas ou moins. Car faire plein de choses sans importance permet de remplir facilement sa journée de travail, mais n'aboutis à aucune valeur ajoutée.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-8812988219110126804?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/8812988219110126804/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=8812988219110126804' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8812988219110126804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8812988219110126804'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/04/travailler-de-maniere-productive.html' title='Travailler de manière productive'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/Sc91jqmzgeI/AAAAAAAAAPE/VZDZYnFaC9U/s72-c/200px-Getting_Things_Done.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-5724899561033225279</id><published>2009-03-28T08:41:00.000-07:00</published><updated>2011-01-26T02:28:19.614-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo ds'/><title type='text'>Délire paranoïaque de programmation</title><content type='html'>N'avez vous jamais eu envie de contrôler entièrement l'environnement informatique cible de votre programme pour &lt;span style="font-weight: bold;"&gt;être sûr à 100% de ce que vous développez&lt;/span&gt; ? C'est certainement le rêve d'un paranoïaque doublé d'un introverti incapable d'accepter les limites de ce monde (et &lt;a href="http://fr.wikipedia.org/wiki/Parano%C3%AFaque#La_personnalit.C3.A9_sensitive"&gt;de lui-même&lt;/a&gt; par la même occasion). Mais dans le monde en crise qu'est supposé est le notre, avoir l'entière maîtrise d'un monde binaire peut se révéler rassurant pour certains. Même si cette passion est destructrice quand on ne s'ouvre plus sur le reste du monde.&lt;br /&gt;&lt;br /&gt;Le vrai &lt;a href="http://fr.wikipedia.org/wiki/M%C3%A9thode_parano%C3%AFaque-critique"&gt;délire créatif&lt;/a&gt; des paranoïaques que nous sommes, nous les informaticiens, passe par la &lt;span style="font-weight: bold;"&gt;connaissance des fonctionnements les plus bas niveau de la machine&lt;/span&gt;, d'arriver clairement à savoir ce qui se passe en temps réel dans chaque partie de l'ordinateur. Quelle joie alors de programmer pour une console de jeux plutôt que sur un &lt;a href="http://jradix.blogspot.com/2008/07/un-boufficiel-de-plus-le-systme.html"&gt;boufficiel&lt;/a&gt; comme l'est un système d'exploitation commercial. C'est ce que nous rappelle &lt;a href="http://www.coranac.com/"&gt;Jasper Vijn&lt;/a&gt; dans son excellent &lt;a href="http://coranac.com/tonc/text/hardware.htm#sec-specs"&gt;tutoriel pour le développement GBA&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;D'un point de vue programmation, le &lt;a href="http://en.wikipedia.org/wiki/Game_Boy_Advance"&gt;GBA&lt;/a&gt; (ou n'importe quelle autre console) est totalement différent d'un PC. Il n'y a pas de système d'exploitation, pas de pagaille avec des drivers et des incompatibilités avec le matériel. &lt;span style="font-weight: bold;"&gt;Ce sont des bits aussi loin que l'oeil puisse voir.&lt;/span&gt; En fait, les PC ne sont aussi que des bits, mais c'est plusieurs niveaux en dessous. Sur une console, c'est juste vous, le CPU et la mémoire. En gros, c'est le rêve du &lt;a href="http://www.catb.org/%7Eesr/jargon/html/R/Real-Programmer.html"&gt;Vrai Programmeur&lt;/a&gt;.&lt;/blockquote&gt;Quand on en vient au niveau bit, on est confronté à plein de ravissantes choses comme l'&lt;a href="http://en.wikipedia.org/wiki/Application_binary_interface"&gt;ABI&lt;/a&gt; (Application Binary Interface) et plus spécifiquement l'&lt;a href="http://en.wikipedia.org/wiki/Application_binary_interface#EABI"&gt;EABI&lt;/a&gt; ARM pour ce qui est du développement pour GBA ou NDS.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fr.wikipedia.org/wiki/Nintendo_Game_Boy_Advance"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/Sc6bGISGLfI/AAAAAAAAAO8/D5K00aTQRWA/s400/gba-b.gif" alt="" id="BLOGGER_PHOTO_ID_5318358739576040946" border="0" /&gt;&lt;/a&gt;La compréhension de ce qui se passe en dessous du langage de programmation de haut niveau devient nécessaire, si ce n'est obligatoire pour éviter de &lt;a href="http://jradix.blogspot.com/2009/02/systeme-embarque-et-programmation.html"&gt;grosses&lt;/a&gt; &lt;a href="http://coranac.com/tonc/text/first.htm#sec-notes"&gt;bévues&lt;/a&gt;. &lt;span style="font-weight: bold;"&gt;Savoir programmer au niveau assembleur n'est pas forcément inutile quand vous êtes embarqué dans un projet de type Java ou .NET&lt;/span&gt;. Comprendre le bytecode et la JVM peut se révéler utile dans certains cas, notamment pour la maîtrise des performances.&lt;br /&gt;&lt;br /&gt;C'est ce que nous montrais brillamment Peter Haggar dans son livre &lt;a href="http://www.amazon.fr/Mieux-programmer-Java-astuces-optimiser/dp/2212091710"&gt;Mieux programmer en Java&lt;/a&gt; , maintenant épuisé en Français mais qui se trouve encore en version anglaise dans son livre &lt;a href="http://www.amazon.com/Practical-Programming-Addison-Wesley-Professional-Computing/dp/0201616467"&gt;Practical Java Programming Language Guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/Practical-Programming-Addison-Wesley-Professional-Computing/dp/0201616467"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 240px;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/Sc6aqdC6UFI/AAAAAAAAAO0/pDeqOEJ5d10/s400/PeterHaggarBook.jpg" alt="" id="BLOGGER_PHOTO_ID_5318358264113156178" border="0" /&gt;&lt;/a&gt;Il avait organisé son livre en ateliers avec pour chacun, un point particulier d'attention où la solution Java n'est pas aussi simple qu'elle n'y parait. Dans plusieurs de ces ateliers, &lt;span style="font-weight: bold;"&gt;la référence au bytecode produit pour expliquer le pourquoi du comment est inévitable&lt;/span&gt;, comme par exemple l'atelier 40 page 118 : "Utiliser &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/System.html#arraycopy%28java.lang.Object,%20int,%20java.lang.Object,%20int,%20int%29"&gt;System.arrayCopy&lt;/a&gt; pour copier des tableaux".&lt;br /&gt;&lt;br /&gt;On peut s'en apercevoir aussi dans ses articles en ligne comme par exemple &lt;a href="http://www.ibm.com/developerworks/java/library/j-dcl.html"&gt;Double-checked locking and the Singleton pattern&lt;/a&gt; où il y a encore un deassemblage du code pour mieux comprendre ce qui se passe.&lt;br /&gt;&lt;br /&gt;Des particularités de la machine sont à prendre en compte quand on développe si bas, comme par exemple l'&lt;a href="http://en.wikipedia.org/wiki/Data_alignment"&gt;alignement de données et de structures&lt;/a&gt;, l'&lt;a href="http://fr.wikipedia.org/wiki/Endianness"&gt;endianness&lt;/a&gt;, les différentes méthodes de copie de données (tableaux,  copie de structure (le C permet de faire de la copie de structure sans appel de fonction particulière : que se passe-t-il vraiment alors ?) , &lt;a href="http://www.gnu.org/software/hello/manual/libc/Copying-and-Concatenation.html"&gt;copieurs standards&lt;/a&gt; comme &lt;code&gt;memcpy()&lt;/code&gt;, et des &lt;a href="http://nocash.emubase.de/gbatek.htm#biosmemorycopy"&gt;routines spécifiques à GBA  ou NDS&lt;/a&gt; comme &lt;code&gt;CpuFastSet()&lt;/code&gt; et le &lt;a href="http://www.coranac.com/tonc/text/dma.htm"&gt;DMA&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Pour la plupart des applications de gestion de l'information (disons que la règle du &lt;a href="http://fr.wikipedia.org/wiki/Loi_de_Pareto"&gt;80/20&lt;/a&gt; s'applique encore ici), le développeur n'a pas besoin de se soucier de tous ces détails, les langages de haut niveau (je les appellerais plutôt des langages plus abstrait) arrivant bon an, mal an à offrir des performances acceptables dans la plus part des situations les plus courantes. Mais, il y a toujours ce 20% des applications (ou disons les 20% des fonctionnalités des 20% des 80% de toutes les applications ... ) qui sont toujours importantes à maîtriser complètement sous peine de ne pouvoir délivrer le logiciel. Dans ces cas, là, deux choix s'offre à vous, puisque &lt;a href="http://www.ericsink.com/entries/dvcs_dag_1.html"&gt;le monde est toujours divisé en 2&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;- soit tu creuses (tu cherches à comprendre la complexité des ordinateurs et les conséquences de tes paroles en langage de programmation)&lt;br /&gt;&lt;br /&gt;- soit tu tiens un pistolet chargé sur un autre qui creuse (l'autre qui creuse est celui qui va maîtriser le sujet et la machine pour toi... et qui en redemandera encore après çà ;) )&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-5724899561033225279?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/5724899561033225279/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=5724899561033225279' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5724899561033225279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5724899561033225279'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/03/delire-paranoiaque-de-programmation.html' title='Délire paranoïaque de programmation'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/Sc6bGISGLfI/AAAAAAAAAO8/D5K00aTQRWA/s72-c/gba-b.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4193702328527155596</id><published>2009-02-19T08:00:00.000-08:00</published><updated>2011-01-26T02:28:54.304-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sauvegardes'/><category scheme='http://www.blogger.com/atom/ns#' term='BSD'/><title type='text'>OpenBSD et les caractéristiques "par défaut"</title><content type='html'>L'intérêt d'un système d'exploitation comme &lt;a href="http://www.openbsd.org/"&gt;OpenBSD&lt;/a&gt; c'est qu'il ne fait pas de compromis sur plusieurs sujets et ainsi, offre &lt;span style="font-weight: bold;"&gt;des caractéristiques par défaut&lt;/span&gt; sans avoir à réfléchir plus que de dérouler les manuels utilisateurs.&lt;br /&gt;&lt;br /&gt;OpenBSD est &lt;a href="http://www.openbsd.org/security.html"&gt;sécurisé par défaut&lt;/a&gt;, et est mis à jour par défaut tous les 6 mois. Quand on a autre chose à faire que de régler des problèmes d'interopérabilité entre les composants hardware, les composants software ... c'est l'idéal, on peut alors se concentrer sur ce que l'on désire réellement faire.&lt;br /&gt;&lt;br /&gt;Oui, même s'il est toujours intéressant d'installer de configurer et d'optimiser un système d'exploitation, à moins que vous soyez un développeur du système d'exploitation, l'important se trouve ailleurs, dans&lt;span style="font-weight: bold;"&gt; l'utilisation du matériel et du système d'exploitation pour atteindre un but qu'on s'est fixé&lt;/span&gt;. C'est ce que nous rappelle &lt;a href="http://wiki.bsdfrance.fr/doku.php?id=propagande:symbiose_20"&gt;Miod Vallat et Marc Espie dans leur interview à la radio&lt;/a&gt;, dans l'émission &lt;a href="http://www.agendadulibre.org/showevent.php?id=2637"&gt;Symbiose&lt;/a&gt;. On peut toujours aboutir à l'augmentation/amélioration du code de l'OS, mais c'est pas le but en soi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cet aspect "par défaut" serait intéressant à généraliser&lt;/span&gt; à d'autres éléments d'un ordinateur. Je pense notamment, qu'il serait intéressant de pouvoir acquérir des PC &lt;span style="font-weight: bold;"&gt;sauvegardé "par défaut"&lt;/span&gt; avec un système de backup matériel et logiciel correctement configuré par défaut pour ne plus avoir à se soucier de ce sujet.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.apple.com/fr/macosx/features/timemachine.html"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 327px; height: 248px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SZ5MQoToPPI/AAAAAAAAAOk/NiQtTont1qg/s400/timemachine_backuphd20071016.png" alt="" id="BLOGGER_PHOTO_ID_5304761259670387954" border="0" /&gt;&lt;/a&gt;Au moins pour les ordinateurs personnels. Notamment avoir des ordinateurs portable dont les données sont cryptées et sauvegardées par défaut. C'est rarement fait par défaut, il y a toujours une &lt;a href="http://support.apple.com/kb/HT1553"&gt;procédure longue et fastidieuse&lt;/a&gt; (mais c'est parce que ce n'est pas un sujet simple).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4193702328527155596?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4193702328527155596/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4193702328527155596' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4193702328527155596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4193702328527155596'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/02/openbsd-et-les-caracteristiques-par.html' title='OpenBSD et les caractéristiques &quot;par défaut&quot;'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SZ5MQoToPPI/AAAAAAAAAOk/NiQtTont1qg/s72-c/timemachine_backuphd20071016.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2305113642486493480</id><published>2009-02-12T08:00:00.000-08:00</published><updated>2011-01-26T02:29:33.817-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='homebrew'/><category scheme='http://www.blogger.com/atom/ns#' term='embarqué'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo ds'/><title type='text'>Système embarqué et programmation Nintendo DS</title><content type='html'>M’étant épris de la nintendo DS, je me suis mis à expérimenter &lt;a href="http://jradix.blogspot.com/2008/09/nintendo-ds-hombrews-et-mgadmos.html"&gt;un développement pour cette merveille de raffinement technologique&lt;/a&gt;. Quand on étudie l’architecture de cette machine, on ne peut s’empêcher de penser que &lt;span style="font-weight: bold;"&gt;ses concepteurs ont pris du plaisir à la concevoir&lt;/span&gt;. En voyant la représentation de l’architecture ci-dessous, cela m’a tout de suite rappelé celle de l’&lt;a href="http://fr.wikipedia.org/wiki/Amiga"&gt;Amiga&lt;/a&gt; qui tirait plus sa force de &lt;a href="http://en.wikipedia.org/wiki/Amiga_Original_chipset"&gt;son chipset original&lt;/a&gt; que de son processeur proprement dit :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dev-scene.com/NDS/Tutorials_Day_2"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 296px; height: 400px;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SYC8f8DuQeI/AAAAAAAAAOU/9nTWURea7fA/s400/Dov_DS_MemoryMap.png" alt="" id="BLOGGER_PHOTO_ID_5296440418671411682" border="0" /&gt;&lt;/a&gt;La nintendo DS a deux processeurs différents : un ARM7TDMI et un ARM946E-S partageant des espaces mémoires en commun, ayant à leur disposition, différents types de mémoire plus ou moins rapide (DTCM et ITCM, WRAM, ICACHE et DCACHE de l’ARM9…)&lt;br /&gt;&lt;br /&gt;Programmer pour la nintendo DS, c’est bien programmer pour "un &lt;a href="http://en.wikipedia.org/wiki/Embedded_system"&gt;système embarqué&lt;/a&gt;" (embedded). Un des concepts importants en programmation embarqué est l’utilisation de registre mappé sur la mémoire : « &lt;a href="http://en.wikipedia.org/wiki/Addressing_mode#Memory-mapped_registers"&gt;memory-mapped registers&lt;/a&gt; ». Ce genre de technique apporte son lot de problèmes et de solution, notamment par l'emploi, en langage C, du mot clé "volatile", qui n'a rien à voir avec les oiseaux, comme nous le montre très bien &lt;a href="http://www.embeddedgurus.net/stack-overflow/"&gt;Nigel Jones&lt;/a&gt; dans &lt;a href="http://www.netrino.com/node/80"&gt;How to use C's volatile keyword&lt;/a&gt; et que je vous traduirais ainsi :&lt;br /&gt;&lt;blockquote&gt;Les système embarqués contiennent du vrai matériel, habituellement avec des périphériques sophistiqués. Ces périphériques contiennent des registres dont &lt;span style="font-weight: bold;"&gt;les valeurs peuvent changer de façon asynchrone vis à vis du déroulement du programme&lt;/span&gt;. Pour prendre un exemple très simple, considérez un registre de status sur 8 bits qui soit mappé sur la mémoire à l'adresse &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;0x1234&lt;/span&gt;&lt;/span&gt;. Il est nécessaire de scruter le registre de status jusqu'à ce qu'il ne soit plus égal à 0. Une implémentation naive et incorrecte pourrait être comme cela :&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;uint8_t * pReg = (uint8_t *) 0x1234;&lt;br /&gt;&lt;br /&gt;// Wait for register to become non-zero.&lt;br /&gt;while (*ptr == 0);&lt;br /&gt;// Do something else.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Cela va très certainement ne pas fonctionner dès que vous allez autoriser les optimisations du compilateur, du fait que le compilateur va générer de l'assembleur qui va ressembler à ça :&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;     mov ptr, #0x1234&lt;br /&gt;    mov a, @ptr&lt;br /&gt;loop bz loop&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La logique de l'optimisateur est assez simple : ayant déjà lu la valeur de la variable dans l'accumulateur (à la deuxième ligne de l'assembleur), il n'y a pas besoin de la relire puisque la valeur sera toujours la même. Ainsi, en troisième ligne, on abouti à une boucle infinie. Pour forcer le compilateur à faire ce que nous voulons, nous modifions la déclaration en :&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;uint8_t volatile * pReg = (uint8_t volatile *) 0x1234;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;L'assembleur va maintenant ressembler à ça :&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;      mov ptr, #0x1234&lt;br /&gt;loop  mov a, @ptr&lt;br /&gt;     bz loop&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Le comportement désiré est obtenu.&lt;br /&gt;&lt;/blockquote&gt;C’est dans ce genre d’exemple qu’on s’aperçoit qu’il est toujours bon de savoir ce qui se passe en dessous (en assembleur) du langage que l’on utilise (le langage C).&lt;br /&gt;&lt;br /&gt;La programmation sur Nintendo DS regroupe un ensemble d'avantages certains pour le jeune programmeur (comme pour les moins jeunes comme moi :) ) :&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;programmation directe pour la machine&lt;/span&gt; : il n'y a pas de système d'exploitation entre le programme que vous concevez et la machine. Cela oblige à comprendre comment fonctionne réellement un système embarqué, et un système informatique tout court.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;programmation d'une console de jeu&lt;/span&gt; : c'est motivant (c'est fun quoi :) ) parce qu'on peut arriver à avoir beaucoup d'effets graphiques 2D, 3D et sonores, et puis il y a aussi une véritable tablette graphique, une connexion réseau Wifi, un microphone intégré (et bientôt un appareil photo sur la nouvelle console &lt;a href="http://www.nintendo.fr/NOE/fr_FR/news/2008/nintendo_prsente_la_dsi_9691.html"&gt;Nintendo DSi&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;simplicité du kit de développement&lt;/span&gt; grâce à &lt;a href="http://www.devkitpro.org/"&gt;devkitpro&lt;/a&gt; qui contient tout ce qui est nécessaire pour développer correctement sur Nintendo DS. Cela permet d'apprendre le langage C pour ce qu'il a de meilleur : un accès très bas niveau et performant.&lt;br /&gt;&lt;br /&gt;Aujourd'hui, j'imagine que pour un gosse qui découvre l'informatique et veut y mettre les mains, la Nintendo DS est bien plus motivante, dans un premier temps, que d'attaquer directement des systèmes embarqués ou de la programmation Web. &lt;span style="font-weight: bold;"&gt;Il est toujours important de s'essayer dans le domaine où on a le plus d'endurance aux échecs&lt;/span&gt;, là où vous retrouverez le plus facilement de la motivation même en face de problèmes insondables. Garder du plaisir à programmer c'est ça qui permet d'aller au delà des bugs et problèmes, et d'aboutir à des systèmes géniaux comme ce à quoi ont aboutis les concepteurs de la Nintendo DS.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.arduino.cc/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 316px; height: 220px;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SYDOnba4wFI/AAAAAAAAAOc/dQ393-s0OTY/s400/arduino316.jpg" alt="" id="BLOGGER_PHOTO_ID_5296460338558451794" border="0" /&gt;&lt;/a&gt;Dans un deuxième temps, après s'être fait la main sur cette console, on peut toujours se tourner vers des systèmes qui nous plaisent mieux, comme des systèmes embarqués (&lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt; ou le &lt;a href="http://www.microsoft.com/netmf/"&gt;.NET Micro Framework&lt;/a&gt; par exemple), des systèmes d'exploitation (Linux ou pourquoi pas OpenBSD, voire même s'essayer à décoder les &lt;a href="http://www.amazon.com/Windows%C3%82%C2%AE-Internals-Including-Windows-PRO-Developer/dp/0735625301"&gt;tripes de Windows&lt;/a&gt;) ou encore des applications Web / SGBD...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2305113642486493480?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2305113642486493480/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2305113642486493480' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2305113642486493480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2305113642486493480'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/02/systeme-embarque-et-programmation.html' title='Système embarqué et programmation Nintendo DS'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dJYBJhDg2Hk/SYC8f8DuQeI/AAAAAAAAAOU/9nTWURea7fA/s72-c/Dov_DS_MemoryMap.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-5818674100786876894</id><published>2009-02-05T08:00:00.000-08:00</published><updated>2011-01-26T02:30:07.520-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='télécommunications'/><title type='text'>Les télécoms et leurs acronymes</title><content type='html'>Dans tout métier, il y a un &lt;a href="http://jradix.blogspot.com/2008/09/jargon-effets-de-mode-et-confusions.html"&gt;jargon&lt;/a&gt; qui permet de parler plus rapidement de choses reconnues et employées par toutes les &lt;a href="http://jradix.blogspot.com/2008/08/terminologie-de-la-communaut-des.html"&gt;professionnels du domaine&lt;/a&gt;. Pour aller encore plus vite, on peut aussi employer des acronymes ou des abréviations. Ils permettent :&lt;br /&gt;&lt;blockquote&gt;- d’accumuler en un minimum de lettre un ensemble de mots&lt;br /&gt;&lt;br /&gt;- d’aider sa mémoire en fournissant de fait, &lt;span style="font-weight: bold;"&gt;des mnémoniques pour la remémoration de choses complexes&lt;/span&gt;, abstraites ou longues.&lt;/blockquote&gt;On peut aller encore plus loin en construisant des acronymes à partir d’autres acronymes, comme par exemple l’acronyme issu du domaine des Télécommunication : LNS qui veut dire L2TP Network Server, où &lt;a href="http://en.wikipedia.org/wiki/L2TP"&gt;L2TP&lt;/a&gt; veut dire Layer 2 Tunneling Protocol. On peut bien sur en citer d’autres : &lt;a href="http://en.wikipedia.org/wiki/AJAX"&gt;AJAX&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/GTK%2B"&gt;GTK&lt;/a&gt;…&lt;br /&gt;&lt;br /&gt;Quand les acronymes d’un domaine professionnel arrive dans le grand public, on arrive souvent à des incompréhensions, des exclusions entre les personnes qui savent et les personnes qui ne comprennent pas.&lt;br /&gt;&lt;br /&gt;Par exemple, l’acronyme PCMCIA bien connu des informaticiens, est inconnu pour la plupart des personnes qui achète un PC portable grand public, mais c’est pourtant un élément mis en avant sur les étiquettes destinées aux acheteurs. Aujourd’hui on n’en parle plus puisque personne ne comprend ce terme. Il y en a même qui ont finit par traduire PCMCIA par un &lt;a href="http://fr.wikipedia.org/wiki/R%C3%A9tro-acronymie"&gt;rétro-acronyme&lt;/a&gt; : People Can't Memorize Computer Industry Acronyms.&lt;br /&gt;&lt;br /&gt;Quel est l’informaticien qui a retenu ce que PCMCIA veut dire : &lt;a href="http://en.wikipedia.org/wiki/Personal_Computer_Memory_Card_International_Association"&gt;Personal Computer Memory Card International Association&lt;/a&gt; Maintenant, les cartes PCMCIA sont appelée PC Card, terme hypergénérique qui ne veut rien dire en particulier si ce n’est que c’est une carte qui va dans un PC.&lt;br /&gt;&lt;br /&gt;Le domaine des télécom est celui où j’ai vu le plus d’acronymes employés. Les acronymes sont parfois en français ou en anglais. Toute la journée, il n’y a pas une phrase où on n’emploie pas un. Ce sont parfois des acronymes du domaine des télécom, mais ce sont aussi des acronymes spécifiques à l’entreprise. Il faut plusieurs mois, voire plusieurs années pour s’y retrouver. &lt;span style="font-weight: bold;"&gt;Il y en a tellement que leur décomposition en mot n’est parfois plus connue par les gens qui les emploie.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quand j’écoute mes collègues travailler, discuter, et quand je m’écoute parler (ça m’arrive souvent :) ), je me rends compte que réellement, &lt;span style="font-weight: bold;"&gt;toutes les phrases, sans exception, emploie au moins un acronyme&lt;/span&gt;. Comme derrière un jargon, il est facile de se cacher derrière eux. On a toujours l’impression de passer pour plus intelligent que l’on est, comme s’ils allaient de soi et que si vous ne le connaissez pas, c’est que vous êtes certainement dépassé.&lt;br /&gt;&lt;br /&gt;Un des livres qui m’a permis de mieux comprendre l’ensemble des acronymes du domaine des télécoms est &lt;a href="http://www.amazon.com/Telecommunications-Essentials-Second-Complete-Global/dp/0321427610"&gt;Telecommunications Essentials (2nd Edition)&lt;/a&gt; de &lt;a href="http://www.informit.com/authors/bio.aspx?a=C1D1119D-101D-448A-AEA6-5354D08904F2"&gt;Lillian Goleniewski&lt;/a&gt;. L’intérêt de ce livre est qu’il couvre l’ensemble du domaine, ce qui est assez impressionnant en 928 pages. Il ne rentre pas dans les détails les plus infimes de chaque protocole, technologie ou standard, mais va suffisamment loin pour permettre une compréhension solide de tout ce qui a trait aux télécoms (du champ électromagnétique aux architectures de service sur IP, en passant par le bon vieux téléphone RTC…)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/Telecommunications-Essentials-Second-Complete-Global/dp/0321427610"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 317px; height: 400px;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/SYC4wr6p-EI/AAAAAAAAAOE/91MC-IUUcG8/s400/Telecommunications_Essentials_2ndEdition.jpg" alt="" id="BLOGGER_PHOTO_ID_5296436308349679682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mais tout cela prend du temps, bien qu’ayant eu une formation en informatique et télécommunications, il faut quand même plusieurs années pour maîtriser l’ensemble des acronymes qu’il est nécessaire d’utiliser pour construire les offres de service de télécommunication d’aujourd’hui. Car, comme dans la plupart des domaines, une entreprise offre une valeur ajouté à un client, quand elle arrive à intégrer l’ensemble des technologies (on parle souvent de convergence, puisque des technologies différentes, voix, réseau, video, services, convergent vers une offre de service particulière au client). Or &lt;span style="font-weight: bold;"&gt;pouvoir construire des offres convergentes, nécessite de comprendre la multitude de technologies en présence, même s’il n’est pas nécessaire de les maîtriser&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Au-delà des acronymes, le &lt;a href="http://fr.wikipedia.org/wiki/Jargon_informatique"&gt;jargon des informaticiens&lt;/a&gt; est parfois imagé et enrichi par des néologismes, et étrangement, le français n’est pas délaissé. En voici un florilège :&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Babasse&lt;/span&gt;: nom générique pour un ordinateur (voir aussi ordi ou bécane). Son utilisateur s'appelle un babasseur, on dit souvent babasseur fou quand il y a excès.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Brouteur &lt;/span&gt;: Jeu de mot avec le terme routeur, machine qui achemine les paquets réseaux. Fréquemment utilisé lorsque celle-ci sature.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;CLCLMPALC &lt;/span&gt;: Comité de lutte contre les messages persos à la con : message utilisé principalement par les amoureux de la langue française, de l'orthographe, de la syntaxe, et des belles phrases, en guise de contestation à l'émergence d'un nouveau style d'écriture, se retrouvant dans les messages personnels dans certains logiciels de messagerie instantanée, ou encore dans les forums.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Impacter &lt;/span&gt;: avoir un effet&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Interface chaise-clavier&lt;/span&gt; : surnom péjoratif donné à l'utilisateur. Souvent utilisé comme manière détournée de dire qu'un problème informatique a comme origine l'utilisateur.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;PetitMou &lt;/span&gt;: Traduction française (péjorative) du nom de Microsoft (micro = petit et soft = tendre, doux, ou mou dans le cas présent) En vogue dans les années 1990, probablement apparu avec Windows 95.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Plat de spaghettis&lt;/span&gt; : Se dit d'un programme non structuré, dont le déroulement est aussi aisé à suivre que de trouver les extrémités correspondantes de spaghettis dans une assiette.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Prout &lt;/span&gt;: Abréviation française peu élégante du terme iproute, ou routage IP.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Usine à gaz&lt;/span&gt;: lorsque, généralement suite à de nombreuses maintenances successives ou &lt;span style="font-weight: bold;"&gt;en raison d'une mauvaise identification des cas généraux au profit des cas particuliers&lt;/span&gt;, un logiciel est devenu trop compliqué et inefficace, il devient "une usine à gaz". Sa refonte et la suppression du code mort sont alors impératifs.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Windaube&lt;/span&gt; : Surnom irrévérencieux donné au système d'exploitation Windows de Microsoft afin de stigmatiser ses imperfections.&lt;br /&gt;&lt;br /&gt;Je ne vous parle pas des &lt;a href="http://fr.wikipedia.org/wiki/Acronymie_r%C3%A9cursive"&gt;acronymes récursifs&lt;/a&gt; qu’affectionnent les &lt;a href="http://jradix.blogspot.com/2008/08/le-chemin-bien-sinueux-de-lexcellence.html"&gt;hackers&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-5818674100786876894?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/5818674100786876894/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=5818674100786876894' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5818674100786876894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5818674100786876894'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/02/les-telecoms-et-leurs-acronymes.html' title='Les télécoms et leurs acronymes'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/SYC4wr6p-EI/AAAAAAAAAOE/91MC-IUUcG8/s72-c/Telecommunications_Essentials_2ndEdition.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2241396757840055087</id><published>2009-01-29T08:00:00.000-08:00</published><updated>2011-01-26T02:30:35.058-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivité'/><category scheme='http://www.blogger.com/atom/ns#' term='matériel'/><title type='text'>Disque dur externe et capitalisation</title><content type='html'>Pourquoi faire simple quand on peut faire compliqué. Étant en possession d’un disque dur externe de 120Go Western Digital (il n'en font plus des comme ça, le remplaçant étant le &lt;a href="http://www.wdc.com/fr/products/Products.asp?DriveID=525"&gt;Western Digital My Passport Essential&lt;/a&gt;), j’ai pour objectif d’y déposer tout mon environnement de travail, que ce soit les applications ou les données que j’utilise au jour le jour.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wdc.com/fr/products/Products.asp?DriveID=525"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 300px;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SX4_QnWqr-I/AAAAAAAAAN0/1F9K5mOE_Tk/s400/wdfMyPassport_Essential.jpg" alt="" id="BLOGGER_PHOTO_ID_5295739766508793826" border="0" /&gt;&lt;/a&gt;Mon but est de ne plus avoir besoin de quoi que ce soit sur le disque dur interne du PC sur lequel je travaille, de considérer réellement le PC comme un terminal banalisé, interchangeable de façon transparente avec n’importe quel autre PC &lt;a href="http://en.wikipedia.org/wiki/Wintel"&gt;Wintel&lt;/a&gt; compatible.&lt;br /&gt;&lt;br /&gt;Mais pourquoi tant d’efforts pour être indépendant de la machine ? Tout simplement parce que je suis parti du constat suivant :&lt;br /&gt;&lt;br /&gt;- tout d’abord entre mes lieux de travail (j’en ai plusieurs), chez moi, chez des amis ou la famille, je suis amené à travailler avec 8 PC différents :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;3 PC au travail (1 desktop pour le développement, 1 ordi portable, 1 desktop chez le(s) client(s) )&lt;/li&gt;&lt;li&gt;4 ordinateurs chez moi (3 ordi portable + 1 vieux PC de 1998)&lt;/li&gt;&lt;li&gt;1 PC différent par ami ou la famille&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;- Sur tout ces PC, des systèmes d’exploitations différents sont installés (principalement Windows et Linux, mais aussi un &lt;a href="http://www.openbsd.org/"&gt;OpenBSD&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;- Quand je change de projet, de mission ou de client, quand le temps passe et que mes PC deviennent obsolètes, je dois les changer et me retrouve avec des PC vierge de toute installation environ tous les deux ans.&lt;br /&gt;&lt;br /&gt;- J’aime travailler avec des environnements riches en outils (130 applications installées sur mon disque dur externe pour le moment)&lt;br /&gt;&lt;br /&gt;Bref, &lt;span style="font-weight: bold;"&gt;l’installation d’environnements complets entièrement adaptés à mes besoins prend beaucoup de temps&lt;/span&gt; et je ne peux pas me permettre d’installer certains outils sur tous les PC que je rencontre.&lt;br /&gt;&lt;br /&gt;Ainsi, il est apparu bien pratique de posséder un disque dur externe d’une capacité suffisante pour y stocker :&lt;br /&gt;&lt;br /&gt;- toutes les applications de bureautique, de développement (y compris des serveurs comme par exemple Jboss Server, Apache httpd/php/mysql), de loisirs dont j'ai besoin&lt;br /&gt;&lt;br /&gt;- Toutes mes données de travail, et ce &lt;span style="font-weight: bold;"&gt;de façon sécurisée et facilement backupable&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Globalement, sur le disque dur externe, j’ai :&lt;br /&gt;&lt;br /&gt;- à la racine, un fichier script d’initialisation par type d’environnement (1 pour Windows, 1 pour Linux, etc.) qui s’exécute au branchement sur le PC du disque dur et configure le PC d’une certaine manière pour me permettre de lancer n’importe quelle application sans problème. Il s’agit notamment de déclarer des variables d’environnement utilisées par les outils.&lt;br /&gt;&lt;br /&gt;- Dans un répertoire &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;soft&lt;/span&gt;&lt;/span&gt; non-crypté, j’ai rassemblé l’ensemble des applications Windows de mon environnement. Chaque application est dans son répertoire dont le nom est construit de la manière suivante : &lt;span style=";font-family:courier new;font-size:85%;"  &gt;nomduproduit-version&lt;/span&gt; (par exemple &lt;span style=";font-family:courier new;font-size:85%;"  &gt;emacs-22.2&lt;/span&gt;). Les applications sont la plupart du temps déposées directement dans ce répertoire, &lt;span style="font-weight: bold;"&gt;sans configuration particulière&lt;/span&gt;. Je ne backup pas le répertoire soft, considérant que si le disque dur est défaillant, je pourrai toujours retrouver les applications sur internet et les réinstaller.&lt;br /&gt;&lt;br /&gt;- Je crée des volumes &lt;a href="http://www.truecrypt.org/"&gt;truecrypt&lt;/a&gt; (plusieurs s’il le faut) pour y stocker toutes mes données de travail. Ces volumes sont encryptés avec &lt;a href="http://jradix.blogspot.com/2008/09/keypass-openid-et-mots-de-passe-dur.html"&gt;un mot de passe dur&lt;/a&gt;. Je crée des volumes truecrypt d’une taille de 4Go histoire de pouvoir facilement les graver sur un DVD-ROM pour faire des backups, et formatés en FAT32 histoire de ne pas avoir de sécurité associée à tous les fichiers et pouvoir ainsi passer de PC en PC sans problème. Les scripts de démarrage me demandent mon mot de passe et montent automatiquement ces volumes sur le système hôte. L'intérêt de truecrypt, c'est qu'il fonctionne aussi sous linux, ça permet d'ouvrir mes volumes truecrypt quelque soit le système d'exploitation.&lt;br /&gt;&lt;br /&gt;- Un script de fermeture (appelé « &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;stop&lt;/span&gt;&lt;/span&gt; ») permet de déconfigurer proprement l’environnement pour le remettre comme précédemment, d’arrêter toutes les applications issues du disque dur externe et de démonter les volumes truecrypt&lt;br /&gt;&lt;br /&gt;- Un menu avec des liens vers toutes les applications installées sur mon DD externe est placé dans le menu Démarrer / Programme de l’utilisateur en cours. Cela permet de retrouver des liens pour lancer toutes les applications disponibles.&lt;br /&gt;&lt;br /&gt;- J’ai même mis un Raccourci vers Emacs dans le menu contextuel SendTo (Envoyer vers) histoire de pouvoir envoyer n’importe quel fichier vers &lt;a href="http://www.gnu.org/software/emacs/"&gt;mon éditeur préféré&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Concrètement, lorsque je branche mon DD externe sur un machine Wintel, une fenêtre me demande automatiquement mon mot de passe truecrypt, puis monte les volumes truecrypt grâce à ce mot de passe et configure tout l’environnement pour permettre à toutes les applications de fonctionner.&lt;br /&gt;&lt;br /&gt;Je lance automatiquement &lt;a href="http://subversion.tigris.org/"&gt;svnserve&lt;/a&gt; sur un repository placé sur un disque crypté. J’ai ainsi tout un environnement de développement avec versionning prêt à l’emploi et configuré pour s’intégrer avec Emacs.&lt;br /&gt;&lt;br /&gt;Ainsi, dès que j’ai une nouvelle application à essayer, des nouveaux composants emacs lisp à installer, &lt;span style="font-weight: bold;"&gt;le temps que je passe à installer les composants sur le disque dur externe est capitalisé pour l’avenir&lt;/span&gt; et je n’ai pas à refaire toutes les manipulations sur chaque PC que j’utilise.&lt;br /&gt;&lt;br /&gt;Pour ce qui est des applications Windows qui doivent absolument utiliser la base de registre, j’utilise l’outil &lt;a href="http://www.sandboxie.com/"&gt;sandboxie&lt;/a&gt; qui permet de faire fonctionner toute application dans un bac à sable entièrement fermé. Mais finalement, après 2 ans d’utilisation de mon disque dur externe, je m’aperçois que &lt;span style="font-weight: bold;"&gt;je n’utilise jamais d’application de ce type, et donc je ne recours jamais à sandboxie&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Quand mon installation prend un certain nombre d’opérations manuelles non évidentes, ou pas très bien décrites dans le manuel utilisateur, je me construis &lt;a href="http://jradix.blogspot.com/2008/06/larme-absolue-de-la-qualit-la-checklist.html"&gt;une check-list&lt;/a&gt; reprenant l’ensemble des étapes que j’ai réalisé pour installer le logiciel. Cela m’assure que si mon disque dur externe plante, je peux très rapidement réinstaller le logiciel sans trop réfléchir.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wdc.com/fr/products/Products.asp?DriveID=525"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 150px; height: 188px;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SX4_2q-KIbI/AAAAAAAAAN8/WYR_P0AzDyI/s400/RCshirt.jpg" alt="" id="BLOGGER_PHOTO_ID_5295740420314767794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Globalement, je ne regrette vraiment pas d’avoir tout passé sur ce disque dur externe. Avec 5400RPM sur USB 2.0 (480Mb/s), la vitesse de transfert me suffit amplement pour travailler correctement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2241396757840055087?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2241396757840055087/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2241396757840055087' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2241396757840055087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2241396757840055087'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/01/disque-dur-externe-et-capitalisation.html' title='Disque dur externe et capitalisation'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/SX4_QnWqr-I/AAAAAAAAAN0/1F9K5mOE_Tk/s72-c/wdfMyPassport_Essential.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2295567903647830273</id><published>2009-01-22T18:29:00.001-08:00</published><updated>2011-01-26T02:31:17.465-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de données'/><title type='text'>La base de données cette inconnue...</title><content type='html'>Aujourd'hui, &lt;span style="font-weight: bold;"&gt;la plupart des applications développées sont des applications Web&lt;/span&gt;. Non pas qu'on ne construise plus d'autres types d'applications, mais, en quantité d'applications développées, ce sont bien les applications de types Web qui sont les plus nombreuses.&lt;br /&gt;&lt;br /&gt;Quand on analyse ce qui constitue la plupart des applications Web, on s'aperçoit ensuite que &lt;span style="font-weight: bold;"&gt;chaque site Web est secondé par une base de données en arrière plan&lt;/span&gt;. Ce qui fait la force du Web c'est la facilité avec laquelle il est possible de publier des données en grand nombre et d'offrir des fonctionnalités sur ces données. Quand les années passent, les technologies de présentation des données (client lourd, client Web...)  sont les premières à faire les frais de l'apparition de nouveaux concurrents. Mais, en arrière plan, la base de données est toujours là, fidèle au poste, toujours aussi importante dans l'architecture globale de l'application.&lt;br /&gt;&lt;br /&gt;Quand on veut faire carrière dans l'informatique, on cherche à maitriser les outils dont on dispose et qui sont généralement mis en œuvre dans les projets. Personnellement, je n'ai pas le temps de réapprendre tous les 3 ans une nouvelle technologie de présentation (par exemple, en ce moment, c'est le phénomène &lt;a href="http://www.adobe.com/fr/products/air/"&gt;Adobe AIR&lt;/a&gt; et toutes les &lt;a href="http://www.adobe.com/fr/products/flex/"&gt;technologies Flex&lt;/a&gt; qui ont le vent en poupe). Je n'ai plus l'age de passer des heures inconsidérées sur mon ordi à essayer la moindre nouveauté.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.adobe.com/fr/products/air/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 268px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SXk1qyckplI/AAAAAAAAANk/YCtdVMLks1w/s400/adobe-air-bus.jpg" alt="" id="BLOGGER_PHOTO_ID_5294321846163121746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Et puis, les technologies se succédant les unes aux autres, on s'aperçoit que, bien que nouvelles, elles ne sont pas innovantes, &lt;span style="font-weight: bold;"&gt;ce ne sont que de nouvelles créations, très reluisantes, mais n'apportant pas de réelle nouveautés&lt;/span&gt;. Dans ce cadre là, un programmeur a tout intérêt à maîtriser au moins un système de gestion de base de données quel qu'il soit pour avoir à se pencher sur les défis réels de la mise en place de sites web : &lt;span style="font-weight: bold;"&gt;la montée en charge d'une application à accès concurrents&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Le coût global d'une requête Web sur un site Web secondé par une base de données est en grande partie due à l'accès et au traitement de la donnée, pas à se mise en forme à travers des pages HTML, Ajax, ou autre. Avec &lt;a href="ftp://ftp.research.microsoft.com/pub/debull/A08mar/binnig.pdf"&gt;un jeu de données de test automatisé&lt;/a&gt;, et un grand nombre de requêtes clientes, le programmeur est tout de suite confronté à un problème de capacité. Il doit surtout faire preuve de maîtrise de son système de gestion de bases de données pour pouvoir le régler correctement pour répondre à la demande, et ce pour toutes les requêtes concurrentes.&lt;br /&gt;&lt;br /&gt;La maîtrise d'une technologie comme &lt;a href="http://www.oracle.com/database/"&gt;Oracle&lt;/a&gt;, &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; ou &lt;a href="http://www.mysql.fr/"&gt;MySQL&lt;/a&gt; prend déjà tant de temps que je ne vois pas où est l'intérêt de passer tout son temps sur des technologies de GUI qui évoluent au gré des modes et du temps. De toute manière, il existe de nombreux outils de développement suffisamment évolués pour ne pas avoir à taper une ligne de codes pour réaliser les tâches les plus classiques de la couche présentation.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.postgres-r.org/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 250px; height: 143px;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SXk2QO81SZI/AAAAAAAAANs/u7Jdf2Sh3o0/s400/feature_elephants.png" alt="" id="BLOGGER_PHOTO_ID_5294322489469782418" border="0" /&gt;&lt;/a&gt;Je ne comprend pas pourquoi &lt;span style="font-weight: bold;"&gt;tant de développeurs que j'ai côtoyé utilisent le système de gestion de base de données comme une boîte noire&lt;/span&gt;, comme étant juste un système de &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;persistance d'objets&lt;/a&gt;. L'erreur classique est de trouver du code itératif dans une couche métier Java alors qu'une simple requête SQL aurait suffit. Les systèmes de persistance comme &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt; ont longtemps promu des méthodes de programmation où le système de gestion de bases de données est réduit à une réceptacle abstrait et dont on doit absolument pouvoir interchanger si l'humeur nous en dit. Or, tous ces systèmes d'abstraction vis à vis du SGBD sont finalement la plus part du temps complètement inutiles sachant :&lt;br /&gt;&lt;br /&gt;- qu'&lt;span style="font-weight: bold;"&gt;il est extrêmement rare de changer brusquement de technologies de base de données &lt;/span&gt;puisque, à part faire un mauvais choix, la plus part des SGBD sont maintenant extrêmement bien rodés pour ce qu'ils ont à faire.&lt;br /&gt;&lt;br /&gt;- qu'on a tout intérêt à tirer au maximum partie des services offerts par le SGBD pour réaliser les fonctionnalités à implémenter car &lt;span style="font-weight: bold;"&gt;le paradigme de programmation SQL, bien qu'imparfait, reste toujours supérieure à une approche procédurale classique quand il s'agit de traîter des lots de données&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;- si on doit utiliser un SGBD payant comme Oracle, c'est vraiment du gâchis de le considérer comme une boîte noire et de ne pas utiliser toutes &lt;span style="font-weight: bold;"&gt;les fonctionnalités que vous avez chèrement payées&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://asktom.oracle.com/"&gt;Tom Kyte&lt;/a&gt; résume très bien cette situation dans son livre &lt;a href="http://www.amazon.com/Expert-Oracle-Database-Architecture-Programming/dp/1590595300"&gt;Expert Oracle Database Architecture&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;The single most common reason for database project failure is &lt;span style="font-weight: bold;"&gt;insufficient practical knowledge of the database&lt;/span&gt; - a basic lack of understanding of the fundamental tool that is being used. The black box approach involves a conscious decision to protect the developers from the database - they are actually encouraged to not learn anything about it ! &lt;span style="font-weight: bold;"&gt;In many cases, they are prevented from exploiting it&lt;/span&gt;. The reasons for this approach appear to be related to &lt;a href="http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt"&gt;FUD&lt;/a&gt; (Fear, Uncertainty, and Doubt). The accepted wisdom is that database are "hard", and that SQL, transactions, and data integrity are "hard".&lt;span style="font-weight: bold;"&gt; The solution: don't make anyone do anything "hard"&lt;/span&gt;. They treat the database as a black box and have some software tool generate all of the code. They try to insulate themselves with many layers of protection so that they do not have to touch this "hard" database.&lt;br /&gt;&lt;/blockquote&gt;&lt;a href="http://philip.greenspun.com/"&gt;Philip Greenspun&lt;/a&gt; le disait déjà de son temps dans &lt;a href="http://philip.greenspun.com/panda/databases-intro"&gt;Philip and Alex's Guide to Web Publishing&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;Any interesting Web/RDBMS problem can be solved using just the standard software shipped with the RDBMS. If you can't solve it with those tools, you can't solve it with any tool no matter how glitzy and turnkey. &lt;span style="font-weight: bold;"&gt;The critical element is not the tools, it is the programmer&lt;/span&gt;.  &lt;p&gt;  In terms of maintainability, clarity of code, software development cycle, and overall Web server performance and reliability, the simplest tools such as Microsoft Active Server Pages are superior to virtually any of the expensive Web development systems out there.&lt;/p&gt;&lt;/blockquote&gt;Il est vraiment dommage de ne pas s'intéresser à son SGBD car il permet pourtant de réaliser de grandes applications, solides et montant correctement en charge. De plus, il permet de faire face à des &lt;a href="http://jradix.blogspot.com/2008/07/les-vues-et-le-contrle-daccs-fin-aux.html"&gt;situations&lt;/a&gt; &lt;a href="http://jradix.blogspot.com/2008/07/les-mises-jour-perdues-sont-trop.html"&gt;délicates&lt;/a&gt; de façon élégante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2295567903647830273?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2295567903647830273/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2295567903647830273' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2295567903647830273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2295567903647830273'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/01/la-base-de-donnees-cette-inconnue.html' title='La base de données cette inconnue...'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SXk1qyckplI/AAAAAAAAANk/YCtdVMLks1w/s72-c/adobe-air-bus.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-584356134119140642</id><published>2009-01-15T08:00:00.000-08:00</published><updated>2011-01-26T02:31:45.595-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commerce'/><title type='text'>Propriété intellectuelle et développement au forfait</title><content type='html'>A chaque fois que je &lt;a href="http://jradix.blogspot.com/2008/08/les-affres-de-la-gestion-de-projet-de.html"&gt;développe un logiciel au forfait&lt;/a&gt;,&lt;span style="font-weight: bold;"&gt; je ne sais jamais quelle licence mettre en haut de chaque fichier source&lt;/span&gt;. Les contrats de développement au forfait ne sont pas toujours explicites sur le sujet de la propriété intellectuelle. Quelle est la loi qui s'applique ? quelles sont les jurisprudences en la matière ? Je suis tombé sur la &lt;a href="http://www.munci.org/20090103/RESSOURCES-JURIDIQUES-Sous-traitance-et-Prestation-de-service-Delit-de-marchandage-et-Pret-illicite-de-main-d-oeuvre-Externalisation-et-Transfert-de-personnel"&gt;collection de ressources juridiques du Munci&lt;/a&gt; qui donne pas mal de pointeurs vers des documents intéressants, notamment à propos du &lt;a href="http://www.m2-dmi.com/spip/IMG/pdf/25_contrat_dvpt.pdf"&gt;contrat de développement de logiciel spécifique&lt;/a&gt;. La nature juridique est énoncée en ces termes :&lt;br /&gt;&lt;blockquote&gt;La nature juridique du contrat de création (développement) de logiciel ne pose donc pas de problème particulier : l’élaboration d’un logiciel constitue une prestation de service et entre donc dans le cadre d’un contrat d’entreprise ou &lt;span style="font-weight: bold;"&gt;louage d’ouvrage &lt;/span&gt;(article 1710 Code civil contrat « par lequel l’une des parties s’engage à faire quelque chose pour l’autre moyennant un prix convenu par elles »).&lt;br /&gt;&lt;br /&gt;L’originalité juridique du louage d’ouvrage est double : &lt;b&gt;le contrat est valable, bien que les prestations essentielles, l’ouvrage et le prix, puissent être dans les faits largement indéterminées&lt;/b&gt; ; le concepteur de logiciel ne peut savoir à l’avance quelles seront les difficultés présentées par celui-ci et le prix dépendra souvent du temps passé qui ne peut être fixé avec précision. Ces contrats échappent à la nullité car les parties s’entendent pour enfermer l’indétermination dans certaines limites.&lt;/blockquote&gt;En effet, ce qui est assez déroutant pour le chef de projet néophyte, c'est que le contrat n'est pas complet sur ce qui va être livré tout en obligeant à s'engager sur le résultat. La programmation s'apparente à une œuvre de l'esprit et tombe ainsi sous la loi des droits d'auteurs :&lt;br /&gt;&lt;blockquote&gt;Le contrat de développement n’emporte pas cession automatique de la propriété du logiciel ; les règles du contrat de louage veulent que la propriété du résultat soit transmise au client, mais le contrat doit le prévoir expressément, faute de quoi le droit commun s’applique et &lt;span style="font-weight: bold;"&gt;c’est le créateur du logiciel qui en est le propriétaire&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Néanmoins, CA Bordeaux 24 sept. 1984 décide que même dans le silence du contrat, le prestataire est tenu de transmettre le code source du logiciel au client afin que celui-ci puisse en faire assurer la maintenance. L’arrêt, isolé, ne va pas jusqu’à dire que le prestataire doit transmettre ses droits de propriété au client, et CA Montpellier (2 juillet 1991) a jugé que « &lt;span style="font-weight: bold;"&gt;la mise à disposition de l’utilisateur des sources, surtout s’agissant d’un logiciel spécifique, n’est pas de nature à établir une cession de tous les droits d’auteurs&lt;/span&gt; ». La doctrine estime toutefois qu’il peut s’agir d’un indice permettant de déduire, combiné par exemple au prix payé, que les droits d’exploitation ont bien été cédés.&lt;br /&gt;&lt;/blockquote&gt;Ainsi, si rien n'est dit, le propriétaire du code source est le fournisseur, et celui-ci donne le droit au client d'exploiter (maintenir) le code source uniquement pour son usage personnel. Le code source étant la propriété du fournisseur, il peut réutiliser les sources pour un nouveau projet au forfait. Les marchés publics contiennent toujours une partie cession de la propriété intellectuelle au client et il est malheureusement impossible d'utiliser le code source pour d'autres projets. Ainsi, je met toujours :&lt;br /&gt;&lt;br /&gt;Copyright (c) &lt;annee&gt;[ANNEE], [PROPRIETAIRE]&lt;br /&gt;&lt;/annee&gt;All rights reserved.&lt;br /&gt;&lt;annee&gt;&lt;proprietaire&gt;&lt;br /&gt;en haut de chaque fichier source, avec pour PROPRIETAIRE soit ma société si le client ne requiert pas de transfert de propriété, soit le client, s'il y a transfert de propriété. Normalement, un logiciel avec transfert de propriété intellectuelle doit être vendu plus cher qu'un logiciel sans cession de propriété. Il est toujours assez triste de laisser partir du code source qu'on a mis tant de temps à peaufiner, tous les jolis composants réutilisables que vous avez concoctés ne peuvent même pas vous servir. &lt;span style="font-weight: bold;"&gt;Dans le cas de cession de propriété intellectuelle, cela ne pousse pas à concevoir l'architecture du logiciel pour promouvoir la réutilisation&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Parfois les clauses de cession de propriété intellectuelle sont abusives, c'est ce que nous rappelle le document &lt;a href="http://www.syntec-informatique.fr/import/ThemaTICn5.pdf"&gt;Clauses et Pratiques des Contrats Informatiques de Droit Privé&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;Les prestataires informatiques ont pris note de l’insertion de nombreuses clauses inacceptables dans les contrats parmi lesquelles on compte, notamment, les clauses suivantes :&lt;br /&gt;&lt;br /&gt;- Clauses précisant que les spécifications développées par le prestataire dans le cadre de l’exécution du contrat appartiennent au client et cela même dans le cadre de la sous-traitance et lorsque ces développements sont réalisés atour d’un progiciel. [...]&lt;br /&gt;&lt;br /&gt;- Clauses donnant le sentiment au prestataire que le client lui impose la cession de la propriété d’un progiciel ou encore la délivrance des codes sources dans le cadre de contrats portant sur des licences d’utilisation de progiciel standard ou en cas de résiliation du contrat,&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Clauses excluant toute possibilité de résilier une licence accordée à un utilisateur lorsque ce dernier l’a revendue à un tiers. Ce type de clause organise la violation du droit d’auteur.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il convient de prêter attention au moment auquel intervient le transfert de propriété. Les clients demandent souvent au prestataire de prévoir un transfert de propriété au fur et à mesure de la réalisation alors que &lt;span style="font-weight: bold;"&gt;le transfert doit s’opérer postérieurement au prononcé de la recette sans réserve et après complet paiement&lt;/span&gt;.&lt;/blockquote&gt;L'aspect propriété intellectuelle est souvent mise de coté, ignorée, sous-estimée alors qu'elle peut avoir des conséquences importantes sur les projets futurs qu'ils soient chez le client ou chez le fournisseur. &lt;span style="font-weight: bold;"&gt;Des sociétés entières ont fondé leur succès commercial uniquement sur la propriété intellectuelle&lt;/span&gt;, comme par exemple &lt;a href="http://www.arm.com/"&gt;ARM&lt;/a&gt;, ou encore &lt;a href="http://www.thomson.net/"&gt;Thomson&lt;/a&gt; qui tire la majeure partie de son chiffre d'affaire de vente de licence d'utilisation de ses brevets et logiciels.&lt;br /&gt;&lt;/proprietaire&gt;&lt;/annee&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-584356134119140642?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/584356134119140642/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=584356134119140642' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/584356134119140642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/584356134119140642'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/01/proprit-intellectuelle-et-dveloppement.html' title='Propriété intellectuelle et développement au forfait'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-6704544180899636417</id><published>2009-01-13T08:00:00.000-08:00</published><updated>2011-01-26T02:32:31.368-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivité'/><title type='text'>Mémorisation, apprentissage et éducation</title><content type='html'>Tout le monde cherche à être "productif". Mais on peut vouloir être productif dans son travail :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;soit pour pouvoir faire plus avec autant de temps,&lt;/li&gt;&lt;li&gt;soit pour pouvoir faire la même chose avec autant de temps mais avec beaucoup moins d'effort.&lt;/li&gt;&lt;/ul&gt;En informatique, où les &lt;a href="http://www.jerf.org/programming/lazyProgrammersGuide.html"&gt;lazy programmeurs&lt;/a&gt; sont légions, c'est souvent le deuxième point qui est mis en pratique. C'est bien sur mon cas. Les outils, techniques, procédures, templates servent à faire autant avec beaucoup moins d'effort. Tous ces artifices sont le reflet des limites de nos capacités mentales et physiques... S'il y a bien un domaine où je suis limité c'est ma mémoire. J'ai toujours du mal à retenir des choses sur le long terme...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fr.wikipedia.org/wiki/Homer_Simpson"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 263px; height: 269px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SWu8MFfZCbI/AAAAAAAAANc/qJnxjoncm5w/s400/cerveau_homer.jpg" alt="" id="BLOGGER_PHOTO_ID_5290529103095073202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;C'est pour cette raison que j'ai découvert avec énormément de bonheur que les techniques et mnémoniques décrites dans &lt;a href="http://jradix.blogspot.com/2008/06/apprentissage-mmoire-et-langage.html"&gt;Your Memory de Kenneth L. Higbee&lt;/a&gt;, fonctionnent et son vraiment puissantes. Je me suis dit, quand à essayer de nouvelles techniques pour apprendre à mémoriser, &lt;span style="font-weight: bold;"&gt;la première chose à apprendre est l'ensemble des techniques d'apprentissage décrites dans ce livre&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;J'ai utilisé la &lt;a href="http://en.wikipedia.org/wiki/Mnemonic_link_system"&gt;mnémonique de liaison (Link Mnémonique)&lt;/a&gt; pour apprendre l'ensemble des éléments essentiels du livre. Un des principes évoqués est l'organisation du contenu à apprendre. &lt;span style="font-weight: bold;"&gt;On oubli beaucoup plus vite du contenu non-structuré par rapport à du contenu organisé logiquement&lt;/span&gt;. Il est donc conseillé d'organiser ce que l'on apprend autour d'un système d'archivage mental ("mental filing system"). Les mnémoniques sont des outils puissant, mettant en œuvre naturellement tous les principes de base de la mémorisation, dont l'organisation.&lt;br /&gt;&lt;br /&gt;Ainsi, j'ai commencé par apprendre la liste des chapitre sur une première chaine de liaison mnémonique, puis sur chaque chapitre j'ai créé une sous chaine de liaison mnémonique pour tous ces sous-chapitres, etc. jusqu'à arriver à mémoriser chaque idée principale de chaque sous-chapitre de chaque chapitre. &lt;span style="font-weight: bold;"&gt;Ce qui est étonnant c'est avec quelle facilité on arrive à apprendre des choses concrète et visuelle par rapport à des choses abstraites.&lt;/span&gt; Grâce à la mnémonique de liaison, on mémorise uniquement des aides à remémoration sous forme d'objet concret et nets, mis en scène avec les objets suivants à travers des scènes frappantes pour l'esprit.&lt;br /&gt;&lt;br /&gt;Suite à ce petit succès, qu'est-ce qu'il serait intéressant de retenir pour être encore plus productif en tant qu'informaticien : les &lt;a href="http://en.wikipedia.org/wiki/Design_Patterns"&gt;design patterns&lt;/a&gt; du &lt;a href="http://www.hillside.net/patterns/DPBook/GOF.html"&gt;GoF&lt;/a&gt; ? bof..., &lt;a href="http://www.amazon.com/Java-Dummies-Aaron-E-Walsh/dp/156884641X"&gt;Java for dummies&lt;/a&gt; ? Certainement pas. Tous les &lt;a href="http://www.amazon.fr/Cest-propre-astuces-B%C3%A9atrice-Dani%C3%A8le/dp/2012371256"&gt;trucs et astuces pour nettoyer la maison&lt;/a&gt;, évidemment, car avec ça, on optimise le temps passé sur une activité essentielle, cela permet après de se concentrer sur l'informatique. Bon, ok, on peut toujours faire appel à une femme de ménage...&lt;br /&gt;&lt;br /&gt;Personnellement, s'il y a un seul bouquin informatique pour lequel je serais prêt à investir du temps à en mémoriser les bonnes pratiques, c'est &lt;a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670"&gt;Code Complete 2 de Steve McConnell&lt;/a&gt;, car c'est un bouquin assez "intemporel" (le mot fait rire en informatique) et est assez bien organisé. Mais bien sur,&lt;span style="font-weight: bold;"&gt; la programmation ne s'apprend pas dans les livres, mais uniquement avec la machine pour interlocuteur&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Il y a la mémoire à court-terme, la mémoire à long-terme et la mémoire sensorielle. Cette dernière sert aussi grandement en informatique. En effet, &lt;span style="font-weight: bold;"&gt;la mémoire sensorielle est ce qui est le plus essentiel en informatique&lt;/span&gt; car c'est elle qui vous permet de taper sur votre clavier à la vitesse d'un éclair. La vitesse de frappe est ce &lt;a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html"&gt;petit secret inavouable du monde de l'informatique&lt;/a&gt;. &lt;span style="font-weight: bold;"&gt;La productivité d'un programmeur se mesure au nombre de caractères à la minute qu'il est capable de débiter&lt;/span&gt; puisque le résultat de son travail passe par le clavier.&lt;br /&gt;&lt;br /&gt;Enfin, quel que soit le type de mémoire, j’ai toujours l’impression que les techniques de mémorisation sont méprisées par les enseignants, quelles sont vues de haut et ne sont pas considérées comme suffisamment noble comme peuvent l’être la compréhension, la pensée créative et critique, pour être étudiées et transmises à travers de véritables cours d’apprentissage. Kenneth L. Higbee nous rappelle très clairement ce qu’il en est :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Two points may be made regarding the role of memory relative to loftier goals or “more laudable, higher mental processes” in school. First, &lt;span style="font-weight: bold;"&gt;whether we like it or not, there is lot of straight memory work in school&lt;/span&gt;. Education consists of “basic school tasks” involving list and paired-associate learning, as well as “complex school tasks” like meaningful prose learning. […] The fact is that the loftier educational goals are in addition to, not instead of, memorization.&lt;br /&gt;&lt;br /&gt;[…] The second point regarding the role of memory in education is that &lt;span style="font-weight: bold;"&gt;remembered facts serve as the basis for the loftier goals&lt;/span&gt;.&lt;br /&gt;&lt;/blockquote&gt;Je me rappelle du collège et du lycée, je trouve qu’il aurait été intéressant de connaître ces techniques à ce moment là. Enfin, le passé n’existe plus, seul le présent est important mais la mémoire s’écrit au futur.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-6704544180899636417?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/6704544180899636417/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=6704544180899636417' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6704544180899636417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6704544180899636417'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/01/mmorisation-apprentissage-et-ducation.html' title='Mémorisation, apprentissage et éducation'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SWu8MFfZCbI/AAAAAAAAANc/qJnxjoncm5w/s72-c/cerveau_homer.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-8091502161492272401</id><published>2009-01-11T06:42:00.000-08:00</published><updated>2011-01-26T02:32:54.752-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='langage'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Incantation Perl</title><content type='html'>Étant en train de lire &lt;a href="http://www.amazon.com/Object-Oriented-Perl-Comprehensive-Programming/dp/1884777791"&gt;Object Oriented Perl&lt;/a&gt; de &lt;a href="http://en.wikipedia.org/wiki/Damian_Conway"&gt;Damian Conway&lt;/a&gt;, de petites perles de programmation m'apparurent comme cette merveilleuse façon d'implémenter un &lt;a href="http://fr.wikipedia.org/wiki/It%C3%A9rateur_%28patron_de_conception%29"&gt;itérateur&lt;/a&gt; en &lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt; :&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;package Iterator;&lt;br /&gt;$VERSION = 1.00;&lt;br /&gt;use strict;&lt;br /&gt;&lt;br /&gt;sub new {&lt;br /&gt;   my ($class,@data) = @_;&lt;br /&gt;   @data = @$class if !@data &amp;amp;&amp;amp; ref($class);&lt;br /&gt;   bless [ @data ], ref($class)||$class;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub each {&lt;br /&gt;   my ($self) = @_;&lt;br /&gt;   my @next = splice @$self, 0, 2;&lt;br /&gt;   return wantarray? @next : $next[0];&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Pour le hacker en Perl, rien de plus trivial que de coder de cette manière. Pour celui qui ne parle pas cette langue, c'est tout de même assez déroutant. Le succès de Perl en son temps, était du en parti à sa simplicité de mise en œuvre, à sa disponibilité sur toutes les plateformes. Comme nous le dit très bien Michael Schwern dans sa présentation &lt;a href="http://video.google.fr/videoplay?docid=-5248422316660075262"&gt;"Perl is unDead"&lt;/a&gt; lors de la &lt;a href="http://conferences.yapcasia.org/ya2008/"&gt;YAPC::Asia 2008&lt;/a&gt;, il s'agit de ce qu'il nomme le &lt;span style="font-weight: bold;"&gt;Folk Programming&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;&lt;embed id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docid=-5248422316660075262&amp;amp;hl=fr&amp;amp;fs=true" style="width: 400px; height: 326px;" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;Ce qui fait qu'un langage de programmation émerge et fini par être utilisé par tout le monde, c'est son adoption par le peuple des programmeurs de base, puis le constat de son omniprésence par les managers dans les entreprises. L'adoption se réalise quand le langage apporte avec lui une nouveauté, un moyen de faciliter et d'accélérer le développement. &lt;span style="font-weight: bold;"&gt;En son temps, Perl apportait une facilité de programmation sans commune mesure avec ce qui se faisait alors.&lt;/span&gt; De plus, il profita de l'arrivée du Web et de son modèle de développement très rapide et itératif car il était devenu très simple de coder quelque chose en Perl et d'avoir immédiatement le résultat sur son écran, un feedback en quasi temps-réel en quelque sorte.&lt;br /&gt;&lt;br /&gt;Mais tout ça c'était les années 90. Aujourd'hui pour faire de la programmation orienté objet en Perl, on est loin de la simplicité des autres langages.  &lt;span style="font-weight: bold;"&gt;Cela fait longtemps que Perl n'est plus le choix le plus évident, qu'il n'offre plus de nouveautés vraiment intéressantes pour le programmeur de base.&lt;/span&gt; Depuis, nombreux sont les logiciels qui ont apportés des nouveautés que Perl n'a pas su fournir le premier : &lt;a href="http://rubyonrails.org/"&gt;Rails sur Ruby&lt;/a&gt;, PHP et son extrême simplicité (un langage &lt;a href="http://www.php.net/manual/en/funcref.php"&gt;fourre-tout&lt;/a&gt;), JavaScript et Web2.0 ... Si Perl veut revenir sur le devant de la scène, c'est en proposant des moyens aussi simples et puissants tout en proposant de nouvelles techniques encore plus indispensables.&lt;br /&gt;&lt;br /&gt;C'est l'objet notamment de &lt;a href="http://dev.perl.org/perl6/"&gt;Perl6&lt;/a&gt; et de sa machine virtuelle &lt;a href="http://www.parrot.org/"&gt;Parrot&lt;/a&gt;. Comme pour s'approprier les succès de ses pseudo-concurrents, Perl6 vise à proposer une machine virtuelle réellement optimisée pour les langages dynamiques, et réellement portée sur de nombreuses architectures (pas comme &lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;Java&lt;/a&gt; qui se targue de permettre de la programmation multi-plateforme, mais qui ne supporte que 3 systèmes (Linux sur x86/x64, Solaris, et Windows) alors que &lt;a href="http://www.cpan.org/ports/index.html"&gt;perl a été portés sur une centaine de systèmes&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Cette machine virtuelle permettra de faire fonctionner ensemble des programmes écrits dans des langages différents, un peu comme la .NET CLR (ou la JVM aujourd'hui où l'on voit apparaître de nombreux langages compilant du bytecode, comme JRuby). L'important c'est que cette machine virtuelle ait été conçue dans le même esprit que perl : &lt;a href="http://en.wikipedia.org/wiki/There_is_more_than_one_way_to_do_it"&gt;TIMTOWTDI&lt;/a&gt;. Elle permet de faire fonctionner des langages aussi compliquer à implémenter que Perl tout en permettant de faire tourner des langages comme Ruby, PHP, et pourquoi pas Java d'ailleurs. C'est ce que nous explique le &lt;a href="http://www.parrotcode.org/docs/intro.html"&gt;Primer Parrot&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;Parrot is designed with the needs of dynamically typed languages (such as Perl and Python) in mind, and should be able to run programs written in these languages more efficiently than VMs developed with static languages in mind (JVM, .NET). Parrot is also designed to provide interoperability between languages that compile to it. &lt;span style="font-weight: bold;"&gt;In theory, you will be able to write a class in Perl, subclass it in Python and then instantiate and use that subclass in a Tcl program.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Personnellement, je verrais bien &lt;span style="font-weight: bold;"&gt;Parrot comme machine virtuelle d'un Emacs refondu à la sauce XXIème siècle&lt;/span&gt;. En ajoutant à Parrot les types de base de Emacs (buffer, window, frame, ...) on devrait pouvoir porter un compilateur elisp vers Parrot et avoir l'éditeur de texte le plus puissant du marché :) Ça permettrait de palier à la lenteur de la machine VM de Emacs (qui d'ailleurs, et ce n'est peut-être pas une coïncidence, a été codée initialement par &lt;a href="http://en.wikipedia.org/wiki/James_Gosling"&gt;James Gosling&lt;/a&gt;, le papa de Java et de la JVM).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-8091502161492272401?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/8091502161492272401/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=8091502161492272401' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8091502161492272401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8091502161492272401'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2009/01/incantation-perl.html' title='Incantation Perl'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-7775296892845028755</id><published>2008-12-11T08:00:00.000-08:00</published><updated>2011-01-26T02:33:31.250-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gentoo'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='portage'/><title type='text'>Gentoo Linux, grandeur et décadence de Portage</title><content type='html'>De nombreuses fois je me suis dit qu'il serait intéressant de voir comment marche la distribution &lt;a href="http://www.gentoo.org/"&gt;Gentoo Linux&lt;/a&gt;. Ayant un peu d'expérience dans le monde &lt;a href="http://en.wikipedia.org/wiki/BSD"&gt;*BSD&lt;/a&gt;, et une utilisation purement gui-oriented de &lt;a href="http://www.ubuntu-fr.org/"&gt;Ubuntu&lt;/a&gt;, je me suis dit qu'il serait intéressant de voir d'un peu plus près comment fonctionne une distribution orientée package, c'est à dire qui offre toute la souplesse d'installation de package comme dans les distributions *BSD, tout en permettant un maximum de configurabilité de ceux-ci.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dJYBJhDg2Hk/SUGJCXYxs1I/AAAAAAAAAM8/j1q0yf2wzL0/s1600-h/gtop-www.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 190px; height: 124px;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/SUGJCXYxs1I/AAAAAAAAAM8/j1q0yf2wzL0/s400/gtop-www.jpg" alt="" id="BLOGGER_PHOTO_ID_5278650911985611602" border="0" /&gt;&lt;/a&gt;Donc, je viens de faire mes premiers pas avec Gentoo Linux et son système de gestion de package nommé "Portage". &lt;a href="http://www.gentoo.org/doc/en/handbook/handbook-x86.xml"&gt;La documentation Gentoo&lt;/a&gt; est assez clair lorsqu'il s'agit de faire l'installation de base d'un système Linux sur un PC, le tout, en ligne de commandes pour autoriser un maximum de flexibilité.&lt;br /&gt;&lt;br /&gt;Quelques &lt;a href="http://linux.die.net/man/8/fdisk"&gt;fdisk&lt;/a&gt;, &lt;a href="http://linux.die.net/man/1/chroot"&gt;chroot&lt;/a&gt; et &lt;a href="http://linux.die.net/man/8/grub"&gt;grub&lt;/a&gt; plus tard, j'arrive enfin à rebooter et démarrer pour la première fois un Gentoo Linux sur mon vieux laptop, un &lt;a href="http://support.packardbell.com/fr/item/?m=home&amp;amp;sn=101981130134"&gt;Packard Bell Easynote C3300 (S/N:101981130134)&lt;/a&gt;. Oui, c'est vraiment un vieux portable, de 2004 si je me souviens bien. Bien que la soufflerie soit bruyante, l'ensemble de ce laptop reste assez cohérent avec 512Mo de mémoire (dont 32Mo de mémoire partagée pour la &lt;a href="http://www.winischhofer.eu/linuxsisvga.shtml"&gt;carte graphique sis740 intégrée&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;De base, la configuration &lt;a href="http://en.wikipedia.org/wiki/ACPI"&gt;ACPI&lt;/a&gt; marche bien (ce qui n'est pas le cas avec &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; par exemple) ce qui fait que la soufflerie fini quand même à s'arrêter au bout d'un moment.&lt;br /&gt;&lt;br /&gt;Le système Portage, et surtout la commande "emerge" est très pratique. Pour chaque package, il y a une gestion cohérente des numéros de version, et surtout des dépendances entre packages. Tout cela est écrit dans un fichier ebuild (1 fichier ebuild par package) qui rassemble l'ensemble des dépendances et contraintes sur le package.&lt;br /&gt;&lt;br /&gt;De plus, comme un package a des fonctionnalités en option (comme le support d'une interface x11 par exemple, ou l'utilisation de gtk plutôt que qt4) les options que l'on souhaite supporter sont stockées dans une variable d'environnement nommée USE. Celle-ci, définie globalement au niveau du fichier /etc/make.conf ou localement sur la même ligne de commande que emerge, permet de lister l'ensemble des drapeaux (USE flags) indicateur de fonctionnalités supportée.&lt;br /&gt;&lt;br /&gt;Par exemple, il suffit de mettre USE="gnome gtk -kde -qt3 -qt4" pour que tous les outils que vous téléchargez et compilez avec emerge le soit pour gnome et pas pour kde et les librairies qt.&lt;br /&gt;&lt;br /&gt;Jusqu'à quelques temps, tout allait bien, mais c'est quand j'ai voulu installer gnome, et donc xorg avant tout, que ça c'est mis à devenir plus compliqué.&lt;br /&gt;&lt;br /&gt;Moi, benoîtement, j'essaie un truc comme ça :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;emerge --pretend gnome&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;histoire de voir ce que va faire emerge pour installer gnome. C'est alors qu'il m'indique tout un tas de dépendances circulaires entre les drivers video et les composants de base xorg. Un rapide tour vers la documentation gentoo me laisse en plan avec cette phrase sibylline :&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Two (or more) packages you want to install depend on each other and can therefore not be installed. This is most likely a bug in the Portage tree. Please resync after a while and try again. You can also check bugzilla if the issue is known and if not, report it. &lt;/blockquote&gt;Même après:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;emerge --sync&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;emerge -auDN world&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;emerge --depclean&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;revdep-rebuild&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;un &lt;span style=";font-family:courier new;font-size:85%;"  &gt;emerge --pretend&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; gnome&lt;/span&gt;&lt;/span&gt; me renvoie encore des dépendances circulaires. Aaargs, y aurait-il un bug dans Gentoo lors de l'installation de base de X Windows. Franchement, j'en doute, j'imagine que si c'était le cas, il y aurait eu quelqu'un pour corriger ça tout de suite...&lt;br /&gt;&lt;br /&gt;Mais après une recherche avec mon ami Google, je m'aperçois que j'ai trop confiance dans la communauté open source et sa réactivité. Je tombe sur le &lt;a href="http://bugs.gentoo.org/show_bug.cgi?id=225091"&gt;bug report n°225091&lt;/a&gt; qui montre exactement mon problème. Bon alors là, je deviens plutôt sceptique quant à la robustesse de gentoo linux. Heureusement, je trouve le&lt;a href="http://bugs.gentoo.org/show_bug.cgi?id=225091#c17"&gt; commentaire #17&lt;/a&gt; pour m'aider et me permettre d'installer X Windows.&lt;br /&gt;&lt;br /&gt;C'est là que je me dis que je ne vais pas passer mon temps à résoudre des problèmes de dépendances circulaire alors que précisément, je pensais que Gentoo Linux avait soigné cet aspect dépendance. L'avenir me le dira, je n'abandonne pas maintenant un système qui me paraît malgré tout assez prometteur.&lt;br /&gt;&lt;br /&gt;Ce qui est sympa c'est de mettre en place son Linux, petit à petit, du CDROM vers le disque dur tout en pouvant faire des choix à chaque étape. Comme tout est en ligne de commande et qu'il n'y a pas d'installeur à proprement dit tel qu'on en a l'habitude sur Debian ou les *BSD, on arrive à beaucoup plus comprendre ce qui constitue le système, où se trouve tous les fichiers de configuration, d'initialisation, de gestion des packages, etc.&lt;br /&gt;&lt;br /&gt;C'est instructif, et permet de mieux comprendre Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-7775296892845028755?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/7775296892845028755/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=7775296892845028755' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7775296892845028755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7775296892845028755'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/12/gentoo-linux-grandeur-et-dcadence-de.html' title='Gentoo Linux, grandeur et décadence de Portage'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/SUGJCXYxs1I/AAAAAAAAAM8/j1q0yf2wzL0/s72-c/gtop-www.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-8398625483034691867</id><published>2008-11-08T08:00:00.000-08:00</published><updated>2011-01-26T02:37:10.359-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='méthodes'/><title type='text'>Dette technique - Comment la présenter ?</title><content type='html'>La dette technique &lt;a href="http://jradix.blogspot.com/2008/06/dette-technique-technical-debt.html"&gt;n'est pas quelque chose de nouveau&lt;/a&gt;, cette métaphore datant de 1992. On trouve finalement assez peu de textes sur le sujet, et elle mériterait certainement d'être approfondie. Steve McConnell a essayé de &lt;a href="http://www.construx.com/Page.aspx?hid=2801"&gt;classer cette dette dans des catégories&lt;/a&gt;. Il est allé jusqu'à essayer de montrer quel genre de dette pourrait être pris sur les projets. Andy Lester a présenté &lt;a href="http://www.media-landscape.com/yapc/2006-06-26.AndyLester/"&gt;la dette technique lors de la YAPC::NA 2006&lt;/a&gt;, dans le ton bien à lui, plein d'humour, de dérision, de conseils vraiment très concrets.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.media-landscape.com/yapc/2006-06-26.AndyLester/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SRYbhOFORbI/AAAAAAAAAMs/hp-YQGloDl8/s400/andy.jpg" alt="" id="BLOGGER_PHOTO_ID_5266427071786010034" border="0" /&gt;&lt;/a&gt;Personnellement, au travail,&lt;span style="font-weight: bold;"&gt; je rencontre souvent des présentations assez mornes dans leur forme&lt;/span&gt;, et c'est bien dommage. Andy arrive à faire rire son assistance, à faire participer et contribuer les personnes présentes, &lt;span style="font-weight: bold;"&gt;à rendre plaisante sa présentation&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;J'ai cru repérer chez Andy ce genre "d'effets" qui permettent de rendre attrayant une présentation :&lt;br /&gt;&lt;blockquote&gt;- mettre très peu de chose sur 1 slide : ne pas surcharger, &lt;span style="font-weight: bold;"&gt;avoir un seul message par slide&lt;/span&gt;, sans fioriture,&lt;br /&gt;&lt;br /&gt;- jouer sur l'enchaînement des slides pour introduire de l'humour&lt;br /&gt;&lt;br /&gt;- mettre des illustrations qui frappent l'esprit, souvent prises en dehors du monde l'informatique,&lt;/blockquote&gt;Une présentation, ça se prépare, et cette préparation à l'avance permet de "jouer" avec les slides. Les slides ne sont qu'un support, ne servent qu'à établir un fil de narration. Mais en fait, &lt;span style="font-weight: bold;"&gt;le plus important dans une présentation, c'est le discours, pas les slides&lt;/span&gt;. Il ne faut pas chercher à tout mettre dans les slides. Le discours doit être préparé et assimilé à l'avance, et les slides doivent permettre de montrer le cheminement de l'esprit sur un sujet.&lt;br /&gt;&lt;br /&gt;Ainsi, dans le discours on retrouve :&lt;br /&gt;&lt;blockquote&gt;- l'explication des énoncés affichés sur les slides,&lt;br /&gt;&lt;br /&gt;- des exemples concrets, de la vie réelle, vécus personnellement,&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;des questions fermées posées au public&lt;/span&gt;, notamment pour demander qui a vécu une telle situation (Andy lève le doigt pour montrer qu'il fait partie de la "réunion")&lt;/blockquote&gt;On retrouve ce genre de technique dans les présentations de Andy Lester, comme celle qu'il a tenue à l'OSCON 2007 :&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/G1ynTV_E-5s&amp;amp;hl=fr&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/G1ynTV_E-5s&amp;amp;hl=fr&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Si on essaie de mettre toute l'information dans les slides, cela devient vite un fourre-tout, et le présentateur n'a plus vraiment d'interêt, le public s'efforçant de lire l'information à l'écran. Pour partager une expérience, rien ne vaut la relation directe entre être humain, la discussion orale plutôt qu'écrite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-8398625483034691867?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/8398625483034691867/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=8398625483034691867' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8398625483034691867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8398625483034691867'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/11/dette-technique-comment-la-prsenter.html' title='Dette technique - Comment la présenter ?'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SRYbhOFORbI/AAAAAAAAAMs/hp-YQGloDl8/s72-c/andy.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4746928318733394039</id><published>2008-10-16T08:00:00.000-07:00</published><updated>2011-01-26T02:37:48.151-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><category scheme='http://www.blogger.com/atom/ns#' term='français'/><title type='text'>Contribuer en français à Wikipedia</title><content type='html'>Quand on parcours le site &lt;a href="http://fr.wikipedia.org/"&gt;wikipedia.org&lt;/a&gt;, on se rend compte rapidement qu'il y a beaucoup plus de pages en anglais qu'en français. Cela est bien naturel, il y a beaucoup plus de monde parlant plus ou moins couramment anglais que français. De plus, &lt;span style="font-weight: bold;"&gt;beaucoup de personnes parlant français contribuent à wikipedia en anglais&lt;/span&gt;, simplement du fait qu'ils ne souhaitent pas créer de nouvelles pages ou faire une grosse contribution et qu'aucune page en français n'existe sur leur sujet de prédilection.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wikipedia.org/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/SPzcdrjZQtI/AAAAAAAAAL0/iUmdweGkyC8/s400/wikipedia.png" alt="" id="BLOGGER_PHOTO_ID_5259320867327394514" border="0" /&gt;&lt;/a&gt;Face à cet état de fait, on pourrait avoir deux positions différentes :&lt;br /&gt;&lt;blockquote&gt;- abandonner le français, ne consulter et contribuer qu'en anglais à &lt;a href="http://en.wikipedia.org/"&gt;en.wikipedia.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;- contribuer uniquement en français mais se confronter à un manque flagrant de pages en français.&lt;/blockquote&gt;Si vous pensez que&lt;span style="font-weight: bold;"&gt; le français peut encore avoir une utilité pour comprendre le monde&lt;/span&gt;, on peut adopter la méthode suivante : quand vous consultez une page wikipedia en anglais, posez-vous la question : est-ce qu'il existe l'équivalent en français de cette page ? si oui, est-elle aussi riche que la page en anglais ?&lt;br /&gt;&lt;br /&gt;Si la page en français n'existe pas, vous pouvez, &lt;emp style="font-weight: bold;"&gt;au minimum&lt;/emp&gt;&lt;span style="font-weight: bold;"&gt;, traduire la page&lt;/span&gt;, anglais vers français. Si elle existe, vous pouvez vous assurer qu'il y a &lt;emp&gt;au minimum&lt;/emp&gt; toutes les informations déjà présentes dans la page en anglais.&lt;br /&gt;&lt;br /&gt;Avec cette petite méthode, cela permet :&lt;br /&gt;&lt;blockquote&gt;- de s'assurer qu'on a &lt;span style="font-weight: bold;"&gt;au moins autant d'information que sur la page en anglais&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;- de permettre à des contributeurs français de produire des contributions petites ou moyennes sur tous les sujets.&lt;/blockquote&gt;J'ai créé pour la première fois une page entière de Wikipedia en français : &lt;a href="http://fr.wikipedia.org/wiki/Probl%C3%A8me_de_satisfaction_de_contrainte"&gt;Problème de satisfaction de contrainte&lt;/a&gt; rejoignant &lt;a href="http://jradix.blogspot.com/2008/06/problmes-de-satisfaction-de-contraintes.html"&gt;mon intérêt pour ce sujet&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;J'ai traduit la page en langue anglaise : &lt;a href="http://en.wikipedia.org/wiki/Constraint_satisfaction_problem"&gt;Constraint Satisfaction Problem&lt;/a&gt;. Même si ce travail ne paraît pas très enrichissant au niveau de wikipedia, cela permet à mon avis de faire grandir globalement (quelque soit la langue) le contenu de cette encyclopédie. Ces pages traduites deviennent &lt;span style="font-weight: bold;"&gt;le support de nouvelles contributions&lt;/span&gt;, la page en français s'éloignant petit à petit de la traduction initiale. Il est toujours intéressant de vérifier qu'on a bien tous les sujets traités du côté anglais et du côté français, les différentes traductions s'émulant mutuellement.&lt;br /&gt;&lt;br /&gt;Bien sur, cette méthode peut s'appliquer avec n'importe quelle langue, pas seulement l'anglais et le français.&lt;br /&gt;&lt;br /&gt;Quand on contribue à wikipedia, il ne faut pas oublier toutes les dépendances de la page :&lt;br /&gt;&lt;blockquote&gt;- Ne pas oublier de mettre un référence sur la page des abbréviations (par exemple, dans mon cas : &lt;a href="http://fr.wikipedia.org/wiki/CSP"&gt;CSP&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;- Mettre la liste des traductions sur la page et sur la page en anglais.&lt;br /&gt;&lt;br /&gt;- Ajouter des liens externes vers des documents en langue française sur le sujet.&lt;br /&gt;&lt;/blockquote&gt;Vous pouvez suivre la page que vous avez créée/modifiée. Cela permet de se tenir au courant de l'évolution de vos contributions. Pour ma part, je rajoute dans mon &lt;a href="http://fr.wikipedia.org/wiki/Agr%C3%A9gateur"&gt;agrégateur de fils RSS&lt;/a&gt; le fil des dernières modifications de chaque page qui m'intéresse. Pour ce faire :&lt;br /&gt;&lt;blockquote&gt;- quand vous visualisez une page, cliquer sur l'onglet "historique" en haut de la page&lt;br /&gt;&lt;br /&gt;- à gauche dans la case "Boîte à outils" vous avez deux liens : un lien &lt;a href="http://fr.wikipedia.org/wiki/RSS_%28format%29"&gt;RSS&lt;/a&gt;, un autre au format &lt;a href="http://fr.wikipedia.org/wiki/Atom"&gt;Atom&lt;/a&gt;.&lt;/blockquote&gt;Mettez un des deux liens dans votre agrégateur, vous pourrez ainsi suivre toutes les modifications effectuées sur la page sans avoir à sortir de votre outil préféré. Le taux de mise à jour de ces fils sont assez variables selon la page concernée. Il y a malheureusement, quelque fois, des modifications qui sont dues à des volontés de détruire ou brouiller le contenu...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fr.wikipedia.org/wiki/Encyclop%C3%A9diste"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SPzfmND6pdI/AAAAAAAAAMM/2JWWlFo86qo/s1600/encyclo.png" alt="" id="BLOGGER_PHOTO_ID_5259324312296007122" border="0" /&gt;&lt;/a&gt;Wikipedia, bien qu'imparfaite, est une encyclopédie qui ne demande qu'à s'améliorer. On peut facilement critiquer son contenu du simple fait qu'il n'y a pas de revue explicite par des experts du domaine. Wikipedia essaie de rester neutre pour référencer le plus grand nombre de définitions. &lt;span style="font-weight: bold;"&gt;Mais une définition ne suffit pas à la compréhension du phénomène. L'explication des différents aspects d'une réalité passe par le recensement critique des points de vues existants.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4746928318733394039?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4746928318733394039/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4746928318733394039' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4746928318733394039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4746928318733394039'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/10/contribuer-en-franais-wikipedia.html' title='Contribuer en français à Wikipedia'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/SPzcdrjZQtI/AAAAAAAAAL0/iUmdweGkyC8/s72-c/wikipedia.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1776502376903074448</id><published>2008-10-12T08:00:00.000-07:00</published><updated>2011-01-26T02:38:31.765-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='journalisation'/><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><title type='text'>La journalisation n'est pas neutre</title><content type='html'>Je viens de lire ça sur le blog de Miško Hevery dans son billet &lt;a href="http://misko.hevery.com/2008/08/25/root-cause-of-singletons/"&gt;Root Cause of Singletons&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;The other kind of Singletons, which are semi-acceptable are those which don’t effect the execution of your code. Logging is perfect example. It is loaded with Singletons and global state. It is acceptable (as in it will not hurt you) because &lt;span style="font-weight: bold;"&gt;your application does not behave any different whether or not a given logger is enabled&lt;/span&gt;.&lt;br /&gt;&lt;/blockquote&gt;Non, non, non, comment peut-on dire qu'une application n'est pas affectée par l'exécution ou non d'un code dont elle dépend, surtout un système de journalisation (Logger). Un logger peut amener un tas de problèmes. Il suffit de jeter un coup d'oeil sur &lt;a href="http://logging.apache.org/log4j/1.2/changes-report.html#1.2.15"&gt;les changements effectués sur la dernière version stable de log4j&lt;/a&gt; par exemple pour prendre peur : une cinquantaine de bugs fixés il y a plus d'un an et pas de release stable officielle depuis malgré &lt;a href="https://issues.apache.org/bugzilla/report.cgi?y_axis_field=bug_status&amp;amp;cumulate=1&amp;amp;z_axis_field=&amp;amp;format=bar&amp;amp;x_axis_field=version&amp;amp;query_format=report-graph&amp;amp;short_desc_type=allwordssubstr&amp;amp;short_desc=&amp;amp;product=Log4j&amp;amp;version=1.2&amp;amp;long_desc_type=substring&amp;amp;long_desc=&amp;amp;bug_file_loc_type=allwordssubstr&amp;amp;bug_file_loc=&amp;amp;keywords_type=allwords&amp;amp;keywords=&amp;amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;emailassigned_to1=1&amp;amp;emailtype1=substring&amp;amp;email1=&amp;amp;emailassigned_to2=1&amp;amp;emailreporter2=1&amp;amp;emailcc2=1&amp;amp;emailtype2=substring&amp;amp;email2=&amp;amp;bugidtype=include&amp;amp;bug_id=&amp;amp;votes=&amp;amp;chfieldfrom=&amp;amp;chfieldto=Now&amp;amp;chfieldvalue=&amp;amp;action=wrap&amp;amp;field0-0-0=noop&amp;amp;type0-0-0=noop&amp;amp;value0-0-0="&gt;une quarantaine de bugs ouverts&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;Mais sans parler des bugs, si on réfléchi un minimum à ce que peut faire un Logger comme log4j, on s'aperçoit que, oui, votre application peut avoir un comportement différent simplement du fait de sa dépendance au Logger:&lt;br /&gt;&lt;br /&gt;- le logger peut écrire dans un fichier qui peut exploser le disque sur lequel votre application souhaite y écrire des données&lt;br /&gt;&lt;br /&gt;- le logger peut écrire dans une base de données et s'arroger pour un temps incertain des connexions qui sont normalement allouées à l'application&lt;br /&gt;&lt;br /&gt;- vous ne maitrisez aucunement le temps que passe le Logger à réaliser sa tâche (je vous conseille dans tous les cas, d'utiliser &lt;span style="font-weight: bold;"&gt;un système de logging asynchrone&lt;/span&gt; qui vous rend la main aussi vite que possible. Sous log4j, c'est &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/AsyncAppender.html"&gt;AsyncAppender&lt;/a&gt; qui se charge de ça)&lt;br /&gt;&lt;br /&gt;Dans tous les cas, il est important de savoir ce que fait exactement le logger, car &lt;span style="font-weight: bold;"&gt;le logging est peut-être l'activité la plus répétitive et la plus longue que va réaliser votre programme&lt;/span&gt;. Si vous ne voulez pas avoir la désagréable sensation d'être revenu au temps préhistorique (c'est-à-dire, comme sur une machine de plus de 3 ans) quand vous exécutez votre programme, ne laissez pas votre logger vous bouffer. Des systèmes comme Oracle Database Server ont poussé l'expertise jusqu'à en faire &lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/diag.htm#adminChapterDiagnosability"&gt;une science quasi-exacte&lt;/a&gt; ;)&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://www.qos.ch/shop/products/log4j/log4j-Manual.jsp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SPQQKtiMlOI/AAAAAAAAALs/g-hPjuwKp7g/s400/log4j.png" alt="" id="BLOGGER_PHOTO_ID_5256844441255974114" border="0" /&gt;&lt;/a&gt;Toute ligne de code a un impact sur l'exécution. J'ai bien dit "Toute ligne de code"&lt;span style="font-weight: bold;"&gt;, même celles qui théoriquement ne seront jamais appelées&lt;/span&gt;. Ça m'est déjà arrivé avec du code Visual Basic 6, il y a for longtemps il est vrai, mais c'est une expérience que je ne souhaite absolument pas renouveler...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1776502376903074448?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1776502376903074448/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1776502376903074448' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1776502376903074448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1776502376903074448'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/10/la-journalisation-nest-pas-neutre.html' title='La journalisation n&apos;est pas neutre'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/SPQQKtiMlOI/AAAAAAAAALs/g-hPjuwKp7g/s72-c/log4j.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-6774532760763026847</id><published>2008-10-08T08:00:00.000-07:00</published><updated>2011-01-26T02:39:03.105-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commerce'/><category scheme='http://www.blogger.com/atom/ns#' term='emploi'/><title type='text'>Moyens de mieux vivre la prestation de service</title><content type='html'>En France, le secteur des SSII (Sociétés de Service en Ingénierie Informatique) est fleurissant. Malheureusement, le travail réalisé par leurs employés n'est pas toujours des plus valorisant du simple fait que &lt;span style="font-weight: bold;"&gt;les clients ne maîtrisent pas ou peu l'outil informatique&lt;/span&gt;. Par conséquent, les contrats négociés entre client et SSII se basent surtout sur le &lt;a href="http://fr.wikipedia.org/wiki/TJM"&gt;TJM&lt;/a&gt; (Taux Journalier Moyen) plus que sur l'objectif de la mission de service ou l'expression précise du besoin métier.&lt;br /&gt;&lt;br /&gt;Nombre de missions au forfait ou en "assistance technique" sont très peu exprimées au niveau métier, la réflexion et &lt;span style="font-weight: bold;"&gt;l'analyse de système&lt;/span&gt; n'ayant pas ou peu été menée en interne chez le client avant de lancer un appel d'offre.&lt;br /&gt;&lt;br /&gt;Cet état de fait abouti souvent à faire travailler directement un employé de SSII dans les équipes du client sans objectif clair sur la mission de service. Cela est prohibé par la loi et nommé « prêt illicite de main-d’oeuvre » et « marchandage dans le cadre d’un contrat pour prestation de services ».&lt;br /&gt;&lt;br /&gt;Cette situation se rencontre malheureusement souvent. Elle est rarement poursuivi en justice, ou alors uniquement dans &lt;a href="http://www.leparisien.fr/hauts-de-seine-92/cegetel-poursuivi-pour-interim-deguise-07-10-2008-267403.php"&gt;des cas retentissants&lt;/a&gt;. Si vous vous demandez si vous êtes dans ce cas, demandez vous si vous vous sentez plus intégré dans les équipes du client qu'à votre SSII. Si c'est le cas, cela montre que la SSII n'apporte aucune valeur ajoutée au client, si ce n'est un rôle de société d'intérim.&lt;br /&gt;&lt;br /&gt;Pour éviter d'être dans cette situation là, vous pouvez entreprendre plusieurs actions :&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;demander un ordre de mission&lt;/span&gt; : quand une société vous envoie sur le site d'un client particulier de façon régulière, elle doit préciser les modalités de prestation par un "Ordre de Mission". Comme on peut le lire sur &lt;a href="http://www.munci.org/20060120/Presse-Le-ras-le-bol-des-informaticiens-en-regie"&gt;munci.org&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;L’ordre de mission constitue un contrat de prestation (&lt;span style="font-weight: bold;"&gt;Droit du commerce&lt;/span&gt;), signé en sus du contrat de travail (Droit du travail). Il doit être en effet libellé pour protéger le salarié détaché et non pas pour transformer son lien à l’employeur.&lt;br /&gt;&lt;br /&gt;Sans y mettre les formes, cela risque de permettre petit à petit de transformer le salarié "presté" de SSII en mission en clientèle en "indépendant" à qui l’on va réclamer des résultats. Alors que &lt;span style="font-weight: bold;"&gt;le Droit du Travail n’attend du salarié que des moyens, puisqu’il n’est pas fournisseur au même titre que le commerçant, sous-traitant, etc&lt;/span&gt;.&lt;/blockquote&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;définir la liste exhaustive des livrables attendus de la prestation de service&lt;/span&gt; : cela peut-être de simples compte-rendus, l'important est d'expliciter l'engagement de la SSII envers le client.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;organiser une réunion de suivi régulière&lt;/span&gt; de la prestation, au minimum tous les 3 mois : en effet, le suivi de mission a pour objectif de reprendre la liste des livrables définis dans l'ordre de mission et d'en vérifier l'avancement. Par un tel suivi, on empêche la mission de dévier vers des tâches non prévues initialement.&lt;br /&gt;&lt;br /&gt;- à chaque réunion de suivi, &lt;span style="font-weight: bold;"&gt;se demander si la SSII contribue d'une manière ou d'une autre à la prestation&lt;/span&gt;. Notamment, avez-vous des contacts avec des personnes pratiquant le même métier que vous, dans le même domaine. Avez-vous des échanges avec d'autres personnes de votre métier dans votre entreprise ?&lt;br /&gt;&lt;br /&gt;Le métier d'informaticien peut être très gratifiant quand on est capable de mesurer le travail réellement effectué, la valeur réellement apportée au client.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-6774532760763026847?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/6774532760763026847/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=6774532760763026847' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6774532760763026847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6774532760763026847'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/10/moyens-de-mieux-vivre-la-prestation-de.html' title='Moyens de mieux vivre la prestation de service'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2407062103008509032</id><published>2008-09-23T08:00:00.000-07:00</published><updated>2011-01-26T02:39:21.827-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='homebrew'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo ds'/><title type='text'>Transformer sa Nintendo DS en tablette graphique avec Colors!</title><content type='html'>Quand on plonge dans le monde des &lt;a href="http://jradix.blogspot.com/2008/09/nintendo-ds-hombrews-et-mgadmos.html"&gt;homebrews nintendo DS&lt;/a&gt;, on pense tout de suite à jouer à des jeux homebrews. Bien qu'intéressants, les jeux homebrew ont rarement toute la richesse graphique et sonore des jeux commerciaux, et c'est normal. il est toujours coûteux de produire du contenu. Il n'y pas que des jeux parmi les homebrews, il y a des applications. Et c'est à mon avis là où le homebrew prend tout son sens. &lt;span style="font-weight: bold;"&gt;Grâce à ces applications, on peut transformer sa nintendo DS en véritable PDA ou même en iPod survitaminé&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;- un système multimedia de visionnage de video, de lecture MP3 et de lecture de eBook : &lt;a href="http://en.wikipedia.org/wiki/MoonShell"&gt;MoonShell&lt;/a&gt;&lt;br /&gt;- un système d'organisation de son travail, genre PDA : &lt;a href="http://www.dragonminded.com/?loc=ndsdev/DSOrganize"&gt;DSOrganize&lt;/a&gt;&lt;br /&gt;- un système riche de lecture de eBook et de Bandes Dessinées : &lt;a href="http://gnese.free.fr/NDS/ComicBookDS/"&gt;ComicBookDS&lt;/a&gt;&lt;br /&gt;- des &lt;a href="http://gbatemp.net/index.php?download=2955"&gt;browsers&lt;/a&gt; &lt;a href="http://okiwi.blogspot.com/"&gt;Web&lt;/a&gt; via Wifi&lt;br /&gt;&lt;br /&gt;Il y a des tonnes d'applications, et on se demande où est la limite quand on voit les capacités d'ouverture de la console (Wifi). Là où j'ai vraiment été bluffé, c'est avec le homebrew &lt;a href="http://www.collectingsmiles.com/colors/"&gt;Colors!&lt;/a&gt;. C'est un outil qui permet de dessiner avec le stylet de la console en tirant partie de l'écran tactile, de sa résolution &lt;span style="font-weight: bold;"&gt;et du niveau de pression&lt;/span&gt;. En effet, &lt;span style="font-weight: bold;"&gt;la nintendo DS est une véritable tablette graphique&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.collectingsmiles.com/colors/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SNo2P_otn_I/AAAAAAAAAK0/NPNCvMa5lRU/s400/logo.png" alt="" id="BLOGGER_PHOTO_ID_5249567964061868018" border="0" /&gt;&lt;/a&gt;Mais vous allez me dire, l'écran est tout petit ! Oui, ce n'est pas un immense écran, mais avec la fonctionnalité de zoom, avec la boîte de dialogue Palette très bien conçue, puissante bien que très simple, on est capable de réaliser de véritables dessins, &lt;span style="font-weight: bold;"&gt;aussi bien que sur du papier&lt;/span&gt;. Vous allez dire que là, c'est pas possible, mais je pense exactement ça :&lt;span style="font-weight: bold;"&gt; avec la nintendo DS et Colors!, vous avez un cahier virtualisé pour prendre des croquis sur le vif, aussi pratique qu'avec un bloc note.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si vous pensez vraiment qu'il est impossible de réaliser une œuvre de bonne qualité avec une simple nintendo DS, allez voir cette &lt;a href="http://colors.brombra.net/"&gt;gallerie de dessins réalisés avec Colors!&lt;/a&gt;, et révisez votre jugement. La cerise sur le gateau : Colors! est aussi disponible pour votre &lt;a href="http://www.collectingsmiles.com/colors/iphone.htm"&gt;iPhone&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://colors.brombra.net/details/6569-wooha_by_madwurmz.com.php"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SNo8WMwqtwI/AAAAAAAAAK8/xylZDvkUu_Q/s400/eye.jpg" alt="" id="BLOGGER_PHOTO_ID_5249574667733874434" border="0" /&gt;&lt;/a&gt;Une fonctionnalité intéressante de Colors! après coup est l'enregistrement du séquencement de tous les traits. Vous pouvez rejouer le traçage du dessin depuis le début. On trouve pleins de &lt;a href="http://www.youtube.com/watch?v=_WhfZmTv7ew"&gt;videos montrant le traçage de dessins Colors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Quand on voit la facilité avec laquelle on arrive à dessiner avec un simple stylet et un écran tactile, il est clair que &lt;span style="font-weight: bold;"&gt;la tablette graphique est l'outil indispensable pour faire du graphisme sur votre ordi&lt;/span&gt;. De nombreuses tablettes graphiques existent, &lt;a href="http://www.wacom-europe.com/fr/"&gt;Wacom&lt;/a&gt; étant le leader sur ce marché. Si vous souhaitez en acheter une, faire attention, bien sur à la taille mais aussi à la résolution &lt;span style="font-weight: bold;"&gt;et au niveau de pression&lt;/span&gt;. Plus il y a de niveaux de pressions et une bonne résolution, plus vous aurez l'impression de réellement dessiner sur du papier.&lt;br /&gt;&lt;br /&gt;Je n'ai pas essayé, mais il paraît qu'&lt;span style="font-weight: bold;"&gt;une tablette graphique pour remplacer la souris de l'ordi, c'est excellent&lt;/span&gt;. Je n'ai pas essayé, mais c'est clair que quand on y réfléchi, avec de la pratique, ça doit être bien plus précis et rapide que de déplacer le pointeur par la souris. Mais peut-être qu'il faut, pour cette usage là, ne pas prendre une grande tablette pour éviter de fatiguer son bras, son poignet et sa main avec des mouvements trop grands. Il existe &lt;a href="http://www.amazon.fr/Wacom-Bamboo-Num%C3%83%C2%A9riseur-%C3%83%C2%A9lectromagn%C3%83%C2%A9tique-filaire/dp/B000SQLRJE"&gt;des tablettes graphiques relativement peu chères&lt;/a&gt;, &lt;span style="font-weight: bold;"&gt;ça peut faire un beau cadeau de Noël&lt;/span&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2407062103008509032?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2407062103008509032/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2407062103008509032' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2407062103008509032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2407062103008509032'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/09/transformer-sa-nintendo-ds-en-tablette.html' title='Transformer sa Nintendo DS en tablette graphique avec Colors!'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/SNo2P_otn_I/AAAAAAAAAK0/NPNCvMa5lRU/s72-c/logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4210195158149139539</id><published>2008-09-19T08:00:00.000-07:00</published><updated>2011-01-28T04:25:11.396-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sécurité'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo ds'/><title type='text'>Hacking de la sécurité de la Nintendo DS</title><content type='html'>Il est assez impressionnant de voir tous les efforts qui ont été déployés pour permettre de réaliser un développement d'application &lt;a href="http://jradix.blogspot.com/2008/09/nintendo-ds-hombrews-et-mgadmos.html"&gt;"homebrew" pour Nintendo DS&lt;/a&gt;. La réussite commerciale d'une console de jeu tient à la fiabilité de son système de sécurité anti-copie. Les jeux sur cartouche officielle nintendo DS sont cryptés selon un algorithme secret qui l'est resté plusieurs années.&lt;br /&gt;&lt;br /&gt;Les premiers logiciels "faits à la maison" pour nintendo DS ont pu voir le jour par la découverte de bug dans le firmware de la console. Une fois un bug détecté, le hacker de la nintendo DS peut en tirer partie pour rediriger le &lt;a href="http://en.wikipedia.org/wiki/Program_counter"&gt;Program Counter&lt;/a&gt; sur la première instruction de l'homebrew. Ce premier logiciel s'appelle PassMe.&lt;br /&gt;&lt;br /&gt;Nintendo DS ayant eu vent de cette technique a immédiatement corrigé son bug et livra alors des nintendo DS avec un firmware corrigé. Un nouveau bug a été découvert dans cette nouvelle version du firmware qui a permis de mettre au point une nouvelle carte appelée PassMe2.&lt;br /&gt;&lt;br /&gt;Cela rappelle une première évidence : &lt;span style="font-weight: bold;"&gt;la qualité d'un logiciel est l'aspect majeur de sa sécurité.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Selon, la version du firmware, il fallait à l'époque faire tourner ou une carte PassMe ou une carte PassMe2, or il n'y avait pas de possibilité de voir sur quel firmware fonctionne une nintendo DS. Hasard heureux, quelqu'un c'est aperçu par une combinaison d'actions que la nintendo DS était capable d'indiquer le numéro de version du firmware : en forçant la NDS a planter, celle-ci répond par &lt;a href="http://en.wikipedia.org/wiki/Nintendo_DS_homebrew#Checking_the_firmware_version.7FUNIQ4a5e3d0b60ab127d-nowiki-00000001-QINU.7F1.7FUNIQ4a5e3d0b60ab127d-nowiki-00000002-QINU.7F"&gt;des écrans de diverses couleurs&lt;/a&gt;, caractéristiques de la version du firmware !&lt;br /&gt;&lt;br /&gt;Mais il n'a pas fallu très longtemps pour qu'un hacker arrive à backuper le firmware et a en faire une ingénierie inverse pour en trouver l'algorithme de cryptage. &lt;span style="font-weight: bold;"&gt;Depuis ce jour là, tout carte homebrew pu se faire passer pour un véritable jeu sous licence Nintendo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Les hackers de tout poils s'acharnent à trouver comment faire fonctionner n'importe quel logiciel sur n'importe quel matériel. Nintendo essayant vainement de &lt;a href="http://www.tomsguide.com/us/Nintendo-Lawsuit-R4-Revolution,news-2124.html"&gt;stopper l'hémorragie.&lt;/a&gt; D'autres cherchent à savoir comment pourrait être empêché toute corruption de machine. C'est ce que montre brillamment Michael Steil et Felix Domke dans leur présentation &lt;a href="http://www.youtube.com/watch?v=uxjpmc8ZIxM"&gt;The XBox360 Security System and its Weaknesses&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/uxjpmc8ZIxM&amp;amp;color1=11645361&amp;amp;color2=13619151&amp;amp;fs=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/uxjpmc8ZIxM&amp;amp;color1=11645361&amp;amp;color2=13619151&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" wmode="transparent" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;C'est vraiment une guerre de l'homme contre l'homme, du hacker contre le hacker autour d'une même ressource qui ne souhaite qu'être comprise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4210195158149139539?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4210195158149139539/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4210195158149139539' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4210195158149139539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4210195158149139539'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/09/hacking-de-la-scurit-de-la-nintendo-ds.html' title='Hacking de la sécurité de la Nintendo DS'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-8055445385384467988</id><published>2008-09-15T08:00:00.000-07:00</published><updated>2011-01-26T02:40:45.440-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='langage'/><category scheme='http://www.blogger.com/atom/ns#' term='RoR'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java mis au rebut par Sun</title><content type='html'>Le titre un brin racoleur de ce billet d'humeur cache une tendance beaucoup plus profonde qu'il n'y paraît. Aujourd'hui Sun vient d'ouvrir son nouveau site de "forge" de projet open source : &lt;a href="http://www.kenai.com/"&gt;kenai.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ouvrir un tel site pourrait sembler une bonne chose, mais il n'en ai rien puisque toute initiative "open source" autour d'un concept déjà largement développé est &lt;a href="http://jradix.blogspot.com/2008/08/la-lecture-plaisante-de-code-source-ou.html"&gt;redondante, et donc contre-productive&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mais le pire n'est pas ce n-ième "sourceforge" qui se veut révolutionnaire près de &lt;a href="http://web.archive.org/web/*/http://sourceforge.net/"&gt;&lt;span style="font-weight: bold;"&gt;10 ans après l'apparition de sourceforge.net&lt;/span&gt;&lt;/a&gt;. Ce n'est pas non plus parce que ce site porte le nom d'un &lt;a href="http://en.wikipedia.org/wiki/Kenai_%28Brother_Bear%29"&gt;gros ours balourd de Walt Disney&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.wikipedia.org/wiki/Kenai_%28Brother_Bear%29"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SNP_15OGEgI/AAAAAAAAAJ4/M-JosYEEBPs/s400/Brthrbr2-kenai-ice.png" alt="" id="BLOGGER_PHOTO_ID_5247819292174848514" border="0" /&gt;&lt;/a&gt;Non, le pire c'est bien sur que &lt;span style="font-weight: bold;"&gt;ce site ne tourne pas en Java mais en Ruby on Rails !&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On sent bien en ce moment que Sun essaie de s'ouvrir à d'autres technologies, parce que ces clients eux-même ont envi de passer moins de temps à debugger des machines à gaz pour simplement servir quelques formulaires Web.&lt;br /&gt;&lt;br /&gt;Quand on regarde du côté des autres promoteurs initiaux de Java, on vois partout ce penchant du côté des langages dit de "script". Ça me rappelle le début des années 90 avec cette même tendance à aller plus vite pour développer. C'est toujours à peu près le même scénario :&lt;br /&gt;&lt;blockquote&gt;- des applications sont codées dans un langage dit &lt;a href="http://en.wikipedia.org/wiki/Structured_programming"&gt;structuré&lt;/a&gt; (= &lt;a href="http://en.wikipedia.org/wiki/Typed_language"&gt;typé&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;- on s'aperçoit que ces applications sont coûteuses en maintenance car   trop compliquées pour le développeur de base.&lt;br /&gt;&lt;br /&gt;- on se tourne vers des langages à &lt;a href="http://en.wikipedia.org/wiki/Typed_language#Dynamic_typing"&gt;typage dynamique&lt;/a&gt; ou non typé, des langages léger,   "agiles", de script&lt;br /&gt;&lt;br /&gt;- des applications sont développées beaucoup plus rapidement, mais les développeurs codent dans tous les sens, sans aucune structure claire&lt;br /&gt;&lt;br /&gt;- on s'aperçoit qu'à terme, ça coûte toujours aussi cher de développer une application&lt;br /&gt;&lt;br /&gt;- on cherche alors un nouveau langage structuré qui devrait permettre de cadrer le travail des développeurs et obliger à avoir du code   "propre".&lt;br /&gt;&lt;br /&gt;- retour à la première étape.&lt;br /&gt;&lt;/blockquote&gt;Tout cela cache une réalité bien plus banale et répandue : la volonté de &lt;span style="font-weight: bold;"&gt;mécaniser la production d'application&lt;/span&gt; par la création de schéma de pensée en apparence structurant. Mais cela abouti à un "déni de réalité", à un refus de vouloir considérer la "construction" de programme pour ce qu'elle est : &lt;span style="font-weight: bold;"&gt;une activité de réflexion&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Tant que ce déni de réalité perdurera, une attention trop faible sera porté sur le processus créatif sous-jacent à la programmation. Et les entreprises auront encore besoin de nombreuses "ressources humaines" pendant des années pour produire des applications de "qualité".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-8055445385384467988?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/8055445385384467988/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=8055445385384467988' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8055445385384467988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/8055445385384467988'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/09/java-mis-au-rebut-par-sun.html' title='Java mis au rebut par Sun'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SNP_15OGEgI/AAAAAAAAAJ4/M-JosYEEBPs/s72-c/Brthrbr2-kenai-ice.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-3880780168460573432</id><published>2008-09-11T08:00:00.000-07:00</published><updated>2011-01-28T04:26:26.590-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sécurité'/><category scheme='http://www.blogger.com/atom/ns#' term='productivité'/><title type='text'>KeyPass, OpenID et mots de passe dur</title><content type='html'>Un de mes amis s'est fait piquer son compte &lt;a href="http://ebay.fr/"&gt;eBay&lt;/a&gt; parce qu'il n'avait pas mis de mot de passe dur. Bien sur, eBay ne peut rien faire contre quelqu'un qui arrive à se connecter normalement sur son site avec le bon mot de passe. Autant dire que cet ami était furax de ne pouvoir rien faire.&lt;br /&gt;&lt;br /&gt;Le problème c'est que sur la plupart des sites, pour utiliser des services, même gratuits, il est demandé de créer un compte avec un mot de passe. Pour que de nombreuses internautes créent leur compte, les sites n'empêchent pas l'utilisation de mot de passe faible, facilement "crackable". Il y a pourtant des sites pour lesquels on ne veut pas avoir de problème de sécurité, comme par exemple son compte email principal.&lt;br /&gt;&lt;br /&gt;Or avec la multiplications des comptes, chaque internaute finit par devoir se rappeler d'une multitude de mots de passes (forcément des mots de passe faible). Il y a plusieurs solutions à cela :&lt;br /&gt;&lt;br /&gt;- soit les sites propose de se connecter via &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; : il suffit d'avoir un compte chez un fournisseur OpenId pour que tous les sites compatibles puissent se baser sur se compte OpenId pour vérifier les informations de l'utilisateur. De nombreux sites proposent &lt;span style="font-weight: bold;"&gt;l'hébergement de compte OpenId par défaut&lt;/span&gt;, comme Blogger ou Orange. Malheureusement, les sites supportant l'OpenId sont encore trop rare. Mais bon, ... autant avoir un compte OpenID quelque part.&lt;br /&gt;&lt;br /&gt;- soit on utilise un logiciel comme l'excellent &lt;a href="http://keepass.info/"&gt;KeyPass&lt;/a&gt; : celui propose de stocker dans une base de données protégée par mot de passe ou via un certificat, l'ensemble des mots de passe que l'on possède. Il propose de &lt;span style="font-weight: bold;"&gt;générer des mots de passe dur&lt;/span&gt; pour chacun d'eux. On n'a donc plus qu'à se rappeler que d'un seul mot de passe (ou avoir un certificat). Je ne pensais pas qu'un tel logiciel soit vraiment utile même en entreprise, mais après utilisation et stockage de tout mes mots de passe, je m'aperçois que, rien que pour l'entreprise ou je travaille, &lt;span style="font-weight: bold;"&gt;j'ai déjà une vingtaine de mots de passe différents à retenir&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Avec ces deux méthodes, on est paré pour affronter la cohue de crackers déambulant dans les chemins dangereux de l'information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-3880780168460573432?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/3880780168460573432/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=3880780168460573432' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3880780168460573432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3880780168460573432'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/09/keypass-openid-et-mots-de-passe-dur.html' title='KeyPass, OpenID et mots de passe dur'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-6053899970106855280</id><published>2008-09-07T08:00:00.000-07:00</published><updated>2011-01-26T02:41:32.561-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='homebrew'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo ds'/><category scheme='http://www.blogger.com/atom/ns#' term='matériel'/><title type='text'>Nintendo DS, hombrews et mégadémos</title><content type='html'>Quand on commence l'informatique, quand on a pour seul bagage la passion et pour seule alliée l'ignorance, le choix de la plate-forme de développement pour laquelle on va dévouer un nombre d'heures inimaginable pour en tirer quelque chose, devient crucial. De ce choix va dépendre la transformation de cette passion en véritable hobby, voire même en métier pour tout une vie.&lt;br /&gt;&lt;br /&gt;Pour des générations d'informaticiens, tout est parti de la volonté de faire réaliser à une machine ce pour quoi elle n'a pas été conçue, d'aller au delà de ce qu'elle est sensée faire. Pour ma génération, nombreux se sont fait les mains sur des machines aux doux noms de &lt;a href="http://en.wikipedia.org/wiki/Sinclair_ZX81"&gt;ZX81&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Sinclair_ZX_Spectrum"&gt;ZXSpectrum&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Amstrad_CPC"&gt;Amstrad CPC&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Commodore_64"&gt;C64&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Atari_st"&gt;Atari ST&lt;/a&gt; ou &lt;a href="http://en.wikipedia.org/wiki/Amiga"&gt;Amiga&lt;/a&gt;. Les heures acharnées à produire de nouveaux effets, multipliées par le nombre de passionnés de cette époque là, a abouti à ce qu'on appelle la &lt;a href="http://en.wikipedia.org/wiki/Demoscene"&gt;Scène Démo&lt;/a&gt;. La vision de démos telle que la &lt;a href="http://www.amigademopodcast.com/2006/05/03/demo-008-rsi-megademo-red-sector-inc/"&gt;RSI Megademo&lt;/a&gt; a produit sur moi une impression vraiment indélébile.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pouet.net/prod.php?which=3119"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/SNclzRHrIXI/AAAAAAAAAKI/_3vFof_cKQM/s400/3119.gif" alt="" id="BLOGGER_PHOTO_ID_5248705453422748018" border="0" /&gt;&lt;/a&gt;Pour réaliser ces démos, et pour que ça soit fun, le but était bien sur de parler directement à la machine, pas de parler à un &lt;a href="http://en.wikipedia.org/wiki/Software_bloat"&gt;bloatware&lt;/a&gt; ou un bugware comme le système d'exploitation. Pour un gosse qui commence à se passionner, l'important est d'avoir accès à toute la machine, de pouvoir en faire ce qu'il souhaite, une sorte de bac à sable. Ce qui était vraiment le plus sympa était de voir qu'une machine en apparence limitée pouvait se surpasser.&lt;br /&gt;&lt;br /&gt;Aujourd'hui, &lt;span style="font-weight: bold;"&gt;j'ai retrouvé toutes les joies de mon enfance (snif:) avec la &lt;a href="http://en.wikipedia.org/wiki/Nintendo_ds"&gt;nintendo DS&lt;/a&gt;&lt;/span&gt;. Cette console portable est si bien conçue qu'on a envie d'en faire quelque chose d'extraordinaire.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.wikipedia.org/wiki/Nintendo_DS"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SNcmZVzyWEI/AAAAAAAAAKQ/qxpugtFrMo0/s400/660px-DSLite_white_trans.png" alt="" id="BLOGGER_PHOTO_ID_5248706107516540994" border="0" /&gt;&lt;/a&gt;Pensez à tout ce que l'on peut faire avec deux écrans, dont un écran tactile, un microphone... et tout ça &lt;span style="font-weight: bold;"&gt;pour beaucoup moins cher qu'un véritable ordinateur&lt;/span&gt;. A mon avis, les gosses d'aujourd'hui ont tout intérêt à se faire la main sur ce genre de machine bien plus abordable qu'un PC, et surtout, bien plus fun :) Il n'y a qu'à installer 2 ou 3 trucs sur le PC de papa sans avoir besoin de faire planter Windows définitivement.&lt;br /&gt;&lt;br /&gt;Tout d'abord, la nintendo DS n'est pas du tout une console banale, mais tout simplement un véritable ordinateur très évolué basé sur une double &lt;a href="http://en.wikipedia.org/wiki/ARM_architecture"&gt;architecture ARM&lt;/a&gt; (ARM7TDMI, ARM946E-S). Cette architecture est une merveille de conception, elle a pour grand avantage de consommer très peu d'énergie et de permettre donc une autonomie bien meilleure que celle d'un PC portable par exemple.&lt;br /&gt;&lt;br /&gt;Ensuite, il faut un moyen de faire exécuter du code dessus. Il existe de nombreux systèmes à base de cartouches plus ou moins évolués. Pour ma part, après comparaison, j'ai opté pour la &lt;a href="http://www.cyclopsds.com/cgi-bin/cyclods/engine.pl?page=products-cyclodsevolution"&gt;CycloDS Evolution&lt;/a&gt; surtout pour les fonctions suivantes :&lt;br /&gt;&lt;blockquote&gt;- fonctionne sur slot-1, pas besoin de faire du &lt;a href="http://en.wikipedia.org/wiki/PassMe"&gt;PassMe&lt;/a&gt; ou autre techniques de ce genre, et pas besoin d'avoir de carte GBA.&lt;br /&gt;&lt;br /&gt;- permet de lire les cartes &lt;a href="http://en.wikipedia.org/wiki/MicroSDHC"&gt;microSDHC&lt;/a&gt; de 4Go à 32Go,&lt;br /&gt;&lt;br /&gt;- auto-patching &lt;a href="http://dldi.drunkencoders.com/"&gt;DLDI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- nombreuses fonctions embarquées (soft reboot, autolaunch de la dernière appli)&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cyclopsds.com/cgi-bin/cyclods/engine.pl?page=products-cyclodsevolution"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SNckhvF3nEI/AAAAAAAAAKA/BRJvQo45l7g/s400/evo-case-and-cart.jpg" alt="" id="BLOGGER_PHOTO_ID_5248704052718967874" border="0" /&gt;&lt;/a&gt;Je l'ai trouvée sur &lt;a href="http://metashop-fr.com/modules.php?name=catalog&amp;amp;file=product_info&amp;amp;cPath=39&amp;amp;products_id=2093"&gt;Metashop&lt;/a&gt;, elle m'est arrivée assez rapidement et sans problème. Par contre, j'ai acheté &lt;a href="http://www.amazon.fr/gp/product/B000VX4W78"&gt;une carte 4Go MicroSDHC sur Amazon&lt;/a&gt;, c'est beaucoup moins cher que chez Metashop. Attention à prendre une carte de class 4 minimum (4Mb/s) sinon, risque de ralentissement quasi-garanti.&lt;br /&gt;&lt;br /&gt;Avec un tel matériel, faire fonctionner un &lt;a href="http://en.wikipedia.org/wiki/Nintendo_DS_homebrew"&gt;homebrew&lt;/a&gt; sur sa console est un jeu d'enfant :&lt;br /&gt;&lt;blockquote&gt;- glisser la carte microSDHC dans la clé USB fournie par CycloDS&lt;br /&gt;&lt;br /&gt;- brancher cette clé USB sur un PC et y déposer directement les fichiers .nds non-patché DLDI (par défaut de toute manière)&lt;br /&gt;&lt;br /&gt;- mettre ensuite la carte microSDHC dans la carte CycloDS Evolution.&lt;br /&gt;&lt;br /&gt;- allumer la nintendo DS sur cette carte CycloDS.&lt;/blockquote&gt;Et voilà, on se retrouve avec un navigateur, genre Windows Explorer sur sa nintendo DS et cela permet de sélectionner le homebrew à exécuter. Le gamin que je suis resté a trouvé ce &lt;a href="http://osdl.sourceforge.net/main/documentation/misc/nintendo-DS/homebrew-guide/HomebrewForDS.html"&gt;tutorial &lt;/a&gt;bien complet pour commencer à développer soi-même un homebrew. Le site de &lt;a href="http://drunkencoders.com/"&gt;drunkencoders.com&lt;/a&gt; est une référence pour la programmation avec plein de liens et de tutos.&lt;br /&gt;&lt;br /&gt;Et forcément, il y en a qui ont eu la bonne idée de porter &lt;a href="http://www.dslinux.org/"&gt;Linux sur Nintendo DS&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-6053899970106855280?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/6053899970106855280/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=6053899970106855280' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6053899970106855280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6053899970106855280'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/09/nintendo-ds-hombrews-et-mgadmos.html' title='Nintendo DS, hombrews et mégadémos'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/SNclzRHrIXI/AAAAAAAAAKI/_3vFof_cKQM/s72-c/3119.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4315307138840859758</id><published>2008-09-03T08:00:00.000-07:00</published><updated>2011-01-26T02:42:10.017-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='google chrome'/><title type='text'>La Guerre des browsers est relancée !</title><content type='html'>Oui, ça fait déjà un petit moment que la &lt;a href="http://en.wikipedia.org/wiki/Browser_wars"&gt;guerre du navigateur Web&lt;/a&gt; est relancée avec de superbes logiciels comme &lt;a href="http://www.apple.com/safari/"&gt;Safari&lt;/a&gt;, &lt;a href="http://www.opera.com/"&gt;Opera &lt;/a&gt;ou &lt;a href="http://www.mozilla-europe.org/fr/firefox/"&gt;Firefox&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aujourd'hui c'est Google qui s'y met et c'est certainement pour faire avancer à grand pas le sujet. En effet, grâce à &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt;, Google montre clairement sa volonté de faire du Web la seule et unique plateforme de travail, de faire de l'application client Lourd une technologie du passé.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/chrome"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SL7r4UqZ6WI/AAAAAAAAAI8/-eZidzA-evg/s400/logo_sm.jpg" alt="" id="BLOGGER_PHOTO_ID_5241886369157605730" border="0" /&gt;&lt;/a&gt;On peut se demander pourquoi Google se met-il à faire encore un nouveau browser alors que de nombreuses alternatives existent déjà. C'est qu'il souhaite clairement innover dans le sens qu'ils souhaitent, c'est à dire une plateforme d'exécution complètement reliée au Web, aux applications en réseau, ... &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;et aux publicités ciblées qui ont fait la fortune de Google&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si Google fait du logiciel &lt;a href="http://www.opensource.org/"&gt;opensource&lt;/a&gt;, ce n'est pas par philanthropie, mais c'est parce qu'&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;il ne tire pas leur revenu de la vente de logiciels mais par l'utilisation de leur logiciel.&lt;/span&gt; Plus leurs logiciels sont utilisés, plus ça leur rapporte par des publicité ultra ciblées.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comme le fait remarquer Eric Schmitt dans &lt;a href="http://www.youtube.com/watch?v=cl8bEApvblg"&gt;"The Future Of Technology"&lt;/a&gt;, &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;le marché des médias (communication/publicité) est beaucoup plus gros que le marché de l'IT&lt;/span&gt;. Le business case de Google est d'arriver à cibler au maximum les clients des publicitaires, et d'obtenir un maximum de clic significatif sur ces pubs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=cl8bEApvblg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SL7uyjAYwrI/AAAAAAAAAJE/g4Udz_mkFjk/s400/EricSchmitt.png" alt="" id="BLOGGER_PHOTO_ID_5241889568463569586" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;It's gonna be huge !&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ainsi, le développement de solutions informatique pour Google n'est qu'un moyen pour arriver à toucher à ce marché. Mais Google n'a que très peu de revenu grâce à la vente de ces technologies (technologies de recherche notamment).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Même si j'ai noté quelques bugs par ci par là sur Google Chrome (petit problème de menu contextuel Copier/Coller sur champ de formulaire), l'outil semble déjà bien abouti et assez stable. Les applications comme Gmail ou GoogleReader tourne très vite, même si sur Firefox, s'était déjà assez rapide. &lt;span style="font-weight: bold;"&gt;Google Chrome prendra tout son sens avec la multiplication des "Core" dans les processeurs&lt;/span&gt;, grâce au choix qu'ils ont fait concernant la création d'un processus à part entière par onglet.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Reste plus qu'à souhaiter que Google innove un maximum sur ce browser, en espérant que cela puisse réellement mener à des applications aussi rapide et aussi riche que les applications client lourde. &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;L'important c'est que les applications Web arrive à tirer profit de leur nature distribuée&lt;/span&gt; pour proposer des services qu'on pourrait difficilement mettre en oeuvre sur des RDA (Rich Desktop Application) classiques.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Il paraît que Microsoft a encore 75% du marché des navigateurs, Microsoft finira bien par se bouger et a enfin suivre les innovations du marché si Google Chrome se répand. Google veut certainement produire des applications bureautique plus riche et plus performantes.  &lt;a href="http://docs.google.com/"&gt;Google Docs&lt;/a&gt; est bien, mais n'a rien de comparable avec une suite bureautique comme Microsoft Office.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Peut-être qu'à terme, ce sera à Microsoft de convertir son Microsoft Office en Web 2.0 ?  Tout le problème pour Microsoft c'est que justement, leur modèle économique est basé sur la vente de licence de logiciel, pas sur l'utilisation des logiciels. Ca risque d'être un moment très dur pour Microsoft s'il est obligé de suivre Google. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4315307138840859758?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4315307138840859758/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4315307138840859758' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4315307138840859758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4315307138840859758'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/09/la-guerre-des-browsers-est-relance.html' title='La Guerre des browsers est relancée !'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SL7r4UqZ6WI/AAAAAAAAAI8/-eZidzA-evg/s72-c/logo_sm.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2140082263858949124</id><published>2008-09-01T08:00:00.000-07:00</published><updated>2011-01-26T02:42:39.645-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='méthodes'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Jargon, effets de mode et confusions dans l'informatique</title><content type='html'>En lisant de nombreux blogs sur l'informatique, j'ai comme l'impression que &lt;span style="font-weight: bold;"&gt;de nombreux débats sont futiles voire contreproductifs&lt;/span&gt;. Ça me semble particulièrement le cas dans le monde de "&lt;a href="http://agilesucks.org/"&gt;l'Agile Development&lt;/a&gt;" ainsi que tout ce qui tourne autour de la &lt;a href="http://soa.sys-con.com/node/133763"&gt;SOA&lt;/a&gt; (Service Oriented Architecture)&lt;br /&gt;&lt;br /&gt;Beaucoup d'opportunistes s'empressent de construire un &lt;a href="http://steve-yegge.blogspot.com/2006/09/good-agile-bad-agile_27.html"&gt;jargon&lt;/a&gt; pour représenter des concepts qui n'en sont pas. Pourquoi tous ces termes lourds et vagues comme "agilité" "orientation service" &lt;a href="http://www.infoq.com/news/2008/09/Orchestration"&gt;"orchestration", "chorégraphie"&lt;/a&gt;, ... L'utilisation d'un de ces termes ne fait pas avancer un chouilla dans la résolution d'un problème.&lt;br /&gt;&lt;br /&gt;"L'agilité" n'est pas une méthode et encore moins une &lt;a href="http://fr.wikipedia.org/wiki/M%C3%A9thodologie"&gt;méthodologie&lt;/a&gt; : qui ne souhaite pas être agile sur un projet ? Face à temps de jargon, &lt;a href="http://martinfowler.com/bliki/AgileVersusLean.html"&gt;les termes se mélangent&lt;/a&gt;. Ce sont des termes pièges qui visent à enfermer les naïfs dans des schémas de pensées clé en main. Or le problème de ces schémas c'est qu'ils veulent donner des recettes toutes faites alors que justement, &lt;span style="font-weight: bold;"&gt;l'important est de reconnaitre que (surtout en informatique) chaque problème est unique&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Si un problème n'est pas unique, il faut partir du postulat qu'il doit normalement exister un logiciel tout prêt pour le résoudre.&lt;br /&gt;&lt;br /&gt;L'important est de savoir s'adapter à la situation. &lt;span style="font-weight: bold;"&gt;Le seul art à maîtriser correctement est la gestion de projet.&lt;/span&gt; La &lt;a href="http://www.amazon.fr/Gestion-projets-Vincent-Giard/dp/2717821686"&gt;gestion de projet&lt;/a&gt; ne présuppose pas le processus de développement à employer. Un projet pourra viser de nombreuses itérations avec écritures de scenarii et développement dirigé par les tests si la solution le nécessite. Mais cette façon de travailler n'est pas forcément la meilleur à adopter pour n'importe quel projet.&lt;br /&gt;&lt;br /&gt;Par exemple, l'utilisation de "releases" fréquentes pour le client et la définition au fil de l'eau des spécifications via des scenarii risque de faire aboutir à des logiciels coûteux alors qu'une analyse, une réflexion d'ensemble au début du projet aurait pu aboutir au choix de la mise en place d'un progiciel du marché.&lt;br /&gt;&lt;br /&gt;Car c'est bien là l'enjeu de l'informatique aujourd'hui : &lt;span style="font-weight: bold;"&gt;faire un maximum de réutilisation, ne pas réinventer la roue.&lt;/span&gt; La principale activité pour arriver à cet objectif est l'&lt;a href="http://en.wikipedia.org/wiki/Systems_analyst"&gt;analyse de système&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La sclérose en plaque n'est pas seulement dans le cerveau des prophètes de "l'agile". On la retrouve partout, notamment chez Microsoft, qui en 2008 est fière de sortir enfin &lt;a href="http://windowsclient.net/wpf/wpf35/wpf-dg-preview-ctrl-investments.aspx"&gt;un composant DataGrid&lt;/a&gt; digne de ce nom !&lt;br /&gt;&lt;br /&gt;Quelle avancée dans le domaine de l'informatique ! &lt;span style="font-weight: bold;"&gt;ça fait juste 30 ans que les grilles de données existent sur PC et Mac !&lt;/span&gt; quand on pense aux premiers tableurs comme &lt;a href="http://en.wikipedia.org/wiki/VisiCalc"&gt;VisiCalc&lt;/a&gt;, et qu'on regarde ce qui est reconnu comme une avancée dans "Microsoft .Net Framework 3.5 WPF", on se dit que vraiment, on a fait du surplace pendant 30 ans&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.danbricklin.com/history/saiearly.htm"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SL0mQxVEZbI/AAAAAAAAAIk/wL_1ic51CC4/s400/0172cf00.jpg" alt="" id="BLOGGER_PHOTO_ID_5241387610890593714" border="0" /&gt;&lt;/a&gt;L'important pour un informaticien est la reconnaissance que l'informatique n'est pas une solution en soi pour le client. L'analyse du besoin est l'activité déterminante du succès ou de l'échec d'un projet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2140082263858949124?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2140082263858949124/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2140082263858949124' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2140082263858949124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2140082263858949124'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/09/jargon-effets-de-mode-et-confusions.html' title='Jargon, effets de mode et confusions dans l&apos;informatique'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SL0mQxVEZbI/AAAAAAAAAIk/wL_1ic51CC4/s72-c/0172cf00.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-3000354611954955929</id><published>2008-08-28T08:00:00.000-07:00</published><updated>2011-01-26T02:43:17.469-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><title type='text'>La lecture plaisante de code source, ou comment éviter de perdre son temps</title><content type='html'>Vous n'avez pas l'impression que l'informatique tourne en rond en ce moment, qu'&lt;span style="font-weight: bold;"&gt;elle ne cherche plus à innover mais simplement à recréer ce qu'elle a déjà oublié&lt;/span&gt; ?&lt;br /&gt;&lt;br /&gt;Pourquoi recréer le &lt;a href="http://extjs.com/blog/2008/08/26/ext-gxt-now-with-portal-and-web-desktop/"&gt;client lourd dans le navigateur Web&lt;/a&gt; quand justement, on n'était sorti du client lourd sous Windows ? Pourquoi tant d'effort déployé par des myriades de passionnés d'informatique pour produire des outils permettant uniquement de créer d'autres outils, etc ?&lt;br /&gt;&lt;br /&gt;Quand on voit le nombre de frameworks redondants, d'applications Web &lt;span style="font-weight: bold;"&gt;reproduites à l'identique&lt;/span&gt; en des milliers d'exemplaires différents mais pourtant bien semblables tel que les &lt;a href="http://www.opensourcecms.com/index.php?option=content&amp;amp;task=view&amp;amp;id=388&amp;amp;Itemid=143"&gt;CMS&lt;/a&gt;... on peut se demander d'où vient le problème.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.designboom.com/weblog/cat/10/view/3216/quebec-triennial-nothing-is-lost-nothing-is-created-everything-is-transformed.html"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SLcBgL-JtVI/AAAAAAAAAIU/Gz6Ro3mNXO4/s400/black-whole-conference-chair-michel-de-broin.jpg" alt="" id="BLOGGER_PHOTO_ID_5239658343949776210" border="0" /&gt;&lt;/a&gt;A mon avis, c'est que le développeur de base, chez lui, le passionné d'informatique s'imagine capable de créer un monde à son image quand il se met à développer un nouveau logiciel "&lt;a href="http://en.wikipedia.org/wiki/From_scratch"&gt;from scratch&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Le problème c'est que quand il décide de partir de zéro pour créer un nouveau logiciel, dans 90% des cas, &lt;span style="font-weight: bold;"&gt;son effort est négatif pour la communauté opensource&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En effet, l'effort qu'il pourrait passer à améliorer un logiciel déjà existant, ce passionné le passe à recréer entièrement un logiciel et tout ce qui va avec, toutes les fonctionnalités communes à tous les même type de logiciel, bref &lt;span style="font-weight: bold;"&gt;à recréer la roue&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Traduction pour le nerd moyen : La création d'une nouvelle itération d'un logiciel déjà existant n'a pour résultat que de diviser l'effort qui pourrait être mis sur une seule itération, sur un seul logiciel.&lt;br /&gt;&lt;br /&gt;Développer un nouveau logiciel à partir de rien pourrait sembler intéressant dans un premier temps, mais quand on y pense, cela est vain. A quoi bon recréer toutes les routines de support de l'application alors qu'elles existent déjà sous d'autres formes dans des logiciels similaires ?&lt;br /&gt;&lt;br /&gt;Il est pourtant beaucoup plus intéressant d'essayer d'améliorer les logiciels existants. Pour un développeur qui cherche de la reconnaissance par son travail de programmation, &lt;span style="font-weight: bold;"&gt;la contribution à des projets largement établis sur le Web est beaucoup plus valorisant et instructif que de recommencer dans son coin un bout de code&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La difficulté première, c'est que &lt;span style="font-weight: bold;"&gt;la plupart des développeurs n'aiment pas lire&lt;/span&gt; : que ce soit des livres ou du code source. Or tout est là : c'est dans la capacité à comprendre le code source de logiciels complexes que la productivité d'un développeur peut augmenter.&lt;br /&gt;&lt;br /&gt;Lire du code source est extrêmement instructif, &lt;span style="font-weight: bold;"&gt;il permet de se confronter personnellement à des schémas de pensés contradictoires&lt;/span&gt;, à s'immiscer dans la logique profonde d'un autre développeur, voire, plusieurs développeurs.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.hanselman.com/blog/TheWeeklySourceCode13FibonacciEdition.aspx"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SLcCbPTWoOI/AAAAAAAAAIc/1839rQbgJzw/s400/iStock_000000237891XSmall_3.jpg" alt="" id="BLOGGER_PHOTO_ID_5239659358456291554" border="0" /&gt;&lt;/a&gt;Au delà du langage de programmation, c'est toute l'intelligence d'un être humain qui apparaît à travers le code source. On peut y voir comment un développeur met en œuvre des outils limités pour obtenir le comportement réellement souhaité.&lt;br /&gt;&lt;br /&gt;La lecture du code source est très instructive car elle permet de s'apercevoir que même pour des problèmes en apparence simple, le programmeur doit déployer toute son intelligence pour aboutir à une solution élégante.&lt;br /&gt;&lt;br /&gt;L'élégance est affaire de bon goût mais dans le cas de la programmation, chaque développeur y apposera son échelle de valeur. Alors que certains vont chercher l'optimisation à tout prix, d'autres, rechercherons la robustesse, d'autres la maintenabilité, etc. &lt;span style="font-weight: bold;"&gt;C'est par l'appréciation de toutes ces caractéristiques, qu'un développeur peut sentir l'élégance d'une construction&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-3000354611954955929?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/3000354611954955929/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=3000354611954955929' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3000354611954955929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3000354611954955929'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/la-lecture-plaisante-de-code-source-ou.html' title='La lecture plaisante de code source, ou comment éviter de perdre son temps'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SLcBgL-JtVI/AAAAAAAAAIU/Gz6Ro3mNXO4/s72-c/black-whole-conference-chair-michel-de-broin.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2576708414330305831</id><published>2008-08-24T08:00:00.000-07:00</published><updated>2011-01-26T02:44:10.215-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Terminologie de la communauté des informaticiens</title><content type='html'>Je viens de finir de regarder un épisode de "&lt;a href="http://www.imdb.com/title/tt0412142/"&gt;Dr. House&lt;/a&gt;". Cette série télé est tellement bien écrite et réalisée qu'elle suscite un désir profond de "faire" de la médecine. Avec tous les &lt;a href="http://www.chu-rouen.fr/ssf/indexgen.html"&gt;termes médicaux&lt;/a&gt; qui sont jetés au téléspectateur, la série réussie à flatter notre ego, parce qu'&lt;span style="font-weight: bold;"&gt;on a l'impression d'y comprendre quelque chose alors que vraiment tout nous échappe&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SK3pfsuVx5I/AAAAAAAAAIM/LykF5Bf__W4/s1600-h/dr_house.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SK3pfsuVx5I/AAAAAAAAAIM/LykF5Bf__W4/s400/dr_house.jpg" alt="" id="BLOGGER_PHOTO_ID_5237098672492496786" border="0" /&gt;&lt;/a&gt;Cet épisode m'a fait réalisé qu'il nous manquait peut-être quelque chose en informatique, chose que la médecine utilise largement. Il s'agit du &lt;span style="font-weight: bold;"&gt;nommage scientifique de la moindre petite chose&lt;/span&gt;, ou technique. En médecine, j'ai l'impression que l'accumulation du savoir tourne autour du nommage de chaque savoir, une terminologie précise, scientifique, commune à tous les praticiens.&lt;br /&gt;&lt;br /&gt;Or quand je lis des livres comme &lt;a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670"&gt;Code Complete&lt;/a&gt; ou d'autres, il y a une liste impressionnante de symptômes de mauvais code, de techniques de codage, mais presque aucun &lt;a href="http://en.wikipedia.org/wiki/Common_name"&gt;nom commun&lt;/a&gt; n'est donné pour représenter spécifiquement ces choses. Il serait pourtant vraiment intéressant de pouvoir construire un corpus de noms (&lt;span style="font-weight: bold;"&gt;un "jargon" ?&lt;/span&gt;) pour chaque phénomène, méthode de programmation, style d'écriture de code...&lt;br /&gt;&lt;br /&gt;On voit quand même apparaître depuis quelques années un effort dans ce sens avec la volonté de &lt;span style="font-weight: bold;"&gt;la formalisation de modèles de conceptions&lt;/span&gt; ("&lt;a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29"&gt;design patterns&lt;/a&gt;") avec des noms spécifiques. Certains informaticiens vont aussi dans cette voie, en essayant justement de définir précisément chaque méthode, fait, causes, en informatique comme &lt;a href="http://martinfowler.com/bliki/"&gt;Martin Fowler&lt;/a&gt; avec son &lt;a href="http://en.wikipedia.org/wiki/Bliki"&gt;bliki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mais, nombre de méthodes, bonnes pratiques, &lt;a href="http://en.wikipedia.org/wiki/Anti-pattern"&gt;mauvaises pratiques&lt;/a&gt; n'ont pas encore de nom propre pour devenir commun à tous les développeurs. &lt;span style="font-weight: bold;"&gt;Cela ne veut pas dire qu'elles n'existent pas !&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;L'informatique étant une &lt;a href="http://www.geocities.com/tablizer/itpot.htm"&gt;discipline basée sur la mode du moment&lt;/a&gt;, toute référence au passé est suspecte et est considérée comme inutile. On se prive pourtant de nombre de bonnes pratiques, qui malheureusement finissent par être largement ignorées.&lt;br /&gt;&lt;br /&gt;Peut-être faudrait-il &lt;span style="font-weight: bold;"&gt;employer une dénomination à base de racine Grec ou Latine&lt;/span&gt; pour provoquer volontairement de la distance avec ces effets de modes. Ça donnerait de la classe aux informaticiens, flatterait aussi leur égo :) Mais en tout cas, cela n'empêchera pas d'avoir de mauvais informaticiens.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2576708414330305831?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2576708414330305831/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2576708414330305831' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2576708414330305831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2576708414330305831'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/terminologie-de-la-communaut-des.html' title='Terminologie de la communauté des informaticiens'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SK3pfsuVx5I/AAAAAAAAAIM/LykF5Bf__W4/s72-c/dr_house.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-499772733901176211</id><published>2008-08-21T08:00:00.000-07:00</published><updated>2011-01-26T02:44:20.472-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commerce'/><title type='text'>Le capital-risque et la levée de fond</title><content type='html'>Je me suis toujours demandé quel est l'intéret il peut y avoir de créer une startup aujourd'hui, en France. Rêver de devenir le prochain Google ne nourri pas son homme, surtout quand on sait &lt;span style="font-weight: bold;"&gt;le nombre si faible de &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://fr.wikipedia.org/wiki/Capital-investissement"&gt;Capital investissement&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; en France ou de &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://fr.wikipedia.org/wiki/Business_angel"&gt;Business Angels&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Et puis vient un jour un gars nommé &lt;a href="http://www.paulgraham.com/"&gt;Paul Graham&lt;/a&gt; qui vous dit que trouver de l'argent c'est très dur (on s'en serait douté :) mais que cet argent n'est pas une fin en soi quand on créé une startup. En effet, dans son article &lt;a href="http://www.paulgraham.com/fundraising.html"&gt;A Fundraising Survival Guide&lt;/a&gt;, Paul nous démonte toutes les mauvaises conceptions que l'on a de la levée de fond.&lt;br /&gt;&lt;br /&gt;Il part du principe de base que &lt;span style="font-weight: bold;"&gt;tous les investisseurs sont, à la base, incompétents&lt;/span&gt; :&lt;br /&gt;&lt;blockquote&gt;"All investors, including us, are by ordinary standards incompetent. We constantly have to make decisions about things we don't understand, and more often than not we're wrong."&lt;/blockquote&gt;et qu'il ne se feront donc jamais une opinion sur votre société d'après une jugement raisonné :&lt;br /&gt;&lt;blockquote&gt;"the biggest factor in their opinion of you is the opinion of other investors".&lt;/blockquote&gt;Face à un tel décalage entre les aspirations des entrepreneurs et celles des investisseurs, le plus importants message a faire passer c'est que &lt;span style="font-weight: bold;"&gt;la startup va réussir avec ou sans eux&lt;/span&gt; :&lt;br /&gt;&lt;blockquote&gt;"The message (and not just the message, but the fact) should be: we're going to succeed no matter what. &lt;span style="font-weight: bold;"&gt;Raising more money just lets us do it faster&lt;/span&gt;."&lt;br /&gt;&lt;br /&gt;"There is nothing investors like more than a startup that seems like it's going to succeed even without them. Investors like it when they can help a startup, but they don't like startups that would die without that help."&lt;/blockquote&gt;Mais ce qui est le plus difficile est d'&lt;span style="font-weight: bold;"&gt;avoir une idée à la fois bonne et nouvelle&lt;/span&gt; ce qui est paradoxal quand on y pense :&lt;br /&gt;&lt;blockquote&gt;"A good startup idea has to be not just good but novel. And to be both good and novel, an idea probably has to seem bad to most people, or someone would already be doing it and it wouldn't be novel."&lt;/blockquote&gt;En France, les gros éditeurs de logiciels ou de solutions fortement basé sur l'informatique sont rares ou &lt;a href="http://www.lemagit.fr/article/finance-logiciel-rachat-sungard/876/1/maintenant-trade-hemorragie-poursuit-pour-logiciel-francais/"&gt;se font racheter par des sociétés étrangères&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.imdb.com/title/tt0106918/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SJ9dIHzR50I/AAAAAAAAAIE/2XhV1uDZJHw/s400/firm_ver2.jpg" alt="" id="BLOGGER_PHOTO_ID_5233003686142273346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Face à tant d'obstacles, Paul Graham nous rappelle &lt;span style="font-weight: bold;"&gt;ce qui est vraiment important&lt;/span&gt; quand on décide de se lancer dans l'aventure :&lt;br /&gt;&lt;blockquote&gt;- l'endurance,&lt;br /&gt;&lt;br /&gt;- l'adaptabilité,&lt;br /&gt;&lt;br /&gt;- la détermination.&lt;/blockquote&gt;Avec ces qualités, on arrivera bien quelque part... peut-être pas vers une réussite pécuniaire, mais en tout cas vers une expérience enrichissante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-499772733901176211?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/499772733901176211/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=499772733901176211' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/499772733901176211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/499772733901176211'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/le-capital-risque-et-la-leve-de-fond.html' title='Le capital-risque et la levée de fond'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dJYBJhDg2Hk/SJ9dIHzR50I/AAAAAAAAAIE/2XhV1uDZJHw/s72-c/firm_ver2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1466097856310273675</id><published>2008-08-18T08:00:00.000-07:00</published><updated>2011-01-26T02:44:53.927-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='langage'/><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Programmer dans un langage</title><content type='html'>&lt;a href="http://www.cs.cornell.edu/home/gries/gries.html"&gt;David Gries&lt;/a&gt;, dans son livre &lt;a href="http://www.amazon.com/Science-Programming-Monographs-Computer/dp/0387964800"&gt;The Science Of Programming&lt;/a&gt; (page 235, 18.3.11) énonce un principe plein de sagesse :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Principle : Program &lt;/span&gt;&lt;emp style="font-weight: bold;"&gt;into&lt;/emp&gt;&lt;span style="font-weight: bold;"&gt; a programming language, not &lt;/span&gt;&lt;emp style="font-weight: bold;"&gt;in&lt;/emp&gt;&lt;span style="font-weight: bold;"&gt; it.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;que l'on peut difficilement (et très librement) traduire en français par :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Principe : Programmer dans un langage, pas pour un langage.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;C'est une mauvaise traduction, les mots, "in" et "into" n'étant pas très facile à distinguer.&lt;br /&gt;&lt;br /&gt;L'idée est de programmer de façon quasiment abstraite (j'ai dit quasiment, j'ai pas dit complètement :) avec le langage comme simple support du programme. Il faut éviter de programmer pour un langage, c'est à dire, que son programme ne soit structuré par les contraintes et possibilités d'un langage particulier.&lt;br /&gt;&lt;br /&gt;David Gries propose de construire son programme et ses structure de données indépendamment du langage utilisé. Cela rejoint un peu la &lt;a href="http://jradix.blogspot.com/2008/07/intellisense-ennemi-de-la-pense-dsire.html"&gt;programmation par pensée désirée&lt;/a&gt; qui vise à construire un programme en partant d'une vision abstraite et désirée du monde.&lt;br /&gt;&lt;br /&gt;Une fois que le programme désiré a été codé, on peut ensuite raffiner les données et le programme pour qu'il "colle" mieux au langage, et ce pour des raisons performance, lisibilité, cohérence avec l'ensemble des librairies à dispositions, etc. &lt;span style="font-weight: bold;"&gt;Mais ce raffinement ne vient que dans un deuxième temps. Il est nécessaire de ne pas se laisser guider/contraindre par un langage particulier.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On pourrait croire, qu'avec un tel principe, il est nécessaire de savoir coder dans n'importe quel langage. C'est aller un peu vite en besogne, et c'est même l'inverse que je préconiserait. En effet, la véritable maîtrise d'un langage de programmation nécessite plusieurs années d'apprentissage.&lt;br /&gt;&lt;br /&gt;Il ne suffit pas de connaître la syntaxe de base du langage. Celle-ci est souvent très simple et peut s'apprendre très rapidement (sauf certains cas significatifs comme &lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt; qui justement vise à offrir un langage très riche en raccourcis et tournure de phrase). Le plus important est de connaître ce qui existe déjà dans ce langage, les librairies et comment les utiliser.&lt;br /&gt;&lt;br /&gt;Ce dernier aspect est crucial pour la productivité d'un programmeur. C'est souvent au bout de plusieurs années qu'un développeur maîtrise aisément toutes ces API. Le problème est bien là : &lt;span style="font-weight: bold;"&gt;la maîtrise prend du temps&lt;/span&gt;. Et le temps, personne n'en a jamais assez.&lt;br /&gt;&lt;br /&gt;C'est pour ça que la popularité d'un langage de programmation est rarement due à sa capacité à exprimer tous les &lt;a href="http://en.wikipedia.org/wiki/Programming_paradigm"&gt;paradigmes informatiques connus&lt;/a&gt; mais plus par &lt;span style="font-weight: bold;"&gt;sa capacité à montrer qu'il est le seul et unique langage qu'on vous demandera d'utiliser en milieu professionnel&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La période nécessaire d'apprentissage étant longue, un informaticien professionnel choisissant d'avoir quand même une vie en dehors de l'informatique et de son boulot, choisira nécessairement un seul langage.&lt;br /&gt;&lt;br /&gt;A cause de cet apprentissage long, il est important de "maîtriser" au moins un langage de programmation, tout en gardant l'esprit ouvert sur les autres langages existants. Autant choisir un langage qui permet de mettre en œuvre un maximum de &lt;a href="http://fr.wikipedia.org/wiki/Paradigme_%28programmation%29"&gt;paradigmes&lt;/a&gt;. Même si il est vrai que le domaine du développement logiciel a largement avancé &lt;span style="font-weight: bold;"&gt;en restreignant ce que peuvent faire les programmeurs avec leur code,&lt;/span&gt; comme nous le rappelle Steve McConnell dans &lt;a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670"&gt;Code Complete 2&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;At one time or another, someone thought that each of the following control structures was a good idea:&lt;br /&gt;&lt;br /&gt;- Unrestricted use of gotos&lt;br /&gt;&lt;br /&gt;- Ability to compute a goto target dynamically and jump to the computed location&lt;br /&gt;&lt;br /&gt;- Ability to use goto to jump from the middle of one routine into the middle of another routine&lt;br /&gt;&lt;br /&gt;- Ability to call a routine with a line number or label that allowed execution to begin somewhere in the middle of the routine&lt;br /&gt;&lt;br /&gt;- Ability to have the program generate code on the fly and then execute the code it just wrote&lt;br /&gt;&lt;br /&gt;At one time, each of these ideas was regarded as acceptable or even desirable, even though now they all look hopelessly quaint, outdated, or dangerous. &lt;span style="font-weight: bold;"&gt;The field of software development has advanced largely through restricting what programmers can do with their code.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;A vous donc, de choisir &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_programming_languages"&gt;le bon langage de programmation&lt;/a&gt; pour lequel vous êtes prêt à investir un nombre d'heures déraisonnable pour en acquérir toute la maîtrise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1466097856310273675?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1466097856310273675/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1466097856310273675' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1466097856310273675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1466097856310273675'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/programmer-dans-un-langage.html' title='Programmer dans un langage'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1271756982176071293</id><published>2008-08-15T08:00:00.000-07:00</published><updated>2011-01-26T02:46:59.878-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exigences'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Système de suivi d'un développement logiciel</title><content type='html'>&lt;span style="font-weight: bold;"&gt;En milieu professionnel, le développement logiciel s'apparente à une construction d'une maison. &lt;/span&gt;On fait des plans à l'avance, et on s'organise pour que tout le monde travaille dans le bon sens. L'important est de pouvoir savoir que le projet avance, de suivre son avancement.&lt;br /&gt;&lt;br /&gt;Rien de mieux pour cela que d'&lt;span style="font-weight: bold;"&gt;organiser un projet autour d'un système de gestion d'&lt;a href="http://fr.wikipedia.org/wiki/Exigence_%28ing%C3%A9nierie%29"&gt;exigences&lt;/a&gt;&lt;/span&gt;, reflet exact du besoin du client. L'important dans un projet informatique est de s'assurer que toutes les exigences sont "couvertes", et que seules les exigences demandées sont implémentées. La liste des exigences n'est que le &lt;span style="font-weight: bold;"&gt;reflet exhaustif du contrat passé avec le client&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La gestion des exigences est parfois obligatoire notamment lors de &lt;a href="http://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000006204298&amp;amp;cidTexte=LEGITEXT000005627819&amp;amp;dateTexte=20080626&amp;amp;fastPos=1&amp;amp;fastReqId=1253744014&amp;amp;oldAction=rechCodeArticle"&gt;marchés publics&lt;/a&gt;. Mais, même (et surtout) quand un contrat est ambigüe, n'est pas clair sur chacun des besoin du client, il est important de détailler le contrat en exigences.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/Exploring-Requirements-Quality-Before-Design/dp/0932633137"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SGNgPNvbv6I/AAAAAAAAAF8/uWanDVtVj7M/s400/51Ufx22FU8L._SL500_AA240_.jpg" alt="" id="BLOGGER_PHOTO_ID_5216118607928082338" border="0" /&gt;&lt;/a&gt;Un des meilleurs bouquins que j'ai pu lire sur le sujet est &lt;a href="http://www.amazon.com/Exploring-Requirements-Quality-Before-Design/dp/0932633137"&gt;Exploring Requirements: Quality Before Design&lt;/a&gt; de Donald C. Gause et Gerald M. Weinberg. Ce qui est intéressant dans ce livre c'est qu'il montre comment faire ressortir toutes les exigences d'un produit et &lt;span style="font-weight: bold;"&gt;comment les différencier en fonctions, attributs, contraintes, préférences et attentes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ainsi, quand on a plusieurs intervenant à faire travailler sur un projet, l'important est de s'assurer que le travail de chacun est lié directement à l'implémentation d'une exigence. &lt;span style="font-weight: bold;"&gt;La mise en place d'outils de gestion de projet devient inévitable dès qu'on a plus de 2 développeurs simultanés&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Le système d'information de base à mettre en place pour une gestion de projet s'articule autour des types d'outil suivant :&lt;br /&gt;&lt;blockquote&gt;- un gestionnaire d'exigences&lt;br /&gt;- un gestionnaire de &lt;a href="http://en.wikipedia.org/wiki/Test_case"&gt;tests&lt;/a&gt;, de &lt;a href="http://en.wikipedia.org/wiki/Test_scenario"&gt;scenarii de test&lt;/a&gt; et de &lt;a href="http://en.wikipedia.org/wiki/Test_plan"&gt;plan de tests&lt;/a&gt;&lt;br /&gt;- un outil de suivi des &lt;a href="http://en.wikipedia.org/wiki/Software_bug"&gt;anomalies&lt;/a&gt;&lt;br /&gt;- un outil pour relier au code les exigences et les anomalies.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;l'intégration de tous ces outils&lt;/span&gt;&lt;/blockquote&gt;L'idéal est bien d'intégrer tous ces outils pour avoir une maîtrise de ce qui est développé. Le processus de développement peut alors se décrire comme suit :&lt;br /&gt;&lt;blockquote&gt;- une exigence est rédigée dans le système de gestion des exigences.&lt;br /&gt;&lt;br /&gt;- des tests et des scenarii de tests sont rédigés pour cette exigence, permettant de s'assurer qu'elle a été correctement implémentée.&lt;br /&gt;&lt;br /&gt;- des plans de test sont construits pour organiser les phases de vérification et de validation.&lt;br /&gt;&lt;br /&gt;- quand un développeur veut commiter du code, il indique dans le message de commit la&lt;br /&gt;référence de l'exigence concernée par ce commit.&lt;br /&gt;&lt;br /&gt;- quand un test montre qu'il y a un problème, l'anomalie est tracée dans le système de suivi des anomalies.&lt;br /&gt;&lt;br /&gt;- quand un développeur corrige l'anomalie dans le code, il indique dans le message de commit la référence de l'anomalie.&lt;br /&gt;&lt;/blockquote&gt;L'important dans tout ça est de &lt;span style="font-weight: bold;"&gt;contraindre le processus pour qu'il soit suivi&lt;/span&gt; :&lt;br /&gt;&lt;blockquote&gt;- tout commit doit avoir soit une référence d'exigence, soit une référence d'anomalie&lt;br /&gt;- toute anomalie doit avoir une référence à l'exigence sur laquelle le défaut a été constaté&lt;br /&gt;- tout test doit avoir une référence à l'exigence testée&lt;/blockquote&gt;On peut mettre en place un tel système de suivi du développement logiciel avec de simples outils Open Source :&lt;br /&gt;&lt;blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mantisbt.org/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SGNhF3WU6wI/AAAAAAAAAGE/zbFHBjBhwm0/s400/mantis_logo.gif" alt="" id="BLOGGER_PHOTO_ID_5216119546810002178" border="0" /&gt;&lt;/a&gt;- &lt;a href="http://www.mantisbt.org/"&gt;Mantis&lt;/a&gt; pour le suivi des anomalies,&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.teamst.org/"&gt;Testlink&lt;/a&gt; pour le suivi des exigences, des tests, des scenarii de test, des plan de test. Il a l'avantage de s'interconnecter facilement avec Mantis. On peut faire correspondre des bug Mantis avec des tests Testlink.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://freshmeat.net/projects/scmbug/"&gt;scmbug&lt;/a&gt; pour &lt;a href="http://files.mkgnu.net/files/scmbug/doc/latest_manual/html-single/manual.html#INTRODUCTION"&gt;relier les commits&lt;/a&gt; au référentiels que sont les exigences et les anomalies.&lt;br /&gt;&lt;/blockquote&gt;&lt;a href="http://www.teamst.org/_tldoc/1.7/tl-bts-howto.pdf"&gt;Intégrer Mantis et Testlink&lt;/a&gt; est &lt;a href="http://www.teamst.org/index.php?option=com_content&amp;amp;task=view&amp;amp;id=46&amp;amp;Itemid=2"&gt;un jeu d'enfant&lt;/a&gt;, la mise en place de scmbug elle, est plus difficile (et le sera tant qu'il n'y aura &lt;a href="http://www.futureware.biz/mantisconnect/"&gt;pas d'interface au niveau de Mantis&lt;/a&gt; sur laquelle &lt;a href="http://files.mkgnu.net/files/scmbug/doc/latest_manual/html-single/manual.html#MANTIS"&gt;scmbug puisse connecter ses évènements&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Travailler avec un tel système nécessite d'adhérer à cette vision d'implémentation d'exigences. Il est important que chaque développeur comprenne que &lt;span style="font-weight: bold;"&gt;ce n'est pas contraindre la créativité que de baser le développement sur les exigences&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;De toute manière, si vous avez correctement implémenté ce système, le développeur est obligé de préciser sur quelle exigence, ou quelle anomalie il commit son code, le tout est de &lt;span style="font-weight: bold;"&gt;s'assurer que le code correspond effectivement à ce qu'il prétend.&lt;/span&gt; Cela est normalement fait au niveau de l'&lt;a href="http://jradix.blogspot.com/2008/06/larme-absolue-de-la-qualit-la-checklist.html"&gt;assurance qualité&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1271756982176071293?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1271756982176071293/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1271756982176071293' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1271756982176071293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1271756982176071293'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/systme-de-suivi-dun-dveloppement.html' title='Système de suivi d&apos;un développement logiciel'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/SGNgPNvbv6I/AAAAAAAAAF8/uWanDVtVj7M/s72-c/51Ufx22FU8L._SL500_AA240_.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2616747491036769862</id><published>2008-08-12T08:00:00.000-07:00</published><updated>2011-01-26T02:47:28.715-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commerce'/><category scheme='http://www.blogger.com/atom/ns#' term='emploi'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Les affres de la gestion de projet de développement au forfait</title><content type='html'>Pour les informaticiens travaillant en &lt;a href="http://fr.wikipedia.org/wiki/Soci%C3%A9t%C3%A9_de_services_en_ing%C3%A9nierie_informatique"&gt;SSII&lt;/a&gt;, le travail sur des &lt;a href="http://www.journaldunet.com/solutions/0702/070216-regie-forfait-centre-services.shtml"&gt;projets au forfait&lt;/a&gt; peut s'avérer beaucoup plus intéressant que de travailler en régie dans une équipe du client.&lt;br /&gt;&lt;br /&gt;En effet, quand vous êtes en régie chez un client, vous avez beau être intégré dans les équipes en places et faire ami-ami avec vos collègues, &lt;span style="font-weight: bold;"&gt;vous n'êtes pas un employé de la société cliente, vous êtes un représentant de la société pour laquelle vous travaillez réellement, la SSII&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Travailler sur un projet au forfait dans la société qui vous à engagée est inconsciemment plus gratifiant que de travailler sur un projet d'un client. C'est mon sentiment personnel, ce n'est peut-être pas le cas pour vous, je le comprend bien.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Le problème d'un chef de projet en SSII, c'est que souvent, il récupère un projet au forfait qu'il n'a pas lui même vendu et dont il n'a pas estimé les charges&lt;/span&gt;. Ce découpage se retrouve souvent car le chef de projet a toujours tendance à avoir peur face aux &lt;a href="http://en.wikipedia.org/wiki/Risk"&gt;risques&lt;/a&gt; qui apparaissent et donc à surestimer les charges de réalisation.&lt;br /&gt;&lt;br /&gt;Le commercial ou chargé d'affaire, lui, est &lt;a href="http://commercial.axelere.com/cherche/formule%20interessement%20commercial.html"&gt;intéressé au chiffre d'affaire&lt;/a&gt; et est donc plus enclin à prendre des risques. Risques qu'il doit quand même mesurer pour qu'il puisse un jour espérer toucher sa commission lors de l'émission de la facture finale du projet.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fr.wikipedia.org/wiki/Contrat"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SHzELzCv6cI/AAAAAAAAAHQ/N7cq6xPnjZE/s400/handshake.jpg" alt="" id="BLOGGER_PHOTO_ID_5223265374802274754" border="0" /&gt;&lt;/a&gt;Il se peut qu'on ne puisse pas évaluer correctement les charges de développement au début du projet, &lt;span style="font-weight: bold;"&gt;et c'est normal.&lt;/span&gt; La vente au forfait se base sur des présupposés et pré-requis plus ou moins explicités.&lt;br /&gt;&lt;br /&gt;Le chef de projet, avant d'accepter tout nouveau projet doit comprendre entièrement les contraintes, présupposés, réserves et prérequis qui ont été utilisés pour l'évaluation des charges vendues au client. Il ne doit accepter de le gérer que suite à la revue complète de son estimation et de son acceptation.&lt;br /&gt;&lt;br /&gt;Un projet au forfait &lt;span style="font-weight: bold;"&gt;engage &lt;/span&gt;la société de service:&lt;br /&gt;&lt;blockquote&gt;- sur le résultat,&lt;br /&gt;- sur le prix,&lt;br /&gt;- sur les délais,&lt;br /&gt;- et la qualité des produits livrés.&lt;/blockquote&gt;Le projet au forfait ne peut être viable que dans la mesure où une plus ou moins grande partie du cahier des charges est clairement explicitée et non ambiguë. Plus le cahier des charges est ambiguë, plus il y a de risque au forfait. &lt;span style="font-weight: bold;"&gt;Un client aura plus intérêt à &lt;a href="http://www.journaldunet.com/solutions/0702/070216-regie-forfait-centre-services.shtml"&gt;internaliser&lt;/a&gt; les projets complexes (au niveau technique, organisation...)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si vous vous trouvez dans la situation (si commune de nos jours) où on vous impose un projet qui vous semble intenable, plusieurs choses peuvent être entreprises pour arriver à s'en sortir :&lt;br /&gt;&lt;br /&gt;Tout d'abord, il est important d'&lt;span style="font-weight: bold;"&gt;expliciter entièrement la formule qui a permis de calculer l'engagement au forfait&lt;/span&gt; (le nombre de jours, les délais, la qualité, etc.). Les commerciaux, chargés d'affaire doivent être capables de vous expliquer exactement ce qui leur à permis de mettre un prix de vente global sur la proposition commerciale.&lt;br /&gt;&lt;br /&gt;Avec une telle formule, normalement apparaît tout de suite les éléments qui ont été sous-estimés par la "force de vente" (le commercial). &lt;span style="font-weight: bold;"&gt;Attention aux remises commerciales&lt;/span&gt;, concédées par le commercial pour gagner le projet "à tout prix".&lt;br /&gt;&lt;br /&gt;Ensuite il est important de lister de façon exhaustive les points qui n'ont pas été explicité dans le contrat et qui auront un impact important sur le projet. Il s'agit souvent d'information provenant du client, que l'on n'a pas encore au moment de l'écriture du contrat. &lt;span style="font-weight: bold;"&gt;Le commercial a souvent un ressenti qu'il est important de recueillir car il n'est écrit nul part&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Identifier les exigences à risques et les exigences pour lesquels des solutions toute prêtes sont disponibles (soit en interne dans la société, soit par l'achat d'une brique sur étagère, soit par l'utilisation de technologies "Open Source".)&lt;br /&gt;&lt;br /&gt;Enfin, d'après tous les éléments que vous avez à votre disposition, estimez les délais, coûts, qualité, ressources, risques &lt;span style="font-weight: bold;"&gt;et la rentabilité du projet&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Avec tous ces éléments, vous devez faire une réunion interne de lancement de projet pour remonter à votre hiérarchie toute ces informations et notamment &lt;span style="font-weight: bold;"&gt;toutes les charges que vous ne pouvez assumer&lt;/span&gt; (remise commerciales, flou dans le besoin client, flou dans la solution vendue.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fr.wikipedia.org/wiki/Responsabilit%C3%A9"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 206px; height: 227px;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SHzGY691-jI/AAAAAAAAAHY/Z-wbc85vltA/s320/criminal_justice_jurisprudence.jpg" alt="" id="BLOGGER_PHOTO_ID_5223267799290739250" border="0" /&gt;&lt;/a&gt;Rien de pire que d'accepter un projet infaisable sans broncher. Quand ça sera la cata (et ça sera la cata à un moment ou un autre !), ça sera vous &lt;a href="http://fr.wikipedia.org/wiki/Responsabilit%C3%A9"&gt;le responsable&lt;/a&gt; !&lt;br /&gt;&lt;br /&gt;Le plus important c'est que la société de service assume, dès le début du projet, les éléments que vous ne pouvez assumer seul. Et alors, seul le Compte Rendu de la réunion interne de lancement sera votre bouclier contre toutes les attaques qui se feront (forcément) jour lors du projet. Si vous ne pouvez pas faire de Compte Rendu, un email largement diffusé fera l'affaire.&lt;br /&gt;&lt;br /&gt;L'important pour un chef de projet est de ne pas assumer les charges sur lesquels il n'a aucune prise. &lt;span style="font-weight: bold;"&gt;On ne peut être responsables des choses sur lesquelles on ne peut agir.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2616747491036769862?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2616747491036769862/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2616747491036769862' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2616747491036769862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2616747491036769862'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/les-affres-de-la-gestion-de-projet-de.html' title='Les affres de la gestion de projet de développement au forfait'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/SHzELzCv6cI/AAAAAAAAAHQ/N7cq6xPnjZE/s72-c/handshake.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4458122760551094132</id><published>2008-08-09T08:00:00.000-07:00</published><updated>2011-01-26T02:47:45.891-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivité'/><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><title type='text'>Le chemin bien sinueux de l'excellence</title><content type='html'>On dit toujours qu'il faut savoir programmer quelque soit le langage. Mais, il est illusoire de croire que l'on peut arriver à un tel degré d'abstraction que l'on saurait alors coder proprement dans n'importe quel langage.&lt;br /&gt;&lt;br /&gt;Bien que les bases de la programmation soient toujours nécessaires à acquérir d'une façon abstraite, &lt;span style="font-weight: bold;"&gt;la maîtrise d'un langage passe essentiellement par &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;la connaissance aiguë des librairies offertes autour de celui-ci&lt;/span&gt;. Car un bon programmeur est avant tout un programmeur qui réutilise un maximum ce qui existe déjà.&lt;br /&gt;&lt;br /&gt;Mais la capacité d'un programmeur à réutiliser des librairies existantes passe aussi par &lt;span style="font-weight: bold;"&gt;la compréhension des concepts véhiculées&lt;/span&gt; par celles-ci. La mesure de la compétence est quelque chose de difficile à estimer. La meilleur chose est de s'estimer en comparaison des véritables &lt;a href="http://en.wikipedia.org/wiki/Hacker"&gt;hackers&lt;/a&gt;, les demis-dieux, voire, les dieux tout court.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.catb.org/hacker-emblem/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SHZxykJuyZI/AAAAAAAAAG8/jJnlKAhLrkY/s400/glider.png" alt="" id="BLOGGER_PHOTO_ID_5221485931494558098" border="0" /&gt;&lt;/a&gt;J'ai trouvé une &lt;a href="http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm"&gt;matrice de compétence&lt;/a&gt; bien intéressante. Celle-ci offre une vue de ce que devrait être capable de faire un développeur expérimenté (ou avoir comme bagage), comme par exemple :&lt;br /&gt;&lt;blockquote&gt;- &lt;span style="font-weight: bold;"&gt;Capacité du code à être lu&lt;/span&gt; (code readability) : les présupposés du code sont vérifiés par l'utilisation d'asserts, le code défile naturellement - pas d'emboîtement profond de conditionnelles ou de méthodes&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;IDE&lt;/span&gt; : a écrit des macros personnalisées&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;exposition aux langages&lt;/span&gt; : Concurrent (Erlang, Oz) and Logic (Prolog)&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;années d'expérience professionnelle&lt;/span&gt; : 10+&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;livres&lt;/span&gt; : Structure and Interpretation of Computer Programs, Concepts Techniques, Models of Computer Programming, Art of Computer Programming, Database systems , by C. J Date, Thinking Forth, Little Schemer&lt;br /&gt;&lt;/blockquote&gt;On retrouve plein d'idées d'amélioration de ses propres compétences, plein de sujet d'étude à découvrir.&lt;br /&gt;&lt;br /&gt;Cela me fait penser à l'article &lt;a href="http://www.blogger.com/www.catb.org/%7Eesr/faqs/hacker-howto.html"&gt;"How To Become A Hacker"&lt;/a&gt; qui recense les caractéristiques d'un hacker, au sens "noble" du terme s'entend. Il est toujours bon de connaître le chemin même si &lt;a href="http://www.atari.com/thematrixpathofneo/"&gt;l'important est de l'arpenter&lt;/a&gt; ensuite, comme dirait l'autre.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.atari.com/thematrixpathofneo/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SHZxPqAxXwI/AAAAAAAAAG0/W6UPrTWVcL0/s400/NEO.png" alt="" id="BLOGGER_PHOTO_ID_5221485331772169986" border="0" /&gt;&lt;/a&gt;Le problème dans tout ça, c'est souvent le temps qui manque, et il n'est pas toujours facile de &lt;a href="http://www.catb.org/%7Eesr/faqs/hacker-howto.html#nerd_connection"&gt;concilier la vie courante et la vie de hacker&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Où vous situez-vous dans la &lt;a href="http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm"&gt;matrice de compétence&lt;/a&gt;, ou alors, pensez-vous que tout cela n'est pas bien réaliste et que les critères sont biaisés ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4458122760551094132?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4458122760551094132/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4458122760551094132' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4458122760551094132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4458122760551094132'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/le-chemin-bien-sinueux-de-lexcellence.html' title='Le chemin bien sinueux de l&apos;excellence'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/SHZxykJuyZI/AAAAAAAAAG8/jJnlKAhLrkY/s72-c/glider.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-7308710253522504416</id><published>2008-08-06T08:00:00.000-07:00</published><updated>2011-01-26T02:48:11.477-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gestion de contenu'/><title type='text'>Le contenu n'est pas une donnée</title><content type='html'>Il n'est pas toujours facile d'expliquer la différence entre du contenu et des données. Surtout à un développeur. Non, &lt;span style="font-weight: bold;"&gt;du contenu n'est pas simplement des données à stocker dans une base de données&lt;/span&gt;. Il faut prendre de la distance avec l'outil informatique. C'est ce qu'a très bien expliqué &lt;a href="http://www.blogger.com/profile/5445416"&gt;Seth Gottlieb&lt;/a&gt; dans son article &lt;a href="http://blog.contenthere.net/2008/05/content-is-not-data.html"&gt;"Content is not Data"&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;1. &lt;span style="font-weight: bold;"&gt;Le contenu a une voix&lt;/span&gt; : le contenu essaie de communiquer quelque chose (exprimer une idée, convaincre quelqu'un). Cette communication demande un processus créatif et en entreprise, des approbations sont peut-être nécessaires avant sa diffusion.&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-weight: bold;"&gt;Le contenu a un propriétaire&lt;/span&gt; : Les données n'ont généralement pas de copyright mais le contenu si.&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Le contenu est destiné à un auditoire humain&lt;/span&gt; : les auteurs de contenu ont un souci constant d'un bonne présentation de leur contenu.&lt;br /&gt;&lt;br /&gt;4. &lt;span style="font-weight: bold;"&gt;Le contenu a un contexte&lt;/span&gt; : En plus de savoir qui écrit le contenu, savoir où le contenu est présenté est aussi important.&lt;/blockquote&gt;Toutes ces caractéristiques du contenu implique des fonctionnalités que doivent proposer les &lt;a href="http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_contenu"&gt;CMS (Content Management Systems)&lt;/a&gt; notamment les plate-formes &lt;a href="http://en.wikipedia.org/wiki/Web_content_management_system"&gt;WCM&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;1. &lt;span style="font-weight: bold;"&gt;Gestion des versions&lt;/span&gt; : le but est de suivre l'évolution d'un contenu. Selon le type de contenu, il peut y avoir de nombreux changements sur un même contenu. Il est important de pouvoir revoir des anciennes versions, comparer des versions, annoter des versions...&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-weight: bold;"&gt;Gestion de la publication&lt;/span&gt; : la maîtrise de la diffusion et de la présentation du contenu implique des fonctionnalités importantes à offrir à l'auteur (éditeur WYSIWYG, prévisualisation, ...)&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Feedback&lt;/span&gt; : il est important qu'un auteur ai un retour sur son contenu (commentaires, votes, statistiques, systèmes d'analyse d'influence...)&lt;br /&gt;&lt;br /&gt;4. &lt;span style="font-weight: bold;"&gt;Métadonnées&lt;/span&gt; : stockage et exploitation des caractéristiques du document comme la source, le propriétaire, ...&lt;br /&gt;&lt;br /&gt;5. &lt;span style="font-weight: bold;"&gt;Utilisabilité du système&lt;/span&gt; : pour faciliter la création et l'exploitation de contenu, car il est coûteux et difficile de produire du contenu de qualité.&lt;/blockquote&gt;Le terme de gestion de contenu chevauche la notion de &lt;a href="http://fr.wikipedia.org/wiki/Gestion_%C3%A9lectronique_des_documents"&gt;gestion électronique de document&lt;/a&gt; (GED), qui elle, vise à stocker/indexer des documents électroniques (pdf, word...) ou des images de document papier.&lt;br /&gt;&lt;br /&gt;On parle souvent de GED dans le cas de la numérisation d'un stock de documents papier existant. Dans ce dernier cas, on tombe souvent dans des problèmes de numérisation de vieux documents agrafés, recto-verso, A3, couleur, etc.&lt;br /&gt;&lt;br /&gt;Des sociétés spécialisées, comme &lt;a href="http://www.jouve.fr/"&gt;Jouve&lt;/a&gt; ou &lt;a href="http://www.consulting.xerox.com/document-scanning/"&gt;Xerox Global Services&lt;/a&gt;, s'occupent de ce genre de travail. On mesure le nombre de documents à traiter au mètre cube (m&lt;span style="font-size:100%;"&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/span&gt;). Il est assez difficile de s'engager sur une charge et des délais quand on ne connaît que le nombre de m&lt;span style="font-size:100%;"&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/span&gt; à numériser, il faut alors donner une fourchette haute à l'estimation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-7308710253522504416?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/7308710253522504416/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=7308710253522504416' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7308710253522504416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7308710253522504416'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/le-contenu-nest-pas-une-donne.html' title='Le contenu n&apos;est pas une donnée'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2180240299533678593</id><published>2008-08-03T08:00:00.000-07:00</published><updated>2011-01-26T02:48:46.236-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture du SI'/><category scheme='http://www.blogger.com/atom/ns#' term='méthodes'/><title type='text'>Architecture des Systèmes d'Information et le framework de Zachman</title><content type='html'>Le &lt;a href="http://fr.wikipedia.org/wiki/Informatique_de_gestion#Histoire"&gt;système d'information d'entreprise&lt;/a&gt; est apparu petit à petit dans l'entreprise, simplifiant certaines tâches répétitives ou compliquées. Bien qu'on pourrait croire qu'elle est issue d'une volonté forte des directions des entreprises, &lt;span style="font-weight: bold;"&gt;elle a souvent été introduite par de véritables passionnés&lt;/span&gt;, des amateurs qui, de leur poste de travail, ont su voir des applications novatrices de l'ordinateur.&lt;br /&gt;&lt;br /&gt;Il n'est pas rare de rencontrer encore aujourd'hui &lt;a href="http://en.wikipedia.org/wiki/Legacy_system"&gt;des systèmes construits il y a fort longtemps&lt;/a&gt;, et maintenus jusqu'à aujourd'hui. C'est souvent le cas dans le monde de la banque ou dans les gros systèmes d'informations comme, par exemple, celui de France Telecom.&lt;br /&gt;&lt;br /&gt;Quand l'informatique ne fait pas parti de la stratégie de l'entreprise, elle s'immisce petit à petit dans son environnement, jusqu'à contrôler des parties vitales de son l'activité.&lt;br /&gt;&lt;br /&gt;J'ai vu en 1993, dans une entreprise de l'industrie chimique, un système construit de toute pièce par un enthousiaste de l'informatique. Le système a évolué du simple programme de suivi de l'activité d'une vanne au &lt;span style="font-weight: bold;"&gt;contrôle total d'une chaîne de production chimique de l'usine&lt;/span&gt;. Seules une ou deux personnes connaissaient le fonctionnement du logiciel (pas de documentation, pas de formation du personnels à l'informatique). Les personnes en charge de l'ouverture/fermeture des vannes se tournaient les pouces toute la journée, n'ayant plus d'opération à réaliser à la main.&lt;br /&gt;&lt;br /&gt;On ne sait jamais ce que va devenir du code que l'on produit dès qu'on le lâche dans un environnement (une entreprise, sur internet...). Les entreprises ont voulu maîtriser leur informatique. Est apparu alors ce que l'on appelle "l'Architecture des &lt;a href="http://en.wikipedia.org/wiki/Information_system"&gt;Systèmes d'Information&lt;/a&gt;" qu'on rencontre aujourd'hui sous le nom de Architecture d'Entreprise, Urbanisme...&lt;br /&gt;&lt;br /&gt;Nombre de méthodes et de cadres de travail sont apparus au cours du temps, et ce, depuis des lustres. L'un des travaux les plus intéressants a été la définition d'un cadre de définition d'une &lt;a href="http://www.research.ibm.com/journal/sj/263/ibmsj2603E.pdf"&gt;architecture d'une système d'information&lt;/a&gt; par &lt;a href="http://www.zachmaninternational.com/index.php/home-article/14"&gt;J. A. Zachman&lt;/a&gt;, aussi nommé le "&lt;a href="http://www.zachmaninternational.com/index.php/home-article/13"&gt;Zachman Framework&lt;/a&gt;". Le but était de trouver un cadre de travail pour cerner complètement l'ensemble des aspects d'une architecture d'un système d'information, &lt;span style="font-weight: bold;"&gt;sans contraindre les méthodes de travail&lt;/span&gt;.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.zachmaninternational.com/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/SHNje9np0vI/AAAAAAAAAGs/OSxOFrzhRrA/s800/ef+web+8.jpg" alt="" id="BLOGGER_PHOTO_ID_5220625776640643826" border="0" /&gt;&lt;/a&gt;On peut dire que Zachman a emprunter &lt;span style="font-weight: bold;"&gt;la méthode du reporter, du journaliste d'investigation&lt;/span&gt;. Pour tout système à analyser, il faut se poser les questions : &lt;a href="http://en.wikipedia.org/wiki/Five_Ws"&gt;quoi, comment, où, qui, quand, pourquoi&lt;/a&gt; (&lt;span style="font-weight: bold;"&gt;What, How, Where, Who, When, Why&lt;/span&gt;). En partant de ces différents aspects, il étudie le système à tous les niveaux de détail : de la stratégie d'entreprise à l'implémentation en passant par la conception, la construction...&lt;br /&gt;&lt;br /&gt;En fait, il construit une sorte de hiérarchie de vues basée sur les différents métier de l'entreprise : Planner, Owner, Designer, Builder, SubContractor, Functioning Entreprise. Ce qui est vraiment intéressant avec ce cadre, c'est que les vues métier découlent les unes des autres : La vue Owner découle de ce qui a été défini au niveau de la vue Planner, la vue Designer découle de la vue Owner, etc.&lt;br /&gt;&lt;br /&gt;En France, il n'y a pas eu de cadre comme le Zachman Framework mais une méthode très générique de spécification d'un système d'information d'entreprise : &lt;a href="http://fr.wikipedia.org/wiki/Merise_%28informatique%29"&gt;Merise&lt;/a&gt;. Cette méthode a défini différent modèles (MCD, MPD, MCT, etc.) qui se retrouvent dans le framework de Zachman. Merise a eu beaucoup de succès en son temps, mais il faut dire qu'aujourd'hui, seul le MCD/MLD ont réussi à résister au temps (&lt;span style="font-weight: bold;"&gt;même si on appelle aujourd'hui &lt;a href="http://www.commentcamarche.net/merise/mp.php3"&gt;MPD&lt;/a&gt; alors qu'il s'agit la plupart du temps du &lt;a href="http://www.commentcamarche.net/merise/mld.php3"&gt;MLD&lt;/a&gt; défini dans Merise&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Le temps passe, des méthodes apparaissent et disparaissent... Mais il faut bien séparer plusieurs notion :&lt;br /&gt;&lt;blockquote&gt;- un &lt;span style="font-weight: bold;"&gt;cadre de travail&lt;/span&gt; : vision de l'architecture d'entreprise indépendante de la méthode de travail (par exemple : Zachman Framework)&lt;br /&gt;&lt;br /&gt;- une &lt;span style="font-weight: bold;"&gt;méthode de travail&lt;/span&gt; : offre une définition claire des tâches et processus de travail pour obtenir une définition de l'architecture d'entreprise (Merise).&lt;br /&gt;&lt;br /&gt;- un &lt;span style="font-weight: bold;"&gt;répertoire de bonne pratique&lt;/span&gt; : pour l'organisation du SI ou pour travailler sur la définition du SI (par exemple &lt;a href="http://en.wikipedia.org/wiki/Information_Technology_Infrastructure_Library"&gt;ITIL&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/CMMI"&gt;CMMi&lt;/a&gt;).&lt;br /&gt;&lt;/blockquote&gt;Toutes ces notions ne recouvrent pas les même objectifs, et sont donc souvent complémentaires : on peut utiliser le framework de Zachman, en définissant des modèles Merise (MCD, MPD) en suivant un processus de développement logiciel basé sur CMMi tout en structurant les services IT autour de la notion de client/contrat : ITIL.&lt;br /&gt;&lt;br /&gt;Il est rare de voir les entreprise adhérer à tous les concepts portés par ces notions. &lt;a href="http://en.wikipedia.org/wiki/Change_management_%28people%29#Organizational_change_management"&gt;Le poids de l'existant est souvent trop lourd à porter&lt;/a&gt;. En effet, dès que le nombre de personnes entrant et sortant de l'entreprise est faible (le turnover), les personnes se mettent à travailler selon un schéma plus ou moins efficace mais avec une très forte inertie.&lt;br /&gt;&lt;br /&gt;Et puis, il est plus risqué dans une grosse entreprise de faire les choses différemment plutôt que de faire comme tout le monde fait depuis des années sans se poser de questions. Les méthodes et cadres ont&lt;span style="font-weight: bold;"&gt; l'avantage de provoquer le personnel des entreprises&lt;/span&gt; en confrontant une vue "idéale" au monde des processus réels de l'entreprise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2180240299533678593?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2180240299533678593/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2180240299533678593' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2180240299533678593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2180240299533678593'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/08/architecture-des-systmes-dinformation.html' title='Architecture des Systèmes d&apos;Information et le framework de Zachman'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dJYBJhDg2Hk/SHNje9np0vI/AAAAAAAAAGs/OSxOFrzhRrA/s72-c/ef+web+8.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1410327036892823932</id><published>2008-07-31T08:00:00.000-07:00</published><updated>2011-01-26T02:49:02.235-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>How to convert a file to a specific coding system without the help of iconv</title><content type='html'>I've once had a problem with coding system. I inadvertently inserted an euro (€) sign into a classic (Unix) buffer, and when I asked emacs to save it, it told me that the coding system I was using was not able to save correctly my buffer.&lt;br /&gt;&lt;br /&gt;I saved it using UTF-8, but after that, when I opened the file, Emacs was unable to guess that it was UTF-8.&lt;br /&gt;&lt;br /&gt;I found a little command &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;set-buffer-file-coding-system&lt;/span&gt;&lt;/span&gt; that you can call by &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;C-x RET f&lt;/span&gt;&lt;/span&gt; that allow me to specify which coding system I want to use for the current buffer and file. This is not like reverting to a specific coding system, no, emacs is really converting the file and each and every character in it to the coding system I want.&lt;br /&gt;&lt;br /&gt;That way, I then save the file with the correct coding system, emacs having done the conversion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1410327036892823932?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1410327036892823932/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1410327036892823932' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1410327036892823932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1410327036892823932'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/how-to-convert-file-to-specific-coding.html' title='How to convert a file to a specific coding system without the help of iconv'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-5298464683702085014</id><published>2008-07-30T08:00:00.000-07:00</published><updated>2011-01-26T02:49:17.010-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de données'/><category scheme='http://www.blogger.com/atom/ns#' term='sécurité'/><title type='text'>Les vues et le contrôle d'accès fin aux données</title><content type='html'>&lt;span style="font-weight: bold;"&gt;La caractéristique principale d'un développeur est &lt;a href="http://uncyclopedia.org/wiki/Lazy_Programming"&gt;la fainéantise&lt;/a&gt; !&lt;/span&gt; Si un développeur n'est pas assez fainéant, il ne se préoccupera pas de minimiser le nombre de lignes de code qui lui sont nécessaires.&lt;br /&gt;&lt;br /&gt;Dans le cadre des &lt;a href="http://en.wikipedia.org/wiki/Information_systems"&gt;systèmes d'information&lt;/a&gt;, il existe un moyen important à maîtriser pour réduire un maximum le &lt;a href="http://en.wikipedia.org/wiki/Duplicate_code"&gt;code source redondant&lt;/a&gt;, comme le code source servant à vérifier l'accès aux données qu'a le droit de voir l'utilisateur. &lt;span style="font-weight: bold;"&gt;Nombre d'applications sont complètement sclérosées par du code dupliqué&lt;/span&gt;, répété à chaque fois qu'un accès à lieu à la base de données.&lt;br /&gt;&lt;br /&gt;Un développeur orienté programme aura tout de suite envie de parler &lt;a href="http://en.wikipedia.org/wiki/Aspect_oriented_programming"&gt;Programmation par Aspect&lt;/a&gt;, alors qu'il y a pourtant une méthode bien plus simple et d'ailleurs bien plus éprouvée.&lt;br /&gt;&lt;br /&gt;Quand les utilisateurs d'une application ne doivent être autorisés qu'à consulter et modifier qu'une partie des informations existante en base de données,&lt;span style="font-weight: bold;"&gt; le plus simple est de créer des vues au dessus des tables contenant les données&lt;/span&gt;. Cela permet :&lt;br /&gt;&lt;blockquote&gt;- d'encapsuler la logique de sécurité à un seul endroit : la vue&lt;br /&gt;&lt;br /&gt;- de masquer la logique de sécurité au code source, permet ainsi de rendre l'application indépendante de la logique de sécurité&lt;br /&gt;&lt;br /&gt;- de changer de logique de sécurité sans se soucier des impacts au niveau du code source de l'application.&lt;br /&gt;&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SGoLh6d4WQI/AAAAAAAAAGk/Is_kA9j3Diw/s1600-h/cadenas.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 197px; height: 122px;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SGoLh6d4WQI/AAAAAAAAAGk/Is_kA9j3Diw/s400/cadenas.jpg" alt="" id="BLOGGER_PHOTO_ID_5217995795520313602" border="0" /&gt;&lt;/a&gt;La vue est un concept très simple à comprendre, mais si peu utilisée malheureusement ! Il n'est pas rare de retrouver le même code alambiqué recodant la même logique de sécurité (la clause WHERE de chaque requête SQL). C'est souvent le cas pour MySQL, car ce &lt;a href="http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_base_de_donn%C3%A9es"&gt;SGBD&lt;/a&gt; n'offre pas &lt;a href="http://en.wikipedia.org/wiki/View_%28database%29"&gt;toutes les caractéristiques que l'on attend des vues&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;J'ai cherché comment coder proprement avec MySQL, un système de gestion des droits fins d'accès au données, comme on peut le &lt;a href="http://asktom.oracle.com/tkyte/article2/"&gt;retrouver&lt;/a&gt; &lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/security.htm#CNCPT1592"&gt;classiquement&lt;/a&gt; dans des systèmes de gestion de bases de données &lt;a href="http://www.oracle.com/database/"&gt;"sérieux"&lt;/a&gt;. J'en ai fait un article : &lt;a href="http://jradix.blogspot.com/p/mysql-50-fine-grained-access-control.html"&gt;MySQL 5.0 Fine-Grained Access Control (FGAC)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;On peut voir sur le site mysql.com que &lt;a href="http://dev.mysql.com/tech-resources/articles/mysql-complete-reference-ch14.pdf"&gt;la notion de Fine Grained Access Control n'est pas comprise dans son acceptation la plus courante&lt;/a&gt;. Chez MySQL, elle se contente d'aller jusqu'au contrôle d'accès au niveau des colonnes. Mais quand on parle de Fine Grained access control, on pense à un contrôle d'accès au données au niveau de la ligne ("row level security").&lt;br /&gt;&lt;br /&gt;Le contrôle d'accès au niveau ligne peut s'implémenter dans à peu près tous les systèmes offrant des vues, même si certains &lt;a href="http://sepgsql.googlecode.com/files/sepgsql_security_guide.20080214.en.pdf"&gt;"se la pètent"&lt;/a&gt; plus que d'autre comme &lt;a href="http://code.google.com/p/sepgsql/"&gt;SE-postgreSQL&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;"Only a few commercial DBMS products provide such functionality.&lt;/span&gt;"&lt;br /&gt;&lt;/blockquote&gt;Euh... non. Même sur &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; (pas SE-PostgreSQL) on peut le faire avec un système similaire à celui que je propose dans mon article. PostgreSQL est beaucoup plus propre que MySQL au niveau des vues, l'implémentation du FGAC est moins tordue.&lt;br /&gt;&lt;br /&gt;Le choix d'un système de vues pour contrôler comment l'application voit des données est &lt;span style="font-weight: bold;"&gt;une décision qui doit être prise au moment de la conception&lt;/span&gt;. Il est intéressant de définir clairement quelles sont les vues, et notamment, dans le dossier de politique sécurité, comment est implémenté le contrôle d'accès fin aux données.&lt;br /&gt;&lt;br /&gt;Les vues se retrouvent plus ou moins dans tous les systèmes de gestion de bases de données, avec beaucoup de variantes, &lt;span style="font-weight: bold;"&gt;&lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt; ayant certainement la palme de la norme la moins suivi au monde&lt;/span&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-5298464683702085014?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/5298464683702085014/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=5298464683702085014' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5298464683702085014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5298464683702085014'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/les-vues-et-le-contrle-daccs-fin-aux.html' title='Les vues et le contrôle d&apos;accès fin aux données'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dJYBJhDg2Hk/SGoLh6d4WQI/AAAAAAAAAGk/Is_kA9j3Diw/s72-c/cadenas.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-6746886026073765520</id><published>2008-07-26T08:00:00.000-07:00</published><updated>2011-01-26T02:50:02.305-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de données'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Les mises à jour perdues sont trop souvent perdues</title><content type='html'>Il est assez honteux de voir encore aujourd'hui des applications Web ne pas traiter les problèmes de &lt;span style="font-weight: bold;"&gt;mises à jour perdues ("lost updates")&lt;/span&gt;. Ce problème est &lt;a href="http://en.wikipedia.org/wiki/Transaction_processing"&gt;vieux comme le monde&lt;/a&gt;, des solutions plus ou moins complexes existent, et pourtant, cela n'empêche pas de le retrouver dans beaucoup d'applications de type concurrente et même dans les frameworks récents comme Grails par exemple.&lt;br /&gt;&lt;br /&gt;J'ai rarement vu des dossiers de conception parler explicitement du problème et des solutions choisies. C'est pourtant une des rares choses à étudier.&lt;br /&gt;&lt;br /&gt;Pour rappel donc, voici le scénario de ce problème :&lt;br /&gt;&lt;br /&gt;Sur une application concurrente (comme le sont toutes les applications Web) :&lt;br /&gt;&lt;blockquote&gt;- une session 1, lit l'information A&lt;br /&gt;- une session 2, lit l'information A&lt;br /&gt;- la session 1, met à jour l'information A&lt;br /&gt;- la session 2, met à jour l'information A&lt;br /&gt;&lt;/blockquote&gt;La session 2 va écraser les mises à jour de la session 1 sans s'en apercevoir !&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ce problème arrive dès qu'une information est gérée concurremment&lt;/span&gt; (par plusieurs personnes en même temps).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/Expert-Oracle-Database-Architecture-Programming/dp/1590595300"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SGO5oKm7tKI/AAAAAAAAAGU/BHOWxJTNsX8/s400/519EFPVGTjL._SL500_AA240_.jpg" alt="" id="BLOGGER_PHOTO_ID_5216216893118723234" border="0" /&gt;&lt;/a&gt;Le problème est très bien explicité dans &lt;a href="http://www.amazon.com/Expert-Oracle-Database-Architecture-Programming/dp/1590595300"&gt;Expert Oracle Database Architecture&lt;/a&gt; de &lt;a href="http://asktom.oracle.com/"&gt;Tom Kyte&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La première chose à faire quand on construit une application Web, c'est de déterminer &lt;span style="font-weight: bold;"&gt;quelles sont les informations qui risquent d'être mises à jour par plusieurs personnes en même temps&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ce ne sont pas toutes les informations qui sont accédées en même temps. Même si plusieurs utilisateurs accèdent à la même table en même temps, il se peut que par conception, il soit impossible aux uns d'écraser les données des autres.&lt;br /&gt;&lt;br /&gt;Ensuite, on peut utiliser plusieurs méthodes pour empêcher le problème des mises à jour perdues:&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;sérialiser tous les accès à l'information&lt;/span&gt; (on empêche d'accéder et mettre à jour une information tant qu'elle est en train d'être prise en charge par quelqu'un) : cela revient à mettre un verrou sur l'information, on perd alors tout l'intérêt d'une application concurrente.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;mettre un marqueur sur chaque information&lt;/span&gt; pour signifier à quelle date l'information a été mise à jour pour la dernière fois. Concrètement, si l'information est stockée dans une base de données, il s'agit de rajouter par exemple une colonne LAST_MOD contenant la date de dernière modification.&lt;br /&gt;&lt;br /&gt;Avant chaque mise à jour, il doit y avoir une vérification que la date de dernière mise à jour LAST_MOD n'est pas plus récente que la date LAST_MOD existante lors de la lecture de l'information. Le scénario se déroule alors comme suit :&lt;br /&gt;&lt;blockquote&gt;- la session 1, lit l'information A et le date LAST_MOD (last_mod1)&lt;br /&gt;&lt;br /&gt;- la session 2, lit l'information A et le date LAST_MOD (last_mod1)&lt;br /&gt;&lt;br /&gt;- la session 1, vérifie que LAST_MOD n'est pas plus récent que last_mod1. Ce n'est pas le cas donc l'information A est mise à jour, la date LAST_MOD contient maintenant la date à laquelle session 1 a mis à jour l'information (disons last_mod2),&lt;br /&gt;&lt;br /&gt;- la session 2, vérifie que LAST_MOD n'est pas plus récent que last_mod1. C'est le cas puisque LAST_MOD en base vaut last_mod2 qui est plus récent que last_mod1. &lt;span style="font-weight: bold;"&gt;Le problème doit être alors remonté à l'utilisateur&lt;/span&gt; (par exemple, un message l'avertis que l'information A a été mise à jour depuis qu'on lui a présenté.)&lt;/blockquote&gt;- &lt;span style="font-weight: bold;"&gt;Le problème de LAST_MOD c'est qu'on n'est pas sûr à 100% qu'il n'y ai pas de mise à jour exactement au même moment par rapport au système&lt;/span&gt;. &lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#i1847"&gt;Si la précision de LAST_MOD est la seconde&lt;/a&gt;, il peut arriver le cas où les deux mises à jour se passent dans la même seconde. Le cas est rare il est vrai mais peut exister. Pour pallier à ce problème, il faut recourir à une valeur unique, calculée en fonction de la valeur de l'information. &lt;a href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_obtool.htm#i1002228"&gt;On calcule donc une chaîne de hachage&lt;/a&gt; et on la gère comme LAST_MOD (dans une colonne HASH par exemple)&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;On peut ne pas vouloir bloquer les mises à jour quand ce n'est pas la même colonne qui est mise à jour.&lt;/span&gt; Pour une ligne dans une table de base de données, il y a plusieurs informations. Parfois deux utilisateurs veulent mettre à jour en même temps la ligne mais pas la même colonne de cette ligne. Ainsi, avec LAST_MOD ou HASH, on s'assure qu'il n'y a pas de mise à jour de toute la ligne en même temps. Mais il peut être intéressant de stocker les valeurs de chaque colonne de la ligne &lt;a href="http://java.sun.com/javaee/5/docs/api/javax/servlet/http/HttpSession.html"&gt;dans la session de l'utilisateur&lt;/a&gt; et de les comparer à celle de la base avant de faire la mise à jour.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;On met à jour seulement les informations qui ont changées&lt;/span&gt;, le risque de mise à jour perdu diminue puisque la probabilité de mettre à jour la même colonne de la même ligne en même temps est plus faible. Cela permet d'être moins sensible aux mises à jour perdues et de remonter moins de problème à l'utilisateur.&lt;br /&gt;&lt;br /&gt;Quelque soit la méthode employée, il est important d'en choisir une et de s'y tenir pour l'ensemble de l'application, pour qu'il soit plus facile de la maintenir. La méthode doit bien sur être explicité dans le &lt;a href="http://fr.wikipedia.org/wiki/Conception_de_produit"&gt;dossier de conception&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Il faut bien garder à l'esprit que&lt;span style="font-weight: bold;"&gt; le problème des mises à jour perdues peut se produire pour n'importe quelle information, pas seulement en base de données&lt;/span&gt;. Dès que les données sont partagées (dans un fichier, en mémoire...), il faut faire attention aux utilisateurs qui vont les mettre à jour.&lt;br /&gt;&lt;br /&gt;Parfois même un seul utilisateur peut perdre ses mises à jour s'il ne fait pas attention à ce qu'il fait sur chacun de ses écrans :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.neowave.com.my/sellmore/index.php/2007/07/13/run-your-online-store-in-dual-screen/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_dJYBJhDg2Hk/SGO6_9cJ-wI/AAAAAAAAAGc/U9Ao2coZ6mE/s320/124148692_7b1a018e0a.jpg" alt="" id="BLOGGER_PHOTO_ID_5216218401412348674" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-6746886026073765520?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/6746886026073765520/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=6746886026073765520' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6746886026073765520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/6746886026073765520'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/les-mises-jour-perdues-sont-trop.html' title='Les mises à jour perdues sont trop souvent perdues'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/SGO5oKm7tKI/AAAAAAAAAGU/BHOWxJTNsX8/s72-c/519EFPVGTjL._SL500_AA240_.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-5634676508293447161</id><published>2008-07-22T08:00:00.000-07:00</published><updated>2011-01-26T02:50:19.724-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commerce'/><category scheme='http://www.blogger.com/atom/ns#' term='emploi'/><title type='text'>Surqualification en SSII, les ingénieurs analystes programmeurs</title><content type='html'>C'est un peu triste à constater mais &lt;span style="font-weight: bold;"&gt;la majorité des informaticiens professionnels ne développe que des applications Web&lt;/span&gt;.  Aujourd'hui nombreux sont les ingénieurs informatique qui, dans les &lt;a href="http://fr.wikipedia.org/wiki/Soci%C3%A9t%C3%A9_de_services_en_ing%C3%A9nierie_informatique"&gt;SSII&lt;/a&gt; (j'en ai fait parti) n'effectue qu'un travail d'analyse et de programmation.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SGOOOBcDmCI/AAAAAAAAAGM/v6MHvWr0yoQ/s1600-h/iut.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 206px; height: 152px;" src="http://1.bp.blogspot.com/_dJYBJhDg2Hk/SGOOOBcDmCI/AAAAAAAAAGM/v6MHvWr0yoQ/s320/iut.jpg" alt="" id="BLOGGER_PHOTO_ID_5216169164980590626" border="0" /&gt;&lt;/a&gt;&lt;span&gt;Ce profil s'appelle l'&lt;a href="http://www.studyrama.com/article.php3?id_article=1059"&gt;analyste-programmeur&lt;/a&gt;, et &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;c'est ce que, normalement, on est 2 ans après le bac avec un &lt;a href="http://www.sup.adc.education.fr/iutlst/"&gt;DUT Informatique&lt;/a&gt;&lt;/span&gt;. Il n'y a rien qu'à voir les débouchés cités sur &lt;a href="http://iut-a.univ-lyon1.fr/14042709/0/fiche___article/&amp;amp;RH="&gt;la plaquette de l'IUT Lyon&lt;/a&gt; par exemple, pour s'apercevoir que c'est exactement ce que font des milliers d'ingénieurs en SSII.&lt;br /&gt;&lt;br /&gt;Les applications de Système d'Information ne nécessite qu'un profil d'analyste programmeur pour correctement modéliser l'information et la mettre en œuvre. Dans les branches dites d'Intégration ou de Système d'Information, les SSII ont finalement &lt;a href="http://www.munci.org/20080309/FAFIEC-Rapport-d-activite-2006-2007-les-fonds-de-formation-toujours-sous-utilises"&gt;peu recours à la formation&lt;/a&gt; de leurs employés. L'&lt;a href="http://www.munci.org/20080315/INFORMATICIEN-en-SSII-les-raisons-du-MALAISE"&gt;analyse du Munci sur le malaise en SSII&lt;/a&gt; est assez flagrant :&lt;br /&gt;&lt;blockquote&gt;Bien souvent, les jeunes recrues des SSII, qui n’ont connu que ces sociétés (et qui ne connaitront peut-être qu’elles), qui plus est dans un contexte conjoncturel qui leur est favorable, n’ont pas encore conscience de tous ces problèmes (quelques années sont généralement nécessaires pour y voir plus clair...) : &lt;span style="font-weight: bold;"&gt;beaucoup font preuve d’une certaine naïveté (pour ne pas dire une certaine suffisance) par manque de repères et de comparaisons possibles.&lt;/span&gt; Et c’est ainsi que toute une génération, plus ou moins résignée, subit progressivement une mise en condition dictée par le "moins-disant professionnel"...&lt;/blockquote&gt;Beaucoup de problèmes d'organisation du métier d'informaticien semblent liés à la jeunesse des acteurs, à leur naïveté (j'ai été moi même très naïf sur le métier d'informaticien). Si jeunesse savait, si vieillesse pouvait :) Le problème c'est que les vieux informaticiens se font rare, ou sont au chômage...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-5634676508293447161?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/5634676508293447161/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=5634676508293447161' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5634676508293447161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/5634676508293447161'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/surqualification-en-ssii-les-ingnieurs.html' title='Surqualification en SSII, les ingénieurs analystes programmeurs'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dJYBJhDg2Hk/SGOOOBcDmCI/AAAAAAAAAGM/v6MHvWr0yoQ/s72-c/iut.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-2819519333379101680</id><published>2008-07-18T08:00:00.001-07:00</published><updated>2011-01-26T02:50:42.734-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Sortir du monde XML</title><content type='html'>&lt;a href="http://www.w3.org/TR/xml/"&gt;XML&lt;/a&gt;, c'est bien connu, est verbeux à outrance. L'objectif initial de XML était de permettre de rendre lisible par un humain les données structurées. Cela présuppose qu'avant XML, les données n'étaient pas lisibles.&lt;br /&gt;&lt;br /&gt;Perso, je préfère lire du &lt;a href="http://tools.ietf.org/html/rfc4180"&gt;CSV&lt;/a&gt; ou équivalent (comme par exemple les &lt;a href="http://www.openbsd.org/cgi-bin/man.cgi?query=passwd&amp;amp;apropos=0&amp;amp;sektion=5&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html"&gt;fichiers de conf sous Unix&lt;/a&gt; comme &lt;a href="http://httpd.apache.org/docs/1.3/configuring.html#syntax"&gt;httpd.conf&lt;/a&gt;) plutôt que du XML. Certains vont même jusqu'à &lt;a href="http://hsivonen.iki.fi/producing-xml/#nottext"&gt;considérer XML comme un fichier binaire&lt;/a&gt; dans lequel il ne faut jamais regarder et qu'on n'utilise qu'à travers des outils.&lt;br /&gt;&lt;br /&gt;Ce n'est pas étonnant qu'on en soit arrivé là sachant que la plupart des promoteurs des technologies XML et associées (je pense surtout à &lt;a href="http://www.w3.org/TR/2007/REC-soap12-part0-20070427/"&gt;SOAP&lt;/a&gt;) sont &lt;span style="font-weight: bold;"&gt;des éditeurs d'outils qui ont tout intérêt à ce que XML ne soit pas lisible facilement par un être humain normal&lt;/span&gt;, et qu'on soit obligé de passer par un outil pour le manipuler. Ces éditeurs sont toujours les même : Microsoft, IBM en tête.&lt;br /&gt;&lt;br /&gt;Non, XML et &lt;a href="http://www.eod.com/devil/archive/xml.html"&gt;sa complexité inhérente&lt;/a&gt;, n'est pas issu d'un besoin client. Des formats simples comme le CSV par exemple ont été mise en oeuvre avec succès depuis très longtemps sans aucun problème d'incompatibilité. Quand une application doit gérer des flux importants, même avec nos serveurs surpuissants et nos réseaux terabytes, nous n'avons pas assez de bande passante pour supporter la verbosité d'XML.&lt;br /&gt;&lt;br /&gt;C'est pourquoi de nouveaux formats sont apparus à la suite d'XML, car c'est bien connu en informatique, comme dans &lt;a href="http://www.geocities.com/tablizer/itpot.htm"&gt;l'industrie de la mode vestimentaire&lt;/a&gt;, une nouvelle technologie rend, au yeux du public, les anciennes technologies ringardes et dépassées :&lt;br /&gt;&lt;blockquote&gt;Les outils de développement logiciel et les technologies de l'information en général, partagent ces traits communs avec l'industrie de la mode vestimentaire:&lt;br /&gt;&lt;br /&gt;    - elle préfère des employés jeunes,&lt;br /&gt;&lt;br /&gt;    - elle change souvent,&lt;br /&gt;&lt;br /&gt;    - ce qui est vieux est "repackagé" en quelque chose de nouveau après une décade ou deux,&lt;br /&gt;&lt;br /&gt;    - la &lt;span style="font-weight: bold;"&gt;preuve de la supériorité de cette Nouvelle Chose n'est pas vraiment attendue&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.geocities.com/tablizer/itpot.htm"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SH243q8mkTI/AAAAAAAAAHg/uAkwO-IxIQ0/s400/running.gif" alt="" id="BLOGGER_PHOTO_ID_5223534409380434226" border="0" /&gt;&lt;/a&gt;On peut noter que malgré ça, le CSV à toujours de &lt;a href="http://www.google.com/trends?q=XML%2CCSV&amp;amp;ctab=0&amp;amp;geo=all&amp;amp;date=all&amp;amp;sort=1"&gt;beaux jours devant lui&lt;/a&gt;. &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; est apparu suite à l'émergence des applications &lt;a href="http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML"&gt;Ajax&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mais c'est maintenant Google qui se met à rendre public le format d'échange de données qu'il utilise partout en interne (justement parce qu'XML est trop lourd). Il s'agit de &lt;a href="http://code.google.com/p/protobuf/"&gt;Protocol Buffers&lt;/a&gt;.&lt;br /&gt;Ce nouveau format fait beaucoup de bruit, on peut lire &lt;a href="http://blogs.tedneward.com/2008/07/11/So+You+Say+You+Want+To+Kill+XML.aspx"&gt;un article de Ted Neward&lt;/a&gt; sur le sujet.&lt;br /&gt;&lt;br /&gt;Face à XML, on voit donc tout un front de nouvelles technologies qui visent à remplacer la génération des protocoles et technos XML décadente, tellement encrée dans les années 90 :) :&lt;br /&gt;- JSON&lt;br /&gt;- Protocol Buffers&lt;br /&gt;- &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm"&gt;REST&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.adobe.com/fr/products/flex/"&gt;Flex&lt;/a&gt; &amp;amp; consort&lt;br /&gt;- &lt;a href="http://yaml.org/"&gt;YAML&lt;/a&gt;&lt;br /&gt;- ...&lt;br /&gt;&lt;br /&gt;Avec ces "nouvelles" technologies, on est toujours en face d'une guerre sans merci pour se disputer le marcher juteux de l'IT. Mais est-ce pour le bien de l'humanité ? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-2819519333379101680?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/2819519333379101680/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=2819519333379101680' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2819519333379101680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/2819519333379101680'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/sortir-du-monde-xml.html' title='Sortir du monde XML'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dJYBJhDg2Hk/SH243q8mkTI/AAAAAAAAAHg/uAkwO-IxIQ0/s72-c/running.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-7131579773978631313</id><published>2008-07-15T08:00:00.000-07:00</published><updated>2011-01-26T02:50:52.880-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Insert random Japanese Hiragana to overlearn them</title><content type='html'>Here are some functions I wrote to create a page of random &lt;a href="http://en.wikipedia.org/wiki/Hiragana"&gt;hiragana&lt;/a&gt; for me to exercise for character recognition. The main goal is to learn to recognize quickly hiraganas and pronunce them correctly. As hiragana are written in a random order, it's not an exercise for learning to read japanese :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun delnth (n l)&lt;br /&gt; (if (zerop n)&lt;br /&gt;     (cdr l)&lt;br /&gt;   (let ((prev (nthcdr (1- n) l)))&lt;br /&gt;     (setcdr prev (cddr prev)))&lt;br /&gt;   l))&lt;br /&gt;&lt;br /&gt;(defun random-insert (nb l)&lt;br /&gt; (let ( (remaining (copy-sequence l) ) (inserted nil) (num -1) )&lt;br /&gt;   (while (&gt; nb 0)&lt;br /&gt;     (while (and (&gt; (length remaining) 0) (&gt; nb 0))&lt;br /&gt;       (setq num (random (length remaining)))&lt;br /&gt;       (setq elem (nth num remaining))&lt;br /&gt;       (insert elem)&lt;br /&gt;       (setq inserted (cons elem inserted))&lt;br /&gt;       (setq remaining (delnth num remaining))&lt;br /&gt;       (setq nb (1- nb)))&lt;br /&gt;     (if (&gt; nb 0)&lt;br /&gt;         (progn&lt;br /&gt;           (setq remaining inserted)&lt;br /&gt;           (setq inserted nil))))))&lt;br /&gt;&lt;br /&gt;(defvar jp-hiragana '("か" "け" "き" "こ" "く" "じゃ"&lt;br /&gt;                     "ぐ" "げ" "が" "ご" "ぎ" "と"&lt;br /&gt;                     "て" "た" "お" "ひゃ" "あ" "え"&lt;br /&gt;                     "い" "しゅ" "みゅ" "ぷ" "ぴゅ"&lt;br /&gt;                     "ぱ" "ぺ" "ぴ" "う" "ぽ" "びゅ"&lt;br /&gt;                     "じょ" "みょ" "ぴょ" "よ" "や"&lt;br /&gt;                     "ゆ" "ひ" "ほ" "は" "へ" "きょ"&lt;br /&gt;                     "ど" "で" "だ" "ちゃ" "しょ" "ぎゃ"&lt;br /&gt;                     "つ" "りょ" "ぎょ" "め" "ま" "も"&lt;br /&gt;                     "きゅ" "み" "む" "ちょ" "じゅ" "し"&lt;br /&gt;                     "ひょ" "ぞ" "ぜ" "ざ" "ず" "づ"&lt;br /&gt;                     "びょ" "ぎゅ" "ん" "る" "にゃ"&lt;br /&gt;                     "れ" "ら" "ろ" "り" "ひゅ" "りゃ"&lt;br /&gt;                     "に" "の" "な" "ね" "ぬ" "びゃ"&lt;br /&gt;                     "りゅ" "じ" "ぢ" "ち" "わ" "を"&lt;br /&gt;                     "ふ" "にゅ" "す" "そ" "さ" "べ"&lt;br /&gt;                     "せ" "ば" "ぼ" "び" "ぶ" "みゃ"&lt;br /&gt;                     "ぴゃ" "しゃ" "ちゅ" "にょ" "きゃ")&lt;br /&gt; "List of all Japanese Hiragana with different sonorizations and&lt;br /&gt; concatenated syllables")&lt;br /&gt;&lt;br /&gt;(defun jp-insert-exo (nbchar)&lt;br /&gt; "Print a page of Japanese exercice."&lt;br /&gt; (interactive "nNumber of characters to print: ")&lt;br /&gt; (random-insert nbchar jp-hiragana))&lt;br /&gt;&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_dJYBJhDg2Hk/SH4MoEBRfhI/AAAAAAAAAHs/lfxNODfkHYw/s1600-h/450px-Piezas.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_dJYBJhDg2Hk/SH4MoEBRfhI/AAAAAAAAAHs/lfxNODfkHYw/s200/450px-Piezas.JPG" alt="" id="BLOGGER_PHOTO_ID_5223626500209737234" border="0" /&gt;&lt;/a&gt;The function &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;delnth&lt;/span&gt;&lt;/span&gt; returns the list with the nth element removed. &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Random-insert&lt;/span&gt;&lt;/span&gt; randomly insert elements of a list of strings or characters. The variable &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;jp-hiragana&lt;/span&gt;&lt;/span&gt; bring together all hiragana including different sonorization, and syllable concatenation.&lt;br /&gt;&lt;br /&gt;The function &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;jp-insert-exo&lt;/span&gt;&lt;/span&gt; command insert the given number nbchar of hiragana into the current buffer.&lt;br /&gt;&lt;br /&gt;One limitation is that hiragana are inserted on a line. One could enhance these functions to correctly write them from top to bottom and left to right.&lt;br /&gt;&lt;br /&gt;We can imagine the same kind of thing for &lt;a href="http://en.wikipedia.org/wiki/Katakana"&gt;katakana&lt;/a&gt; or even &lt;a href="http://en.wikipedia.org/wiki/Kanji"&gt;kanji&lt;/a&gt;. This exercise is interesting when you start to learn kana. The goal is to &lt;a href="http://en.wikipedia.org/wiki/Overlearning"&gt;overlearn&lt;/a&gt; the kana in order to be really at ease with them.&lt;br /&gt;&lt;br /&gt;Print a page or two of them and now, let's practise Hiragana ! Just pronounce each hiragana loudly (or loudly in your head) one after the other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-7131579773978631313?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/7131579773978631313/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=7131579773978631313' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7131579773978631313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/7131579773978631313'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/insert-random-japanese-hiragana-to.html' title='Insert random Japanese Hiragana to overlearn them'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_dJYBJhDg2Hk/SH4MoEBRfhI/AAAAAAAAAHs/lfxNODfkHYw/s72-c/450px-Piezas.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4561983339995192801</id><published>2008-07-14T08:00:00.000-07:00</published><updated>2011-01-26T02:51:35.102-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Un boufficiel de plus : le système d'exploitation</title><content type='html'>Il n'y a plus besoin de recherche sur les systèmes d'exploitation depuis les années 70. Comme &lt;a href="http://oreilly.com/catalog/opensources/book/linus.html"&gt;nous le rappelle fort bien Linus Torvald&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.wikipedia.org/wiki/Helsinki_university"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SF_IemgwlQI/AAAAAAAAAFo/F2V2s86T9nQ/s400/teksti_kampus_keskusta1.jpg" alt="" id="BLOGGER_PHOTO_ID_5215107321577903362" border="0" /&gt;&lt;/a&gt;Heureusement, je n'ai jamais senti de pression pour suivre les microkernels. L'université d'Helsinki fait de la recherche sur les système d'exploitation depuis les années 60, et les personnes là-bas, ne voient plus les noyaux des systèmes d'exploitation comme des sujets de recherche. En un sens, ils avait raison : la base des systèmes d'exploitation, et par extension du noyau Linux, sont bien connus depuis le début des années 70. &lt;span style="font-weight: bold;"&gt;Toute chose après ça a été, à un certain niveau, un exercice d'auto-gratification&lt;/span&gt;.&lt;/blockquote&gt;Les Un*x, Windows et &lt;a href="http://en.wikipedia.org/wiki/List_of_operating_systems"&gt;autres systèmes d'exploitation&lt;/a&gt;, sont construits autour d'implémentations très similaires, &lt;span style="font-weight: bold;"&gt;voire même identiques&lt;/span&gt;. Notamment la couche réseau Windows, qui fut longtemps basée sur l'implémentation BSD et qui seulement récemment à été &lt;a href="http://en.wikipedia.org/wiki/Windows_Vista_networking_technologies"&gt;re-développée&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;On peut se demander pourquoi redévelopper une couche réseau extrêmement éprouvée à tous les niveaux (performance, sécurité, etc.). En effet, il y a de grandes chances qu'on voit réapparaître des bugs critiques sous Windows &lt;span style="font-weight: bold;"&gt;qui ont déjà été résolus il y a longtemps&lt;/span&gt; sur la couche réseau BSD.&lt;br /&gt;&lt;br /&gt;Mais c'est certainement pour implémenter les nouvelles spécifications IPv6, IPsec, MobileIPv6 (c'est d'ailleurs aussi l'objet du projet &lt;a href="http://www.kame.net/"&gt;KAME&lt;/a&gt; sur BSD)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.wikipedia.org/wiki/Windows"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_dJYBJhDg2Hk/SF_HmhwH1XI/AAAAAAAAAFg/mTfH0URuyz0/s320/img_3515_windowsvistaultimate.jpg" alt="" id="BLOGGER_PHOTO_ID_5215106358227490162" border="0" /&gt;&lt;/a&gt;Mais je pense aussi que ça fait parti de la logique de ce &lt;a href="http://fr.wikipedia.org/wiki/Ob%C3%A9siciel"&gt;boufficiel&lt;/a&gt;. Microsoft dispose d'un ensemble de programmeurs qu'il doit bien occuper à quelque chose &lt;span style="font-weight: bold;"&gt;sous peine de perdre la connaissance du fonctionnement interne de Windows !&lt;/span&gt; En effet, le code de Windows n'est plus documenté et est donc difficile à comprendre. C'est ce que nous raconte &lt;a href="http://cybertiggyr.com/gene/tales/tales.html"&gt;Gene Michael Stover&lt;/a&gt; à travers &lt;a href="http://cybertiggyr.com/gene/tales/tales.html#SECTION00091000000000000000"&gt;son expérience à Microsoft&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;Chez Microsoft, si vous voulez savoir comment utiliser une fonction de Windows, &lt;span style="font-weight: bold;"&gt;vous êtes censés lire le code source de cette fonction&lt;/span&gt; pour apprendre comme elle marche et comment l'utiliser.&lt;/blockquote&gt;&lt;a href="http://jradix.blogspot.com/2008/06/apprentissage-mmoire-et-langage.html"&gt;Notre mémoire étant volatile&lt;/a&gt;, seules des personnes qui travaillent régulièrement sur ce logiciel peuvent continuer à comprendre celui-ci. C'est tout le problème. Microsoft ne peut pas réduire la voilure, ne peut pas réduire le nombre de développeur sur Windows sans risquer de perdre de la compétence.&lt;br /&gt;&lt;br /&gt;Heureusement, ce problème se marie fort bien avec une disposition réelle des utilisateurs à préférer leurs souhaits à leur besoins, à s'enthousiasmer pour n'importe quelles nouvelles fonctionnalités, comme nous le rappelle &lt;a href="http://en.wikipedia.org/wiki/Niklaus_Wirth"&gt;Niklaus Wirth&lt;/a&gt; dans &lt;a href="http://www.modulaware.com/mdlt/mdlt79.htm"&gt;A Digital Contrarian Retires&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt; Les programmes fiables et transparents ne sont généralement pas intéressant pour un concepteur de logiciel. &lt;span style="font-weight: bold;"&gt;Les souhaits des utilisateurs comptent plus que leurs besoins&lt;/span&gt;. &lt;/blockquote&gt;L'informatique a donc encore de beaux jours devant elle, ... ainsi que les systèmes d'exploitation :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4561983339995192801?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4561983339995192801/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4561983339995192801' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4561983339995192801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4561983339995192801'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/un-boufficiel-de-plus-le-systme.html' title='Un boufficiel de plus : le système d&apos;exploitation'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dJYBJhDg2Hk/SF_IemgwlQI/AAAAAAAAAFo/F2V2s86T9nQ/s72-c/teksti_kampus_keskusta1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-3684010173106561320</id><published>2008-07-10T08:00:00.000-07:00</published><updated>2011-01-26T02:52:05.844-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conception'/><category scheme='http://www.blogger.com/atom/ns#' term='méthodes'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Intellisense, ennemi de la pensée désirée ?</title><content type='html'>N'avez-vous jamais été embêté par &lt;a href="http://en.wikipedia.org/wiki/Intellisense"&gt;Intellisense&lt;/a&gt; ? Ne sentez-vous pas qu'il vous bloque parfois dans votre créativité ? La preuve, dès que j'essaie d'envisager un appel à une nouvelle fonction, dès que j'appuie sur "Enter", j'ai le message désagréable suivant :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SFvP_Ds638I/AAAAAAAAAFY/9836kvAgm0I/s1600-h/intellisense.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_dJYBJhDg2Hk/SFvP_Ds638I/AAAAAAAAAFY/9836kvAgm0I/s400/intellisense.png" alt="" id="BLOGGER_PHOTO_ID_5213989675843903426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En fait, intellisense est incompatible avec la méthode de &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#%_sec_2.1.1"&gt;développement par pensée désirée&lt;/a&gt;. Mais qu'est-ce donc que la &lt;a href="http://fr.wikipedia.org/wiki/Pens%C3%A9e_d%C3%A9sir%C3%A9e"&gt;pensée désirée&lt;/a&gt; en informatique ? L'architecte parlera d'&lt;a href="http://en.wikipedia.org/wiki/Top-down_and_bottom-up_design"&gt;approche top-down&lt;/a&gt;, mais c'est assez réducteur et simpliste car faisant croire à un processus de conception rationel fonctionnant par décompositions successives.&lt;br /&gt;&lt;br /&gt;Comme nous le raconte très bien &lt;a href="http://www.stevemcconnell.com/"&gt;Steve McConnell&lt;/a&gt; dans &lt;a href="http://www.stevemcconnell.com/cc.htm"&gt;Code Complete 2&lt;/a&gt;, et que je vous traduirais ainsi :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;La conception est un problème "perfide"&lt;/span&gt; (wicked). Horst Rittel et Melvin Webber définissent un problème comme "perfide" quand il ne peut-être clairement défini qu'en le solutionnant ou en solutionnant une partie de celui-ci (1973).&lt;br /&gt;&lt;/blockquote&gt;Bien que la conception soit un problème perfide, on peut adopter des approches qui permettent d'être créatif quand à la solution à apporter.&lt;br /&gt;&lt;br /&gt;Une des méthodes les plus intéressante est l'approche de la programmation par la pensée désirée : &lt;span style="font-weight: bold;"&gt;vous codez des algorithmes, des routines, des classes selon ce qui est plaisant d'imaginer&lt;/span&gt;, en imaginant un monde idéal et en faisant abstraction (dans un premier temps) du réel, de ce qui existe et de ce qui reste à développer.&lt;br /&gt;&lt;br /&gt;Ainsi, si vous désirez développer une application de gestion de contacts personnels, vous commencez par écrire un programme utilisant une API idéale de gestion de contacts :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ContactCollection.GetMyContacts()&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;Contact&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Collection&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.GetMyProfessionalContacts()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ce n'est qu'ensuite que vous pouvez vous pencher sur l'implémentation de chacune des fonctions GetMyContacts, GetMyProfessionalContacts(). Cet exemple est trivial et vraiment simpliste mais ce qu'il faut retenir c'est qu'une telle approche permet de s'abstraire des détails d'implémentation, &lt;span style="font-weight: bold;"&gt;ce qui promeut une architecture orienté "problème métier" plutôt que "problème technique"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;C'est là ou intellisense peut poser problème pour le développeur distrait. Sans faire attention, &lt;span style="font-weight: bold;"&gt;intellisense pousse à utiliser ce qui existe déjà, à penser implémentation avant de penser modélisation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et voilà comment on en arrive à développer des applications sans séparation claire entre les responsabilités de chaque module. Intellisense peut être vraiment intéressant quand l'architecture est complète et clairement définie, mais il serait bien de pouvoir désactiver cette fonctionnalités quand on se met à réfléchir à une architecture indépendante de l'implémentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-3684010173106561320?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/3684010173106561320/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=3684010173106561320' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3684010173106561320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/3684010173106561320'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/intellisense-ennemi-de-la-pense-dsire.html' title='Intellisense, ennemi de la pensée désirée ?'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dJYBJhDg2Hk/SFvP_Ds638I/AAAAAAAAAFY/9836kvAgm0I/s72-c/intellisense.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-1932946044337389407</id><published>2008-07-06T08:00:00.001-07:00</published><updated>2011-01-26T02:52:36.462-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='bonnes pratiques'/><title type='text'>Goto implicites et structures de données</title><content type='html'>Qu’est-ce qu’on reproche à ce fameux GOTO ? D’être indiscipliné ? De semer l’anarchie dans le code source ? Oui, c’est vrai qu’&lt;a href="http://www.u.arizona.edu/%7Erubinson/copyright_violations/Go_To_Considered_Harmful.html"&gt;il nous ramène en plein moyen-âge informatique&lt;/a&gt;, à une époque où on connaissait à peine la notion de routine. Aujourd’hui, il est rare de trouver explicitement des GOTO dans du code. &lt;a href="http://en.wikipedia.org/wiki/Considered_harmful"&gt;Il y a eu et il y a toujours beaucoup de bruit&lt;/a&gt; autour de l'emploi du GOTO, mais franchement, la hache de guerre est depuis longtemps enterrée.&lt;br /&gt;&lt;p style="font-weight: bold;" class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_8U9qppDvX_E/RqNxgR3NUaI/AAAAAAAAArI/gAmPLRgsgTE/2007-07-22+Goto+considered+harmful,+the+comic.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://lh6.ggpht.com/_8U9qppDvX_E/RqNxgR3NUaI/AAAAAAAAArI/gAmPLRgsgTE/2007-07-22+Goto+considered+harmful,+the+comic.jpg" alt="" border="0" /&gt;&lt;/a&gt;Mais est-ce qu’implicitement il n’y aurait pas des sortes de GOTO qui se cachent discrètement dans mon code ?&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Les structures des données traitées par un programme, contraignent les algorithmes chargés de leur manipulation. L’utilisation de tableaux indexés contraint très peu les algorithmes, ce qui fait qu’il peu exister une organisation implicite, non visible des données contenues par un tableau.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Un programmeur sera donc tenté d'accéder directement à n'importe quel élément du tableau et ainsi, reproduit au niveau du code un flux de traitement non séquentiel, voire même aléatoire : &lt;span style="font-weight: bold;"&gt;un peu comme des GOTO !&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Ainsi, des sortes de GOTO implicites mais bien présents (par exemple, l’inflation du nombre de &lt;a href="http://en.wikipedia.org/wiki/GOTO#switch.2Fcase_structures"&gt;if(), de switch() et de break&lt;/a&gt; sans parler des &lt;a href="http://en.wikipedia.org/wiki/Conditional_%28programming%29#Arithmetic_IF"&gt;IF arithmétique&lt;/a&gt; qu'affectionne les programmeur en Fortran) dans les algorithmes peuvent être employés pour gérer les données d’un tableau.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Comment s’assurer que les développeurs d’un logiciel ne se mettent pas disséminer des GOTO implicites ? &lt;span style="font-weight: bold;"&gt;En leur interdisant d’utiliser des tableaux indexé et en les obligeant à employer de véritables conteneurs comme les ensembles (Sets), les piles (Stacks) et les files d’attentes (Queues).&lt;/span&gt; Ces conteneurs obligent à accéder de façon séquentielle à leurs éléments et évitent ainsi l’introduction de GOTO implicites.&lt;/p&gt;&lt;p class="MsoNormal"&gt;A éviter donc toutes les méthodes du type &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html#toArray%28T%5B%5D%29"&gt;Collection.toArray()&lt;/a&gt;... ces méthodes ont l'inconvénient d'exposer partiellement l'implémentation, de dénaturer la collection en question.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Ce qui nous ramène donc à l'analyse statique du code, avec les outils classiques que sont les outils OpenSource &lt;a href="http://findbugs.sourceforge.net/bugDescriptions.html"&gt;FindBugs&lt;/a&gt; et &lt;a href="http://pmd.sourceforge.net/rules/index.html"&gt;PMD&lt;/a&gt; pour le monde Java, mais aussi commerciaux comme le puissant &lt;a href="http://www.mathworks.com/products/polyspace/index.html?s_cid=psr_prod"&gt;Polyspace&lt;/a&gt; que j'ai utilisé une fois sur un projet, &lt;a href="http://www.ddj.com/cpp/196802351?pgno=2"&gt;ou d'autres&lt;/a&gt;. Il n'existe pas de règles déjà définit pour empêcher l'utilisation de tableau bien que de &lt;a href="http://findbugs.sourceforge.net/bugDescriptions.html#MS_MUTABLE_ARRAY"&gt;nombreuses&lt;/a&gt; &lt;a href="http://findbugs.sourceforge.net/bugDescriptions.html#MS_EXPOSE_REP"&gt;règles&lt;/a&gt; portent sur le mauvais emploi des tableaux à travers les classes.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Alors, prêt à jouer les dictateurs et empêcher tout emploi de tableau indexé ? Allez... j'accepterai peut-être un Array &lt;span style="font-weight: bold;"&gt;si c'est correctement justifié&lt;/span&gt; :) mais alors, je considerai ça comme un nouvelle &lt;a href="http://jradix.blogspot.com/2008/06/dette-technique-technical-debt.html"&gt;dette technique&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-1932946044337389407?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/1932946044337389407/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=1932946044337389407' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1932946044337389407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/1932946044337389407'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/07/goto-implicites-et-structures-de-donnes.html' title='Goto implicites et structures de données'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_8U9qppDvX_E/RqNxgR3NUaI/AAAAAAAAArI/gAmPLRgsgTE/s72-c/2007-07-22+Goto+considered+harmful,+the+comic.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4362693032526048780</id><published>2008-07-02T08:00:00.001-07:00</published><updated>2011-01-26T02:53:28.945-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture du SI'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>Prévision de changement de besoin</title><content type='html'>&lt;span style="font-weight: bold;"&gt;La seule et unique constante dans l'univers c'est le changement.&lt;/span&gt; Il en va de même avec les besoins des utilisateurs, clients, maîtrise d'ouvrage d'une application. Comment faire pour suivre cette évolution à moindre frais. Bien que certains proposent &lt;a href="http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672"&gt;de multiples techniques de "refactoring"&lt;/a&gt;, &lt;span style="font-weight: bold;"&gt;l'objectif est de ne pas avoir du tout à refactorer.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.lifehack.org/wp-content/files/2007/12/sell_on_change.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://www.lifehack.org/wp-content/files/2007/12/sell_on_change.png" alt="" border="0" /&gt;&lt;/a&gt;On peut y arriver si on envisage comment l'application va évoluer au cours du temps. Oui, mais ... qui peut prédire l'avenir ? personne, en tout cas, pas moi. Pour essayer de limiter les dégâts et prévoir au maximum les changements à venir, &lt;a href="http://fr.wikipedia.org/wiki/Gestion_des_exigences"&gt;la gestion des exigences&lt;/a&gt; a été pour moi ce qui m'a le plus permis d'avoir une approche rationnelle de la gestion et de la prévision du changement.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://fr.wikipedia.org/wiki/Exigence_%28ing%C3%A9nierie%29"&gt;L'article de Wikipedia&lt;/a&gt; est clair sur le sujet :&lt;br /&gt;&lt;blockquote&gt;En ingénierie, et plus particulièrement dans les procédures d'appel d'offres publiques et privées, les exigences sont l'expression d'un besoin &lt;span style="font-weight: bold;"&gt;documenté &lt;/span&gt;sur ce qu'un produit ou un service particuliers devraient être ou faire. Elles sont le plus souvent utilisées &lt;span style="font-weight: bold;"&gt;dans un sens formel&lt;/span&gt; dans l'ingénierie des systèmes et dans l'ingénierie logicielle.&lt;/blockquote&gt;et notamment, sur les différents types d'exigence :&lt;br /&gt;&lt;blockquote&gt;     - &lt;span style="font-weight: bold;"&gt;Les exigences métier&lt;/span&gt; qui décrivent le quoi dans les termes du métier. Elles décrivent ce qui doit être fourni ou réalisé pour produire de la valeur.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Les exigences produit&lt;/span&gt; qui décrivent le produit ou le système à un haut niveau. Elles répondent aux exigences métier et sont couramment formulées comme les fonctionnalités que le système doit réaliser. On les appelle également exigences fonctionnellles ou spécifications fonctionnelles.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Les exigences de processus&lt;/span&gt; qui décrivent le comment. Ces exigences prescrivent les processus que l'on doit suivre et les contraintes auxquelles on doit se conformer pour la réalisation du système. Dans ce cas, on trouve par exemple des exigences de sécurité, d'assurance qualité, ou de management.&lt;br /&gt;&lt;/blockquote&gt;Le découpage en exigences des besoins permet de mettre un nom (un identifiant) sur chaque besoin élémentaire, le but étant d'avoir une liste exhaustive.&lt;br /&gt;&lt;br /&gt;Au delà de permettre dans un projet, un suivi de bout en bout des exigences, l'intérêt principal c'est de ne pas perdre le besoin client dans une foule de détails plus ou moins techniques. Cela permet notamment au client d'être plus confiant et de &lt;span style="font-weight: bold;"&gt;lui permettre de valider l'expression écrite de son besoin&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Une fois la liste d'exigences rédigée, apparaît alors la phase qui permet de se protéger contre les changements du besoin. C'est une phase d'&lt;a href="http://jradix.blogspot.com/2008/06/larme-absolue-de-la-qualit-la-checklist.html"&gt;assurance qualité&lt;/a&gt; qui vise à s'assurer que toutes les exigences respectent les propriétés suivantes:&lt;br /&gt;&lt;blockquote&gt;- &lt;span style="font-weight: bold;"&gt;Nécessaires &lt;/span&gt;– Elles doivent porter sur des éléments nécessaires, c'est-à-dire des éléments importants du système que d'autres composants du système ne pourraient pas compenser.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Non ambiguës&lt;/span&gt; – Elles doivent être susceptibles de n'avoir qu'une seule interprétation.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Concises&lt;/span&gt; – Elles doivent être énoncées dans un langage qui soit précis, bref et agréable à lire, et qui de plus communique l'essence de ce qui est exigé.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Cohérentes &lt;/span&gt;– Elles ne doivent pas contredire d'autres exigences établies, ni être contredites par d'autres exigences. De plus, elle doit, d'un énoncé d'exigence au suivant, utiliser des termes et un langage qui signifie la même chose.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Complètes &lt;/span&gt;– Elles doivent être énoncées entièrement en un endroit et d'une façon qui ne force pas le lecteur à regarder un texte supplémentaire pour savoir ce que l'exigence signifie.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Accessibles&lt;/span&gt; – Elles doivent être réalistes quant à aux moyens mis en œuvre en termes d'argent disponible, avec les ressources disponibles, dans le temps disponible.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Vérifiables&lt;/span&gt; – Elles doivent permettre de déterminer si elles ont été atteintes ou non selon l'une de quatre méthodes possibles : inspection, analyse, démonstration, ou test.&lt;br /&gt;&lt;/blockquote&gt;Mais on peut aller plus loin pour se protéger des futurs changements : &lt;span style="font-weight: bold;"&gt;imaginer au moins 3 possibilités d'évolution pour chaque exigence.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;L'important est d'identifier ces évolutions&lt;span style="font-weight: bold;"&gt; comme de nouvelles exigences internes&lt;/span&gt;. Selon l'état d'esprit de votre client ou donneur d'ordre, vous pouvez faire apparaître ces nouvelles exigences ou pas.&lt;br /&gt;&lt;br /&gt;Lors de la phase de définition de l'architecture, il est donc alors possible de faire des choix informés qui permettent à moindre coût l'évolution de chaque exigence métier, et d'en faire un véritable suivi.&lt;br /&gt;&lt;br /&gt;Il existe &lt;a href="http://fr.wikipedia.org/wiki/Design_patterns"&gt;beaucoup de techniques&lt;/a&gt; permettant l'&lt;a href="http://en.wikipedia.org/wiki/Extensibility"&gt;extensibilité&lt;/a&gt; et la &lt;a href="http://en.wikipedia.org/wiki/Customization"&gt;personnalisation &lt;/a&gt;d'une &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/software_arch.htm"&gt;architecture&lt;/a&gt;. Savoir à l'avance ce qui va changer permet de ne pas oublier de mettre en place ces techniques aux bons endroits et de renforcer la solution face à l'avenir.&lt;br /&gt;&lt;br /&gt;Ce travail implique bien sur &lt;span style="font-weight: bold;"&gt;un surcoût&lt;/span&gt;, mais beaucoup moins important que de répondre à un changement d'exigence non anticipé. &lt;span style="font-weight: bold;"&gt;Dans le cas de société de service, le surcoût est inutile dans le cas de développement au forfait, mais devient beaucoup plus justifiable dans le cas de &lt;a href="http://fr.wikipedia.org/wiki/Tierce_Maintenance_Applicative"&gt;TMA&lt;/a&gt; où la rentabilité des contrats s'avère dépendant de la qualité de l'application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ce processus de prévision des changements du besoin peut être pondéré par la prioritisation de ceux-ci. Il peut être bien sur être plus qu'intéressant d'interroger le client sur chacune de ces évolutions possibles. Car finalement, c'est quand même lui le mieux placé pour répondre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4362693032526048780?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4362693032526048780/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4362693032526048780' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4362693032526048780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4362693032526048780'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/06/prvision-de-changement-de-besoin.html' title='Prévision de changement de besoin'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-4781715696216881352</id><published>2008-06-28T08:00:00.000-07:00</published><updated>2011-01-26T02:53:48.304-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qualité'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion de projet'/><title type='text'>L'arme absolue de la qualité : la CheckList</title><content type='html'>Le problème avec l'informatique c'est qu'elle ne supporte pas l'imprécision, l'à-peu-près. La machine sur laquelle tourne un programme n'ayant aucune intelligence en soi, et les langages employés sont finalement, tellement bas niveau qu'&lt;span style="font-weight: bold;"&gt;il faut toujours penser à tous les détails&lt;/span&gt;, ceux qui font toute la différence entre un code qui tourne correctement et un code boggué.&lt;br /&gt;&lt;br /&gt;Le diable est dans les détails, c'est sûre, mais l'excellence aussi. On trouve dans tous les bonnes bibliothèques informatiques, des tonnes de livres remplis de bonnes pratiques qu'on doit mettre en oeuvre dans tous les cas possible est imaginable de l'activité de développement d'un logiciel.&lt;br /&gt;&lt;br /&gt;Or qui peut se targuer de connaître toutes ses bonnes pratiques, et qui est capable de les utiliser à bon escient et à tous les moments opportuns ? &lt;span style="font-weight: bold;"&gt;Avoir tous les détails en tête n'est pas humain, puisque le fondement de l'esprit humain est l'oubli.&lt;/span&gt; Le programmeur de base est ainsi fait qu'il a une mémoire bien plus volatile que son PC. Comment faire pour qu'un développeur puisse coder proprement sans avoir à lire des milliers de pages de livres informatiques ?&lt;br /&gt;&lt;br /&gt;Un des problèmes est que la maîtrise d'une matière demande beaucoup de temps, &lt;a style="font-weight: bold;" href="http://norvig.com/21-days.html"&gt;au minimum une dizaine d'année, quelque soit la matière&lt;/a&gt;. Or, en France tout du moins, les ingénieurs informatique ont tous tendance à ne plus vouloir programmer, passé les quelques années d'expérience, principalement par le fait que &lt;span style="font-weight: bold;"&gt;l'activité de programmation est déconsidérée par rapport aux autres métiers tournant autour&lt;/span&gt;. Résultat, les personnes en charge du développement d'application sont souvent jeunes et inexpérimentées, même si elles ont beaucoup de volonté.&lt;br /&gt;&lt;br /&gt;La solution classique, simple, c'est bien sur d'utiliser &lt;span style="font-weight: bold;"&gt;des "&lt;a href="http://en.wikipedia.org/wiki/Checklist"&gt;checklists&lt;/a&gt;", des listes de vérification à chaque étape du processus de développement.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un projet sans checklist ne peut produire que du code propre à chaque développeur. Il ne sera pas forcément mauvais, mais le code source sera construit sous la forme d'un écosystème avec plusieurs façon de coder différentes, de façon de traiter les erreurs différentes, d'organiser et de nommer les éléments du code, etc.&lt;br /&gt;&lt;br /&gt;La checklist est un moyen simple et efficace. &lt;span style="font-weight: bold;"&gt;Elle peut être employée pour améliorer n'importe quel type d'activité même créative.&lt;/span&gt; On la voit malheureusement trop peu employée là où elle aura pourtant le plus d'impact sur la productivité de nos activités.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cardesignonline.com/images/renault-inline-3.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://www.cardesignonline.com/images/renault-inline-3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;blockquote&gt;Dans des domaines où la qualité est un facteur important, les checklists sont au coeur de l'assurance qualité, comme par exemple chez Renault où la validation de la conception d'un nouveau modèle passe par la vérification de toutes les checklists maison, construites au cours de années et rassemblant toutes les bonnes pratiques durement apprises par l'expérience.&lt;/blockquote&gt;&lt;br /&gt;La checklist implique un processus minimal :&lt;br /&gt;&lt;br /&gt;- un travail&lt;br /&gt;&lt;br /&gt;- la vérification de ce travail au regard de la checklist.&lt;br /&gt;&lt;br /&gt;La conception et l'utilisation de checklists est bien l'activité fondamentale de ce qu'on appelle couramment "&lt;span style="font-weight: bold;"&gt;l'assurance Qualité&lt;/span&gt;". La vérification &lt;span style="font-style: italic;"&gt;à la main&lt;/span&gt; des checklists est assez longue et coûteuse, et on a tout intérêt à mettre les vérifications dans un processus automatique, notamment par l'utilisation d'outils.&lt;br /&gt;&lt;br /&gt;Au niveau du code source, on dispose de beaucoup d'outils plus ou moins puissants, comme les analyseurs statiques. Chacun peut les utiliser pour soi-même mais cela prend tout son sens quand on effectue les vérifications au niveau du système de gestion des sources, &lt;span style="font-weight: bold;"&gt;lors d'un "commit"&lt;/span&gt; dans Subversion par exemple. Il est aisé d'ajouter des &lt;a href="http://svnbook.red-bean.com/en/1.4/svn.reposadmin.create.html#svn.reposadmin.create.hooks"&gt;&lt;span&gt;"hooks"&lt;/span&gt;&lt;/a&gt; aux évènements de base des systèmes de gestion de configuration comme &lt;a href="http://www.nongnu.org/cvs/"&gt;CVS&lt;/a&gt; ou &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;On ne peut pas tout vérifier au niveau d'un commit, cela prendrait trop de temps, et les développeurs se mettraient à attendre trop longtemps avant de commiter et y réfléchiraient à deux fois, voire, il ne commiteraient jamais ! C'est pour cela qu'il est intéressant d'&lt;span&gt;effectuer des vérifications régulièrement sur un serveur d'intégration continue&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.myexpression.com/SysImages/Wedding/InvitationChecklist.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 140px; height: 241px;" src="http://www.myexpression.com/SysImages/Wedding/InvitationChecklist.jpg" alt="" border="0" /&gt;&lt;/a&gt;Aujourd'hui l'intégration continue à le vent en poupe, tout le monde en parle. &lt;span style="font-weight: bold;"&gt;Mais là où on a le plus intérêt à effectuer des vérifications, c'est aux phases amonts de la simple activité de codage.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Le coût d'une erreur étant dépendant de la phase dans laquelle elle est détectée,&lt;/span&gt; une erreur d'expression de besoin coûtera beaucoup moins chère à corriger lors de la phase d'expression de besoin que lors du codage de l'application. Ainsi, on a tout intérêt à vérifier les phases amonts pour éviter de grosses embûches en phase de construction.&lt;br /&gt;&lt;br /&gt;On trouve beaucoup de checklists sur le Web, mais je n'ai pas réussi à trouver beaucoup de sites proposant &lt;a href="http://myplanninglists.com/"&gt;une mise en commun de checklists&lt;/a&gt;, notamment par profession.&lt;br /&gt;&lt;br /&gt;Ca serait vraiment intéressant de mettre en commun toutes les bonnes pratiques, sous forme de checklist à un seul endroit, directement utilisable sur les projets de développement logiciel. &lt;a href="http://www.stevemcconnell.com/books.htm"&gt;Les livres de Steve McConnell&lt;/a&gt; sont particulièrement &lt;a href="http://www.cc2e.com/Page.aspx?nid=73"&gt;riches en checklists&lt;/a&gt; et méritent vraiment qu'on s'y intéresse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/94188845412029417-4781715696216881352?l=www.jeromeradix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jeromeradix.com/feeds/4781715696216881352/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=94188845412029417&amp;postID=4781715696216881352' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4781715696216881352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/94188845412029417/posts/default/4781715696216881352'/><link rel='alternate' type='text/html' href='http://www.jeromeradix.com/2008/06/larme-absolue-de-la-qualit-la-checklist.html' title='L&apos;arme absolue de la qualité : la CheckList'/><author><name>Jérôme Radix</name><uri>http://www.blogger.com/profile/04769773711143508150</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh3.ggpht.com/_dJYBJhDg2Hk/SNlq3KWdLtI/AAAAAAAAAKc/RJf-i02Jw14/avatar.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-94188845412029417.post-6541410899665566598</id><published>2008-06-24T08:00:00.000-07:00</published><updated>2011-01-26T02:54:21.242-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Génération automatique de tests unitaires par héritage d'assertions</title><content type='html'>Toujours &lt;a href="http://jradix.blogspot.com/2008/06/ni-guru-ni-hacker-arrtons-lanarchie.html"&gt;à propos des assertions&lt;/a&gt;, je me demande s'il ne serait pas possible de générer des tests unitaires automatiquement, mais uniquement ceux qui vont faire tomber à FALSE une assertion quelconque de la routine (et à n'importe quelle profondeur). En effet, d'après &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book.html"&gt;le livre du magicien&lt;/a&gt;, &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html#%_sec_1.1"&gt;au chapitre 1-1 on peut lire&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://mitpress.mit.edu/sicp/full-text/book/book.html"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 246px; height: 362px;" src="http://mitpress.mit.edu/sicp/full-text/book/cover.jpg" alt="" border="0" /&gt;&lt;/a&gt;Chaque langage puissant a trois mécanismes pour combiner des idées simples pour former des idées plus complexes&lt;span style="font-size:78%;"&gt;[1]&lt;/span&gt; :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;- des "&lt;span style="font-weight: bold;"&gt;expressions primitives&lt;/span&gt;" qui représentent les entités les plus simples dont le langage se préoccupe,&lt;br /&gt;&lt;br /&gt;- des "&lt;span style="font-weight: bold;"&gt;moyens de combinaison&lt;/span&gt;" par lesquels des éléments composés sont construit à partir d'éléments plus simples,&lt;br /&gt;&lt;br /&gt;- des "&lt;span style="font-weight: bold;"&gt;moyens d'abstraction&lt;/span&gt;" par lesquels les éléments composés peuvent être nommés et manipulés comme des unités.&lt;br /&gt;&lt;/blockquote&gt;Si on s'en tient à cette définition, on pourrait imaginer qu'un langage définisse toutes les pré-conditions à respecter pour chaque "expression primitive", les assertions implicites comme par exemple pour la fonction / qui ne peut accepter un dénominateur égal à 0.&lt;br /&gt;Ainsi, si vous programmez du code comme cela (en Scheme par exemple) :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;(define (myfunc myval)&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;  (/ 10 myval))&lt;/span&gt;&lt;/blockquote&gt;Un outil pourrait construire, en analysant les combinaisons et les abstractions, un cas de test unitaire &lt;span style="font-weight: bold;"&gt;automatiquement &lt;/span&gt;pour faire planter cette myfunc() :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;(define (myfuncTest)&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;  (myfunc 0))&lt;br /&gt;; Le test unitaire généré automatiquem
