<?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-28966088</id><updated>2012-01-26T03:05:38.228+01:00</updated><title type='text'>Je Fûte, Tu Fûtes</title><subtitle type='html'>Suivi du travail qui s'accomplit sur le projet Les Fûts.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default?start-index=101&amp;max-results=100'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>184</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-28966088.post-3361332654807789137</id><published>2010-09-18T22:01:00.004+02:00</published><updated>2010-09-18T22:59:59.871+02:00</updated><title type='text'>Je passe à Mercurial</title><content type='html'>J'avais des &lt;i&gt;repositories&lt;/i&gt; Subversion sur un serveur à la cave, et il a planté hier. Heureusement qu'il y a les backups automatiques journaliers (backup-manager + cron qui envoyait tout ça sur une VM xen sur un serveur distant).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je vais en profiter pour migrer la totalité de mes projets vers Mercurial, un DVCS bien sympa, même que le &lt;i&gt;Project Hosting&lt;/i&gt; de Google Code l'utilise.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;L'architecture que j'ai choisie est celle-ci :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;hébergement chez Google Code quand le projet a vocation à être &lt;i&gt;open source&lt;/i&gt;&lt;/li&gt;&lt;li&gt;hébergement sur une VM sur un serveur dédié loué quand le projet est privé&lt;/li&gt;&lt;li&gt;backups dans tous les sens grâce aux &lt;i&gt;repositories &lt;/i&gt;locaux sur mes machines&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Simple et pas prise de tête.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le serveur qui vient de flancher hébergeait déjà quelques &lt;i&gt;repositories &lt;/i&gt;Mercurial, histoire de découvrir. J'avais fait ceci :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;accès par SSH et clefs publiques (tout comme j'utilisais Subversion)&lt;/li&gt;&lt;li&gt;j'avais installé mercurial-server (mauvaise idée car j'ai dû pour cela passer à la sid (squeeze) au lieu de rester en lenny), &lt;/li&gt;&lt;li&gt;et tout le bataclan des clefs nommées, etc. (cela dit c'est propre)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Maintenant je fais la chose suivante :&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Fichier .hgrc sous Windows&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;div&gt;[ui]&lt;/div&gt;&lt;div&gt;username = dandriana&lt;/div&gt;&lt;div&gt;ssh="C:\Program Files\Putty\PLINK.EXE" -ssh -l hg -i "D:\Mes Documents\ma_clef.ppk"&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;J'utilise &lt;b&gt;PAGEANT &lt;/b&gt;sous Windows pour ajouter la clef en début de session.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sur la VM (xen) du serveur distant, j'installe Mercurial et crée un utilisateur Unix &lt;b&gt;hg&lt;/b&gt;. Mes projets seront dans /home/hg/projects/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sur le Dom0 (le serveur distant), je crée un utilisateur Unix &lt;b&gt;hg&lt;/b&gt;, mais sans installer Mercurial.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour cet utilisateur je crée un exécutable de nom &lt;b&gt;hg&lt;/b&gt;, que je mets dans le PATH, et qui contient ceci :&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;#!/bin/sh&lt;/div&gt;&lt;div&gt;ssh &lt;adresse&gt; "hg $*"&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;En effet, quand je ferai sous Windows « hg -v clone ssh://&lt;adresse&gt;//home/hg/projects/toto » (&lt;a href="http://jehaisleprintemps.net/blog/fr/2009/05/10/mercurial-et-ssh-le-piege-eviter/"&gt;attention au double slash&lt;/a&gt; « // » avant « home » quand il s'agit d'un chemin absolu) pour récupérer le projet « toto », voici ce qui se passera :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;le programme &lt;b&gt;hg&lt;/b&gt; sous Windows (installation standard de Mercurial) se connectera via SSH au serveur distant avec le nom d'utilisateur &lt;b&gt;hg &lt;/b&gt;(voir plus haut, directive « -ssh -l hg » de PLINK),&lt;/li&gt;&lt;li&gt;il essaiera d'y lancer la commande « &lt;b&gt;hg&lt;/b&gt; -R /home/hg/projects/toto serve --stdio » (c'est l'option « hg -v » plus haut qui permet d'afficher ce détail),&lt;/li&gt;&lt;li&gt;donc le serveur distant lancera en fait « ssh &lt;adresse&gt; "hg -R /home/hg/projects/toto serve --stdio" »,&lt;/li&gt;&lt;li&gt;c'est-à-dire se connectera à la VM, où s'exécuteront les opérations Mercurial.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Boah, ça fonctionne bien.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je trouve deux énormes intérêts à un DVCS :&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;les commits en mode déconnecté. Je peux poser des &lt;i&gt;savepoints&lt;/i&gt; alors que je travaille dans le train, ou que je progresse pas à pas.&lt;/li&gt;&lt;li&gt;le fait de ne pas à faire de choix structurant quant à utiliser un serveur plutôt qu'un autre (à la maison ? loué ? partagé ?…)&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Je vais sans doute utiliser &lt;b&gt;hgsvn &lt;/b&gt;pour finir la migration.&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/28966088-3361332654807789137?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3361332654807789137/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3361332654807789137' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3361332654807789137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3361332654807789137'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/09/je-passe-mercurial.html' title='Je passe à Mercurial'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-2975777740055835085</id><published>2010-09-11T21:50:00.003+02:00</published><updated>2010-09-11T21:52:04.804+02:00</updated><title type='text'>Formations internet aux associations</title><content type='html'>Vu chez Ginisty : &lt;a href="http://www.ginisty.com/Internet-sans-Frontieres-lance-un-programme-de-formations-a-destination-du-monde-associatif_a466.html"&gt;Internet sans Frontières lance un programme de formations à destination du monde associatif&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-2975777740055835085?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/2975777740055835085/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=2975777740055835085' title='6 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/2975777740055835085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/2975777740055835085'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/09/formations-internet-aux-associations.html' title='Formations internet aux associations'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6617786015286722359</id><published>2010-08-14T18:29:00.008+02:00</published><updated>2010-08-15T15:04:36.623+02:00</updated><title type='text'>Réorientation professionnelle</title><content type='html'>Mes années dans le service informatique…&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2000, Sinclair&amp;amp;Partners à Paris (La Défense),&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2001, Logica &gt; LogicaCMG &gt; &lt;a href="http://www.logica.fr/"&gt;Logica&lt;/a&gt; à Bordeaux (Gradignan),&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2004, Cap Gemini Ernst &amp;amp; Young &gt; &lt;a href="http://www.capgemini.com/"&gt;Capgemini&lt;/a&gt; à Bordeaux (Pessac &gt; Mérignac),&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2006, indépendant sous l'enseigne &lt;a href="http://avantage-compris.com/"&gt;Avantage Compris&lt;/a&gt; à Bordeaux (Pessac &gt; Mérignac),&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2010, je signe un nouveau contrat chez &lt;a href="http://www.capgemini.com/"&gt;Capgemini&lt;/a&gt;, cette fois-ci à Paris (Suresnes et La Défense).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Capgemini est un grand groupe, avec qui j'avais déjà pu faire de belles choses en étant basé à Bordeaux, et notamment une petite mission &lt;i&gt;Flying Squad&lt;/i&gt; à New York en 2005. Gageons que l'avenir saura se montrer à la hauteur &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;:-)&lt;/span&gt; &lt;/div&gt;&lt;div&gt;Je remarque d'ores et déjà les changements sur le marché : dans les cas où l'agilité est une évidence méthodologique elle ne fait plus peur, SOA est une notion intégrée dans le paysage — j'ai même vu des clients parler naturellement de gouvernance —, et les développements &lt;i&gt;offshore&lt;/i&gt; maîtrisés semblent être la norme.&lt;/div&gt;&lt;div&gt;Confronté à un nombre réduit de clients, même s'ils étaient souvent prestigieux — technologies obligent —, je n'avais pas forcément en tant qu'indépendant suffisamment de champ de vision pour arriver à cette idée. Le fait de me retrouver dans l'entreprise (80 000 collaborateurs inscrits sur la partie KM d'un intranet, ça calme toujours) est une bonne chose.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Et le statut d'indépendant : plus jamais ? C'était pas bien ? Je dirais au contraire que c'est une excellente expérience, qui outre le fait d'obliger à gérer chacun des aspects de sa structure, rapproche du sens &lt;i&gt;business&lt;/i&gt; de notre métier. En tant qu'indépendant on voit mieux ses forces et ses faiblesses… celles des autres aussi. Je pense qu'on est davantage poussé à la coopération. On attache peut-être davantage d'importance à la complémentarité, ce qui est un plus ensuite.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bref, c'est reparti &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;:-)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ah, et je laisse mes amis kabbalistes discuter du sens de « Rê-orientation » et de la figure de l'as de pique &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;:-)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6617786015286722359?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6617786015286722359/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6617786015286722359' title='8 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6617786015286722359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6617786015286722359'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/08/reorientation-professionnelle.html' title='Réorientation professionnelle'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-4892671547498095876</id><published>2010-08-14T18:21:00.002+02:00</published><updated>2010-08-14T18:29:02.409+02:00</updated><title type='text'>Blog de « Création Mohair », à Limoges</title><content type='html'>Tiens, du coup « &lt;a href="http://www.creationmohair.com/"&gt;Création Mohair&lt;/a&gt; » a mis à jour son &lt;a href="http://www.creationmohair.com/blog/"&gt;blog&lt;/a&gt; : &lt;a href="http://www.creationmohair.com/blog/"&gt;http://www.creationmohair.com/blog/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-4892671547498095876?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/4892671547498095876/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=4892671547498095876' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4892671547498095876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4892671547498095876'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/08/blog-de-creation-mohair-limoges.html' title='Blog de « Création Mohair », à Limoges'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6392673103958320727</id><published>2010-07-02T14:04:00.006+02:00</published><updated>2010-07-02T14:24:51.485+02:00</updated><title type='text'>Boutique « Création Mohair », à Limoges</title><content type='html'>J'ai découvert tout à l'heure la boutique « &lt;a href="http://www.creationmohair.com/"&gt;Création Mohair&lt;/a&gt; », à Limoges.&lt;br /&gt;&lt;br /&gt;La boutique expose de nombreuses créations très chouettes, en mohair, mohair et soie, ou coton. J'avoue en être tombé sous le charme, et du coup je me fends d'une petite note.&lt;br /&gt;&lt;br /&gt;Les créateurs de « Création Mohair » ont une approche assez sympa et écolo : oui, la matière première vient d'animaux estampillés bio (Ecocert), et les teintes sont naturelles (en tout cas celles que j'ai vues). Mais il y aussi le soin du détail dans toute la chaîne de production, qui se retrouve évidemment dans leurs produits et la finition (eh oui, j'aime bien ceux qui fignolent les détails).&lt;br /&gt;&lt;br /&gt;Leur &lt;a href="http://www.creationmohair.com/"&gt;site web&lt;/a&gt; permet d'acheter par correspondance.&lt;br /&gt;&lt;br /&gt;Leur &lt;a href="http://www.creationmohair.com/blog/"&gt;blog&lt;/a&gt;, pas hyper mis à jour, affiche des photos des chèvres et du chien :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/TC3YDvGZuKI/AAAAAAAAANc/N0pBT5JAyik/s1600/chevre-angora-1.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/TC3YDvGZuKI/AAAAAAAAANc/N0pBT5JAyik/s320/chevre-angora-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5489281079529027746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/TC3YOthYwjI/AAAAAAAAANk/fHgAok7aYcY/s1600/berger-pyrennees-face-rase-.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 253px;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/TC3YOthYwjI/AAAAAAAAANk/fHgAok7aYcY/s320/berger-pyrennees-face-rase-.jpg" alt="" id="BLOGGER_PHOTO_ID_5489281268083900978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Manque de bol, je ne trouve pas sur le site les créations les plus récentes, notamment une petite robe en coton tricotée main assez géniale, et qui à mon avis mériterait un site de vente pour elle toute seule.&lt;br /&gt;&lt;br /&gt;Ils ont aussi des petits bonnets pour enfants tout à fait craquants, assez originaux, mais hélas je ne les retrouve pas non plus sur le site (là, j'ai peut-être mal cherché).&lt;br /&gt;&lt;br /&gt;Alors, est-ce que c'est vraiment le moment, alors qu'il fait 30°C en ville, de parler mohair ? Eh bien pour l'été ils ont une étole mohair et soie tricotée machine, très légère, euh… enfin à chacun de se faire son idée, bien sûr ! En vitrine en tout cas, elle tape pas mal à l'œil &lt;span style="font-family:courier new;"&gt;:-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quant à la toute récente petite robe en coton, c'est &lt;span style="font-style: italic;"&gt;clairement&lt;/span&gt; une robe d'été. Il faut demander à la voir, car elle n'est même pas encore exposée !&lt;br /&gt;&lt;br /&gt;J'ai beaucoup aimé ce magasin et son esprit &lt;span style="font-family:courier new;"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6392673103958320727?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6392673103958320727/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6392673103958320727' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6392673103958320727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6392673103958320727'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/07/boutique-creation-mohair-limoges.html' title='Boutique « Création Mohair », à Limoges'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kKYRIZmegcw/TC3YDvGZuKI/AAAAAAAAANc/N0pBT5JAyik/s72-c/chevre-angora-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8063414028547884661</id><published>2010-03-28T12:18:00.003+02:00</published><updated>2010-03-28T12:48:19.711+02:00</updated><title type='text'>Gilles Lipovetsky</title><content type='html'>Chez Nicolas Bordas, un article qui parle de Gilles Lipovetsky intitulé « &lt;a href="http://www.nicolasbordas.fr/et-si-la-culture-monde-avait-aussi-du-bon"&gt;Et si la culture-monde avait aussi du bon ?&lt;/a&gt; ».&lt;br /&gt;&lt;br /&gt;Pour reprendre quelques thèmes évoqués dans l'article, je ne crois pour ma part ni à une fin programmée de la morale, ni à une disparition des questions de classes économiques, ni à la possibilité de se démarquer asymptotiquement de l'hyperconsommation.&lt;br /&gt;&lt;br /&gt;Le bon point, c'est que se poser ces questions à l'heure où la confirmation affective est accessible, en particulier &lt;span style="font-style: italic;"&gt;via&lt;/span&gt; le web quand il consolide et nourrit nos réseaux, nous aide à nous considérer de nouveau comme des êtres multidimensionnels.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8063414028547884661?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8063414028547884661/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8063414028547884661' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8063414028547884661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8063414028547884661'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/03/gilles-lipovetsky.html' title='Gilles Lipovetsky'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8268950943475653947</id><published>2010-02-28T10:39:00.017+01:00</published><updated>2010-03-01T09:43:15.015+01:00</updated><title type='text'>Application packagée et ressources externes</title><content type='html'>Dans le monde J2EE/JEE on déploie une application web sous forme d'archive compressée : l'extension « .war » du fichier signifie « &lt;span style="font-style: italic;"&gt;webapp archive&lt;/span&gt; ».&lt;br /&gt;&lt;br /&gt;Dans le monde PHP, pour ne citer que lui, on peut rencontrer le même fonctionnement, avec les fichiers à déployer fournis sous forme d'archive compressée « .zip » par exemple.&lt;br /&gt;&lt;br /&gt;Pourtant, sauf en de rares exceptions, une application ne se limite pas à du code exécutable et à des ressources statiques, mais a besoin de ressources externes telles qu'une base de données, un service de messages, ou des services tiers comme des services web.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;La base de données est une ressource externe au code déployé&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Prenons le cas le plus courant, où l'application utilise une base de données seulement.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/S4txD3b5-XI/AAAAAAAAALU/NyOzXR3pqcM/s1600-h/d1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 287px; height: 77px;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/S4txD3b5-XI/AAAAAAAAALU/NyOzXR3pqcM/s400/d1.png" alt="" id="BLOGGER_PHOTO_ID_5443568885841918322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En ce qui concerne ce lien, l'application contient du code exécutable, qui encapsule du SQL, qui attaque base de données.&lt;br /&gt;&lt;br /&gt;Pour le déploiement, d'un côté on a créé la structure de la base de données, de l'autre on a déposé l'archive de l'application.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S4ty4JATSYI/AAAAAAAAALc/Jp0bHhsJ1E0/s1600-h/d2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 287px; height: 205px;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/S4ty4JATSYI/AAAAAAAAALc/Jp0bHhsJ1E0/s400/d2.png" alt="" id="BLOGGER_PHOTO_ID_5443570883422800258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ces deux déploiements conjoints doivent produire un environnement global cohérent. Penser aux « contrats d'interfaces ».&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S4tzLgdtMzI/AAAAAAAAALk/V2vnSesbbdo/s1600-h/d3.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 287px; height: 393px;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/S4tzLgdtMzI/AAAAAAAAALk/V2vnSesbbdo/s400/d3.png" alt="" id="BLOGGER_PHOTO_ID_5443571216137663282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La correspondance d'interfaces entre le client et la ressource invoquée, est cruciale.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Apporter la cohérence par le déploiement lui-même&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;L'application qui crée la base de données dont elle a besoin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Une astuce qu'emploient de nombreuses applications destinées au grand public est d'opérer la création de la base de données depuis la base de données elle-même.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/S4tz9kYvNWI/AAAAAAAAALs/eVGnjEyBHz8/s1600-h/d4.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 286px; height: 318px;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/S4tz9kYvNWI/AAAAAAAAALs/eVGnjEyBHz8/s400/d4.png" alt="" id="BLOGGER_PHOTO_ID_5443572076184024418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;(J'ai barré pour dire que cela ne me convient pas)&lt;br /&gt;&lt;br /&gt;On met l'accent sur la facilité pour l'utilisateur &lt;span style="font-style: italic;"&gt;lambda&lt;/span&gt; d'initialiser l'environnement  d'exécution.&lt;br /&gt;&lt;br /&gt;C'est le modèle choisi pour quasiment toutes les applications PHP. Plusieurs &lt;span style="font-style: italic;"&gt; frameworks &lt;/span&gt;Java offrent également cette possibilité.&lt;br /&gt;&lt;br /&gt;Cette  approche est sympathique, mais n'est pas forcément cohérente avec une  logique de production, et, surtout, de maintenance.&lt;br /&gt;&lt;br /&gt;Je trouve d'autre part que c'est prendre un risque opérationnel, car même en production, le code qui permet de supprimer et de recréer les tables de la base de données est embarqué.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;L'outil de déploiement couteau suisse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En posant la distinction entre composants déployés et outillage d'administration, on peut utiliser un outil de déploiement qui saura s'occuper de déployer et d'administrer aussi bien l'application que la base de données.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S4t0gAijCZI/AAAAAAAAAL0/_B_EsqPosvo/s1600-h/d5.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 166px;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/S4t0gAijCZI/AAAAAAAAAL0/_B_EsqPosvo/s400/d5.png" alt="" id="BLOGGER_PHOTO_ID_5443572667856914834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Même si elle a un très gros intérêt, une faiblesse de cette approche est qu'elle réclame la mise en œuvre d'un outil qui sache tout faire, et surtout son utilisation systématique : que se passe-t-il si un administrateur passe outre la procédure outillée ? Un &lt;span style="font-family:courier new;"&gt;ALTER TABLE&lt;/span&gt; en manuel est si vite arrivé…&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/S4t1jjwOR5I/AAAAAAAAAL8/g_iNSCYUHGQ/s1600-h/d6.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 244px;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/S4t1jjwOR5I/AAAAAAAAAL8/g_iNSCYUHGQ/s400/d6.png" alt="" id="BLOGGER_PHOTO_ID_5443573828360750994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Contrôler la cohérence avant le démarrage de l'application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pour la qualité il n'est souvent pas nécessaire d'engager de grandes manœuvres ou de mettre en place des outils contraignants : il suffit parfois de contrôler quelques critères et de bloquer ou de continuer la procédure en fonction.&lt;br /&gt;&lt;br /&gt;Une approche consiste alors à embarquer dans le module applicatif déployé une description du modèle physique de données attendu, et de le comparer avec la structure réelle de la base de données.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/S4t2nzUqKaI/AAAAAAAAAME/4B1BmcqURVY/s1600-h/d8.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 165px;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/S4t2nzUqKaI/AAAAAAAAAME/4B1BmcqURVY/s400/d8.png" alt="" id="BLOGGER_PHOTO_ID_5443575000771209634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On bloque le processus de démarrage de l'application si les deux ne correspondent pas (un simple « hash » peut suffire).&lt;br /&gt;&lt;br /&gt;Personnellement j'utilise comme référence du modèle un fichier YAML posé dans le répertoire &lt;span style="font-family:courier new;"&gt;WEB-INF/ &lt;/span&gt;de l'archive déployée, ce qui me permet d'avoir une approche unique pour PHP et J2EE/JEE.&lt;br /&gt;Pour Java, on peut penser à introspecter les classes persistantes afin d'en déduire le modèle attendu.&lt;br /&gt;&lt;br /&gt;Une sécurité supplémentaire est d'embarquer dans l'application elle-même, non pas du code de manipulation de base de données, mais l'outil de comparaison. L'application elle-même refuse alors de démarrer si la structure de la base de données n'est pas cohérente avec le modèle attendu.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S4t39ZDuVYI/AAAAAAAAAMM/z98nAnRlgkQ/s1600-h/d9.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 307px; height: 305px;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/S4t39ZDuVYI/AAAAAAAAAMM/z98nAnRlgkQ/s400/d9.png" alt="" id="BLOGGER_PHOTO_ID_5443576471189607810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Autres vérifications&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le fichier de référence qui décrit le MPD cohérent avec l'exécution de l'application peut servir à d'autres contrôles, et notamment les suivants :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cohérence entre le MPD et les requêtes SQL externalisées (penser aux objets &lt;span style="font-style: italic;"&gt;PreparedStatement&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;cohérence entre le MPD et les classes persistantes des divers frameworks ou approches (Hibernate, JDO…)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;Environnements de tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En phase de tests, on souhaite d'une façon ou d'une autre que l'application soit autoporteuse : à la fois déployer une application et exécuter des scripts SQL de modification de la base de données (de tests), peut être inutilement coûteux.&lt;br /&gt;&lt;br /&gt;J'ai parlé plus haut des &lt;span style="font-style: italic;"&gt;frameworks &lt;/span&gt;qui permettent ça nativement, en disant cependant que l'approche qui mixe modules applicatif et d'administration ne me convenait pas.&lt;br /&gt;&lt;br /&gt;Le fait d'embarquer, dans le module applicatif lui-même, une description de référence du modèle attendu, permet de recréer  à volonté une base de données de tests cohérente.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/S4t5k-VX5CI/AAAAAAAAAMU/1nakGIt3jPo/s1600-h/d10.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 252px; height: 400px;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/S4t5k-VX5CI/AAAAAAAAAMU/1nakGIt3jPo/s400/d10.png" alt="" id="BLOGGER_PHOTO_ID_5443578250722272290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pour ma part je fais cela avec un plugin Maven.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Approche générale, autres ressources&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le point crucial de ce qui précède est de bloquer le démarrage de modules dans le cas où on a décelé que les chaînes de liaison ne sont pas correctes.&lt;br /&gt;&lt;br /&gt;Pour cela, l'idée proposée est simplement que le module client sache dire de quelle interface il a besoin, et que la ressource invoquée sache dire au &lt;span style="font-style: italic;"&gt;runtime&lt;/span&gt; quelle est sa structure.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/S4t6EmMgOZI/AAAAAAAAAMc/iIBUoemrjY4/s1600-h/d7.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 295px; height: 206px;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/S4t6EmMgOZI/AAAAAAAAAMc/iIBUoemrjY4/s400/d7.png" alt="" id="BLOGGER_PHOTO_ID_5443578793998432658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On obtient une cartographie « à froid » des composants déployés.&lt;br /&gt;&lt;br /&gt;On fait ensuite une vérification statique des structures lues, grâce à des outils externes aux modules et ressources déployés.&lt;br /&gt;&lt;br /&gt;Aucun outillage lourd n'est nécessaire en amont.&lt;br /&gt;&lt;br /&gt;Il faut se rappeler du reste que, dans certains cas réels, l'outillage lourd en amont n'est pas suffisant à assurer la cohérence entre tous les composants déployés, en particulier quand les procédures de déploiement ne sont pas entièrement automatisées.&lt;br /&gt;&lt;br /&gt;L'approche pragmatique présentée, complémentaire à l'outillage amont, et qui fait des &lt;span style="font-style: italic;"&gt;sanity checks &lt;/span&gt;simples, permet de détecter des failles évidentes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8268950943475653947?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8268950943475653947/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8268950943475653947' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8268950943475653947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8268950943475653947'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/02/application-packagee-et-ressources.html' title='Application packagée et ressources externes'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kKYRIZmegcw/S4txD3b5-XI/AAAAAAAAALU/NyOzXR3pqcM/s72-c/d1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3319572901759283005</id><published>2010-02-26T10:07:00.002+01:00</published><updated>2010-02-26T10:09:10.795+01:00</updated><title type='text'>Asso&amp;Co</title><content type='html'>Je cite : « La Banque Postale est à l'initiative d'un nouveau site dédié au monde associatif » : &lt;a href="http://assoandco.fr/"&gt;http://assoandco.fr/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De bonnes idées. Pas vu si un même compte peut servir à gérer plusieurs associations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3319572901759283005?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3319572901759283005/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3319572901759283005' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3319572901759283005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3319572901759283005'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/02/asso.html' title='Asso&amp;Co'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-256052150106683260</id><published>2010-02-13T08:57:00.013+01:00</published><updated>2010-02-13T10:16:43.691+01:00</updated><title type='text'>Restauration quotidienne de sauvegardes</title><content type='html'>Voici un état de mon architecture de sauvegardes, qui a un peu évolué depuis que j'avais parlé du sujet il y a deux ans (voir : &lt;a href="http://jefute.blogspot.com/2008/04/validation-de-backups.html"&gt;Validation de backups&lt;/a&gt;, avril 2008).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Architecture&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Les nouveautés concernent essentiellement l'ordonnancement.&lt;br /&gt;&lt;br /&gt;Sur le plan fonctionnel, les principes sont :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;une sauvegarde complète quotidienne&lt;/li&gt;&lt;li&gt;une restauration complète quotidienne&lt;/li&gt;&lt;li&gt;des tests d'acceptabilité sur les données restaurées (par exemple, vérifier que les données qu'on a restaurées ne sont pas constituées de répertoires vides)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Sur le plan technique, les principes sont :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;pour tout ce qui concerne les flux entre machines, l'ordonnancement est centralisé&lt;/li&gt;&lt;li&gt;les flux sont sécurisés (SSH)&lt;/li&gt;&lt;li&gt;les accès sont sécurisés de machine à machine (restrictions des adresses IP autorisées, etc.)&lt;/li&gt;&lt;li&gt;on limite les volumes des transferts réseaux (compression BZ2, regroupement des commandes envoyées par SSH…)&lt;/li&gt;&lt;/ul&gt;L'architecture se synthétise ainsi :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/S3Zd1qNMeCI/AAAAAAAAAKE/C3QVCoOQCgw/s1600-h/img1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 284px;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/S3Zd1qNMeCI/AAAAAAAAAKE/C3QVCoOQCgw/s400/img1.png" alt="" id="BLOGGER_PHOTO_ID_5437636776540534818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Légende :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ref — référentiels, « &lt;span style="font-style: italic;"&gt;Repositories&lt;/span&gt; » : Ce sont les éléments à sauvegarder. En l'occurrence Subversion, un wiki…&lt;br /&gt;&lt;/li&gt;&lt;li&gt;m2 — ordonnanceur, « &lt;span style="font-style: italic;"&gt;Scheduler&lt;/span&gt; »&lt;/li&gt;&lt;li&gt;bkp — espace de sauvegarde, « &lt;span style="font-style: italic;"&gt;Archives&lt;/span&gt; »&lt;/li&gt;&lt;li&gt;tmp —  espace temporaire pour restauration&lt;/li&gt;&lt;li&gt;ci — outil d'intégration continue, « &lt;span style="font-style: italic;"&gt;Continuous Integration&lt;/span&gt; »&lt;/li&gt;&lt;/ul&gt;Les machines « ref » et « m2 » sont sur un même réseau local (LAN).&lt;br /&gt;&lt;ul&gt;&lt;li&gt;« ref » est visible sur internet, ports 22 et 80. Sur le LAN elle est dans une DMZ, et en particulier n'accède pas à « m2 ».&lt;/li&gt;&lt;li&gt;« m2 » n'est pas visible sur internet.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Les machines « bkp + tmp » et « ci » sont sur internet, avec leurs accès SSH limités à certaines adresses IP.&lt;br /&gt;&lt;br /&gt;Les étapes du processus sont les suivantes :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;sauvegardes locales sur « ref », par l'outil « backup-manager »&lt;/li&gt;&lt;li&gt;copie vers une machine distante qui stocke les archives, avec éventuellement une copie intermédiaire locale sur l'ordonnanceur lui-même&lt;br /&gt;&lt;/li&gt;&lt;li&gt;décompression de la dernière sauvegarde présente dans les archives, restauration, contrôles et mesures&lt;/li&gt;&lt;li&gt;copie des résultats des contrôles et mesures, vers une machine d'intégration continue&lt;/li&gt;&lt;li&gt;analyse des résultats des contrôles et mesures, tests sur des critères d'acceptabilité&lt;/li&gt;&lt;li&gt;[E] si une erreur est décelée, envoi d'un e-mail à l'administrateur&lt;/li&gt;&lt;/ol&gt;En gros, j'arrête de poser des crontabs partout comme je faisais il y a deux ans (voir article : &lt;a href="http://jefute.blogspot.com/2008/04/validation-de-backups.html"&gt;Validation de backups&lt;/a&gt;) ; c'est un plat de spaghetti à administrer, et, quand une machine tombe ou est recyclée, les autres continuent leur semoule sans que ça serve à quoi que ce soit.&lt;br /&gt;&lt;br /&gt;L'ordonnancement centralisé facilite les enchaînements.&lt;br /&gt;&lt;br /&gt;En revanche, il ne facilite pas forcément la gestion de verrous.&lt;br /&gt;&lt;br /&gt;Autre changement par rapport à il y a deux ans, j'écris mes scripts système en Bash et délaisse Ruby, qui n'apportait pas tant que ça.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Contrôles et mesures&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pour un &lt;span style="font-style: italic;"&gt;repository &lt;/span&gt;Subversion, après restauration des données, les tests d'intégration continue se feront sur les mesures suivantes :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;nom et taille du fichier de sauvegarde restauré =&gt; la date doit être celle du jour&lt;br /&gt;&lt;/li&gt;&lt;li&gt;dates de début et fin de la restauration =&gt; le traitement ne doit pas avoir été trop rapide&lt;br /&gt;&lt;/li&gt;&lt;li&gt;numéro de version (&lt;span style="font-style: italic;"&gt;Revision&lt;/span&gt;) =&gt; ?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;nombre total de fichiers après checkout =&gt; il doit être supérieur à telle valeur&lt;/li&gt;&lt;li&gt;nombre de fichiers « pom.xml » après checkout =&gt; il doit être supérieur à telle valeur&lt;/li&gt;&lt;li&gt;nombre de fichiers « build.xml » après checkout =&gt; il doit être supérieur à telle valeur&lt;/li&gt;&lt;/ul&gt;L'idée est de repérer les cas de sauvegardes vides, ainsi que les sauvegardes obsolètes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Quelques idées rejetées&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il est bon de fonder ses choix &lt;span style="font-style: italic;"&gt;aussi &lt;/span&gt;sur l'historique des choix qui n'ont pas été retenus &lt;span style="font-family:courier new;"&gt;;-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Idée rejetée : copie directe depuis la machine de référentiel vers la machine de backup.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/S3ZjzrvhgqI/AAAAAAAAAKc/OES6yzdLvnk/s1600-h/img4.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 188px; height: 293px;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/S3ZjzrvhgqI/AAAAAAAAAKc/OES6yzdLvnk/s400/img4.png" alt="" id="BLOGGER_PHOTO_ID_5437643339662983842" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S3ZiMt5q45I/AAAAAAAAAKM/rSskqj8e5_w/s1600-h/img2.png"&gt;&lt;br /&gt;&lt;/a&gt;Explication : pourquoi la machine de référentiel devrait-elle avoir connaissance de l'existence d'une machine de backup ? Et en être dépendante ? Et dépenser de la charge et être administrée pour ça ?&lt;br /&gt;L'idée est que les processus de restauration d'archives doivent être vus &lt;span style="font-style: italic;"&gt;par ailleurs&lt;/span&gt;. La machine à sauvegarder n'a pas elle-même à savoir qu'elle devrait envoyer un e-mail, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Idée rejetée : accès direct depuis la machine de backup à la machine de référentiel.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S3ZiMt5q45I/AAAAAAAAAKM/rSskqj8e5_w/s1600-h/img2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 213px; height: 261px;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/S3ZiMt5q45I/AAAAAAAAAKM/rSskqj8e5_w/s400/img2.png" alt="" id="BLOGGER_PHOTO_ID_5437641570715886482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Explication :  on a choisi dans l'architecture de limiter les accès SSH à « ref» depuis l'internet à l'utilisation de Subversion. En particulier, pas d'accès aux utilitaires « ls » et « tar ».&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Idée rejetée : stocker les archives sur la machine d'ordonnancement.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/S3ZjPhpzzFI/AAAAAAAAAKU/p5IIiFJI_20/s1600-h/img3.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 241px; height: 97px;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/S3ZjPhpzzFI/AAAAAAAAAKU/p5IIiFJI_20/s400/img3.png" alt="" id="BLOGGER_PHOTO_ID_5437642718479371346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Explication : cette machine est dans les mêmes locaux que la machine référentiel. Or on veut évidemment que les données archivées soient physiquement découplées des données d'origine.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Idée rejetée : ordonnancement par cron de la restauration depuis l'espace temporaire.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;C'est ce que faisait l'ancienne architecture.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S3Zl5hkGmaI/AAAAAAAAAKk/jPwSXaoV8Yo/s1600-h/img5.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 323px; height: 313px;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/S3Zl5hkGmaI/AAAAAAAAAKk/jPwSXaoV8Yo/s400/img5.png" alt="" id="BLOGGER_PHOTO_ID_5437645639033199010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Explication : l'espace temporaire n'a pas à être administré et donc n'a pas à contenir de scripts résiduels ni de crontab.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Idée rejetée : restauration sur la machine d'ordonnancement.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S3ZmnLaIXFI/AAAAAAAAAKs/oyQYHiREybo/s1600-h/img6.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 318px; height: 279px;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/S3ZmnLaIXFI/AAAAAAAAAKs/oyQYHiREybo/s400/img6.png" alt="" id="BLOGGER_PHOTO_ID_5437646423359773778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Explication : Il faut que la restauration ait lieu à partir d'un élément archivé  (celui qu'on ira réellement chercher en cas de problème), et pas depuis  une copie intermédiaire, qui par définition disparaîtra.&lt;br /&gt;De plus, ni la mémoire ni le CPU ne sont suffisants sur cette machine pour une restauration.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Idée rejetée : envoi des résultats directement depuis l'espace temporaire vers la machine d'intégration continue.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/S3ZnKd7KXsI/AAAAAAAAAK0/OOqi5sbEkSk/s1600-h/img7.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 291px;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/S3ZnKd7KXsI/AAAAAAAAAK0/OOqi5sbEkSk/s400/img7.png" alt="" id="BLOGGER_PHOTO_ID_5437647029625577154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Explication : l'espace temporaire n'a pas à connaître la machine d'intégration continue, à y avoir posé sa clef publique, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Idée rejetée : récupération des résultats par la machine d'intégration continue auprès de l'espace temporaire.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/S3ZnkwBoW8I/AAAAAAAAAK8/RtyZfP0BjB4/s1600-h/img8.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 291px;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/S3ZnkwBoW8I/AAAAAAAAAK8/RtyZfP0BjB4/s400/img8.png" alt="" id="BLOGGER_PHOTO_ID_5437647481161145282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Explication : la machine d'intégration continue n'a pas à savoir qu'il existe un espace temporaire (en plus, comment s'y connecter s'il n'est pas résiduel ?)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Variante possible&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Une variante qui semble être digne d'intérêt, consiste à stocker les résultats des contrôles et mesures dans les référentiels, et que la machine d'intégration continue y accède.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/S3Zoe0PJy-I/AAAAAAAAALE/tKTtAXWGdno/s1600-h/img9.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 321px;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/S3Zoe0PJy-I/AAAAAAAAALE/tKTtAXWGdno/s400/img9.png" alt="" id="BLOGGER_PHOTO_ID_5437648478724017122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Quelques avantages :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;l'ordonnanceur n'a plus à connaître la topographie de la machine d'intégration continue&lt;/li&gt;&lt;li&gt;les résultats des contrôles et mesures sont archivés&lt;/li&gt;&lt;li&gt;on s'appuie sur le lien de l'ordonnanceur vers la machine référentiel, qui existe déjà&lt;/li&gt;&lt;li&gt;on s'appuie sur le lien de la machine d'intégration continue vers la machine référentiel, qui existe déjà&lt;/li&gt;&lt;li&gt;les tests sur les résultats peuvent être lancés depuis n'importe quel environnement qui a accès au référentiel, pas seulement depuis la machine d'intégration continue (donc, pratique pour &lt;span&gt;développer&lt;/span&gt; ces tests)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/S3Zo59RaWCI/AAAAAAAAALM/izzs6K5JXjc/s1600-h/img10.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 311px;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/S3Zo59RaWCI/AAAAAAAAALM/izzs6K5JXjc/s400/img10.png" alt="" id="BLOGGER_PHOTO_ID_5437648945005877282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quelques inconvénients :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;le référentiel augmente de façon automatique et ininterrompue, or ce référentiel est lui-même destiné à être sauvegardé et archivé, donnant lieu à des contrôles, qui seront injectés dans le référentiel, etc.&lt;br /&gt;Certes l'augmentation est d'1 Ko par jour, ce qui est dérisoire, mais techniquement, le principe du mécanisme croissant qui s'alimente lui-même n'est pas bon.&lt;/li&gt;&lt;li&gt;d'un point de vue fonctionnel ce serait mélanger production et décisionnel.&lt;br /&gt;Production = référentiel Subversion.&lt;br /&gt;Décisionnel = tests en intégration continue après extraction de mesures.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-256052150106683260?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/256052150106683260/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=256052150106683260' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/256052150106683260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/256052150106683260'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/02/restauration-quotidienne-de-sauvegardes.html' title='Restauration quotidienne de sauvegardes'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kKYRIZmegcw/S3Zd1qNMeCI/AAAAAAAAAKE/C3QVCoOQCgw/s72-c/img1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8317529967317357927</id><published>2010-02-10T20:10:00.004+01:00</published><updated>2010-02-10T20:13:17.215+01:00</updated><title type='text'>Curriculum Vitæ à jour</title><content type='html'>Après la compta à jour et même le bilan d'Avantage Compris au clair, voici que je complète mon CV dans les temps !&lt;br /&gt;&lt;br /&gt;CV en ligne : &lt;a href="http://www.avantage-compris.com/team/dandriana/"&gt;http://www.avantage-compris.com/team/dandriana/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;J'en ai même fait une version anglaise, mais pour l'instant le site de ma boîte n'est qu'en français &lt;span style="font-family: courier new;"&gt;:-P&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8317529967317357927?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8317529967317357927/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8317529967317357927' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8317529967317357927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8317529967317357927'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/02/curriculum-vit-jour.html' title='Curriculum Vitæ à jour'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-1099577668652437911</id><published>2010-02-03T18:30:00.002+01:00</published><updated>2010-02-03T18:35:28.115+01:00</updated><title type='text'>IZI-collecte, plate-forme web pour les associations</title><content type='html'>D'après la page d'accueil, IZI-collecte (&lt;a href="http://www.izi-collecte.com/"&gt;http://www.izi-collecte.com/&lt;/a&gt;) propose :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un paiement sécurisé pour les dons et les cotisations à un tarif bas et fixe, comprenant l’émission du e-reçu fiscal et des fonctionnalités communautaires&lt;/li&gt;&lt;li&gt;une plateforme d’envoi d’e-mailings et d’e-newsletters.&lt;/li&gt;&lt;li&gt;la gestion de base de données adhérents et donateurs&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-1099577668652437911?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/1099577668652437911/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=1099577668652437911' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1099577668652437911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1099577668652437911'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/02/izi-collecte-plate-forme-web-pour-les.html' title='IZI-collecte, plate-forme web pour les associations'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-7343702460412326038</id><published>2010-01-02T09:44:00.003+01:00</published><updated>2010-01-02T09:46:54.835+01:00</updated><title type='text'>Bonne et heureuse année</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/Sz8HasyBl5I/AAAAAAAAAJ8/7RGOwa-iUpE/s1600-h/bonne+annee.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer; width: 400px; height: 139px; border: 0;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/Sz8HasyBl5I/AAAAAAAAAJ8/7RGOwa-iUpE/s400/bonne+annee.png" alt="" id="BLOGGER_PHOTO_ID_5422060631656339346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-7343702460412326038?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/7343702460412326038/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=7343702460412326038' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7343702460412326038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7343702460412326038'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2010/01/bonne-et-heureuse-annee.html' title='Bonne et heureuse année'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kKYRIZmegcw/Sz8HasyBl5I/AAAAAAAAAJ8/7RGOwa-iUpE/s72-c/bonne+annee.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3392981422062702789</id><published>2009-12-16T11:58:00.003+01:00</published><updated>2009-12-16T12:01:41.155+01:00</updated><title type='text'>Book Mark</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.swiss-miss.com/2009/12/book-mark.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Swissmiss+%28swissmiss%29"&gt;&lt;img style="margin: 0px 0 10px; display: block; text-align: left; cursor: pointer; width: 480px; height: 480px;" src="http://files.posterous.com/cristianca/CeeeoEyoECoBfwHAolBmobInmbsayBivsosuAxAoAyoCzcbtfzvhdudIsEBF/media_httpwwwswissmisscomwpcontentuploads200912tumblrku264ePJrC1qzu6nxo1500480x480jpg_eshlDrCmkdsdHgD.jpg.scaled500.jpg?AWSAccessKeyId=1C9REJR1EMRZ83Q7QRG2&amp;amp;Expires=1260961473&amp;amp;Signature=ninUI0o9SmtCrPaKbmbITG3pom8%3D" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Merci à &lt;a href="http://www.cristianca.org/"&gt;Cristian&lt;/a&gt; :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3392981422062702789?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3392981422062702789/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3392981422062702789' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3392981422062702789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3392981422062702789'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/12/book-mark.html' title='Book Mark'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3509166056957260217</id><published>2009-11-01T21:52:00.003+01:00</published><updated>2009-11-01T21:56:20.825+01:00</updated><title type='text'>Démarrer tftpd</title><content type='html'>J'avais parlé d'une net install de Debian sur Mac PowerPC : &lt;a href="http://jefute.blogspot.com/2009/09/mac-mini-de-netbsd-debian.html"&gt;Mac mini de NetBSD à Debian&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Eh bien il se trouve qu'il est parfois difficile de démarrer &lt;span style="font-style: italic;"&gt;from scratch&lt;/span&gt; un tftpd pour que le Mac l'attaque. Alors voici une façon de faire, sur une Ubuntu 9.04 (eh oui : la 9.10 est d'une discutable stabilité).&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;$ sudo aptitude install tftpd&lt;/span&gt;&lt;/blockquote&gt;inetd ne veut pas démarrer au cours de l'install ? Pas grave, l'idée n'était justement de le rendre résiduel.&lt;br /&gt;&lt;br /&gt;Modifier /etc/inetd.conf tout de même, en rajoutant l'option « -s » à : /usr/sbin/in.tftpd -s /srv/tftp&lt;br /&gt;&lt;br /&gt;Mettre les fichiers à servir dans /srv/tftp/ : yaboot, etc.&lt;br /&gt;&lt;br /&gt;Démarrer inetd :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;$ sudo inetd&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3509166056957260217?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3509166056957260217/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3509166056957260217' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3509166056957260217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3509166056957260217'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/11/demarrer-tftpd.html' title='Démarrer tftpd'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-495499700665639559</id><published>2009-10-11T10:23:00.004+02:00</published><updated>2009-10-11T11:04:10.390+02:00</updated><title type='text'>La persistance applicative comme un aspect</title><content type='html'>Dans le développement d'une application on pense souvent très tôt à la solution de persistance. Certains ont même une idée tellement précise du « modèle physique des données » — terminologie qui est une drôle de façon se se rassurer —, qu'ils vont à terme jusqu'à contraindre le comportement de l'application ou du système pour se conformer au schéma de la base. Ainsi du genre de réponses « on ne peut pas faire ce que vous demandez, à cause des clefs étrangères qui sont déclarées dans la base ». Ah… Et pourquoi ne pas faire des batchs d'audit et de rattrapage ? Et pourquoi ne pas gérer des états de mes données ? Et pourquoi ne pas laisser les transitions se faire de façon asynchrone ? Et surtout : si vous vous appuyez sur des clefs étrangères pour assurer l'intégrité métier de mes données, vous me faites plutôt penser que vous n'avez pas compris mon métier !&lt;br /&gt;Quel métier se résume à des contraintes techniques d'intégrité ? (contraintes que du reste les DBAs font la plupart du temps sauter en production afin d'améliorer les perfs).&lt;br /&gt;&lt;br /&gt;Cependant je ne veux pas reparler ici de centrer les objectifs du cycle de développement sur les processus métier, je considère que c'est acté.&lt;br /&gt;&lt;br /&gt;Non, je voudrais parler de persistance.&lt;br /&gt;&lt;br /&gt;Il y a des cas où les processus métier sont suffisamment simples pour être embarqués dans une application transactionnelle, où il n'y a pas ou quasiment pas d'existant, bref, où on a la latitude pour développer. Pléthore de frameworks de persistance viennent en sus à notre rescousse, on peut citer Hibernate (&lt;a href="https://www.hibernate.org/"&gt;https://www.hibernate.org/&lt;/a&gt;) dans les premiers.&lt;br /&gt;&lt;br /&gt;Pourtant nombre d'entre nous continuent de vouloir poser le schéma de la base, quand bien même serait-il un &lt;span style="font-style: italic;"&gt;mapping&lt;/span&gt; naïf des propriétés des objets Java, dès le commencement.&lt;br /&gt;&lt;br /&gt;Pourquoi ne pas simplement développer l'application ? On met toutes les données en mémoire, et on optimisera ensuite ! J'ai juste besoin dans un coin d'un compteur transactionnel pour mes états métier (ben, oui), compteur que je peux implémenter par un &lt;span style="font-family: courier new;"&gt;synchronized&lt;/span&gt; tout bête, et je fais mouliner le reste avec des classes &lt;span style="font-style: italic;"&gt;ad hoc&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Plus tard, quand j'aurai besoin de partager mes données sur un cluster, ou de performances, ou tout simplement de sauvegardes parce que j'aurai à mettre en place un PRA (Plan de reprise d'activité, en gros comment remettre d'aplomb un deuxième système informatique si le premier vient de calancher, par exemple suite à un incendie), alors là, oui, je me pencherai sur la persistance. Mais c'est un &lt;span style="font-weight: bold;"&gt;aspect &lt;/span&gt;de l'application, au même titre que la sécurité ou les logs. Ce n'en est pas le cœur ni le socle ; ce n'est pas fondamental : l'absence de persistance des données, dans le sens général, n'empêche pas l'application de tourner.&lt;br /&gt;&lt;br /&gt;D'ailleurs combien, parmi ceux qui pensent de suite à la solution de persistance, le font réellement parce qu'ils envisagent un PRA ou des performances maximales ? Non, le plus souvent la couche de persistance est envisagée comme une &lt;span style="font-style: italic;"&gt;nécessaire façon&lt;/span&gt; de réaliser une application. Dans d'autres domaines on sait s'affranchir de ce genre de préjugés : les compilateurs dégagent, avec Ruby ou Groovy et l'aide des IDEs, les descriptions XML sont supplantées par des conventions ou des annotations, le besoin de &lt;span style="font-style: italic;"&gt;hardware&lt;/span&gt; diminue grâce au &lt;span style="font-style: italic;"&gt;cloud&lt;/span&gt;, on se fiche de l'OS parce qu'on fait du web, etc.&lt;br /&gt;&lt;br /&gt;La couche technique de persistance n'est &lt;span style="font-style: italic;"&gt;pas&lt;/span&gt; nécessaire dans une application. En revanche la couche logique de manipulation simple des données, notamment avec des verrous voire des états, et des vérifications d'intégrité, oui.&lt;br /&gt;Et il y aura toujours moyen plus tard d'orchestrer tout ça et d'y ajouter les aspects désirés.&lt;br /&gt;&lt;br /&gt;Pour finir, l'approche que je décris vise à éjecter la problématique de la persistance lorsqu'on se centre  sur du développement applicatif. Pour d'autres types de réalisations, par exemple techniques, la question de la persistance se rencontre évidemment dès le début du chemin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-495499700665639559?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/495499700665639559/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=495499700665639559' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/495499700665639559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/495499700665639559'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/10/la-persistance-applicative-comme-un.html' title='La persistance applicative comme un aspect'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5006869397114328188</id><published>2009-10-06T23:34:00.004+02:00</published><updated>2009-10-07T00:09:58.162+02:00</updated><title type='text'>svn://svn+ssh</title><content type='html'>Ceci sera un post légèrement cryptique pour les non informaticiens.&lt;br /&gt;&lt;br /&gt;C'est juste pour me rappeler… comment accéder à Subversion par SSH avec clefs…&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sur le serveur : SSH.&lt;/span&gt; Permettre l'authentification par clefs.&lt;br /&gt;&lt;br /&gt;Dans /etc/ssh/sshd_config :&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;RSAAuthentication yes&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;PubkeyAuthentication yes&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;AuthorizedKeysFile %h/.ssh/authorized_keys&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Dans les ~/.ssh/ des intéressés, fichier authorized_keys avec une ligne par clef publique acceptée, du genre : &lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;ssh-rsa AAAAB3Nz(…)PMRJl8=&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ssh-rsa AAAAB3Nz(…)PM60l8==&lt;/span&gt;&lt;br&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;ssh-rsa AAAAB35u(…)rT62zA== dandriana@ordinateur&lt;/span&gt;&lt;/blockquote&gt;Pour produire des clefs publiques, ssh-keygen sous Unix et Puttygen sous Windows. Si Puttygen, une fois la clef publique créée, l'exporter au format OpenSSH pour pouvoir l'utiliser sur un serveur Unix.&lt;br /&gt;&lt;br /&gt;C'est lors de la génération des clefs qu'est demandée la « passphrase », mot de passe qui active la clef privée.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sur le serveur : Subversion.&lt;/span&gt; Vu qu'on va faire du svn+ssh, pas besoin de lancer svnserve, donc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sur le client : SSH. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sous Unix, clefs privées et publiques à mettre dans ~/.ssh. En général leurs noms respectifs sont « id_rsa » (-rw-------) et « id_rsa.pub » (-rw-r--r--). Connexion en : ssh -l &amp;lt;username&amp;gt; -i &amp;lt;/path/to/private/key&amp;gt;&lt;br /&gt;&lt;br /&gt;Sous Windows, clefs à mettre chais pas où, tellement c'est sécurisé. Faire pointer Putty dessus.&lt;br /&gt;&lt;br /&gt;Rappel : les clefs publiques « xxx.pub » sont destinées à être fournies publiquement : envois par e-mail, publication dans un blog…&lt;br /&gt;&lt;br /&gt;En revanche les clefs privées sont à protéger absolument. Elles sont plus précieuses que le mot de passe (« passphrase ») qui les active.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sur le client : agent SSH. &lt;/span&gt;Pour éviter d'avoir à s'authentificer à chaque fois.&lt;br /&gt;&lt;br /&gt;Sous Unix, ssh-agent :&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;exec ssh-agent bash&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ssh-add &amp;lt;/path/to/private/key&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Sous Windows, Pageant.&lt;br /&gt;&lt;br /&gt;ssh-agent et Pageant peuvent être lancés au démarrage pour gagner du temps. Cela dépend de l'usage qu'on en a.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sur le client : Subversion+SSH.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sous Unix, déclarer dans son .profile une variable d'environnement SVN_SSH, du genre :&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;export SVN_SSH="ssh -l &amp;lt;username&amp;gt; -i &amp;lt;/path/to/private/key&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Si ça ne fonctionne pas, voir ~/.subversion/config.&lt;br /&gt;&lt;br /&gt;Sous Windows, après une installation de la version de CollabNet de Subversion, j'ai mis ceci dans C:\Documents and Settings\&amp;lt;user&amp;gt;\Application Data\Subversion\config :&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;[tunnels]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ssh=&amp;lt;C:\path\to\&amp;gt;PLINK.EXE -l &amp;lt;username&amp;gt; -i &amp;lt;C:\path\to\private\key&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-5006869397114328188?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5006869397114328188/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5006869397114328188' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5006869397114328188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5006869397114328188'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/10/svnsvnssh.html' title='svn://svn+ssh'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-7821019789660304337</id><published>2009-09-11T16:49:00.002+02:00</published><updated>2009-09-11T16:54:36.433+02:00</updated><title type='text'>Mac mini de NetBSD à Debian</title><content type='html'>Après qu'il a déjà fourni trois ans de bons et loyaux services sous NetBSD, dont dix-huit mois à faire silencieusement des backups enfermé dans un carton à la cave, je me suis mis dans l’idée de passer un Mac mini PPC sous Debian.&lt;br /&gt;&lt;br /&gt;C’était l’occasion de sortir, de son carton également, un écran cathodique dix ans d’âge, et de dépoussiérer un peu les étagères.&lt;br /&gt;&lt;br /&gt;Une fois l’écran et un clavier Dell de base connectés au Mac, enfoncer les touches Windows-Alt-O-F au démarrage pour accéder à &lt;i&gt;Open Firmware&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Pour lancer depuis &lt;i&gt;Open Firmware&lt;/i&gt; un &lt;i&gt;netboot&lt;/i&gt; d’installation de Debian 5.0.3 (dit « Lenny ») :&lt;br /&gt;&lt;blockquote&gt; ok&lt;br /&gt;0 &gt; boot enet:192.168.0.12,yaboot&lt;br /&gt;&lt;/blockquote&gt;Cette ligne nécessite que sur le réseau local :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;les adresses IP soient attribuées par un serveur DHCP,&lt;/li&gt;&lt;li&gt;la machine 192.168.0.12 fasse tourner un serveur TFTP,&lt;/li&gt;&lt;li&gt;et serve par TFTP les fichiers d’installation de Debian, dont yaboot, yaboot.conf, vmlinux, etc.&lt;/li&gt;&lt;/ul&gt;L’installation ensuite se passe sans heurts majeurs, et va chercher sur internet tout ce qu’il convient.&lt;br /&gt;&lt;br /&gt;Une fois l’installation terminée, après la configuration de SSH en clefs publiques, puis la mise au jour des postes clients « bureau », « salon » et « salle de jeux » en vérifiant qu’ils savent se connecter au nouveau système, le Mac mini, flanqué d’une nouvelle étiquette, a rejoint son grand carton.&lt;br /&gt;&lt;br /&gt;Silencieusement, bientôt oublié dans le carton du fond avec sa pomme sur le couvercle, un vaillant petit serveur mouline.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-7821019789660304337?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/7821019789660304337/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=7821019789660304337' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7821019789660304337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7821019789660304337'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/09/mac-mini-de-netbsd-debian.html' title='Mac mini de NetBSD à Debian'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-1883267092977496477</id><published>2009-06-08T10:20:00.003+02:00</published><updated>2009-06-08T10:53:18.853+02:00</updated><title type='text'>Comment le Parlement européen avait voté contre Hadopi</title><content type='html'>Sur le bon blog « &lt;a href="http://bruxelles.blogs.liberation.fr/coulisses/"&gt;Coulisses de Bruxelles&lt;/a&gt; » un article qui narre le vote majoritaire (c'est important) du paquet télécom au Parlement européen, avec la fameuse obligation d'une décision judiciaire pour couper un accès internet : &lt;a href="http://bruxelles.blogs.liberation.fr/coulisses/2009/06/surprise-partis-%C3%A0-strasbourg.html"&gt;Surprise partis à Strasbourg&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Rappelons que le Parlement européen est &lt;span style="font-style: italic;"&gt;élu&lt;/span&gt; au suffrage universel direct. C'est ce qui vient de se passer ce dimanche 7 juin 2009. Le suffrage universel direct est une disposition démocratique extrêmement importante, qui semble aller de soi, notamment en France, mais qui n'est &lt;span style="font-style: italic;"&gt;pas&lt;/span&gt; naturelle. En pratique il faut d'abord la gagner (&lt;span style="font-style: italic;"&gt;&lt;/span&gt;rappelez-vous 1789), la valider, vérifier son application, et l'alimenter au fil des ans et des générations (non, l'abstention n'est &lt;span style="font-style: italic;"&gt;pas&lt;/span&gt; une façon d'entretenir le suffrage universel).&lt;br /&gt;&lt;br /&gt;En revanche la Commission européenne n'est &lt;span style="font-style: italic;"&gt;pas&lt;/span&gt; élue directement : elle représente peu ou prou les États (disons les gouvernements) en tant que nations, pas en tant que peuples. Or c'est &lt;span style="font-style: italic;"&gt;elle&lt;/span&gt; qui propose 80 % des textes qui seront ensuite votés, &lt;span style="font-style: italic;"&gt;pas&lt;/span&gt; le Parlement européen. S'il y a dissensions entre le désir citoyen et les « décisions de Bruxelles » c'est justement en grande partie parce que les textes proposés ne réflètent pas les simples problématiques des peuples.&lt;br /&gt;&lt;br /&gt;Vouloir que l'entité européenne (aujourd'hui la Commission) qui propose les textes aux votes soit plus proche de l'expression populaire, c'est &lt;span style="font-weight: bold;"&gt;une&lt;/span&gt; certaine façon de vouloir l'Europe, absolument pas partagée par tous les membres de l'Union. En pratique cela consisterait à modifier les institutions, ce qui &lt;span style="font-style: italic;"&gt;ne se fait pas&lt;/span&gt; pendant les élections européennes (dont les effets se limitent au Parlement), mais par des traités, généralement soumis à référendums populaires. Cela peut également se faire par une révolution populaire européenne ou un putsch de niveau Empire.&lt;br /&gt;&lt;br /&gt;On fait mine de croire que tout est géré « en haut lieu », mais il faut au contraire être bien conscient qu'il y a actuellement un combat très tendu entre ce que pourrait être une Europe des citoyens et une éventuelle Europe des gouvernements.&lt;br /&gt;&lt;br /&gt;Pour ce sujet, dans quel sens le défunt TCE et le Traité de Lisbonne vont-ils ? Eh bien vers un  accroissement de pouvoir du Parlement européen. Ce nécessaire accroissement est-il suffisant ? Sans doute pas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-1883267092977496477?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/1883267092977496477/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=1883267092977496477' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1883267092977496477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1883267092977496477'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/06/comment-le-parlement-europeen-avait.html' title='Comment le Parlement européen avait voté contre Hadopi'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8543603109912364970</id><published>2009-05-02T08:29:00.002+02:00</published><updated>2009-05-02T09:22:11.290+02:00</updated><title type='text'>La face cachée d'Hadopi</title><content type='html'>Sur Agora Vox, un article intitulé &lt;a href="http://www.agoravox.fr/actualites/citoyennete/article/la-face-cachee-du-projet-de-loi-55085"&gt;La face cachée du projet de loi Internet &amp;amp; Création, dite « HADOPI »&lt;/a&gt;, avec lequel je suis assez d'accord.&lt;br /&gt;&lt;br /&gt;L'article parle bien du problème de la preuve : en gros ce qui fera techniquement preuve dans un premier temps sera l'adresse IP interceptée et qui aura permis de remonter jusqu'à la connexion à internet de l'abonné. Je détaillerais :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ces adresses peuvent être « forgées » : selon le niveau de protocole qui sera utilisé pour le filtrage, il est possible d'usurper l'adresse IP de quelqu'un d'autre.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ces adresses publiques ne concernent pas les sous-réseaux : dans le cas d'un accès partagé à internet (réseau domestique, Wi-Fi...), impossible de décider quel ordinateur est impliqué. C'est pour cela qu'un logiciel client est indispensable pour avoir des preuves tangibles. Sans logiciel client, la preuve est potentiellement fausse, d'où l'absurdité de la loi, or une loi absurde est dangereuse. Avec un logiciel client (et certainement pas &lt;span style="font-style: italic;"&gt;open source&lt;/span&gt;, ce n'est pas l'esprit), adieu votre vie privée.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ces adresses concernent un accès à internet, mais pas une personne : en cas d'ordinateur partagé par une famille ou un groupe, impossible de savoir qui a fait quoi. Donc d'une part on peut vous pirater, d'autre part ça peut venir de chez vous. La loi va dans le sens de vous accuser &lt;span style="font-style: italic;"&gt;a priori&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Problématique de la preuve, donc, et volonté de pouvoir accuser n'importe qui. C'est extrêmement grave.&lt;br /&gt;&lt;br /&gt;Le deuxième énorme problème à mon sens est celui de la surveillance, dont parle également l'article d'Agora Vox.&lt;br /&gt;&lt;br /&gt;Je pense que la question de la preuve, donc ici de l'arbitraire, voire du délirant (quand l'arbitraire est, en plus, « de bonne foi » !), est un cas d'école des coups de boutoirs que subit régulièrement la République. Dans le but de conforter une structure économique qui na pas su s'adapter (ici le modèle de distribution des œuvres numériques), on souhaite remodeler le consommateur lui-même (un peu comme Monsanto qui remodèle les graines pour imposer son modèle d'agriculture), quitte à ce qu'il y ait des effets nocifs sur l'individu en tant que citoyen, et quitte à se torcher avec les fondamentaux du droit.&lt;br /&gt;&lt;br /&gt;Pour moi ce n'est pas une tension entre le fric et la République, tension qu'il s'agirait de régler par une voie médiane, mais très fondamentalement un combat entre des comportements débridés, qui se conçoivent eux-mêmes comme sans limites ou alors éventuellement extérieures — ainsi le droit est considéré comme une circonstance —, et une volonté positive, dont le droit est logiquement une conséquence.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8543603109912364970?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8543603109912364970/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8543603109912364970' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8543603109912364970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8543603109912364970'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/05/la-face-cachee-dhadopi.html' title='La face cachée d&apos;Hadopi'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-4119668249770456196</id><published>2009-04-12T15:39:00.002+02:00</published><updated>2009-04-12T15:47:08.472+02:00</updated><title type='text'>Notes scolaires et Facebook</title><content type='html'>Je cite &lt;a href="http://www.lepost.fr/article/2009/04/12/1493357_vous-aimez-facebook-attention-a-vos-notes.html#xtor=AL-235"&gt;un article du Post&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;Accro à Facebook ? Attention à vos notes !&lt;br /&gt;&lt;br /&gt;Selon une enquête très sérieuse, faite par des chercheurs, les étudiants qui passent beaucoup de temps sur Facebook, à accumuler des amis, papoter ou &lt;span style="font-style: italic;"&gt;poker&lt;/span&gt; les gens « consacrent moins d'une heure à leurs devoirs ».&lt;br /&gt;&lt;br /&gt;Pour le Times, qui révèle cette enquête, elle confirme les craintes des parents et des profs, et va dans le même sens que ces entreprises qui empêchent l'accès à Facebook dans leurs locaux, pour éviter le gaspillage de temps par les employés...&lt;br /&gt;&lt;br /&gt;« Chaque génération a ses distractions, mais je pense que Facebook est un phénomène unique » explique Aryn Karpinski, de la Ohio State University.&lt;/blockquote&gt;&lt;br /&gt;Je pense surtout qu'il manque un espace web ludique pour faire ses devoirs. Et qu'avec un tel type d'espace, les « notes » remonteraient. D'autant qu'il n'y a pas que les notes dans la vie, certes qu'elles soient bonnes est un préalable. Il s'agit au moins d'en donner les conditions aux enfants.&lt;br /&gt;&lt;br /&gt;Quand je dis un espace web pour faire ses devoirs, ce n'est même pas que le prof ait à mettre sur le web ses énoncés, mais seulement que l'élève puisse y rédiger ses réponses et y travailler en groupe avec d'autres.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-4119668249770456196?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/4119668249770456196/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=4119668249770456196' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4119668249770456196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4119668249770456196'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/04/notes-scolaires-et-facebook.html' title='Notes scolaires et Facebook'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5781955475648184250</id><published>2009-04-11T21:56:00.003+02:00</published><updated>2009-04-11T22:00:24.078+02:00</updated><title type='text'>Petits robots mignons</title><content type='html'>&lt;div&gt;Beaucoup de buzz sur cette expérience, qui à la lecture est sympa comme tout : &lt;a href="http://radar.oreilly.com/2009/04/tweenbots-cute-beats-smart.html"&gt;Tweenbots: Cute Beats Smart&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le but, fabriquer un robot qui arrive à aller d'un bout à l'autre de Central Park.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un gars a eu l'idée de construire un petit robot, qui ne sache aller que tout droit, mais arborant un petit papier « je veux aller [à tel endroit] » plus un grand sourire dessiné sur le carton.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Et donc les passants dans Central Park ont aidé le petit robot à trouver son chemin.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;:-)&lt;/span&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/28966088-5781955475648184250?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5781955475648184250/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5781955475648184250' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5781955475648184250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5781955475648184250'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/04/petits-robots-mignons.html' title='Petits robots mignons'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8457829560376271686</id><published>2009-04-03T10:43:00.003+02:00</published><updated>2009-04-03T10:59:25.999+02:00</updated><title type='text'>Hadopi la sorcière, votée</title><content type='html'>Ben voilà, l'infâme loi Hadopi vient d'être votée. J'ai réagi en premier lieu sur Twitter :&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://twitter.com/dandriana/status/1443666813"&gt;Hadopi : loi, par importance 1. suicidaire pour notre droit, 2. rongeuse de libertés, 3. économiquement idiote, et 4. techniquement absurde.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://twitter.com/dandriana/status/1443692338"&gt;Hadopi loi tueuse de droit. Or seulement 60 députés au vote. Et personne dans les rues. Lendemains qui déchantent à prévoir pour le citoyen.&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Je pense qu'on est dans un cas flagrant de délitement de ce qui constitue un État de droit. Ce n'est certes pas le seul de l'actuelle période.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je suis assez d'accord avec l'article sur Numerama : &lt;a href="http://www.numerama.com/magazine/12527-La-loi-Hadopi-votee-a-la-sauvette-par-16-deputes.html"&gt;La loi Hadopi votée à la sauvette par 16 députés !&lt;/a&gt; et surtout solidaire de la phrase suivante que j'en extrais : &lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;(...) en tant que citoyens, cette violation des principes qui fondent la République nous révulse.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Il est anormal que les artistes français soient à ce point à la ramasse quant à leur propre avenir face aux échanges économiques que permettent les réseaux informatiques. Certes. Mais le coup d'instrumentaliser lesdits artistes, et de s'appuyer sur une si grande ignorance du peuple, pour faire passer en douce des lois contraires aux principes d'égalité des citoyens entre eux et à la liberté individuelle, c'est odieux.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&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/28966088-8457829560376271686?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8457829560376271686/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8457829560376271686' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8457829560376271686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8457829560376271686'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/04/hadopi-la-sorciere-votee.html' title='Hadopi la sorcière, votée'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-7354714562782932175</id><published>2009-04-01T09:48:00.004+02:00</published><updated>2009-04-01T17:33:01.186+02:00</updated><title type='text'>Hadopi la sorcière</title><content type='html'>Des cerveaux suprêmes ont imaginé que le déboussolement des industriels de la culture par artefacts (notamment livres, musique et films) vis-à-vis d'internet (notamment web et P2P), pourraient servir à faire passer une loi de surveillance généralisée de l'usage d'internet  en France, et sans contrepartie en droit,  par le truchement de la mise en place du processus suivant :&lt;div&gt;&lt;ol&gt;&lt;li&gt;soit un internaute qui télécharge illégalement une œuvre numérisée,&lt;/li&gt;&lt;li&gt;téléchargement dont l'illégalité est détectée par un système automatisé,&lt;/li&gt;&lt;li&gt;cet internaute reçoit un e-mail lui signifiant que telle Haute Autorité sait qu'il télécharge illégalement quelque chose, sans lui dire exactement quoi,&lt;/li&gt;&lt;li&gt;puis en tant qu'usager il reçoit un courrier recommandé avec accusé de réception, toujours sans qu'on lui précise exactement ce qu'on lui reproche,&lt;/li&gt;&lt;li&gt;puis toujours en tant qu'usager sa connexion se voit interrompue.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Je passe sur les suites judiciaires telles qu'amendes et procès.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je passe sur l'aspect délibérément kafkaïen du scénario.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le Parlement Européen de se déclarer pour une reconnaissance d'un droit inaliénable à la connexion à internet, les associations faisant remarquer que couper une connexion à internet dans le cas d'un accès partagé, tel qu'au sein d'une famille, pénalise tous les usagers sans distinction, les entreprises n'étant pas concernées, bref.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Les acteurs du web de signaler que l'interconnexion des réseaux et les comportements sociaux qui existent d'ores et déjà au-dessus d'internet impliquent nécessairement une évolution du modèle économique que suivent les industriels de la culture de masse, et qu'un repli irrationnel du genre loi Hadopi ne fera en tout état de cause que s'opposer vainement au sens de l'Histoire plutôt que l'accompagner, c'est-à-dire obligera tout le monde à subir les changements plutôt qu'en être les acteurs, bref.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Les techniciens qui connaissent leur sujet d'estimer que pour mettre en place un filtrage un tant soit peu consistant les moyens à mettre en œuvre, en plus de la coordination entre les services publics et les opérateurs privés, dépassent de beaucoup tout ce qui serait suffisant à radicalement moderniser les usages des NTIC par l'État, dossier dont on sait par ailleurs, et peut-être par une symétrie d'ignorance ? que les parlementaires refusent de le prendre en main par peur de l'effort à produire, bref.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ce qui intimement me choque depuis le début se condense en deux points, qui ne sont pas relevés dans ce qui précède :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;un projet législatif qui consiste à surveiller et à demander des comptes aux citoyens de leur surveillance &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;sans leur donner&lt;/span&gt; les éléments auxquels ils pourraient s'opposer. Au lieu de dire : « nous avons relevé que le 12 juin 2009 à 21 h 53 la connexion internet n°XYZ chez le fournisseur XYZ, dont vous êtes l'abonné, a été utilisée pour le téléchargement du film "Taxi 4" par le logiciel Peer-to-peer eMule en passant par les cartes réseau d'adresses MAC n°XYZ, ce qui sauf au cas où vous détiendrez par ailleurs le droit de ce téléchargement (copie privée) vous expose, etc. etc. », le projet de loi prévoit de pouvoir dire : « une activité illégale a été détectée sur votre ordinateur, veuillez désormais obtempérer aux ordres de telle Haute Autorité ».&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;une surveillance et une analyse exhaustives des &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;communications&lt;/span&gt; qui passent par le réseau internet, toujours sans à rendre de comptes aux usagers.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Le premier point contrevient frontalement à l'idée que je me fais du droit. Je sais que l'&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Habeas corpus&lt;/span&gt; a été un progrès dans l'Histoire, eh bien visiblement il faut continuellement expliquer les progrès passés et réaffirmer les acquis dont nous jouissons au quotidien.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;De plus les NTIC &lt;span class="Apple-style-span" style="font-style: italic;"&gt;permettraient &lt;/span&gt;à moindre coût une transparence d'information des citoyens, qu'il s'agisse de l'action de l'administration ou à plus forte raison de ce que la société serait en droit de leur reprocher. Envoyer un courrier à un quidam coûte au moins un timbre, mais mettre en ligne tous ses logs de connexion qui ont fait l'objet de telle surveillance automatisée, coûte bien moins, et garantirait une symétrie entre l'accusé et l'accusateur, symétrie qui devrait au-delà de l'épiphénomène Hadopi être revendiquée comme sacro-sainte, mesurée par des moyens objectifs et dont la mesure devrait être publiée.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je trouve que le fait que la magouille évoquée concerne un projet de loi du domaine des NTIC est parfaitement secondaire. J'ai ainsi toujours été choqué que sous prétexte de radars automatiques on fasse payer des amendes sans en pratique fournir systématiquement la preuve du délit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le deuxième point, de surveillance absolue, concerne une question de projet de société. Voulons-nous ou non que nos agissements soient l'objet de surveillance systématique ? C'est en quelque sorte un retournement de la question démocratique, mais dans les deux cas la symétrie est une nécessité pratique : on ne peut pas imaginer une démocratie dans laquelle les citoyens n'auraient pas un accès égalitaire à l'éducation et à l'information d'une part libre et d'autre part publique, et on ne peut pas construire une société de la surveillance si, en gros, ce qui est relevé et désormais décortiqué n'est pas librement accessible en tant que données brutes à ceux qui sont surveillés.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Certes, la surveillance totale et la symétrie qui lui est un nécessaire corollaire dans un bête cadre de stabilité sociale, impliquent de refonder l'idée qu'on se fait de l'intimité et de la vie privée. Il faut simplement savoir ce qu'on veut.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour conclure et résumer je dirais que le projet de loi Hadopi ressort d'un monstrueux et pervers processus de démantèlement du droit et par conséquent d'aliénation de nos libertés. Que je suis effaré que le débat populaire sur Hadopi se concentre sur les aspects dits de progrès, qu'ils soient technologiques ou relevant de nouveaux modèles économiques, alors que les principes mêmes qui permettent qu'on s'accorde librement à se soumettre au droit y sont violemment souffletés.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est comme s'il y avait la volonté d'un divorce entre le droit subi et celui auquel on adhère. Petit à petit cela représente une catastrophe sociale.&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/28966088-7354714562782932175?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/7354714562782932175/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=7354714562782932175' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7354714562782932175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7354714562782932175'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/04/hadopi-la-sorciere.html' title='Hadopi la sorcière'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-359366849606942189</id><published>2009-03-29T14:07:00.002+02:00</published><updated>2009-03-29T14:11:14.601+02:00</updated><title type='text'>Kissing the mirror</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;Je traduis :&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Telle école privée aux USA a dû interdire à ses gamines d'élèves de laisser des bisous sur les miroirs de leur salle de bains.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chaque matin, plusieurs jeunes élèves autour de douze ans, se peinturluraient les lèvres de rouge dans la salle de bains. Rien à dire à cela, sauf qu'ensuite elles imprimaient un bécot au miroir, y laissant ainsi des dizaines de petites traces écarlates, que chaque fin de journée l'employé chargé du nettoyage devait nettoyer, et chaque matin le coupable manège recommençait.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finalement le principal décida qu'il fallait faire quelque chose. Il convoqua les filles dans la salle de bains, ainsi que l'employé qui effaçait chaque jour les rouges forfaits. Le principal expliqua que ces petites traces représentaient un problème majeur pour l'employé qui devait les nettoyer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Afin d'expliquer la difficulté, il demanda à l'employé de montrer aux filles la somme de travail que cela représentait. L'homme sortit alors une longue raclette, la plongea dans la cuvette des toilettes, et nettoya un miroir avec. Depuis, il n'y a plus de ces petites traces rouges dans la salle de bains.&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;a href="http://blog.chickencrap.com/2009/03/kissing-the-mirror/"&gt;Kissing the mirror&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J'aime beaucoup la structure narrative :-)&lt;/div&gt;&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/28966088-359366849606942189?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/359366849606942189/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=359366849606942189' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/359366849606942189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/359366849606942189'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/03/kissing-mirror.html' title='Kissing the mirror'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6875954629974424122</id><published>2009-01-30T11:03:00.003+01:00</published><updated>2009-01-30T11:10:33.377+01:00</updated><title type='text'>Développement : Dependency Analyzer</title><content type='html'>&lt;div style="text-align: left;"&gt;Oui, pardon, il y a un outil bien connu qui permet de voir des dépendances d'un projet Maven : &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://www.jfrog.org/sites/dep-analyzer/latest/"&gt;Dependency Analyzer&lt;/a&gt;&lt;/span&gt;, de jfrog, ceux qui font Artifactory.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SYLQuf4-GqI/AAAAAAAAAJk/go62HedAlhc/s1600-h/screenshot01.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SYLQuf4-GqI/AAAAAAAAAJk/go62HedAlhc/s320/screenshot01.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5297025608994134690" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est bien et utile, mais ce n'était pas mon besoin. Mon besoin était un besoin de m'y retrouver dans mon développement, pas de nettoyer ma configuration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Dependency Analyzer&lt;/span&gt; :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;me montre les dépendances extraites récursivement à partir d'&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;un&lt;/span&gt; projet source donné,&lt;/li&gt;&lt;li&gt;donne toutes les bibliothèques, donc en particulier pléthore de bibliothèques tierces,&lt;/li&gt;&lt;li&gt;traite correctement les versions,&lt;/li&gt;&lt;li&gt;s'appuie sur les POMs &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;installés&lt;/span&gt; du &lt;span class="Apple-style-span" style="font-style: italic;"&gt;local repository&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Mon outil :&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;me montre les dépendances dans un &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;espace de travail&lt;/span&gt; vu comme un ensemble,&lt;/li&gt;&lt;li&gt;est centré sur les projets dont j'ai les sources de l'espace de travail plutôt que les bibliothèques tierces ou les projets déjà construits,&lt;/li&gt;&lt;li&gt;fait n'importe quoi avec les versions (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;bug&lt;/span&gt; secondaire vu mon besoin),&lt;/li&gt;&lt;li&gt;s'appuie sur les POMs &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;en cours de développement &lt;/span&gt;de l'espace de travail.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Les deux types d'outils se complètent.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6875954629974424122?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6875954629974424122/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6875954629974424122' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6875954629974424122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6875954629974424122'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/developpement-dependency-analyzer.html' title='Développement : Dependency Analyzer'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kKYRIZmegcw/SYLQuf4-GqI/AAAAAAAAAJk/go62HedAlhc/s72-c/screenshot01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8889343746797989730</id><published>2009-01-30T07:23:00.012+01:00</published><updated>2009-02-02T22:40:01.270+01:00</updated><title type='text'>Développement : visualisation de dépendances Maven</title><content type='html'>&lt;div style="text-align: left;"&gt;Voici une micro-documentation sur l'outil dont je parlais dans mes précédents billets, qui produit un diagramme UML à partir d'une analyse des dépendances entre des projets Maven.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Pour télécharger l'outil&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En utilisant Maven, avec l'adresse de mon &lt;span class="Apple-style-span" style="font-style: italic;"&gt;repository&lt;/span&gt; :&lt;/div&gt;&lt;div&gt;&lt;a href="http://ref.avcompris.com/nexus/content/repositories/public-releases/"&gt;http://ref.avcompris.com/nexus/content/repositories/public-releases/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Ou en prenant directement le JAR : &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://ref.avcompris.com/nexus/content/groups/public/com/avcompris/commons/avc-commons-all-umldep/0.1.1/avc-commons-all-umldep-0.1.1-jar-with-dependencies.jar"&gt;JAR with dependencies&lt;/a&gt;&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Pour utiliser l'outil depuis Ant&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour ne pas trop se prendre la tête, mettre le JAR téléchargé avec les autres bibliothèques de Ant : répertoire $ANT_HOME/lib/. Sinon, il faut renseigner &amp;lt;classpath&amp;gt; dans les &amp;lt;taskdef&amp;gt; ci-dessous.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le principe ensuite consiste à enchaîner deux tâches :&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;concaténation de tous les POMs dans un seul fichier XML (&lt;span class="Apple-style-span"  style="font-size:small;"&gt;xmlconcatscan&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;analyse de ce fichier et génération d'un diagramme UML (&lt;span class="Apple-style-span"  style="font-size:small;"&gt;poms2uml&lt;/span&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Voici un exemple :&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;project name="umlgen" default="umlgen"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;taskdef name="xmlconcatscan"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;classname="com.avcompris.tools.ant.XMLConcatScanTask"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- &amp;lt;classpath&amp;gt; ... &amp;lt;/classpath&amp;gt; --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/taskdef&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;taskdef name="poms2uml"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;classname="com.avcompris.all.uml.ant.Poms2UmlTask"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- &amp;lt;classpath&amp;gt; ... &amp;lt;/classpath&amp;gt; --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/taskdef&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;target name="umgen"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;mkdir dir="target" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;xmlconcatscan destFile="temp.xml"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;fileset dir="/home/blabla/workspace"&amp;gt; &amp;lt;!-- workspace location --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;include name="*/pom.xml" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/fileset&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/xmlconcatscan&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;poms2uml srcFile="temp.xml" &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;destFile="all-poms.uml" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Ce projet Ant scanne le répertoire « /home/blabla/workspace », puis produit un diagramme UML dans le fichier « all-poms.uml ». Ce fichier peut ensuite être ouvert et manipulé avec l'outil &lt;a href="http://staruml.sourceforge.net/"&gt;StarUML&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/SYK0W8JuZFI/AAAAAAAAAJc/nlkrQmcVN_c/s1600-h/poa.PNG"&gt;&lt;img src="http://2.bp.blogspot.com/_kKYRIZmegcw/SYK0W8JuZFI/AAAAAAAAAJc/nlkrQmcVN_c/s320/poa.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5296994417938162770" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 249px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Diagramme après nettoyage dans StarUML&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cet exemple est fourni, plus complet, dans le projet Maven avc-commons-all-umldep.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Pour poser une question au support ;-)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Écrire un commentaire dans cet article de blog &lt;span class="Apple-style-span"  style="color: rgb(55, 109, 163);  font-weight: bold; white-space: pre; font-family:Avenir;"&gt;&lt;a href="http://snurl.com/azp1d"&gt;http://snurl.com/azp1d&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ou par e-mail : david.andriana@free.fr&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Pour récupérer les sources en local&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note : les sources sont en UTF-8.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Elles se récupèrent en lecture sur &lt;a href="http://svn.avcompris.com/"&gt;http://svn.avcompris.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Faire un checkout, projet par projet :&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-commons-all-noci/trunk avc-commons-all-noci&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-commons-all-umldep/trunk avc-commons-all-umldep&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-commons-databeans/trunk avc-commons-databeans&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-commons-lang/trunk avc-commons-lang&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-commons-parent/trunk avc-commons-parent&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-commons-testutil/trunk avc-commons-testutil&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-plugin-common/trunk avc-plugin-common&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-plugin-parent/trunk avc-plugin-parent&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-tools-ant/trunk avc-tools-ant&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-tools-common/trunk avc-tools-common&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-tools-databeans-plugin/trunk avc-tools-databeans-plugin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;svn co http://svn.avcompris.com/avc-tools-databeans-plugin-ut/trunk avc-tools-databeans-plugin-ut&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  font-style: italic; font-family:'courier new';font-size:13px;"&gt;(12 projets au total)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Ou alors une astuce sous Unix : &lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;créer des répertoires vides « avc-commons-all-noci », « avc-commons-all-umldep », etc. puis taper la commande suivante :&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;for i in `ls`; do svn co http://svn.avcompris.com/$i/trunk $i; done&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Pour construire tous les projets avec Maven en ligne de commande, se placer dans le répertoire « avc-commons-all-noci », et taper la commande : &lt;span class="Apple-style-span"  style=" ;font-size:13px;"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;mvn install&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Pour installer les sources dans son IDE&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour Eclipse, une fois que tous les projets Maven ont été récupérés en local, se placer dans « avc-commons-all-noci », et taper la commande : &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mvn eclipse:eclipse&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cela crée les fichiers &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;.project&lt;/span&gt;&lt;/span&gt; et &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;.classpath&lt;/span&gt;&lt;/span&gt; attendus par Eclipse.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On peut ensuite importer les projets dans Eclipse.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour IDEA : File, Open Project..., et ouvrir avc-commons-all-noci/pom.xml.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Pour lancer l'outil depuis Eclipse&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La classe de tests JUnit &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;WorkspaceInsiemeUmlTest&lt;/span&gt;&lt;/span&gt; dans le projet &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;avc-commons-all-umldep&lt;/span&gt;&lt;/span&gt; fait justement un test de scan, concaténation et génération d'UML. Il suffit donc de lancer le test JUnit, que ce soit depuis son IDE ou en ligne de commande. Exemple : &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mvn test&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Une fois le test lancé on peut récupérer le fichier « all-poms.uml » dans le répertoire « target », et c'est le même que ci-dessus.&lt;/div&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/28966088-8889343746797989730?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8889343746797989730/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8889343746797989730' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8889343746797989730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8889343746797989730'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/developpement-visualisation-de.html' title='Développement : visualisation de dépendances Maven'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kKYRIZmegcw/SYK0W8JuZFI/AAAAAAAAAJc/nlkrQmcVN_c/s72-c/poa.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-4725023921310950705</id><published>2009-01-30T00:27:00.004+01:00</published><updated>2009-02-02T22:41:10.810+01:00</updated><title type='text'>Développement : packaging de l'outil de visualisation de dépendances Maven</title><content type='html'>&lt;div&gt;Voici que quelqu'un qui lit mon blog me demande l'outil qui produit un diagramme UML correspondant aux dépendances entre mes projets Maven... Voir mon post ici : &lt;a href="http://jefute.blogspot.com/2009/01/dveloppement-visualiser-les-dpendances.html"&gt;Visualiser les dépendances entre projets Maven&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;OK, certes c'est à sa propre demande et à ses risques et périls, et il est par ailleurs simple d'envoyer le JAR par e-mail à cette personne. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mais alors &lt;span class="Apple-style-span" style="font-style: italic;"&gt;quid &lt;/span&gt;de :&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;la capitalisation ? C'est-à-dire, cette démarche d'envoyer le JAR, comment la répéter à moindre coût si on me refait plus tard la demande ?&lt;/li&gt;&lt;li&gt;la documentation ? Je n'ai pas tellement envie de passer du temps là-dessus.&lt;/li&gt;&lt;li&gt;le support ?&lt;/li&gt;&lt;li&gt;... la capitalisation du support : il y aura des bugs, des questions, auxquelles je répondrai volontiers, mais comment capitaliser là-dessus ?&lt;/li&gt;&lt;li&gt;... l'accès aux entrailles de l'outil : le mieux serait de donner accès aux sources.&lt;/li&gt;&lt;li&gt;la licence sur l'outil et son utilisation ? - voire sur ses sources.&lt;/li&gt;&lt;/ol&gt;Donc, cher &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;fred&lt;/span&gt; que je ne connais pas &lt;span class="Apple-style-span" style="font-family: 'courier new'; "&gt;;-)&lt;/span&gt; je propose que nous fassions simple :&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;pour le JAR, je le rends publiquement disponible sur mon serveur Nexus. Le téléchargement se fait donc par en utilisant comme repository Maven :  &lt;a href="http://ref.avcompris.com/nexus/content/repositories/public-releases/"&gt;http://ref.avcompris.com/nexus/content/repositories/public-releases/&lt;/a&gt; Ou directement pour le JAR en question : &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://ref.avcompris.com/nexus/content/groups/public/com/avcompris/commons/avc-commons-all-umldep/0.1.1/avc-commons-all-umldep-0.1.1-jar-with-dependencies.jar"&gt;JAR with dependencies&lt;/a&gt;&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;pour les sources sous Subversion, je les mets ici, accessibles en lecture seule par HTTP sans authentification : &lt;a href="http://svn.avcompris.com/"&gt;http://svn.avcompris.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;pour la documentation, eh bien je vais faire un article dans ce blog pour expliquer succinctement comment faire fonctionner l'outil. &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 102, 0); "&gt;Prochainement.&lt;/span&gt;&lt;/span&gt; Le reste proviendra des réponses aux questions.&lt;/li&gt;&lt;li&gt;pour le support, donc, envoyer questions/réponses dans le blog ou par e-mail.&lt;/li&gt;&lt;li&gt;pour la licence : &lt;/li&gt;&lt;li&gt;... utilisation et modification qui imposent de respecter et de mentionner le nom de l'auteur David Andrianavalontsalama, ou encore David Andriana an nom d'usage&lt;/li&gt;&lt;li&gt;... application de la licence open source BSD, dont une version en anglais est ici : &lt;a href="http://www.opensource.org/licenses/bsd-license.php"&gt;The BSD License&lt;/a&gt;&lt;span class="Apple-style-span" style="color: rgb(73, 73, 73); font-family: Helvetica; font-size: 20px; line-height: 20px; "&gt; &lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Georgia; font-size: 16px; line-height: normal; "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: rgb(73, 73, 73); font-family: Helvetica; font-size: 20px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Georgia; font-size: 16px; line-height: normal; "&gt;... utilisation et modification libres sans restriction à part celles qui précèdent.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: rgb(73, 73, 73); font-family: Helvetica; font-size: 20px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Georgia; font-size: 16px; line-height: normal; "&gt;logiciel et sources mis à disposition sans aucune garantie de quoi que ce soit et attention ce logiciel peut partir en vrille et vous êtes responsable de ce qui arrive, à vous ou à d'autres, à partir du moment où vous l'utilisez.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Je ne vais pas recopier tout de suite la licence dans les fichiers sources. Manque de temps, tout ça.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Déjà qu'il me faut faire les deux trois choses qui suivent...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Plus de quatre heures après (eh oui !), voici ce que ça m'a coûté :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;créer sur mon serveur Nexus un &lt;span class="Apple-style-span" style="font-style: italic;"&gt;repository&lt;/span&gt; ouvert au public pour les 12 projets Maven concernés,&lt;/li&gt;&lt;li&gt;changer la configuration &amp;lt;distributionManagement&amp;gt; des projets Maven pour qu'ils se déploient désormais dans ce &lt;span class="Apple-style-span" style="font-style: italic;"&gt;repository&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;passer deux projets de mon &lt;span class="Apple-style-span" style="font-style: italic;"&gt;repository&lt;/span&gt; Subversion privé vers mon &lt;span class="Apple-style-span" style="font-style: italic;"&gt;repository&lt;/span&gt; public,&lt;/li&gt;&lt;li&gt;rajouter une ligne de Copyright dans les fichiers,&lt;/li&gt;&lt;li&gt;faire une petite revue de javadoc rapide « histoire de »,&lt;/li&gt;&lt;li&gt;passer quelques tests maison orientés qualité,&lt;/li&gt;&lt;li&gt;reconstruire les projets,&lt;/li&gt;&lt;li&gt;lancer les &lt;span class="Apple-style-span" style="font-style: italic;"&gt;releases&lt;/span&gt; Maven,&lt;/li&gt;&lt;li&gt;rédiger et publier des articles de blog.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Je suis à quelques jours d'une mise en production d'un projet qui dépend de ceux-là : il était donc de toute façon nécessaire que je fasse tout ce qui concerne les &lt;span class="Apple-style-span" style="font-style: italic; "&gt;releases &lt;/span&gt;Maven. On va dire que le fait de rédiger de la doc est un effet collatéral positif &lt;span class="Apple-style-span" style="font-family: 'courier new'; "&gt;;-)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voilà fred, tu pourras me faire ton retour...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-4725023921310950705?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/4725023921310950705/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=4725023921310950705' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4725023921310950705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4725023921310950705'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/developpement-packaging-de-loutil-de.html' title='Développement : packaging de l&apos;outil de visualisation de dépendances Maven'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-265685895246437885</id><published>2009-01-27T08:50:00.012+01:00</published><updated>2009-01-30T01:53:28.802+01:00</updated><title type='text'>Développement : à propos d'injection de dépendances (DI)</title><content type='html'>&lt;div style="text-align: left;"&gt;Petit topo sur la &lt;span class="Apple-style-span" style="font-style: italic;"&gt;DI &lt;/span&gt;telle que je la pratique en Java en ce moment.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Généralités&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;L'injection de dépendances (en anglais &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Dependency Injection&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;DI&lt;/span&gt;) est aujourd'hui un principe fondamental de la programmation. Elle évite par exemple de devoir instancier directement des implémentations. Du code comme celui-ci :&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class PeopleManagerImpl implements PeopleManager {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    private final EmailSender sender = new EmailSenderImpl();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    private final Collection&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;person&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; people = &lt;/span&gt;&lt;/person&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;person&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        new ArrayList&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;person&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;();&lt;/span&gt;&lt;/person&gt;&lt;/person&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    public void welcomeNewPerson(String name, String email) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        people.add(new Person(name, email));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        sender.sendMail(mail, "Welcome " + name);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/SX7ImoFTRhI/AAAAAAAAAI0/wKM00jbRjs0/s1600-h/di1.PNG"&gt;&lt;img src="http://2.bp.blogspot.com/_kKYRIZmegcw/SX7ImoFTRhI/AAAAAAAAAI0/wKM00jbRjs0/s320/di1.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5295890777754519058" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 129px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Devient par exemple avec l'injection de dépendances :&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import static com.google.common.base.Preconditions.checkNotNull;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import com.google.inject.Inject;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class PeopleManagerImpl implements PeopleManager {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    private final EmailSender sender;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    private final Collection&amp;lt;Person&amp;gt;&lt;person&gt; people = &lt;/person&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;person&gt;        new ArrayList&amp;lt;Person&amp;gt;&lt;person&gt;();&lt;/person&gt;&lt;/person&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Inject&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    public PeopleManagerImpl(EmailSender sender) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        this.sender = checkNotNull(sender);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    public void welcomeNewPerson(String name, String email) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        people.add(new Person(name, email));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        sender.sendMail(mail, "Welcome " + name);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SX7JVdkLQPI/AAAAAAAAAI8/wgu-jyWh4lI/s1600-h/di2.PNG"&gt;&lt;img src="http://1.bp.blogspot.com/_kKYRIZmegcw/SX7JVdkLQPI/AAAAAAAAAI8/wgu-jyWh4lI/s320/di2.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5295891582385078514" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 197px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;L'injection de dépendances est particulièrement utile pour les tests, ainsi que pour la programmation orientée aspects (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;AOP&lt;/span&gt;).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comparée à d'autres types d'injection de champs, par exemple &lt;span class="Apple-style-span" style="font-style: italic; "&gt;via &lt;/span&gt;des accesseurs ou en manipulant directement les champs, je trouve que l'injection par le constructeur est la plus fiable. Vu qu'on peut tout manipuler au &lt;span class="Apple-style-span" style="font-style: italic;"&gt;runtime &lt;/span&gt;en Java cela relève au final d'une sorte de convention, mais cette convention est bien relayée par les compilateurs et les IDEs.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comme on l'aura compris au vu du code précédent, c'est l'approche suivie par &lt;a href="http://code.google.com/p/google-guice/wiki/Motivation"&gt;Google Guice&lt;/a&gt;, bibliothèque que j'apprécie particulièrement. Parmi ses avantages :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;son API est typée (Java 5),&lt;/li&gt;&lt;li&gt;la responsabilité de la bibliothèque est bel et bien limitée à l'injection de dépendances,&lt;/li&gt;&lt;li&gt;la configuration se fait en Java, donc avec les avantages du typage, et non en XML ou autre.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Pour le code ci-dessus, voici un exemple de code client qui récupère une instance et l'utilise :&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;PeopleManager peopleManager =    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    injector.getInstance(PeopleManager.class);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;peopleManager.welcomeNewPerson(&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    "Jean Dupont", "jean.dupont@xxx.com");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Injecter une ressource avec cycle de vie&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Parlons par exemple de l'injection d'une connexion SQL, qu'il s'agit de fermer à la fin de son utilisation. Je sais je sais, je suis vieux jeu en gérant mon mapping O/R moi-même.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le code suivant accède à la base de données :&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class PeopleManagerImpl implements PeopleManager {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="  ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    private final Collection&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;person&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; people = &lt;/span&gt;&lt;/person&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="  ;font-family:'courier new';"&gt;&lt;person&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        new ArrayList&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;person&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;();&lt;/span&gt;&lt;/person&gt;&lt;/person&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    public void persistPeople() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        try {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="  ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;            Connection cxn = ...; // ?&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;            try {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                PreparedStatement pstmt = &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                  cxn.prepareStatement("INSERT INTO people"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                    + " (name, email) VALUES (?, ?)");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                try {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                    for (Person p : people) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                        pstmt.setString(1, p.getName());&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                        pstmt.setString(2, p.getName());&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                        pstmt.executeUpdate();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                } finally {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                    pstmt.close();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;            } finally {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;                cxn.close();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;            }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        } catch (SQLException e) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;            throw new UncheckedBusinessException(e);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="  ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SX7KoJYzpAI/AAAAAAAAAJE/LTycDpE6Tq8/s1600-h/d3.PNG"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SX7KoJYzpAI/AAAAAAAAAJE/LTycDpE6Tq8/s320/d3.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5295893002897826818" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 221px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Noter la transformation des &lt;span class="Apple-style-span"  style="font-size:small;"&gt;SQLException &lt;/span&gt;en exceptions métier (qui soient &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Runtime&lt;/span&gt;, histoire d'alléger le code).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La question est : comment récupérer l'objet &lt;span class="Apple-style-span"  style="font-size:small;"&gt;Connection&lt;/span&gt; ? On ne peut pas l'injecter par le constructeur de &lt;span class="Apple-style-span"  style="font-size:small;"&gt;PeopleManagerImpl&lt;/span&gt;, car chaque appel de méthode qui accède à la base de données se termine par un &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;cxn.close()&lt;/span&gt;&lt;/span&gt; donc au bout du deuxième appel sur le même objet &lt;span class="Apple-style-span"  style="font-size:small;"&gt;cxn&lt;/span&gt; ça plantera.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La solution est évidemment d'injecter une &lt;span class="Apple-style-span" style="font-style: italic;"&gt;factory&lt;/span&gt;, en l'occurrence un &lt;span class="Apple-style-span" style="font-style: italic;"&gt;provider&lt;/span&gt; qui crée une nouvelle  connexion à chaque fois :&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;public class PeopleManagerImpl implements PeopleManager {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    private final ConnectionProvider cxnProvider;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    ...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    @Inject&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    public PeopleManagerImpl(ConnectionProvider cxnProvider) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;        this.cxnProvider = checkNotNull(cxnProvider);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    public void persistPeople() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;        try {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            Connection cxn = cxnProvider.createConnection();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            try {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;                PreparedStatement pstmt = &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;                    cxn.prepareStatement(...);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;                ...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            } finally {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;                cxn.close();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;        } catch (SQLException e) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            throw new UncheckedBusinessException(e);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="  ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SX7L3WwyaQI/AAAAAAAAAJM/sd5bY6B9GJc/s1600-h/d4.PNG"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SX7L3WwyaQI/AAAAAAAAAJM/sd5bY6B9GJc/s320/d4.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5295894363697735938" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 174px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Personnellement je trouve super pénible cette obligation d'appeler soi-même la méthode&lt;span class="Apple-style-span"  style="font-size:small;"&gt; create()&lt;/span&gt; sur la &lt;span class="Apple-style-span" style="font-style: italic;"&gt;factory&lt;/span&gt; et de faire le &lt;span class="Apple-style-span"  style="font-size:small;"&gt;close() &lt;/span&gt;final (eh oui, il n'y a pas de destructeurs en Java), sans compter la transformation de l'exception. 9 lignes de code pour rien au total.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Injection de paramètres dans les méthodes&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J'ai donc trouvé une autre solution : changer la signature des méthodes dans l'implémentation,  pour y injecter des objets dont le cycle de vie est géré par le &lt;span class="Apple-style-span" style="font-style: italic;"&gt;container&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cela implique de casser le lien entre interface et implémentation. Même si je déclare ce lien à la compilation par une interface paramétrée - que j'ai appelée &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;BeanImpl&lt;/span&gt;&lt;/span&gt; -, la cohérence entre les méthodes de l'implémentation et celles de l'interface ne sont vérifiées qu'au &lt;span class="Apple-style-span" style="font-style: italic;"&gt;runtime&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Les méthodes à appeler dans le cycle de vie sont également annotées. Quant à la classe d'implémentation elle-même, elle continue d'être gérée par Guice, ce qui permet d'utiliser &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;@Inject&lt;/span&gt;&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;public class PeopleManagerImpl &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;implements BeanImpl&amp;lt;PeopleManager&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;peoplemanager&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/peoplemanager&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     final ConnectionProvider cxnProvider;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     @Inject&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     public PeopleManagerImpl(ConnectionProvider cxnProvider) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;          this.cxnProvider = checkNotNull(cxnProvider);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     public void persistPeople(@BeanInject Connection cxn) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     throws SQLException {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            PreparedStatement pstmt = cxn.prepareStatement(...);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            try {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;                ...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            } finally {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;                pstmt.close();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;            }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     @InitBeanInject&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     private Connection createConnection() &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     throws SQLException {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;          return cxnProvider.createConnection();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     @ReleaseBeanInject&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     private void releaseConnection(Connection cxn) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     throws SQLException {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;          cxn.close();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Je gagne ainsi en lisibilité dans mes méthodes (sauf quand le code est affiché dans Blogger, apparemment...), donc en productivité de développement.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/SX8X5J_BHII/AAAAAAAAAJU/8_0gdvmI47Q/s1600-h/d5.PNG"&gt;&lt;img src="http://3.bp.blogspot.com/_kKYRIZmegcw/SX8X5J_BHII/AAAAAAAAAJU/8_0gdvmI47Q/s320/d5.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5295977957511208066" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 222px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Noter que le code du client est &lt;span class="Apple-style-span" style="font-style: italic;"&gt;toujours &lt;/span&gt;le suivant :&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;PeopleManager peopleManager = &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    injector.getInstance(PeopleManager.class);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;À la compilation, il n'y a plus qu'un lien lâche entre l'interface et l'implémentation-cœur. Une autre contrainte de cette méthode est que l'interface du Bean &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;PeopleManager&lt;/span&gt;&lt;/span&gt; ne peut pas avoir deux méthodes de même nom avec des signatures différentes. En fait cela était déjà une convention dans mes programmes, pour des raisons de portabilité vers d'autres langages comme PHP.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En tout cas j'aime bien.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&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/28966088-265685895246437885?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/265685895246437885/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=265685895246437885' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/265685895246437885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/265685895246437885'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/developpement-propos-dinjection-de.html' title='Développement : à propos d&apos;injection de dépendances (DI)'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kKYRIZmegcw/SX7ImoFTRhI/AAAAAAAAAI0/wKM00jbRjs0/s72-c/di1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-284569161930331173</id><published>2009-01-26T15:33:00.005+01:00</published><updated>2009-01-26T16:10:27.838+01:00</updated><title type='text'>Développement : visualiser les dépendances entre projets Maven</title><content type='html'>&lt;div style="text-align: left;"&gt;Mon projet global est constitué d'une bonne centaine de projets Maven. Cette structure est assez pratique pour l'intégration continue (voir &lt;a href="http://ci.avcompris.com/continuum/"&gt;le tableau de bord Continuum 1.0.3&lt;/a&gt;) et pour vérifier que tout fonctionne sur différentes plates-formes, pratique pour les &lt;span class="Apple-style-span" style="font-style: italic;"&gt;releases&lt;/span&gt;, pratique pour construire morceau par morceau et intégrer de même. Par exemple on peut segmenter la difficulté d'intégrer des &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Web Services&lt;/span&gt; en isolant les responsabilités suivantes dans des projets différents :&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;logique applicative,&lt;/li&gt;&lt;li&gt;liens avec la base de données,&lt;/li&gt;&lt;li&gt;interopérabilité,&lt;/li&gt;&lt;li&gt;distribution,&lt;/li&gt;&lt;li&gt;sécurité.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Cependant au fil des développements les projets évoluent, et les liens entre eux. On se retrouve avec une sorte de plat de spaghettis dont il nous manque une vue d'ensemble. Pour cela je n'ai pas trouvé mon bonheur dans des outils comme le &lt;a href="http://maven.apache.org/plugins/maven-dependency-plugin/"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Maven Dependency Plugin&lt;/span&gt;&lt;/a&gt;, plugin certes très utile, mais cantonné à des analyses projet par projet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;À défaut d'avoir trouvé un outil qui réponde exactement à mon besoin, j'en ai développé un moi-même. Ce n'est certes pas mon &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;métier &lt;/span&gt;de faire ça, je ne vais donc pas aller plus loin pour cet outil que la bête réponse, non intrusive, au besoin initial.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est un programme qui scanne les fichiers pom.xml de mon espace de travail, et produit un diagramme UML.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/SX3ONQld15I/AAAAAAAAAIk/s0_vV0k-eyw/s1600-h/all-poms.png"&gt;&lt;img src="http://2.bp.blogspot.com/_kKYRIZmegcw/SX3ONQld15I/AAAAAAAAAIk/s0_vV0k-eyw/s320/all-poms.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5295615464043304850" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 123px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Dépendances entre mes projets Maven.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour les détails :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;le programme est en Java (le scan et la concaténation étaient au départ une tâche Ant),&lt;/li&gt;&lt;li&gt;le diagramme UML final est un fichier XML au format du logiciel &lt;a href="http://staruml.sourceforge.net/"&gt;StarUML,&lt;/a&gt;&lt;/li&gt;&lt;li&gt;le temps d'exécution (scan, analyse, génération) est de 10 secondes pour 113 projets.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Quelques différences de principe avec le &lt;span class="Apple-style-span" style="font-style: italic; "&gt;Maven Dependency Plugin&lt;/span&gt; :&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;je m'appuie sur les sources des fichiers POM, et non sur les artifacts déjà installés dans le &lt;span class="Apple-style-span" style="font-style: italic;"&gt;repository&lt;/span&gt; local - je peux donc aussi analyser les POMs de projets qui sont en erreur,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;l'analyse porte sur l'espace de travail complet,&lt;/li&gt;&lt;li&gt;le rendu est graphique.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Je traduis ainsi en UML les liens entre projets Maven :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;parent&gt;&amp;lt;parent&amp;gt; : héritage UML&lt;/parent&gt;&lt;/li&gt;&lt;li&gt;&lt;dependency&gt;&amp;lt;dependency&amp;gt; : association UML&lt;/dependency&gt;&lt;/li&gt;&lt;li&gt;&lt;module&gt;&amp;lt;module&amp;gt; : agrégation UML&lt;/module&gt;&lt;/li&gt;&lt;li&gt;&lt;plugin&gt;&amp;lt;plugin&amp;gt; : dépendance UML&lt;/plugin&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Certes, le diagramme UML produit par défaut est illisible parce que surchargé. L'intérêt d'avoir un résultat lisible par un logiciel tiers, StarUML en l'occurrence, est qu'on peut ensuite y déplacer à la main des éléments et en supprimer, afin d'en extraire des sous-diagrammes orientés par domaine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voici par exemple un extrait du diagramme ci-dessus, limité à une vingtaine de projets, pour une couche applicative sur laquelle je bosse en ce moment.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SX3P1-gq63I/AAAAAAAAAIs/BDIeLQlpRK8/s1600-h/webadmin-cli.png"&gt;&lt;img src="http://1.bp.blogspot.com/_kKYRIZmegcw/SX3P1-gq63I/AAAAAAAAAIs/BDIeLQlpRK8/s320/webadmin-cli.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5295617263077616498" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 290px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ce genre de petite documentation extraite des fichiers sources est bien utile. La cohérence est importante entre la documentation et le développement.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour en revenir à Maven, cette vue permet entre autres de visualiser les dépendances inutiles (quand A dépend de B qui depend de C, A ne devrait pas avoir à déclarer qu'il dépend de C), ou les incohérences entre les versions des bibliothèques.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si quelqu'un connaît des outils plus évolués pour faire la même chose je suis preneur...&lt;/div&gt;&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/28966088-284569161930331173?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/284569161930331173/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=284569161930331173' title='9 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/284569161930331173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/284569161930331173'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/dveloppement-visualiser-les-dpendances.html' title='Développement : visualiser les dépendances entre projets Maven'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kKYRIZmegcw/SX3ONQld15I/AAAAAAAAAIk/s0_vV0k-eyw/s72-c/all-poms.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-9143474192335942133</id><published>2009-01-24T07:07:00.010+01:00</published><updated>2009-01-24T07:47:39.200+01:00</updated><title type='text'>Développement : Custom Maven Repository</title><content type='html'>Depuis 2007 j'utilise Artifactory comme repository Maven pour :&lt;div&gt;&lt;ol&gt;&lt;li&gt;déployer les bibliothèques tierces que je ne trouve pas dans des &lt;span class="Apple-style-span" style="font-style: italic; "&gt;public Maven repositories&lt;/span&gt; tels que ceux d'Apache ou de Codehaus. De telles bibliothèques sont par exemple jvyaml, ou encore les outils Sun pour JMX, pourtant importants dès qu'on tape un peu dans du Lo4J 1.2.15 par exemple,&lt;/li&gt;&lt;li&gt;pouvoir déployer mes propres artifacts, notamment ceux en version &lt;span class="Apple-style-span" style="font-style: italic;"&gt;release&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Artifactory a de nombreux avantages. Il est facile à installer, et son interface HTML est pratique d'utilisation. Il est depuis peu en 2.0.0, version stable et dont l'IHM s'appuie sur Ajax à relativement bon escient. Je compare cela avec des versions d'Archiva livrée avec Maestro, par exemple.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Artifactory fonctionne très bien, et les déploiements Maven s'y font sans souci.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En revanche, il souffre d'un gros défaut : il fait systématiquement &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;planter&lt;/span&gt;&lt;/span&gt; la Dedibox sur laquelle je l'ai installée.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est une Dedibox V1, avec un processeur C7 à 2 GHz et 1 Go de RAM, sous Debian. Les services que j'y ai installés sont :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;BIND9&lt;/li&gt;&lt;li&gt;Apache 2.2 + PHP + MySQL&lt;/li&gt;&lt;li&gt;Subversion&lt;/li&gt;&lt;li&gt;Java 5 + Tomcat 5.5.20 pour : Confluence, Jira, Artifactory&lt;/li&gt;&lt;li&gt;scripts de backups&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Tomcat5.5 démarre avec les options de mémoire suivantes : &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;-Xmx512m -XX:MaxPermSize=256m&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Concernant les fuites mémoires connues dans Jira je suis bien en Tomcat 5.5.15+ et j'ai bien &lt;span class="Apple-style-span" style="white-space: pre; "&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;-Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=&lt;/span&gt;&lt;/span&gt;&lt;span class="code-keyword"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rien n'y fait, même en désactivant le service de backup (une tâche répétitive pilotée par un serveur J2EE, bonjour l'architecture) et en limitant les &lt;span class="Apple-style-span" style="font-style: italic;"&gt;repositories&lt;/span&gt; à indexer, Artifactory me fait tomber la machine. Certes pas tout à fait à heure fixe, mais en moyenne cinq fois par semaine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Plantage de machine, ce qui signifie notamment que le wiki et Subversion sont inaccessibles. De plus un redémarrage matériel est nécessaire, ce qui n'est jamais très bon.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sachant d'autre part que &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;-Xmx256m&lt;/span&gt;&lt;/span&gt; suffit à faire tourner Confluence et Jira sans Artifactory.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alors pour le remplacer je vais regarder Nexus. Une comparaison trouvée par ici : &lt;a href="http://blogs.sonatype.com/people/2009/01/contrasting-nexus-and-artifactory/"&gt;Comparing Nexus and Artifactory&lt;/a&gt; évoque bien les différences de philosophie, notamment dans le stockage des artifacts. Faire une sauvegarde d'un &lt;span class="Apple-style-span" style="font-style: italic;"&gt;repository &lt;/span&gt;Nexus (un répertoire, tâche pilotable par un bête script) semble bien plus simple que dans le cas d'Artifactory (une base de données JackRabbit, et surtout tâche à piloter par le serveur J2EE... N'importe quoi).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si cela pouvait m'éviter d'avoir à dédier une machine puissante à ma solution de &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Custom Maven Repository...&lt;/span&gt;&lt;/div&gt;&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/28966088-9143474192335942133?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/9143474192335942133/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=9143474192335942133' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/9143474192335942133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/9143474192335942133'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/dveloppement-custom-maven-repository.html' title='Développement : Custom Maven Repository'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-2392403957234853924</id><published>2009-01-12T18:01:00.002+01:00</published><updated>2009-01-12T18:03:09.770+01:00</updated><title type='text'>Rachat du nom de domaine Les Fûts</title><content type='html'>Eh oui, c'est bien parti.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je ne mets pour l'instant qu'une page web d'attente : &lt;a href="http://www.lesfuts.com/"&gt;Les Fûts&lt;/a&gt;, histoire de commencer le référencement.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-2392403957234853924?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/2392403957234853924/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=2392403957234853924' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/2392403957234853924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/2392403957234853924'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/rachat-du-nom-de-domaine-les-fts.html' title='Rachat du nom de domaine Les Fûts'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3080350737757670131</id><published>2009-01-07T21:12:00.006+01:00</published><updated>2009-01-07T21:30:31.674+01:00</updated><title type='text'>Site de l'association graine d'école : pas Les Fûts</title><content type='html'>&lt;div style="text-align: left;"&gt;En 2006 l'idée des Fûts a germé. Des associations locales étaient vivement intéressées par le projet, comme Graine d'école, ou Le jardin sauvage. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Et puis par manque de moyens au vu des ambitions, et aussi par un enchaînement de priorités autres, le projet les Fûts a capoté.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour Graine d'école j'avais fait une page HTML, qui se voulait provisoire, hébergée chez Free. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mais, depuis, l'association a fait son propre site avec Joomla! et a un nom de domaine en .com : &lt;a href="http://graine-ecole.com/"&gt;http://graine-ecole.com/&lt;/a&gt;. Il est alimenté avec des nouvelles, des photos, il a un calendrier, des documents partagés... Bref il est vivant est c'est chouette. Du coup je viens de mettre une redirection « 301 », c'est-à-dire permanente,  de l'adresse &lt;a href="http://grainedecole.free.fr/"&gt;http://grainedecole.free.fr/&lt;/a&gt; vers le site.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/SWUQ1HYjFGI/AAAAAAAAAIE/tcd6F7qPmRI/s1600-h/graine-new.png"&gt;&lt;img src="http://3.bp.blogspot.com/_kKYRIZmegcw/SWUQ1HYjFGI/AAAAAAAAAIE/tcd6F7qPmRI/s320/graine-new.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5288651842117637218" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 279px; height: 320px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mon ancienne page se voit sur http://grainedecole.free.fr/old/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/SWUP1SfSdYI/AAAAAAAAAH0/XQozSWaREmw/s1600-h/graine-old.png"&gt;&lt;img src="http://3.bp.blogspot.com/_kKYRIZmegcw/SWUP1SfSdYI/AAAAAAAAAH0/XQozSWaREmw/s320/graine-old.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5288650745587070338" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 258px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3080350737757670131?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3080350737757670131/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3080350737757670131' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3080350737757670131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3080350737757670131'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/site-de-lassociation-graine-dcole-pas.html' title='Site de l&apos;association graine d&apos;école : pas Les Fûts'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kKYRIZmegcw/SWUQ1HYjFGI/AAAAAAAAAIE/tcd6F7qPmRI/s72-c/graine-new.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-30205015273605489</id><published>2009-01-07T20:43:00.002+01:00</published><updated>2009-01-07T21:00:59.989+01:00</updated><title type='text'>Association + groupe de rock</title><content type='html'>Jean-Charles, mon voisin, vient de passer pour qu'on discute d'un projet de site web d'association. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ben oui, je déterre occasionnellement le projet Les Fûts, sans velléité cette fois d'en faire lui-même un projet associatif.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Il me donne donc les prolégomènes de son attente, et là j'apprends qu'il y a deux sites à prévoir car deux entités conjointes : d'une part un groupe de rock, qui donne des concerts, vend des CDs, etc. dont les membres ont d'ores et déjà des espaces MySpace mais qui aimeraient éventuellement les restructurer, et d'autre part une association engagée dans des enjeux environnementaux, sorte de &lt;span class="Apple-style-span" style="font-style: italic;"&gt;spin-off &lt;/span&gt;du groupe, association dont Jean-Charles est le président.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ma première réaction par rapport à cette dissociation était de voir le site du groupe (site à petit budget) comme un site standard, avec tous les écueils de ce genre de projets : site vitrine, pas vraiment&lt;span class="Apple-style-span" style="font-style: italic;"&gt; business driven&lt;/span&gt;, structure archi-classique, évolutions coûteuses, et solution parfois moins conviviale et dynamique qu'une solution gratuite.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mais une autre direction pourrait être de définir les attentes en termes d'utilisations-types (on a commencé à parler de scénarios) et surtout de retours sur investissement, que ce ROI soit pécunier ou non (il y a la notoriété, les tremplins...). Il faudrait confronter les idées et surtout peut-être les retours d'expériences d'avoir jusqu'ici utilisé des espaces MySpace. De plus je me demande dans quelle mesure le groupe de rock évoqué ne pourrait pas être vu comme un partenaire artistique de l'association, ce qui à la limite inverserait la donne. Bref, voir quelles sont les attentes qui passent en avant.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J'en saurai davantage quand je rencontrerai les membres du groupe, à la fin de cette semaine.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-30205015273605489?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/30205015273605489/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=30205015273605489' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/30205015273605489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/30205015273605489'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/association-groupe-de-rock.html' title='Association + groupe de rock'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-647104353329689940</id><published>2009-01-06T09:47:00.005+01:00</published><updated>2009-01-06T11:00:06.297+01:00</updated><title type='text'>Restriction des accès SSH extérieurs par IP</title><content type='html'>&lt;div style="text-align: left;"&gt;Ce qui suit est générique, mais, pour savoir, la plate-forme considérée est une Debian.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Quand on met en place un serveur SSH sur un serveur pour en permettre l'administration à distance, on renseigne avec la ligne suivante le fichier &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;/etc/ssh/sshd_config&lt;/span&gt; afin d'interdire à &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;root &lt;/span&gt;de se connecter, car ce serait un beau trou de sécurité :&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;blockquote&gt;PermitRootLogin no&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Il est également possible et facile de restreindre les accès par adresses IP pour le service SSH. Pour cela, renseigner dans le fichier &lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;/etc/hosts.allow&lt;/span&gt; :&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sshd:&lt;/span&gt; &lt;span class="Apple-style-span" style="font-style: italic;"&gt;adresses IP séparées par des espaces&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Exemple :&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;blockquote&gt;sshd: 10.11.22.33 10.44.55.66 10.77.88.99&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Et dans le fichier &lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;/etc/hosts.deny&lt;/span&gt;, renseigner :&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;blockquote&gt;sshd: ALL&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;On peut sécuriser l'accès à d'autres services que SSH, donner des classes d'adresses IP, etc.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En revanche, ne pas chercher la complication en mettant des noms d'hôtes, mais se cantonner aux adresses IP.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est une sécurisation fiable et simple. L'étape suivante est la configuration &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;iptables&lt;/span&gt;, dont je ne traiterai pas ici.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le schéma ci-dessous donne un exemple d'une personne derrière une « box » ADSL avec une &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;adresse&lt;/span&gt; &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;IP fixe &lt;/span&gt;(sinon, au premier changement d'IP, il ne sera plus possible d'administrer les serveurs !) et en mode routeur, qui administre deux serveurs, et souhaite interdire les accès SSH depuis d'autres machines.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SWMpVvsF-GI/AAAAAAAAAHs/ijYL5ro-8oc/s1600-h/ssh-ip.png"&gt;&lt;img src="http://1.bp.blogspot.com/_kKYRIZmegcw/SWMpVvsF-GI/AAAAAAAAAHs/ijYL5ro-8oc/s320/ssh-ip.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5288115841018493026" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 149px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sur les deux serveurs il configurera un fichier &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;hosts.deny&lt;/span&gt; avec &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sshd: ALL&lt;/span&gt;, et des fichiers &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;hosts.allow&lt;/span&gt; :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;sur la machine Serveur 1 : &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sshd: 10.11.22.33&lt;/span&gt;&lt;/li&gt;&lt;li&gt;sur la machine Serveur 2 : &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sshd: 10.11.22.33 10.44.55.66&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour la petite histoire, tous les services n'ont pas un accès qui puisse être sécurisé par hosts.deny. En effet, il faut que le service concerné soit compatible avec les tcpwrappers, ce dont on peut s'assurer par la commande suivante par exemple pour sshd :&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;blockquote&gt;$ ldd `which sshd` | grep libwrap&lt;br /&gt;$ ldd /usr/sbin/sshd | grep libwrap &lt;span class="Apple-style-span"  style=" ;font-family:Georgia;"&gt;(plus précis, si &lt;/span&gt;which&lt;span class="Apple-style-span"  style=" ;font-family:Georgia;"&gt; ne va pas)&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Cette astuce fonctionne à peu près pour tous les services. Ainsi, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;ldd /usr/sbin/apache2 | grep libwrap&lt;/span&gt; montre que Apache 2 n'est pas compatible avec les tcpwrappers, et ne pourra donc pas voir son accès sécurisé par &lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;hosts.deny&lt;span class="Apple-style-span"  style=" ;font-family:Georgia;"&gt; / &lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;hosts.allow&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour avoir un aperçu de qui cherche à se connecter en &lt;span class="Apple-style-span" style="font-style: italic;"&gt;brute force &lt;/span&gt;par SSH sur vos machines, faites un tour dans &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;/var/log/auth.log&lt;/span&gt;. Sans la sécurisation par IP on trouve en général des tentatives de connexions &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;root&lt;/span&gt;, et toute une liste de tentatives avec des identifiants bidon (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;admin&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;test&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;virus&lt;/span&gt;...). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour compter ces tentatives :&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;blockquote&gt;# grep Failed /var/log/auth.log | wc -l&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Sur mes serveurs le nombre de tentatives varie selon les hébergeurs entre une par heure et 150 par heure.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-647104353329689940?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/647104353329689940/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=647104353329689940' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/647104353329689940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/647104353329689940'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/restriction-des-accs-ssh-extrieurs-par.html' title='Restriction des accès SSH extérieurs par IP'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kKYRIZmegcw/SWMpVvsF-GI/AAAAAAAAAHs/ijYL5ro-8oc/s72-c/ssh-ip.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5489958641060915565</id><published>2009-01-04T16:33:00.006+01:00</published><updated>2009-01-04T16:51:47.660+01:00</updated><title type='text'>Millennium Falcon ™ en LEGO ®</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/SWDYmCDMBGI/AAAAAAAAAHc/Mu5ctqgxzw0/s1600-h/P1040033.JPG"&gt;&lt;/a&gt;Mon fils Emmanuel vient de finir la construction de son &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Millennium Falcon&lt;/span&gt; ™ en LEGO ®. Pour le bonhomme de sept ans qu'il est cela représente plusieurs jours de concentration. Je l'ai aidé à organiser son temps pour ne pas tourner chèvre, et à gérer les erreurs de montage, inévitables sur un tel chantier.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/SWDXY7xM2rI/AAAAAAAAAHM/pMBGuOqbMYU/s1600-h/P1040043.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_kKYRIZmegcw/SWDXY7xM2rI/AAAAAAAAAHM/pMBGuOqbMYU/s320/P1040043.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5287462785893849778" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le principal écueil de ces énormes jeux est bel et bien la tension nerveuse, qui va souvent crescendo et s'étale sur une longue durée. Ils sont en général conseillés aux plus grands.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SWDX5On1RMI/AAAAAAAAAHU/UgsBpEDrFFg/s1600-h/P1040040.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SWDX5On1RMI/AAAAAAAAAHU/UgsBpEDrFFg/s320/P1040040.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5287463340710642882" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/SWDXY7xM2rI/AAAAAAAAAHM/pMBGuOqbMYU/s1600-h/P1040043.JPG"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Et voilà, « les copains pourront être épatés » comme il dit. On verra bien ce qu'ils en pensent ; nul doute que les plus simples Kapla continueront aussi de les intéresser. Car pour le Faucon Millénium, il semble approprié de le conserver tel quel... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/SWDYmCDMBGI/AAAAAAAAAHc/Mu5ctqgxzw0/s1600-h/P1040033.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_kKYRIZmegcw/SWDYmCDMBGI/AAAAAAAAAHc/Mu5ctqgxzw0/s320/P1040033.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5287464110429832290" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SWDX5On1RMI/AAAAAAAAAHU/UgsBpEDrFFg/s1600-h/P1040040.JPG"&gt;&lt;/a&gt;&lt;/div&gt;&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/28966088-5489958641060915565?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5489958641060915565/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5489958641060915565' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5489958641060915565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5489958641060915565'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2009/01/millennium-falcon-en-lego.html' title='Millennium Falcon ™ en LEGO ®'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kKYRIZmegcw/SWDXY7xM2rI/AAAAAAAAAHM/pMBGuOqbMYU/s72-c/P1040043.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-900854889785738610</id><published>2008-12-27T21:30:00.001+01:00</published><updated>2008-12-27T21:30:55.216+01:00</updated><title type='text'>Pont HTTP pour FTP vers Dedibackup</title><content type='html'>&lt;div style="text-align: left;"&gt;Souci de backup : je ne peux plus récupérer mes archives stockées sur un Dedibackup directement par FTP pour en avoir une copie locale, et accessoirement les valider. Sur ce dernier sujet voir l'article &lt;a href="http://jefute.blogspot.com/2008/04/validation-de-backups.html"&gt;Validation de backups&lt;/a&gt; daté d'avril 2008.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Les serveurs Dedibackup sont des espaces FTP accessibles depuis les serveurs dédiés Dedibox, et jusqu'à il y a quelques mois ils étaient également accessibles en &lt;span class="Apple-style-span" style="font-style: italic;"&gt;download&lt;/span&gt; par l'extérieur. Il suffisait de sécuriser ça en n'acceptant que certaines IP appelantes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J'utilisais donc ce système pour avoir une machine locale « bkp » qui allait chercher régulièrement ce que déposaient tout aussi régulièrement sur mon espace Dedibackup deux Dedibox « ref1 » et « ref2 ».&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SVPS6BWH99I/AAAAAAAAAGk/QIqxugKp4fs/s1600-h/http-ftp2.png"&gt;&lt;img src="http://1.bp.blogspot.com/_kKYRIZmegcw/SVPS6BWH99I/AAAAAAAAAGk/QIqxugKp4fs/s320/http-ftp2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5283798682071201746" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 188px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pas de bol, donc, Dedibox a coupé l'accès extérieur :&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SVPTF2yfTSI/AAAAAAAAAGs/qw32Z42DFhE/s1600-h/http-ftp3.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); text-decoration: underline;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); text-decoration: underline;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SVPUIdCuvbI/AAAAAAAAAG8/MMhPlmhSiKg/s1600-h/http-ftp3.png"&gt;&lt;img src="http://1.bp.blogspot.com/_kKYRIZmegcw/SVPUIdCuvbI/AAAAAAAAAG8/MMhPlmhSiKg/s320/http-ftp3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5283800029535845810" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 186px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comment résoudre ça au plus vite ? J'ai fait un service web &lt;span class="Apple-style-span" style="font-style: italic;"&gt;ad hoc &lt;/span&gt;qui délègue ensuite au FTP,  pour « contourner » le problème comme on le voit :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SVPXVi-oVRI/AAAAAAAAAHE/KFmjOtrbUDo/s1600-h/http-ftp5.png"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SVPXVi-oVRI/AAAAAAAAAHE/KFmjOtrbUDo/s320/http-ftp5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5283803553002444050" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 229px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le gros du boulot a consisté à bétonner le fonctionnement du client FTP embarqué dans la webapp J2EE, elle-même bien bridée (une seule exécution à la fois, etc.). Les choix d'architecture n'étant pas vraiment conformes à la norme et donc n'apportant aucune garantie, « bétonner » signifie ici développer des tests d'intégration sur des chaînes un peu trapues. Au total avant d'être déployé, le système a été validé sur 3 environnements différents, dont un d'intégration continue.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le tout a été conçu en une journée (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;elapse&lt;/span&gt;) et développé en une journée (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;load&lt;/span&gt;). Le développement a été concentré (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;focus&lt;/span&gt;), donc en tout on a un &lt;span class="Apple-style-span" style="font-style: italic;"&gt;elapse &lt;/span&gt;de deux jours, et c'est tant mieux puisqu'après c'étaient les fêtes. Comme les backups sont un point crucial de la chaîne du SI, et sont en même temps totalement éloignés du métier, il était important de se sortir de cette charge le plus vite possible. Il ne reste qu'à mener des tests de performances et avoir des chiffres pour le futur suivi des évolutions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je dégage de cette histoire deux enseignements :&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;c'est justement parce que certaines choses importantes ne font pas partie à proprement parler du métier qu'il faut absolument s'en occuper sérieusement, éliminer toutes les frictions et perdre le moins de temps et d'argent possible sur elles.&lt;/li&gt;&lt;li&gt;une architecture technique pourrave est parfaitement acceptable (en fait je m'attends même à ce qu'elle tienne la durée) si par ailleurs les cas d'utilisation sont encadrés : en l'occurrence ceinture et bretelle par des tests en continu.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Le premier point incite au discernement quant à notre cœur de métier et pousse logiquement aux actions-force quand il y a besoin plutôt que d'accepter des demi-mesures qui laissent ouverts les problèmes périphériques. Pour atteindre le centre est nécessaire que la périphérie ne soit plus un problème &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;|-)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le deuxième point incite à un dilettantisme de bon aloi ; et en même temps qui sait rendre des comptes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Let it go.&lt;/span&gt;&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/28966088-900854889785738610?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/900854889785738610/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=900854889785738610' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/900854889785738610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/900854889785738610'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/12/pont-http-pour-ftp-vers-dedibackup.html' title='Pont HTTP pour FTP vers Dedibackup'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kKYRIZmegcw/SVPS6BWH99I/AAAAAAAAAGk/QIqxugKp4fs/s72-c/http-ftp2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3747967141459487678</id><published>2008-12-27T20:59:00.006+01:00</published><updated>2008-12-27T21:27:21.698+01:00</updated><title type='text'>Déclaration d'une DataSource dans Tomcat 5.5</title><content type='html'>&lt;div&gt;Testé sous Windows XP et Debian, avec MySQL et PostgreSQL.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La webapp a les lignes suivantes dans WEB-INF/web.xml :   &lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&amp;lt;resource-ref&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&amp;lt;res-ref-name&amp;gt;jdbc/janitorDB&amp;lt;/res-ref-name&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&amp;lt;res-type&amp;gt;javax.sql.DataSource&amp;lt;/res-type&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&amp;lt;res-auth&amp;gt;Container&amp;lt;/res-auth&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&amp;lt;/resource-ref&amp;gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;Et dans META-INF/context.xml (important) :&lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&amp;lt;Context&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;path="/avpoc-webapp-datasource"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;reloadable="true"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;antiJARLocking="true"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;antiResourceLocking="true"&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&amp;lt;/Context&amp;gt;  &lt;/div&gt;&lt;/pre&gt;&lt;div&gt;La déclaration de la DataSource jdbc/myJndiName dans Tomcat 5.5 peut se faire de la façon suivante.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;D'abord dans conf/server.xml, pour par exemple MySQL : &lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&amp;lt;Resource  &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;name="jdbc/myJndiName"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;type="javax.sql.DataSource"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;password="myPassword"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;driverClassName="com.mysql.jdbc.Driver"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;maxIdle="2"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;maxWait="5000"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;username="myUsername"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;url="jdbc:mysql://localhost:3306/myDbName?autoReconnect=true"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;maxActive="4"/&amp;gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;Pour PostgreSQL ça donne quelque chose comme ça :&lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&amp;lt;Resource  &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;name="jdbc/myJndiName"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;auth="Container"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;type="javax.sql.DataSource"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;driverClassName="org.postgresql.Driver"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;url="jdbc:postgresql://127.0.0.1:5432/myDatabaseName"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;username="myUsername" &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;password="myPassword"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;maxActive="20" &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;maxIdle="10" &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;maxWait="-1"/&amp;gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;Ensuite dans conf/context.xml :&lt;/div&gt;&lt;pre&gt;&lt;div&gt;        &amp;lt;ResourceLink&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;global="jdbc/myJndiName"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;name="jdbc/myJndiName"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;type="javax.sql.DataSource"/&amp;gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;On peut également mettre directement dans conf/context.xml la configuration de la &amp;lt;Resource&amp;gt; mais c'est moins propre.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En tout cas si on ne met rien du tout dans  conf/context.xml on obtient : &lt;/div&gt;&lt;pre style="white-space: nowrap; overflow-x: scroll;"&gt;&lt;div&gt;org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'&lt;/div&gt;&lt;div&gt;        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)&lt;/div&gt;&lt;div&gt;        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)&lt;/div&gt;&lt;div&gt;        at com.avcompris.avpoc.webapp.PocDataSourceServlet.executePoc(PocDataSourceServlet.java:86)&lt;/div&gt;&lt;div&gt;        at com.avcompris.avpoc.webapp.PocDataSourceServlet.service(PocDataSourceServlet.java:42)&lt;/div&gt;&lt;div&gt;        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)&lt;/div&gt;&lt;div&gt;        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)&lt;/div&gt;&lt;div&gt;        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;/div&gt;&lt;div&gt;        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)&lt;/div&gt;&lt;div&gt;        atA org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)&lt;/div&gt;&lt;div&gt;        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)&lt;/div&gt;&lt;div&gt;        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)&lt;/div&gt;&lt;div&gt;        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)&lt;/div&gt;&lt;div&gt;        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)&lt;/div&gt;&lt;div&gt;        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)&lt;/div&gt;&lt;div&gt;        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)&lt;/div&gt;&lt;div&gt;        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)&lt;/div&gt;&lt;div&gt;        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)&lt;/div&gt;&lt;div&gt;        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)&lt;/div&gt;&lt;div&gt;        at java.lang.Thread.run(Thread.java:595)&lt;/div&gt;&lt;div&gt;Caused by: java.sql.SQLException: No suitable driver&lt;/div&gt;&lt;div&gt;        at java.sql.DriverManager.getDriver(DriverManager.java:243)&lt;/div&gt;&lt;div&gt;        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)&lt;/div&gt;&lt;div&gt;        ... 18 more&lt;/div&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3747967141459487678?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3747967141459487678/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3747967141459487678' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3747967141459487678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3747967141459487678'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/12/dclaration-dune-datasource-dans-tomcat.html' title='Déclaration d&apos;une DataSource dans Tomcat 5.5'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-953089532098820748</id><published>2008-12-25T20:26:00.001+01:00</published><updated>2008-12-25T20:26:38.166+01:00</updated><title type='text'>Joyeux Noël</title><content type='html'>J'adore cette fête &lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-953089532098820748?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/953089532098820748/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=953089532098820748' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/953089532098820748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/953089532098820748'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/12/joyeux-nol.html' title='Joyeux Noël'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8608178019386098839</id><published>2008-12-22T08:23:00.003+01:00</published><updated>2008-12-22T08:42:14.753+01:00</updated><title type='text'>Wanted: Code reviewers</title><content type='html'>Je suis à la recherche de personnes qui pourraient regarder avec un œil critique du code Java que j'écris, et me faire des remarques.&lt;br /&gt;&lt;br /&gt;Code libre d'accès (&lt;a href="http://svn.avcompris.com/"&gt;http://svn.avcompris.com/&lt;/a&gt;), liberté de bloguer le résultat des revues, échanges par messagerie instantanée ou e-mail.&lt;br /&gt;&lt;br /&gt;La critique est attendue à tous les niveaux : &lt;span style="font-style: italic;"&gt;licensing&lt;/span&gt;, architecture, choix techniques, cohérence fonctionnelle, cohérence technique, conception, algorithmique, bonnes pratiques, outillage, conventions et le reste.&lt;br /&gt;&lt;br /&gt;C'est une activité non rémunérée : je ne sais pas qui des deux parties a le plus à y gagner... &lt;span style="font-family:courier new;"&gt;:-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et en échange... ben faites vos propositions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8608178019386098839?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8608178019386098839/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8608178019386098839' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8608178019386098839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8608178019386098839'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/12/wanted-code-reviewers.html' title='Wanted: Code reviewers'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5446946296484587371</id><published>2008-12-17T00:53:00.008+01:00</published><updated>2008-12-17T20:33:34.050+01:00</updated><title type='text'>Pour se remettre au LOGO</title><content type='html'>&lt;div style="text-align: left;"&gt;Histoire de permettre à de très jeunots de s'initier à la programmation, j'ai implémenté un interpréteur des commandes basiques du LOGO par ici : &lt;a href="http://www.half-serious.com/logo/"&gt;http://www.half-serious.com/logo/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SUhCZyYCwbI/AAAAAAAAAGM/iKzazwrmLyA/s1600-h/logo1.png"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SUhCZyYCwbI/AAAAAAAAAGM/iKzazwrmLyA/s320/logo1.png" alt="" id="BLOGGER_PHOTO_ID_5280543573878686130" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 212px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Le langage &lt;a href="http://en.wikipedia.org/wiki/Logo_%28programming_language%29"&gt;LOGO&lt;/a&gt; permet en gros de faire des dessins à l'aide d'une tortue qui sait tracer des traits et pivoter sur elle-même.&lt;br /&gt;&lt;br /&gt;Les commandes reconnues dans mon implémentation sont :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;FORWARD xxx, ou FD xxx : avancer la tortue de xxx points&lt;/li&gt;&lt;li&gt;BACK xxx, ou BK xxx : reculer la tortue de xxx points&lt;/li&gt;&lt;li&gt;RIGHT xxx, ou RT xxx : pivoter la tortue d'un angle xxx à droite&lt;br /&gt;&lt;/li&gt;&lt;li&gt;LEFT xxx, ou LT xxx : pivoter la tortue d'un angle xxx à gauche&lt;/li&gt;&lt;li&gt;PENUP, ou PU : lever le crayon&lt;/li&gt;&lt;li&gt;PENDOWN, ou PD : rebaisser le crayon&lt;/li&gt;&lt;li&gt;HIDETURTLE, ou HT : cacher la tortue&lt;/li&gt;&lt;li&gt;SHOWTURTLE, ou ST : montrer la tortue&lt;/li&gt;&lt;li&gt;REPEAT xxx [ ... ] : répète xxx fois les commandes entre crochets&lt;/li&gt;&lt;/ul&gt;Voilà. Pas de procédures, pas de variables, pas de calculs. Du bon basique pour débuter.&lt;br /&gt;&lt;br /&gt;L'exemple ci-dessous dessine un carré : &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;FORWARD 100 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;RIGHT 90&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;FORWARD 100&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;RIGHT 90&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;FORWARD 100&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;RIGHT 90&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;FORWARD 100&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SUhC__g2gOI/AAAAAAAAAGU/GJv5Giwr57I/s1600-h/logo2.png"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SUhC__g2gOI/AAAAAAAAAGU/GJv5Giwr57I/s320/logo2.png" alt="" id="BLOGGER_PHOTO_ID_5280544230240321762" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 212px;" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cet exemple peut aussi s'écrire FD 100 RT 90 FD 100 RT 90 FD 100 RT 90 FD 100, et un dessin équivalent est REPEAT 4 [FD 100 RT 90].&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quant à l'exemple ci-dessous, il dessine une espèce de rosace :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;HIDETURTLE &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;REPEAT 100 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;[&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  FD 300 RT 45&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  FD 50 RT 125&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SUhE9qzvqqI/AAAAAAAAAGc/cLl9PRvtVsI/s1600-h/logo3.png"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SUhE9qzvqqI/AAAAAAAAAGc/cLl9PRvtVsI/s320/logo3.png" alt="" id="BLOGGER_PHOTO_ID_5280546389345938082" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 212px;" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&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/28966088-5446946296484587371?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5446946296484587371/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5446946296484587371' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5446946296484587371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5446946296484587371'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/12/pour-se-remettre-au-logo.html' title='Pour se remettre au LOGO'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kKYRIZmegcw/SUhCZyYCwbI/AAAAAAAAAGM/iKzazwrmLyA/s72-c/logo1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-2697861354934762035</id><published>2008-12-13T20:00:00.006+01:00</published><updated>2008-12-13T20:27:05.919+01:00</updated><title type='text'>Surveillance de la santé des machines</title><content type='html'>&lt;div style="text-align: left;"&gt;Soit un parc de machines et services hétérogène : machines locales, distantes, serveurs web, Subversion, divers sites, divers hébergeurs, divers noms de domaines et &lt;span class="Apple-style-span" style="font-style: italic;"&gt;registrars&lt;/span&gt;, bref, tout et n'importe quoi.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comment assurer une surveillance de tout ceci ?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J'avais bien quelques outils de surveillance web, mais ils n'analysent pas forcément tous les critères, ni ne versionnent les règles de surveillance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J'ai bien quelques tests JUnit, mais ils dépendent d'un environnement d'exécution (Continuum) assez lourd, qui lui-même peut être soumis à plantage, en particulier parce qu'un serveur J2EE demande beaucoup de ressources.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je me décide donc à rationaliser tout cela :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;une seule technologie d'écriture des tests : Java, sous la forme de tests JUnit.&lt;/li&gt;&lt;li&gt;une version minimale du service de surveillance, qui assure le découplage des traitements et de l'affichage : &lt;ul&gt;&lt;li&gt;un &lt;span class="Apple-style-span" style="font-style: italic; "&gt;daemon &lt;/span&gt;Java le plus léger possible pour l'exécution des tests, &lt;br /&gt;&lt;/li&gt;&lt;li&gt;une application PHP pour afficher les résultats de façon simplifiée,&lt;/li&gt;&lt;li&gt;une communication entre Java et PHP qui passe par une base de données.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;et une réplication de ce système sur deux machines différentes, au cas où l'une d'entre elles tomberait en panne.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Le système avec Continuum est conservé sur une (grosse) machine, en lui faisant en prime exécuter les mêmes tests JUnit que la version &lt;span class="Apple-style-span" style="font-style: italic;"&gt;daemon&lt;/span&gt; Java + PHP.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SUQKIRO0ePI/AAAAAAAAAGE/N28RogfW76g/s1600-h/diag-junit-daemon.png"&gt;&lt;img src="http://4.bp.blogspot.com/_kKYRIZmegcw/SUQKIRO0ePI/AAAAAAAAAGE/N28RogfW76g/s320/diag-junit-daemon.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5279355800365857010" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 238px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Reste à faire en sorte qu'un e-mail soit envoyé automatiquement quand un service est détecté comme tombé. Possibilité de configuration en Java : déclarer la gravité du test dans une annotation de même niveau que @Test.&lt;/div&gt;&lt;div&gt;Et évidemment tester par le système lui-même les fonctionnalités d'envoi et de réception d'e-mail.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quelques états de santé à agréger :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;bonne santé de toutes les applications web déployées,&lt;/li&gt;&lt;li&gt;Twitter,&lt;/li&gt;&lt;li&gt;envoi et réception d'e-mails,&lt;/li&gt;&lt;li&gt;âge du ou des derniers backups inférieur à 24 h,&lt;/li&gt;&lt;li&gt;espaces disques libres supérieurs à 50 %...&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Des idées ?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Merci d'avance.&lt;/div&gt;&lt;/div&gt;&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/28966088-2697861354934762035?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/2697861354934762035/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=2697861354934762035' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/2697861354934762035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/2697861354934762035'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/12/surveillance-de-la-sant-des-machines.html' title='Surveillance de la santé des machines'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kKYRIZmegcw/SUQKIRO0ePI/AAAAAAAAAGE/N28RogfW76g/s72-c/diag-junit-daemon.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3514569887057454121</id><published>2008-12-13T17:24:00.003+01:00</published><updated>2008-12-13T17:28:49.294+01:00</updated><title type='text'>Projet Les Fûts</title><content type='html'>Mmh, alors que les associations peuvent relativement facilement et à moindre coût se doter elles-mêmes d'un site web (voir par exemple le site officiel de Graine d'école : &lt;a href="http://graine-ecole.com/"&gt;http://graine-ecole.com/&lt;/a&gt; réalisé avec Joomla!), voilà-t-y pas qu'on me relance pour la réalisation de sites associatifs.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si l'aventure doit être retentée j'abandonnerai la structure associative, sans beaucoup de valeur ajoutée. Et j'augmenterai un peu les tarifs, pour être plus proche du marché.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En l'occurrence il s'agirait d'une association qui a également un produit à présenter sur le web, à dissocier éventuellement du site associatif lui-même.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&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/28966088-3514569887057454121?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3514569887057454121/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3514569887057454121' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3514569887057454121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3514569887057454121'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/12/projet-les-fts.html' title='Projet Les Fûts'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3699117372011753823</id><published>2008-10-23T20:47:00.004+02:00</published><updated>2008-12-02T19:48:27.331+01:00</updated><title type='text'>Chez Maître Eolas : Journal des magistrats en colère</title><content type='html'>Maître Eolas ouvre son espace à la parole de magistrats. &lt;a href="http://maitre-eolas.fr/"&gt;http://maitre-eolas.fr/&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Plus de 50 articles, en majorité des témoignages.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;À tous, bienvenue chez les blogs, levier bénéfique pour la parole vraie.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3699117372011753823?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3699117372011753823/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3699117372011753823' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3699117372011753823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3699117372011753823'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/10/chez-matre-eoals-journal-des-magistrats.html' title='Chez Maître Eolas : Journal des magistrats en colère'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5360775896976287385</id><published>2008-09-09T19:29:00.004+02:00</published><updated>2008-09-09T19:39:55.038+02:00</updated><title type='text'>Intégration continue au boulot</title><content type='html'>Après un mois et demi dans mes nouvelles fonctions, je viens de faire une présentation de l'intégration continue à mon équipe. Cela vient au moment où nous avons déjà des premiers résultats : intégration &lt;span style="font-style: italic;"&gt;via&lt;/span&gt; Continuum dans WebSphere d'une douzaine de modules Maven sur une centaine, réalisée par un petit groupe, même pas dédié à cent pour cent.&lt;br /&gt;&lt;br /&gt;En plus des questions sur le sujet &lt;span style="font-style: italic;"&gt;stricto sensu&lt;/span&gt;, la présentation a été suivie d'un débat ouvert où toute l'équipe a eu l'occasion de participer et de s'exprimer, sur le thème « existant, problèmes, améliorations ». Le côté expression libre est primordial quand on a de gros enjeux de développement informatique. Je pense réitérer l'expérience, que j'ai jugée extrêmement positive, quand le moment viendra.&lt;br /&gt;&lt;br /&gt;Bref, une bonne fin de journée. J'ai cadré la réunion sur deux heures, ni trop ni trop peu. On verra par la suite si les-filles-zet-les-gars alimentent de leurs réflexions le wiki commun.&lt;br /&gt;&lt;br /&gt;Mais je suis bien confiant &lt;span style="font-family:courier new;"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-5360775896976287385?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5360775896976287385/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5360775896976287385' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5360775896976287385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5360775896976287385'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/09/intgration-continue-au-boulot.html' title='Intégration continue au boulot'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3151120130108433565</id><published>2008-09-06T07:08:00.002+02:00</published><updated>2008-09-06T07:46:44.704+02:00</updated><title type='text'>Un peu de code pour la détente</title><content type='html'>Ben oui, histoire de se faire un peu plaisir, quelques heures de programmation bien installé dans son fauteuil. Dans le temps on lisait des polars.&lt;br /&gt;&lt;br /&gt;C'est drôle, ça se ressemble aujourd'hui, dans l'aspect quête de la vérité.&lt;br /&gt;&lt;br /&gt;Dans un polar on vous donne assez souvent le contexte et les événements à élucider, le plus généralement un meurtre ou plusieurs. S'ensuit une histoire, qui ne raconte pas l'histoire elle-même (sinon autant lire de la mythologie), mais qui est un déroulé de la recherche de la « solution ». Solution au sens de résolution plus que de preuve. Le plaisir réside dans ce déroulé, et évidemment dans le succès final qui est moins la compréhension (penser au &lt;span style="font-style: italic;"&gt;Big Sleep&lt;/span&gt;, incompréhensible, de son propre aveu pour son auteur même) que l'élucidation, la mise à la lumière de ce qui était caché ou obscur.&lt;br /&gt;&lt;br /&gt;Dans le développement informatique aujourd'hui, avec des méthodologies comme TDD (&lt;span style="font-style: italic;"&gt;Test Driven Development&lt;/span&gt;),  on a un peu le même aspect, et évidemment le même plaisir. Je m'explique. En TDD, on commence par écrire les tests, c'est-à-dire que le programme n'existe pas encore, mais on commence déjà à le faire planter. Ensuite, le travail consiste à réaliser le programme pour faire passer les tests. Et quand on a fini, il arrive selon la complexité ou le déroulé qu'on ne comprenne plus rien (c'est rare) à ce qu'on a programmé, mais dans tous les cas au moins les tests passent. On peut alors livrer le programme, et c'est bien cette élucidation qu'on recherchait.&lt;br /&gt;&lt;br /&gt;Je parlais au début de quête de la vérité, dans le sens de sa nature, évidemment, pas de son contenu.&lt;br /&gt;&lt;br /&gt;Bien qu'en poursuivant l'analogie avec le polar, écrire du code aujourd'hui apprenne aussi des choses sur le monde : quelques clics sur Wikipédia pour cerner un cas fonctionnel, et on découvre de nouveaux espaces à connaître, de façon comparable à ce qui se passe lors d'une digression dans un roman policier, Série Noire ou pas. La seule chose qu'on n'ait pas est l'aspect historique : les informations du web sont d'une part récentes (moins de 20 ans), et sans cesse actualisées. Un exemplaire de la Série Blême a, lui, une présence qui vient tout droit d'une autre époque.&lt;br /&gt;&lt;br /&gt;Toujours dans l'analogie entre code développé en TDD et polar, on pourrait dire que dans le code les tests s'accumulent de la même façon qu'on peut toujours dans un livre revenir aux pages précédentes sans qu'elles aient changé (non, le « Livre de sable » que décrit Borgès n'est &lt;span style="font-style: italic;"&gt;pas &lt;/span&gt;un polar &lt;span style="font-family: courier new;"&gt;;-)&lt;/span&gt;). Ce n'était pas du tout le cas avec d'autres façons de programmer, où au contraire les tests se faisaient de façon globale à la fin, sur l'objet complet. C'était de l'ingénierie classique, pas du développement.&lt;br /&gt;&lt;br /&gt;Alors, un peu de code pour la détente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3151120130108433565?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3151120130108433565/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3151120130108433565' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3151120130108433565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3151120130108433565'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/09/un-peu-de-code-pour-la-dtente.html' title='Un peu de code pour la détente'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-4484333546855507846</id><published>2008-07-27T07:22:00.011+02:00</published><updated>2008-12-09T04:40:52.058+01:00</updated><title type='text'>Nouvelles de Limoges</title><content type='html'>Pour mon fils Emmanuel je suis venu m'installer à Limoges.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SIwMcg0c44I/AAAAAAAAAD0/Iost874J4b0/s1600-h/limoges1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/SIwMcg0c44I/AAAAAAAAAD0/Iost874J4b0/s320/limoges1.jpg" alt="" id="BLOGGER_PHOTO_ID_5227566951456105346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;C'est à la mi-mai 2008, c'est-à-dire il y a deux  mois et demi, que j'ai quitté Montech dans le Tarn-et-Garonne pour la Haute-Vienne. C'était une période idéale pour s'installer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SIwMwpvj2yI/AAAAAAAAAD8/-9aTa10YKRM/s1600-h/havilandco-limoges.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/SIwMwpvj2yI/AAAAAAAAAD8/-9aTa10YKRM/s320/havilandco-limoges.jpg" alt="" id="BLOGGER_PHOTO_ID_5227567297448893218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;J'habite maintenant pas très loin du centre de Limoges, près de la gare.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SIwNFggUiYI/AAAAAAAAAEE/WKP1VUT0XoA/s1600-h/limoges-max.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/SIwNFggUiYI/AAAAAAAAAEE/WKP1VUT0XoA/s320/limoges-max.JPG" alt="" id="BLOGGER_PHOTO_ID_5227567655746308482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;J'ai trouvé une petite maison avec vue et jardin, et des voisins fort sympathiques. La voisine au Nord élève des poules (c'est génial, non ? En pleine ville en plus), le voisin de l'Ouest a un magnifique potager (même remarque), au Sud ce sont des étudiants, et du côté Est on me tient parfois en rentrant du boulot des discussions très intéressantes.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SIwPZO6tciI/AAAAAAAAAEM/Iuvv1oytNAI/s1600-h/1568_Pieter_Brueghel_the_Elder_Peasant_Wedding-wL400-SMALL.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/SIwPZO6tciI/AAAAAAAAAEM/Iuvv1oytNAI/s320/1568_Pieter_Brueghel_the_Elder_Peasant_Wedding-wL400-SMALL.jpg" alt="" id="BLOGGER_PHOTO_ID_5227570193645793826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La dernière fête organisée pour Emmanuel et ses copains a été très réussie aussi.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SIwVG_ZuWnI/AAAAAAAAAEc/8Bnzy0dKeFE/s1600-h/pingouins_013.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/SIwVG_ZuWnI/AAAAAAAAAEc/8Bnzy0dKeFE/s320/pingouins_013.jpg" alt="" id="BLOGGER_PHOTO_ID_5227576477313030770" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;(des pingouins qui se mettent à l'eau et s'éclaboussent, quel rapport ? me direz-vous)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Côté boulot sur Limoges dans ma spécialité, j'ai commencé une mission au CNASEA ce mercredi. J'y ai déjà rencontré des personnes attachantes.&lt;br /&gt;&lt;br /&gt;Petite fête du côté des étudiants vendredi soir, et hier samedi j'ai eu l'occasion à Blond au festival Estivol, de faire de la montgolfière au-dessus du pays.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/SIwQlVbCCQI/AAAAAAAAAEU/gJpsglywrXY/s1600-h/bapteme-montgolfieres.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/SIwQlVbCCQI/AAAAAAAAAEU/gJpsglywrXY/s320/bapteme-montgolfieres.jpg" alt="" id="BLOGGER_PHOTO_ID_5227571501062031618" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;(photo non contractuelle)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Tout ça commence bien.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-4484333546855507846?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/4484333546855507846/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=4484333546855507846' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4484333546855507846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4484333546855507846'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/07/nouvelles-de-limoges.html' title='Nouvelles de Limoges'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kKYRIZmegcw/SIwMcg0c44I/AAAAAAAAAD0/Iost874J4b0/s72-c/limoges1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5589870047822699264</id><published>2008-07-07T17:02:00.010+02:00</published><updated>2008-12-09T04:40:52.667+01:00</updated><title type='text'>"The F5 Factor"</title><content type='html'>Une tendance généralisée dans le développement informatique est l'utilisation d'environnements de développements (IDE, &lt;span style="font-style: italic;"&gt;Integrated Development Environment&lt;/span&gt;), comme Eclipse, dont je vous conseille par ailleurs la 3.4 « &lt;span style="font-style: italic;"&gt;Ganymede &lt;/span&gt;». Ces outils apportent par exemple la syntaxe colorée, la navigation entre fichiers, mais aussi l'aide à la saisie et la compilation à la volée, parmi des milliers d'autres fonctionnalités (je n'exagère pas).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/SHJWS7Moa-I/AAAAAAAAADs/lH4XJSWW0iw/s1600-h/process0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/SHJWS7Moa-I/AAAAAAAAADs/lH4XJSWW0iw/s320/process0.png" alt="" id="BLOGGER_PHOTO_ID_5220329801204132834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je pense qu'il faut distinguer entre ces fonctionnalités par leur type d'interaction avec l'utilisateur :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sans interaction : la coloration syntaxique, par exemple. La frappe suit son cours, et le résultat est formaté à l'écran.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;interaction au cours de la frappe : vérification de la syntaxe, aide à la saisie, compilation en tâche de fond... Ces assistants se déclenchent certes de façon asynchrone (ouf !), mais pompent quand même des ressources, aussi bien sur la machine que dans le cerveau de l'utilisateur (les fenêtres &lt;span style="font-style: italic;"&gt;pop up &lt;/span&gt;ne sont &lt;span style="font-weight: bold;"&gt;jamais &lt;/span&gt;neutres pour un cerveau humain &lt;span style="font-family:courier new;"&gt;;-)&lt;/span&gt;), ce qui au final freine le rythme naturel de la frappe... tout en accélérant par ailleurs la saisie des noms de classes, de méthodes, de variables. Avec une utilité à mesurer pour chacun, donc.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;interaction par décision de l'utilisateur : lancer l'exécution de tests ou d'une application par exemple. Cela se fait en général par un raccourci-clavier, plus rapide qu'un clic souris. Cette interaction ne perturbe pas le flot de développement : l'utilisateur déclenche de lui-même les événements.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Je ne parle pas des interactions de type &lt;span style="font-style: italic;"&gt;Wizard&lt;/span&gt;, où l'utilisateur suit une série de formulaires.&lt;br /&gt;&lt;br /&gt;Ajoutons un quatrième type, l'interaction par déclenchement en ligne de commande d'un script par l'utilisateur. En gros, je vais dans ma console, je tape ma commande (disons : mvn clean install), elle s'exécute, et je me rends le plus souvent dans une autre application pour voir le résultat (disons : un éditeur de texte, pour voir les logs).&lt;br /&gt;&lt;br /&gt;Cette dernière interaction est la plus primitive et naît de la nécessité (pas d'intégration continue sans scripts autonomes, par exemple), et pourtant c'est celle qui est la plus perturbatrice, car on navigue entre des contextes différents, avec leurs IHMs et leurs temps propres. Là où les IDEs font énormément gagner de temps, c'est bien sur la suppression des interactions en ligne de commande.&lt;br /&gt;&lt;br /&gt;Prenons par exemple un script qui fabrique et déploie une application web (je me place dans le cas où le serveur web n'est pas embarqué dans l'IDE, cas le plus courant pour moi). Le scénario classique est le suivant :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;IDE : finir de modifier le code&lt;/li&gt;&lt;li&gt;console : lancer le script en ligne de commande de fabrication et de déploiement&lt;br /&gt;&lt;/li&gt;&lt;li&gt;navigateur web : voir le résultat&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SHJQQfUfVaI/AAAAAAAAADM/uFhqTs8tkIU/s1600-h/process1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/SHJQQfUfVaI/AAAAAAAAADM/uFhqTs8tkIU/s400/process1.png" alt="" id="BLOGGER_PHOTO_ID_5220323162291393954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pour gagner en puissance, nous pouvons faire la chose suivante qui nous évite le passage par la console :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;IDE : finir de modifier le code&lt;/li&gt;&lt;li&gt;IDE : lancer le script externe par un raccourci clavier (voire obliger son lancement automatique après toute modification)&lt;/li&gt;&lt;li&gt;navigateur web : voir le résultat&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SHJQWeefCzI/AAAAAAAAADU/ygsRsPCsatw/s1600-h/process2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/SHJQWeefCzI/AAAAAAAAADU/ygsRsPCsatw/s400/process2.png" alt="" id="BLOGGER_PHOTO_ID_5220323265144097586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mais je pense que c'est quand même une perte cognitive : on demande à un contexte (l'IDE) de réaliser quelque chose, qui peut d'ailleurs mettre du temps, dont on verra le résultat dans un autre contexte (le navigateur). Cognitivement on est déjà dans le résultat (on sait ce qu'on demande au final : un résultat dans le navigateur), mais du point de vue de l'outillage on est encore dans la préparation (l'IDE).&lt;br /&gt;&lt;br /&gt;Pour moi la bonne séquence est la suivante :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;IDE : finir de modifier le code&lt;/li&gt;&lt;li&gt;navigateur web : rafraîchir la page en cours (touche F5), ce qui lance le script externe, puis affiche le résultat, sans changer de contexte&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SHJQH7fVgjI/AAAAAAAAADE/dr7SeM4iqRM/s1600-h/process3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/SHJQH7fVgjI/AAAAAAAAADE/dr7SeM4iqRM/s400/process3.png" alt="" id="BLOGGER_PHOTO_ID_5220323015234257458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;J'appelle ça le « facteur F5 » ("The F5 Factor" en anglais). Ce principe est orienté &lt;span style="font-weight: bold;"&gt;contexte de résultat&lt;/span&gt;, et non environnement de développement.&lt;br /&gt;&lt;br /&gt;Si possible, disposer de deux machines, une pour le code, une pour le navigateur : ainsi il ne s'agit &lt;span style="font-style: italic;"&gt;que&lt;/span&gt; d'appuyer sur F5 sur le clavier d'à côté. Pas d'autre manipulation du genre Alt-TAB. Aucun changement d'application, de perspective, de vue, de fenêtre, de &lt;span style="font-style: italic;"&gt;space&lt;/span&gt;... ni aucun &lt;span style="font-style: italic;"&gt;switch &lt;/span&gt;mécanique : on tourne simplement la tête.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/SHJSm7r7KfI/AAAAAAAAADc/62uygnhz3CI/s1600-h/process4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/SHJSm7r7KfI/AAAAAAAAADc/62uygnhz3CI/s400/process4.png" alt="" id="BLOGGER_PHOTO_ID_5220325746886257138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Dans ce modèle, le serveur web doit évidemment être sur la première machine, ou en tout cas avoir accès aux fichiers qui ont été modifiés.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;J'essaie de faire en sorte que mes outils de développement web, notamment mes outils de maquettage, mais aussi mes outils de validation, appliquent le « facteur F5 ». Cela pose de nombreuses questions d'intégration et de réactivité : sur la parallélisation des traitements, sur l'optimisation, sur la gestion des fichiers, etc. mais aussi sur le découpage des composants :  s'il faut dérouler ne serait-ce qu'une partie de scénario fonctionnel pour arriver sur la  page dont on veut valider le HTML, on n'est plus dans le « facteur F5 ». C'est dire s'il faut parfois  pour se donner les moyens réarchitecturer entièrement un projet, et notamment repenser les phases de maquettage.&lt;br /&gt;&lt;br /&gt;Ces outils sont évidemment couplés à des scripts autonomes (toujours pour l'intégration continue), mais les scripts encapsulent les outils, et non le contraire.&lt;br /&gt;&lt;br /&gt;Au final, un très grand confort de développement : modifier deux lignes de Java, et voir le résultat quasiment immédiatement dans le navigateur. On se croirait en PHP ?... En fait c'est encore mieux, car si toutes les pages du site sont testables en appliquant le « facteur F5 », le temps gagné est inestimable. Par ailleurs il s'agit là d'une méthodologie, et c'est donc transverse aux technologies.&lt;br /&gt;&lt;br /&gt;Pour mémoire, mon dernier outil en date qui applique le « facteur F5 » est un lanceur d'applications (Java) depuis une page web, qui en affiche ensuite les résultats à l'écran : résultats images, SVG, HTML ou texte. À utiliser en phase de maquettage, en appuyant sur... F5.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-5589870047822699264?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5589870047822699264/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5589870047822699264' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5589870047822699264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5589870047822699264'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/07/f5-factor.html' title='&quot;The F5 Factor&quot;'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kKYRIZmegcw/SHJWS7Moa-I/AAAAAAAAADs/lH4XJSWW0iw/s72-c/process0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8084918289867446529</id><published>2008-06-30T18:11:00.002+02:00</published><updated>2008-06-30T18:19:20.779+02:00</updated><title type='text'>Kazeii.com - Gérer, suivre, partager sa construction de maison</title><content type='html'>Fin 2007 et début 2008, je m’étais lancé avec un copain établi près de Toulouse, Jérémy Girard, dans l’aventure d’une &lt;span style="font-style: italic;"&gt;start-up&lt;/span&gt; web. Le thème : suivi de projets de construction de logements individuels et collectifs.&lt;br /&gt; &lt;br /&gt;Il s’agissait d’une plate-forme web classique, de blogging, d’albums photos, etc. au service des particuliers qui font construire leur maison, cela afin de leur permettre de montrer aux copains et à la famille l’avancement des travaux (les internautes qui font construire ouvrent souvent un blog pour cela), d’avoir une vision synthétique des différentes étapes, voire d’utiliser la plate-forme pour gérer ses postes comptables et faciliter ses échanges avec l’architecte ou le maître d’œuvre. Le fait d'avoir une plate-forme centralisée pour plusieurs blogs de constructions, permettait également de créer une communauté autour du sujet.&lt;br /&gt;&lt;br /&gt;L’idée est simple, et très bonne à mon avis. On avait pas mal dégrossi le concept, pondu un &lt;span style="font-style: italic;"&gt;Business Model&lt;/span&gt;, demandé leurs avis à plusieurs professionnels, sans compter évidemment les particuliers rencontrés, puis commencé le développement. Étant tous les deux développeurs Java, ça travaillait fort.&lt;br /&gt;&lt;br /&gt;Malheureusement, après un bout de chemin ensemble, il m’est apparu que l’équipe de Batilog.com (nom initial du projet) ne fonctionnait pas avec une vision commune. Proche, mais pas commune. Or dans un projet comme celui-là, l’énergie étant forcément présente, ce qui compte c’est la cohérence. Malgré les indéniables qualités humaines de part et d’autre, et le bon &lt;span style="font-style: italic;"&gt;feeling&lt;/span&gt;, j’ai donc pris la sage décision de sortir du projet en l’état. Sage décision à mon avis en terme d’entrepreneuriat. Jérémy a continué d’arrache-pied seul pour sortir une version publique (ne me demandez pas quelle aurait été ma position : vous m’avez vu sortir une version publique dans les mêmes délais ? &lt;span style="font-family: courier new;"&gt;;-)&lt;/span&gt; que voici : &lt;a href="http://www.kazeii.com/"&gt;Kazeii.com - Gérer, suivre, partager sa construction de maison&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La version a été rendue publique hier dimanche 29 juin 2008, et il y a déjà presque 100 inscrits !&lt;br /&gt;&lt;br /&gt;Je voudrais  chaleureusement féliciter Jérémy pour avoir lancé son site. Grand bravo, et le succès pour cette implémentation d’une très bonne idée ! Il n’y a qu’à lire certains commentaires pour voir que l’accueil est positif ; Jérémy a fait connaître son site dans divers forums francophones, notamment par ici : &lt;a href="http://www.bricozone.be/fr/construction/t-comment-assurer-un-bon-suivi-de-sa-construction-7816.html"&gt;Forum BricoZone - Sujet : Comment assurer un bon suivi de sa construction&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bonne route Jérémy &lt;span style="font-family: courier new;"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8084918289867446529?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8084918289867446529/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8084918289867446529' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8084918289867446529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8084918289867446529'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/06/kazeiicom-grer-suivre-partager-sa.html' title='Kazeii.com - Gérer, suivre, partager sa construction de maison'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-721878611054650294</id><published>2008-06-27T16:46:00.006+02:00</published><updated>2008-12-09T04:40:52.889+01:00</updated><title type='text'>La vérification à la compilation, c'est bien</title><content type='html'>Soit un modèle où l'on diffère, sous forme de commandes, des appels à passer à une certaine classe. Par exemple, dans le cas où l'implémentation finale de la classe est distante, on souhaite passer tous les appels dans une seule connexion réseau : on va donc trouver un moyen de « sérialiser » les intentions d'appels, en général sous forme de texte, on les enverra en lot, puis côté serveur la liste sera détricotée, les appels passés, et on retournera la liste des résultats (dans le cas où tout se passe bien).&lt;br /&gt;&lt;br /&gt;Pour illustrer le problème, disons que l'interface de la classe distante s'appelle « Toto », avec les méthodes « doSomething(int, int) » et « doSomethingElse(String) ».&lt;br /&gt;&lt;br /&gt;On faisait jusqu'ici un appel réseau pour chaque invocation :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/SGUCIbWhekI/AAAAAAAAACc/PgCOBExfxXY/s1600-h/diagrams.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/SGUCIbWhekI/AAAAAAAAACc/PgCOBExfxXY/s320/diagrams.png" alt="" id="BLOGGER_PHOTO_ID_5216578087183022658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Avec le code Java ci-dessous :&lt;br /&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;final Toto toto = &lt;&lt;span style="font-style: italic;"&gt;proxy&lt;/span&gt;&gt;; // &lt;span style="font-style: italic;"&gt;proxy&lt;/span&gt; pour appel distant&lt;br /&gt;&lt;br /&gt;toto.doSomething(2, 5); // 1er appel&lt;br /&gt;toto.doSomething(14, 8); // 2e appel&lt;br /&gt;toto.doSomethingElse("Fantastic!"); // 3e appel&lt;br /&gt;toto.doSomething(0, 1); // 4e appel&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;Après s'être aperçu qu'on pouvait gagner en performances, nous décidons que du point de vue du réseau il n'y aura qu'un appel, qui agrègera les invocations :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/SGUHPSUYsMI/AAAAAAAAACs/8Zq12joAyY4/s1600-h/diagrams2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/SGUHPSUYsMI/AAAAAAAAACs/8Zq12joAyY4/s320/diagrams2.png" alt="" id="BLOGGER_PHOTO_ID_5216583702575362242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Eh bien je ne sais pas pourquoi, mais pour faire ça certains pensent à écrire la chose suivante :&lt;br /&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;final Commands commands = new Commands(Toto.class);&lt;br /&gt;&lt;br /&gt;commands.storeCommand("doSomething", 2, 5); // 1er&lt;br /&gt;commands.storeCommand("doSomething", 14, 8); // 2e&lt;br /&gt;commands.storeCommand("doSomethingElse", "Fantastic!"); // 3e&lt;br /&gt;commands.storeCommand("doSomething", 0, 1); // 4e&lt;br /&gt;&lt;br /&gt;CommandUtils.executeCommands(&lt;&lt;span style="font-style: italic;"&gt;proxy&lt;/span&gt;&gt;, commands);&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;C'est tout à fait dommage, car on perd l'avantage de la vérification à la compilation : si on se trompe dans une chaîne de caractères qui contient un nom de méthode, ou dans le type des paramètres d'une méthode, on ne s'en apercevra qu'à l'exécution.&lt;br /&gt;&lt;br /&gt;En fait il faut s'arranger pour pouvoir coder ainsi :&lt;br /&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;final Toto toto = FutureUtils.newFuture(Toto.class);&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;toto.doSomething(2, 5); // 1er appel&lt;br /&gt;toto.doSomething(14, 8); // 2e appel&lt;br /&gt;toto.doSomethingElse("Fantastic!"); // 3e appel&lt;br /&gt;toto.doSomething(0, 1); // 4e appel&lt;br /&gt;&lt;br /&gt;FutureUtils.execute(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;&lt;span style="font-style: italic;"&gt;proxy&lt;/span&gt;&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;C'est-à-dire qu'il faut s'appuyer le plus possible sur ce qui compile... déjà.&lt;br /&gt;&lt;br /&gt;Un très bon modèle pour penser de cette façon, est &lt;a href="http://www.easymock.org/"&gt;EasyMock&lt;/a&gt; : ce &lt;span style="font-style: italic;"&gt;framework &lt;/span&gt;d'aide aux tests permet d'enregistrer les appels à contrôler par du code d'appel ! On a donc la vérification de la syntaxe à la compilation, puis évidemment la vérification de la séquence à l'exécution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-721878611054650294?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/721878611054650294/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=721878611054650294' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/721878611054650294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/721878611054650294'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/06/la-vrification-la-compilation-cest-bien.html' title='La vérification à la compilation, c&apos;est bien'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kKYRIZmegcw/SGUCIbWhekI/AAAAAAAAACc/PgCOBExfxXY/s72-c/diagrams.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-4673450919578927942</id><published>2008-06-23T19:36:00.002+02:00</published><updated>2008-06-23T19:42:00.029+02:00</updated><title type='text'>Message de maintenance</title><content type='html'>L'hébergeur Online a procédé ce week-end à un changement de plate-forme technique du site de ma société &lt;a href="http://www.avantage-compris.com/"&gt;Avantage Compris&lt;/a&gt;. Du coup plus rien ne fonctionnait. Pour seulement 5 simples pages, c'était un peu dommage.&lt;br /&gt;&lt;br /&gt;Ça y est, c'est rétabli.&lt;br /&gt;&lt;br /&gt;Pour les techniciens, attention à passer vos XSLT en UTF-8 : certaines configurations de Sablotron n'acceptent pas l'ISO-8859-1 dans les feuilles de styles (mais pour le XML en entrée, bien).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-4673450919578927942?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/4673450919578927942/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=4673450919578927942' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4673450919578927942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4673450919578927942'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/06/message-de-maintenance.html' title='Message de maintenance'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-861006051391213897</id><published>2008-06-13T19:48:00.004+02:00</published><updated>2008-07-10T18:27:02.690+02:00</updated><title type='text'>L'Irlande a dit non au traité de Lisbonne</title><content type='html'>Apparemment les Irlandais qui ont profité de la chance que leur démocratie à eux leur permet de s'exprimer sur un sujet qui les engage au sein de l'Union Européenne, ont répondu majoritairement « non » à la question qui leur était posée quant à la ratification par leur pays du traité de Lisbonne, lui-même vendu comme un mini-traité remplaçant le TCE, qui en 2005 avait déjà montré le gouffre abyssal entre certaines couches de la population européenne, notamment de la population française, et les élites-zet-dirigeants.&lt;br /&gt;&lt;br /&gt;La démocratie est un sujet qui me tient à cœur. Peut-être plus encore que l'Europe, c'est dire. Ainsi le projet « Les Fûts » est, ou fut, un projet d'&lt;span style="font-style: italic;"&gt;empowerment &lt;/span&gt;de citoyens, en l'occurrence de citoyens déjà engagés dans l'action collective et associative.&lt;br /&gt;&lt;br /&gt;Pour en revenir à ce 13 juin 2008, je trouve admirable que les Irlandais aient dans leur Constitution une clause qui à oblige à organiser un référendum pour un sujet de cette nature. Je trouve évidemment lamentable qu'on ne prenne pas en compte le « non » français de 2005.&lt;br /&gt;&lt;br /&gt;Car quelle que soit ma virulence à défendre le « oui », je suis avant tout pour un régime démocratique, c'est-à-dire qui donne le pouvoir à un peuple qui a les moyens d'en être responsable. Quand la question se résume à  « vous sentez-vous prêt(s) à ratifier ce traité que vous avez dit à maintes reprises incompréhensible et loin de vos préoccupation ? », je trouve sain, je trouve hygiénique, que la réponse soit « non » quand les citoyens consultés ne se sentent effectivement pas prêts.&lt;br /&gt;&lt;br /&gt;Je lis çà et là qu'il y aurait eu 885 000 Irlandais à voter non, contre 764 000 ouis, sur un traité qui doit être ratifié à l'unanimité au sein de 27 pays qui comptent au total 500 millions d'habitants. Ce sont les règles que nous nous sommes fixées, simple constat.&lt;br /&gt;&lt;br /&gt;Une première remarque, qui me trouble énormément, c'est que si sur lesdits 27 pays, disons, 20 étaient à ce point pour le « oui », que n'ont-ils uni leurs forces de propagande (médias, conférences, &lt;span style="font-style: italic;"&gt;meetings&lt;/span&gt;... ils avaient même les moyens de faire des films et de les diffuser dans les cinémas !) pour agir et faire œuvre éducative, sinon &lt;span style="font-style: italic;"&gt;marketing&lt;/span&gt; ? La construction européenne les concerne-t-elle aussi peu qu'ils s'en tiennent à pleurer quand le mal est fait ?&lt;br /&gt;&lt;br /&gt;L'autre remarque, je la tire d'un adage qui veut que l'éducation et la paix soient sœurs siamoises. En effet, dit vite, l'éducation permet la paix (elle en montre les bienfaits, les limites, la fragilité, les conditions), et la paix permet l'éducation (elle en est une condition). Or nous construisons l'Europe certes pour le bien-être économique et pour que tout le monde parle anglais, mais surtout et avant tout pour la paix. Aujourd'hui d'ailleurs cette paix a de plus en plus une composante écologique. Un corollaire de cette paix, c'est l'éducation, et notamment l'éducation politique, avec ses ramifications dans la plupart des sciences humaines. Ne pas construire l'Europe sur cette base-là, c'est ne pas construire l'Europe dans l'objectif de la paix.&lt;br /&gt;&lt;br /&gt;Alors on peut pleurer d'un « non » dû à une inexistante propagande (j'emploie ce mot de façon pragmatique, sans connotation morale) d'État, mais il montre surtout un désintérêt des penseurs de l'Europe pour la question éducative. Et soyons clairs, je ne dis pas que le traité serait passé avec davantage d'éducation, car je ne confonds pas propagande et éducation : je dis qu'avec davantage d'éducation en amont le hiatus, pour le moins, entre ceux qui ont rédigé et manigancé ce traité, et ceux qui étaient consultés, voire ceux qui auraient dû l'être dans une visée démocratique, se serait grandement réduit. En particulier le traité lui-même n'aurait pas été rédigé dans cette forme si complexe. Accorder de l'importance à l'éducation, c'est aussi permettre un certain &lt;span style="font-style: italic;"&gt;feedback &lt;/span&gt;entre les diverses couches sociales.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-861006051391213897?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/861006051391213897/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=861006051391213897' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/861006051391213897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/861006051391213897'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/06/lirlande-dit-non-au-trait-de-lisbonne.html' title='L&apos;Irlande a dit non au traité de Lisbonne'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-2919000174339626929</id><published>2008-04-21T16:48:00.004+02:00</published><updated>2008-12-09T04:40:52.952+01:00</updated><title type='text'>Inscription au Déjeuner sur web n°2 et Je-ne-sais-quoi</title><content type='html'>Voilà voilà, je me suis inscrit à la deuxième édition de Déjeuner sur web, à Toulouse, &lt;a href="http://www.meleenumerique.com/annexeven/autres/2008/dejeuner-sur-web/dejeuner-sur-web-2.html"&gt;sur le site de la Mêlée Numérique&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;C'est l'occasion d'une « magnifique » annonce Twitter :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://twitter.com/dandriana/statuses/793627112"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/SAyqZqokHFI/AAAAAAAAACU/xnB6NOsjHCM/s320/twitter.png" alt="" id="BLOGGER_PHOTO_ID_5191711828369218642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Oui, j'utilise Twitter entre autres comme révélateur de &lt;span style="font-style: italic;"&gt;TODO List&lt;/span&gt; : les choses que j'ai à faire n'apparaissent que quand elles sont faites. Comme ça, pas de stress. Et cela comble le &lt;span style="font-style: italic;"&gt;Knowing-Doing Gap&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;... J'ai comme l'impression que bloguer sur le &lt;span style="font-style: italic;"&gt;Knowing-Doing Gap &lt;/span&gt;à partir d'un événement aussi anodin qu'une inscription à quelque chose qui n'a pas eu lieu, peut donner la même impression d'inutile mise en abyme que Twitter soi-même. Pourtant pourtant quelque chose se joue...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-2919000174339626929?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/2919000174339626929/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=2919000174339626929' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/2919000174339626929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/2919000174339626929'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/04/inscription-au-djeuner-sur-web-n2-et-je.html' title='Inscription au Déjeuner sur web n°2 et Je-ne-sais-quoi'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kKYRIZmegcw/SAyqZqokHFI/AAAAAAAAACU/xnB6NOsjHCM/s72-c/twitter.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8300537055048364005</id><published>2008-04-08T19:17:00.003+02:00</published><updated>2008-04-08T19:30:16.873+02:00</updated><title type='text'>Déjeuner d'ex-Fûteurs et retour sur les Fûts</title><content type='html'>J'ai déjeuné ce midi avec les deux autres instigateurs du projet original « Les Fûts », c'est-à-dire Christophe et Pierre (ils sont dans la colonne à droite).&lt;br /&gt;&lt;br /&gt;Repas très sympa à Gradignan ; on mange toujours aussi bien au Thé à la menthe.&lt;br /&gt;&lt;br /&gt;On est revenus un peu sur le projet des Fûts (entre moults autres sujets). Pour ma part ce que j'en retiendrai :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;l'idée d'une plate-forme web avec fédération d'identité pour les associations reste « une idée qu'elle est bonne »&lt;/li&gt;&lt;li&gt;pour des sites mon-associatifs, des solutions existaient à l'époque, et de nouvelles existent aujourd'hui, ou ont évolué. On a parlé par exemple de &lt;a href="http://www.joomla.org/"&gt;Joomla!&lt;/a&gt;, de &lt;a href="http://www.freeguppy.org/"&gt;Guppy&lt;/a&gt;...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;la disponibilité de l'équipe n'était pas là, ou mauvaise : on ne se voyait que quelques fois par semaine, par exemple. Or pour un tel projet, qui demandait un fort investissement technique, il faut s'y mettre à fond, et surtout sur de grosses plages de temps.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;à mon avis, le modèle économique basé sur un modèle associatif n'était pas bon. C'est une autre façon de voir le point précédent.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;on s'est dispersés à tort sur deux objectifs : des réunions d'architectes NTIC bordelais, et une plate-forme web pour les associations, les architectes développant (imaginait-on) la plate-forme.&lt;/li&gt;&lt;li&gt;et évidemment, on a été trop ambitieux sur les délais affichés...&lt;/li&gt;&lt;/ul&gt;Gros problème de &lt;span style="font-style: italic;"&gt;focus&lt;/span&gt;, je dirais.&lt;br /&gt;&lt;br /&gt;Mais l'idée reste bonne &lt;span style="font-family: courier new;"&gt;;-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8300537055048364005?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8300537055048364005/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8300537055048364005' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8300537055048364005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8300537055048364005'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/04/djeuner-dex-fteurs-et-retour-sur-les.html' title='Déjeuner d&apos;ex-Fûteurs et retour sur les Fûts'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6250220909424074905</id><published>2008-04-02T21:19:00.009+02:00</published><updated>2008-12-09T04:40:53.405+01:00</updated><title type='text'>Validation de backups</title><content type='html'>OK, on fait tous des sauvegardes, ou &lt;span style="font-style: italic;"&gt;backups&lt;/span&gt;, automatisés.&lt;br /&gt;&lt;br /&gt;Un des risques est qu'un grain de sable s'immisce dans le processus de &lt;span style="font-style: italic;"&gt;backup&lt;/span&gt;, et que le fichier de sauvegarde soit au final invalide, c'est-à-dire qu'il ne puisse plus servir à la restauration des données. Pas très pertinent, du coup.&lt;br /&gt;&lt;br /&gt;Pour gérer ce risque, on peut disposer d'une machine jumelle, sur laquelle on va régulièrement procéder à une restauration de l'environnement qui a été sauvegardé. Mais il s'agit là de tâches « bas niveau », comme dirait un administrateur système de mes connaissances, et elles ne valident que le processus de restauration, non pas que les données ont été réinstallées avec succès.&lt;br /&gt;&lt;br /&gt;Pour illustrer ce risque, imaginons que telle procédure de &lt;span style="font-style: italic;"&gt;backup &lt;/span&gt;consiste à créer l'archive d'un répertoire. Et que pour un bête problème de configuration qui change, se retrouve archivé un mauvais répertoire ou un répertoire vide. Toutes les opérations techniques de sauvegarde, copie, transfert, et restauration, se passeront bien, mais les données issues de la restauration n'auront aucun intérêt. Et on ne s'en apercevra qu'en cas de besoin... (Ne rigolez pas, ça m'est arrivé).&lt;br /&gt;&lt;br /&gt;J'ai donc pensé à automatiser une validation « applicative » de la restauration quotidiennne de mes données sauvegardées.&lt;br /&gt;&lt;br /&gt;Prenons l'exemple d'un &lt;span style="font-style: italic;"&gt;repository &lt;/span&gt;Subversion, qui est le cas le plus critique pour le développement. À intervalles réguliers, j'ai un processus qui :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;récupère sur une machine dédiée la dernière version du &lt;span style="font-style: italic;"&gt;backup &lt;/span&gt;du &lt;span style="font-style: italic;"&gt;repository&lt;/span&gt;&lt;/li&gt;&lt;li&gt;extrait les fichiers&lt;/li&gt;&lt;li&gt;les installe en tant que &lt;span style="font-style: italic;"&gt;repository &lt;/span&gt;temporaire, et démarre une instance &lt;span style="font-family:courier new;"&gt;svnserve &lt;/span&gt;(serveur Subversion)&lt;/li&gt;&lt;li&gt;simule un client (un poste de travail de développeur), et se connecte au serveur démarré pour rapatrier tous les fichiers&lt;/li&gt;&lt;li&gt;fait quelques mesures et validations sur les fichiers ainsi rapatriés : le nombre de projets est supérieur à 10, etc.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Au fil du temps, je vérifie que les restaurations de backups vérifient certains critères, comme :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;le numéro de révision Subversion ne cesse de croître avec le temps &lt;span style="font-style: italic;"&gt;(&lt;/span&gt;non-réversibilité)&lt;/li&gt;&lt;li&gt;le nombre de projets ne cesse de croître avec le temps (loi d'entropie du développement Java)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;la taille de l'archive croît &lt;span style="font-style: italic;"&gt;grosso modo &lt;/span&gt;avec le temps (avec une tolérance de -2 %, car cela dépend de la compression)&lt;/li&gt;&lt;/ul&gt;Je pourrais aussi vérifier que :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;le numéro de révision Subversion rapatriée correspond à peu près (à 100 près, par exemple) à la révision Subversion qui est active sur la machine de production&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;J'ai une console qui me permet de suivre ces évolutions.&lt;br /&gt;&lt;br /&gt;L'architecture technique que j'utilise est la suivante :&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/R_PkgVAUQwI/AAAAAAAAAB0/pCfQhNan3v0/s1600-h/diagram-restore1.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/R_PkgVAUQwI/AAAAAAAAAB0/pCfQhNan3v0/s320/diagram-restore1.png" alt="" id="BLOGGER_PHOTO_ID_5184738840078992130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Le serveur « ref » contient les données de référence, en l'occurrence le &lt;span style="font-style: italic;"&gt;repository &lt;/span&gt;Subversion utilisé en développement&lt;/li&gt;&lt;li&gt;[1]. À minuit (0:00), une &lt;span style="font-style: italic;"&gt;hot copy &lt;/span&gt;est créée localement, compressée, et envoyée par FTP vers le serveur « ftp », qui est une sorte de sas.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[2]. À 1:00, l'archive est récupérée et copiée localement sur « bkp », qui collecte une copie de tous les fichiers de sauvegarde de l'architecture.&lt;/li&gt;&lt;li&gt;[3]. À 2:00, l'archive est récupérée et copiée localement sur « ci », qui est vu comme un serveur d'intégration continue (&lt;span style="font-style: italic;"&gt;Continuous Integration&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;Les fichiers de l'archive sont extraits, installés en tant que &lt;span style="font-style: italic;"&gt;repository &lt;/span&gt;local, &lt;span style="font-family:courier new;"&gt;svnserve &lt;/span&gt;est démarré, des tests sont passés, etc.&lt;/li&gt;&lt;li&gt;Un rapport est émis, qui pourra être agrégé aux autres et servi par un &lt;span style="font-style: italic;"&gt;Web Service&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Une console agrège ensuite les différentes informations. Voici un exemple de tableau de bord :&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/R_PpElAUQzI/AAAAAAAAACM/Tu_D5KBDoX0/s1600-h/dashboard-restore.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/R_PpElAUQzI/AAAAAAAAACM/Tu_D5KBDoX0/s400/dashboard-restore.png" alt="" id="BLOGGER_PHOTO_ID_5184743860895761202" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;La console présente les noms des derniers fichiers de sauvegarde, leur date, leur « âge  » en jours, leur taille, et indique s'ils ont fait l'objet d'une restauration ou non.&lt;/li&gt;&lt;li&gt;La mention  « &lt;span style="font-style: italic;"&gt;restored&lt;/span&gt; » indique que la restauration du fichier a réussi.&lt;/li&gt;&lt;li&gt;La mention « &lt;span style="font-style: italic;"&gt;NO&lt;/span&gt; » indique que la restauration n'a pas eu lieu (il y a quelques progrès à faire, visiblement)&lt;/li&gt;&lt;li&gt;Les mentions « -1 », « -2 », etc. indiquent que le dernier fichier de sauvegarde n'a pas encore fait l'objet de restauration, et que la dernière restauration pour ces données a eu lieu sur l'avant-dernière sauvegarde, l'antépénultième, etc.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;L'intérêt de la machine sas « ftp » est de pouvoir interdire les accès directs de « ref » vers « bkp », dans le cas de réseaux différents par exemple. Dans le cas où tout ce beau monde est sur le même réseau, on peut s'en passer.&lt;br /&gt;&lt;br /&gt;La machine « bkp » a bien comme responsabilité de centraliser tous les &lt;span style="font-style: italic;"&gt;backups&lt;/span&gt; de l'architecture. On pourrait avoir par exemple :&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/R_PndlAUQyI/AAAAAAAAACE/qdhk85cwPvo/s1600-h/diagram-restore2.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/R_PndlAUQyI/AAAAAAAAACE/qdhk85cwPvo/s320/diagram-restore2.png" alt="" id="BLOGGER_PHOTO_ID_5184742091369235234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Une remarque :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;il est intéressant d'imposer que les données de référence soient systématiquement versionnées en amont (exemples : Subversion, un wiki, etc.). Une réflexion à mener pour les données métier si vous voulez mon avis...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Bon, je suis bien content. Ça fait longtemps que je souhaitais implémenter ce système.&lt;br /&gt;&lt;br /&gt;Et vous ? Quelle garantie vous offrez-vous sur la pertinence de vos &lt;span style="font-style: italic;"&gt;backups&lt;/span&gt; ? Vous contentez-vous de faire confiance à vos logiciels utilitaires ?&lt;br /&gt;&lt;br /&gt;Cela vous paraît un peu compliqué ?... &lt;span style="font-family:courier new;"&gt;;-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6250220909424074905?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6250220909424074905/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6250220909424074905' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6250220909424074905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6250220909424074905'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/04/validation-de-backups.html' title='Validation de backups'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kKYRIZmegcw/R_PkgVAUQwI/AAAAAAAAAB0/pCfQhNan3v0/s72-c/diagram-restore1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-7544871913811829416</id><published>2008-04-02T18:01:00.002+02:00</published><updated>2008-04-02T18:06:18.711+02:00</updated><title type='text'>Assertions JUnit 4.4 : assertThat()</title><content type='html'>Merci aux blogueurs de Xebia France de me faire découvrir la méthode &lt;span style="font-family: courier new;"&gt;assertThat() &lt;/span&gt;de JUnit 4.4, sur laquelle je ne m'étais pas encore penché : &lt;a href="http://blog.xebia.fr/2008/04/02/simplifier-les-assertions-junit-et-ameliorer-vos-tests/"&gt;Simplifier les assertions JUnit et améliorer vos tests&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Avoir des tests les plus clairs possible est une Bonne Chose™.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-7544871913811829416?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/7544871913811829416/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=7544871913811829416' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7544871913811829416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7544871913811829416'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/04/assertions-junit-44-assertthat.html' title='Assertions JUnit 4.4 : assertThat()'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-946989282385299436</id><published>2008-03-31T15:34:00.002+02:00</published><updated>2008-03-31T15:38:48.471+02:00</updated><title type='text'>À lire : Scrum and XP from the Trenches</title><content type='html'>Dans mon post précédent sur Scrum, j'ai oublié de reparler du bouquin de Henrik Kniberg, « &lt;a href="http://www.google.com/search?q=scrum+and+xp+from+the+trenches"&gt;&lt;span style="font-style: italic;"&gt;Scrum and XP from the Trenches&lt;/span&gt;&lt;/a&gt; ». Les opérationnels et les techniciens liront ce PDF gratuit comme un roman. Il s'agit d'une plongée passionnante dans le quotidien d'un &lt;span style="font-style: italic;"&gt;Scrum Master&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-946989282385299436?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/946989282385299436/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=946989282385299436' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/946989282385299436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/946989282385299436'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/lire-scrum-and-xp-from-trenches.html' title='À lire : Scrum and XP from the Trenches'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-1558214009717359914</id><published>2008-03-30T17:37:00.001+02:00</published><updated>2008-03-30T17:39:56.496+02:00</updated><title type='text'>Faites-vous de l'agile ?</title><content type='html'>Anecdote rapportée :&lt;br /&gt;&lt;blockquote&gt;- Faites-vous de l'agile dans votre organisation ?&lt;br /&gt;- Oui !&lt;br /&gt;- Ah, et quelles pratiques avez-vous adoptées ? XP (&lt;span style="font-style: italic;"&gt;eXtreme Programming&lt;/span&gt;) ?&lt;br /&gt;- Non.&lt;br /&gt;- Le &lt;span style="font-style: italic;"&gt;pair programming&lt;/span&gt; ?&lt;br /&gt;- Non.&lt;br /&gt;- Euh... Vous faites du &lt;span style="font-style: italic;"&gt;refactoring&lt;/span&gt;, alors ?&lt;br /&gt;- Non plus.&lt;br /&gt;- ... De l'intégration continue ?&lt;br /&gt;- Non.&lt;br /&gt;- ... Alors quoi ???&lt;br /&gt;- On ne fait pas de documentation.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-1558214009717359914?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/1558214009717359914/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=1558214009717359914' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1558214009717359914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1558214009717359914'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/faites-vous-de-lagile.html' title='Faites-vous de l&apos;agile ?'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-430178916741728843</id><published>2008-03-30T16:55:00.004+02:00</published><updated>2008-03-30T18:16:35.280+02:00</updated><title type='text'>Formation Scrum Master à La Défense</title><content type='html'>J'ai eu l'occasion la semaine dernière, précisément les mardi 25 et mercredi 26 mars, de suivre une formation « &lt;span style="font-style: italic;"&gt;Scrum Master&lt;/span&gt; » donnée par Jeff Sutherland en partenariat avec Xebia France, à Paris-La Défense.&lt;br /&gt;&lt;br /&gt;Pour ceux qui ne connaissent pas Scrum, je dirais qu'il s'agit d'une boîte à outils méthodologiques pour mener des projets à bien.&lt;br /&gt;&lt;br /&gt;Basiquement, ces projets sont :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;avec des objectifs « démontrables » : par exemple, un site web, un rapport rédigé, un gâteau...&lt;/li&gt;&lt;li&gt;suivis de près par un « directeur de produit » (&lt;span style="font-style: italic;"&gt;Product Owner&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;à équipe réduite : entre 5 et 9 personnes, avec une préférence pour des équipes de 5&lt;br /&gt;&lt;/li&gt;&lt;li&gt;menés de façon itérative : à la fin de chaque itération, une version du produit est garantie testée, et est démontrable entre autres au directeur de produit ; cela assure que le &lt;span style="font-style: italic;"&gt;feedback &lt;/span&gt;est reçu à intervalles rapprochés et réguliers, et qu'on vérifie que la trajectoire prise par l'équipe n'est pas déconnante&lt;br /&gt;&lt;/li&gt;&lt;li&gt;menés sur des itérations courtes : de 2 à 5 semaines, avec souvent une préférence pour des itérations de 2 semaines (je n'en reviens toujours pas, car cela me semble bien court, mais plusieurs participants m'ont assuré travailler ainsi)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Une des grandes devises de Scrum est « &lt;span style="font-style: italic;"&gt;inspect &amp;amp; adapt&lt;/span&gt; », c'est-à-dire qu'un projet mené avec Scrum améliore lui-même sa méthode de travail tout du long.&lt;br /&gt;&lt;br /&gt;Scrum est une méthodologie « agile », au même titre que XP pour le processus de développement logiciel.&lt;br /&gt;&lt;br /&gt;Pour de plus amples renseignements, je vous conseille &lt;a href="http://scrum.aubryconseil.com/"&gt;le blog de Claude Aubry&lt;/a&gt;, et le livre &lt;a href="http://www.amazon.fr/dp/073561993X"&gt;&lt;span style="font-style: italic;"&gt;Agile Project Management  with Scrum&lt;/span&gt;&lt;/a&gt;, de Ken Schwaber (Ken Schwaber est le co-inventeur, avec Jeff Sutherland, de Scrum).&lt;br /&gt;&lt;br /&gt;J'avais eu l'occasion de m'intéresser à Scrum par l'intermédiaire de lectures sur le web, et d'expérimenter avec enthousiasme deux ou trois principes portés par ce &lt;span style="font-style: italic;"&gt;framework&lt;/span&gt;. Suivre la formation à Paris m'a permis d'équilibrer mes connaissances théoriques, et évidemment de rencontrer d'autres personnes impliquées dans Scrum.&lt;br /&gt;&lt;br /&gt;Ce furent deux jours passionnants.&lt;br /&gt;&lt;br /&gt;D'abord, Jeff Sutherland, l'homme. Il est à la fois brillant et précis dans son discours, très intelligent dans sa façon d'appréhender les choses, humble et... marrant. Je dirais qu'il apparaît que Scrum s'inscrit pour lui dans une démarche plus globale. Il a évoqué le bouddhisme zen par exemple.&lt;br /&gt;&lt;br /&gt;Ensuite, Scrum. En anglais, « &lt;span style="font-style: italic;"&gt;scrum&lt;/span&gt; » signifie « mêlée » : celle du rugby. À entendre Jeff Sutherland, il s'agit bien et prioritairement de permettre à une équipe d'être la plus efficace possible pour atteindre un objectif commun. Pour cela, il faut (et il suffit ?) de clarifier par tous les moyens (discussions, démonstrations suivies de &lt;span style="font-style: italic;"&gt;feedbacks&lt;/span&gt;, échanges avec le client) l'objectif à atteindre, et de libérer l'équipe de tout ce qui pourrait gêner sa tâche.&lt;br /&gt;&lt;br /&gt;À ce titre, la méthode invoque un rôle particulier dans l'équipe, celui du « &lt;span style="font-style: italic;"&gt;Scrum Master&lt;/span&gt; » (c'était l'objet de la formation, vous suivez). Je dirais que celui-ci est principalement là pour régler les &lt;span style="font-style: italic;"&gt;impediments&lt;/span&gt;, c'est-à-dire les obstacles que rencontre l'équipe, et pour favoriser les échanges et le &lt;span style="font-style: italic;"&gt;feedback &lt;/span&gt;continuels, en organisant notamment, et en cadrant, des réunions quotidiennes d'environ un quart d'heure (&lt;span style="font-style: italic;"&gt;daily scrums&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Les &lt;span style="font-style: italic;"&gt;impediments &lt;/span&gt;peuvent être de divers ordres : matériels, logiciels, environnementaux, voire budgétaires, mais aussi humains, politiques, ou managériaux. Le &lt;span style="font-style: italic;"&gt;Scrum Master &lt;/span&gt;est concentré sur le travail que doit fournir l'équipe, pas sur la hiérarchie dans l'organisation.&lt;br /&gt;&lt;br /&gt;Quand on se pose la question de cette façon simple, il n'y a pas grand-chose à penser :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Le &lt;span style="font-style: italic;"&gt;Scrum Master &lt;/span&gt;met de l'huile dans les rouages (&lt;span style="font-style: italic;"&gt;daily scrums&lt;/span&gt; et tenue à jour des &lt;span style="font-style: italic;"&gt;backlogs&lt;/span&gt;),&lt;/li&gt;&lt;li&gt;et balaie les grains de sable de l'engrenage.&lt;/li&gt;&lt;li&gt;L'équipe prend à sa charge la réalisation du produit,&lt;/li&gt;&lt;li&gt;produit dont le &lt;span style="font-style: italic;"&gt;Product Owner&lt;/span&gt; maintient une vision claire et compréhensible (accessible).&lt;/li&gt;&lt;/ul&gt;L'image qui me venait est celle d'une piste de bobsleigh : si la piste est constamment dégagée, l'équipe la descendra d'abord à pied (on n'est jamais trop prudent), puis en se laissant glisser individuellement (confiance), puis... en bobsleigh (confiance + équipe).&lt;br /&gt;&lt;br /&gt;Les études menées sur l'utilisation de Scrum montrent paraît-il qu'une équipe de développeurs moyens est toujours meilleure à terme que des bons ou des très bons développeurs qui travaillent séparément. Cette émergence qui naît au sein d'une équipe est captée dans le « &lt;span style="font-style: italic;"&gt;ba&lt;/span&gt; », terme japonais.&lt;br /&gt;&lt;br /&gt;Le fait d'avoir son esprit vacant (&lt;span style="font-style: italic;"&gt;no impediment&lt;/span&gt;) et concentré sur l'activité s'appelle le « &lt;span style="font-style: italic;"&gt;kaizen&lt;/span&gt; ».&lt;br /&gt;&lt;br /&gt;L'objectif de Scrum est de permettre au « &lt;span style="font-style: italic;"&gt;ba&lt;/span&gt; » de s'exprimer dans une équipe composée de personnes en état de « &lt;span style="font-style: italic;"&gt;kaizen&lt;/span&gt; » &lt;span style="font-family:courier new;"&gt;;-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pour en revenir à la formation, nous étions 30 stagiaires. La formation et le support étaient en anglais, avec l'aide de Guillaume Bodet, directeur technique de Xebia France, présent pendant ces deux jours, dans le cas où des termes auraient nécessité une traduction (cela n'a finalement pas été le cas).&lt;br /&gt;&lt;br /&gt;Deux exercices m'ont particulièrement intéressé :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;la réflexion en équipe et la rédaction collaborative d'une réponse à un problème donné, en trois itérations de 8 minutes, chacune précédée de 4 minutes de &lt;span style="font-style: italic;"&gt;daily scrum&lt;/span&gt;. Je jouais le &lt;span style="font-style: italic;"&gt;Scrum Master&lt;/span&gt;, et me bornais donc à organiser les &lt;span style="font-style: italic;"&gt;daily scrums &lt;/span&gt;et à régler les problèmes de l'équipe. J'ai trouvé que le résultat, c'est-à-dire le document rédigé, malgré le caractère parfois désordonné du travail, et la vitesse demandée, était de bien meilleure facture que ce qu'on aurait pu composer chacun de son côté, ou de ce qu'on aurait pu organiser linéairement sans itérations. Pour la démo, l'équipe m'a demandé de présenter le document ! alors que je n'avais pas participé à sa matière. C'est le rôle du &lt;span style="font-style: italic;"&gt;Scrum Master&lt;/span&gt;, si j'ai bien compris : être au service de l'équipe...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;un exercice de planification en fonction de la « valeur métier » des composants d'un produit à réaliser. Notre équipe n'a pas terminé l'exercice (!!!) car nous passions trop de temps en planification. La qualité de réalisation était évidemment très bonne (vu la planification), mais le projet a été planté, vu que nous n'avancions pas à un rythme suffisant. Cet exercice m'a montré l'importance primordiale du &lt;span style="font-style: italic;"&gt;Product Owner&lt;/span&gt;, qui doit être clair dans ses demandes et exigeant quant au résultat, et celle, finalement secondaire, du cadrage apporté par le &lt;span style="font-style: italic;"&gt;Scrum Master&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;Quelques questions font débat :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Scrum Master&lt;/span&gt;, n'est-ce pas simplement un rôle chef de projet ? Voire un sous-rôle de chef de projet ? Pour ma part je pense que le &lt;span style="font-style: italic;"&gt;Scrum Master &lt;/span&gt;a notamment comme fonction de balayer les obstacles et de cadrer l'énergie collective, pas de se mettre en avant par rapport à l'équipe (d'ailleurs par moments ça gêne, si on se met en avant). Par ailleurs ce n'est en aucun cas un positionnement hiérarchique : les tâches ne sont pas affectées par le &lt;span style="font-style: italic;"&gt;Scrum Master&lt;/span&gt;. Donc à chacun de se faire son idée.&lt;/li&gt;&lt;li&gt;Le client final a-t-il plutôt besoin de bons &lt;span style="font-style: italic;"&gt;Scrum Masters&lt;/span&gt;, ou de bons &lt;span style="font-style: italic;"&gt;Product Owners&lt;/span&gt; ? La réponse de Jeff Sutherland est fortement et sans hésiter : &lt;span style="font-weight: bold;"&gt;de bons &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Product Owners&lt;/span&gt;. La vision du produit doit être portée, avec en permanence la visée de la maximisation de la valeur métier. C'est le &lt;span style="font-style: italic;"&gt;Product Owner&lt;/span&gt; qui fixe les priorités de chaque itération et qui, en fonction des réalisations de l'équipe (et de la vélocité, dont je n'ai pas parlé dans ce post), gère les dates de livraison.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Au final, je vais appliquer Scrum sur tous mes projets. Outre le contact avec le &lt;span style="font-style: italic;"&gt;Scrum Trainer&lt;/span&gt;, la formation &lt;span style="font-style: italic;"&gt;Scrum Master &lt;/span&gt;permet de faire le tri dans les bases théoriques sur Scrum, largement disponibles sur le web ou dans la littérature, et de les confronter à la réalité à l'aide de quelques exercices pratiques.&lt;br /&gt;&lt;br /&gt;Je ne peux que conseiller cette formation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-430178916741728843?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/430178916741728843/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=430178916741728843' title='216 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/430178916741728843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/430178916741728843'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/formation-scrum-master-la-dfense.html' title='Formation Scrum Master à La Défense'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>216</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6953511576310722372</id><published>2008-03-19T17:06:00.002+01:00</published><updated>2008-03-19T17:10:51.620+01:00</updated><title type='text'>Google for Non Profits : plate-forme Les Fûts ?</title><content type='html'>&lt;span style="font-style: italic;"&gt;C|net: &lt;a href="http://www.news.com/8301-13577_3-9897893-36.html?tag=newsmap"&gt;Google launches tool portal for nonprofits&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Google communique sur sa palanquée d'outils auprès des organisations à buts non lucratifs :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gmail&lt;/li&gt;&lt;li&gt;Checkout&lt;/li&gt;&lt;li&gt;Docs&lt;/li&gt;&lt;li&gt;Calendar&lt;/li&gt;&lt;li&gt;Analytics&lt;/li&gt;&lt;li&gt;Google Grants&lt;/li&gt;&lt;li&gt;YouTube&lt;/li&gt;&lt;li&gt;Blogger&lt;/li&gt;&lt;li&gt;Maps&amp;amp;Earth&lt;/li&gt;&lt;li&gt;Gadgets&lt;/li&gt;&lt;li&gt;Groups&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Il manque le wiki, je suis surpris.&lt;br /&gt;&lt;br /&gt;Reste qu'avec les outils Google, et si on n'en sort pas, le concept d'identification numérique partagée d'association à association, concept qui est au cœur des Fûts (une personne qui fait partie d'une association appartient souvent à d'autres groupes), est fourni de base.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6953511576310722372?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6953511576310722372/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6953511576310722372' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6953511576310722372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6953511576310722372'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/google-for-non-profits-plate-forme-les.html' title='Google for Non Profits : plate-forme Les Fûts ?'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6846435044263315568</id><published>2008-03-17T12:43:00.002+01:00</published><updated>2008-03-17T12:49:26.384+01:00</updated><title type='text'>MindManager gratuit pour les blogueurs</title><content type='html'>Vu chez Cmicblog : &lt;a href="http://www.cmic.ch/2008/03/03/mindmanager-pour-les-blogueurs/"&gt;MindManager gratuit pour les blogueurs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;J'ai demandé ma clef, qu'on m'a fort gentiment envoyée. Puis j'ai installé cette application paraît-il surpuissante de &lt;span style="font-style: italic;"&gt;mind mapping&lt;/span&gt;. On verra bien. En tout cas pour s'y mettre, d'après les habitués de la pratique, il faut prendre « au moins » MindManager.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6846435044263315568?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6846435044263315568/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6846435044263315568' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6846435044263315568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6846435044263315568'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/mindmanager-gratuit-pour-les-blogueurs.html' title='MindManager gratuit pour les blogueurs'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5732350690276427133</id><published>2008-03-15T19:48:00.011+01:00</published><updated>2008-12-09T04:40:53.605+01:00</updated><title type='text'>YAML est au-dessus de XML</title><content type='html'>Développeur Java.&lt;br /&gt;&lt;br /&gt;Des montagnes de fichiers XML pour la configuration, pour les tests, pour la sérialisation de données, parfois même pour les logs.&lt;br /&gt;&lt;br /&gt;Une envie de penser plus vite.&lt;br /&gt;&lt;br /&gt;Solution : adoption radicale de &lt;a href="http://yaml.org/"&gt;YAML&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Un exemple&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pour mes tests je joue beaucoup avec des descriptions de données au format XML. Ainsi, je peux manipuler des valeurs de référence (pour les tests) sous la forme suivante :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;&amp;lt;DataBean name="currentUser"&lt;br /&gt; class="com.avcompris.model.User" scope="request"&amp;gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt; &amp;lt;property name="firstName"&lt;br /&gt;    class="java.lang.String"&amp;gt;Dominique&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="lastName"&lt;br /&gt;    class="java.lang.String"&amp;gt;Vandrault&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="birthDate"&lt;br /&gt;    class="org.joda.time.DateTime"&amp;gt;1978-01-06&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/DataBean&amp;gt;&lt;/pre&gt;&lt;br /&gt;Première discussion. On m'objectera qu'il vaudrait mieux avoir deux fichiers XML, un pour la description de la structure et un pour les valeurs. Cela donnerait éventuellement :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;User.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;&amp;lt;DataBeanClass&lt;br /&gt; class="com.avcompris.model.User" alias="User"&amp;gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt; &amp;lt;property name="firstName"&lt;br /&gt;    class="java.lang.String"/&amp;gt;&lt;br /&gt; &amp;lt;property name="lastName"&lt;br /&gt;    class="java.lang.String"/&amp;gt;&lt;br /&gt; &amp;lt;property name="birthDate"&lt;br /&gt;    class="org.joda.time.DateTime"/&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/DataBeanClass&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;&amp;lt;User name="currentUser" scope="request"&amp;gt;&lt;br /&gt;&amp;lt;firstName&amp;gt;Dominique&amp;lt;/firstName&amp;gt;&lt;br /&gt;&amp;lt;lastName&amp;gt;Vandrault&amp;lt;/lastName&amp;gt;&lt;br /&gt;&amp;lt;birthDate&amp;gt;1978-01-06&amp;lt;/birthDate&amp;gt;&lt;br /&gt;&amp;lt;/User&amp;gt;&lt;/pre&gt;&lt;br /&gt;C'est un premier choix à faire. L'idée n'étant pas de faire de l'architecture mais bien de pisser du test, je n'ai aucune envie de me retrouver avec des fichiers de description dans tous les sens, qui deviendront impossibles à maintenir au bout de 30 &lt;span style="font-style: italic;"&gt;refactorings&lt;/span&gt;. Pourquoi pas écrire des &lt;span style="font-style: italic;"&gt;XML Schemas&lt;/span&gt; dès maintenant, aussi ?&lt;br /&gt;&lt;br /&gt;Pour mes procédures de tests je conserve donc le principe du fichier unique, avec méta-données côte-à-côte avec les données.&lt;br /&gt;&lt;br /&gt;Mon fichier de départ est bien le suivant :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser1.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;&amp;lt;DataBean name="currentUser"&lt;br /&gt; class="com.avcompris.model.User" scope="request"&amp;gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt; &amp;lt;property name="firstName"&lt;br /&gt;    class="java.lang.String"&amp;gt;Dominique&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="lastName"&lt;br /&gt;    class="java.lang.String"&amp;gt;Vandrault&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="birthDate"&lt;br /&gt;    class="org.joda.time.DateTime"&amp;gt;1978-01-06&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/DataBean&amp;gt;&lt;/pre&gt;&lt;br /&gt;Première idée, accepter les valeurs par défaut. &lt;span style="font-style: italic;"&gt;Convention over configuration&lt;/span&gt;. Ainsi, je pourrais décider par convention que quand l'attribut &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;@class&lt;/span&gt;&lt;/span&gt; est absent, la propriété est forcément de type&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; java.lang.String&lt;/span&gt;&lt;/span&gt;. Et puis supprimons le tag &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;&lt;/span&gt; qui ne sert à rien (il serait très utile si je souhaitais écrire un &lt;span style="font-style: italic;"&gt;XML Schema &lt;/span&gt;validant mon XML, mais... ce n'est pas le cas pour le moment). Voyons ce que ça donne :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser2.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;&amp;lt;DataBean name="currentUser"&lt;br /&gt; class="com.avcompris.model.User" scope="request"&amp;gt;&lt;br /&gt; &amp;lt;property name="firstName"&amp;gt;Dominique&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="lastName"&amp;gt;Vandrault&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="birthDate"&lt;br /&gt;    class="org.joda.time.DateTime"&amp;gt;1978-01-06&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/DataBean&amp;gt;&lt;/pre&gt;&lt;br /&gt;Ah, mieux. Beaucoup mieux !&lt;br /&gt;&lt;br /&gt;Deuxième idée, passer à des éléments qui ont le nom de la propriété. On élimine donc, par convention, l'attribut &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;@name &lt;/span&gt;&lt;/span&gt;(et parallèlement, on s'éloigne de plus en plus de la possibilité d'écrire un &lt;span style="font-style: italic;"&gt;XML Schema &lt;/span&gt;validant non trivial).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser3.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;&amp;lt;currentUser&lt;br /&gt; class="com.avcompris.model.User" scope="request"&amp;gt;&lt;br /&gt; &amp;lt;firstName&amp;gt;Dominique&amp;lt;/firstName&amp;gt;&lt;br /&gt; &amp;lt;lastName&amp;gt;Vandrault&amp;lt;/lastName&amp;gt;&lt;br /&gt; &amp;lt;birthDate&lt;br /&gt;    class="org.joda.time.DateTime"&amp;gt;1978-01-06&amp;lt;/birthDate&amp;gt;&lt;br /&gt;&amp;lt;/currentUser&amp;gt;&lt;/pre&gt;&lt;br /&gt;Ça avance. Je ne me pose pas la question des sous-DataBeans, car je sens que ça me ferait reculer dans ma joie simplificatrice.&lt;br /&gt;&lt;br /&gt;Continuons. Passons maintenant en tant qu'attributs de leur parent les éléments uniques qui n'ont pas d'attributs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser4.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;&amp;lt;currentUser&lt;br /&gt; class="com.avcompris.model.User"&lt;br /&gt; scope="request"&lt;br /&gt; firstName="Dominique"&lt;br /&gt; lastName="Vandrault"&amp;gt;&lt;br /&gt; &amp;lt;birthDate&lt;br /&gt;      class="org.joda.time.DateTime"&amp;gt;1978-01-06&amp;lt;/birthDate&amp;gt;&lt;br /&gt;&amp;lt;/currentUser&amp;gt;&lt;/pre&gt;&lt;br /&gt;OK. C'est un peu mélangé, ce n'est pas uniforme, mais j'y gagne.&lt;br /&gt;&lt;br /&gt;Chouette.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Allez, j'arrête le cinéma. Ce XML est immonde, il n'est pas évolutif, il n'est pas validable, et il est moche. Moche comme du... XML.&lt;br /&gt;&lt;br /&gt;Dites-moi que vous n'y avez pas cru...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;L'approche YAML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://yaml.org/"&gt;YAML&lt;/a&gt; est un format de données qui est abondamment utilisé dans le monde de Ruby on Rails.&lt;br /&gt;&lt;br /&gt;Quand je choisis YAML pour décrire mes données, je ne me dis pas « comment être sûr que je pourrai écrire un &lt;span style="font-style: italic;"&gt;XML Schema &lt;/span&gt;validant plus tard », mais « comment ai-je envie d'écrire mes données ».&lt;br /&gt;&lt;br /&gt;Le &lt;span style="font-style: italic;"&gt;parsing&lt;/span&gt;, les transformations et la validation viendront bien plus tard. En fait, le plus souvent en passant par une étape XML intermédiaire.&lt;br /&gt;&lt;br /&gt;En premier lieu je me contente d'une utilisation &lt;span style="font-style: italic;"&gt;ad hoc &lt;/span&gt;du format.&lt;br /&gt;&lt;br /&gt;Ainsi, mon fichier &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;currentUser4.xml &lt;/span&gt;&lt;/span&gt;deviendrait :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser4.yaml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;currentUser:&lt;br /&gt; class: com.avcompris.model.User&lt;br /&gt; scope: request&lt;br /&gt; value:&lt;br /&gt;   firstName: Dominique&lt;br /&gt;   lastName: Vandrault&lt;br /&gt;   birthDate:&lt;br /&gt;     class: org.joda.time.DateTime&lt;br /&gt;     value: 1978-01-06&lt;/pre&gt;&lt;br /&gt;Beaucoup mieux que l'équivalent XML.&lt;br /&gt;&lt;br /&gt;Mais on peut aller plus loin :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser5.yaml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;currentUser:&lt;br /&gt; com.avcompris.model.User:&lt;br /&gt;   firstName: Dominique&lt;br /&gt;   lastName: Vandrault&lt;br /&gt;   birthDate:&lt;br /&gt;       org.joda.time.DateTime: 1978-01-06&lt;/pre&gt;&lt;br /&gt;(En passant, je supprime l'attribut &lt;span style="font-size:85%;"&gt;@scope&lt;/span&gt;, en décidant qu'il vaut "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;request&lt;/span&gt;&lt;/span&gt;" par défaut. J'aurais aussi pu le faire dans le cas du XML).&lt;br /&gt;&lt;br /&gt;Voici les « équivalents » YAML des autres fichiers XML :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser3.yaml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;currentUser:&lt;br /&gt; class: com.avcompris.model.User&lt;br /&gt; scope: request&lt;br /&gt; value:&lt;br /&gt;  firstName: Dominique&lt;br /&gt;  lastName: Vandrault&lt;br /&gt;  birthDate:&lt;br /&gt;     class: org.joda.time.DateTime&lt;br /&gt;     value: 1978-01-06&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser2.yaml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;- DataBean:&lt;br /&gt;   name: currentUser&lt;br /&gt;   class: com.avcompris.model.User&lt;br /&gt;   scope: request&lt;br /&gt;   properties:&lt;br /&gt;    - name: firstName&lt;br /&gt;      value: Dominique&lt;br /&gt;    - name: lastName&lt;br /&gt;      value: Vandrault&lt;br /&gt;    - name: birthDate&lt;br /&gt;      class: org.joda.time.DateTime&lt;br /&gt;      value: 1978-01-06&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser1.yaml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;- DataBean:&lt;br /&gt;    name: currentUser&lt;br /&gt;    class: com.avcompris.model.User&lt;br /&gt;    scope: request&lt;br /&gt;    properties:&lt;br /&gt;     - name: firstName&lt;br /&gt;       class: java.lang.String&lt;br /&gt;       value: Dominique&lt;br /&gt;     - name: lastName&lt;br /&gt;       class: java.lang.String&lt;br /&gt;       value: Vandrault&lt;br /&gt;     - name: birthDate&lt;br /&gt;       class: org.joda.time.DateTime&lt;br /&gt;       value: 1978-01-06&lt;/pre&gt;&lt;br /&gt;Ou le « degré zéro » de YAML :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;currentUser0.yaml :&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: small;"&gt;- DataBean:&lt;br /&gt;    name: currentUser&lt;br /&gt;    class: com.avcompris.model.User&lt;br /&gt;    scope: request&lt;br /&gt;    properties:&lt;br /&gt;     - property:&lt;br /&gt;           name: firstName&lt;br /&gt;           class: java.lang.String&lt;br /&gt;           value: Dominique&lt;br /&gt;     - property:&lt;br /&gt;           name: lastName&lt;br /&gt;           class: java.lang.String&lt;br /&gt;           value: Vandrault&lt;br /&gt;     - property:&lt;br /&gt;           name: birthDate&lt;br /&gt;           class: org.joda.time.DateTime&lt;br /&gt;           value: 1978-01-06&lt;/pre&gt;&lt;br /&gt;« currentUser5.yaml », propre, intelligent, lisible, fait 6 lignes.&lt;br /&gt;&lt;br /&gt;Le dernier fichier, « currentUser0.yaml », d'une structure digne d'un fichier XML validable, pour ne pas dire d'une base de données relationnelles, en fait 17. Quasiment 3 fois plus.&lt;br /&gt;&lt;br /&gt;YAML :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ne demande pas d'indiquer les fins d'éléments (ouf !), car il se base sur l'indentation&lt;/li&gt;&lt;li&gt;n'a pas de notion de sous-élément ou d'attribut : on se débrouille avec l'arborescence. Disons qu'il y a bien la notion de &lt;span style="font-style: italic;"&gt;maps &lt;/span&gt;et de &lt;span style="font-style: italic;"&gt;lists&lt;/span&gt;, qui correspondraient à peu près aux attributs (noms uniques) et aux sous-éléments (noms éventuellement répétés), mais les &lt;span style="font-style: italic;"&gt;maps &lt;/span&gt;peuvent avoir des sous-arborescences, contrairement aux attributs du XML.&lt;/li&gt;&lt;li&gt;est... lisible.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;il n'y a pas de guillemets dans tous les sens&lt;/li&gt;&lt;li&gt;l'indentation fait partie de la syntaxe&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;YAML n'a rien à voir avec JSON. Je dirais &lt;span style="font-style: italic;"&gt;grosso modo &lt;/span&gt;que YAML est orienté lisibilité des fichiers par des humains, tandis que JSON est orienté transfert de données entre machines. Mais surtout, JSON est fortement similaire à XML, tandis que YAML a une autre logique.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;La place de YAML dans le processus de développement&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;J'utilise YAML pour les données de tests, la configuration, et les fichiers sources de génération.&lt;br /&gt;&lt;br /&gt;Comme les composants côté serveur ou côté plugins savent surtout ingérer du XML, j'opère toujours une première phase de sérialisation de YAML vers un XML « neutre » équivalent.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/R9w1ec-fZbI/AAAAAAAAABs/8DmFAKUAb1Y/s1600-h/diagrams.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/R9w1ec-fZbI/AAAAAAAAABs/8DmFAKUAb1Y/s400/diagrams.png" alt="" id="BLOGGER_PHOTO_ID_5178072468859872690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La bibliothèque Java que j'utilise pour le &lt;span style="font-style: italic;"&gt;parsing &lt;/span&gt;de YAML est &lt;a href="https://jvyaml.dev.java.net/"&gt;JvYAML&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Voir aussi la bibliothèque &lt;a href="http://jyaml.sourceforge.net/"&gt;JYaml&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La page de Wikipedia sur YAML : &lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-5732350690276427133?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5732350690276427133/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5732350690276427133' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5732350690276427133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5732350690276427133'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/yaml-est-au-dessus-de-xml.html' title='YAML est au-dessus de XML'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kKYRIZmegcw/R9w1ec-fZbI/AAAAAAAAABs/8DmFAKUAb1Y/s72-c/diagrams.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6397456882369663879</id><published>2008-03-12T10:47:00.003+01:00</published><updated>2008-12-09T04:40:53.756+01:00</updated><title type='text'>Pour une check-list de productivité</title><content type='html'>À mon sens, la productivité et l’efficacité sont avant tout une affaire de détermination.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;De déterminations extérieures :&lt;br /&gt;1.1. L’environnement doit faciliter l’activité&lt;br /&gt;1.2. L’environnement ne doit pas gêner l’activité&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;De déterminations propres :&lt;br /&gt;2.1. Il faut avoir envie de bosser&lt;br /&gt;2.2. Il faut que ce soit le bon moment&lt;br /&gt;2.3. Il faut savoir ce qu’il y a à faire&lt;br /&gt;2.4. Il faut être « motivé » par le &lt;span style="font-style: italic;"&gt;feedback&lt;/span&gt; qu’on reçoit&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Je vais décliner chacun des points pour mon cas personnel, en ne parlant que de ce qui concerne le développement J2EE / web.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;1.1. Un environnement qui  facilite l’activité&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Par environnement, entendons au sens large tout ce qui m’entoure, avec qui je bosse, avec quels outils, et où je suis installé.&lt;br /&gt;&lt;br /&gt;Le meilleur type d’endroit dans lequel j’ai pu faire du développement a été :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un &lt;span style="font-weight: bold;"&gt;bureau dédié&lt;/span&gt; qui ne soit pas partagé avec des collègues,&lt;/li&gt;&lt;li&gt;disposant d’une &lt;span style="font-weight: bold;"&gt;grande fenêtre&lt;/span&gt; — en fait une baie vitrée sur deux niveaux donnant sur l’Océan Atlantique,&lt;/li&gt;&lt;li&gt;travaillant avec une équipe de « &lt;span style="font-weight: bold; font-style: italic;"&gt;smart guys&lt;/span&gt; », jeunes ou moins jeunes,&lt;/li&gt;&lt;li&gt;dans des locaux donnant accès à une &lt;span style="font-weight: bold;"&gt;bibliothèque&lt;/span&gt; interne, à une salle de repos, à des lieux informels de relaxation et de discussion  (poufs bienvenus),&lt;/li&gt;&lt;li&gt;donnant accès à un &lt;span style="font-weight: bold;"&gt;tableau  partagé &lt;/span&gt;où chacun peut noter ses idées,&lt;/li&gt;&lt;li&gt;avec une &lt;span style="font-weight: bold;"&gt;connexion internet&lt;/span&gt; haut débit (si, si, il faut le préciser),&lt;br /&gt;&lt;/li&gt;&lt;li&gt;et un &lt;span style="font-weight: bold;"&gt;réseau local performant &lt;/span&gt;(ou une solution « &lt;span style="font-style: italic;"&gt;on the cloud&lt;/span&gt; ») pour le partage occasionnel de fichiers — la grande majorité des échanges se faisant par le SCM.&lt;/li&gt;&lt;/ul&gt;Toujours à titre personnel, le meilleur poste de travail comprenait :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un fauteuil de qualité (&lt;a href="http://www.ikea.com/fr/fr/catalog/products/40103100"&gt;Markus&lt;/a&gt;, &lt;span style="font-style: italic;"&gt;anyone?&lt;/span&gt;),&lt;/li&gt;&lt;li&gt;une immense &lt;span style="font-weight: bold;"&gt;table&lt;/span&gt; (enfin, à l’époque elle me paraissait immense…),&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;deux machines&lt;/span&gt; puissantes avec écran et clavier, dont une avec un ecran plat 20’’,&lt;/li&gt;&lt;li&gt;pour le choix des systèmes d’exploitation, dans l’ordre : MacOS X, Windows 2000, Windows XP, Ubuntu,&lt;/li&gt;&lt;li&gt;et un &lt;span style="font-weight: bold;"&gt;téléphone&lt;/span&gt; fixe avec haut-parleur, avec accès au national et à l’international.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;On peut aussi faire son marché dans la liste de Calacanis : &lt;a href="http://www.calacanis.com/2008/03/07/how-to-save-money-running-a-startup-17-really-good-tips/"&gt;How to save money running a startup (17 really good tips)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Divers outils en coulisses qu’on ne présente plus :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un &lt;span style="font-weight: bold;"&gt;SCM&lt;/span&gt; propre, comme Subversion,&lt;/li&gt;&lt;li&gt;un  &lt;span style="font-weight: bold;"&gt;wiki&lt;/span&gt; propre, comme Confluence,&lt;/li&gt;&lt;li&gt;une plate-forme de &lt;span style="font-weight: bold;"&gt;blogging&lt;/span&gt; interne (en général, la même plate-forme offre le wiki et le blogging ; c’est le cas  de Confluence),&lt;/li&gt;&lt;li&gt;un &lt;span style="font-weight: bold;"&gt;bug tracker&lt;/span&gt; propre, comme Jira,&lt;/li&gt;&lt;li&gt;une solution interne de &lt;span style="font-weight: bold;"&gt;messagerie instantanée&lt;/span&gt;, comme Jabber,&lt;/li&gt;&lt;li&gt;et une plate-forme d’&lt;span style="font-weight: bold;"&gt;intégration continue&lt;/span&gt; propre, comme Continuum.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Parmis les outils logiciels, toujours pour ma partie, citons les plus importants :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Java 5&lt;/span&gt; ou ultérieur,&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Maven 2&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;un &lt;span style="font-weight: bold;"&gt;IDE&lt;/span&gt;, comme Eclipse 3.3.2&lt;/li&gt;&lt;li&gt;une panoplie de navigateurs web, dont &lt;span style="font-weight: bold;"&gt;Firefox&lt;/span&gt; 2.0.0, Mozilla et &lt;span style="font-weight: bold;"&gt;Opera&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;un éditeur de textes, comme TextWrangler, Crimson Editor ou UltraEdit&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;YAML&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;XML&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;XSLT&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;De plus, il est important de savoir investir dans des &lt;span style="font-weight: bold;"&gt;outils maison&lt;/span&gt;. Un bon outil maison est un outil qui n’est pas indispensable techniquement (surtout pas d’adhérence à la technologie !) et qui fait gagner des jours de charge.&lt;br /&gt;Les contre-exemples bien connus sont :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;les framework maisons monolithiques auxquels le &lt;span style="font-style: italic;"&gt;legacy &lt;/span&gt;est fortement couplé  &lt;/li&gt;&lt;li&gt;les outils maisons difficiles d’utilisation : mal documentés, qui gèrent mal les erreurs, pas ergonomiques, etc.&lt;/li&gt;&lt;/ul&gt;Le summum étant je pense les outils développeés en interne qui se révèlent moins bons que les solutions gratuites strictement équivalentes.&lt;br /&gt;Attention, ce genre d’initiative freine la productivité non seulement en terme d’outillage pur, mais également en minant la motivation des équipes, car l’image de la boîte renvoyée en interne n’est pas bonne.&lt;br /&gt;&lt;br /&gt;Je cite mes outils maison préférés jusqu’ici :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;plugins Maven de &lt;span style="font-weight: bold;"&gt;génération de code&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;outil de rendu dynamique de JSP/JSF &lt;span style="font-weight: bold;"&gt;sans déploiement &lt;/span&gt;(et ne me parlez pas de Tomcat dans Eclipse, ou de JBoss qui redéploie en autonome)&lt;/li&gt;&lt;li&gt;plugins Maven de tests de design web&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Et la décoration du bureau ? Et la musique ? Et le &lt;span style="font-style: italic;"&gt;Feng Shui &lt;/span&gt;? À creuser…&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;1.2. Un environnement qui ne gêne pas l’activité&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il faut laisser la place aux bons points qu’on a vus précédemment d’être utiles.&lt;br /&gt;&lt;br /&gt;Ainsi, on évitera, et je parle là de &lt;span style="font-weight: bold;"&gt;seuils d’acceptabilité&lt;/span&gt; :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;le bureau où on est 5 dans lequel parle à voix haute (je rappelle que je parle de &lt;span style="font-style: italic;"&gt;développement&lt;/span&gt;. De tels bureaux peuvent être utiles pour d’autres choses),&lt;br /&gt;&lt;/li&gt;&lt;li&gt;les &lt;span style="font-style: italic;"&gt;open spaces&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;le bureau sans lumière extérieure,&lt;/li&gt;&lt;li&gt;l’équipe de neuneus (oui, je sais, on est toujours le neuneu de quelqu’un),&lt;/li&gt;&lt;li&gt;la société qui n’affiche pas un intérêt évident à investir dans des livres, dans des serveurs ou dans des formations,&lt;/li&gt;&lt;li&gt;l’absence ou la restriction d’accès à internet,&lt;/li&gt;&lt;li&gt;le poste de travail sous-dimensionné,&lt;/li&gt;&lt;li&gt;la société où l’on ne peut pas capitaliser la connaissance dans une base ouverte, partagée, pratique d’utilisation et indexée,&lt;/li&gt;&lt;li&gt;la société où l’on ne communique pas librement (oui, je sais, c’est le Moyen Âge, mais ça existe encore),&lt;/li&gt;&lt;li&gt;les projets techniques sans phase d’investissement dans l’outillage technique : il faut savoir gérer les effets de seuil.&lt;/li&gt;&lt;li&gt;les projets Java en-deçà de Java 5&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;En termes d’outils, je ne peux que souscrire à la liste de Pierre-Olivier Carles : &lt;a href="http://www.pocarles.com/2008/03/10-conseils-pou.html"&gt;10 conseils pour conjuguer Innovations, Internet &amp;amp; Efficacité&lt;/a&gt;, en retenant pour ma part :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bloquer les e-mails entre 8 h 00 et 14  h 00&lt;/li&gt;&lt;li&gt;Trier ses flux RSS&lt;/li&gt;&lt;li&gt;Bloquer Skype et Twitter  (très difficile) sur certaines plages temporelles&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Souffrant d’électro-hyper-sensibilité (EHS), &lt;span style="font-weight: bold;"&gt;l’absence de téléphone portable et de Wi-Fi &lt;/span&gt;est cruciale pour moi si je veux pouvoir réfléchir normalement. Cela me restreint d’emblée l’accès à un bon nombre de locaux, mais ce type de discernement est tout le sujet de ce &lt;span style="font-style: italic;"&gt;post&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Et la décoration du bureau ? Et la musique ? Et le &lt;span style="font-style: italic;"&gt;Feng Shui &lt;/span&gt;? À creuser également…&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;2.1. Avoir envie de bosser&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bah, ce n’est pas compliqué : il faut et il suffit d’être convaincu du résultat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;2.2. Le bon moment&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Entre quatre heures et huit heures du matin, je suis en général trois fois plus rapide et efficace qu’après neuf  heures du soir…&lt;br /&gt;&lt;br /&gt;À huit heures, c’est le journal…&lt;br /&gt;&lt;br /&gt;À midi, la faim se fait sentir, donc je réfléchis mieux…&lt;br /&gt;&lt;br /&gt;Après le repas, sans sieste je passe trois heures à ne pas démarrer…&lt;br /&gt;&lt;br /&gt;À 18 h 00, ça stagne… Pour baisser en général vers 19 h 00…&lt;br /&gt;&lt;br /&gt;À environnement idéal (en dormant au boulot, donc !), je pourrais donner la courbe de productivité suivante :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/R9es58-fZaI/AAAAAAAAABk/R0ObOWlMzc4/s1600-h/schema-productivite.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/R9es58-fZaI/AAAAAAAAABk/R0ObOWlMzc4/s320/schema-productivite.png" alt="" id="BLOGGER_PHOTO_ID_5176796408306427298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Noter que je passe sur les problématiques de fatigue installée, de stress, etc. Tout ce qui constitue la moitié basse de la &lt;a href="http://fr.wikipedia.org/wiki/Pyramide_des_besoins"&gt;Pyramide de Maslow&lt;/a&gt; doit évidemment être réglé.&lt;br /&gt;&lt;br /&gt;Cela étant dit, dans une journée la productivité n’est pas constante. Il faut connaître et utiliser les &lt;span style="font-weight: bold;"&gt;bons moments&lt;/span&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Il est inefficace de travailler quand le moment « n’y est pas »&lt;/li&gt;&lt;li&gt;Il est inefficace de ne pas travailler quand c’est le moment&lt;/li&gt;&lt;/ul&gt;Pour un article radical sur le bon emploi de son temps, et qui va bien plus loin que le bête sujet de la productivité, lire chez Paul Graham : &lt;a href="http://www.paulgraham.com/procrastination.html"&gt;Good and Bad Procrastination&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;2.3. Savoir ce qu’il y a à faire&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La concentration (notions de &lt;span style="font-weight: bold; font-style: italic;"&gt;focus&lt;/span&gt; et de &lt;span style="font-style: italic;"&gt;flow&lt;/span&gt;) est indissociable de la productivité.&lt;br /&gt;&lt;br /&gt;À ce titre, il est crucial que la &lt;span style="font-style: italic;"&gt;TODO-List&lt;/span&gt;, la liste des tâches à faire (par extension, l’ensemble des &lt;span style="font-style: italic;"&gt;backlogs &lt;/span&gt;de Scrum par exemple) soit claire et affichée. Utiliser un outil informatique ou un cahier ne suffit pas. Pour les tâches du quotidien, un &lt;span style="font-weight: bold;"&gt;affichage mural &lt;/span&gt;est bien plus efficace.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;2.4. Être « motivé » par le feedback qu’on reçoit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;C’est un point important dans l’efficacité.&lt;br /&gt;&lt;br /&gt;D’abord, comment savoir qu’on maintient le cap ? Qu’on a le sens des priorités ? On peut en effet être très concentré, très « productif » sur des menus détails, et laisser tomber des pans de l’activité. Pour cela, la &lt;span style="font-style: italic;"&gt;TODO-List&lt;/span&gt;, ou les fameux &lt;span style="font-style: italic;"&gt;backlogs&lt;/span&gt; de la méthode Scrum sont utiles.&lt;br /&gt;&lt;br /&gt;En parlant de Scrum, les &lt;span style="font-style: italic;"&gt;dailys scrums&lt;/span&gt;,  lors desquelles  toute l’équipe se réunit debout une demi-heure pour présenter les choses faites, le reste à faire et les problèmes rencontrés, représentent un gain redoutable tant pour la productivité individuelle que collective (notion de &lt;span style="font-style: italic;"&gt;gel&lt;/span&gt;). La productivité en équipe n’est cependant pas le sujet de cet article.&lt;br /&gt;&lt;br /&gt;Ensuite, il faut savoir juger ce qu’on produit. C’est aussi une façon de maintenir le cap. Et c’est encore une question de priorités : savoir identifier ce qui est important dans le produit réalisé, afin de se concentrer dessus.&lt;br /&gt;Il s’agit d’un ensemble d’indicateurs, dont aucun n’est à négliger. Ils devraient même à mon sens avoir le même coefficient, avec seuils planchers éliminatoires :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Les &lt;span style="font-style: italic;"&gt;feedbacks&lt;/span&gt; des utilisateurs (organiser des &lt;span style="font-weight: bold;"&gt;démonstrations&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Les &lt;span style="font-style: italic;"&gt;feedbacks&lt;/span&gt; des « pairs » (&lt;span style="font-style: italic;"&gt;peer reviews&lt;/span&gt;) (&lt;span style="font-style: italic;"&gt;idem&lt;/span&gt;, et rédiger des &lt;span style="font-weight: bold;"&gt;bilans&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;La qualité interne du produit (&lt;span style="font-weight: bold;"&gt;audits automatisés&lt;/span&gt; réguliers)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Ces différents &lt;span style="font-style: italic;"&gt;feedbacks&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;backlogs &lt;/span&gt;et indicateurs, sont bien des moteurs de « motivation », au sens où sans eux il est très facile de rester enkysté dans un axe de développement donné. Même s’il produit du code, et semble rassurant par certains aspects, cet immobilisme est forcément nocif, et au niveau de la productivité sera à terme destructeur. La remise en question, donc l’écoute des avis extérieurs, est un élément indirect mais fondamental de la motivation.&lt;br /&gt;&lt;br /&gt;Enfin, il y a un &lt;span style="font-style: italic;"&gt;feedback &lt;/span&gt;capital dans la productivité, c’est celui qu’on apporte soi-même. Passer du temps à bloguer en interne ce qu’on a fait dans la journée, à formaliser telle procédure, tel outil, telles spécifications même incomplètes… Bloguer ses pratiques, bloguer ses configurations, alimenter les &lt;span style="font-style: italic;"&gt;bug trackers &lt;/span&gt;et les &lt;span style="font-style: italic;"&gt;backlogs&lt;/span&gt;… On en retire :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;une capitalisation du savoir (non ? Sans blague ?),&lt;/li&gt;&lt;li&gt;une pratique de la formalisation&lt;/li&gt;&lt;li&gt;une réflexion en tâche de fond, et une habitude de communiquer,&lt;/li&gt;&lt;li&gt;un recueil incrémental des problèmes et des solutions&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Passons rapidement sur l’aspect évidemment pratique de faire vivre une telle base de connaissance.&lt;br /&gt;&lt;br /&gt;En terme de productivité de développement, c’est utile car on y gagne en recul, donc d’acuité, donc de pertinence… donc de productivité.&lt;br /&gt;&lt;br /&gt;On a vu l’importance de la concentration (&lt;span style="font-style: italic;"&gt;focus&lt;/span&gt;) : il faut donc éviter le trop-plein de &lt;span style="font-style: italic;"&gt;feedbacks &lt;/span&gt;qui mènent à la distraction voire à la dispersion. C’est tout l’objet de ce point : à mon avis le &lt;span style="font-style: italic;"&gt;feedback &lt;/span&gt;doit être &lt;span style="font-weight: bold;"&gt;motivant&lt;/span&gt;, bien qu’il soit parfois laudateur ou critique. Motivant, c’est-à-dire qu’on ne doit pas le chercher pour lui-même mais pour l’effet qu’il aura sur l’activité.&lt;br /&gt;&lt;br /&gt;C’est aussi pour cela que je parle de « détermination propre » au lieu de « détermination extérieure » pour le &lt;span style="font-style: italic;"&gt;feedback&lt;/span&gt; : ce qui compte pour la productivité c’est ce que j’en fais moi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Bonus : 3. Ce qui n’apporte rien&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Grande question : que fait-on des outils suivants ? Sont-ils des facilitations de productivité pour le développement ?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Twitter&lt;/li&gt;&lt;li&gt;Blogs publics (via des flux RSS)&lt;/li&gt;&lt;li&gt;Comptes publics de messagerie instantanée (Skype…)&lt;/li&gt;&lt;li&gt;Facebook (que je ne connais pas assez)&lt;/li&gt;&lt;li&gt;E-mail&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;À mon sens, ces outils, dont j’aurais bien du mal à me passer, notamment Twitter avec twhirl, maintiennent un certain éveil, une certaine acuité. Ils nous permettent d’apporter, de recevoir, de nous ouvrir, ils participent de la confiance et de l’estime.&lt;br /&gt;&lt;br /&gt;Seulement, en terme de pure productivité, l’élément important est l’acuité. Ainsi, se concentrer quatre heures sur un bouquin ou une doc en ayant éteint tous ces outils, sera plus profitable &lt;span style="font-style: italic;"&gt;à un moment donné &lt;/span&gt;que fureter sur le même sujet sur internet. Il ne faut pas gérer sa productivité uniformément, mais selon les caps à franchir.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La productivité s’appuie sur un environnement, des outils et des pratiques, et est liée par &lt;span style="font-style: italic;"&gt;feedback &lt;/span&gt;à la motivation (&lt;span style="font-style: italic;"&gt;feedback &lt;/span&gt;dans les deux sens). Elle peut être favorisée ou handicapée par la nature de ces différents éléments. Les éléments &lt;span style="font-weight: bold;"&gt;en gras &lt;/span&gt;ci-dessus constituent une &lt;span style="font-style: italic;"&gt;check-list &lt;/span&gt;empirique d’éléments à prendre en considération.&lt;br /&gt;&lt;br /&gt;La productivité se jauge continuellement. Outre la quantité de travail abattue, un signe de bonne productivité et d’efficacité est l’agilité.&lt;br /&gt;&lt;br /&gt;Encore une fois, tout cela vaut comme mon avis personnel. Si vous avez des réflexions ou des pointeurs sur le même sujet, je serai heureux d’en discuter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6397456882369663879?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6397456882369663879/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6397456882369663879' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6397456882369663879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6397456882369663879'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/pour-une-check-list-de-productivit.html' title='Pour une check-list de productivité'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kKYRIZmegcw/R9es58-fZaI/AAAAAAAAABk/R0ObOWlMzc4/s72-c/schema-productivite.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8419976519192586102</id><published>2008-03-10T21:57:00.002+01:00</published><updated>2008-12-09T04:40:53.958+01:00</updated><title type='text'>Simplicité, deuxième</title><content type='html'>Que voit-on à l'entrée de votre entreprise ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/R9WhJc-fZZI/AAAAAAAAABc/Ov-mAGW46ds/s1600-h/0132_d9e8_390.jpeg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/R9WhJc-fZZI/AAAAAAAAABc/Ov-mAGW46ds/s320/0132_d9e8_390.jpeg" alt="" id="BLOGGER_PHOTO_ID_5176220530501445010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;À ma gauche, &lt;span style="font-style: italic;"&gt;1, Infinite Loop &lt;/span&gt;(Apple). À ma droite...&lt;br /&gt;&lt;br /&gt;Je trouve ça excellent.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Via&lt;/span&gt; &lt;a href="http://sanji.soup.io/post/1572094/Les-entr-es-en-disent-long"&gt;Sanji&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8419976519192586102?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8419976519192586102/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8419976519192586102' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8419976519192586102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8419976519192586102'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/simplicit-deuxime.html' title='Simplicité, deuxième'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kKYRIZmegcw/R9WhJc-fZZI/AAAAAAAAABc/Ov-mAGW46ds/s72-c/0132_d9e8_390.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6551670839136295014</id><published>2008-03-10T09:19:00.003+01:00</published><updated>2008-03-10T09:54:40.290+01:00</updated><title type='text'>Blog sur Garonne, 4 mars 2008</title><content type='html'>Bon ben oui, j'y étais, à l'édition de mardi dernier de &lt;a href="http://www.blogsurgaronne.com/"&gt;Blog sur Garonne&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;C'était évidemment à Toulouse, au « Sur Mesure », anciennement appelé le « Chez Nous ».&lt;br /&gt;&lt;br /&gt;On était quoi ? 20 ? 25 ? Dans le petit espace, c'était assez chaleureux. L'ambiance était cool et... jeune.&lt;br /&gt;&lt;br /&gt;Allez, un peu de &lt;span style="font-style: italic;"&gt;name dropping&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;J'y ai discuté avec plusieurs personnes, mais pas tous les présents ! On a pas mal parlé avec Xavier, qui semble très actif sur tel blog politique (UMP). Adresse = ?. J'ai pu revoir avec plaisir &lt;a href="http://www.petitdeviendragrand.com/"&gt;Maxime Garrigues&lt;/a&gt; (rencontré au Déjeuner sur web 2.0) qui comme d'hab' déchire. &lt;a href="http://www.cedricgiorgi.com/"&gt;Cédric Giorgi&lt;/a&gt;. Benoît Ramus, de &lt;a href="http://www.netocean.fr/"&gt;NetOcéan&lt;/a&gt;, m'a parlé des deux versions de sa boutique &lt;a href="http://www.boatiful.com/"&gt;Boatiful&lt;/a&gt;, version e-commerce et version vraie boutique toulousaine. J'ai trouvé la démarche logique et excellente. Bien, de voir des projets qui grandissent. &lt;a href="http://gbeuvelot.typepad.com/"&gt;Guillaume Beuvelot&lt;/a&gt; (&lt;a href="http://www.pme-performance.com/"&gt;PME Performance&lt;/a&gt;), était là aussi... Ah, et je n'ai fait que croiser &lt;a href="http://www.pocarles.com/"&gt;Pierre-Olivier Carles&lt;/a&gt;, de &lt;a href="http://www.foolinvest.com/"&gt;FoolInvest&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Cette soirée était vraiment sympa. Les gars ont un très bon état d'esprit. Conquérant, positif, beaucoup d'écoute. On sent très bien le côté « ce que tu m'apprends m'enrichis ». Et le respect. La pratique des blogs est civilisatrice, par définition.&lt;br /&gt;&lt;br /&gt;Côté réseautage, je pense que sans téléphone portable / iPhone / Wi-Fi / MacBook Air en poche, je vais encore avoir à échanger quelques cartes de visite papier. C'est d'ailleurs parfois ce qui convient le mieux, car dans l'histoire de la relation ça fait un point d'entrée fixe pour se retrouver, contrairement au nuage de blogs / recherches Google / profils Ziki / MyBlogLog / CopainsDavant / groupes Facebook, etc.&lt;br /&gt;&lt;br /&gt;C'est marrant, après ce genre de rencontres on va davantage faire du &lt;span style="font-style: italic;"&gt;Follow &lt;/span&gt;sur Twitter, éventuellement du lien sur FaceBook (pas mon truc cependant), que faire des mises en relation Viadeo ou LinkedIn. Et suivre directement les liens RSS avec un agrégateur ? &lt;span style="font-style: italic;"&gt;It's so 2004&lt;/span&gt;... Pour le suivi &lt;span style="font-style: italic;"&gt;live&lt;/span&gt; de la présence numérique au sein de cette génération, Twitter gagne haut la main. Enfin, disons que c'est vrai pour 2008 Q1 &lt;span style="font-family: courier new;"&gt;;-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6551670839136295014?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6551670839136295014/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6551670839136295014' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6551670839136295014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6551670839136295014'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/03/blog-sur-garonne-4-mars-2008.html' title='Blog sur Garonne, 4 mars 2008'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-7412951419561052334</id><published>2008-02-29T08:10:00.002+01:00</published><updated>2008-02-29T08:18:15.079+01:00</updated><title type='text'>SigmaT 5 : Scrum et méthodes agiles à Toulouse</title><content type='html'>Vendredi 28 mars 2008 prochain aura lieu le 5e séminaire « SigmaT ». Il s'agit d'une rencontre sur Toulouse d'acteurs des méthodologies agiles, comme Scrum ou XP. Cette session se focalisera sur les retours d'expérience.&lt;br /&gt;&lt;br /&gt;Cela se déroule à l'Université Paul Sabatier, et ça commence à 16 h 00.&lt;br /&gt;&lt;br /&gt;Voir des détails ici :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.aubryconseil.com/dotclear/index.php/2008/02/27/381-des-retours-d-experience-pour-le-sigmat5"&gt;sur le blog de Claude Aubry&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tcros.blogspot.com/2008/02/vendredi-28-mars-2008-sminaire.html"&gt;sur le blog de Thierry Cros&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.aubryconseil.com/dotclear/index.php/2008/02/13/376-bientot-le-sigmat5"&gt;présentation sur le blog de Claude Aubry&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;J'avais assisté au SigmaT 4 le 14 décembre dernier, dont le thème était « le &lt;span style="font-style: italic;"&gt;feedback&lt;/span&gt; ». C'était décontracté et assez intéressant, notamment le retour d'expérience d'une équipe des laboratoire Pierre Fabre sur la mise en place d'une méthodologie « agile », c'est-à-dire itérative, avec des contacts appuyés avec la MOA, et une acceptation d'entrée de jeu que le scope fonctionnel sera susceptible d'évoluer en cours de projet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-7412951419561052334?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/7412951419561052334/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=7412951419561052334' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7412951419561052334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7412951419561052334'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/02/sigmat-5-scrum-et-mthodes-agiles.html' title='SigmaT 5 : Scrum et méthodes agiles à Toulouse'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-1933459552775723783</id><published>2008-02-27T19:09:00.004+01:00</published><updated>2008-12-09T04:41:32.597+01:00</updated><title type='text'>N'oublions pas les backups</title><content type='html'>Tâche basique pour un informaticien, les sauvegardes, ou &lt;span style="font-style: italic;"&gt;backups&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Voici par exemple une photo de ce qui reste d'un disque dur après une grosse grosse panne :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kKYRIZmegcw/R8Wn9xDef6I/AAAAAAAAABU/jDsOOA9Pgjk/s1600-h/P2250022.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_kKYRIZmegcw/R8Wn9xDef6I/AAAAAAAAABU/jDsOOA9Pgjk/s320/P2250022.JPG" alt="" id="BLOGGER_PHOTO_ID_5171724426686660514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Le reste des photos est ici : &lt;a href="http://www.neowin.net/forum/index.php?showtopic=622101"&gt;&lt;span style="font-style: italic;"&gt;Worst hard crash I've seen&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Et quand on obtient sa sauvegarde, il est urgent de vérifier qu'elle fonctionne, c'est-à-dire qu'on saura bien réinstaller les données à partir d'icelle.&lt;br /&gt;&lt;br /&gt;Que celui qui n'a jamais été confronté à un &lt;span style="font-style: italic;"&gt;backup &lt;/span&gt;vide ou inutilisable fasse comme si &lt;span style="font-family:courier new;"&gt;;-)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;En bon intégriste de l'intégration continue, cela signifie pour moi dédier une machine à la restauration automatique et quotidienne de &lt;span style="font-style: italic;"&gt;backups&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Et vous ?...&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-1933459552775723783?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/1933459552775723783/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=1933459552775723783' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1933459552775723783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1933459552775723783'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/02/noublions-pas-les-backups.html' title='N&apos;oublions pas les backups'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kKYRIZmegcw/R8Wn9xDef6I/AAAAAAAAABU/jDsOOA9Pgjk/s72-c/P2250022.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6933793257291756412</id><published>2008-02-26T07:11:00.003+01:00</published><updated>2008-02-26T07:20:15.455+01:00</updated><title type='text'>Terre végétale</title><content type='html'>J'ai appris hier que lorsqu'il a fait construire il y a quelques années en tant qu'investissements locatifs les 6 maisons qui composent la résidence que j'habite, mon propriétaire a fait emporter la terre végétale qui se trouvait sur cet ancien champ, l'a vendue, et a fait déverser à la place du remblai... Moins cher, donc.&lt;br /&gt;&lt;br /&gt;Ansi, en cherchant à y faire pousser des carottes, vous tomberez non sur des taupes, mais sur des morceaux de tuiles, de la mauvaise terre et de la caillasse.&lt;br /&gt;&lt;br /&gt;Ainsi, en cherchant à y faire pousser du gazon, vous n'obtiendrez qu'une sorte de pelade verdâtre.&lt;br /&gt;&lt;br /&gt;En revanche, les équipements internes à la maison, notamment le chauffage et la salle de bains, paraissent tout ce qu'il y a de plus modernes.&lt;br /&gt;&lt;br /&gt;Je suis atterré, c'est le cas de le dire.&lt;br /&gt;&lt;br /&gt;D'autant plus que ce que j'y fais pousser moi y grandit effectivement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6933793257291756412?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6933793257291756412/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6933793257291756412' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6933793257291756412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6933793257291756412'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/02/terre-vgtale.html' title='Terre végétale'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6549015210732132798</id><published>2008-01-25T07:34:00.001+01:00</published><updated>2008-01-25T07:44:08.638+01:00</updated><title type='text'>Déjeuner sur web 2.0 à Toulouse le 15 février 2008</title><content type='html'>Le premier des rendez-vous toulousains-zet-bimestriels de « Déjeuner sur web », organisés par &lt;a href="http://www.meleenumerique.com/"&gt;la Mêlée Numérique&lt;/a&gt;, &lt;a href="http://www.petitdeviendragrand.org/"&gt;PetitDeviendraGrand&lt;/a&gt; (voir aussi &lt;a href="http://www.petitdeviendragrand.com/"&gt;le blog de Maximes Garrigues&lt;/a&gt;) et le Samsara.&lt;br /&gt;&lt;br /&gt;Vendredi 15 février 2008. Les détails par ici : &lt;a href="http://www.meleenumerique.com/annexeven/autres/2008/dejeuner-sur-web/dejeuner-sur-web.html"&gt;Déjeuner sur web&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le nombre de places est limité à 40 !??? Suivons ce point avec attention...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6549015210732132798?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6549015210732132798/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6549015210732132798' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6549015210732132798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6549015210732132798'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/01/djeuner-sur-web-20-toulouse-le-15.html' title='Déjeuner sur web 2.0 à Toulouse le 15 février 2008'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-1706801497783638879</id><published>2008-01-23T07:20:00.000+01:00</published><updated>2008-12-09T04:41:33.077+01:00</updated><title type='text'>Mac vs. PC</title><content type='html'>Une image très frappante chez Fred Cavazza : &lt;a href="http://www.fredcavazza.net/2008/01/23/les-acheteurs-de-mac-repondraient-ils-a-des-simuli-differents/"&gt;Les acheteurs de Mac répondraient-ils à des stimuli différents ?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/R5bguz1LCTI/AAAAAAAAABM/PL1iV-t7_J8/s1600-h/MS_Mac_Mouse.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/R5bguz1LCTI/AAAAAAAAABM/PL1iV-t7_J8/s200/MS_Mac_Mouse.jpg" alt="" id="BLOGGER_PHOTO_ID_5158557517991315762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;À gauche, le packaging pour les possesseurs de PC, pimpant et chargé. &lt;span style="font-style: italic;"&gt;Buy me, I'm from Microsoft&lt;/span&gt;. À droite, le packaging de la même souris, mais pour les Macounets. Sobre. &lt;span style="font-style: italic;"&gt;You know you want me.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Je rencontre quotidiennement des débats de type Mac &lt;span style="font-style: italic;"&gt;vs.&lt;/span&gt; PC, et pas uniquement dans l'informatique :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;productivité et prix élevé &lt;span style="font-style: italic;"&gt;vs. &lt;/span&gt;omniprésence et connaissance par tous ?&lt;/li&gt;&lt;li&gt;investissement à long terme &lt;span style="font-style: italic;"&gt;vs. &lt;/span&gt;consommable ?&lt;/li&gt;&lt;li&gt;exigence &lt;span style="font-style: italic;"&gt;vs. &lt;/span&gt;tout-venant ? (là, j'ai fait mon choix)&lt;/li&gt;&lt;li&gt;complexité et richesse &lt;span style="font-style: italic;"&gt;vs. &lt;/span&gt;limitation conceptuelle ?&lt;/li&gt;&lt;li&gt;souci du détail &lt;span style="font-style: italic;"&gt;vs. &lt;/span&gt;finition grossière ? (pour en revenir à l'informatique, on ne peut pas dire que MacOS X tranche autant que MacOS classique sur le sujet)&lt;/li&gt;&lt;li&gt;ergonomie &lt;span style="font-style: italic;"&gt;vs. &lt;/span&gt;marketing ? (là, j'ai fait mon choix)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;achat d'un produit dans lequel on s'investit &lt;span style="font-style: italic;"&gt;vs. &lt;/span&gt;consommation ?&lt;/li&gt;&lt;/ul&gt;Mine de rien, pour une entreprise, ce sont là des questions de valeurs. Ce sont ces choix préalables qui déterminent les coups de volant qu'on donne dans certaines circonstances.&lt;br /&gt;&lt;br /&gt;Cela me rappelle un autre rapprochement saisissant de deux images qui proviennent de deux cultures : &lt;a href="http://jamesfallows.theatlantic.com/archives/2007/11/the_way_vs_a_way_japan_v_china.php"&gt;"The" way vs "a" way (Japan v China dept).&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Des techniciens japonais qui font le plein d'un avion, en costumes et avec le petit coussin pour ne pas tacher :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/R5bftj1LCRI/AAAAAAAAAA8/sFu093zi7Q0/s1600-h/IMG_4476A.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/R5bftj1LCRI/AAAAAAAAAA8/sFu093zi7Q0/s200/IMG_4476A.jpg" alt="" id="BLOGGER_PHOTO_ID_5158556397004851474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;... Et des Chinois, qui y vont au siphonnage et à l'entonnoir :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kKYRIZmegcw/R5bf6D1LCSI/AAAAAAAAABE/cEad-v5a6ns/s1600-h/IMG_0969.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_kKYRIZmegcw/R5bf6D1LCSI/AAAAAAAAABE/cEad-v5a6ns/s200/IMG_0969.jpg" alt="" id="BLOGGER_PHOTO_ID_5158556611753216290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Il y aurait des choses à noter sur ces débats, qui je le répète, peuvent être quotidiens.&lt;br /&gt;&lt;br /&gt;Ainsi, j'ai remarqué que souvent le choix pour ou contre l'exigence, se ramène à un arbitrage entre sujet et objet : qui décide ? Moi ? ou l'environnement ? Achetè-je un ordinateur pour être productif moi, ou pour bosser comme tout le monde ? Vais-je en vacances là où je vais prendre du plaisir moi, où là où vont tous les autres ? Au résultat, ça ne change pas forcément la destination ou l'objet acheté. Mais la motivation est tout autre. Et donc la vie.&lt;br /&gt;&lt;br /&gt;D'ailleurs c'est drôle car en matière d'écologie on parle souvent d'« environnement », mais c'est justement le contraire : les choix pro-écologie dépendent de &lt;span style="font-style: italic;"&gt;Moi&lt;/span&gt;, et &lt;span style="font-style: italic;"&gt;non &lt;/span&gt;de l'environnement : je ne peux pas attendre de l'environnement qu'il me pousse malgré moi à agir de façon écologique.&lt;br /&gt;&lt;br /&gt;Il ne faut d'ailleurs pas confondre avec le lâcher-prise, où on laisse les choses se faire... tout en les faisant ! C'est bien nous qui nous mettons dans le sens des choses.&lt;br /&gt;&lt;br /&gt;Autre point que j'ai remarqué : choisir l'exigence, la qualité, coûte plus cher sur le court terme. Le calcul à long terme ne souffre pas la discussion, mais à court terme... Mazette ! Un Mac coûte parfois 6 foix le prix du PC chez Leclerc. Cela s'explique entre autres par le fait qu'on ne s'investit pas du tout de la même façon dans l'un et dans l'autre : les configurations comparées ne sont absolument pas équivalentes. Personnellement j'achète dans un PC, d'abord la disponibilité immédiate, ensuite le fait de ne &lt;span style="font-style: italic;"&gt;pas &lt;/span&gt;m'attacher.&lt;br /&gt;&lt;br /&gt;Avec le tout-venant on gagne du temps, ce qui permet de se recentrer sur ses exigences :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-1706801497783638879?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/1706801497783638879/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=1706801497783638879' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1706801497783638879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1706801497783638879'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/01/mac-vs-pc.html' title='Mac vs. PC'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kKYRIZmegcw/R5bguz1LCTI/AAAAAAAAABM/PL1iV-t7_J8/s72-c/MS_Mac_Mouse.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-4432453486913955276</id><published>2008-01-19T02:12:00.000+01:00</published><updated>2008-01-19T02:45:22.160+01:00</updated><title type='text'>Google.org : Inform and Empower to Improve Public Services</title><content type='html'>&lt;a href="http://google.org/"&gt;Google.org&lt;/a&gt;, émanation de l'entreprise Google (vous savez, celle qui fait Google.com) dans le monde des organisations à but non lucratif,  vient de faire une communication sur 5 buts :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Prévoir et prévenir des évènements écologiques aussi bien que sociaux qui pourraient se transformer en désastre notamment en Asie du Sud-est et en Afrique Tropicale. Grippe aviaire et changements climatiques, entre autres&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Informer et responsabiliser pour améliorer les services publics.&lt;/span&gt; L’idée bien sûr est que si les citoyens en savent plus ils peuvent demander et obtenir un meilleur fonctionnement des institutions. C’est fondamental, notamment dans les pays où les services publics d’éducation et de santé, par exemple, sont pratiquement inexistants.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Stimuler les petites et moyennes entreprises. Elles sont essentielles à la croissance économique et à la création d’emplois, en particulier dans les pays en voie de développement.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Développement des énergies renouvelables pour qu’elles deviennent moins chères que le charbon: énergies solaire et éolienne entre autres.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Accélérer la commercialisation des véhicules rechargeables.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;p class="MsoNormal"&gt;&lt;span&gt;(Traduction trouvée &lt;a href="http://pisani.blog.lemonde.fr/2008/01/18/google-philanthropique/"&gt;chez Transnets&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Pour ma part j'ai toujours pensé que l'accès à l'information publique, la propagation de ladite information (que ce soit en &lt;span style="font-style: italic;"&gt;push &lt;/span&gt;ou en &lt;span style="font-style: italic;"&gt;pull&lt;/span&gt;), et surtout la discussion libre, facilitée, publique ou privée, bref, la réappropriation du &lt;span style="font-style: italic;"&gt;mythos&lt;/span&gt; par l'Agora, par opposition au soi-disant (&lt;span style="font-weight: bold;"&gt;soi&lt;/span&gt;-disant) &lt;span style="font-style: italic;"&gt;logos &lt;/span&gt;déversé par les &lt;span style="font-style: italic;"&gt;mass media&lt;/span&gt;, était une nécessité primordiale à, on pourrait dire une condition nécessaire pour, en quelque sorte une bête conséquence de, une saine existence de la démocratie, c'est-à-dire cet espace civil où le peuple se gouverne lui-même.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;J'ai toujours vu dans le pragmatisme et l'excellence technologiques de Google un potentiel nécessaire à l'émergence dans le champ public de ce levier informationnel que j'appelle de mes vœux.&lt;/p&gt;Pour préciser ma pensée, voici deux aspects de ce que cela sous-tend :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;le modèle économique actuel de Google fondé sur la publicité ne me paraît ni vertueux, ni reproductible à l'infini, ni pérenne. Certes c'est pratique en ce moment et apparemment pour longtemps encore. Mais... &lt;span style="font-style: italic;"&gt;Ils valent mieux que ça. &lt;/span&gt;(Pensons à 20 ans, 40 ans, un peu !).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;le fait qu'aujourd'hui des documents officiellement publics (certaines statistiques départementales, par exemple) fassent l'objet de la part des administrations françaises de rétention, de masquage, de refus de partage (vous allez rire : entre les différentes administrations elles-mêmes parfois), est contre-productif. Essayez d'obtenir la liste et la source des subventions reçues par les associations d'un département.&lt;br /&gt;Et il faudra une ampleur de vision et de moyens analogue à celle de Google pour rétablir le courant dans le bon sens.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class="MsoNormal"&gt;Grâce à la technologie, mais surtout grâce à une compréhension des gens (eh oui), Google a apporté plusieurs révolutions. J'en citerai deux, qui sont pour moi emblêmatiques :&lt;/p&gt;&lt;ul&gt;&lt;li&gt;la révolution dans la recherche dans les contenus. Google a permis de &lt;span style="font-style: italic;"&gt;penser &lt;/span&gt;une recherche « &lt;span style="font-style: italic;"&gt;full text&lt;/span&gt; » qui soit rapide et pertinente. Ils ont matérialisé le concept (avec plus ou moins de bonheur).&lt;br /&gt;C'était une  « bête » application technologique, mais comme de nombreux techniciens considéraient que ce n'était pas essentiel [aux utilisateurs], ils ne se sont tout simplement pas penchés sur le sujet.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google Earth et/ou Google Maps, c'est-à-dire la géographie courante dans les foyers, comme à une époque on y voyait arriver  l'eau courante. L'impact de Google Earth, cette banalisation d'une carte du monde &lt;span style="font-style: italic;"&gt;partagée&lt;/span&gt;, possiblement sans frontières (essayez un peu d'effacer les frontières sur une carte papier...), est immense.&lt;br /&gt;C'était une vraie attente de beaucoup de gens. Et s'il était légitime et logique que la technologie y répondît, il fallait de lourds moyens industriels, et par suite une vision précise pour les dédier à la solution.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Je ne pense pas que Google soit la panacée. Ainsi je pense qu'en démocratisant à ce point l'usage de la publicité (à des fins commerciales, ha ha, quelle surprise), ils vont exactement à l'opposé de ce qu'ils apportent sur un plan culturel par ailleurs ; je pense de nouveau à la géographie.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Je ne pense pas que Google soit la seule réponse possible.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Ce que je pense, c'est que Google met en musique des principes à la fois de &lt;span style="font-style: italic;"&gt;focus &lt;/span&gt;et d'ampleur de pensée. Et que certains problèmes vont se résoudre à l'aide de tels principes.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Pour soulever le monde, il faut un bon levier et... un bon point d'appui.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-4432453486913955276?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/4432453486913955276/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=4432453486913955276' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4432453486913955276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4432453486913955276'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2008/01/googleorg-inform-and-empower-to-improve.html' title='Google.org : Inform and Empower to Improve Public Services'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3311481644117025219</id><published>2007-12-19T20:58:00.000+01:00</published><updated>2007-12-19T21:06:56.983+01:00</updated><title type='text'>Hellotipi co-lauréat du concours kelblog</title><content type='html'>Je suis hyper content : &lt;a href="http://www.hellotipi.com/"&gt;Hellotipi&lt;/a&gt; va être accompagné par Pierre Chappaz (&lt;span style="font-style: italic;"&gt;start-up&lt;/span&gt; : Kelkoo). C'est génial. J'ai toujours trouvé l'idée bonne. J'ai toujours trouvé que MrBoo était très fort de tout faire tout seul, et d'avoir cet avancement équilibré. En termes de dynamisme et de rythme vu les moyens, c'est un projet de &lt;span style="font-style: italic;"&gt;start-up&lt;/span&gt; exemplaire.&lt;br /&gt;&lt;br /&gt;L'article de Pierre : &lt;a href="http://www.kelblog.com/2007/12/ebuzzing-et-hel.html"&gt;eBuzzing et Hellotipi vainqueurs du concours de Startups sur Kelblog!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;L'article de MrBoo : &lt;a href="http://www.mrboo.fr/2007/12/19/like-a-2/"&gt;Like a... Monday un peu particulier&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3311481644117025219?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3311481644117025219/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3311481644117025219' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3311481644117025219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3311481644117025219'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/12/hellotipi-co-laurat-du-concours-kelblog.html' title='Hellotipi co-lauréat du concours kelblog'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5618553141456254742</id><published>2007-12-04T17:50:00.000+01:00</published><updated>2007-12-04T17:51:40.640+01:00</updated><title type='text'>Here Comes Another Bubble</title><content type='html'>Yeah, baby!&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/fi4fzvQ6I-o&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/fi4fzvQ6I-o&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-5618553141456254742?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5618553141456254742/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5618553141456254742' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5618553141456254742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5618553141456254742'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/12/here-comes-another-bubble.html' title='Here Comes Another Bubble'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-4835180936037739557</id><published>2007-11-25T18:41:00.000+01:00</published><updated>2007-11-25T18:46:04.267+01:00</updated><title type='text'>GroupSpaces : Les Fûts ?</title><content type='html'>Je cite : &lt;a style="font-style: italic;" href="http://groupspaces.com/"&gt;GroupSpace&lt;/a&gt;&lt;span style="font-style: italic;"&gt; provides free web-based tools for clubs, societies, organisations or groups of friends or coworkers.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Pour certaines associations, ça a l'air suffisant.&lt;br /&gt;&lt;br /&gt;Certes, il n'y a pas l'aspect vitrine web (encore que quand je lis « &lt;span style="font-style: italic;"&gt;Improve your Google ranking&lt;/span&gt; »...), mais seulement l'aspect outillage de travail collaboratif.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-4835180936037739557?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/4835180936037739557/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=4835180936037739557' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4835180936037739557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4835180936037739557'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/11/groupspaces-les-fts.html' title='GroupSpaces : Les Fûts ?'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-4797667913862013965</id><published>2007-11-18T20:14:00.000+01:00</published><updated>2007-11-18T20:24:48.870+01:00</updated><title type='text'>Java et la productivité</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://crap.teurasporsaat.org/archive/5607.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://crap.teurasporsaat.org/archive/5607.jpg" alt="" 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/28966088-4797667913862013965?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/4797667913862013965/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=4797667913862013965' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4797667913862013965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/4797667913862013965'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/11/java-et-la-productivit.html' title='Java et la productivité'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8653244577487608954</id><published>2007-10-14T20:38:00.000+02:00</published><updated>2007-10-14T21:14:41.193+02:00</updated><title type='text'>La communication, pour quoi faire ?</title><content type='html'>Parfois dans une entreprise on n'estime pas bien la communication. On dit avoir d'autres préoccupations, on lâche quelques pourcents du budget à la communication puis on laisse courir. Après tout pourquoi la communication ne serait-elle pas un projet comme les autres ?&lt;br /&gt;&lt;br /&gt;Eeeh bien. Pour moi qui pense e-mail depuis 1992 et forums depuis 1999, qui décortique l'intérêt des protocoles et des outils dans cette pratique bêtement humaine, qui ne conçois de m'attacher un collaborateur que dans la mesure où il a la « communication chevillée au corps », la question n'a quasiment pas de sens. Certes les wikis, forums, blogs, et autres messageries instantanées constituent mon quotidien (au fait, qui utilise encore les e-mails ?) —  même si je fais aussi figure d'exception en n'ayant pas de téléphone portable —, mais ce qui est avant tout fondamental pour moi est de raconter une histoire, des histoires, ou que je les raconte, ou que je sois dans un espace où elles se racontent. Ainsi pour moi un projet est primitivement et avant tout, une histoire qui se raconte. Une équipe est d'abord soudée par « quelque chose ». Cela qui existe par le discours et par la parole. Ce n'est pas tout-à-fait le projet, ce n'est pas tout-à-fait le discours, c'est « quelque chose » qui procède des deux, et qui, c'est bien sûr important, donne une place &lt;span style="font-style: italic;"&gt;active&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;dynamique&lt;/span&gt;, aux membres de l'équipe.&lt;br /&gt;&lt;br /&gt;Dans l'image des Fûts, il y avait aussi cela : les colonnes de l'architecture laissent exister un « espace » pour que les personnes réalisent leur projet. Elles se réunissent dans cet endroit car il est favorable aux projets, et produisent le leur.&lt;br /&gt;&lt;br /&gt;Revenons à la communication. Pourquoi certaines entreprises passent-elles encore aujourd'hui, c'est-à-dire en 2007, complètement à côté, de l'aspect communication ? Faut-il à toute force les pousser dans cette voie-là ? Nous savons qu'elles y gagneraient. Mais elles semblent avoir peur d'y perdre quelque chose d'aussi fondamental.&lt;br /&gt;&lt;br /&gt;Nous pouvons voir la communication comme un symptôme de la bonne santé d'une organisation. Je ne pense pas qu'il y ait une « bonne » et une « mauvaise » communications. Soit le fluide s'écoule dynamiquement, et les crises sont gérées avec le reste, soit il ne passe pas. C'est la rétention, le blocage, c'est-à-dire l'absence de communication, qui sont critiques, pas la qualité de la communication, ni même du contenu charrié par elle. Si aujourd'hui n'apporte pas du bon, on l'aura demain. Les vannes doivent simplement être ouvertes. En amont comme en aval : je dois savoir m'exprimer, et il vaut mieux que je m'intéresse à ce qu'on me dit.&lt;br /&gt;&lt;br /&gt;En voyant la communication comme un symptôme ou comme un signe, et non comme un facteur de réussite, la situation est très simple :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;une organisation qui ne communique pas a d'autres problèmes à régler avant&lt;/li&gt;&lt;li&gt;si on se met en capacité de communiquer, alors on aura réglé ces problèmes&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;C'est-à-dire par exemple qu'installer un wiki à brûle-pourpoint n'a aucun intérêt en soi.&lt;br /&gt;&lt;br /&gt;En revanche, s'assurer que tel collaborateur a la capacité de s'exprimer et d'être écouté au sein de l'organisation (parfois cette capacité ne repose pas sur un défaut d'outillage technique ; cela peut venir du collaborateur lui-même, eh oui), voilà une démarche d'audit plus que pertinente.&lt;br /&gt;&lt;br /&gt;Alors, la communication, pour quoi faire ?&lt;br /&gt;&lt;br /&gt;Eh bien, encore une fois, pour ceux qui baignent dedans, la question ne se pose pas.&lt;br /&gt;&lt;br /&gt;Et pour les autres, la communication peut être un « indicateur cible » qui aide à savoir si l'organisation va bien. Il suffit de changer les deux ou trois choses qui feront que la communication sera mise en marche, et l'organisation ira bien.&lt;br /&gt;&lt;br /&gt;Quelqu'un a dit &lt;span style="font-style: italic;"&gt;Test First&lt;/span&gt;? Oui, oui, la communication est bien une sorte de test JUnit de la bonne santé de l'organisation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8653244577487608954?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8653244577487608954/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8653244577487608954' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8653244577487608954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8653244577487608954'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/10/la-communication-pour-quoi-faire.html' title='La communication, pour quoi faire ?'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5139259850751346957</id><published>2007-09-30T22:26:00.001+02:00</published><updated>2007-09-30T22:44:20.740+02:00</updated><title type='text'>Lesfuts.com, .fr, .org bientôt disponibles</title><content type='html'>Vu où en est le projet Les Fûts, je ne vois pas l'intérêt de reconduire les noms de domaines.&lt;br /&gt;&lt;br /&gt;lesfuts.com, lesfuts.fr et lesfuts.org seront bientôt libres de tout propriétaire.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-5139259850751346957?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5139259850751346957/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5139259850751346957' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5139259850751346957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5139259850751346957'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/09/lesfutscom-fr-org-bientt-disponibles.html' title='Lesfuts.com, .fr, .org bientôt disponibles'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3990162980039545981</id><published>2007-09-19T08:55:00.000+02:00</published><updated>2007-09-19T09:22:32.434+02:00</updated><title type='text'>NoseRub</title><content type='html'>&lt;a href="http://noserub.com/"&gt;http://noserub.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NoseRub wants to be an inspiration, protocol and implementation of a decentralized social network.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;Yi-pee.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-3990162980039545981?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/3990162980039545981/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=3990162980039545981' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3990162980039545981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/3990162980039545981'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/09/noserub.html' title='NoseRub'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-1159553898131339671</id><published>2007-09-15T10:21:00.000+02:00</published><updated>2007-09-15T10:45:00.411+02:00</updated><title type='text'>Réseautage sur Toulouse (3 ou 4)</title><content type='html'>Olivier, de Cadres d'Oc, m'avait parlé de la Mêlée numérique, dont un Apéri'TIC nous avait fait rencontrer le président, qui nous a invités à une soirée, où Bruno nous a parlé d'une soirée Capitole Angels, où nous avons rencontré Jean-Paul, Business Angel, et discuté un peu avec Arnaud de Latude, créateur de Capitole Angels (voir le &lt;a href="http://jentreprends.over-blog.net/article-11962237.html"&gt;podcast&lt;/a&gt; de Maxime Garrigues).&lt;br /&gt;&lt;br /&gt;De fil en aiguille...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-1159553898131339671?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/1159553898131339671/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=1159553898131339671' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1159553898131339671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1159553898131339671'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/09/rseautage-sur-toulouse-3-ou-4.html' title='Réseautage sur Toulouse (3 ou 4)'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6614029372525320128</id><published>2007-09-11T07:59:00.000+02:00</published><updated>2007-09-11T08:16:58.907+02:00</updated><title type='text'>Eclipse : raccourcis clavier</title><content type='html'>Eclipse 3.2.2, Windows XP...&lt;br /&gt;&lt;br /&gt;Pour afficher la liste des raccourcis clavier disponibles dans le contexte courant, tapez Ctrl+Shift+L.&lt;br /&gt;&lt;br /&gt;Voici une liste aide-mémoire que j'ai constituée, &lt;a href="http://lesfuts.free.fr/documents/2007-09-11/EclipseShortcuts.csv"&gt;téléchargeable au format CSV&lt;/a&gt;, et ci-dessous au format blog &lt;span style="font-family: courier new;"&gt;;-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="padding: 0pt;" border="1" cellspacing="0" cols="2" frame="void" rules="groups"&gt;  &lt;colgroup&gt;&lt;col width="242"&gt;&lt;col width="181"&gt;&lt;/colgroup&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td align="left" height="14" width="242"&gt;&lt;span style="font-size:78%;"&gt;Activate Editor &lt;/span&gt;&lt;/td&gt;    &lt;td align="left" width="181"&gt;&lt;span style="font-size:78%;"&gt;F12&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Add Block Comment&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+/&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Add Import&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+M&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Add Javadoc Comment &lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+J&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Backward History&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Left&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Breakpoints&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, B&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Build All&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+B&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Change Method Signature&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+C&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Cheat Sheets&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, H&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Close&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+F4 (or Ctrl+W)&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Close All&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+F4&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Collapse&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Numpad_Subtract&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Collapse All&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Numpad_Divide&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Console&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, C&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Content Assist&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Space&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Context Information&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Space&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Copy&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+C&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Copy Lines&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Alt+Down&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Cut&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Shift+Delete&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug Ant Build&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+D, Q&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug Eclipse Application&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+D, E&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug Equinox Framework&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+D, X&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug JUnit Plug-in Test&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+D, P&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug JUnit Test&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+D, T&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug Java Applet&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+D, A&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug Java Application&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+D, J&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug Last Launched&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;F11&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Debug SWT Application&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+D, S&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Declaration in Workspace&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+G&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Delete&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Delete&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Delete Line&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+D&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Delete Next Word&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Delete&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Delete Previous Word&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Backspace&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Delete to End of Line&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Delete&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Display&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+D (For Which View?)&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Duplicate Lines&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Alt+Up&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Execute&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+U&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Expand&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Numpad_Add&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Expand All&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Numpad_Multiply&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Extract Local Variable&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+L&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Extract Method&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+M&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Find Next&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+K&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Find Previous&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+K&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Find Text in Workspace&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Alt+G&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Find and Replace&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+F&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Format&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+F&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Forward History&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Right&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Go to Line&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+L&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Go to Matching Bracket&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+P&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Go to Next Member&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Down&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Go to Previous Member&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Up&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Incremental Find&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+J&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Incremental Find Reverse&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+J&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Indent Line&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+I&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Inline&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+I&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Insert Line Above Current Line&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Enter&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Insert Line Below Current Line&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Shift+Enter&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Inspect&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+I&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Java Declaration&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, D&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Java Package Explorer&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, P&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Java Type Hierarchy&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, T&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Javadoc&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, J&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Last Edit Location&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Q&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Line End&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;End&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Line Start&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Home&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Maximize Active View or Editor&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;CTRL+M&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Move - Refactoring&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+V&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Move Lines Down&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Down&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Move Lines Up&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Up&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;New&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+N&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;New menu&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+N&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Next&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+.&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Next Editor&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+F6&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Next Perspective&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+F8&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Next View&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+F7&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Next Word&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Right&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open Call Hierarchy&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Alt+H&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open Declaration&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;F3&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open External Javadoc&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Shift+F2&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open Resource&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+R&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open Search Dialog&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+H&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open Structure&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+F3&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open Type&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+T&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open Type Hierarchy&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;F4&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open Type in Hierarchy&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+H&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Open UML Diagram&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+D (Omondo)&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Organize Imports&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+O&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Paste&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Shift+Insert&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Previous&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+,&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Previous Editor&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+F6&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Previous Perspective&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+F8&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Previous View&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+F7&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Previous Word&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Left&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Print&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+P&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Properties&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Enter&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Quick Assist - Assign to field&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+2, F&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Quick Assist - Assign to local variable&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+2, L&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Quick Assist - Rename in file &lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+2, R&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Quick Diff Toggle&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Q&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Quick Fix&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+1&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Quick Hierarchy&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+T&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Quick Outline&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+O&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Quick Switch Editor&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+E&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Redo&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Y&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;References in Workspace &lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+G&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Refresh&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;F5&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Remove Block Comment&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+\&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Remove Occurrence Annotations&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+U&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Rename&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;F2&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Rename - Refactoring&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+R&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Reset Structure&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Numpad_Multiply&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Restore Last Selection&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Down&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run Ant Build&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, Q&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run Eclipse Application&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, E&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run Equinox Framework&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, X&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run JUnit Plug-in Test&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, P&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run JUnit Test&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, T&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run Java Applet&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, A&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run Java Application&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, J&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run Last Launched&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+F11&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run Maven2 Build&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, M&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Run SWT Application&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+X, S&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Save&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+S&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Save All&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+S&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Scroll Line Down&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Down&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Scroll Line Up&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Up&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Search&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, S&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Select All&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+A&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Select Enclosing Element&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Up&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Select Line End&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Shift+End&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Select Line Start&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Shift+Home&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Select Next Element&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Right&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Select Next Word&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Right&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Select Previous Element&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Left&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Select Previous Word&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Left&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show In menu&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+W&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show Key Assist&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+L&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show Occurrences in File Quick Menu&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+U&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show Refactor Quick Menu&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+T&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show Ruler Context Menu&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+F10&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show Source Quick Menu&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+S&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show System Menu&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+-&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show Tooltip Description&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;F2&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show View&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, Q&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show View (View: Outline)&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, O&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Show View (View: Problems)&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, X&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Surround With Quick Menu&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Z&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Switch to Editor&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+E&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Synchronize&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, Y&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Text End&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+End&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Text Start&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Home&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;To Lower Case&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Y&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;To Upper Case&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+X&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Toggle Comment&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+C (or Ctrl+/)&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Toggle Folding&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Numpad_Divide&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Toggle Insert Mode&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+Insert&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Toggle Line Breakpoint&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Shift+B&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Toggle Mark Occurrences&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+O&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Toggle Overwrite&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Insert&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Toggle Step Filters&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Shift+F5&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Undo&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+Z&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Variables&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+Shift+Q, V&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Word Completion&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Alt+/&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Zoom In&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+=&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="14"&gt;&lt;span style="font-size:78%;"&gt;Zoom Out&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;span style="font-size:78%;"&gt;Ctrl+-&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6614029372525320128?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6614029372525320128/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6614029372525320128' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6614029372525320128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6614029372525320128'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/09/eclipse-raccourcis-clavier.html' title='Eclipse : raccourcis clavier'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-5979932000258647767</id><published>2007-08-27T06:24:00.001+02:00</published><updated>2008-12-09T04:41:33.480+01:00</updated><title type='text'>Espace de programmation</title><content type='html'>Ma façon de travailler sous Windows XP avec Eclipse sur un 20" (1600x1200) :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kKYRIZmegcw/RtJYT6pGeNI/AAAAAAAAAAc/m2jzLGckzPc/s1600-h/scr1-1024x768.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_kKYRIZmegcw/RtJYT6pGeNI/AAAAAAAAAAc/m2jzLGckzPc/s200/scr1-1024x768.png" alt="" id="BLOGGER_PHOTO_ID_5103238426946599122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;code formaté à 80 caractères ; pour les scripts, 72 est un meilleur compromis encore.&lt;/li&gt;&lt;li&gt;police ProFont Windows 8pt.&lt;/li&gt;&lt;li&gt;le maximum d'espace vertical pour le code. L'idée étant évidemment de pouvoir visualiser les algorithmes d'un seul coup d'œil. Si chaque méthode entre dans l'écran, c'est bon. Avec cette config je dispose de 96 lignes pour bosser.&lt;/li&gt;&lt;li&gt;oui, sur l'image du dessus, tout le code est bien contenu en largeur dans la colonne centrale.&lt;/li&gt;&lt;li&gt;je gagne encore en verticalité en mettant la Barre des tâches sur un côté plutôt qu'en bas de l'écran.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Certes, comparé au regretté &lt;a href="http://en.wikipedia.org/wiki/CodeWarrior"&gt;CodeWarrior&lt;/a&gt; sous Mac, c'est loin d'être la panacée. En particulier pour du multi-fenêtrage je dois utiliser des outils tiers. Mais ça permet d'avancer.&lt;br /&gt;&lt;br /&gt;Maintenant, comment certains programmeurs utilisent le même IDE et le même écran :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kKYRIZmegcw/RtJcsKpGePI/AAAAAAAAAAs/KDrodiarU_g/s1600-h/scr3-1024x768.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_kKYRIZmegcw/RtJcsKpGePI/AAAAAAAAAAs/KDrodiarU_g/s200/scr3-1024x768.png" alt="" id="BLOGGER_PHOTO_ID_5103243241604937970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;code sans limite horizontale. C'est plus lisible, paraît-il. Même quand ça déborde à droite de la zone visible ? Il se trouve que c'est le cas sur l'image : il va falloir faire défiler la ligne pour lire trois pauvres bouts de code.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;police Courier New 10pt&lt;/li&gt;&lt;li&gt;la console qui mange le bas de l'écran. Bien large la console, pour lire les StackTraces. Important, les StackTraces.&lt;/li&gt;&lt;li&gt;l'espace vertical restant est pour le code. C'est-à-dire 32 lignes sur un 20". Wow! Ne demandez pas pourquoi on rogne votre budget, vu comment vous utilisez les outils de base.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Pour conclure, deux questions pour savoir si votre &lt;span style="font-style: italic;"&gt;setup &lt;/span&gt;est convenable :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;avez-vous du plaisir à travailler ?&lt;/li&gt;&lt;li&gt;avez-vous pris le temps de réfléchir à d'autres possibles configurations ?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;Et sur la question du plaisir pris à travailler. Certes non, une bonne configuration d'un IDE ne procure pas automatiquement une ineffable joie de vivre. En revanche, si de toute façon vous n'êtes pas content de bosser, aucune configuration d'Eclipse ne conviendra &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-5979932000258647767?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/5979932000258647767/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=5979932000258647767' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5979932000258647767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/5979932000258647767'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/08/espace-de-programmation.html' title='Espace de programmation'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kKYRIZmegcw/RtJYT6pGeNI/AAAAAAAAAAc/m2jzLGckzPc/s72-c/scr1-1024x768.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-965701365516514493</id><published>2007-08-25T19:52:00.000+02:00</published><updated>2007-08-25T20:27:18.853+02:00</updated><title type='text'>Génération internet 2.0</title><content type='html'>&lt;a href="http://education-portal.com/articles/Employers_are_Viewing_Your_Profile_on_Social_Networking_Sites.html"&gt;Employers Are Viewing Your Profile on Social Networking Sites&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C'est un fait. Dans la communication, l'informatique, mais aussi le management, les petits jeunes qui chercheront du travail dans les 10 prochaines années auront déjà tenu un blog ainsi qu'un espace public Facebook / MySpace. Ils auront l'habitude d'utiliser Google et Wikipedia pour aller chercher des informations qui leur manquent, et d'utiliser la messagerie instantanée (IM ou IRC) et les discussions différées (blogs ou forums), bref, l'intelligence de groupe, pour s'aider à faire des choix et prendre des décisions. Ils auront peut-être même pris l'habitude de contribuer eux-mêmes à des silos de connaissances, sur divers sujets, avec des wikis par exemple.&lt;br /&gt;&lt;br /&gt;Et leurs employeurs pressentis pourront eux aussi faire une recherche Google sur leur nom. Et ainsi apprendre éventuellement que tel candidat fumait tant de joints dix ans auparavant, écoutait telle musique (c'était à l'époque où le téléchargement était interdit, rappelez-vous : les années 2000), affirmait telles choses. D'ici-là il est possible que les étudiants aient appris, au fur et à mesure que s'approche le moment de chercher un emploi ou des clients, de ne plus laisser traîner sur internet n'importe quelle histoire sur leur compte, et que les seules données «confidentielles» qui aient fui soient déjà vieilles d'un ou deux ans.&lt;br /&gt;&lt;br /&gt;Mais quel est le risque ? Est-ce que le patron risque de ne pas embaucher un étudiant à cause de ce qu'il aura découvert sur son profil Facebook ? C'est le sens de l'article que j'ai mis en lien plus haut. Dans ce cas... qui y perd réellement ? L'ex-étudiant, bien sûr, pour qui le chemin de l'embauche peut être plus difficile qu'avant. Mais on ne voit pas pourquoi il ne trouverait pas un travail au final, puisqu'ils seront majoritaires dans son secteur à avoir fait la même chose, à savoir laisser des traces de leur vie sur internet.&lt;br /&gt;&lt;br /&gt;Non. À mon sens, celui qui y perd fondamentalement, c'est le patron, ou plutôt son entreprise. Parce que les temps changent. Et qu'un futur travailleur qui sait déjà communiquer de façon fluide avec son entourage notamment grâce aux outils à sa disposition, qui a déjà montré qu'il pouvait donner &lt;span style="font-style: italic;"&gt;plus d'information &lt;/span&gt;qu'attendu (certes, il faudra peut-être recadrer. &lt;span style="font-style: italic;"&gt;So, what?&lt;/span&gt;), représente une valeur interne pour l'entreprise.&lt;br /&gt;&lt;br /&gt;Donc la question qu'on peut poser à l'étudiant blackboulé est celle-ci : souhaitez-vous vraiment travailler pour une entreprise qui &lt;span style="font-style: italic;"&gt;de facto&lt;/span&gt; n'est pas adaptée aux méthodes classiques de communication ?  (modernes en 2000, classiques en 2010. Selon les secteurs, &lt;span style="font-style: italic;"&gt;of course&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;De là à se retrouver en slip sur son profil Facebook, évidemment...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-965701365516514493?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/965701365516514493/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=965701365516514493' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/965701365516514493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/965701365516514493'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/08/gnration-internet-20.html' title='Génération internet 2.0'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-7938232085778333627</id><published>2007-08-16T07:07:00.000+02:00</published><updated>2007-08-16T08:01:53.300+02:00</updated><title type='text'>Référencement web de nos sites</title><content type='html'>Tel le Petit Poucet moyen, laisse-t-on suffisamment de traces sur le web pour que les zamis-zet-les-contacts puissent nous retrouver ?&lt;br /&gt;&lt;br /&gt;&lt;table summary="résultats de recherche" style="border: 2px solid rgb(0, 153, 0); padding: 0pt;"&gt;&lt;thead style="border: 2px solid rgb(0, 153, 0); padding: 0pt; font-weight: bold; background-color: rgb(153, 255, 153);"&gt;&lt;tr style="margin: 0pt; padding: 0pt;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;Si sur le web on fait... &lt;/td&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;on obtient...&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;a href="http://www.google.com/search?hl=en&amp;q=david+andriana&amp;amp;btnI="&gt;Google.com, «David Andriana», «I'm Feeling Lucky»&lt;/a&gt;&lt;/td&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;mon &lt;a href="http://www.wikipatterns.com/display/%7Edandriana"&gt;profil &lt;/a&gt;sur &lt;a href="http://www.wikipatterns.com/"&gt;WikiPatterns&lt;/a&gt;, site d'Atlassian sur lequel je m'étais inscrit, à propos de patterns d'utilisation et surtout de mise en œuvre des wikis&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;a href="http://www.google.fr/search?hl=fr&amp;q=david+andriana&amp;amp;btnI="&gt;Google.fr, «David Andriana», «J'ai de la chance»&lt;/a&gt;&lt;/td&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;un vague &lt;a href="http://www.half-serious.com/mobiles.sans.gene/forum/?message=1182"&gt;message&lt;/a&gt; d'avril dernier, par votre serviteur sur le forum de &lt;a href="http://www.half-serious.com/mobiles.sans.gene/"&gt;Mobiles Sans Gêne&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;a href="http://www.google.com/search?hl=en&amp;q=andrianavalontsalama&amp;amp;btnI="&gt;Google.com, «Andrianavalontsalama», «I'm Feeling Lucky»&lt;/a&gt;&lt;/td&gt;&lt;td rowspan="2" style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;la page d'accueil de &lt;a href="http://www.half-serious.com/david/"&gt;mes anciens sites personnels&lt;/a&gt;, pas mis à jour depuis 2003&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;a href="http://www.google.fr/search?hl=fr&amp;q=andrianavalontsalama&amp;amp;btnI="&gt;Google.fr, «Andrianavalontsalama», «J'ai de la chance»&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;a href="http://www.google.com/search?hl=en&amp;q=je+f%C3%BBte&amp;amp;btnI="&gt;Google.com, «Je Fûte», «I'm Feeling Lucky»&lt;/a&gt;&lt;/td&gt;&lt;td rowspan="2" style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;l'article de ce blog &lt;a href="http://jefute.blogspot.com/2007/05/plateformes-applicatives.html"&gt;sur les plateformes applicatives&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;a href="http://www.google.fr/search?hl=fr&amp;q=je+f%C3%BBte&amp;amp;btnI="&gt;Google.fr, «Je Fûte», «J'ai de la chance»&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;a href="http://www.google.com/search?hl=en&amp;q=avantage+compris&amp;amp;btnI="&gt;Google.com, «Avantage Compris», «I'm Feeling Lucky»&lt;/a&gt;&lt;/td&gt;&lt;td rowspan="2" style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;la page «&lt;a href="http://www.avantage-compris.com/about/"&gt;À propos&lt;/a&gt;» du site &lt;a href="http://www.avantage-compris.com/"&gt;Avantage Compris&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;td style="border: 2px solid rgb(0, 153, 0); margin: 0pt; padding: 4px;"&gt;&lt;a href="http://www.google.fr/search?hl=fr&amp;q=avantage+compris&amp;amp;btnI="&gt;Google.fr, «Avantage Compris», «J'ai de la chance»&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Je retiens donc les éléments suivants...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;pour avoir son nom référencé chez Google, il suffit de ne pas avoir un nom trop courant (&lt;span style="font-style: italic;"&gt;Andrianavalontsalama, anyone?&lt;/span&gt;), et d'apparaître dans un site à forte fréquentation. WikiPatterns compte 574 utilisateurs enregistrés, et est abondamment visité.&lt;/li&gt;&lt;li&gt;pour avoir son site référencé chez Google, il suffit d'apparaître dans un blog visible (oui, oui, le blog de &lt;span style="font-style: italic;"&gt;quelqu'un d'autre&lt;/span&gt;. Dingue) et d'y laisser des liens&lt;br /&gt;&lt;/li&gt;&lt;li&gt;pour avoir son blog référencé chez Google, il suffit de l'héberger chez Google  &lt;span style="font-family: courier new;"&gt;:-)&lt;/span&gt; (Blogger/blospot.com)&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;pas besoin d'activité régulière sur ces divers points&lt;/li&gt;&lt;li&gt;pas besoin d'avoir des tétrachiées de commentaires, ni d'avoir des liens sortants (le site d'Avantage Compris a une page de contact très simple, et rigoureusement aucun lien sortant)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;la présence dans les bases de données de réseautage social (&lt;a href="http://www.viadeo.com/"&gt;Viadeo&lt;/a&gt; par exemple) n'apporte pas grand-chose non plus&lt;/li&gt;&lt;/ul&gt;Bien sûr, l'objectif recherché est de pouvoir être retrouvé : la visibilité de l'adresse e-mail suffit. S'il s'était agi de garantir l'accès à un blog, par exemple, l'état du référencement décrit ci-dessus n'aurait pas été suffisant.&lt;br /&gt;&lt;br /&gt;Il aurait alors fallu, à partir de la liste décrite ci-dessus, mettre à jour les liens des pages les unes vers les autres, et... «consolider la nébuleuse» &lt;span style="font-family: courier new;"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-7938232085778333627?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/7938232085778333627/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=7938232085778333627' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7938232085778333627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7938232085778333627'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/08/rfrencement-web-de-nos-sites.html' title='Référencement web de nos sites'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-8686466441327631051</id><published>2007-08-15T10:42:00.000+02:00</published><updated>2007-08-15T11:45:33.866+02:00</updated><title type='text'>IoC par annotations : Guice</title><content type='html'>Je me mets sérieusement aux annotations Java 5. Les liens entre la génération de code et les annotations me semblant clairs désormais, il est temps de passer à l'utilisation frénétique des annotations et de profiter enfin des facilités de &lt;span style="font-style: italic;"&gt;refactoring&lt;/span&gt; offertes par les IDEs. C'est un argument pour positionner Java, et non plus XML, comme format source du processus de développement (oui, oui, même si on doit ensuite produire du PHP).&lt;br /&gt;&lt;br /&gt;Les candidats pour de l'IoC &lt;span style="font-style: italic;"&gt;via &lt;/span&gt;les annotations sont à ma connaissance : Guice 1.0 et Spring 2.1 (pas encore sorti).&lt;br /&gt;&lt;br /&gt;Le &lt;span style="font-style: italic;"&gt;binding&lt;/span&gt; nommé est une des fonctionnalités de base que j'attends de tels frameworks. Le moins qu'on puisse dire c'est qu'avec Guice ce n'est pas immédiat.&lt;br /&gt;&lt;br /&gt;On s'en sort avec... une indirection &lt;span style="font-family: courier new;"&gt;;-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-8686466441327631051?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/8686466441327631051/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=8686466441327631051' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8686466441327631051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/8686466441327631051'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/08/ioc-par-annotations-guice.html' title='IoC par annotations : Guice'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-1052010473883371093</id><published>2007-08-10T22:14:00.000+02:00</published><updated>2007-08-10T22:34:26.881+02:00</updated><title type='text'>Wikis publics chez Sun</title><content type='html'>&lt;a href="http://padawan.info/web/sun_wikis.html"&gt;Lu chez Padawan&lt;/a&gt;, Sun déploie des wikis publics.&lt;br /&gt;&lt;br /&gt;Ils utilisent Confluence.&lt;br /&gt;&lt;br /&gt;Plom, plom, plom...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-1052010473883371093?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/1052010473883371093/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=1052010473883371093' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1052010473883371093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/1052010473883371093'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/08/wikis-publics-chez-sun.html' title='Wikis publics chez Sun'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-6522109541431573347</id><published>2007-08-10T00:41:00.000+02:00</published><updated>2007-08-10T01:21:01.753+02:00</updated><title type='text'>Télétravail</title><content type='html'>Je finis à l'instant une séance de travail à deux, assez intensive, sur du développement Java. C'est banal aujourd'hui, bien sûr. On a dans cette séance utilisé les sempiternels wikis et messageries instantanées. On a bien sûr utilisé un gestionnaire de configuration pour le code, et un serveur d'intégration continue. Et à part ça, pas de téléphone, pas de caméra, pas d'e-mail. On peut dire qu'on est davantage dans la gestion asynchrone du temps (car on utilise par exemple le texte plutôt que la vidéo), et la capitalisation des échanges, que dans l'échange lui-même.&lt;br /&gt;&lt;br /&gt;Là où j'ai été le plus attentif, c'est sur la qualité des idées amenées : dans quel sens joue la distance, c'est-à-dire plus exactement le fait de ne pas se trouver physiquement dans la même pièce ?&lt;br /&gt;Quand je lis un article comme &lt;a style="font-style: italic;" href="http://lifedev.net/2007/08/it-turns-out-brainstorming-has-never-worked/"&gt;It Turns Out Brainstorming Has NEVER Worked&lt;/a&gt; — qui pointe par ailleurs &lt;a href="http://blog.pmarca.com/"&gt;l'excellent blog de Marc Andreessen&lt;/a&gt;, ainsi que l'étude initiale, étude qui a découvert que des personnes amenées à réfléchir en présence ensemble pouvaient être moins créatives que quand elles réfléchissaient d'abord voire exclusivement chacune de leur côté sur leur sujet commun —,  j'essaie de mesurer l'avantage de cette situation.&lt;br /&gt;Et j'ai l'impression qu'il est immense.&lt;br /&gt;&lt;br /&gt;D'abord, c'est à chacun de décider s'il souhaite être interrompu. Le &lt;span style="font-style: italic;"&gt;flow &lt;/span&gt;peut ainsi exister librement. C'est une pratique d'autant plus complète quand chacun essaie d'appliquer l'adage «&lt;span style="font-style: italic;"&gt;Achieve greatness fifteen minutes at a time&lt;/span&gt;» (voir par ici : &lt;a href="http://liferemix.net/how-work-masters"&gt;&lt;span style="font-style: italic;"&gt;How to Work Like the Masters&lt;/span&gt;&lt;/a&gt;). Toutes les 20 minutes environ, on est lancés sur une tâche individuelle, et en général on arrive à quelque chose. Grand ou petit, on a quelque chose. On valide dans la foulée.&lt;br /&gt;&lt;br /&gt;Ensuite, c'est la capitalisation. Parce que les échanges sont écrits, la pensée est formalisée. Et parce qu'ils se font par le biais de systèmes informatiques, ils sont stockés, indexés, archivés, pour être ensuite accessibles, copié/collables, modifiables.&lt;br /&gt;&lt;br /&gt;Pourtant, il reste évident que le &lt;span style="font-style: italic;"&gt;brainstorming&lt;/span&gt;, et le travail en équipe, ont une valeur intrinsèque, un je-ne-sais-quoi qui ne peut pas se retrouver dans une routine de collaboration à distance. L'écoute, et donc le partage du même temps, c'est important.&lt;br /&gt;&lt;br /&gt;Et donc par balancier... c'est la parole qui est retrouvée quand on est ensemble &lt;span style="font-family: courier new;"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-6522109541431573347?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/6522109541431573347/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=6522109541431573347' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6522109541431573347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/6522109541431573347'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/08/tltravail.html' title='Télétravail'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-7892543618954268354</id><published>2007-07-21T15:34:00.000+02:00</published><updated>2007-07-21T16:14:31.925+02:00</updated><title type='text'>AssoPass</title><content type='html'>«&lt;a href="http://www.assopass.com/"&gt;AssoPass&lt;/a&gt; : Créez le site de votre association en toute simplicité.»&lt;br /&gt;&lt;br /&gt;Quelques services d'ores et déjà disponibles :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;site internet&lt;/li&gt;&lt;li&gt;forum&lt;/li&gt;&lt;li&gt;annuaire&lt;/li&gt;&lt;li&gt;album photos&lt;/li&gt;&lt;li&gt;calendrier&lt;/li&gt;&lt;li&gt;petites annonces&lt;/li&gt;&lt;li&gt;cotisations par internet&lt;/li&gt;&lt;li&gt;vente de produits&lt;/li&gt;&lt;/ul&gt;Formule de base : 9 EUR/mois.&lt;br /&gt;&lt;br /&gt;Le site revendique 622 associations clientes.&lt;br /&gt;&lt;br /&gt;On est dans le très-basique, on est dans le très-classique, j'ai même l'impression qu'on est dans du fonctionnel arborescent très « 1.0 » : pas de fonction de recherche systématique, pas de blogging... mais si la critique est facile, le gros intérêt est qu'on est avec AssoPass dans quelque chose qui existe :-)&lt;br /&gt;&lt;br /&gt;Lire &lt;a href="http://dirigeantbenevole.blogspot.com/2007/06/assopass-nouveau-service-en-ligne-pour.html"&gt;le commentaire&lt;/a&gt; qu'en faisait fin juin Laurent Samuel sur son blog « &lt;a href="http://dirigeantbenevole.blogspot.com/"&gt;créer et animer une association loi 1901&lt;/a&gt; ».&lt;br /&gt;&lt;br /&gt;Je suis entièrement d'accord sur le caractère insupportable de la speakerine ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-7892543618954268354?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/7892543618954268354/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=7892543618954268354' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7892543618954268354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/7892543618954268354'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/07/assopass.html' title='AssoPass'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-767926185922695956</id><published>2007-07-20T13:18:00.001+02:00</published><updated>2007-07-20T13:30:28.831+02:00</updated><title type='text'>Parakey sera open source</title><content type='html'>Facebook, qui fait émerger les plates-formes applicatives sur internet, à grands coups de web collaboratif et de propagation virale, acquiert Parakey, une &lt;span style="font-style: italic;"&gt;start-up&lt;/span&gt; qui développe un système d'exploitation réparti/partagé accessible &lt;span style="font-style: italic;"&gt;via&lt;/span&gt; le web.&lt;br /&gt;&lt;br /&gt;Voir &lt;a href="http://fr.techcrunch.com/2007/07/20/la-premiere-acquisition-de-facebook-parakey-le-webos-des-fondateurs-de-firefox/"&gt;l'info sur Techcrunch/fr&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Techcrunch donne en outre l'info suivante : Parakey sera en mode &lt;span style="font-style: italic;"&gt;open source&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Voilà, voilà...&lt;br /&gt;&lt;br /&gt;Soyons clairs : il reste la fédération d'identité, avec par exemple un Open ID musclé, plus la répartition du système métier par &lt;span style="font-style: italic;"&gt;peer-to-peer&lt;/span&gt;, à la NNTP par exemple, puis le système sera génial.&lt;br /&gt;&lt;br /&gt;Il ne s'appellera sans doute plus Facebook Platform, ni Parakey, et il n'aura certainement pas le même &lt;span style="font-style: italic;"&gt;business model &lt;/span&gt;que ces deux entreprises.&lt;br /&gt;&lt;br /&gt;Quand ce système arrivera, il aura fallu beaucoup d'apports &lt;span style="font-style: italic;"&gt;open source&lt;/span&gt;, beaucoup de fonds privés, beaucoup de communautés actives, beaucoup de créations (et donc de morts) d'entreprises. Et les États ? Ben...&lt;br /&gt;&lt;br /&gt;Certes l'histoire n'est pas terminée, mais on ne les voit pas beaucoup dans le générique pour l'instant. Alors qu'un tel système sera pour le moins d'utilité publique.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28966088-767926185922695956?l=jefute.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jefute.blogspot.com/feeds/767926185922695956/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28966088&amp;postID=767926185922695956' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/767926185922695956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28966088/posts/default/767926185922695956'/><link rel='alternate' type='text/html' href='http://jefute.blogspot.com/2007/07/parakey-sera-open-source.html' title='Parakey sera open source'/><author><name>David Andriana</name><uri>http://www.blogger.com/profile/12130177273596298082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_kKYRIZmegcw/SMIPvFuTwKI/AAAAAAAAAEo/HbM_5SYZiqc/S220/photo-DFA-Viadeo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28966088.post-3861385643581961468</id><published>2007-07-16T16:30:00.000+02:00</published><updated>2007-07-16T16:59:41.394+02:00</updated><title type='text'>Des jours sans internet</title><content type='html'>Retour d'une première salve de vacances d'été, de 7 petits jours cette fois. Après ça, le rattrapage de la veille technologique est tout simplement impossible : plus de 1 000 articles attendent
