<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-1356929505478449949</atom:id><lastBuildDate>Thu, 26 Jan 2012 06:01:42 +0000</lastBuildDate><category>florence</category><category>sonar</category><category>mutter</category><category>concordion</category><category>booksmart</category><category>UI</category><category>dessin</category><category>maven</category><category>thailande</category><category>adobe</category><category>poll</category><category>applet</category><category>api</category><category>iteration</category><category>pmd</category><category>rss</category><category>web2</category><category>bdd</category><category>SE</category><category>emoticon</category><category>user story</category><category>continu</category><category>patch</category><category>geohash</category><category>java</category><category>dj project</category><category>spécification executable</category><category>theme</category><category>cartoon</category><category>humour</category><category>MMF</category><category>dilbert</category><category>xpplanner</category><category>37signals</category><category>réunions</category><category>qualité</category><category>concordion pdf single page merge specification</category><category>jeu</category><category>lecture</category><category>GoogleTreasureHunt</category><category>Christelle</category><category>groovy</category><category>dsl</category><category>design</category><category>project</category><category>graphique</category><category>extjs</category><category>LSD</category><category>google</category><category>challenge</category><category>checkstyle</category><category>javancss</category><category>eastwood</category><category>saw</category><category>google chart api</category><category>présentation</category><category>story card</category><category>evaluation</category><category>webkit</category><category>planning</category><category>animation</category><category>extremeforge</category><category>cruisecontrol</category><category>zen</category><category>gimp</category><category>uml</category><category>tdd</category><category>mindmap</category><category>Theory of constraint</category><category>goosh</category><category>conférence</category><category>filthyrichclients</category><category>anti pattern</category><category>GoogleAppengine</category><category>junitreport</category><category>dashboard</category><category>voyage</category><category>week4</category><category>sparkline</category><category>méthodologie</category><category>scrum</category><category>xfire</category><category>iso 9126</category><category>glean</category><category>jruby</category><category>forge</category><category>cryptologie</category><category>wizishop</category><category>niemeyer</category><category>xpdays</category><category>xsl</category><category>4</category><category>erlang</category><category>swing</category><category>web</category><category>phpunit</category><category>junit</category><category>firebug</category><category>xradar</category><category>gwt</category><category>art</category><category>open source</category><category>firefox</category><category>grails</category><category>greenhopper</category><category>css</category><category>web 2.0</category><category>ejb3</category><category>spring</category><category>performance</category><category>confiance</category><category>review</category><category>fest</category><category>extreme programming</category><category>xp</category><category>silman</category><category>jmock</category><category>avis</category><category>echecs</category><category>livre</category><category>ubiquity</category><category>thoughtworks</category><category>morton</category><category>geek</category><category>card tree</category><category>google web toolkit</category><category>kuler</category><category>flex</category><category>swt</category><category>style</category><category>portlet</category><category>greenpepper</category><category>jdic</category><category>projet</category><category>easyb</category><category>RoR</category><category>openportal</category><category>intégration continue</category><category>reconnaissance faciale</category><category>italie</category><category>blurb</category><category>widget</category><category>ide</category><category>automatique</category><category>vacances</category><category>javascript</category><category>jfreechart</category><category>rétrospective</category><category>strip</category><category>bibliotheque</category><category>danse</category><category>venise</category><category>mock</category><category>informatique</category><category>glassfish</category><category>jira</category><category>photos</category><category>yahoo-pipes</category><category>MyXpCorkBoard</category><category>igoogle</category><category>goldratt</category><category>rrdtool</category><category>agile</category><category>python</category><category>2D</category><category>browser</category><category>1.9.6</category><category>JRoR</category><category>kanban</category><category>agitar</category><category>picassa web</category><category>qalab</category><category>addon</category><category>fitnesse</category><category>linux</category><category>gtd</category><category>lean</category><category>hibernate</category><category>équipe</category><category>ant</category><category>idée</category><category>ajax</category><category>forkmode</category><category>gfx</category><category>shangai</category><category>jsr286</category><category>blog</category><category>chart</category><category>constraint</category><category>google chrome</category><category>chess engine</category><category>27</category><category>tests</category><category>TimingFramework</category><category>chine</category><category>TOC</category><category>mingle</category><category>composant</category><category>perso</category><category>throughput</category><category>critique</category><category>enigme</category><title>Leuc's blog : Amor fati</title><description /><link>http://clecuret.blogspot.com/</link><managingEditor>noreply@blogger.com (leuc)</managingEditor><generator>Blogger</generator><openSearch:totalResults>111</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/LeucsBlog" /><feedburner:info uri="leucsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeucsBlog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeucsBlog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FLeucsBlog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-8617477067960067179</guid><pubDate>Fri, 20 Jan 2012 21:53:00 +0000</pubDate><atom:updated>2012-01-20T22:53:25.467+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">bibliotheque</category><category domain="http://www.blogger.com/atom/ns#">graphique</category><category domain="http://www.blogger.com/atom/ns#">projet</category><title>Des projets enthousiasmants</title><description>Après une nouvelle période de pouponage (ma deuxième fille Tessa est née le 22 Décembre dernier), je reprends le clavier pour une nouvelle liste de projets enthousiasmants.&lt;br /&gt;
Après les projets Java (petits exemples : &lt;a href="http://clecuret.blogspot.com/2007/07/des-projets-suivre.html"&gt;ici&lt;/a&gt; et &lt;a href="http://clecuret.blogspot.com/2007/11/des-projets-suivre-2nd-version.html"&gt;là&lt;/a&gt;&amp;nbsp;mais surtout, à l'époque, une grosse communauté et un énorme écosystème) et les projets Google (des produits qui sortent en pagaille, une croissance hallucinante et un dynamisme...), je dois avouer que c'est du coté Javascript que je trouve aujourd'hui le plus de projets intéressants.&lt;br /&gt;
Les projets sont souvent plus petits mais quel&amp;nbsp;dynamisme&amp;nbsp;et c'est souvent très joli (et j'aime quand c'est joli !). Mes derniers chouchous en date sont :&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mbostock.github.com/d3/"&gt;d3.js&lt;/a&gt; : après&amp;nbsp;&lt;a href="http://www.highcharts.com/"&gt;highcharts&lt;/a&gt; et &lt;a href="http://raphaeljs.com/"&gt;raphael.js&lt;/a&gt;, voici une bibliothèque offrant des représentations très avancées et très design de vos données.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bartaz.github.com/impress.js/"&gt;impress.js&lt;/a&gt; : faîtes vos présentations &lt;a href="http://prezi.com/"&gt;Prezi&lt;/a&gt;, sans prezi...&lt;/li&gt;
&lt;li&gt;&lt;a href="http://documentcloud.github.com/visualsearch/"&gt;visualSearch.js&lt;/a&gt; : après la &lt;a href="http://technomedia.co.uk/SuperBoxSelect/examples3.html"&gt;superselectbox&lt;/a&gt; sur extjs à son clone &lt;a href="http://harvesthq.github.com/chosen/"&gt;chosen&lt;/a&gt; sur jquery, et bien voici une petite variante plutôt sympa : c'est simple, élégant et cela permet d'exploiter "en ligne" des recherches multicritères dit &lt;a href="http://fr.wikipedia.org/wiki/Recherche_%C3%A0_facettes"&gt;"à facette"&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Ce ne sont pas des projets révolutionnaires mais, selon moi, ils font partie de ces petites initiatives sympas qui tirent les sujets vers le haut.&lt;br /&gt;
&lt;br /&gt;
NB : visualSearch est un projet de &lt;a href="http://www.documentcloud.org/home"&gt;documentCloud&lt;/a&gt;. DocumentCloud est aussi un projet qui m'intéresse car même s'il est fait initialement pour &lt;a href="http://www.documentcloud.org/faq"&gt;les journalistes&lt;/a&gt;, je trouve que ce serais très intéressant de le forker pour y gérer des sources généalogiques. J'ai toujours souhaité que les logiciels de généalogie mette plus l'accent sur les actes que sur les données, DocumentCloud semble faire cela très bien pour les sources journalistiques... A creuser !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-8617477067960067179?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FTwSov6rCCj_QGloK_EF60o3b_I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FTwSov6rCCj_QGloK_EF60o3b_I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FTwSov6rCCj_QGloK_EF60o3b_I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FTwSov6rCCj_QGloK_EF60o3b_I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/oiDFNxPJRz8/des-projets-enthousiasmants.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2012/01/des-projets-enthousiasmants.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-427298176800634500</guid><pubDate>Sat, 03 Dec 2011 22:35:00 +0000</pubDate><atom:updated>2011-12-04T18:31:52.574+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">concordion pdf single page merge specification</category><title>Spécifications fonctionnelles</title><description>Ceux qui suivent ce blog savent que j'apprécie l'outil &lt;a href="http://concordion.org/"&gt;Concordion&lt;/a&gt;&amp;nbsp; (lire &lt;a href="http://clecuret.blogspot.com/2008/08/ajouter-un-sommaire-concordion-ide-n1.html"&gt;[1]&lt;/a&gt;,&amp;nbsp;&lt;a href="http://clecuret.blogspot.com/2010/02/test-de-performance-avec-concordion.html"&gt;[2]&lt;/a&gt;,&amp;nbsp;&lt;a href="http://clecuret.blogspot.com/2010/04/une-proposition-de-sommaire-pour.html"&gt;[3]&lt;/a&gt;,&amp;nbsp;&lt;a href="http://clecuret.blogspot.com/2010/06/illustrer-vos-specifications-concordion.html"&gt;[4]&lt;/a&gt;,&amp;nbsp;&lt;a href="http://clecuret.blogspot.com/2010/10/concordion-141-enfin-une-gestion.html"&gt;[5]&lt;/a&gt;).&lt;br /&gt;
J'apprécie sa simplicité et son ambition de rendre les spécifications à la fois lisible (rédaction libre contrairement à &lt;a href="http://fit.c2.com/"&gt;FIT&lt;/a&gt; ou &lt;a href="http://www.fitnesse.org/"&gt;Fitnesse&lt;/a&gt;) et&amp;nbsp;chaînée&amp;nbsp;au code.&lt;br /&gt;
Armé d'un tel outil et en suivant les &lt;a href="http://french.joelonsoftware.com/Articles/PainlessFunctionalSpecifi-2.html"&gt;recommandations de Joel Spolky&lt;/a&gt;, j'étais convaincu d'avoir trouvé la solution pour avoir des&amp;nbsp;spécifications&amp;nbsp;vivantes (merci Concordion),&amp;nbsp;claires (merci Joel), &amp;nbsp;et donc lues ...&lt;br /&gt;
Hélas, ce ne fut pas le cas, et après avoir cherché à comprendre ce qui n'allait pas, il semble que la lecture des&amp;nbsp;spécifications était freinée&amp;nbsp;pour une raison assez incroyable : une arborescence de fichiers html fait peur au lecteur !&lt;br /&gt;
Le format html fait penser à "site web" mais pas à "document de référence" et une arborescence de fichiers semble effrayé le lecteur qui croit qu'il va oublier de lire des pages.&lt;br /&gt;
Pour vérifier cette hypothèse, j'ai donc décidé de convertir mes&amp;nbsp;spécifications&amp;nbsp;html arborescentes et un seul document pdf (pdf : &amp;nbsp;ça, au moins, ça fait sérieux !).
&lt;br /&gt;
Les taches à réaliser pour parvenir à 1 seul pdf sont :
&lt;ol&gt;
&lt;li&gt;la lecture du sommaire pour déterminer l'ordre et la liste des spécifications&lt;/li&gt;
le sommaire est une page html qui référence d'autres pages html. Le plus simple pour parser cela est, à mon avis, PHP avec &lt;a href="http://php.net/manual/fr/simplexmlelement.xpath.php"&gt;simplexmlelement&lt;/a&gt;.&amp;nbsp;
&lt;li&gt;la conversion d'une page html en pdf.&lt;/li&gt;
Première pensée : xslt et xsl-fo, je vais y passer des heures... seconde pensée : un navigateur comme chrome fait cela très bien mais une ligne de commande serait beaucoup plus confortable. La solution : &lt;a href="http://code.google.com/p/wkhtmltopdf/"&gt;wkhtmltopdf&lt;/a&gt;. Sur ubuntu, pour l'installer il suffit de demander : sudo apt-get install wkhtmltopdf
&lt;li&gt;la fusion de toutes les pages.&lt;/li&gt;
La encore, première pensée : fusionner les pages html; oui mais chaque page a ces balises html, head, body, qu'il faut remplacer cela par des div (en gérant les sauts de pages&amp;nbsp; via les attributs page-break-after/page-break-before). Mais finalement, il y a plus simple : fusionner les pdf; Une simple recherche sur google "pdf merge command" m'a permis de voir que&amp;nbsp;GhostScript (gs)&amp;nbsp;faisait cela très bien. Et bien sur, gs est de base sur Ubuntu !
&lt;/ol&gt;
&lt;div&gt;
Résultat : une dizaine de lignes php !&amp;nbsp;&lt;/div&gt;

&lt;pre class="brush:java"&gt; 
&amp;lt;?php  
    function pdfify($html){   // transform html to pdf thx to wkhtmltopdf
 $pdf = str_replace('.html','.pdf',$html);
        exec("wkhtmltopdf $html $pdf");
        return $pdf;
    }

 // first page containing concordion:run in
 $in = 'index.html';  
 // convert first page to pdf
 $pdfs[]=pdfify($in);  
 // parse index to find child files
 $names = simplexml_load_file($in)-&amp;gt;xpath('//li/a'); 
 // generate pdf for each of them
 foreach($names as $name) { $pdfs[]=pdfify($name['href']);}
 exec("gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=STL.pdf ".implode(' ',$pdfs)); 
 // clean temporary pdfs
 foreach($pdfs as $pdf) { unlink($pdf);} 
&lt;/pre&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/1356929505478449949-427298176800634500?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zDzywFRW5u6UIBw_FQfzh2KCi74/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zDzywFRW5u6UIBw_FQfzh2KCi74/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zDzywFRW5u6UIBw_FQfzh2KCi74/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zDzywFRW5u6UIBw_FQfzh2KCi74/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/eRwDcXwFPWA/specifications-fonctionnelles.html</link><author>noreply@blogger.com (leuc)</author><thr:total>3</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2011/12/specifications-fonctionnelles.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-1719844697863749909</guid><pubDate>Thu, 04 Aug 2011 20:58:00 +0000</pubDate><atom:updated>2011-08-04T21:58:36.951+01:00</atom:updated><title>Programmer au 21ième siècle</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-geZBdlYWGmQ/TjsHoZYhz_I/AAAAAAAACTA/Z6TSuMmPoWA/s1600/programming.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-geZBdlYWGmQ/TjsHoZYhz_I/AAAAAAAACTA/Z6TSuMmPoWA/s1600/programming.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-1719844697863749909?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/X9fJQkFZHy0UB62qxXP4-4cbXZM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X9fJQkFZHy0UB62qxXP4-4cbXZM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/X9fJQkFZHy0UB62qxXP4-4cbXZM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X9fJQkFZHy0UB62qxXP4-4cbXZM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/YqCjmKdaLqM/programmer-au-21ieme-siecle.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-geZBdlYWGmQ/TjsHoZYhz_I/AAAAAAAACTA/Z6TSuMmPoWA/s72-c/programming.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2011/08/programmer-au-21ieme-siecle.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-5640593282084708457</guid><pubDate>Wed, 03 Aug 2011 20:33:00 +0000</pubDate><atom:updated>2011-08-03T21:33:05.121+01:00</atom:updated><title>"public void static main" est mort, vive "@Test"</title><description>&lt;br /&gt;
Pour initier une attitude TDD dans une phase de prototypage, mon premier conseil serait de remplacer systématiquement la fameuse fonction "&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;public static void main&lt;/span&gt;" de java par l'annotation &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;@Test&lt;/span&gt; de Junit4.&lt;br /&gt;
En reprenant l'exemple du cookbook de Kent Beck, je préférerai toujours :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java"&gt;@Test public void simpleAdd() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; Money m12CHF = new Money(12, "CHF");&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Money m14CHF = new Money(14, "CHF");&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Money m26CHF = new Money(26, "CHF");
&amp;nbsp;&amp;nbsp;&amp;nbsp; assertTrue(m26CHF.equals(m12CHF.add(m14CHF));
}&lt;/pre&gt;
à :&lt;br /&gt;
&lt;pre class="brush:java"&gt;public static void main() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; Money m12CHF = new Money(12, "CHF");&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Money m14CHF = new Money(14, "CHF");&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Money m26CHF = new Money(26, "CHF");
&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(m12CHF.add(m14CHF);
&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(m26CHF);
}&lt;/pre&gt;
&lt;br /&gt;
Pourquoi ?&lt;br /&gt;
&lt;div&gt;
Parce que dans les deux cas on a obtenu un contexte&amp;nbsp;d’exécution mais la première solution à l'avantage d'évaluer le résultat attendu.&lt;br /&gt;
C'est tout bête, je l'avoue mais je vois trop de développeurs "tester" un bout de code sans xunit mais avec "&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;public static void main&lt;/span&gt;" pour ne pas finalement en parler.&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&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/1356929505478449949-5640593282084708457?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Et7U0gy2VtbWZ_lhUesVXGc5bko/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Et7U0gy2VtbWZ_lhUesVXGc5bko/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Et7U0gy2VtbWZ_lhUesVXGc5bko/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Et7U0gy2VtbWZ_lhUesVXGc5bko/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/waPvkfgk2ws/public-void-static-main-est-mort-vive.html</link><author>noreply@blogger.com (leuc)</author><thr:total>2</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2011/08/public-void-static-main-est-mort-vive.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-6024944320572511094</guid><pubDate>Wed, 03 Aug 2011 19:50:00 +0000</pubDate><atom:updated>2011-08-03T20:51:00.377+01:00</atom:updated><title>abcde : A Better CD Encode</title><description>Après divers essais d'extracteurs de CD (rubyripper, sound juicer, grip) sous Ubuntu, j'ai finalement abandonné l'idée d'utiliser un outil avec une interface graphique.&lt;br /&gt;
Certes, il est sympathique d'avoir une application clicodrome &amp;nbsp;mais forcé de constater que :&lt;br /&gt;
&amp;nbsp;- extraire un CD est une suite d'opérations simples ne méritant pas vraiment d'IHM&lt;br /&gt;
&amp;nbsp;- sous Linux, ces opérations sont réalisées par des composants différents (cdparanoïa pour l'extraction, lame pour la conversion mp3, cd-discid pour recupérer les titres des morceaux, id3v2 pour les tags)&lt;br /&gt;
&amp;nbsp;- les applications avec IHM font du zèle avec des&amp;nbsp;contrôles&amp;nbsp;supplémentaires, une gestion du temps de fonctionnement du lecteur de CD... La conséquence est que j'ai eu du mal à extraire un simple CD.&lt;br /&gt;
Finalement, j'ai opté pour &lt;a href="http://en.wikipedia.org/wiki/ABCDE"&gt;A.B.C.D.E&lt;/a&gt;.&lt;br /&gt;
Voila ce que j'appelle un outil efficace ... en ligne de commande&lt;br /&gt;
Pour extraire en mp3, créez un fichier ~/.abcde.conf (voir &lt;a href="http://www.andrews-corner.org/abcde.html"&gt;ici&lt;/a&gt; pour les explications)&lt;br /&gt;
puis tapez :&lt;br /&gt;
&lt;pre class="brush:java"&gt;abcde&lt;/pre&gt;
et voila !&lt;br /&gt;
J'adore.&lt;br /&gt;
&lt;br /&gt;
NB : Pour être complet, avant l'extraction, il vous faudra tout de même valider les données &lt;a href="http://en.wikipedia.org/wiki/CDDB"&gt;CDDB&lt;/a&gt; (souvent cela se résume à un appui sur entrée) et valider le choix de ne pas éditer ces données (un second appui sur entrée)&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-6024944320572511094?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sMx2HUBc9DvJj21T6eBXCH5Koys/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sMx2HUBc9DvJj21T6eBXCH5Koys/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sMx2HUBc9DvJj21T6eBXCH5Koys/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sMx2HUBc9DvJj21T6eBXCH5Koys/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/yAp0Jx9aL4Q/abcde-better-cd-encode.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2011/08/abcde-better-cd-encode.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-2257154813262911566</guid><pubDate>Tue, 21 Jun 2011 19:37:00 +0000</pubDate><atom:updated>2011-06-21T20:38:05.112+01:00</atom:updated><title>Lectures du mois</title><description>&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/-8SwJQ3PCQME/TgDw3eX7ROI/AAAAAAAACPs/xLXNVi0ydns/s1600/tome2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-8SwJQ3PCQME/TgDw3eX7ROI/AAAAAAAACPs/xLXNVi0ydns/s320/tome2.jpg" width="197" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-84MwEp_I1U4/TgDw27ZWIQI/AAAAAAAACPo/JixTCKUWVU0/s1600/tome1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-84MwEp_I1U4/TgDw27ZWIQI/AAAAAAAACPo/JixTCKUWVU0/s320/tome1.jpg" width="198" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-davDBkUgZew/TgDw2nkUi2I/AAAAAAAACPk/LFuUGl2RK2s/s1600/la-fraternite-du-panca-t4-soeur-onden-de-pierre-bordage.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-davDBkUgZew/TgDw2nkUi2I/AAAAAAAACPk/LFuUGl2RK2s/s1600/la-fraternite-du-panca-t4-soeur-onden-de-pierre-bordage.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-dkmyDuG4Y5E/TgDw2WPritI/AAAAAAAACPg/-yl3kAywuR0/s1600/349417.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-dkmyDuG4Y5E/TgDw2WPritI/AAAAAAAACPg/-yl3kAywuR0/s320/349417.jpg" width="241" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-2257154813262911566?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/btNjlbUKfCbfK8vrn8hPQ3VhH1o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/btNjlbUKfCbfK8vrn8hPQ3VhH1o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/btNjlbUKfCbfK8vrn8hPQ3VhH1o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/btNjlbUKfCbfK8vrn8hPQ3VhH1o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/mi8zibHYN3A/lecture-du-mois.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-8SwJQ3PCQME/TgDw3eX7ROI/AAAAAAAACPs/xLXNVi0ydns/s72-c/tome2.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2011/06/lecture-du-mois.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-788418008556827944</guid><pubDate>Mon, 20 Jun 2011 21:18:00 +0000</pubDate><atom:updated>2011-06-20T22:18:05.209+01:00</atom:updated><title>Gérer les idées et suggestions d'utilisateurs</title><description>Voici une sélection d'outils gratuits pour collecter des idées ou des suggestions sur des produits.&lt;br /&gt;
Le plus simple :&amp;nbsp;&lt;a href="http://trac-hacks.org/wiki/VotePlugin"&gt;http://trac-hacks.org/wiki/VotePlugin&lt;/a&gt;&lt;br /&gt;
Les plus "tendance" :&amp;nbsp;&lt;a href="http://ideascale.com/"&gt;http://ideascale.com/&lt;/a&gt;&amp;nbsp;et&amp;nbsp;&lt;a href="http://sparkbin.net/"&gt;http://sparkbin.net/&lt;/a&gt;&lt;br /&gt;
Le plus "google" :&amp;nbsp;&lt;a href="https://www.google.com/moderator/"&gt;https://www.google.com/moderator/&lt;/a&gt;&lt;br /&gt;
Le plus connus :&amp;nbsp;&lt;a href="http://getsatisfaction.com/"&gt;http://getsatisfaction.com&lt;/a&gt;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Sinon pour les payants, la liste est plus longue. En voici un aperçu :&amp;nbsp;&lt;a href="http://www.practicalecommerce.com/articles/2827-14-Customer-Feedback-Tools-for-Small-Business"&gt;http://www.practicalecommerce.com/articles/2827-14-Customer-Feedback-Tools-for-Small-Business&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-788418008556827944?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/i0h9mznbtf_bzwNlihG3bmnAZDo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i0h9mznbtf_bzwNlihG3bmnAZDo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/i0h9mznbtf_bzwNlihG3bmnAZDo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i0h9mznbtf_bzwNlihG3bmnAZDo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/s-lYNY3fMAc/gerer-les-idees-et-suggestions.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2011/06/gerer-les-idees-et-suggestions.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-2266601137155222237</guid><pubDate>Sun, 29 May 2011 19:58:00 +0000</pubDate><atom:updated>2011-05-30T21:04:00.189+01:00</atom:updated><title>BudgetView : une expérience de Problem Driven Development</title><description>&lt;br /&gt;
Faire de l'agilité dans un environement hostile à l'agilité n'est pas simple, voir impossible.&lt;br /&gt;
Après avoir essayer diverses méthodes (mais trop souvent trop partiellement), les changements d'équipe, la "politique", le cloisonnement des services ou même la perte de motivation en interne de l'équipe a souvent conduit à des résultats décevants.&lt;br /&gt;
A ce stade, je crois toujours aux vertus de l'agilité et reste intimement persuader que c'est la bonne façon de travailler. Il ne me manquait qu'un exemple concret de réussite pour retrouver la "foi".&lt;br /&gt;
&lt;br /&gt;
Je pense que Régis Médina va probablement (une fois de plus) me fournir cet exemple.&lt;br /&gt;
En effet, dans &lt;a href="http://www.regismedina.com/blog/2011/03/budgetview-problem-driven-development"&gt;son dernier billet&lt;/a&gt;, il annonce qu'un nouveau logiciel de gestion de budget nommé &lt;a href="http://www.mybudgetview.fr/"&gt;BudgetView&lt;/a&gt; est disponible. &amp;nbsp;Mais surtout, Il décrit la démarche qui a été suivie sur les 4 dernières années pour concevoir et différencier ce produit de la concurence. Cette démarche, il l'a nomme "Problem Driven Development".&lt;br /&gt;
Je vous invite donc à lire &lt;a href="http://www.regismedina.com/blog/2011/03/budgetview-problem-driven-development"&gt;son article&lt;/a&gt; et bien entendu à évaluer le résultat (ce que je vais m'empresser de faire).&lt;br /&gt;
Qui c'est, peut-être vais-je enfin trouver un outil simple mais suffisant de gestion de budget personnel...&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/NmAjIOnckaE?rel=0" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-2266601137155222237?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/S5z0WYsKheJCycSBNfWiSjMofaE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S5z0WYsKheJCycSBNfWiSjMofaE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/S5z0WYsKheJCycSBNfWiSjMofaE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S5z0WYsKheJCycSBNfWiSjMofaE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/rYaa4o-qjek/budgetview-une-experience-de-problem.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/NmAjIOnckaE/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2011/05/budgetview-une-experience-de-problem.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-2585242583698623057</guid><pubDate>Sat, 21 May 2011 19:45:00 +0000</pubDate><atom:updated>2011-05-21T21:39:47.886+01:00</atom:updated><title>Aïkido en hakama</title><description>En obtenant mon 1er Kyu (ceinture marron) le 29 Avril dernier, j'ai aussi acquis le droit (l'honneur) de &amp;nbsp;pouvoir porter le hakama (je vous invite à lire l'article de wikipédia pour plus de détails).&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
Après mon premier cours en hakama , c'est maintenant sûr : Ce pantalon, c'est la classe !&lt;br /&gt;
Et pourtant...&lt;br /&gt;
C'est dur à mettre et à replier... &amp;nbsp;et se mettre les pieds dedans est monnaie courante.&lt;br /&gt;
Mais voila, c'est une grande fierté, l'impression d'avoir progressé dans la connaissance formelle des techniques et, du coup, ma motivation pour préparer mon 1er Dan (ceinture noire) est au top.&lt;br /&gt;
&lt;br /&gt;
NB : voici un petit aperçu en images des étapes pour mettre et replier ce pantalon&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-J-aH6Zwo9PI/TdgiYpipkzI/AAAAAAAACPI/SX2FsOHiB5g/s1600/hakama-mettre.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-J-aH6Zwo9PI/TdgiYpipkzI/AAAAAAAACPI/SX2FsOHiB5g/s320/hakama-mettre.jpg" width="319" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-q-q0ChpZXqo/TdgiefV2seI/AAAAAAAACPM/JlWsWYb6HEo/s1600/pliagehakaman.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="287" src="http://3.bp.blogspot.com/-q-q0ChpZXqo/TdgiefV2seI/AAAAAAAACPM/JlWsWYb6HEo/s320/pliagehakaman.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 12px; line-height: 18px;"&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/1356929505478449949-2585242583698623057?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o6m4O--yXaYCYbtbPZJgxfWvYRA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o6m4O--yXaYCYbtbPZJgxfWvYRA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o6m4O--yXaYCYbtbPZJgxfWvYRA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o6m4O--yXaYCYbtbPZJgxfWvYRA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/HaeYQhnvNsc/aikido-en-hakama.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-J-aH6Zwo9PI/TdgiYpipkzI/AAAAAAAACPI/SX2FsOHiB5g/s72-c/hakama-mettre.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2011/05/aikido-en-hakama.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-4825139136274398747</guid><pubDate>Sun, 24 Oct 2010 16:34:00 +0000</pubDate><atom:updated>2010-10-24T17:34:22.379+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">concordion</category><category domain="http://www.blogger.com/atom/ns#">tests</category><title>Concordion 1.4.1 : enfin une gestion d'extensions</title><description>&lt;a href="http://www.kanbanblog.com/"&gt;David Peterson&lt;/a&gt; vient d'annoncer la sortie de la &lt;a href="http://www.concordion.org/Download.html"&gt;version 1.4.1 de Concordion&lt;/a&gt;.&lt;br /&gt;
Grâce à cette nouvelle version, Concordion devient plus ouvert aux extensions. Cela manquait réellement jusqu'à présent.&lt;br /&gt;
&lt;a href="http://github.com/nigelcharman/concordion-extensions"&gt;Nigel Charman en propose déjà 3&lt;/a&gt; dont &lt;a href="http://tutansblog.blogspot.com/2010/09/whats-happening-in-my-acceptance-tests.html"&gt;une très intéressante&lt;/a&gt; pour savoir le script d'actions qui s'est déroulé pendant l'exécution d'une page de spécification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-4825139136274398747?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AeCpYnOcAMi-l0LEAkyEumJ6AdQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AeCpYnOcAMi-l0LEAkyEumJ6AdQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AeCpYnOcAMi-l0LEAkyEumJ6AdQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AeCpYnOcAMi-l0LEAkyEumJ6AdQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/d4dpdc0dDX8/concordion-141-enfin-une-gestion.html</link><author>noreply@blogger.com (leuc)</author><thr:total>3</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/10/concordion-141-enfin-une-gestion.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-2661726872565597644</guid><pubDate>Sat, 26 Jun 2010 13:40:00 +0000</pubDate><atom:updated>2010-06-26T14:41:49.724+01:00</atom:updated><title>Illustrer vos spécifications concordion</title><description>Voici le troisième article sur &lt;a href="http://www.concordion.org/"&gt;Concordion&lt;/a&gt; et surtout sur des extensions (pour les deux premiers voir : &lt;a href="http://clecuret.blogspot.com/2010/02/test-de-performance-avec-concordion.html"&gt;ici&lt;/a&gt; et &lt;a href="http://clecuret.blogspot.com/2010/04/une-proposition-de-sommaire-pour.html"&gt;là&lt;/a&gt;).&lt;br /&gt;
Cette fois, je vous propose d'illustrer vos spécifications. La base de cette extension est issue de l'&lt;a href="http://www.talios.com/embedding_screenshots_in_concordion_specifications.htm"&gt;article suivant&lt;/a&gt;. On y voit comment réaliser des captures d'écrans à intégrer dans concordion. Le seul défaut de cette approche est de capturer l'ensemble de l'écran alors que souvent, on s'intéresse seulement à une petite partie de ce dernier (un panneau de recherche, une toolbar...).&lt;br /&gt;
Maintenant, si ,comme moi, vous testez une application web, vous devez utiliser un outil comme &lt;a href="http://code.google.com/p/selenium/"&gt;selenium ou webdriver&lt;/a&gt; entre concordion et votre application. Et dans ce cas, la screenshotcommand peut être adaptée très facilement pour s'intéresser à une div par exemple.  &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_tGZOtLvFJv4/TCYBw9DVoDI/AAAAAAAACJU/V35eeIzdMik/s1600/html.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="105" src="http://2.bp.blogspot.com/_tGZOtLvFJv4/TCYBw9DVoDI/AAAAAAAACJU/V35eeIzdMik/s400/html.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Dans l'exemple qui suit, la méthode get() de la fixture doit renvoyer un renderedElement (vive webdriver !) ce dernier nous donne accès à sa taille et la position dans le référentiel de l'écran (encore une fois, vive webdriver!).&lt;br /&gt;
Ce qui est sympa avec cette méthode, c'est que vos spécifications peuvent être décorées pendant leur édition (la balise img) puis une fois exécutées, on obtient une base de comparaison ce que l'on attend (toujours la balise img) et ce que webdriver a effectivement capturé. Par exemple, voici un résultat :&amp;nbsp; &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_tGZOtLvFJv4/TCYB6eNaDuI/AAAAAAAACJY/flDL73-7UJo/s1600/res.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_tGZOtLvFJv4/TCYB6eNaDuI/AAAAAAAACJY/flDL73-7UJo/s1600/res.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Et maintenant, pour ceux que cela intéresse, voici le code :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java"&gt;package org.concordion.internal.command;


import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.concordion.api.Element;
import org.concordion.api.Evaluator;
import org.concordion.api.Resource;
import org.concordion.api.ResultRecorder;
import org.concordion.internal.CommandCall;
import org.concordion.internal.InvalidExpressionException;
import org.concordion.internal.RunListener;
import org.concordion.internal.util.Announcer;
import org.concordion.internal.util.Check;
import org.openqa.selenium.RenderedWebElement;
import org.openqa.selenium.ie.InternetExplorerElement;
import org.openqa.selenium.internal.Locatable;


/**
 * Modified version of ScreenshotCommand from Talios
 * Changes are :
 *  -deletion of unused private methods announce...
 *  -change namespace to identify my changes
 *  -add a specialization to capture webdriver RenderedWebElement 
 *  -add management of an expression in order to work with RenderedWebElement as an mandatory entry
 *  -change screenshot size; make it dependent of RenderedWebelement given as parameter
 *  -manage parameters width and height in order to consider only apart of RenderedWebElement
 * @author clecuret
 *
 */

public class ScreenshotCommand extends AbstractCommand {
 
    private static final String PROPERTY_OUTPUT_DIR = "concordion.output.dir";
    private File baseOutputDir;
 private Point loc = null;
    private Dimension dim = null;

 private Announcer&lt;runlistener&gt; listeners = Announcer.to(RunListener.class);

    public void addRunListener(RunListener runListener) {
        listeners.addListener(runListener);
    }

    public void removeRunListener(RunListener runListener) {
        listeners.removeListener(runListener);
    }

    @Override
    public void execute(CommandCall commandCall, Evaluator evaluator, ResultRecorder resultRecorder) {
        Check.isFalse(commandCall.hasChildCommands(), "Nesting commands inside an 'screenshot' is not supported");

        Element element = commandCall.getElement();
        String href = element.getAttributeValue("href");
        String width = element.getAttributeValue("width");
        String height = element.getAttributeValue("height");
        
        loc= new Point(0,0);
        dim = minOf(width,height,Toolkit.getDefaultToolkit().getScreenSize());
        
        String expression = commandCall.getExpression();
        Object result = evaluator.evaluate(expression);
        
        if (result != null &amp;amp;&amp;amp; result instanceof RenderedWebElement) {
            loc= ((Locatable)result).getLocationOnScreenOnceScrolledIntoView();
            dim= minOf(width,height,((RenderedWebElement)result).getSize());
            if (result instanceof InternetExplorerElement){
             loc.setLocation(loc.getX()+2, loc.getY()+dim.height/2);
            }
        } else {
            throw new InvalidExpressionException("Expression '" + expression + "' did not produce a renderedWebElement result (needed for screenshot).");
        }
        Resource res = commandCall.getResource().getRelativeResource(href);
        try {
            saveBackgroundImage(new File(getBaseOutputDir(),res.getPath()));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        Element imgElement = new Element("img");
        imgElement.addAttribute("src", href);
        if ((element.getChildElements().length&amp;gt;0) &amp;amp;&amp;amp; (element.getChildElements()[0].getLocalName().equals("img")) ){
         Element table = new Element("table");
         Element header = new Element("tr");
         header.appendChild(new Element("th").appendText("Expected"));
         header.appendChild(new Element("th").appendText("Result"));
         Element tr= new Element("tr");
         Element expected = new Element("td");
         element.moveChildrenTo(expected);
         tr.appendChild(expected);
         Element resul = new Element("td");
         resul.appendChild(imgElement);
         tr.appendChild(resul);
         table.appendChild(header);
         table.appendChild(tr);
         element.appendChild(table);
        }else {
         element.appendChild(imgElement);
        }
    }

    private Dimension minOf(String width,String height, Dimension dim) {
     return new Dimension(Math.min(specific(width),(int)dim.getWidth()), Math.min(specific(height), (int)dim.getHeight()));
 }

 private int specific(String size) {
  if (size==null)
     return 100000;
  try{
    return Integer.parseInt(size);
  }catch (NumberFormatException ex){
   return 100000;
  }
 }

 private File getBaseOutputDir() {
        if (baseOutputDir != null) {
            return baseOutputDir;
        }
        String outputPath = System.getProperty(PROPERTY_OUTPUT_DIR);
        if (outputPath == null) {
            return new File(System.getProperty("java.io.tmpdir"), "concordion");
        }
        return new File(outputPath);
    }
    
    private void saveBackgroundImage(final File output) throws IOException {
        BufferedImage image = getBackgroundImage();
        ImageIO.write(image, "jpg", output);
    }

    private BufferedImage getBackgroundImage() {
        try {
            Robot rbt = new Robot();
            BufferedImage background = rbt.createScreenCapture(new Rectangle(loc.x, loc.y, (int) dim.getWidth(), (int) dim.getHeight()));
            return background;
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

}
&lt;/runlistener&gt;&lt;/pre&gt;&lt;br /&gt;
Pour utiliser cette commande, le plus simple est de faire son propre concordionrunner :&lt;br /&gt;
&lt;pre class="brush:java"&gt;package org.concordion.internal.runner;

import org.concordion.api.ResultSummary;
import org.concordion.integration.junit4.ConcordionRunner;
import org.concordion.internal.ConcordionBuilder;
import org.concordion.internal.command.ScreenshotCommand;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;

/**
 * This class overide classical ConcordionRunner in order to add support of screenshotcommand
 * To use it, specify RunWith(MyConcordionRunner) at the top of your fixture
 * @author clecuret
 *
 */
public class MyConcordionRunner extends ConcordionRunner {

    
 public MyConcordionRunner(Class arg0) throws InitializationError {
  super(arg0);
 }

 @Override
    protected Statement specExecStatement(final Object fixture) {
        return new Statement() {
            public void evaluate() throws Throwable {
                ResultSummary resultSummary = new ConcordionBuilder()
                .withCommand("http://clecuret.blogspot.com/2010/concordion", "screenshot", new ScreenshotCommand())
                .build().process(fixture);
                resultSummary.print(System.out, fixture);
                resultSummary.assertIsSatisfied(fixture);
            }
        };
    }

}
&lt;/pre&gt;&lt;br /&gt;
J'espère que cela vous servira !!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-2661726872565597644?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bsjUzRC1SuYrRllykML73fNq6qw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bsjUzRC1SuYrRllykML73fNq6qw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bsjUzRC1SuYrRllykML73fNq6qw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bsjUzRC1SuYrRllykML73fNq6qw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/Djn6WMX01s4/illustrer-vos-specifications-concordion.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_tGZOtLvFJv4/TCYBw9DVoDI/AAAAAAAACJU/V35eeIzdMik/s72-c/html.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/06/illustrer-vos-specifications-concordion.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-5460983273578244447</guid><pubDate>Wed, 16 Jun 2010 20:37:00 +0000</pubDate><atom:updated>2010-06-16T21:37:23.241+01:00</atom:updated><title>Un petit rappel</title><description>Des articles de blog, j'en ai lu, j'en lu, et j'en lirai encore. Parmi toute ces lectures, il y a des masses de choses intéressantes mais trouver un article qui vous inspire reste plutôt rare.&lt;br /&gt;
Le dernier du genre date pour moi de début 2009. L'auteur est Régis Médina (et oui encore lui).&lt;br /&gt;
&lt;a href="http://www.regismedina.com/blog/2009/01/structure-preserving-transformations"&gt;Bonne lecture...&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-5460983273578244447?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/91QZqfcPWoD2vJgfR-tYtXX8zPE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/91QZqfcPWoD2vJgfR-tYtXX8zPE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/91QZqfcPWoD2vJgfR-tYtXX8zPE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/91QZqfcPWoD2vJgfR-tYtXX8zPE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/s1ESK2W7aLk/un-petit-rappel.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/06/un-petit-rappel.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-7700222237867750511</guid><pubDate>Thu, 29 Apr 2010 20:30:00 +0000</pubDate><atom:updated>2010-04-29T21:30:24.423+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">concordion</category><category domain="http://www.blogger.com/atom/ns#">junit</category><title>Une proposition de sommaire pour Concordion</title><description>Pour ceux qui lisent régulièrement ce blog, vous avez du remarquer que le projet &lt;a href="http://www.concordion.org/"&gt;Concordion&lt;/a&gt; me tient à cœur.&lt;br /&gt;
Depuis mes premières suggestions pour ajouter un sommaire (ça date de&lt;a href="http://clecuret.blogspot.com/2008/08/ajouter-un-sommaire-concordion-ide-n1.html"&gt; juin 2008&lt;/a&gt;), Concordion a évolué et propose maintenant, en particulier, la commande &lt;a href="http://www.concordion.org/dist/1.3.1/test-output/concordion/spec/concordion/command/run/Run.html"&gt;concordion:run&lt;/a&gt;.&lt;br /&gt;
Par cette commande, nous savons décorer un lien vers une autre page. Grâce à cela, on peut décrire une page "Table de matière" agissant un peu comme une TestSuite (de &lt;a href="http://www.junit.org/"&gt;Junit&lt;/a&gt;).&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;L'avantage de cette solution est de proposer une vue synthétique, ordonnée et évaluée de l'ensemble des tests (exactement ce que je voulais).&lt;/li&gt;
&lt;li&gt;Les inconvénients, à l'inverse, sont nombreux : &lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;Puisque la commande run lance les autres pages, il ne faut lancer avec junit que la page "Table des matières"; sinon, chaque tests sera lancé plusieurs fois ce qui en terme de temps d'execution, va vite devenir infernal.&lt;/li&gt;
&lt;li&gt;Ensuite puiusqu'on ne lance que la page "Table des matieres", Junit ne voit plus qu'un seul test; Si bien que tout les petits gadgets livrés sur les serveurs d'intégration continue pour suivre l'évolution du nombre de tests restent désespérement plats.&lt;/li&gt;
&lt;li&gt;Enfin, on ne peut espérer créer plusieurs "table des matières"; Par exemple, une orientée fonctionnelle, l'autre plutôt temporelle (avec des sections comme : "déjà instrumenté", "en cours", "à venir").&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
Pour venir à bout de ces inconvénients, il suffit de peu de choses :&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Tout d'abord, il faudrait que la commande concordion:run se souvienne des tests deja lancés afin de ne pas les relancer mais capitaliser sur le résultat précédent (une simple map statique doit faire l'affaire)&lt;/li&gt;
&lt;li&gt;Ensuite, il faudrait que la commande run agisse comme la tache ant-junit: c'est à dire qu'elle sache gérer un formatter xml afin de produire autant de fichiers xml que de pages testées.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Voila, en résumé, là où j'en suis. Pour ceux qui veulent essayer, j'ai posté mes ajouts et un projet exemple dans &lt;a href="http://sites.google.com/site/leucblog/Home/cts.tar.gz"&gt;l'archive suivante&lt;/a&gt;. Un&lt;a href="http://draft.blogger.com/%20http://tech.groups.yahoo.com/group/concordion/message/585"&gt; fil de discussion est par ailleurs ouvert dans le groupe Yahoo de Concordion&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
NB : dans l'archive, vous trouverez les sources d'un faux projet avec 2 sommaires et des specs : A, n1 et B ainsi que mes 2 nouvelles classes pour Concordion et enfin un fichier ant mettant en oeuvre tout cela. Le fichier &lt;a href="http://ant.apache.org/"&gt;ant&lt;/a&gt; est particulierement important puisqu'il montre comment utiliser ce patch (&lt;a href="http://ant.apache.org/manual/OptionalTasks/junit.html"&gt;fork=true, forkmode=one, pas de formatter junit&lt;/a&gt;, des propriétés en plus dans concordion).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-7700222237867750511?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XXZMUYMAluyNQVsf3emrKUp19gI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XXZMUYMAluyNQVsf3emrKUp19gI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XXZMUYMAluyNQVsf3emrKUp19gI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XXZMUYMAluyNQVsf3emrKUp19gI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/hg5_ILNZvTY/une-proposition-de-sommaire-pour.html</link><author>noreply@blogger.com (leuc)</author><thr:total>1</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/04/une-proposition-de-sommaire-pour.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-6880343907409283605</guid><pubDate>Wed, 10 Mar 2010 22:02:00 +0000</pubDate><atom:updated>2010-03-10T23:03:32.457+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">automatique</category><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">continu</category><category domain="http://www.blogger.com/atom/ns#">intégration continue</category><category domain="http://www.blogger.com/atom/ns#">mutter</category><category domain="http://www.blogger.com/atom/ns#">junit</category><category domain="http://www.blogger.com/atom/ns#">tests</category><category domain="http://www.blogger.com/atom/ns#">phpunit</category><title>Tester en continu</title><description>Depuis quelques années, ma quête d'&lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;agilité&lt;/a&gt; m'a conduit à intégrer de nouvelles pratiques de développement : promouvoir l'écriture des tests unitaires, mettre en place des serveurs d'&lt;a href="http://fr.wikipedia.org/wiki/Int%C3%A9gration_continue"&gt;intégration continue&lt;/a&gt;(*). Ces pratiques sont, maintenant, devenu des fondamentaux lors de nouveaux projets.&lt;br /&gt;
&lt;br /&gt;
A coté de cela, les éditeurs "riches" (eclipse, netbeans, IdeaJ...) et leur batterie de plugins ont aussi simplifié des tas de choses : la compilation automatique lors de la sauvegarde d'un fichier de source, les wizards pour créer des tests unitaires sont des outils très confortables.&lt;br /&gt;
Mais dernièrement, je me suis rendu compte, que, malgré mon attention à faire du test automatique et de l'intégration continue, je n'avais jamais mis en place de solution de "test en continu" (ou Continuous Testing pour les anglophones) sur mon pc.&lt;br /&gt;
&lt;br /&gt;
Le "Test en Continu" n'est pas vraiment de l'intégration continue car :&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;le but n'est pas d'intégrer tous les changements de tous les membres de l'équipe; ici c'est le changement sur la copie locale du projet qui nous intéresse.&lt;/li&gt;
&lt;li&gt;on ne lance tout le processus de livraison du produit mais on se concentre sur les tests unitaires afin de raccourcir la boucle de rétroaction suite à un changement de code.&lt;/li&gt;
&lt;/ul&gt;Assez de blabla,&amp;nbsp; passons à la pratique. Il nous faut :&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;un outil qui surveille des changements sur une partie du système de fichiers, puis lance une commande si lorque cela arrive et notifie du résultat. Il en existe plusieurs dont &lt;a href="http://heisel.org/blog/code/pywatch/"&gt;pywatch&lt;/a&gt; ou &lt;a href="http://github.com/traviscline/mutter/"&gt;mutter&lt;/a&gt; en python,&amp;nbsp; &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/"&gt;zentest:autotest&lt;/a&gt; ou &lt;a href="http://github.com/mynyml/watchr"&gt;watchr&lt;/a&gt; en ruby, &lt;a href="http://www.infinitest.org/"&gt;Infinitest&lt;/a&gt;, &lt;a href="http://www.junitmax.com/junitmax/subscribe.html"&gt;JunitMax&lt;/a&gt;&amp;nbsp; pour java et eclipse. J'ai opté pour mutter : c'est simple, petit, efficace et sur mon Ubuntu, le python, il y en a déjà plein...&lt;/li&gt;
&lt;li&gt;une commande pour lancer les tests : dans mon cas, en ce moment, c'est : phpunit --filter /.*_Test.*/ --colors --log-junit /tmp/phpunit.xml mon/dossier/de/tests/phpunit/&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;Résultat : mutter me notifie par des sons (des mp3) du résultat de ma commande dès qu'un fichier de source ou de test est modifié. &lt;a href="http://www.phpunit.de/"&gt;PhpUnit&lt;/a&gt; fait de même en couleur grace à l'option --colors.&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_tGZOtLvFJv4/S5gSBb6CoHI/AAAAAAAACJM/OUOHuli7URY/s1600-h/mutter.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://4.bp.blogspot.com/_tGZOtLvFJv4/S5gSBb6CoHI/AAAAAAAACJM/OUOHuli7URY/s640/mutter.png" width="640" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et voila, fini les clics à l'infini sur le bouton run dans eclipse. Fini d'oublier de lancer un tests parce que "bien sur, il peut pas y avoir d'effet de bord avec ma modif". &lt;br /&gt;
Elle est pas belle la vie !!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*) : Ce que j'appelle&amp;nbsp; "serveurs d'intégration continue" : ce sont ces serveurs (via &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; ou &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;CruiseControl&lt;/a&gt; ou ...) qui surveillent régulièrement &lt;a href="http://fr.wikipedia.org/wiki/Logiciel_de_gestion_de_versions"&gt;votre gestionnaire de configuration&lt;/a&gt; (svn ...) préféré pour détecter des changements et exécuter automatiquement tout le processus de livraison de votre produit (extraction des sources, compilation, test unitaires, packaging, déploiement, tests fonctionnels...). Ces solutions sont très pratiques pour détecter au plus tôt des effets de bords entre des changements effectués par plusieurs développeurs par exemple.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-6880343907409283605?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QlPhnezwi2OjpPSV1VKlOETcIeg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QlPhnezwi2OjpPSV1VKlOETcIeg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QlPhnezwi2OjpPSV1VKlOETcIeg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QlPhnezwi2OjpPSV1VKlOETcIeg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/zsyJIlXofk0/tester-en-continu.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_tGZOtLvFJv4/S5gSBb6CoHI/AAAAAAAACJM/OUOHuli7URY/s72-c/mutter.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/03/tester-en-continu.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-7543056190661267738</guid><pubDate>Wed, 24 Feb 2010 22:10:00 +0000</pubDate><atom:updated>2010-02-27T13:44:53.274+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rétrospective</category><category domain="http://www.blogger.com/atom/ns#">lecture</category><category domain="http://www.blogger.com/atom/ns#">équipe</category><category domain="http://www.blogger.com/atom/ns#">confiance</category><category domain="http://www.blogger.com/atom/ns#">réunions</category><title>Les 5 dysfonctions d'une équipe</title><description>&lt;div style="text-align: justify;"&gt;&lt;a href="http://clecuret.blogspot.com/2008/11/relecture-du-livre-le-but.html"&gt; C&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tGZOtLvFJv4/S4j7-jcZQbI/AAAAAAAACJA/AluiHtEvvjE/s1600-h/5dys.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 188px; height: 266px;" src="http://2.bp.blogspot.com/_tGZOtLvFJv4/S4j7-jcZQbI/AAAAAAAACJA/AluiHtEvvjE/s320/5dys.png" alt="" id="BLOGGER_PHOTO_ID_5442877201762042290" border="0" /&gt;&lt;/a&gt;&lt;a href="http://clecuret.blogspot.com/2008/11/relecture-du-livre-le-but.html"&gt;e livre de &lt;/a&gt;&lt;a href="http://www.tablegroup.com/"&gt;Patrick Lencioni&lt;/a&gt; est "roman industriel" dans la lignée des &lt;a href="http://clecuret.blogspot.com/2008/11/relecture-du-livre-le-but.html"&gt;livres de E Goldratt&lt;/a&gt;. Les 237 pages de la version française de "The 5 Dysfuntions of a team" se lisent donc très   facilement (ça ne nécessite pas de connaissances particulières) et très rapidement.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;Le sujet de cette fable est &lt;span style="font-weight: bold;"&gt;le travail en équipe&lt;/span&gt; : son intérêt et surtout les difficultés d'y parvenir.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;J'ai aimé ce&lt;/u&gt;&lt;u&gt; livre parce que :&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Il affirme que le groupe doit passer avant l'individu.&lt;/li&gt;&lt;li&gt;Il présente des arguments simples pour expliquer pourquoi la confiance (accepter d'admettre ces faiblesses aux autres en toute honnêteté sans crainte qu'ils en profitent) est la base pour envisager véritablement du "travail en équipe".&lt;/li&gt;&lt;li&gt;La dernière partie qui propose un test pour évaluer son équipe ou ses équipes.&lt;/li&gt;&lt;li&gt;Enfin, le point majeur (pour ce qui me concerne) : C'est un véritable plaidoyer pour l'organisation de rétrospectives (rencontre périodique de l'équipe sur l'amélioration dans les méthodes agiles). Je suis ravi d'avoir découvert ce livre car, depuis la dernière réorganisation au sein de mon entreprise, les rétrospectives commençaient à passer de mode (en particulier, la sensation de parfois participé à une psychanalyse de groupe) et il était largement temps que je retrouve des arguments motivant de continuer ces réunions. C'est chose faite, Merci Mr Lencioni.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;u&gt;Je n'ai pas aimé :&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cela se lit vite, très vite, trop vite.&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/1356929505478449949-7543056190661267738?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/N639AHuph2J4_ivA4kR51H0zBJk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N639AHuph2J4_ivA4kR51H0zBJk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/N639AHuph2J4_ivA4kR51H0zBJk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N639AHuph2J4_ivA4kR51H0zBJk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/9a7sZ4DGaGs/les-5-dysfonctions-dune-equipe.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_tGZOtLvFJv4/S4j7-jcZQbI/AAAAAAAACJA/AluiHtEvvjE/s72-c/5dys.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/02/les-5-dysfonctions-dune-equipe.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-2006193234412502426</guid><pubDate>Sat, 20 Feb 2010 21:40:00 +0000</pubDate><atom:updated>2010-02-22T08:56:22.611+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">booksmart</category><title>Booksmart sous Ubuntu sans wine</title><description>Pour ceux qui ont l'habitude de suivre ce blog, vous avez sous doute remarqué que, régulièrement, un article paraissait sur Booksmart (&lt;a href="http://clecuret.blogspot.com/2008/01/booksmart-sur-linux-cest-possible.html"&gt;là&lt;/a&gt;, &lt;a href="http://clecuret.blogspot.com/2008/04/booksmart-sur-linux-cest-de-nouveau.html"&gt;là&lt;/a&gt;, &lt;a href="http://clecuret.blogspot.com/2008/11/sondage-booksmart-sur-linux.html"&gt;là&lt;/a&gt;...).&lt;br /&gt;
Booksmart est toujours un très joli outil pour éditer des livres photos, il est toujours écrit en java et Blurb (l'éditeur), refuse toujours de diffuser une version Linux (pour du java, c'est quand même un comble). &lt;br /&gt;
Il y a 3 jours, je suis retourné sur le site de Blurb et me suis aperçu que les versions de Booksmart évoluaient toujours (2.5.1 actuellement). J'ai donc décidé de conclure la série d'article sous Booksmart par le compte rendu de mon installation de la Booksmart 2.5.1 sur Ubuntu karmic.&lt;br /&gt;
Voici les étapes : &lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;wget http://downloads.blurb.com/booksmart/BookSmart_2.5.1.dmg&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;i&gt;wget&amp;nbsp; http://fr.archive.ubuntu.com/ubuntu/pool/universe/d/dmg2img/dmg2img_1.6.1-1_i386.deb&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;dpkg -i dmg2img_1.6.1-1_i386.deb&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;dmg2img&amp;nbsp; BookSmart_2.5.1.dmg BookSmart_2.5.1.img&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo mkdir -p /macbooksmart&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo modprobe hfsplus &amp;amp;&amp;amp; sudo modprobe hfs&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo mount -t hfsplus -o loop BookSmart_2.5.1.img /macbooksmart&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo mkdir /usr/lib/booksmart/ &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; sudo cp -r /macbooksmart/BookSmart.app/Contents/Resources/Java/lib/ /usr/lib/booksmart/&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo cp -r /macbooksmart/BookSmart.app/Contents/Resources/Java/resources/ /usr/lib/booksmart/&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo umount /macbooksmart&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo rmdir /macbooksmart&lt;/span&gt;&lt;span style="font-family: courier new,monospace;"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;   &lt;br /&gt;
&lt;br /&gt;
Pour lancer l'application, je crée un fichier nommé booksmart (qu'il faut rendre executable avant de l'utiliser : &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;chown +x booksmart&lt;/span&gt;) avec le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;span style="font-family: courier new,monospace;"&gt;#! /bin/sh&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;cd /usr/lib/booksmart&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace;"&gt;for file in lib/*; do &lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt; &amp;nbsp; LOCALCLASSPATH="$LOCALCLASSPATH:$file" &lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt; done&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style="font-family: courier new,monospace;"&gt;sudo java -Xincgc -ea -Xms256m -Xmx1024m -classpath &lt;/i&gt;&lt;i&gt;&lt;span style="font-family: courier new,monospace;"&gt;$LOCALCLASSPATH&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-family: courier new,monospace;"&gt; com.blurb.booksmart.application.BookSmart&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace;"&gt;exit $?&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Et voila, 5 minutes chrono plus tard, Booksmart 2.5.1 tourne sur ma Karmic. Je suis loin de mes premiers essais ou il me fallait décompiler pour créer des patchs...&lt;br /&gt;
Pour obtenir ce résultat, il m'a fallu :&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;comprendre qu'un logiciel java packagé pour Mac est plus compatible avec Linux que son homologue packagé Microsoft (version de jre, dll).&lt;/li&gt;
&lt;li&gt;avoir une Ubuntu Karmic qui est compatible avec le packet dmg2img qui sera présent dans Ubuntu Lucid (repository universe).&lt;/li&gt;
&lt;li&gt; admettre qu'une boucle for est le plus efficace pour générer un classpath java avec tous les jars d'un dossier.&lt;/li&gt;
&lt;/ul&gt;&lt;code class="focusRow subFocusRow " role="listitem"&gt; &lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-2006193234412502426?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KnoGLwJvkaiFtgn_BiTVv50ckcc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KnoGLwJvkaiFtgn_BiTVv50ckcc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KnoGLwJvkaiFtgn_BiTVv50ckcc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KnoGLwJvkaiFtgn_BiTVv50ckcc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/yInkzD0Cw0I/booksmart-sous-ubuntu-sans-wine.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/02/booksmart-sous-ubuntu-sans-wine.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-5649642699132472094</guid><pubDate>Thu, 11 Feb 2010 07:45:00 +0000</pubDate><atom:updated>2010-02-11T08:45:56.359+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">performance</category><category domain="http://www.blogger.com/atom/ns#">concordion</category><category domain="http://www.blogger.com/atom/ns#">tests</category><title>Test de performance avec Concordion</title><description>Pour ceux qui ne connaissent pas Concordion, lisez d'abord &lt;a href="http://jfhelie.blogspot.com/2008/05/concordion.html"&gt;cet article en français &lt;/a&gt;et surtout le site de &lt;a href="http://www.concordion.org/"&gt;Concordion&lt;/a&gt;.&lt;br /&gt;
En résumé, Concordion permet de rendre exécutable des documents (des spécifications logicielles ou un cahier des charges par exemple) afin de vérifier la correspondance entre le besoin exprimé et le code effectif du logiciel. On peut alors automatiser des tests de validation par exemple.&lt;br /&gt;
Dernièrement un test Concordion m'a posé quelques problèmes car il se mêlait de vérifier à la fois la réalisation d'une fonction mais aussi le temps de réponse de cette dernière, chose du genre:&lt;br /&gt;
&lt;i&gt;"Après avoir choisi une ville dans la configuration, un graphique doit présenter la répartition des données en moins de 5 secondes."&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
En conséquence, ma fixture réalisait les préconditions ("avoir choisi une ville dans la configuration"), attendait 5 secondes puis vérifiait la présence d'un graphique.&lt;br /&gt;
Quand le test était OK, tout était pour le mieux mais dans le cas inverse, avec ce test, pas moyen de savoir si le graphique ne s'affichera jamais ou s'il se serait afficher 1 seconde ou 2 plus tard.&lt;br /&gt;
&lt;br /&gt;
C'est à cause de ce genre de test (que l'on peut rapprocher des "tests de performance") que j'ai essayé de recencer ce qu'il était possible de réaliser avec Concordion.&lt;br /&gt;
La principale difficulté réside dans le fait que Concordion propose un &lt;a href="http://www.concordion.org/dist/1.3.1/test-output/concordion/spec/concordion/command/Command.html"&gt;nombre limité de commandes&lt;/a&gt;. On dispose de assertEquals et de assertTrue (ou assertFalse) mais pas de chose comme assertGreaterThan par exemple.&lt;br /&gt;
Tester qu'une fonction répond en moins de x secondes revient à réaliser l'opération de comparaison dans la fixture (via une méthode renvoyant un booléen) et à utiliser un assertTrue.&lt;br /&gt;
&lt;br /&gt;
Du coup, si la fonction répond en plus de temps, le test est bien rouge mais n'indique que la valeur false (alors que l'on attend true).&amp;nbsp; (voir exemple 1 ci dessous)&lt;br /&gt;
&lt;br /&gt;
On obtient un peu plus d'information en utilisant assertEquals comme le montre l'exemple 2 ci dessous.&lt;br /&gt;
&lt;br /&gt;
Enfin, depuis la version 1.3.1RC5, on dispose d'une nouvelle commande "echo" qui étend nettement les solutions à cette problématique; car en plus de pouvoir tester que le temps de réponse est acceptable (assertTrue), on sait par ailleurs affiché la durée réelle d'éxecution; c'est l'exemple 3.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_tGZOtLvFJv4/S3O00i9DixI/AAAAAAAACIw/uwDRMIQKp1A/s1600-h/concordionPerfTest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_tGZOtLvFJv4/S3O00i9DixI/AAAAAAAACIw/uwDRMIQKp1A/s640/concordionPerfTest.png" width="569" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
La classe à tester dans les exemples est la suivante:&lt;br /&gt;
&lt;pre class="brush:java"&gt;package magicaltools;
import java.util.Random;

public class GoldenHammer {
    private static Random r = new Random();
 public void wait(int nms){
        long t0, t1;
        nms = nms + r.nextInt(150) - 75;
        t0 =  System.currentTimeMillis();
        do{
            t1 = System.currentTimeMillis();
        }
        while ((t1 - t0) &amp;lt; (nms));
    }
}
&lt;/pre&gt;Pour accrocher ma spécification Concordion au code, j'utilise la fixture junit suivante :  &lt;br /&gt;
&lt;pre class="brush:java"&gt;package magicaltools;

import org.concordion.api.ExpectedToFail;
import org.concordion.integration.junit4.ConcordionRunner;
import org.junit.runner.RunWith;

@RunWith(ConcordionRunner.class)
@ExpectedToFail
public class GoldenHammerTest extends StopWatch{

 private GoldenHammer my = new GoldenHammer();
    
 public Boolean assertAnswerInLessThan(int approx_duration,int limit){
  start();
  my.wait(approx_duration);
  return stop()&amp;lt;limit*1000;
 }
 
 public String answerInLessThan2s(int approx_duration){
  start();
  my.wait(approx_duration);
  return (stop()&amp;lt;2000)?"moins de 2 secondes":""+realDuration()+" ms";
 }
 

 public String answerInLessThan2sAndExpect2fail(int approx_duration){
  return answerInLessThan2s(approx_duration);
 }
}
&lt;/pre&gt;NB : la classe utilitaire Stopwatch possède l'implémentation suivante :  &lt;br /&gt;
&lt;pre class="brush:java"&gt;package magicaltools;

public class StopWatch {
 private long m_duration = 0;
 private long start =0L;
 public void start(){start = System.currentTimeMillis();}
 public long stop(){
  m_duration = System.currentTimeMillis()-start;
  return m_duration;
 }
 public long realDuration(){return m_duration;}
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-5649642699132472094?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8EeJXyC32UEqwW2Xyl8yFfxAOLg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8EeJXyC32UEqwW2Xyl8yFfxAOLg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8EeJXyC32UEqwW2Xyl8yFfxAOLg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8EeJXyC32UEqwW2Xyl8yFfxAOLg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/dXr8doTP7_E/test-de-performance-avec-concordion.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_tGZOtLvFJv4/S3O00i9DixI/AAAAAAAACIw/uwDRMIQKp1A/s72-c/concordionPerfTest.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/02/test-de-performance-avec-concordion.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-2511885408239155722</guid><pubDate>Sun, 31 Jan 2010 18:35:00 +0000</pubDate><atom:updated>2010-02-24T23:12:41.212+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">lecture</category><category domain="http://www.blogger.com/atom/ns#">gtd</category><title>Halte à la procrastination et aux atermoiements</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_tGZOtLvFJv4/S2WAohoG9RI/AAAAAAAACIs/sRUhu73wDJk/s1600-h/gtd.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_tGZOtLvFJv4/S2WAohoG9RI/AAAAAAAACIs/sRUhu73wDJk/s320/gtd.png" width="215" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pour ceux qui ne connaissent pas ces termes (c'était mon cas, il y a 3 jours), cela signifie simplement "remettre au lendemain".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Et si vous êtes régulièrement victime de ce symptôme, je vous encourage à lire le livre " Getting things done" de David Allen. Sa méthode (souvent désignée par les initiales GTD) vous propose de revoir votre organisation du temps afin d'évacuer votre stress du retard et de l'accumulation des taches. C'est selon lui la clé pour gagner facilement en productivité.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Je ne vous cache pas qu'appliquer les principes de ce livre va remettre en question pas mal de vos (mauvaises) habitudes. En effet, David Allen vous propose essentiellement une discipline vous permettant de vous "vider" la tête et d'attaquer vos projets sans attendre.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Sinon, autant en parler dès maintenant, il existe des dérivés (édulcorés ou spécialisés) de la GTD. Par exemple :&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Zen To Done : &lt;a href="http://zenhabits.net/"&gt;Leo Babauta&lt;/a&gt; a pratiquer puis tenter de simplifier la méthode&lt;/li&gt;
&lt;li&gt;Inbox zero : &lt;a href="http://inboxzero.com/"&gt;Merlin Mann&lt;/a&gt; (créateur de &lt;a href="http://www.43folders.com/"&gt;43 Folders®&lt;/a&gt;) décrit comment gérer votre boite mail de façon efficace. &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/1356929505478449949-2511885408239155722?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/inEiMpihEP9NmhV3-8vFKTjfUHo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/inEiMpihEP9NmhV3-8vFKTjfUHo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/inEiMpihEP9NmhV3-8vFKTjfUHo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/inEiMpihEP9NmhV3-8vFKTjfUHo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/WUCOIntI75M/halte-la-procrastination-et-aux.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_tGZOtLvFJv4/S2WAohoG9RI/AAAAAAAACIs/sRUhu73wDJk/s72-c/gtd.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2010/01/halte-la-procrastination-et-aux.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-5096500839234821425</guid><pubDate>Fri, 23 Oct 2009 20:35:00 +0000</pubDate><atom:updated>2009-10-23T21:35:45.374+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">challenge</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>Encore un site de challenges !!</title><description>Après le &lt;a href="http://www.pythonchallenge.com/"&gt;python challenge&lt;/a&gt; (que je n'ai jamais fini...), le &lt;a href="http://software.challenge.googlepages.com/"&gt;Yet Another Software Challenge&lt;/a&gt; (&lt;a href="http://clecuret.blogspot.com/2007/05/un-nouveau-site-de-challenge.html"&gt;celui la&lt;/a&gt;, je l'ai fini), je conseille à tous les amateurs du genre : &lt;a href="http://www.hackthissite.org/"&gt;&lt;img alt="Hack This Site!" src="http://www.hackthissite.org/images/hts_80x15.gif" /&gt;&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Cette fois, l'idée est de se confronter au monde du web et aux différentes techniques permettant de hacker un site.&lt;br /&gt;
Si vous croyez maitriser ces techniques, et bien n'hésitez plus, ce site vous donnera rapidement votre score.&lt;br /&gt;
Pour les autres, si vous êtes curieux et que vous prenez le temps de vous documenter un peu (le &lt;a href="https://www.owasp.org/images/8/89/OWASP_Testing_Guide_V3.pdf"&gt;guide de reference&lt;/a&gt; du projet &lt;a href="http://www.owasp.org/index.php/Main_Page"&gt;owasp&lt;/a&gt; par exemple), essayer, ca ne coute rien et c'est très enrichissant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-5096500839234821425?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FojANdYe5-tkV6s1tgLDfKCqNM4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FojANdYe5-tkV6s1tgLDfKCqNM4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FojANdYe5-tkV6s1tgLDfKCqNM4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FojANdYe5-tkV6s1tgLDfKCqNM4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/Bvanayb_PM0/encore-un-site-de-challenges.html</link><author>noreply@blogger.com (leuc)</author><thr:total>1</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2009/10/encore-un-site-de-challenges.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-3865711925299777208</guid><pubDate>Mon, 10 Aug 2009 21:04:00 +0000</pubDate><atom:updated>2009-08-10T22:11:09.318+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">uml</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>UML en ligne</title><description>Dans le style : obtenir une diagramme UML (diagramme de classe et de séquence) à partir d'une expression litérale, il existait &lt;a href="http://www.umlgraph.org/"&gt;UmlGraph&lt;/a&gt; (UmlGraph exploite &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt; pour obtenir l'image du diagramme). L'outil était intéressant car très léger et permettant de transformer une description texte du modèle souhaité en diagramme.&lt;br /&gt;
&lt;br /&gt;
Depuis, le monde des web services est passé et nous disposons à présent de &lt;a href="http://yuml.me/"&gt;yuml.me&lt;/a&gt; (pour &lt;a href="http://yuml.me/diagram/scruffy/class/samples"&gt;les diagrammes de classes&lt;/a&gt; et les use cases) et de &lt;a href="http://www.websequencediagrams.com/"&gt;websequencediagrams&lt;/a&gt; (pour les diagrammes de séquences).&lt;br /&gt;
&lt;br /&gt;
Plus rien à installer pour faire de jolis diagrammes !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-3865711925299777208?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/035dyGGyIEduQJL9ETih-xGJKTo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/035dyGGyIEduQJL9ETih-xGJKTo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/035dyGGyIEduQJL9ETih-xGJKTo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/035dyGGyIEduQJL9ETih-xGJKTo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/H9RdqN-mVKw/uml-en-ligne.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2009/08/uml-en-ligne.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-4188735230169245192</guid><pubDate>Thu, 28 May 2009 06:55:00 +0000</pubDate><atom:updated>2009-05-31T08:01:39.433+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">informatique</category><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">xpdays</category><category domain="http://www.blogger.com/atom/ns#">extreme programming</category><category domain="http://www.blogger.com/atom/ns#">xp</category><category domain="http://www.blogger.com/atom/ns#">conférence</category><title>XP days 2009 : de C. Alexander à  M. Onfray</title><description>&lt;a href="http://www.patternlanguage.com/portraits/ca.res.arch1small.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://www.patternlanguage.com/portraits/ca.res.arch1small.jpg" width="163" /&gt;&lt;/a&gt;&lt;a href="http://pagesperso-orange.fr/michel.onfray/MichelOnfrayRome.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="http://pagesperso-orange.fr/michel.onfray/MichelOnfrayRome.JPG" width="200" /&gt;&lt;/a&gt;XP days France 2009 vient de se terminer et le bilan est globablement très positif. Je suis ravi de constater que cet évenemment attire de plus en plus de monde (250, cette année).&lt;br /&gt;
Mes présentations favorites sont (sans hésitation) :&lt;br /&gt;
&lt;ol&gt;&lt;li&gt; Le &lt;a href="http://www.xpday.fr/programme#LeDeveloppementHedoniste"&gt;développement hédoniste&lt;/a&gt; de &lt;a href="http://www.dominicwilliams.net/"&gt;Dominic Williams&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;La &lt;a href="http://www.xpday.fr/programme#LaTheorieDesCentresuneNouvelleFaconDeVoirLaConceptionIncrementaleDesLogiciels"&gt;théorie des centres&lt;/a&gt; de &lt;a href="http://www.regismedina.com/about"&gt;Régis Médina&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;br /&gt;
Ces deux présentations ont beaucoup de points communs selon moi (même si elles ne parlent pas du tout du même sujet):&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Des présentateurs charismatiques. Il est d'ailleurs curieux que, &lt;a href="http://clecuret.blogspot.com/2007/05/participation-xp-days-france.html"&gt;lors des XPdays 2007&lt;/a&gt;, ces deux orateurs étaient déjà remarqués (ables). &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Ce sont des exemples de présentations zen, très bien préparées (d'ailleurs, j'ai pu constater l'intérêt et la force de cette forme de support en assistant en fin de conférence à une &lt;a href="http://www.xpday.fr/programme#ManifestePourUneInformatiqueHedonisteEtResponsable"&gt;autre scéance sur l'hédonisme&lt;/a&gt; (plus classique dans la forme,cette fois)). &amp;nbsp; &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Ce sont des présentations "ambitieuses", des propositions de réflexion et des synthèses de recherche de parallele entre le développement informatique et des domaines n'ayant rien à voir (philosophie pour l'un, architecture pour le second).&lt;/li&gt;
&lt;li&gt;Un plan qui surprend : "Matérialisme, Jardin d'Epicure, Dieu, Le plaisir" pour Dominic et "Flow, Alexander, Centres, Code" pour Régis.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Sinon, j'ai particulièrement apprécié : "Acquérir de l'expertise Lean: Introduction aux &lt;a href="http://leanhealthcareperformance.com/lean/a3.php"&gt;A3&lt;/a&gt;" de Ignace Marie-Pia. C'est plus concret mais pas inintéressant du tout. Le caractère provocateur de l'oratrice (avec des phrases du genre : "j'aurais tendance à considérer le binomage comme un muda (&lt;a href="http://fr.wikipedia.org/wiki/Muda_%28japonais%29"&gt;muda&lt;/a&gt;=gaspillage)" ou "vous, qui êtes dogmatiques" en plein milieu des xpdays...) a énormement participé à l'attention que j'ai porté à cette présentation.&lt;br /&gt;
&lt;br /&gt;
Enfin, merci à Antoine Contal pour la discussion du dejeuner du mardi qui m'a permis de rattraper la présentation que j'ai loupé sur &lt;a href="http://www.xpday.fr/programme#XP20AmeliorerLAmeliorationContinueAvecLean"&gt;"XP2.0: améliorer l'amélioration continue avec Lean"&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
NB : les supports ne sont pas encore disponibles mais pour en savoir plus sur ces deux présentations; vous pouvez retrouver les idées générales &lt;a href="http://conception.developpez.com/reportage/agilite/xp-day-suisse-2009/?page=session-philosophique"&gt;ici&lt;/a&gt; et &lt;a href="http://www.growingcode.net/2008/09/christopher-alexander-theory-of-centers"&gt;là&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-4188735230169245192?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6IAKk4Z52jMM-sUPRb6Au2oNuoM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6IAKk4Z52jMM-sUPRb6Au2oNuoM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6IAKk4Z52jMM-sUPRb6Au2oNuoM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6IAKk4Z52jMM-sUPRb6Au2oNuoM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/FC0qI0gPKRA/xp-days-2009-de-c-alexander-m-onfray.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2009/05/xp-days-2009-de-c-alexander-m-onfray.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-3192195422740797428</guid><pubDate>Thu, 21 May 2009 11:20:00 +0000</pubDate><atom:updated>2009-05-21T13:17:04.195+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">animation</category><title>L'effet sparadrap</title><description>Un exemplaire d'animations de transition que je trouve magnifique; Oui je sais, ça ne sert à rien et on doit sans lasser rapidement.&lt;br /&gt;
Il n'empêche que je reste bluffé par la qualité de l'ergonomie et le soin apporté au rendu graphique sur des plateformes de type téléphone portable.&lt;br /&gt;
&lt;br /&gt;
Parmi tous les effets, mes deux préférés restent sans contexte l'effet sparadrap (le truc où on a l'impression d'enlever un post-it ou un pansement) et l'&lt;a href="http://www.curious-creature.org/2007/02/20/fast-image-processing-with-jogl/"&gt;effet de "bloom"&lt;/a&gt; sur l'élément ayant le focus.&lt;br /&gt;
&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Sz7llbmn1dA&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Sz7llbmn1dA&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&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/1356929505478449949-3192195422740797428?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a2pnvnvbm--WTEkyz1cDCsNcJvY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a2pnvnvbm--WTEkyz1cDCsNcJvY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a2pnvnvbm--WTEkyz1cDCsNcJvY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a2pnvnvbm--WTEkyz1cDCsNcJvY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/9efoN2FzpAY/leffet-sparadrap.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2009/05/leffet-sparadrap.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-1556317095745921421</guid><pubDate>Wed, 06 May 2009 20:39:00 +0000</pubDate><atom:updated>2009-05-06T21:39:00.452+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">zen</category><title>Conseil de lecture</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_tGZOtLvFJv4/SgHypCSx9pI/AAAAAAAACHA/VTL80UMyIao/s1600-h/41iLssLPHCL._SS500_.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_tGZOtLvFJv4/SgHypCSx9pI/AAAAAAAACHA/VTL80UMyIao/s200/41iLssLPHCL._SS500_.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;J'ai finalement pris le temps de lire le livre "présentation zen" de &lt;a href="http://www.presentationzen.com/"&gt;Garr Reynolds&lt;/a&gt;. &lt;br /&gt;
Ce qui est étrange avec ce livre, c'est la désagréable impression qu'une bonne part des recommandations sont simplement du bon sens. Du coup, une sorte de frustation apparait de ne s'être rendu compte plus tôt des erreurs standards que l'on fait par "habitude" dans des présentations.&lt;br /&gt;
Cette lecture est très instructive et permet de jeter une bonne fois pour toute le "style powerpoint" à la poubelle.&lt;br /&gt;
Ca fait du bien; Je conseille largement ce livre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1356929505478449949-1556317095745921421?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/N_CqB_aZpyAlgW07BjYvqaNGxoA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N_CqB_aZpyAlgW07BjYvqaNGxoA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/N_CqB_aZpyAlgW07BjYvqaNGxoA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N_CqB_aZpyAlgW07BjYvqaNGxoA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/0GIqgYoh3hk/conseil-de-lecture.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_tGZOtLvFJv4/SgHypCSx9pI/AAAAAAAACHA/VTL80UMyIao/s72-c/41iLssLPHCL._SS500_.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2009/05/conseil-de-lecture.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-6586743759925703064</guid><pubDate>Tue, 10 Mar 2009 08:44:00 +0000</pubDate><atom:updated>2009-04-05T09:18:58.437+01:00</atom:updated><title>Liquidbase</title><description>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.liquibase.org/custom_images/liquibase_logo.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="37" src="http://www.liquibase.org/custom_images/liquibase_logo.gif" style="cursor: move;" width="200" /&gt;&lt;/a&gt;Juste quelques mots pour vous faire partager un produit que je ne connaissais pas. Il s'agit de &lt;a href="http://www.liquibase.org/"&gt;LiquidBase&lt;/a&gt;. Ce produit (accompagné de son plugin eclipse) permet de présenter, aux développeurs, les modifications de schéma de la base de données (de votre application préférée) comme de simples refactorings (voir &lt;a href="http://www.liquibase.org/demos/ide_demo_0_6.htm"&gt;ici pour une petite démo&lt;/a&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Les modifications sont stockées dans un fichier changelog.xml qui peut donc être enregistré (comme n'importe quel autre fichier de source) dans votre gestionnaire de configuration préféré.&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Liquidbase utilise JDBC pour s'isoler et garder une indépendance vis à vis du SGBD que vous utilisez. Ensuite il offre tout un &lt;a href="http://www.liquibase.org/manual/command_line"&gt;lot de commandes&lt;/a&gt; pour gérer le cycle de vie de votre base; parmi elles :&amp;nbsp;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;tag &lt;tag&gt;&lt;/tag&gt;&lt;/li&gt;
&lt;li&gt;rollback &lt;tag&gt;&lt;/tag&gt;&lt;/li&gt;
&lt;li&gt;diff&lt;/li&gt;
&lt;li&gt;dbdoc&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Depuis le temps que je cherchais un équivalent sérieux à r&lt;a href="http://guides.rubyonrails.org/migrations.html"&gt;ake db:migrate de RubyOnRails&lt;/a&gt; ... Aurais-je trouver mon "&lt;a href="http://en.wikipedia.org/wiki/Golden_hammer"&gt;golden hammer&lt;/a&gt;" ?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Affaire à suivre...&lt;br /&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/1356929505478449949-6586743759925703064?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5T-M6JktWV6V1NggRYcpKKLIy1Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5T-M6JktWV6V1NggRYcpKKLIy1Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5T-M6JktWV6V1NggRYcpKKLIy1Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5T-M6JktWV6V1NggRYcpKKLIy1Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/cU9KozK35Tw/liquidbase.html</link><author>noreply@blogger.com (leuc)</author><thr:total>0</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2009/03/liquidbase.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1356929505478449949.post-8024794770250967793</guid><pubDate>Mon, 02 Mar 2009 15:11:00 +0000</pubDate><atom:updated>2009-03-10T10:35:35.618+01:00</atom:updated><title>A better team</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.abetterteam.org/images/art-of-agile-cover-small.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://www.abetterteam.org/images/art-of-agile-cover-small.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.abetterteam.org/"&gt;"a&lt;i&gt;better&lt;/i&gt;team.org"&lt;/a&gt; est une déclinaison en ligne du quiz proposé par &lt;a href="http://jamesshore.com/"&gt;James Shore&lt;/a&gt; et Shane Warden dans leur livre : "The art of Agile development". &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vous êtes membre d'une équipe XP, vous souhaitez évaluer votre équipe et suivre votre progression, cette application (de &lt;a href="http://sbastn.com/"&gt;Sebastian Hermida&lt;/a&gt;) est faite pour vous.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Le résultat est un graphe radar (rouge dans l'exemple ci dessous) accompagné de recommandations pour vous améliorer.&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_tGZOtLvFJv4/Sav2gw_SgPI/AAAAAAAACFU/0aGG7IrdtVc/s1600-h/abetterteam.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_tGZOtLvFJv4/Sav2gw_SgPI/AAAAAAAACFU/0aGG7IrdtVc/s400/abetterteam.png" style="cursor: move;" /&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/1356929505478449949-8024794770250967793?l=clecuret.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vOA0MSlS--Qtx65wwOEgZgV5G58/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vOA0MSlS--Qtx65wwOEgZgV5G58/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vOA0MSlS--Qtx65wwOEgZgV5G58/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vOA0MSlS--Qtx65wwOEgZgV5G58/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/LeucsBlog/~3/OEJTkfhPNgo/better-team.html</link><author>noreply@blogger.com (leuc)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_tGZOtLvFJv4/Sav2gw_SgPI/AAAAAAAACFU/0aGG7IrdtVc/s72-c/abetterteam.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://clecuret.blogspot.com/2009/03/better-team.html</feedburner:origLink></item></channel></rss>

