<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[fr.romain:blog:3.0]]></title>
  <link href="http://linsolas.github.com/atom.xml" rel="self"/>
  <link href="http://linsolas.github.com/"/>
  <updated>2014-07-04T20:37:54+02:00</updated>
  <id>http://linsolas.github.com/</id>
  <author>
    <name><![CDATA[Romain Linsolas]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[yo, man]]></title>
    <link href="http://linsolas.github.com/blog/2014/07/04/yo/"/>
    <updated>2014-07-04T20:24:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2014/07/04/yo</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/yeoman-fusee.png" title="yeoman" alt="yeoman" /></p>

<h1>yo, qu&#8217;est-ce que c&#8217;est ?</h1>

<p>Aujourd&#8217;hui, quand on fait du développement web, et donc en particulier du JavaScript, il n&#8217;est plus possible de se passer de bons outils pour développer correctement. <a href="http://yeoman.io/">Yeoman</a> est l&#8217;un d&#8217;entre eux. Cet outil est en fait une composition de trois outils :</p>

<ul>
<li><a href="http://gruntjs.com/">grunt</a>, le &#8221;<a href="http://ant.apache.org/">Ant</a>&#8221; du JavaScript, c&#8217;est-à-dire un exécuteur de tâches ;</li>
<li><a href="http://bower.io/">bower</a> le gestionnaire de dépendances ;</li>
<li><a href="https://github.com/yeoman/yo">yo</a> dont on va parler ici.</li>
</ul>


<p>Yo est ce que l&#8217;on appelle un <em>project scaffolder</em>, que l&#8217;on pourrait traduire en français par &#8220;échaffaudeur de projet&#8221;. Ok, on n&#8217;est pas trop aidé. L&#8217;idée derrière ce genre d&#8217;outils est de générer le squelette d&#8217;une application en fonction d&#8217;un contexte donné. Un exemple tout bête : je souhaite démarrer une application avec AngularJS. Plutôt que de passer quelques minutes / heures à configurer les bases de mon projet, je vais utiliser un générateur <code>yo</code> pour me faire ce travail. Une fois exécuté, je n&#8217;aurais alors plus qu&#8217;à développer mon projet, toutes les bases étant mises en place.</p>

<h2>Installation de yo</h2>

<p>L&#8217;utilitaire <code>yo</code> s&#8217;installe via <code>npm</code>, ce qui signifie qu&#8217;il vous faudra installer <a href="http://nodejs.org/">NodeJS</a> si ce n&#8217;est déjà fait. Une fois installé, il suffit de lancer la commande <code>npm install -g yo</code> (l&#8217;option <code>-g</code> assure une installation globale au système) pour que <code>yo</code> soit installé. Un petit <code>yo -v</code> nous assurera de sa bonne installation.</p>

<h2>Utiliser un générateur yo</h2>

<p>Concrètement, <code>yo</code> va faire appel à un générateur spécifique pour générer le squelette de notre application. Si je tape simplement <code>yo</code> dans ma console, celui-ci va me propose quelques options (le nombre d&#8217;options va dépendre de ce qui est installé sur ma machine) :</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$&gt; yo
</span><span class='line'>[?] What would you like to do? (Use arrow keys)
</span><span class='line'>&gt; Run the Generator generator (0.4.4)
</span><span class='line'>  Run the Webapp generator (0.4.9)
</span><span class='line'>  Run the Karma generator (0.8.1)
</span><span class='line'>  Run the Mocha generator (0.1.3)
</span><span class='line'>  Update your generators
</span><span class='line'>  Install a generator
</span><span class='line'>  Find some help
</span><span class='line'>  Get me out of here!</span></code></pre></td></tr></table></div></figure>


<p>Comme vous le voyez, les choix qui s&#8217;offrent à moi sont soit l&#8217;exécution d&#8217;un générateur, soit la mise à jour ou l&#8217;installation de nouveaux générateurs.
Normalement, seuls les deux premiers générateurs (générateur de générateur <code>yo</code> et générateur d&#8217;applications web) sont disponibles initialement.</p>

<p>Admettons que nous voulons créer une application AngularJS. Nous allons donc faire appel au <a href="https://github.com/yeoman/generator-angular">générateur Angular</a>. Deux options s&#8217;offrent à nous :</p>

<ol>
<li>Passer par la commande <code>npm install -g generator-angular</code>, qui installera le générateur ;</li>
<li>Passer par la ligne de commande de <code>yo</code> :</li>
</ol>


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$&gt; yo
</span><span class='line'>[?] What would you like to do?
</span><span class='line'>  Run the Generator generator (0.4.4)
</span><span class='line'>  Run the Karma generator (0.8.1)
</span><span class='line'>  Run the Webapp generator (0.4.9)
</span><span class='line'>  Run the Mocha generator (0.1.3)
</span><span class='line'>  Update your generators
</span><span class='line'>&gt; Install a generator
</span><span class='line'>  Find some help
</span><span class='line'>  Get me out of here!
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>$&gt; yo
</span><span class='line'>[?] What would you like to do? Install a generator
</span><span class='line'>[?] Search NPM for generators: angular
</span><span class='line'>[?] Here's what I found. Install one? (Use arrow keys)
</span><span class='line'>&gt; generator-angular
</span><span class='line'>  generator-angular-axiom
</span><span class='line'>  generator-angular-beego
</span><span class='line'>  generator-angular-bootstrap
</span><span class='line'>  generator-angular-bootstrap-less
</span><span class='line'>  generator-angular-browserify-express
</span><span class='line'>  generator-angular-caveman2
</span><span class='line'>  generator-angular-cmelion
</span><span class='line'>(Move up and down to reveal more choices)</span></code></pre></td></tr></table></div></figure>


<p>Dans les deux cas, c&#8217;est bien <code>npm</code> qui va s&#8217;exécuter pour installer le générateur.
Pour lancer la génération, c&#8217;est la même chose : soit nous exécutons la commande <code>yo angular</code> (le nom du générateur, sans le <code>generator-</code> devant), soit nous passons par la commande <code>yo</code> et on se laisse guider par l&#8217;outil. Attention, <code>yo</code> génère les sources de l&#8217;application dans le répertoire courant, pensez donc à créer un sous-répertoire avant.</p>

<p>Là, en fonction du générateur, un certain nombre de questions vont nous être posées, par exemple pour savoir si nous voulons utiliser <a href="http://sass-lang.com/">SASS</a> ou <a href="http://getbootstrap.com/">Bootstrap</a> :</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$&gt; yo angular
</span><span class='line'>
</span><span class='line'>     _-----_
</span><span class='line'>    |       |
</span><span class='line'>    |--(o)--|   .--------------------------.
</span><span class='line'>   `---------´  |    Welcome to Yeoman,    |
</span><span class='line'>    ( _´U`_ )   |   ladies and gentlemen!  |
</span><span class='line'>    /___A___\   '__________________________'
</span><span class='line'>     |  ~  |
</span><span class='line'>   __'.___.'__
</span><span class='line'> ´   `  |° ´ Y `
</span><span class='line'>
</span><span class='line'>Out of the box I include Bootstrap and some AngularJS recommended modules.
</span><span class='line'>
</span><span class='line'>[?] Would you like to use Sass (with Compass)? No
</span><span class='line'>[?] Would you like to include Bootstrap? Yes
</span><span class='line'>[?] Which modules would you like to include? (Press &lt;space&gt; to select)
</span><span class='line'>&gt;[X] angular-resource.js
</span><span class='line'> [X] angular-cookies.js
</span><span class='line'> [X] angular-sanitize.js
</span><span class='line'> [X] angular-route.js</span></code></pre></td></tr></table></div></figure>


<p>Une fois la commande terminée, nous diposons d&#8217;un répertoire bien configuré. Il est parfois requis d&#8217;exécuter les commandes <code>npm install</code> (pour installer les contributions Grunt) et <code>bower update</code> (pour télécharger les dépendances de l&#8217;application) afin d&#8217;être tout à fait prêt, mais normalement le générateur va se charger de cette opération.
Voici les principaux éléments de structure de l&#8217;application générée :</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>bower.json                     -&gt; Déclaration des dépendences pour Bower
</span><span class='line'>Gruntfile.js                   -&gt; Définition des tâches pour Grunt
</span><span class='line'>package.json                   -&gt; Description de l'application
</span><span class='line'>  +- app                       -&gt; Répertoire des sources
</span><span class='line'>  |    +- bower_components     -&gt; Dépendences téléchargées par Bower
</span><span class='line'>  |    + *                     -&gt; Sources de l'application
</span><span class='line'>  +- node_modules              -&gt; Modules NodeJS nécessaires à l'application (essentiellement pour Grunt)
</span><span class='line'>  +- test                      -&gt; Répertoire des tests (Karma et Jasmine)
</span><span class='line'>       +- *                    -&gt; Sources des tests
</span></code></pre></td></tr></table></div></figure>


<p>Comme on peut le voir, <code>yo</code> fait appel à ses deux copains de <code>yeoman</code> pour travailler : <code>Bower</code> et <code>Grunt</code>.
En tapant par exemple <code>grunt serve</code>, <code>Grunt</code> va exécuter quelques tâches et démarrer un serveur :</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$&gt; grunt serve
</span><span class='line'>Running "serve" task
</span><span class='line'>
</span><span class='line'>Running "clean:server" (clean) task
</span><span class='line'>
</span><span class='line'>Running "bowerInstall:app" (bowerInstall) task
</span><span class='line'>
</span><span class='line'>Running "concurrent:server" (concurrent) task
</span><span class='line'>
</span><span class='line'>Running "copy:styles" (copy) task
</span><span class='line'>Copied 1 files
</span><span class='line'>
</span><span class='line'>Done, without errors.
</span><span class='line'>
</span><span class='line'>Running "autoprefixer:dist" (autoprefixer) task
</span><span class='line'>Prefixed file ".tmp/styles/main.css" created.
</span><span class='line'>
</span><span class='line'>Running "connect:livereload" (connect) task
</span><span class='line'>Started connect web server on 127.0.0.1:9000.
</span><span class='line'>
</span><span class='line'>Running "watch" task
</span><span class='line'>Waiting...</span></code></pre></td></tr></table></div></figure>


<p>Grâce à la tâche <a href="https://github.com/gruntjs/grunt-contrib-livereload">livereload</a> de <code>Grunt</code>, chaque modification du code va entraîner le rechargement automatique de la page :</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Waiting...OK
</span><span class='line'>&gt;&gt; File "app\views\main.html" changed.
</span><span class='line'>
</span><span class='line'>... Reload app\views\main.html ...
</span><span class='line'>Completed in 0.001s at Sun Jun 01 2014 11:02:17 GMT+0200 (Romance Daylight Time) - Waiting...</span></code></pre></td></tr></table></div></figure>


<p>Comme je le disais plus haut, cela prend à peine une minute, et au final, nous disposons d&#8217;une application prête pour le développement.</p>

<h2>Créer son propre générateur</h2>

<p>Bien qu&#8217;il existe tout un tas de générateur, il peut arriver le besoin d&#8217;en créer un soi-même. C&#8217;est le rôle du <code>generator-generator</code>, qui comme son nom l&#8217;indique, génère le squelette d&#8217;un générateur. Je vais faire un peu ma faignasse, mais je vais profiter de l&#8217;excellente présentation réalisée par <a href="https://twitter.com/laut3rry">Thierry Lau</a> sur ce sujet :</p>

<p><a href="http://lauterry.github.io/prez-yeoman-generator/">http://lauterry.github.io/prez-yeoman-generator/</a></p>

<p>Pour résumer, si vous devez vous lancer dans un projet, plutôt que de perdre du temps, passez vite à <strong>yo</strong> !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hackathon Société Générale]]></title>
    <link href="http://linsolas.github.com/blog/2014/05/19/hackathon-societe-generale/"/>
    <updated>2014-05-19T20:25:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2014/05/19/hackathon-societe-generale</id>
    <content type="html"><![CDATA[<p>Le mois dernier, la Société Générale <a href="http://linsolas.github.io/blog/2014/05/19/retour-sur-devoxx-france-2014/">était sponsor</a> de la conférence <a href="http://www.devoxx.fr">Devoxx France</a>. Une chose assez inhabituelle pour le signaler ! Hé bien ce n&#8217;est pas fini, car la Société Générale, avec l&#8217;aide de <a href="http://events.bemyapp.com/events/index/france">BeMyApp</a> organise ce week-end un Hackathon.</p>

<p><img src="http://linsolas.github.com/images/hackathon-sg.jpg" title="Hackathon SG" alt="Hackathon SG" /></p>

<h2>C&#8217;est quoi donc ?</h2>

<p>Le hackathon, à ne pas confondre avec le hackchaton (qui doit sans doute consister à coder avec des petits chatons) est un événement destiné à créer des applications sur un laps de temps assez court, généralement un week-end.
Ainsi, pendant près de 48 heures, plusieurs dizaines d&#8217;équipes vont concourir pour créer la plus belle application. Le thème est d&#8217;&#8221;<em>inventer la DSI de demain</em>&#8221;. Quoi ce n&#8217;est pas clair ? Ok, pour être plus précis, il s&#8217;agit de créer des applications ou des services pour aider les développeurs de la SG.
Bon, je vous rassure tout de suite, le code est et restera la propriété de leurs auteurs. L&#8217;idée n&#8217;est certainement pas de faire travailler des gens à l&#8217;oeil, mais plutôt de montrer que nous sommes des développeurs sympa et modernes à la SG !</p>

<p>Toutes les informations sur l&#8217;événement sont ici : <a href="http://hackathonsg.bemyapp.com/">http://hackathonsg.bemyapp.com/</a></p>

<p>Si vous venez à ce Hackathon, n&#8217;hésitez pas à me faire un petit coucou, j&#8217;y serais le vendredi soir, où je donnerais d&#8217;ailleurs une présentation sur les web components (il s&#8217;agit de celle de Devoxx France 2014, mais améliorée).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Retour sur Devoxx France 2014]]></title>
    <link href="http://linsolas.github.com/blog/2014/05/19/retour-sur-devoxx-france-2014/"/>
    <updated>2014-05-19T20:10:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2014/05/19/retour-sur-devoxx-france-2014</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/devoxx_logo.gif" title="Devoxx France 2014" alt="Devoxx France 2014" /></p>

<h1>Devoxx France 2014</h1>

<p>Habituellement, pendant et juste après un Devoxx, je pourri gentillement mon blog avec des billets expliquant en détail les sessions que j&#8217;ai suivi, ainsi qu&#8217;un billet récapitulatif.
Cette année, je vais me contenter du billet récapitulatif, et avec un mois de retard en plus ! Tout se perd&#8230;</p>

<p>A vrai dire, tout cela a une raison bien précise : je n&#8217;ai vu presque aucune session, car la Société Générale était sponsor cette année, et ça m&#8217;a pris un temps fou !
Commençons tout d&#8217;abord justement par ces quelques sessions.</p>

<h1>Conférences</h1>

<h2><a href="http://cfp.devoxx.fr/devoxxfr2014/talk/HXP-745/Cr%C3%A9ons%20un%20web%20component%20avec%20Polymer">Créons un web component avec Polymer</a></h2>

<p>Forcément, en tant que co-présentateur (avec une fois de plus Julien Jakubowski), j&#8217;étais obligé d&#8217;y assister.
Le titre n&#8217;était pas très vendeur, surtout que Julien a eu l&#8217;idée géniale d&#8217;utiliser l&#8217;<a href="http://developer.marvel.com/">API Marvel</a>, mais seulement <em>après</em> le CFP. On aurait ainsi pu proposer le titre <code>Créons un &lt;super-héro&gt; avec Google Polymer</code>. Ca aurait été plus vendeur, mais d&#8217;un autre côté, notre salle était pleine ! Petit bémol, la salle était plutôt petite et notre session - pourtant un Tools In Action - n&#8217;a pas été filmé. J&#8217;ai l&#8217;impression que l&#8217;équipe des organisateurs a voulu optimiser les salles du sous-sol du Marriott pour avoir plus de TiA et ainsi contenter plus de monde, mais faisant l&#8217;impasse sur la vidéo pour certaines. Pas très grave, si vous l&#8217;avez manqué, je proposerais bientôt ce sujet sous forme d&#8217;un <a href="http://www.brownbaglunch.fr">brown bag lunch</a>&#8230;</p>

<h2><a href="http://cfp.devoxx.fr/devoxxfr2014/talk/EHJ-890/Des%20SSII%20aux%20SS3I%20%3F%20Soci%C3%A9t%C3%A9s%20au%20service%20des%20individus%20de%20l%E2%80%99ing%C3%A9nierie%20informatique">Des SSII aux SS3I : Sociétés au service des individus de l’ingénierie informatique</a></h2>

<p><img src="http://linsolas.github.com/images/note-3.png" title="3/5" alt="3/5" /></p>

<p>Ma première vraie conférence est une conférence donnée par deux femmes, <a href="http://cfp.devoxx.fr/devoxxfr2014/speaker/07af1df53d450d56d48fdddd319d85554a1fe21d/Aude%20Amarrurtu">Aude Amarrurtu</a> et <a href="http://cfp.devoxx.fr/devoxxfr2014/speaker/d41b8a6c22ac52c0c3588468d3f5a34a762f9ccd/Betty%20MOREAU">Betty Moreau</a>, qui sont RH de surcroit !
Le message qu&#8217;elles ont voulu faire passer, c&#8217;est qu&#8217;en France, une très grosse part du développement informatique est gérée par des SSII (enfin, ESN pour &#8221;<em>Entreprise de Service du Numérique</em>&#8221;). Je n&#8217;ai plus les chiffres en tête, mais le nombre de SSII en France est très important (plus de 10000, allant de 1 employés à plusieurs dizaines de milliers) et leur part de marché tournait autour de 80%.
Le tableau des SSII était assez noir, mais comme toujours, il y en a toujours quelques unes qui se démarquent du lot.
Une session intéressante, mais qui, j&#8217;ai l&#8217;impression, donnait plutôt envie de devenir freelance au final&#8230;</p>

<h2><a href="http://cfp.devoxx.fr/devoxxfr2014/talk/VAR-813/Au%20secours,%20mon%20code%20AngularJS%20est%20pourri%20!">Au secours, mon code AngularJS est pourri !</a></h2>

<p><img src="http://linsolas.github.com/images/note-2.5.png" title="2.5/5" alt="2.5/5" /></p>

<p><a href="http://cfp.devoxx.fr/devoxxfr2014/speaker/7c0e3659c3e1946a39a7b45f633a3a6f52cab4c6/Thierry%20Chatel">Thierry Chatel</a>, formateur sur AngularJS, nous propose une session dédiée aux bonnes pratiques lorsque l&#8217;on développe une application avec AngularJS, ainsi que les différentes choses à éviter.
J&#8217;ai été déçu pour deux raisons. Déjà, Thierry manquait un peu d&#8217;énergie comme présentateur, mais surtout cela s&#8217;est borné à une énumération de bonnes ou mauvaises pratiques. C&#8217;est bien, mais il manquait vraiment du concret, des exemples de code. Je crois avoir attendu 15 minutes avant de voir la première ligne de code Angular ! C&#8217;est dommage, le sujet était forcément très intéressant et aurait mérité mieux. En tout cas, ça m&#8217;a rassuré sur ma pratique d&#8217;Angular, qui n&#8217;est pas si pourri que ça :o)</p>

<h2><a href="http://cfp.devoxx.fr/devoxxfr2014/talk/URP-539/Etendre%20le%20Web%20avec%20les%20Web%20Components">Etendre le Web avec les Web Components</a></h2>

<p><img src="http://linsolas.github.com/images/note-2.5.png" title="2.5/5" alt="2.5/5" /></p>

<p>Sur le CFP, j&#8217;avais fait deux propositions concernant les web components. Un Tools In Action (retenu) et une conférence. Cette dernière n&#8217;a été retenue, sans doute parce que ce sujet a été proposé aussi par <a href="http://cfp.devoxx.fr/devoxxfr2014/speaker/e30ce1e52e2a508470ac5be4eb6a1062463bf62d/Christophe%20Jolif">Christophe Jolif</a> d&#8217;IBM.
Il nous a donc expliqué le principe des web components, ce qui était intéressant.
J&#8217;ai cependant trouvé que la présentation a beaucoup (trop ?) tourné autour de l&#8217;implémentation d&#8217;IBM des web components, <a href="https://github.com/ibm-js/delite">Delite</a>.</p>

<h2><a href="http://cfp.devoxx.fr/devoxxfr2014/talk/XEA-025/Extremist%20Programming%20:%20l%27art%20de%20s%27amuser%20avec%20du%20code">Extremist Programming : l&#8217;art de s&#8217;amuser avec du code</a></h2>

<p><img src="http://linsolas.github.com/images/note-5.png" title="5/5" alt="5/5" /></p>

<p>Une présentation décaléee faite par <a href="http://cfp.devoxx.fr/devoxxfr2014/speaker/fe056ad4746a010de60b106afd60c075031d8cd3/Eric%20Lefevre-Ardant">Eric Lefevre-Ardant</a> et <a href="http://cfp.devoxx.fr/devoxxfr2014/speaker/0499a99ad2f1d4c024bc3c433d9c05f0dbc55ea4/Cyrille%20Martraire">Cyrille Martraire</a>, cela ne peut pas se manquer. Et clairement, ça a été mon <strong>gros coup de coeur</strong> sur cette édition 2014 de Devoxx France.
Tout comme la conférence <a href="http://www.devoxx.com/display/FR13/Boucles+etranges+++etranges+boucles+%28puzzlers+et+curiosites%29">Boucles étranges : étranges boucles (puzzlers et curiosités)</a> d&#8217;Eric lors de Devoxx France 2013, difficile de retranscrire ici le contenu de cette session, qui essayait de nous montrer comment l&#8217;art et le développement peuvent cohabiter.
Tous les ingrédients d&#8217;une excellente présentation étaient présent : présentateurs plein d&#8217;énergie et parfaitement complémentaires, des informations intéressantes, de l&#8217;humour et des cookies (très bons d&#8217;ailleurs). Je recommande sur Parleys, même si la vidéo sera sans doute un peu moins bonne que le live&#8230;</p>

<h2><a href="http://cfp.devoxx.fr/devoxxfr2014/talk/JSH-188/Pourquoi%20vous%20devriez%20essayer%20s%C3%A9rieusement%20les%20Object%20Calisthenics">Pourquoi vous devriez essayer sérieusement les Object Calisthenics</a></h2>

<p>Un Quickie très intéressant par <a href="http://cfp.devoxx.fr/devoxxfr2014/speaker/9b4fefab030e99d7c2ac41ea9f5416bb7f4ff7a0/Guillaume%20Duquesnay">Guillaume Duquesnay</a> qui nous parle de la programmation avec des objects calisthéniques. Mais qu&#8217;est-ce que c&#8217;est ? Hé bien ce n&#8217;est rien de plus que de la programmation en s&#8217;infligeant des contraintes fortes qui sont les suivantes :</p>

<ul>
<li>un seul niveau d’indentation par méthode (pour éviter les <code>if</code> imbriqués par exemple) ;</li>
<li>pas de <code>else</code> ;</li>
<li>encapsuler tous les types primitifs et <code>String</code> ;</li>
<li>un seul point par ligne ;</li>
<li>pas d’abréviation (pour les noms des variables) ;</li>
<li>limiter la taille des entités (petites classes par ex.) ;</li>
<li>pas plus de deux variables d’instance par classe ;</li>
<li>utiliser des collections &#8220;first class&#8221; (pas sûr de trouver une bonne traduction pour ça), c&#8217;est-à-dire de ne pas utiliser par exemple des <code>List&lt;String&gt; usernames</code> mais plutôt une classe plus explicite, comme par exemple <code>Usernames</code>.</li>
<li>pas de getter / setter / properties</li>
</ul>


<p>Bon, malheureusement j&#8217;ai dû m&#8217;eclipser avant la fin de la session, je n&#8217;ai donc pas pu entendre ce que ce type de programmation a pu apporter à l&#8217;orateur dans sa façon de développer. Mais en tout cas, j&#8217;aimerais bien m&#8217;y frotter, plus par défi intellictuel qu&#8217;autre chose. Peut-être lors d&#8217;un coding dojo ?</p>

<h1>Sponsoring SG</h1>

<p>Grosse nouvelle, la Société Générale (plus exactement le département ITEC de la banque d&#8217;investissement) est devenue <a href="http://www.devoxx.fr/partenaires/">sponsor de la conférence</a>. Une première, puisqu&#8217;habituellement ce sont plutôt des éditeurs ou des SSII qui sont présentes sur ce genre d&#8217;événements.
Si je n&#8217;ai pas initié ce sponsoring (merci aux Alexandres, ils se reconnaitront), j&#8217;ai du gérer près de 80% de la préparation de notre sponsoring. Ceci explique aussi que je suis resté les 3/4 de mon temps à proximité du stand SG.</p>

<p>Notre présence dans ce milieu très geek a été plutôt bien vue, même si beaucoup en était étonné. Nous avons pu montrer que nous avons effectivement un esprit geek, et que la banque - du moins la notre ;o) - sait proposer des challenges intéressants et actuels : Big Data, Continuous Delivery, développement web et mobile, Software Craftsmanship, ainsi que d&#8217;activités attrayantes comme des Coding Dojo, des <a href="http://www.brownbaglunch.fr/">Brown Bag Lunches</a>, etc.</p>

<p>Nous avions également un jeu très sympathique, le <a href="https://devoxx.societegenerale.com">Trading Challenge</a> (le site ne sera pas forcément disponible encore très longtemps). Le principe est de jouer en bourse (avec des données réelles, bien que légèrement décalées) avec un portefeuille virtuel. A la fin de la journée, quand la bourse ferme, les comptes sont calculés, et les trois meilleurs boursicoteurs repartaient avec de jolis cadeaux : Raspberry Pi, Amazon Kindle et caméra GoPro ! Seul bémol : le dernier jour de Devoxx était le vendredi saint, et donc les marchés étaient fermés. Donc pas de jeu. Dommage !
Autre intérêt non négligeable du jeu : c&#8217;est un développement interne, une application web responsive développée avec de l&#8217;AngularJS et proposant des dashboards Kibana. Bref, une belle vitrine technologique pour la SG ! Comme quoi on ne fait plus du Cobol :o)</p>

<h1>Bilan général</h1>

<p>Bien que je n&#8217;ai vu que très peu de conférences - j&#8217;ai même raté l&#8217;enregistrement des Cast Codeurs pour démonter note stand - j&#8217;ai encore apprécié cette édition de Devoxx France. L&#8217;ambiance, les rencontres, le partage est toujours le point fort de cette conférence,</p>

<p>Le rendez-vous est donc pris pour l&#8217;année prochaine, mais cette fois-ci au <strong>Palais des Congrès</strong> ! Le Marriott - et sa magnifique moquette - va sans doute nous manquer, mais la taille critique de 1500 développeurs était atteinte et il devenait urgent de viser plus haut. C&#8217;est donc chose faite !</p>

<p>Si vous souhaitez un compte-rendu bien plus complet, je vous invite à lire celui réalisé par l&#8217;équipe de Developpez.com, qui est l&#8217;oeuvre de Thierry Leriche-Dessirier et auquel j&#8217;ai participé, visible <a href="http://thierry-leriche-dessirier.developpez.com/articles/interview/devoxx-france-2014/">ici</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introduction aux web-components avec Google Polymer]]></title>
    <link href="http://linsolas.github.com/blog/2014/05/05/introduction-aux-web-components-avec-google-polymer/"/>
    <updated>2014-05-05T22:00:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2014/05/05/introduction-aux-web-components-avec-google-polymer</id>
    <content type="html"><![CDATA[<p>Lors de <a href="http://www.devoxx.fr">Devoxx France 2014</a>, j&#8217;ai présenté avec mon ami <a href="https://twitter.com/jak78">Julien Jakubowski</a> un &#8220;Tools In Action&#8221; sur la <a href="http://cfp.devoxx.fr/devoxxfr2014/talk/HXP-745/Cr%C3%A9ons%20un%20web%20component%20avec%20Polymer">création de web component avec Google Polymer</a>.</p>

<p>Peut-être que vous n&#8217;avez pas eu la chance de venir y assister. Je vous propose donc une initiation à Google Polymer et aux web components.</p>

<h1>Les web components, qu&#8217;est-ce ?</h1>

<p>Un site internet, c&#8217;est un ensemble de pages écrites en HTML (dans la plupart des cas du moins). Aujourd&#8217;hui, ces sites sont de plus en plus riches, de plus en plus dynamiques. Les composants qui structurent une page web sont de fait plus complexes.
Paradoxalement, le langage HTML est un langage assez pauvre, puisqu&#8217;il ne dispose que d&#8217;un peu plus d&#8217;une centaine de &#8220;mots&#8221;, les balises.
Résultat, il faut généralement bidouiller pour créer un vrai composant. Ainsi, avec Twitter Bootstrap, la création d&#8217;un panneau d&#8217;onglets va nécessiter d&#8217;utiliser les balises de liste (<code>&lt;ul&gt;</code> et <code>&lt;li&gt;</code>) comme cela :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;nav nav-tabs&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;active&quot;</span><span class="nt">&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#home&quot;</span> <span class="na">data-toggle=</span><span class="s">&quot;tab&quot;</span><span class="nt">&gt;</span>Home<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>  <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#profile&quot;</span> <span class="na">data-toggle=</span><span class="s">&quot;tab&quot;</span><span class="nt">&gt;</span>Profile<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>  <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#messages&quot;</span> <span class="na">data-toggle=</span><span class="s">&quot;tab&quot;</span><span class="nt">&gt;</span>Messages<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>  <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#settings&quot;</span> <span class="na">data-toggle=</span><span class="s">&quot;tab&quot;</span><span class="nt">&gt;</span>Settings<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'><span class="nt">&lt;/ul&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ce n&#8217;est pas trop moche, mais cela reste moins lisible que quelque chose de ce genre :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;tabs-pane&gt;</span>
</span><span class='line'>  <span class="nt">&lt;tab</span> <span class="na">title=</span><span class="s">&quot;Home&quot;</span> <span class="na">active=</span><span class="s">&quot;true&quot;</span><span class="nt">&gt;</span>...<span class="nt">&lt;/tab&gt;</span>
</span><span class='line'>  <span class="nt">&lt;tab</span> <span class="na">title=</span><span class="s">&quot;Profile&quot;</span><span class="nt">&gt;</span>...<span class="nt">&lt;/tab&gt;</span>
</span><span class='line'>  <span class="nt">&lt;tab</span> <span class="na">title=</span><span class="s">&quot;Messages&quot;</span><span class="nt">&gt;</span>...<span class="nt">&lt;/tab&gt;</span>
</span><span class='line'>  <span class="nt">&lt;tab</span> <span class="na">title=</span><span class="s">&quot;Settings&quot;</span><span class="nt">&gt;</span>...<span class="nt">&lt;/tab&gt;</span>
</span><span class='line'><span class="nt">&lt;/tabs-pane&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Or la lisibilité est un critère très important quand on sait que l&#8217;on doit passer 80% du temps à lire du code et 20% à en écrire.</p>

<p>Dans le même genre, est-ce qu&#8217;il ne serait pas plus pratique d&#8217;écrire ceci pour embarquer un tweet dans une page :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;tweet</span> <span class="na">tweetId=</span><span class="s">&quot;123456789&quot;</span><span class="nt">&gt;&lt;/tweet&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Hé bien c&#8217;est le but des web components que de proposer de créer ses propres balises HTML et de pouvoir les exporter facilement.</p>

<h1>Le standard web component</h1>

<p>Finalement, créer ses propres tags HTML n&#8217;est pas quelque chose de nouveau, on peut le faire grâce à différents frameworks - comme par exemple avec une directive AngularJS - voire même en pur JavaScript.
Mais les web components sont en réalité <a href="http://www.w3.org/TR/components-intro/">un standard en cours d&#8217;élaboration par le W3C</a>, et c&#8217;est là sa force première. Pour être plus précis, il s&#8217;agit d&#8217;un ensemble de standards, comprennant les briques nécessaires à l&#8217;élaboration d&#8217;un composant web. Je pense par exemple au <a href="http://w3c.github.io/webcomponents/spec/shadow/">shadow DOM</a> ou encore au <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element">HTML template</a>.</p>

<p>Ces standards sont toujours à l&#8217;étude, mais il existe quelques implémentations pour pouvoir jouer dès à présent avec les web components. Celui qui va nous intéresser plus particulièrement c&#8217;est celle de Google, à savoir <a href="http://www.polymer-project.org/">Polymer</a>.</p>

<p><img src="http://www.polymer-project.org/images/logos/p-logo.svg" title="Google Polymer" alt="Google Polymer" /></p>

<h1>Let&#8217;s start!</h1>

<p>Assez parlé, codons ! Je vous propose de coder une balise <code>progress-bar</code>, basée sur <a href="http://getbootstrap.com/components/#progress">celle proposée par Twitter Bootstrap</a>. Le code HTML est le suivant :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;progress progress-striped&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;progress-bar progress-bar-info&quot;</span> <span class="na">role=</span><span class="s">&quot;progressbar&quot;</span> <span class="na">aria-valuenow=</span><span class="s">&quot;20&quot;</span> <span class="na">aria-valuemin=</span><span class="s">&quot;0&quot;</span> <span class="na">aria-valuemax=</span><span class="s">&quot;100&quot;</span> <span class="na">style=</span><span class="s">&quot;width: 20%&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;sr-only&quot;</span><span class="nt">&gt;</span>20% Complete<span class="nt">&lt;/span&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Commençons par créer une application web toute simple. On va donc s&#8217;appuyer sur <a href="https://github.com/yeoman/yo">yo</a>, qui permet grâce à un générateur spécifique de nous créer une application blanche, préconfigurée pour un contexte particulier. On exécute ainsi la commande <code>yo webapp</code>. Une fois la structure générée, un petit <code>npm install</code> puis <code>bower install</code> nous permettent d&#8217;être prêt à coder. Pour nos besoins, j&#8217;ai un peu épuré le projet, en supprimant quelques éléments inutiles et en enlevant jQuery, qui n&#8217;est pas toujours utile.</p>

<p>Grâce à sa pré-configuration grâce à <code>yo</code>, nous disposons d&#8217;une tâche <a href="http://gruntjs.com/">Grunt</a> (une sorte de <code>Apache Ant</code>, mais pour JavaScript) <code>serve</code>, qui va nous permettre de modifier notre code et de voir automatiquement le navigateur se recharger pour prendre ces modifications en compte. Il nous suffit donc d&#8217;exécuter <code>grunt serve</code>, et c&#8217;est tout ! Notre page sera dès lors visible à l&#8217;adresse http://localhost:9000.</p>

<p>Première étape, il nous faut ajouter la librairie Polymer à notre projet. On va donc utiliser <a href="http://bower.io/">bower</a> pour gérer notre dépendance, on exécute donc la commande <code>bower install polymer --save</code> (l&#8217;option <code>--save</code> permet d&#8217;ajouter la dépendance dans le fichier <code>bower.json</code>). Nous disposons maintenant de <code>Polymer</code> dans le répertoire <code>bower_components</code>, mais aussi de <code>platform</code>. Comme je l&#8217;ai expliqué, les web components se basent sur un ensemble de briques qui ne sont aujourd&#8217;hui pas toutes supportées nativement par les navigateurs. Il faut donc les émuler, via des &#8220;polyfills&#8221;. Et c&#8217;est précisément le rôle de <code>platform</code>.</p>

<p>Voilà notre HTML de base pour bien démarrer :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!doctype html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>    <span class="nt">&lt;head&gt;</span>
</span><span class='line'>        <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">&quot;utf-8&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;title&gt;</span>Polymer<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>        <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href=</span><span class="s">&quot;../bower_components/bootstrap/dist/css/bootstrap.css&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="c">&lt;!-- Nos dépendances pour utiliser Polymer --&gt;</span>
</span><span class='line'>        <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;../bower_components/platform/platform.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>        <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;../bower_components/polymer/polymer.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;body&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;header&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;h3</span> <span class="na">class=</span><span class="s">&quot;text-muted&quot;</span><span class="nt">&gt;</span>Google Polymer<span class="nt">&lt;/h3&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;footer&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;p&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;glyphicon glyphicon-heart&quot;</span><span class="nt">&gt;&lt;/span&gt;</span> Polymer<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Commençons par créer un élément Polymer pour le composant <code>progress-bar</code>. A noter qu&#8217;un composant Polymer doit être composé de deux mots séparés par un <code>-</code> (sans doute pour éviter la confusion avec les &#8220;vrais&#8221; tags HTML) :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;polymer</span><span class="na">-element</span> <span class="na">name=</span><span class="s">&quot;progress-bar&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;template&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/template&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script&gt;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">module</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">})();</span>
</span><span class='line'>        <span class="nx">Polymer</span><span class="p">(</span><span class="s1">&#39;progress-bar&#39;</span><span class="p">,</span> <span class="nx">module</span><span class="p">);</span>
</span><span class='line'>    <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="err">&lt;</span>/polymer-element&gt;
</span></code></pre></td></tr></table></div></figure>


<p>On voit trois choses intéressantes :</p>

<ul>
<li>le tag <code>polymer-element</code> qui prend le nom du composant (<code>progress-bar</code>) ;</li>
<li>le tag <code>&lt;template&gt;</code> qui va nous permettre d&#8217;ajouter le code HTML ;</li>
<li>la partie script qui nous permet d&#8217;initialiser un objet <code>module</code> qui correspond à notre composant Polymer, ainsi que la ligne <code>Polymer('progress-bar', module);</code> qui permet de l&#8217;enregistrer pour l&#8217;utiliser par la suite.</li>
</ul>


<p>On injecte alors le code HTML de la barre de progression dans le <code>&lt;template&gt;</code>, comme suit:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;polymer</span><span class="na">-element</span> <span class="na">name=</span><span class="s">&quot;progress-bar&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;template&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;progress progress-striped&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;progress-bar progress-bar-info&quot;</span> <span class="na">role=</span><span class="s">&quot;progressbar&quot;</span> <span class="na">aria-valuenow=</span><span class="s">&quot;20&quot;</span> <span class="na">aria-valuemin=</span><span class="s">&quot;0&quot;</span> <span class="na">aria-valuemax=</span><span class="s">&quot;100&quot;</span> <span class="na">style=</span><span class="s">&quot;width: 20%&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;sr-only&quot;</span><span class="nt">&gt;</span>20% Complete<span class="nt">&lt;/span&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/template&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script&gt;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">module</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">})();</span>
</span><span class='line'>        <span class="nx">Polymer</span><span class="p">(</span><span class="s1">&#39;progress-bar&#39;</span><span class="p">,</span> <span class="nx">module</span><span class="p">);</span>
</span><span class='line'>    <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="err">&lt;</span>/polymer-element&gt;
</span></code></pre></td></tr></table></div></figure>


<p>C&#8217;est bien, mais il faudrait pouvoir définir le pourcentage de progression dynamiquement, dont acte :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;polymer</span><span class="na">-element</span> <span class="na">name=</span><span class="s">&quot;progress-bar&quot;</span> <span class="na">attributes=</span><span class="s">&quot;percentage&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;template&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;progress progress-striped&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;progress-bar progress-bar-info&quot;</span> <span class="na">role=</span><span class="s">&quot;progressbar&quot;</span> <span class="na">aria-valuenow=</span><span class="s">&quot;&quot;</span> <span class="na">aria-valuemin=</span><span class="s">&quot;0&quot;</span> <span class="na">aria-valuemax=</span><span class="s">&quot;100&quot;</span> <span class="na">style=</span><span class="s">&quot;width: %&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;sr-only&quot;</span><span class="nt">&gt;</span>% Complete<span class="nt">&lt;/span&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/template&gt;</span>
</span><span class='line'><span class="err">&lt;</span>/polymer-element&gt;
</span><span class='line'><span class="nt">&lt;progress</span><span class="na">-bar</span> <span class="na">percentage=</span><span class="s">&quot;42&quot;</span><span class="nt">&gt;</span><span class="err">&lt;</span>/progress-bar&gt;
</span></code></pre></td></tr></table></div></figure>


<p>On voit plusieurs choses :</p>

<ul>
<li>il faut définir les attributs passés au composant via l&#8217;attribut <code>attributes="percentage"</code> ;</li>
<li>dans le code HTML, on peut accéder à cette information via la syntaxe &#8220;double moustaches&#8221;, &#8220;. Les habitués d&#8217;Angular ne seront pas perdus !</li>
</ul>


<p>Changeons un peu notre composant pour donner un <code>min</code>, un <code>max</code> et une <code>value</code>, en laissant à la charge du composant de calculer lui-même le pourcentage:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;polymer</span><span class="na">-element</span> <span class="na">name=</span><span class="s">&quot;progress-bar&quot;</span> <span class="na">attributes=</span><span class="s">&quot;min,max,value&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;template&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;progress progress-striped&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;progress-bar progress-bar-info&quot;</span> <span class="na">role=</span><span class="s">&quot;progressbar&quot;</span> <span class="na">aria-valuenow=</span><span class="s">&quot;&quot;</span> <span class="na">aria-valuemin=</span><span class="s">&quot;&quot;</span> <span class="na">aria-valuemax=</span><span class="s">&quot;&quot;</span> <span class="na">style=</span><span class="s">&quot;width: %&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;sr-only&quot;</span><span class="nt">&gt;</span>% Complete<span class="nt">&lt;/span&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/template&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script&gt;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">module</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">get</span> <span class="nx">percentage</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">return</span> <span class="p">((</span><span class="k">this</span><span class="p">.</span><span class="nx">value</span> <span class="o">-</span> <span class="k">this</span><span class="p">.</span><span class="nx">min</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">max</span> <span class="o">-</span> <span class="k">this</span><span class="p">.</span><span class="nx">min</span><span class="p">))</span> <span class="o">*</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">})();</span>
</span><span class='line'>        <span class="nx">Polymer</span><span class="p">(</span><span class="s1">&#39;progress-bar&#39;</span><span class="p">,</span> <span class="nx">module</span><span class="p">);</span>
</span><span class='line'>    <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="err">&lt;</span>/polymer-element&gt;
</span><span class='line'><span class="c">&lt;!-- Utilisation dans ma page du web component &quot;progress-bar&quot; --&gt;</span>
</span><span class='line'><span class="nt">&lt;progress</span><span class="na">-bar</span> <span class="na">min=</span><span class="s">&quot;0&quot;</span> <span class="na">max=</span><span class="s">&quot;20&quot;</span> <span class="na">value=</span><span class="s">&quot;12&quot;</span><span class="nt">&gt;</span><span class="err">&lt;</span>/progress-bar&gt;
</span></code></pre></td></tr></table></div></figure>


<p>On voit ici aussi que les paramètres, <code>min</code>, <code>max</code> ou <code>value</code> sont disponibles également dans la partie <code>&lt;script&gt;</code>.</p>

<p>Et si on souhaite change la valeur courante ? Un web component peut être accédé de la même façon que n&#8217;importe quel autre élément du DOM, donc un simple bout de JavaScript suffit :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;button</span> <span class="na">class=</span><span class="s">&quot;btn btn-primary&quot;</span> <span class="na">onclick=</span><span class="s">&quot;changeValue()&quot;</span><span class="nt">&gt;</span>Change value<span class="nt">&lt;/button&gt;</span>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">changeValue</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">bar</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#progression&#39;</span><span class="p">);</span> <span class="c1">// On récupère l&#39;objet</span>
</span><span class='line'>        <span class="nx">bar</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="o">+</span><span class="nx">bar</span><span class="p">.</span><span class="nx">min</span> <span class="o">+</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="p">(</span><span class="nx">bar</span><span class="p">.</span><span class="nx">max</span> <span class="o">-</span> <span class="nx">bar</span><span class="p">.</span><span class="nx">min</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Il serait sans doute plus propre de proposer des fonctions, comme par exemple <code>updateValue</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;polymer</span><span class="na">-element</span> <span class="na">name=</span><span class="s">&quot;progress-bar&quot;</span> <span class="na">attributes=</span><span class="s">&quot;min,max,value&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    ...
</span><span class='line'>    <span class="nt">&lt;script&gt;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">module</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">get</span> <span class="nx">percentage</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">return</span> <span class="p">((</span><span class="k">this</span><span class="p">.</span><span class="nx">value</span> <span class="o">-</span> <span class="k">this</span><span class="p">.</span><span class="nx">min</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">max</span> <span class="o">-</span> <span class="k">this</span><span class="p">.</span><span class="nx">min</span><span class="p">))</span> <span class="o">*</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'>                <span class="p">},</span>
</span><span class='line'>                <span class="nx">updateValue</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">this</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">})();</span>
</span><span class='line'>        <span class="nx">Polymer</span><span class="p">(</span><span class="s1">&#39;progress-bar&#39;</span><span class="p">,</span> <span class="nx">module</span><span class="p">);</span>
</span><span class='line'>    <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="err">&lt;</span>/polymer-element&gt;
</span></code></pre></td></tr></table></div></figure>


<p>pour pouvoir l&#8217;appeler ensuite :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">changeValue</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">bar</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#progression&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">bar</span><span class="p">.</span><span class="nx">updateValue</span><span class="p">(</span><span class="o">+</span><span class="nx">bar</span><span class="p">.</span><span class="nx">min</span> <span class="o">+</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="p">(</span><span class="nx">bar</span><span class="p">.</span><span class="nx">max</span> <span class="o">-</span> <span class="nx">bar</span><span class="p">.</span><span class="nx">min</span><span class="p">)));</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Externalisation</h1>

<p>C&#8217;est bien beau tout ça, mais comment je fournis ce web component tout beau à une autre équipe ?
C&#8217;est simple. Je déplace tout le code du <code>&lt;polymer-element&gt;</code> dans un fichier séparé, par exemple <code>progress-bar.html</code>, puis je l&#8217;importe grâce à cette petite ligne dans mon entête de page :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">link</span> <span class="nx">rel</span><span class="o">=</span><span class="s2">&quot;import&quot;</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&quot;progress-bar.html&quot;</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Le reste de ma page initiale ne change pas, je peux du coup utiliser mon <code>&lt;progress-bar id="progression" min="0" max="20" value="12"&gt;&lt;/progress-bar&gt;</code> sans problème.
A la limite, je pourrais même sortir le lien vers la librairie <code>polymer</code> et le mettre directement dans mon fichier HTML :</p>

<p><code>progress-bar.html</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;../bower_components/polymer/polymer.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;polymer</span><span class="na">-element</span> <span class="na">name=</span><span class="s">&quot;progress-bar&quot;</span> <span class="na">attributes=</span><span class="s">&quot;min,max,value&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    ...
</span><span class='line'><span class="err">&lt;</span>/polymer-element&gt;
</span></code></pre></td></tr></table></div></figure>


<p>et dans ma page <code>index.html</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>    <span class="nt">&lt;head&gt;</span>
</span><span class='line'>        ...
</span><span class='line'>        <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;../bower_components/platform/platform.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>        <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;import&quot;</span> <span class="na">href=</span><span class="s">&quot;progress-bar.html&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;body&gt;</span>
</span><span class='line'>      ...
</span><span class='line'>        <span class="nt">&lt;progress</span><span class="na">-bar</span> <span class="na">id=</span><span class="s">&quot;progression&quot;</span> <span class="na">min=</span><span class="s">&quot;10&quot;</span> <span class="na">max=</span><span class="s">&quot;20&quot;</span> <span class="na">value=</span><span class="s">&quot;12&quot;</span><span class="nt">&gt;</span><span class="err">&lt;</span>/progress-bar&gt;
</span><span class='line'>    <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Il est (pour l&#8217;instant) encore nécessaire d&#8217;avoir un lien vers la librairie <code>platform</code> dans la page principale car le <code>import</code> est lui-même <a href="http://www.w3.org/TR/2014/WD-html-imports-20140311/">un standard</a> en cours de travail du W3C et n&#8217;est donc pas supporté nativement par les navigateurs. Il faut donc avoir recours au polyfill de <code>platform</code> pour l&#8217;instant.</p>

<p>Voilà un premier voyage dans le monde des web components avec Polymer. D&#8217;autres billets viendront peut-être le compléter&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Une année de BBL à la SGCIB]]></title>
    <link href="http://linsolas.github.com/blog/2014/01/20/une-annee-de-bbl-a-la-sgcib/"/>
    <updated>2014-01-20T21:57:00+01:00</updated>
    <id>http://linsolas.github.com/blog/2014/01/20/une-annee-de-bbl-a-la-sgcib</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/birthday_cake.png" title="Happy Birthday BBL" alt="Happy Birthday BBL" /></p>

<h2>Un peu d&#8217;histoire</h2>

<p>Tout a commencé en novembre 2012, lorsque David Gageot proposa <a href="http://blog.javabien.net/2012/11/05/bbl/">sur son blog</a> de venir faire des &#8221;<em>BBL</em>&#8221; au sein des entreprises. Les <em>BBL</em>, ce sont des <em>Brown Bag Lunches</em>, autrement dit des présentations faites par un intervenant (généralement) externe, durant la pause déjeuner. J&#8217;en avais parlé <a href="http://linsolas.github.io/blog/2013/02/20/brownbaglunch-dot-fr/">ici</a> il y a un an environ.</p>

<p>Je n&#8217;ai donc pas attendu pour l&#8217;inviter à la SGCIB faire sa fameuse présentation &#8220;Du Legacy au Cloud en moins d&#8217;une heure&#8221;. Pour être tout à fait précis, c&#8217;est un autre David, Pilato cette fois-ci, qui sera le premier invité officiel des BBL à la SGCIB, le 9 janvier 2013 pour être exact. Le sujet <a href="http://www.elasticsearch.org/">ElasticSearch</a> aura donc eu l&#8217;honneur d&#8217;initier une longue série&#8230;</p>

<p>Depuis, en une année, nous avons eu environ une vingtaine d&#8217;interventions, dont voici quelques exemples :</p>

<ul>
<li>Eric Lefevre-Ardant et Guillaume Tardif pour <code>Boucles étranges, étranges boucles</code>.</li>
<li>Tugdual Grall pour <code>Couchbase</code>.</li>
<li>Stéphane Landelle pour <code>Gatling</code>.</li>
<li>François Sarradin pour la création d&#8217;un serveur web en Scala.</li>
<li>Nicolas Martignole sur les bons conseils pour réussir une présentation technique.</li>
<li>Mathilde Lemée sur <code>Bitman</code> et l&#8217;utilisation avancée des caches.</li>
<li>Romain Maton pour une introduction à <code>Node.js</code> et <code>24 plugins chrono</code>.</li>
<li>Frédéric Menou pour devenir un Git Jedi.</li>
<li>Julien Biezemans sur <code>Cucumber.js</code>.</li>
<li>Etc.</li>
</ul>


<h2>Ce que ça nous apporte</h2>

<p>La SGCIB est une (très) grosse société. Il y a également beaucoup de développeurs, le public est donc tout trouvé. En moyenne, on tourne à environ 20 - 25 personnes dans l&#8217;assistance, le record est tout de même de 45 personnes ! Beau succès.</p>

<p><img src="http://linsolas.github.com/images/bbl-git.jpg" title="Avec 45 personnes, les salles commencent à devenir petites" alt="Avec 45 personnes, les salles commencent à devenir petites" /></p>

<p>En tant qu&#8217;organisateur des BBL@SGCIB, je suis satisfait de voir que le retour est très positif, et à chaque session, de nouvelles personnes souhaitent s&#8217;inscrire. Pourquoi viennent-ils ? C&#8217;est un fait, le participant aux BBL est plus intelligent, plus réactif et a le poil plus soyeux. Il se dit même qu&#8217;ils ont 23% de chances de plus de gagner au Loto !
Plus sérieusement, les BBL sont un formidable lieu d&#8217;échange, mais aussi d&#8217;ouverture. C&#8217;est l&#8217;occasion rêvée de découvrir de nouveaux langages, de nouveaux frameworks, de nouvelles pratiques.</p>

<p>Pour celui ou celle qui présente, c&#8217;est l&#8217;occasion de faire partager sa passion, parfois aussi de faire connaître son travail (nombreux sont ceux qui présentent un outil dont ils sont committeurs officiels). Au final, c&#8217;est du gagnant - gagnant.</p>

<h2>Et maintenant ?</h2>

<p>Si les <em>BBL</em> se sont démocratisés grâce à l&#8217;informatique, cela ne doit pas empêcher d&#8217;autres thématiques d&#8217;en profiter. Et la bonne nouvelle, c&#8217;est que la sauce commence à prendre dans le domaine des Ressources Humaines. Le site <a href="http://rh.brownbaglunch.fr/">rh.brownbaglunch.fr</a> a vu le jour en fin d&#8217;année 2013, et nous devrions atteindre la dizaine de présentateurs bientôt. Bravo et bon courage à eux !</p>

<p>Personnellement, j&#8217;aimerais beaucoup voir des <em>BBL</em> scientifiques à la SGCIB. Qui sait&#8230;</p>

<p><em>Icone par <a href="http://www.IconDrawer.com">IconDrawer</a></em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mon interview sur Developpez.com]]></title>
    <link href="http://linsolas.github.com/blog/2013/11/15/mon-interview-sur-developpez-dot-com/"/>
    <updated>2013-11-15T12:41:00+01:00</updated>
    <id>http://linsolas.github.com/blog/2013/11/15/mon-interview-sur-developpez-dot-com</id>
    <content type="html"><![CDATA[<p><img src="http://www.developpez.com/template/images/logo.png" title="Developpez.com" alt="Developpez.com" /></p>

<p><a href="https://twitter.com/thierryleriche">Thierry Leriche Dessirier</a> m&#8217;a proposé gentillement de m&#8217;interviewer pour promouvoir l&#8217;édition 2014 de la conférence <a href="http://www.devoxx.fr/">Devoxx</a>. J&#8217;y parle de Devoxx, bien sûr, du site <a href="http://www.developpez.com/">Developpez.com</a>, mais aussi de mon expérience en tant que conférencier.</p>

<p>Retrouvez mon interview <a href="http://thierry-leriche-dessirier.developpez.com/articles/interview/romain-linsolas-super-devoxxien/">ici</a>. Et rendez-vous à Devoxx France en 2014.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Devoxx 2013 - dernier jour et bilan]]></title>
    <link href="http://linsolas.github.com/blog/2013/11/15/devoxx-2013-dernier-jour-et-bilan/"/>
    <updated>2013-11-15T00:27:00+01:00</updated>
    <id>http://linsolas.github.com/blog/2013/11/15/devoxx-2013-dernier-jour-et-bilan</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/devoxx_logo.gif" title="Devoxx 2013" alt="Devoxx 2013" /></p>

<p>La dernière journée à Devoxx est toujours un peu spéciale. Beaucoup moins de monde, moins de sessions aussi, on sent que la fin est là !
Pour cette dernière journée, comme habituellement pour chaque Devoxx (France ou Belgique), je termine par l&#8217;enregistrement du podcast des CastCodeurs.</p>

<!-- more -->


<p>J&#8217;ai commencé la journée avec <a href="http://devoxx.be/dv13-scott-kurz.html?presId=3728">Batch applications for the Java platform (JSR 352)</a>, mais entre la fatigue des deux derniers jours et les slides bien trop chargés, j&#8217;ai eu du mal à suivre. Donc si vous voulez en savoir plus, je vous invite à regarder la <a href="http://jcp.org/en/jsr/detail?id=352">JSR 352</a> :)</p>

<h2><a href="http://devoxx.be/dv13-vincent-massol.html?presId=3430">Enregistrement live des CastCodeurs</a></h2>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>Ma seule et unique session en français (la seule de la conférence d&#8217;ailleurs) : l&#8217;enregistrement live du <a href="http://lescastcodeurs.com/">Podcast des CastCodeurs</a>. Une analyse toujours fine et délicate de la conférence qui est en train de s&#8217;achever.
Je vous laisserais écouter cet épisode qui sera bientôt disponible sur le site. D&#8217;ailleurs, bientôt la 100e. Ce sera d&#8217;ailleurs peut-être pour Devoxx Anvers 2014, qui sait.</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-castcodeurs.jpg" title="Les CastCodeurs sur scène" alt="Les CastCodeurs sur scène" /></p>

<h2><a href="http://devoxx.be/dv13-jean-franois-denise.html?presId=3759">Avatar.js, Server-Side JavaScript on the Java Platform</a></h2>

<p><img src="http://linsolas.github.com/images/note-2.png" title="2/5" alt="2/5" /></p>

<p>Finissons ce Devoxx par la présentation de <a href="http://devoxx.be/dv13-jean-franois-denise.html">Jean-François Denise</a> sur <a href="https://avatar-js.java.net/">Avatar.js</a>.</p>

<p>Il s&#8217;agit d&#8217;un framework JavaScript côté serveur qui tourne sur la JVM et est une combinaison de :</p>

<ul>
<li>d&#8217;une inspiration de Node pour son modèle orienté événement, son système de modules et de son API.</li>
<li>utilisation du moteur JavaScript de Nashorn.</li>
<li>l&#8217;API de de la plateforme Java.</li>
</ul>


<p>Le but n&#8217;est pas de copier Node, mais plutôt d&#8217;en créer une compatible avec lui. Prendre le meilleure des deux mondes en quelque sorte.
La syntaxe s&#8217;approche de celle de Node, comme par exemple :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;fs&#39;</span><span class="p">)</span>
</span><span class='line'><span class="nx">fs</span><span class="p">.</span><span class="nx">readdir</span><span class="p">(</span><span class="s1">&#39;/Documents/images&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">files</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">files</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">imgFile</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">file</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">java</span><span class="p">.</span><span class="nx">util</span><span class="p">.</span><span class="nx">File</span><span class="p">(</span><span class="nx">imgFile</span><span class="p">);</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">img</span> <span class="o">=</span> <span class="nx">javax</span><span class="p">.</span><span class="nx">imageio</span><span class="p">.</span><span class="nx">ImageIO</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">file</span><span class="p">);</span>
</span><span class='line'>      <span class="p">...</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>Démarrer un serveur peut se faire directement en ligne de commandes, ou encore via quelques lignes de code :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">String</span><span class="o">[]</span> <span class="n">args</span> <span class="o">=</span> <span class="o">{</span> <span class="s">&quot;./myscript.js&quot;</span> <span class="o">};</span>
</span><span class='line'><span class="n">Server</span> <span class="n">server</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Server</span><span class="o">(</span><span class="n">args</span><span class="o">);</span>
</span><span class='line'><span class="n">server</span><span class="o">.</span><span class="na">run</span><span class="o">(</span><span class="n">args</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Avatar.js vient aussi avec Avatar EE. Et là, je commence à me poser des questions.
Il faut noter qu&#8217;Avatar.js n&#8217;est pas encore finalisé, et son API peut également être amenée à changer&#8230;</p>

<p>Jean-Baptiste passe ensuite à une démo d&#8217;application d&#8217;upload de photos en Avatar.js, avec l&#8217;aide d&#8217;Express, des WebSocket, de java.sql et de javax.imageio. Ah non, en fait de démo, il s&#8217;agit de slides qui montrent du code. Argh</p>

<p>J&#8217;avoue ne pas être vraiment emballé par ce projet, bien qu&#8217;avoir une passerelle entre Node.js et Java peut être intéressant. De plus ne pas voir une <em>vraie</em> démo m&#8217;a quand même déçu !</p>

<h2>Bilan</h2>

<p>Pour ma deuxième année à Anvers, la magie est toujours là. Cela reste l&#8217;une des meilleures conférences du monde sur le domaine du Java, avec des stars et des présentations de qualité.
Je dirais quand même que j&#8217;ai préféré Devoxx 2012 à la version 2013, mais cela est peut-être aussi lié au fait que l&#8217;année dernière, il y avait en plus l&#8217;excitation de découvrir cette conférence pour de vrai.</p>

<p>Bref, je reviendrais à Anvers en 2014 si j&#8217;en ai la possibilité, et ce sera peut-être pour faire une conférence, qui sait.</p>

<p>Donc les aspects positifs :</p>

<ul>
<li>La qualité des présentations et des orateurs.</li>
<li>Une organisation au poil, et c&#8217;est du sacré boulot !</li>
<li>Les gens, les amis que l&#8217;on revoit ou que l&#8217;on se fait. Les rencontres donc.</li>
<li>Les stands, il y en a pas mal, ils sont plutôt bien achalandés, et certains offrent des goodies sympas.</li>
<li>A boire. On peut toujours boire, c&#8217;est toujours bien fourni, et parfois de la bière est offerte par un stand ou Atlassian.</li>
<li>Le bracelet, toujours aussi pratique.</li>
<li>Le système de vote à la sortie des salles (comme en 2012).</li>
<li>Le film du jeudi soir (avec les popcorns), même si je ne l&#8217;ai pas tellement apprécié (&#8221;<em>Le Cartel</em>&#8221; ou &#8221;<em>The Counselor</em>&#8221; en VO), je trouve que c&#8217;est quand même top comme idée.</li>
<li>Le site <a href="http://www.parleys.com">Parleys</a> qui héberge(ra) les sessions, toutes filmées (sauf, hélas, les Quickies et donc le mien)</li>
</ul>


<p>Les moins, ou les points d&#8217;amélioration :</p>

<ul>
<li>La nourriture. Je ne me souviens pas d&#8217;avoir super bien mangé à Devoxx 2012, mais j&#8217;ai vraiment l&#8217;impression que cette année c&#8217;était pire. Le mercredi midi c&#8217;était juste un sandwich, rien de folichon. Le lendemain, c&#8217;était une salade assez étrange (en gros, un sacré mélange), ce qui m&#8217;a fait finir au Quick. En dehors de ça, point de salut. Quelques gâteaux ont été jetés en pature à la foule affamée vers 16h, mais franchement, il y a un très gros axe d&#8217;amélioration sur ce point-là !</li>
<li>Le système de vote qui mériterait d&#8217;être mieux utilisé. En gros, il ne sert qu&#8217;à faire un &#8220;Top 3&#8221; des meilleures sessions du jour ou de la conférence entière. Il serait bien de fournir le score au speaker à la fin de la conférence, pour avoir une évaluation directe du ressenti des spectateurs.</li>
<li>Contrairement à l&#8217;année passée où j&#8217;avais eu la &#8220;révélation Angular&#8221;, cette année pas de &#8221;<em>Kick-ass</em>&#8221; présentations. Mais le niveau reste élevé, ne me faites pas dire ce que je ne dis pas :)</li>
</ul>


<p>Vivement 2014 :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Devoxx 2013 - deuxième jour]]></title>
    <link href="http://linsolas.github.com/blog/2013/11/14/devoxx-2013-deuxieme-jour/"/>
    <updated>2013-11-14T09:50:00+01:00</updated>
    <id>http://linsolas.github.com/blog/2013/11/14/devoxx-2013-deuxieme-jour</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/devoxx_logo.gif" title="Devoxx 2013" alt="Devoxx 2013" /></p>

<p>Voici la deuxième journée à Devoxx version 2013.
Pour commencer la journée, la Keynote de Google annonce la sortie de la version 1.0 du langage <a href="https://www.dartlang.org/">Dart</a>.
Dart est le langage créé par Google au dessus de JavaScript afin de rendre ce dernier plus utilisable, en offrant pas mal de choses des langages Java ou C# comme les classes, un vrai développement orienté objet, etc.</p>

<p>Il a aussi été question du projet <a href="https://github.com/angular/angular.dart">Angular Dart</a>, une implémentation d&#8217;<a href="http://angularjs.org/">Angular</a> sur le language Dart.</p>

<!-- more -->


<h2><a href="http://devoxx.be/dv13-francesc-campoy-flores.html?presId=3493">Go see all the ships in the world</a></h2>

<p><img src="http://linsolas.github.com/images/note-3.5.png" title="3.5/5" alt="3.5/5" /></p>

<p>On parle beaucoup du Big Data. C&#8217;est souvent théorique, ou à des exemples qui ne semblent pas très parlants.
<a href="https://twitter.com/@francesc">Francesc Campoy Flores</a> nous propose une session où nous devrions avoir au final une visualisation dynamique de la position et trajectoires de tous les bateaux du monde ! Cela s&#8217;annonce intéressant d&#8217;un point de vue technique, et quelque peu exotique quant au contenu.</p>

<p>Parlons tout d&#8217;abord des données. Nous avons 75,000 bateaux (en éliminant les petits bateaux). Il faut donc d&#8217;abord récupérer ces données.
Les bateaux disposent d&#8217;un système appelé <a href="http://en.wikipedia.org/wiki/Automatic_Identification_System">AIS</a> (<em>Automatic Identification System</em>), une sorte de GPS avant l&#8217;heure pour les navires. Toutefois, ce type de protocole est peu fiable, et difficile à gérer.</p>

<p>Il faut donc stocker toutes ces données. Bien entendu, il fait appel au cloud de Google pour cela.
Le problème qui se pose aussi est la tête des données AIS, qui ne ressemble à pas grand chose :</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-boats1.jpg" title="Les données AIS" alt="Les données AIS" /></p>

<p>Il existe toutefois une librairie en C++ qui permet d&#8217;interpréter ces données. Le seul hic, c&#8217;est que le cloud de Google ne permet pas d&#8217;exécuter du C++. Il faut donc écrire un traducteur vers du CSV pour finalement restocker ces informations dans ce format plus pratique.</p>

<p><a href="https://developers.google.com/bigquery/">BigQuery</a> est ensuite utilisé pour extraire les informations de toutes ces données. Une requête assez basique pour récupérer les positions moyennes des bateaux prend 5.8s sur 14Go de données.</p>

<p>Il faut maintenant servir ces données, de façon rapide et dynamique. Pour cela, Fransesc utilise l&#8217;API REST de BigQuery depuis du JavaScript. Toutefois, il inclut une application herbergée sur AppEngine entre le browser et le serveur BigQuery. En effet, on risque sinon de trop faire jouer le cache de ce dernier et du coup ne pas avoir les dernières données disponibles.
Cette application va matérialiser les requêtes, ainsi qu&#8217;une gestion du cache (memcache). Cette application est développée avec le langage Go, pour ses performances.</p>

<p>Voilà l&#8217;architecture finale du système. Pas si simple !</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-boats2.jpg" title="L'architecture pour voir les bateaux" alt="L'architecture pour voir les bateaux" /></p>

<p>Et le résultat, basée sur Google Maps API, WebGL et CanvasLayer montre tout d&#8217;abord une floppée de points sur une carte (75,000 quand même). Puis, en utilisant les données disponibles, ces points sont colorés en fonctin de leur vitesse. Ce calcul est fait par le GPU. On laisse le CPU - peu utilisé autrement - calculer l&#8217;histogramme donnant la répartition des vitesses :</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-boats3.jpg" title="Coloration en fonction de la vitesse" alt="Coloration en fonction de la vitesse" /></p>

<p>Une coloration en fonction de l&#8217;orientation du bateau montre très bien les différents canaux de navigation, comme par exemple autour de l&#8217;Espagne.</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-boats4.jpg" title="Coloration en fonction de l'orientation" alt="Coloration en fonction de l'orientation" /></p>

<p>Et au final :</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-boats5.jpg" title="La représentation des bateaux sur une carte" alt="La représentation des bateaux sur une carte" /></p>

<p>Une présentation tout à fait intéressante pour comprendre la démarche du traitement de ces données. Seul bémol, je m&#8217;attendais à un peu de live coding ou tout du moins une démo du résultat (plutôt qu&#8217;une vidéo). Mais il est vrai que le nombre de données assez important ainsi qu&#8217;un WIFI un peu à la ramasse aurait risqué de casser un peu l&#8217;expérience.</p>

<h2><a href="http://devoxx.be/dv13-igor-minar.html?presId=3468">What is in store for the future of Angular</a></h2>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>AngularJS avait été <a href="">ma claque et ma découverte</a> de Devoxx 2012. Depuis, le framework est devenu très populaire, et plusieurs sessions ont déjà eu lieu à Devoxx 2013, toutes blindées.
<a href="https://twitter.com/@IgorMinar">Igor Minar</a> et <a href="https://twitter.com/@mhevery">Misko Hevery</a>, deux des principaux membres du projet, viennent nous parler de ce qui attend Angular pour l&#8217;année 2014.</p>

<p>La première chose de prévue pour Angular, c&#8217;est de se baser encore plus sur les standards, en particulier les <em>web components</em>, qui inclut :</p>

<ul>
<li>Shadow DOM</li>
<li>Custom elements, <code>document.register()</code></li>
<li>Templates</li>
<li>Scoped CSS</li>
</ul>


<p>Autre point, c&#8217;est l&#8217;utilisation du <code>Object.observe</code> qui permettra de meilleures performances que le <em>dirty checking</em> d&#8217;Angular. L&#8217;autre avantage de cette méthode est qu&#8217;elle est asynchrone.</p>

<p>Asynchrone DI (<em>Dependency Injection</em>) vs AMD (<a href="http://en.wikipedia.org/wiki/Asynchronous_module_definition">Asynchronous Module Definition</a>).</p>

<p>L&#8217;introduction des <strong>zones</strong> va permettre de supprimer <code>$apply</code> et <code>$digest</code>.</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-angularjs-zones.jpg" title="Les zones d'Angular" alt="Les zones d'Angular" /></p>

<ul>
<li><code>DefaultZone</code> se comporte comme le navigateur.</li>
<li><code>StackTraceZone</code> permet des stacktraces plus longues.</li>
<li><code>AngularZone</code> applique le data-binding.</li>
<li><code>MockZone</code> pour faciliter les tests.</li>
</ul>


<p>Angular va également profiter des nouveautés d&#8217;EcmaScript 6, en particulier les classes et les modules.
Il sera également possible d&#8217;utiliser des annotations dans le code Angular.</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-angularjs-annotations.jpg" title="Les annotations en Angular" alt="Les annotations en Angular" /></p>

<p>Les <strong>contrats</strong> font également leur apparition dans Angular :</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-angularjs-contracts.jpg" title="Les contrats en Angular" alt="Les contrats en Angular" /></p>

<p>Bref, je laisse les présentateurs résumer à ma place :</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-angularjs-summary.jpg" title="Résumé des nouveautés d'Angular" alt="Résumé des nouveautés d'Angular" /></p>

<p>La présentation était moins éclatante que l&#8217;année passée, mais forcément le sujet s&#8217;y prétait moins. Toutefois, cela montre qu&#8217;Angular a encore de beaux jours devant lui !</p>

<h2><a href="http://devoxx.be/dv13-romain-linsolas.html?presId=3545">The ingredients for a perfect JavaScript Software Factory</a></h2>

<p><img src="http://linsolas.github.com/images/note-5.png" title="5/5" alt="5/5" /></p>

<p>(vous vous doutez bien que la note est ici tout à fait objective)
Là, c&#8217;est mon Quickie !
J&#8217;y parle de JavaScript et d&#8217;usine logicielle, en particulier d&#8217;outils.
Ma présentation est essentiellement divisée en trois parties. Compte tenu du temps imparti - à peine 15 minutes - il ne m&#8217;est pas possible d&#8217;aller pleinement dans les détails, mais l&#8217;idée est d&#8217;aborder les points principaux du sujet:</p>

<ul>
<li>Tout d&#8217;abord, j&#8217;insiste sur le fait qu&#8217;il faut réutiliser ce que l&#8217;on a déjà sous la main, selon le bon vieux principe du <em>Don&#8217;t Repeat Yourself</em> (DRY). En effet, nous sommes généralement des développeurs Java, et disposons à ce titre d&#8217;une usine logicielle déjà performante. Réutilisons donc Jenkins, SonarQube, et consorts !</li>
<li>Ensuite, intéressons nous aux outils propres à JavaScript. Là, je m&#8217;arrêtre surtout sur <a href="http://yeoman.io/">Yeoman</a>, c&#8217;est-à-dire <a href="https://github.com/yeoman/yo">Yo</a> pour créer des squelettes d&#8217;applications, <a href="http://bower.io/">Bower</a> pour gérer les dépendances et le packaging et enfin <a href="http://gruntjs.com/">Grunt</a>, un exécuteur de tâches (une sorte de Ant pour JavaScript, pour faire simple).</li>
<li>La dernière partie insiste sur le fait qu&#8217;une bonne usine logicielle n&#8217;est pas qu&#8217;une questions d&#8217;outils, mais aussi de bonnes pratiques. Et en terme de bonnes pratiques, les <em>tests</em> sont en première place. Je montre donc qu&#8217;il existe toutes sortes de librairies de tests en JavaScript, pour faire du test unitaire, du test fonctionnel, du BDD ou encore du test <em>front-end</em>.</li>
</ul>


<h2><a href="http://devoxx.be/dv13-dick-wall.html?presId=3713">Enregistrement live de JavaPosse</a></h2>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>Le podcast de <a href="http://javaposse.com/">JavaPosse</a> est très connu et réputé. Comme chaque année, ils font un enregistrement live à Devoxx, à la manière des CastCodeurs.</p>

<p>Cette année, seule la moitié de l&#8217;équipe était présente, à savoir Chet Haase et Dick Wall. Du coup, la moitié des Cast Codeurs, avec Guillaume Laforge et Emmanuel Bernard est venue en renfort.</p>

<p><img src="http://linsolas.github.com/images/devoxx2013-javaposse.jpg" title="JavaPosse et les Cast Codeurs" alt="JavaPosse et les Cast Codeurs" /></p>

<p>Une session agréable, avec une session  avec de la bière offerte par Atlassian. Une fois de plus, merci à eux.</p>

<h2><a href="http://devoxx.be/dv13-andrzej-grzesik.html?presId=3500">Continuous Delivery antipatterns</a></h2>

<p><img src="http://linsolas.github.com/images/note-3.5.png" title="3.5/5" alt="3.5/5" /></p>

<p>A la SGCIB, nous sommes en plein dans le <em>Continuous Delivery</em>. Il me paraissait donc important de recueillir quelques nouveaux avis et de bons conseils. C&#8217;est dans ce but que j&#8217;assiste à la conférence de  <a href="http://devoxx.be/dv13-andrzej-grzesik.html">Andrzej Grzesik</a>.</p>

<p>Le problème est avant tout un problème de personnes, de process.
Il faut des dashboards, pour savoir qui (a) fait quoi.
Releases = risques. Il faut donc savoir les éviter (les risques, pas les releases !)</p>

<p>Paralléliser les releases. Mais quoi paralléliser ? A priori, tout est parallélisable. Le mieux est de voir ce qui est le plus pénible, le plus long à s&#8217;exécuter dans une release, et voir comment on peut le paralléliser.</p>

<p>Autre problème fréquent : des équipes indépendantes, qui ne se parlent pas (devs contre ops par exemple). Il faut restaurer un canal de discussion, de communication.</p>

<p>L&#8217;infrastructure manuelle.
Il faut tester aussi son infrastructure. Avec <a href="http://www.opscode.com/chef/">Chef</a> par exemple, il est possible de faire une sorte de TDD. <a href="http://acrmp.github.io/foodcritic/">Food critic</a> ou <a href="http://www.vagrantup.com/">Vagrant</a> peuvent également être utiles.</p>

<h2><a href="http://devoxx.be/dv13-shaun-smith.html?presId=3568">Practical RESTful persistence</a></h2>

<p><img src="http://linsolas.github.com/images/note-2.5.png" title="2.5/5" alt="2.5/5" /></p>

<p>Finalement, on change de sujet, pour aller voir <a href="https://twitter.com/@shaunmsmith">Shaun Smith</a> parler de la nouvelle fonctionnalité d&#8217;<a href="http://www.eclipse.org/eclipselink/">EclipseLink</a> de <a href="http://wiki.eclipse.org/EclipseLink/Development/2.4.0/JPA-RS">JPA-RS</a>, qui intgère JAX-RS, JAXB et JPA.
L&#8217;idée est ici de réaliser un binding entre des entités et du JSON entre autres via des annotations dans les entités.</p>

<p>Bon, j&#8217;avoue être passé à côté de cette session, je n&#8217;ai pas trop compris le pourquoi de tout ça.</p>

<p>Voilà, la deuxième journée s&#8217;achève avec encore de belles expériences (sauf gastronomiques !).
Demain sera plus calme, avec seulement une demi-journée de travail.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Devoxx 2013 - premier jour]]></title>
    <link href="http://linsolas.github.com/blog/2013/11/13/devoxx-2013-premier-jour/"/>
    <updated>2013-11-13T08:56:00+01:00</updated>
    <id>http://linsolas.github.com/blog/2013/11/13/devoxx-2013-premier-jour</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/devoxx_logo.gif" title="Devoxx 2013" alt="Devoxx 2013" /></p>

<p>Et voilà, ma deuxième expérience belge de Devoxx est entamée.</p>

<!-- more -->


<h2><a href="http://devoxx.be/dv13-sven-peters.html?presId=3143">How To Do Kick-Ass Software Development</a></h2>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p><img src="http://linsolas.github.com/images/devoxx-2013-kickass.jpg" title="Kick-ass development" alt="Kick-ass Development" /></p>

<p>J&#8217;ai choisi cette présentation de <a href="https://twitter.com/@svenpet">Sven Peters</a> d&#8217;Atlassian, car j&#8217;avais beaucoup apprécié sa présentation l&#8217;année passée sur <a href="http://linsolas.github.io/blog/2012/11/18/devoxx-2012-jour-1/">7 things to make a good team great</a>. Il y présentait 7 trucs pour rendre une bonne équipe encore meilleure. C&#8217;est d&#8217;ailleurs lors de cette présentation qu&#8217;il m&#8217;est venue l&#8217;idée de mettre les <a href="http://www.brownbaglunch.fr">Brown Bag Lunch</a> à la SGCIB (via l&#8217;idée &#8221;<em>Feed you brain</em>&#8221;), peu de temps avant que ce mouvement ne prenne de l&#8217;ampleur en France.</p>

<p>Sven s&#8217;est intéressé au film <a href="http://www.imdb.com/title/tt1250777/">Kick-Ass</a>, où une personne quelconque souhaite devenir un super-héros, juste en portant un costume. Forcément, au début il se fait dérouiller, mais persiste. Et c&#8217;est le message de Sven : se prendre des gamèles, mais toujours se relever.</p>

<p>Mais que souhaite t-on atteindre avec son équipe ?</p>

<ul>
<li>un meilleur software ;</li>
<li>moins d&#8217;<em>overhead</em> ;</li>
<li>un développement plus rapide ;</li>
<li>des clients heureux ;</li>
<li>des développeurs heureux.</li>
</ul>


<p>Il y a quelques temps, la solution à tous les problèmes était l&#8217;agilité. Mais qu&#8217;en est-il en 2013 ?
Le problème de toute méthodologie ou technologie c&#8217;est qu&#8217;au début c&#8217;est super, mais très vite les soucis commencent à surgir, jusqu&#8217;à s&#8217;apercevoir que cette solution ne résoud pas tous les problèmes (voir la <a href="http://en.wikipedia.org/wiki/Hype_cycle">Gartner Hype Curve</a>).</p>

<p>Il faut toujours garder à l&#8217;esprit de construire la bonne chose (&#8221;<em>Building the right thing</em>&#8221;).
Une idée est le &#8221;<em>Fake it til you make it</em>&#8221;.
Sven nous montre l&#8217;exemple à ne pas suivre avec le <a href="http://en.wikipedia.org/wiki/Microsoft_Kin">téléphone Kin</a> de Microsoft. Censé être très adapté à la nouvelle génération, il fut un échec très retentissant, sorti de la vente à peine au bout de deux semaines, et aura fait perder plus d&#8217;un milliard de dollars à la firme !</p>

<p><img src="http://www.digitaltrends.com/wp-content/uploads/2010/06/043775-microsoft-kin.jpg" title="Microsoft Kin" alt="Image Microsoft Kin" /></p>

<p>A l&#8217;opposé, IBM a voulu tester une application de reconnaissance vocale.
Plutôt que de développer un système complexe, ils ont triché en mettant une personne réelle dont le rôle était d&#8217;exécuter les tâches dictées par un cobaye. L&#8217;expérimentation n&#8217;ayant pas convaincue, il fut décidé que l&#8217;application réelle ne serait pas développée.</p>

<p>Passons à l&#8217;importance du feedback. Celui-ci doit répondre à trois critères :</p>

<ul>
<li>facile à trouver ;</li>
<li>simple ;</li>
<li>rapide à soumettre.</li>
</ul>


<p>Il ne faut pas embêter directement les développeurs avec les feedbacks. Par exemple, pour l&#8217;équipe GMail, il y a 100 développeurs pour 425M utilisateurs. Imaginer que ce soit les développeurs qui traitent directement les feedbacks des utilisateurs. Le développement de l&#8217;application n&#8217;avancerait jamais.
Cependant, tous doivent être conscients de ce qui ne va pas.</p>

<p>Chaque jour, l&#8217;équipe d&#8217;Atlassian se réunit 45 minutes pour revoir ces feedbacks et en faire quelque chose de personnel.
De plus, chaque développeur passe une semaine par an au support de premier niveau, pour être en contact directement avec les problèmes des utilisateurs.</p>

<p>Autre point, ce qu&#8217;ils appellent le <em>Developer on Test</em>. Il s&#8217;agit de faire remplir le rôle de testeur aux développeurs.
Pour cela, six astuces :</p>

<ul>
<li>Le training. Comment penser comme un testeur ?</li>
<li>Faire du <em>pairing</em> entre un testeur et un développeur.</li>
<li><em>Blitz Test</em> : durant une journée, toute la compagnie - et pas seulement les développeurs et les testeurs - teste une nouvelle vesion.</li>
<li>Définir des recettes de tests.</li>
<li>Instaurere des sessions séparées : pendant une heure, deux équipes testent les mêmes choses, puis comparent leurs résultats.</li>
<li>La chasse aux bugs : pendant une semaine, un développeur est dédié à la chasse aux bugs sur tous les éléments marqués comme Terminés.</li>
</ul>


<p>Sven nous rappelle alors que &#8220;La qualité est la responsabilité de chacun&#8221;.</p>

<p>Sven passe ensuite sur le design. A Atlassian, les développeurs font aussi du design.
Ils n&#8217;étaient pas forcément mauvais, mais cela avait tendance à partir dans tous les sens.
Ce dont ils ont besoin, c&#8217;est de lignes directrices, de <em>design guidances</em> (<a href="https://developer.atlassian.com/design">les guidlines de design d&#8217;Atlassian</a>).</p>

<p>Ils organisent également des workshops pour les développeurs.</p>

<p>Comme un développement complet requiert la collaboration de plusieurs départements, il est important de supprimer les frictions qui peuvent apparaitre entre eux.</p>

<p>Atlassian définit également des <em>guidelines</em> pour le développement. Ainsi, pour chaque tâche une branche est créée sur Git.
Leur durée de vie est ainsi très courte (environ 2 jours).
Puis, pour merger le code, ils passent par des <em>push requests</em>, ce qui fait que le nouveau code est revu et validé par ses pairs. Ce nouveau code n&#8217;est donc plus de la responsabilité d&#8217;un seul développeur.</p>

<p>Dernier point : l&#8217;automatisation. Le principe est d&#8217;échouer rapidement (<em>Fail fast</em>). 4 choses à retenir :</p>

<ul>
<li>Mettre à disposition les artifacts générés.</li>
<li>Paralleliser les tests pour les accélérer.</li>
<li>Avoir une stratégie de builds. Créer des couches de tests selon leur catégorie, leur intérêt.</li>
<li>Toujours avoir un oeil sur les statistiques. Savoir par exemple ce qui prend du temps sur un build, pour être en mesure de l&#8217;accélérer.</li>
</ul>


<p>Encore une belle présentation de Sven Peters.</p>

<h2><a href="http://devoxx.be/dv13-chet-haase.html?presId=3193">Patterns, Shmatterns</a></h2>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>Pourquoi cette présentation ? Tout simplement pour son orateur, <a href="https://twitter.com/@chethaase">Chet Haase</a>. L&#8217;année passée, il avait aussi présenté un Quickie (<a href="">The Future of Software Development Process Methodology Effectiveness</a>) qui avait été un beau succès.</p>

<p>Encore une fois, la salle était comble. Chet Haase a cette fois-ci passé en revue un certain nombre de patterns et les a comparé avec ses propres patterns, ce qui en faisait quelque chose d&#8217;assez drôle.</p>

<p><img src="http://linsolas.github.com/images/devoxx-2013-chethaase.jpg" title="Le design pattern Refactory" alt="Le design pattern Refactory" /></p>

<h2><a href="http://devoxx.be/dv13-sven-peters.html?presId=3144">Don&#8217;t use Git</a></h2>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>A nouveau, <a href="https://twitter.com/@svenpet">Sven Peters</a> sur la scène. Le titre de la conférence peut paraître provocateur, tant Git est utilisé partout (Atlassian a même Stash dans son catalogue, un gestionnaire de repositories Git).
Mais cela est en fait une façon de promouvoir ce système de gestion de sources.</p>

<p>Sous le ton de l&#8217;ironie, Sven essaie de démonter les arguments qui font de Git un vrai succès. Git permet de travailler en mode déconnecté ? Mais c&#8217;est la fin du travail collaboratif ! Git rend les merges faciles et presque automatiques ? Mais le travail de merge sur SVN est une ôde à la cohésion d&#8217;équipe&#8230;</p>

<p>Bien entendu, tout cela n&#8217;est que prétexte pour montrer en quoi Git est supérieur aux anciens gestionnaires de sources comme SVN.</p>

<h2><a href="http://devoxx.be/dv13-nikolay-chashnikov.html?presId=3772">Efficient coding in IntelliJ IDEA</a></h2>

<p><img src="http://linsolas.github.com/images/note-2.png" title="2/5" alt="2/5" /></p>

<p><a href="http://devoxx.be/dv13-nikolay-chashnikov.html?presId=3772">Nikolay Chashnikov</a> est aux commandes pour nous montrer comment bien maitriser son IDE IntelliJ IDEA de JetBrains.
Après pas mal d&#8217;essais ratés, je suis finalement passé définitivement sur cet IDE depuis un an, et clairement, je ne reviendrais pas en arrière. Mais je suis conscient de n&#8217;utiliser qu&#8217;une toute petite partie des capacités de l&#8217;outil. J&#8217;attends donc de cette session qu&#8217;elle me donne plein de bons conseils.</p>

<p>Hélas, je resterais sur ma faim. Une bonne première partie de la session montre surtout les capacités d&#8217;autocomplétion proposées par IntelliJ. Le reste est avant tout la découverte (ou non) d&#8217;un certain nombre de raccourcis claviers. Bref, pas grand chose à se mettre sous la dent, si ce n&#8217;est 2 ou 3 nouveaux raccourcis. C&#8217;est chez payé pour une conférence d&#8217;une heure !</p>

<p>Je pense que cette session peut être intéressante pour une personne utilisant Eclipse et souhaitant comprendre pourquoi IntelliJ est si puissant. Mais pour un utilisateur d&#8217;IntelliJ, même un non expert comme moi, peu d&#8217;informations à en tirer. Dommage.</p>

<h2><a href="http://devoxx.be/dv13-tugdual-grall.html?presId=3281">Elastify your app: from SQL to NoSQL in less than one hour!</a></h2>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>J&#8217;avais déjà assisté à cette présentation <a href="">lors de Devoxx France 2013</a>, toujours faite par <a href="https://twitter.com/@tgrall">Tugdual Grall</a> et <a href="https://twitter.com/@dadoonet">David Pilato</a>.
Je me suis dit que j&#8217;allais quand même y jeter un oeil pour mieux l&#8217;apprécier.</p>

<p><img src="http://linsolas.github.com/images/devoxx-2013-elastify.jpg" title="Elastify your application" alt="Elastify your application" /></p>

<p>N&#8217;hésitez pas à relire <a href="http://linsolas.github.io/blog/2013/03/28/devoxx-france-2013-jour-2/">mon résumé lors de Devoxx France 2013</a>.</p>

<h2><a href="http://devoxx.be/dv13-attila-szegedi.html?presId=3732">The Curious Case of JavaScript on the JVM</a></h2>

<p><img src="http://linsolas.github.com/images/note-3.png" title="3/5" alt="3/5" /></p>

<p>J&#8217;aime Java, j&#8217;aime le JavaScript. Je me dis qu&#8217;une session mélangeant les deux pourrait être intéressante.
Je me décide donc d&#8217;aller voir ce qu&#8217;en dit <a href="https://twitter.com/@szegedi">Attila Szegedi</a>.
Il y était question de <a href="http://openjdk.java.net/projects/nashorn/">Nashorn</a>, qui est l&#8217;implémentation d&#8217;un <em>runtime</em> JavaScript hautes performances sur la JVM.</p>

<p>En gros, on écrit du JavaScript mélangé à du Java - à moins que ce ne soit l&#8217;inverse ? A noter que Nashorn devrait être <em>normalement</em> inclus dans le JDK 1.8.</p>

<p>J&#8217;ai un peu de mal à voir l&#8217;intérêt de ce mélange, mais pourquoi pas. C&#8217;est aussi ce genre de chose qui fait la richesse de la plateforme de la JVM :)</p>

<p>Voilà une première journée déjà bien intéressante, j&#8217;attends avec impatience la deuxième fournée de conférences, qui s&#8217;annonce de belle qualité.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mon programme pour Devoxx 2013]]></title>
    <link href="http://linsolas.github.com/blog/2013/11/12/mon-programme-pour-devoxx-2013/"/>
    <updated>2013-11-12T19:35:00+01:00</updated>
    <id>http://linsolas.github.com/blog/2013/11/12/mon-programme-pour-devoxx-2013</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/devoxx_logo.gif" title="Devoxx 2013" alt="Devoxx 2013" /></p>

<p>Et c&#8217;est parti mon Kiki !</p>

<p>LA conférence de l&#8217;année a débuté ce lundi 11 novembre, je veux bien sûr parler de <a href="http://devoxx.be/">Devoxx</a> !
Pour la 4e fois d&#8217;affilée, et la 2e en ce qui concerne la version &#8220;World&#8221; en Belgique, j&#8217;y serais à partir de demain mercredi.</p>

<p>Mon programme n&#8217;est bien sûr pas encore défini, mais j&#8217;ai noté quelques sessions qui m&#8217;intéressent déjà.</p>

<!-- more -->


<ul>
<li>Je commencerais sans doute par <a href="http://devoxx.be/dv13-sven-peters.html?presId=3143">How To Do Kick-Ass Software Development</a> de <a href="https://twitter.com/@svenpet">Sven Peters</a>. J&#8217;avais assisté à sa conférence l&#8217;année passée <a href="http://linsolas.github.io/blog/2012/11/18/devoxx-2012-jour-1/">7 things: How to make good teams great</a> que j&#8217;avais beaucoup apprécié. Je ne sais pas s&#8217;il y aura beaucoup de nouveautés, mais je pense que ça vaut quand même le coup d&#8217;oeil. Il y a également <a href="http://devoxx.be/dv13-dierk-knig.html?presId=3563">UI Engineer - the missing profession</a> par <a href="https://twitter.com/@mittie">Dierk König</a>, qui pourra être ma session de backup.</li>
<li>Pour entamer les Quickies, j&#8217;opterais pour <a href="http://devoxx.be/dv13-chet-haase.html?presId=3193">Patterns, Shmatterns</a>, une présentation par <a href="https://twitter.com/@chethaase">Chet Haase</a> qui devrait être du même niveau que sa présentation <a href="http://linsolas.github.io/blog/2012/11/18/devoxx-2012-jour-1/">The Future of Software Development Process Methodology Effectiveness</a> faite l&#8217;année dernière : complètement décalée et très drôle.</li>
<li>Pour le Quickie suivant, ce sera peut-être encore Sven Peters avec <a href="http://devoxx.be/dv13-sven-peters.html?presId=3144">Don&#8217;t use Git</a> ou <a href="http://devoxx.be/dv13-xavier-coulon.html?presId=3586">HTTP caching in practice</a>.</li>
<li>Pour la digestion, je me laisserais bien tenté par un <a href="http://devoxx.be/dv13-nikolay-chashnikov.html?presId=3772">Efficient coding in IntelliJ IDEA</a> par <a href="http://devoxx.be/dv13-nikolay-chashnikov.html?presId=3772">Nikolay Chashnikov</a>, parce qu&#8217;on ne connait pas assez son IDE. Au cas où, il y a bien une session avec un robot avec <a href="http://devoxx.be/dv13-tobias-antonsson.html?presId=3730">The Crazyflie Nano Quadcopter development platform</a> par <a href="http://devoxx.be/dv13-tobias-antonsson.html">Tobias Antonsson</a>.</li>
<li>Puis, un petit <a href="http://devoxx.be/dv13-tugdual-grall.html?presId=3281">Elastify your app: from SQL to NoSQL in less than one hour!</a> par mes amis <a href="https://twitter.com/@tgrall">Tugdual Grall</a> et <a href="https://twitter.com/@dadoonet">David Pilato</a>, qui montrent qu&#8217;il est possible d&#8217;intégrer facilement du NoSQL dans une application Legacy. Je me dis d&#8217;ailleurs qu&#8217;avec leurs bons conseils et ceux de <a href="http://devoxx.be/dv13-david-gageot.html?presId=3108">David Gageot</a>, on pourrait faire passer une application Legacy dans le cloud avec NoSQL en 120 minutes chrono :o)</li>
<li>Pour continuer, j&#8217;hésite entre <a href="http://devoxx.be/dv13-luke-daley.html?presId=3680">Taming Functional Web Testing (with Spock &amp; Geb)</a> par <a href="https://twitter.com/@ldaley">Luke Daley</a> et <a href="http://devoxx.be/dv13-attila-szegedi.html?presId=3732">The Curious Case of JavaScript on the JVM</a> par <a href="https://twitter.com/@szegedi">Attila Szegedi</a>.</li>
</ul>


<p>Je ne sais pas encore comment je finirais ma première journée, mais elle aura déjà été bien remplie !
Pour le jeudi, quelques idées :</p>

<ul>
<li><a href="http://devoxx.be/dv13-francesc-campoy-flores.html?presId=3493">Go see all the ships in the world</a> par <a href="https://twitter.com/@francesc">Francesc Campoy Flores</a> qui se propose de construire une visualisation dynamique de la position et trajectoire de tous les bateaux du monde ! Un vaste programme&#8230;</li>
<li>Pour la suite, j&#8217;aimerais bien assister à <a href="http://devoxx.be/dv13-igor-minar.html?presId=3468">What is in store for the future of Angular</a> par <a href="https://twitter.com/@IgorMinar">Igor Minar</a> et <a href="https://twitter.com/@mhevery">Misko Hevery</a>, mais je pense que ce sera l&#8217;une des sessions les plus blindées, tant AngularJS est populaire en ce moment !</li>
<li>Mon premier Quickie aurait bien été <a href="http://devoxx.be/dv13-david-pilato.html?presId=3282">Make sense of your (BIG) data!</a> par <a href="https://twitter.com/@dadoonet">David Pilato</a>, mais il se trouve que je passe à la même heure que lui ! Ce sera donc <a href="http://devoxx.be/dv13-romain-linsolas.html?presId=3545">The ingredients for a perfect JavaScript Software Factory</a> par <a href="https://twitter.com/@romaintaz">moi-même</a> !</li>
<li>Pour la suite, ce sera peut-être <a href="http://devoxx.be/dv13-sam-brannen.html?presId=3235">Spring Framework 4.0 - The Next Generation</a> par <a href="https://twitter.com/@sam_brannen">Sam Brannen</a>, ou l&#8217;enregistrement du PodCast <a href="http://devoxx.be/dv13-dick-wall.html?presId=3713">JavaPosse</a>.</li>
<li>Je continuerais par du Continuous Delivery avec <a href="http://devoxx.be/dv13-andrzej-grzesik.html?presId=3500">Continuous Delivery antipatterns</a> par <a href="http://devoxx.be/dv13-andrzej-grzesik.html">Andrzej Grzesik</a> puis <a href="http://devoxx.be/dv13-hans-dockter.html?presId=3604">Continuous Delivery Patterns for Large Software Stacks</a> de <a href="https://twitter.com/@gradleware">Hans Dockter</a>.</li>
</ul>


<p>Je crois bien que ma journée de jeudi s&#8217;achèvera par le film proposé par Devoxx, <a href="http://www.allocine.fr/film/fichefilm_gen_cfilm=202971.html">The Counselor, Le Cartel</a> de Ridley Scott.
Pour la dernière journée (enfin, demi-journée), mon programme :</p>

<ul>
<li>Je commencerais peut-être par <a href="http://devoxx.be/dv13-scott-kurz.html?presId=3728">Batch Applications for the Java Platform (JSR 352)</a> de <a href="http://devoxx.be/dv13-scott-kurz.html">Scott Kurz</a>.</li>
<li>Bien évidemment, un Devoxx ne serait rien sans son enregistrement live des <a href="http://devoxx.be/dv13-vincent-massol.html?presId=3430">CastCodeurs</a>. Ma place y est donc déjà réservée :o)</li>
<li>Pour terminer cette conférence, je me laisserais bien tenté par <a href="http://devoxx.be/dv13-jean-franois-denise.html?presId=3759">Avatar.js, Server-Side JavaScript on the Java Platform</a> par <a href="http://devoxx.be/dv13-jean-franois-denise.html">Jean-François Denise</a>.</li>
</ul>


<p>Voilà, mon programme est établi. Bien entendu, celui-ci va sans aucun doute beaucoup évoluer quand je serais sur place. On verra vendredi après-midi si j&#8217;avais bien jugé ou pas&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SoftShake 2013 - facilitation graphique]]></title>
    <link href="http://linsolas.github.com/blog/2013/10/29/softshake-2013-facilitation-graphique/"/>
    <updated>2013-10-29T18:31:00+01:00</updated>
    <id>http://linsolas.github.com/blog/2013/10/29/softshake-2013-facilitation-graphique</id>
    <content type="html"><![CDATA[<p>Les organisateurs de la conférence SoftShake ont eu la très bonne idée d&#8217;inviter Elizabeth Auzan et Sébastien Gerbier des &#8221;<em>Visual Thinkers</em>&#8221;, ou <em>Facilitateus Visuels</em>, de la société <a href="http://www.lowtech-hitouch.com/">Lowtech Hitouch</a>.</p>

<p>L&#8217;idée est simple : ils se présentent à différentes sessions et illustrent graphiquement ce qu&#8217;ils entendent, ce qu&#8217;ils comprennent.
Je n&#8217;ai pas eu la chance qu&#8217;ils viennent à ma session, mais je partage quand même les très jolies planches que voici (désolé pour la 4e qui est un peu floue) :</p>

<p><img src="http://linsolas.github.com/images/softshake-2013-dessin1.jpg" title="Première image" alt="Priemère image" /></p>

<!-- more -->


<p><img src="http://linsolas.github.com/images/softshake-2013-dessin2.jpg" title="Deuxième image" alt="Deuxième image" />
<img src="http://linsolas.github.com/images/softshake-2013-dessin3.jpg" title="Troisième image" alt="Troisième image" />
<img src="http://linsolas.github.com/images/softshake-2013-dessin4.jpg" title="Quatrième image" alt="Quatrième image" />
<img src="http://linsolas.github.com/images/softshake-2013-dessin5.jpg" title="Cinquième image" alt="Cinquième image" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SoftShake 2013 - deuxième jour]]></title>
    <link href="http://linsolas.github.com/blog/2013/10/25/softshake-2013-deuxieme-jour/"/>
    <updated>2013-10-25T16:19:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2013/10/25/softshake-2013-deuxieme-jour</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/soft-shake-2013.png" title="Soft Shake 2013" alt="Soft Shake 2013" /></p>

<p>Et c&#8217;est parti pour le second jour de la conférence <strong>Soft-Shake</strong>.</p>

<!-- more -->


<h2>Keynote collaborative</h2>

<p>La première keynote de la journée était une keynote &#8220;collaborative&#8221;.
Chaque responsable d&#8217;un track de sessions avait la parole pendant 4 minutes pour nous exposer sa vision à moyen terme (entre 2 et 5 ans) concernant sa technologie. Par exemple, le responsable de la partie &#8220;web&#8221; nous a dit que le JavaScript sera encore plus présent qu&#8217;aujourd&#8217;hui, en particulier du côté serveur.</p>

<h2>Keynote Programatoo</h2>

<p><img src="http://linsolas.github.com/images/note-4.5.png" title="4.5/5" alt="4.5/5" /></p>

<p>La seconde keynote parlait de &#8221;<strong>Programatoo</strong>&#8221;, un projet lancé par Audrey Neveu (<a href="https://twitter.com/Audrey_Neveu">@Audrey_Neveu</a>) et Aline Paponaud (<a href="https://twitter.com/bootis">@bootis</a>) de <a href="http://www.sfeir.fr">SFEIR</a>.
Qu&#8217;est-ce que Programatoo ?
Il s&#8217;agit d&#8217;apprendre à coder à nos enfants, n&#8217;y plus n&#8217;y moins.</p>

<p><img src="http://linsolas.github.com/images/programatoo.jpg" title="Programatoo" alt="Programatoo" /></p>

<p>Revenons 20 ans en arrière pour comprendre la génèse de cette idée.
Au milieu des années 80, Aline et Audrey sont des petites filles (très sages, forcément) déjà attirées par les mystères de l&#8217;informatique et des ordinateurs. Elles veulent comprendre comment ça marche. 10 ans plus tard, leur intérêt est toujours intact, mais hélas elles se heurtent souvent à des stéréotypes (&#8221;<em>ce n&#8217;est pas pour les filles !</em>&#8221;) ou l&#8217;incompréhension du milieu scolaire pour ce domaine.
Audrey apprend avec joie qu&#8217;il y a des cours d&#8217;informatique dans son lycée. Elle s&#8217;y inscrit, mais cela se résumera à apprendre à utiliser Word ou Excel. C&#8217;est la déception.
De son côté, Aline n&#8217;a guère plus de succès.
Fort heureusement, elles ne baissent pas les bras, et embrassent le métier de programmeuse.</p>

<p>En 2012, Aline va trouver Audrey pour proposer une idée géniale : et si on apprenait à coder à nos enfants ! C&#8217;est ainsi qu&#8217;en mars 2012 nait la première session &#8220;Programatoo&#8221;, avec les enfants des employés de SFEIR. Et c&#8217;est un succès.</p>

<p>Les choses ne sont pas pour autant parfaites.
Elles font un constat navrant. Parmi les participants, il y avait deux adolescentes. Celles-ci sont parfaitement à l&#8217;aise avec les ordinateurs, du moins quand il s&#8217;agit d&#8217;utiliser Facebook, YouTube et autres services du genre. Mais elles sont incapables de vraiment utiliser un ordinateur, de comprendre comment cela fonctionne, ni même voir en cette machine un merveilleux outil de créativité !</p>

<p>On dit que la jeune génération est une génération &#8220;digitale&#8221;, qu&#8217;elle est née avec un smartphone dans les mains. Je le constate aussi, mon fils de 6 ans maitrise depuis un moment l&#8217;iPad, qui n&#8217;a plus de secret pour lui.
Mais en réalité, nos enfants sont conditionnés pour &#8221;<strong>consommer</strong>&#8221; de l&#8217;informatique. Il faut les aider à en devenir des acteurs, des vrais utilisateurs.
Finalement, c&#8217;est un peu comme une carte et un GPS : aujourd&#8217;hui, l&#8217;utilisation d&#8217;un GPS est plutôt intuitive et il nous mâche tout le travail, on n&#8217;a plus qu&#8217;à suivre bêtement ses instructions. Du coup, il devient obsolète de savoir lire une carte papier classique, et pourtant cela reste la base pour savoir se positionner quelque part&#8230;</p>

<p>En tant qu&#8217;informaticien, il ne tient qu&#8217;à nous de changer la donne. Nous avons beaucoup d&#8217;outils, de langages destinés à l&#8217;aprentissage de la programmation, y compris destinés à de jeunes enfants.
Ayant discuté ensuite avec Audrey, je vais sans doute essayer de mettre mon fils à la programmation.
Bien entendu, point de Scala :) mais plutôt du <a href="http://scratch.mit.edu">Scratch</a> qui a l&#8217;avantage d&#8217;être très visuel et ludique.</p>

<p>Il faut noter que le projet Programatoo n&#8217;est pas unique en son genre. Les conférences &#8220;Devoxx 4 Kids&#8221; s&#8217;organisent par-ci, par-là. Il y en avait justement une à Genève le samedi qui a suivi la conférence Soft-Shake.</p>

<p>Programatoo a également gagné le &#8220;Duke Choice Awards 2013&#8221; à la conférence Java One. Une très belle consécration amplement méritée.
Bravo Audrey et Aline !</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_ruby/2013/10/25/01-speedup-your-web-app.html">Speed-up your webapp</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/alexis-bernard.html">Alexis Bernard</a> (<a href="https://twitter.com/alexis_bernard">@alexis_bernard</a>)</p>

<p><img src="http://linsolas.github.com/images/note-2.png" title="2/5" alt="2/5" /></p>

<p>Je suis ouvert d&#8217;esprit, je vais donc dans le track &#8220;Ruby&#8221; pour la première session de la journée.
Alexis nous parle d&#8217;optimisation quand on veut accélérer son site web.</p>

<p>Première question : pourquoi le faire ?
A cela, Alexis nous donne les exemples de Amazon et Yahoo! : pour le premier, diminuer le temps de réponse de 100ms, c&#8217;est un gain de revenu de l&#8217;ordre d&#8217;1%, ce qui n&#8217;est pas négligeable quand on voit leurs revenus&#8230;
Pour le second, une diminution de 400ms de ce temps de réponse, et c&#8217;est 9% de traffic gagnés !
Tout le monde n&#8217;est pas Amazon ou Yahoo! mais cela reste intéressant.</p>

<p>La technique d&#8217;Alexis est simple : mesurer, optimiser et mesurer encore.</p>

<p>Donc il faut mesurer. Pour cela, Alexis nous parle de quelques outils :</p>

<ul>
<li><a href="http://www.newrelic.com/">New Relic</a>, une solution SAAS visiblement assez poussée, qui historise en plus les mesures. Pratique pour comparer dans le temps. Mais c&#8217;est une solution assez chère visiblement (de l&#8217;ordre de 150€ par mois et par serveur).</li>
<li><a href="https://github.com/MiniProfiler/rack-mini-profiler">Rack Mini Profiler</a>, un outil Ruby, un peu dans la même idée que New Relic, mais avec moins de fonctionnalités, et pas d&#8217;historisation.</li>
<li><a href="https://www.pingdom.com/">Pingdom</a> dont l&#8217;une des fonctionnalités est de vérifier que les recommandations standard d&#8217;optimisations des sites-web sont bien respectées.</li>
<li><a href="http://www.webpagetest.org/">WebPageTest</a>, qui a l&#8217;astuce de tester chaque requête 2 fois de suite. Cela permet ainsi de vérifier l&#8217;efficacité du système de cache des ressources.</li>
<li>Chrome Dev Tools peut aussi être mis à profit pour mesurer les performances de l&#8217;application.</li>
</ul>


<p>Une fois les mesures faites, il faut corriger les problèmes. Alexis nous dit qu&#8217;il faut toujours optimser le <em>back-end</em> dans un premier temps. La plupart du temps cela va se résumer à optimiser la base de données, les requêtes, les indexes, etc.
Une fois ceci fait, on peut s&#8217;intéresser à l&#8217;optimisation <em>front-end</em>. Là aussi des outils peuvent nous aider, Chrome Dev Tools par exemple, ou imageoptim.com, pour améliorer la compression des images.</p>

<p>Une session intéressante, mais qui ne va pas à mon goût assez loin dans les détails. Les solutions proposées restent assez basiques au final.</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_java/2013/10/25/02-Golo.html">Golo, le langage qui donne des super-pouvoirs</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/philippe-charriere.html">Philippe Charrière</a> (<a href="https://twitter.com/k33g_org">@k33g_org</a>)</p>

<p><img src="http://linsolas.github.com/images/note-3.5.png" title="3.5/5" alt="3.5/5" /></p>

<p>Mais qu&#8217;est-ce que <strong>Golo</strong>, ce langage au nom rigolo ?
C&#8217;est un langage créé par Julien Ponge (@jponge) qui tourne sur la JVM, avec Java 7 ou 8 (pas avant, car Golo nécessite <code>invokedynamic</code> pour tourner, introduit en Java 7).
Ses principales forces sont sa simplicité, sa légèreté ainsi que la facilité d&#8217;étendre le langage.</p>

<p>Philippe nous montre quelques exemples de code, la syntaxe reste assez compréhensible pour un développeur Java.
Les lambdas, qui se font toujours attendre dans Java, sont là, tout comme les structures, des objets créés dynamiquement (<code>ObjectDynamic</code>) ou encore la possibilité d&#8217;étendre (<code>augment</code>) des classes existantes pour leur ajouter des fonctionnalités.</p>

<p>Je vous invite à aller jeter un oeil sur le site du langage - <a href="http://golo-lang.org">http://golo-lang.org</a> - pour vous rendre compte de ce qu&#8217;offre ce langage, et voir quelques exemples concrets de code. Voilà un basique <em>Hello World</em> :</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>module EchoArgs
</span><span class='line'>
</span><span class='line'>function main = |args| {
</span><span class='line'>    println("Hello World...")
</span><span class='line'>    foreach arg in args {
</span><span class='line'>      println("-&gt;  " + arg)
</span><span class='line'>    }
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>J&#8217;ai aimé cette présentation, qui nous a donné un bon aperçu de ce qu&#8217;est Golo.
Toutefois, cela reste un langage dont le but m&#8217;échappe un peu - hormis le côté &#8220;fun&#8221; d&#8217;avoir créer son propre langage !</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_mobile/2013/10/25/3-Mobile-troll-party.html">Mobile Troll Party</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/xavier-bourguignon.html">Xavier Bourguignon</a> (<a href="https://twitter.com/xbourguignon">@xbourguignon</a>)</p>

<p><img src="http://linsolas.github.com/images/note-3.png" title="3/5" alt="3/5" /></p>

<p><img src="http://linsolas.github.com/images/softshake-2013-mobile-troll-party.jpg" title="Une session pleine de violences" alt="Une session pleine de violences" /></p>

<p>Une session pour le fun. Le but ici est de troller sévèrement sur iOS et Android.
Je m&#8217;attendait à un peu plus de trash, un peu plus de sujets polémiques. Le jeu des deux présentateurs n&#8217;était peut-être pas assez rodé je pense, mais d&#8217;après ce que j&#8217;ai compris, Xavier devait la faire seul jusqu&#8217;à la veille au soir où il a réussi à convaincre son partenaire de venir aussi.
Malgré tout, c&#8217;était une bonne ambiance, et les trolls étaient effectivement nombreux !</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_agile/2013/10/25/4-5-ans-et-500-releases-en-50-minutes.html">5 ans, 500 releases en 50 minutes</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/25/freddy-mallet.html">Freddy Mallet</a> (<a href="https://twitter.com/FreddyMallet">@FreddyMallet</a>) et <a href="http://soft-shake.ch/2013/program/authors/2013/10/24/olivier-gaudin.html">Olivier Gaudin</a> (<a href="https://twitter.com/gaudol">@gaudol</a>)</p>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>Compte tenu du temps imparti (45 minutes), cette session a été renommée &#8221;<em>4 ans, 400 releases en 40 minutes</em>&#8221; :)
Cette session raconte la vie de la société SonarSource, éditeur de l&#8217;outil d&#8217;analyse de code SonarQube (connu anciennement simplement sous le nom Sonar).</p>

<p>Lorsque SonarSource a été créée, il y a 5 ans, c&#8217;était une petite startup lancée par trois personnes (en particulier Olivier et Freddy), sur leurs fonds propres. La société marche bien aujourd&#8217;hui, et a bien grossi (une 20aine de personnes d&#8217;ici la fin de l&#8217;anée), mais il y a eu beaucoup de problèmes, de &#8220;douleurs&#8221;. En particulier 5 :</p>

<ul>
<li>Les tests.</li>
<li>L&#8217;architecture.</li>
<li>L&#8217;infrastructure.</li>
<li>L&#8217;organisation.</li>
<li>Sonar on Sonar.</li>
</ul>


<p>Un gros travail a été fait sur les tests. Les tests unitaires d&#8217;abord, mais aussi les tests d&#8217;intégration. Le fait que Sonar supporte 5 bases de données différentes, qu&#8217;il existe une soixante de plugins ne rend pas les choses simples. Toutefois, ils arrivent à tout tester de façon assez efficace.</p>

<p>Initialement, HibernateORM et GWT avaient été choisis. Le premier car gérer 5 bases de données et autant de spécificités n&#8217;est jamais aisé. Le second, car à l&#8217;époque cela répondait bien aux besoins de l&#8217;équipe. Mais ces choix se sont finalement avérés être des maillons faibles, et progressivement ont été remplacés.</p>

<p>Les développeurs ne font pas que des développements, il a fallu embaucher une personne dédiée à part entière pour gérer l&#8217;infrastructure et les releases. Mais un tel cloisonnement n&#8217;est jamais très efficace, et SonarSource a ainsi créer une équipe de &#8220;DevOps&#8221;.</p>

<p>Afin de ne pas être désynchroniser avec les utilisateurs de l&#8217;outil, l&#8217;équipe de SonarSource utilise SonarQube directement. Le fameux principe du &#8221;<em>Eat your own dog food</em>&#8221; en somme. Ils ont ainsi une instance de &#8220;production&#8221; interne pour laquelle ils font des releases toutes les semaines. Cela implique donc d&#8217;être capable de faire des releases presque tous les jours, les développements de type &#8220;big bang&#8221; sont donc exclus.</p>

<p>Un dernier point abordé par Freddy et Olivier concerne le <em>Quality Gate</em> (un sujet qui mériterait sans doute une session à part entière). Il s&#8217;agit d&#8217;une sorte de contrat de qualité pour pouvoir faire une release. En gros, il faut respecter certaines règles, atteindre certains objectifs pour engager la release : par exemple, avoir clos tous les tickets JIRA, avoir une note SQALE de A (la meilleure), ne pas avoir de violations bloquantes ou critiques, ou même de violations non revues par l&#8217;équipe.</p>

<h2>Bilan</h2>

<p>Au final, ce sont deux très belles journées qui viennent de s&#8217;écouler.
La qualité des présentations et le niveau des speakers sont très bons.</p>

<p>Les plus :</p>

<ul>
<li>Du beau monde. C&#8217;est toujours un plaisir de revoir des gens qu&#8217;on apprécie, et de rencontrer physiquement des personnes que l&#8217;on ne connait que par Twitter.</li>
<li>De bons sujets.</li>
<li>Des tracks très variés : Java, agilité, web, mobile, IA/Robotique, BigData et NoSQL, Microsoft, Ruby on Rails.</li>
<li>Le repas des speakers (miam miam la fondue !)</li>
<li>Genève, très jolie ville.</li>
<li>Les organisateurs, très accueillants et toujours disponibles.</li>
<li>Les dessins en live des sessions (voir prochain billet).</li>
</ul>


<p>Les moins :</p>

<ul>
<li>La séparation des salles. Elles se trouvaient soit au 1e étage, soit au 5e. Changer de salle pouvait ainsi demander un peu de gymnastique !</li>
<li>A peu de choses près, les mêmes repas le midi sur les deux jours. Un peu plus de variété aurait été appréciable. Pas de problème au niveau de la quantité toutefois.</li>
<li>J&#8217;aurais bien aimé que SoftShake se tienne en hiver, Genève sous la neige doit être très agréable.</li>
</ul>


<p>Pour résumer, Soft Shake est une très belle conférence, dans l&#8217;esprit de Devoxx ou Mix-IT. J&#8217;y retournerais avec grand plaisir !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SoftShake 2013 - premier jour]]></title>
    <link href="http://linsolas.github.com/blog/2013/10/24/softshake-2013-premier-jour/"/>
    <updated>2013-10-24T11:39:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2013/10/24/softshake-2013-premier-jour</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/soft-shake-2013.png" title="Soft Shake 2013" alt="Soft Shake 2013" /></p>

<p>Jacques Couvreur nous accueille pour <a href="http://soft-shake.ch/2013/fr/">cette session 2013 de la conférence Soft-Shake</a>. Ce sont 2 jours de conférences, neuf tracks en parallèle, une centaine d&#8217;orateurs, et 300 participants. A noter qu&#8217;environ un tiers des présentations se fait en anglais.
Une bonne petite conférence donc !</p>

<!-- more -->


<p><img src="http://linsolas.github.com/images/softshake-2013-Geneve.jpg" title="Le fameux Jet d'Eau de Genève" alt="Le fameux Jet d'Eau de Genève" /></p>

<p>Je vais <a href="http://www.touilleur-express.fr/2013/10/18/codeurs-en-seine-2013/">faire comme Nicolas Martignole</a> (a.k.a. le touilleur express), à savoir que je vais donner pour chaque session mon ROTI, le Retour sur le Temps Investi, autrement dit une note de 0 à 5 qui dénote l&#8217;intérêt que j&#8217;ai eu à suivre la présentation.</p>

<h2>Keynote</h2>

<p>Robin Cornelius</p>

<p><img src="http://linsolas.github.com/images/note-3.5.png" title="3.5/5" alt="3.5/5" /></p>

<p>Difficile de résumer cette keynote. C&#8217;était plus un discours de Robin Cornelius sur sa vie et celle de sa société, <a href="http://www.switcher">Switcher</a>.
Mais c&#8217;était tout de même agréable de l&#8217;écouter parler. Robin fait partie des gens passionnés par son travail, sa société, et que l&#8217;on pourrait écouter pendant des heures.
Bon démarrage donc&#8230;</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_mobile/2013/10/24/1-votre-premiere-application-ios.html">Votre première application iOS</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/marc-henri-primault.html">Marc-Henri Primault</a></p>

<p><img src="http://linsolas.github.com/images/note-2.png" title="2/5" alt="2/5" /></p>

<p>Présenter un langage en l&#8217;espace de 45 minutes, c&#8217;est compliqué, il y a forcément beaucoup de concepts à montrer.
Je pense que Marc-Henri a bien montré les bases, mais il est vrai que la lisibilité du code dans les slides n&#8217;était pas extraordinaire. La coloration de certains mots clés en violet sur fond noir n&#8217;est jamais bien rendue par un vidéoprojecteur.</p>

<p>Personnellement, j&#8217;ai eu du mal à accrocher car malheureusement le format de présentation ne se prête pas très bien à un tel apprentissage, en particulier pour des personnes comme moi qui n&#8217;y connaissent pas grand chose en développement iOS. Un &#8221;<em>Hands On</em>&#8221; s&#8217;y prêterait tellement mieux !</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_web_dev/2013/10/24/2-Generating_tests_from_code_or_how_to_test_better_and_faster.html">Generating tests from code, or how to test better and faster</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/renault-john-lecoultre.html">Renault John Lecoultre</a> (<a href="https://twitter.com/renajohn">@renajohn</a>)</p>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>Tester une application JavaScript, c&#8217;est compliqué.
Il existe deux types d&#8217;analyse de code : l&#8217;analyse statique et dynamique.</p>

<p>La première se concentre à vérifier syntaxiquement si le code est correct.
On détectera ici l&#8217;utilisation de mauvais patterns, ou du code qui peut présenter un risque fort de bug, comme par exemple l&#8217;utilisation du <code>==</code> au lieu du <code>===</code> en JavaScript. Des outils comme <a href="http://www.jslint.com/">JSLint</a>, <a href="http://www.jshint.com/">JSHint</a> ou encore <a href="http://www.sonarqube.org/">SonarQube</a> sont tout à fait adaptés pour ce type d&#8217;analyse. Mais cela a quand même des limites.</p>

<p>L&#8217;analyse dynamique va exécuter le code pour en vérifier certaines règles, le cas le plus courant étant l&#8217;exécution de tests (unitaires, fonctionnels, etc.).</p>

<p>Renault nous parle toutefois d&#8217;un troisième type d&#8217;analyse, à savoir <strong>l&#8217;analyse symbolique</strong>.
Une rapide recherche sur Google me dit que &#8221;<em>L&#8217;analyse symbolique de données consiste en un mode d&#8217;analyse de tableaux de données statistiques arbitraires par perception cognitive de la surface expressionnelle du médium.</em>&#8221;
Bon, je crois qu&#8217;on va laisser tomber la définition et voir directement comment Renault l&#8217;illustre dans sa démonstration.</p>

<p>Il nous parle de l&#8217;outil <a href="https://unite.bugbuster.com/">Unite</a> de sa société <a href="http://bugbuster.com/">BugBuster</a>.
L&#8217;idée derrière cet outil est de lui fournir une fonction en entrée, et lui va essayer de trouver un jeu d&#8217;entrées (<em>inputs</em>) afin de pouvoir tester tous les chemins possibles dans la fonction.
Prenons l&#8217;exemple suivant :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// params : {x: Number}</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">puzzle</span><span class="p">(</span><span class="nx">x</span><span class="p">){</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>On le voit, pour parcourir les deux branches de cette fonction, nous devons faire en sorte d&#8217;évaluer à <code>true</code> la condition <code>if</code>, puis également à <code>false</code>. C&#8217;est là qu&#8217;intervient Unite. Il va analyser le code de la fonction pour nous trouver les deux valeurs d&#8217;entrée, ici <code>x = 0</code> puis <code>x = 1</code>.
Là où l&#8217;outil devient plus intéressant, c&#8217;est quand on a du code plus complexe. Prenons un nouvel exemple, avec une fonction de validation d&#8217;email (avec une expression régulière simple) :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// params : {email: String}</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">puzzle</span><span class="p">(</span><span class="nx">email</span><span class="p">){</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span><span class="nx">email</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/</span><span class="p">))</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Unite va nous trouver deux entrées possibles : <code>`email = "a"</code> pour l&#8217;évaluation négative de la condition, et <code>email = "9@B.PH"</code> pour son évaluation positive.</p>

<p>Je dois dire que l&#8217;outil s&#8217;avère très intéressant, bien qu&#8217;encore à l&#8217;état de bêta. Reste la question de l&#8217;industrialisation d&#8217;un tel outil. Pour le moment, je le vois bien comme utilisation <em>one shot</em> pour trouver un bon ensemble de jeux de données pour tester une fonction.
En tout cas, c&#8217;est un outil à suivre de près&#8230;</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_web_dev/2013/10/24/3-Backbone_et_marionette_le_dev_js_simplifie.html">Backbone.js et Marionette, le développement JavaScript simplifié</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/xavier-bourguignon.html">Xavier Bourguignon</a> (<a href="https://twitter.com/xbourguignon">@xbourguignon</a>) et <a href="http://soft-shake.ch/2013/program/authors/2013/10/24/philippe-charriere.html">Philippe Charrière</a> (<a href="https://twitter.com/k33g_org">@k33g_org</a>)</p>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>Backbone est une librairie légère pour faire du single page application (&#8220;MVC&#8221; / &#8220;MVP&#8221; côté client). Il se base sur la librarie <a href="http://underscorejs.org/">underscore</a>, pour le templating par exemple.
Backbone dispose d&#8217;un modèle objet. Son intérêt réside également dans sa facilité d&#8217;extension.</p>

<p>Philippe commence à nous montrer des exemples de code avec Backbone. Mais de l&#8217;avis de Xavier, &#8221;<em>Backbone c&#8217;est bien, sauf la partie vue</em>&#8221;.
Et c&#8217;est vrai que je trouve le code côté vue assez verbeux. C&#8217;est pour cela qu&#8217;il introduit la librairie <a href="http://marionettejs.com/">Marionette.js</a>, qui joue ainsi le rôle de surcouche à BackBone pour gérer la partie Vue. Ainsi, Marionette permet de faire du vrai <em>Single Page Application</em> avec BackBone.</p>

<p>Xavier et Philippe nous offrent ainsi une vision assez claire de ce framework, en montrant ses atouts mais aussi ses limites. J&#8217;avoue que je préfère toujours AngularJS, bien que ce dernier ait un côté un peu plus &#8220;magique&#8221; que Backbone qui semble plus accessible et plus compréhensible.</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_web_dev/2013/10/24/4-Web_Components_lavenir_des_developpeurs_web.html">Web Components, l&#8217;avenir des développeurs web</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/julien-vey.html">Julien Vey</a> (<a href="https://twitter.com/julienvey">@julienvey</a>)</p>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>Les applications web sont aujourd&#8217;hui de plus en plus riches, et le langage HTML atteint vite ses limites.
C&#8217;est pour cela que le concept de <strong>composants web</strong> est arrivé.
Il s&#8217;agit d&#8217;un standard W3C en cours de rédaction, partiellement implémenté par les navigateurs (particulièrement Chrome).</p>

<p>L&#8217;idée est de créer des &#8220;éléments customs&#8221;. Imaginons le bouton &#8220;Twitter&#8221; que l&#8217;on peut ajouter sur son site, afin de permettre au visiteur du site de suivre votre compte Twitter.
Si vous regardez le code de ce bouton, vous verrez un truc illisible fait de HTML et JavaScript. Ne serait-ce pas plus simple d&#8217;avoir un tag <code>&lt;twitter user="romaintaz"/&gt;</code> par exemple ? De même, un composant pour noter un article n&#8217;aurait-il pas plus de sens sous la forme <code>&lt;ranking note="3"/&gt;</code> ?</p>

<p>Eh bien c&#8217;est (à peu près) possible aujourd&#8217;hui !</p>

<h3>Les templates</h3>

<p>La première brique à connaître, ce sont les templates. Ils permettent la séparation du fond et de la forme <em>via</em> l&#8217;utilisation de <code>&lt;template&gt;</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;template</span> <span class="na">id=</span><span class="s">&quot;monTemplate&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  // code HTML du template.
</span><span class='line'>  <span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">&quot;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;comment&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/template&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ce template est parsé, mais pas affiché. Les balises <code>&lt;script/&gt;</code> ne sont pas exécutées, et les images ne sont pas chargées. Le code ci-dessus est donc parfaitement valide. Pour l&#8217;instancier, il suffit d&#8217;un peu de code JavaScript :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">t</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#monTemplate&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">t</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;img&#39;</span><span class="p">).</span><span class="nx">src</span> <span class="o">=</span> <span class="s2">&quot;...&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">t</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">cloneNode</span><span class="p">(</span><span class="kc">true</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>A ce moment-là, les scripts sont exécutés, les images chargées et le DOM affiché.</p>

<h3>Encapsulation</h3>

<p>Passons à la deuxième brique : l&#8217;encapsulation.
Aujourd&#8217;hui, on utiliserait des <code>&lt;iframe&gt;</code>. Mais pouah !
Avec les web components, on utilise le principe du &#8221;<strong>shadow DOM</strong>&#8221;, c&#8217;est-à-dire du DOM masqué du reste de l&#8217;application. Exemple :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;video</span> <span class="na">controls</span> <span class="na">src=</span><span class="s">&quot;/ma/video&quot;</span><span class="nt">&gt;&lt;/video&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Avec Chrome Tools, on peut faire afficher le shadow DOM pour cette balise vidéo, sous un &#8220;tag&#8221; <code>#document-fragment</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;host&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">host</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#monTemplate&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">show</span> <span class="o">=</span> <span class="nx">host</span><span class="p">.</span><span class="nx">createShadowRoot</span><span class="p">();</span>
</span><span class='line'><span class="nx">shadow</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s1">&#39;&lt;h2&gt;Hello&lt;/h2&gt;&#39;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>On peut aussi passer par des templates :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">shadow</span><span class="p">.</span><span class="nx">webkitCreateShadowRoot</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Il existe aussi le concept d&#8217;<em>Insertion point</em>, avec utilisation de <code>&lt;content&gt;&lt;/content&gt;</code> dans le shadow DOM. Le contenu de la balise du web component est injecté à la place du <code>&lt;content&gt;&lt;/content&gt;</code> défini dans le shadow DOM.</p>

<p>On peut aussi utiliser des sélecteurs pour ne récupérer qu&#8217;une partie du code HTML du composant web : <code>&lt;content select="h2"&gt;&lt;/content&gt;</code> qui récupèrera uniquement le code du <code>h2</code>, <code>&lt;content select="h1:first-child"&gt;&lt;/content&gt;</code> pour le premier élément de <code>h1</code> ou <code>&lt;content select="*"&gt;&lt;/content&gt;</code> pour récupérer le reste.</p>

<h3>Externalisation</h3>

<p>Comment peut-on créer des composants web et les utiliser ailleurs ? Cela se fait grâce à la balise <code>&lt;element&gt;</code> qui permet de créer ces nouveaux éléments :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">name=</span><span class="s">&quot;megabutton&quot;</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">constructor=</span><span class="s">&quot;MegaButton&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;template&gt;</span>
</span><span class='line'>      ...
</span><span class='line'>  <span class="nt">&lt;/template&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script&gt;</span>
</span><span class='line'>      <span class="p">...</span>
</span><span class='line'>  <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Et pour l&#8217;utiliser dans une autre page :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;link</span> <span class="na">rek=</span><span class="s">&quot;component&quot;</span> <span class="na">href=</span><span class="s">&quot;megabutton.html&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>...
</span><span class='line'><span class="nt">&lt;megabutton&gt;</span>Clique ici<span class="nt">&lt;/megabutton&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ces éléments ont également un cycle de vie sur lequel il est possible d&#8217;intéragir grâce à des fonctions JavaScript : <code>created</code>, <code>attributeChanged</code>, <code>inserted</code> ou <code>removed</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">lifecycle</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">inserted</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">removed</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
</span><span class='line'><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Mutation Observer</h3>

<p>Ces éléments sont utilisés pour détecter des modifications dans le code JavaScript.</p>

<h3>Object.observe()</h3>

<p>Il s&#8217;agit ici du monitoring des modifications des objects JS, bien plus performante que tout autre solution existante aujourd&#8217;hui.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">observeChanges</span><span class="p">(</span><span class="nx">changes</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">changes</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">change</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">change</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>                  <span class="c1">// Name</span>
</span><span class='line'>      <span class="nx">change</span><span class="p">.</span><span class="nx">type</span><span class="p">;</span>                  <span class="c1">// Type</span>
</span><span class='line'>      <span class="nx">change</span><span class="p">.</span><span class="nx">oldValue</span><span class="p">;</span>          <span class="c1">// Ancienne valeur</span>
</span><span class='line'>      <span class="nx">change</span><span class="p">.</span><span class="nx">object</span><span class="p">[</span><span class="nx">change</span><span class="p">.</span><span class="nx">name</span><span class="p">];</span> <span class="c1">// Nouvelle valeur</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ainsi, entre le <em>Dirty checking</em> et le <em>Object.observe()</em>, le gain de performances peut être de l&#8217;ordre de 20 fois !</p>

<h3>Etat actuel</h3>

<p>AngularJS apporte sa philosophie, déclaratif plutôt qu&#8217;impératif.
Les directives d&#8217;Angular sont un peu les customs éléments.</p>

<p>Le projet &#8221;<a href="http://www.polymer-project.org/polymer.html">polymer.js</a>&#8221; vise à intégrer ces nouveautés dans les navigateurs.</p>

<p>Il existe aussi le projet Polymer.Dart pour le langage Dart.</p>

<p>Le site &#8221;<a href="http://jonrimmer.github.io/are-we-componentized-yet/">Are we componentized yet?</a>&#8221;, montre l&#8217;état actuel de l&#8217;implémentation dans Chrome.
Du côté de Firefox, il existe des projets similaires Brick, X-Tag&#8230;</p>

<h3>Mon avis</h3>

<p>Une excellente session où j&#8217;ai appris pas mal de choses que je ne connaissais pas !</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_web_dev/2013/10/24/5-Du_Javascript_propre_Challenge_Accepted.html">Du JavaScript propre ? Challenge Accepted!</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/romain-linsolas.html">Romain Linsolas</a> (<a href="https://twitter.com/romaintaz">@romaintaz</a>) et <a href="http://soft-shake.ch/2013/program/authors/2013/10/25/julien-jakubowski.html">Julien Jakubowski</a> (<a href="https://twitter.com/jak78">@jak78</a>)</p>

<p><img src="http://linsolas.github.com/images/note-5.png" title="5/5" alt="5/5" /></p>

<p>Présentation tout simplement parfaite, sur un sujet somptueux. Du grand art !
Comment ça, je ne suis pas objectif ?</p>

<p>Bon, si vous voulez en savoir plus, revenez un peu en arrière sur mon blog, j&#8217;ai déjà parlé de cette présentation faite avec Julien à Devoxx.
Elle a encore plu, ça nous a fait très plaisir !</p>

<h2><a href="http://soft-shake.ch/2013/program/sessions/13_bigdata/2013/10/24/07-make-sense-of-your-big-data.html">Make sense of your (Big) Data</a></h2>

<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/david-pilato.html">David Pilato</a> (<a href="https://twitter.com/dadoonet">@dadoonet</a>)</p>

<p><img src="http://linsolas.github.com/images/note-4.png" title="4/5" alt="4/5" /></p>

<p>David Pilato est &#8220;évangeliste&#8221; (à ne pas confondre avec Eve Angeli !) pour <a href="http://www.elasticsearch.org/">ElasticSearch</a>, un outil très puissant et très sympathique pour faire de la recherche.
Associé avec <a href="http://www.elasticsearch.org/overview/kibana/">Kibana</a>, David nous montre comment il est possible pratiquement en temps réel de construire un dashboard très complet sur un grand jeu de données - stockées dans des noeuds ElasticSearch. Autrement dit, <em>comment donner du sens à ses données</em>.</p>

<p>J&#8217;essaierais de faire un billet dédié, je trouve que cette session est très intéressante car la solution mise en place est fichtrement simple pour un résultat franchement étonnant !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Et quatre à la suite]]></title>
    <link href="http://linsolas.github.com/blog/2013/10/23/et-quatre-a-la-suite/"/>
    <updated>2013-10-23T19:05:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2013/10/23/et-quatre-a-la-suite</id>
    <content type="html"><![CDATA[<p>Quatre à la suite ? Ai-je participé à Questions pour un Champion ? Non !</p>

<p>Bon, je n&#8217;ai pas blogué à ce sujet, mais j&#8217;aurais la chance dans trois semaines, d&#8217;assister à mon quatrième Devoxx. Et pour ne pas changer les bonnes habitudes, je me retrouve une nouvelle fois orateur !</p>

<p>Le sujet, c&#8217;est &#8221;<em>The perfect ingredients for a JavaScript Software Factory</em>&#8221;. Oui, encore du JavaScript dans une conférence pourtant orientée Java. Cela prouve bien notre ouverture d&#8217;esprit, à nous autres Javaïstes !</p>

<p>Bref, de quoi ça va parler ? En gros, de tout ce qu&#8217;il faut pour &#8220;industrialiser&#8221; son développement JavaScript. Un développeur Java dispose déjà de toute une panoplie d&#8217;outils et de pratiques pour développer correctement ses applications. Mais qu&#8217;en est-il pour un développeur JavaScript ? L&#8217;écosystème est-il désert ou au contraire fourmille-t-il de petites perles ?</p>

<p>Hélas, il s&#8217;agit d&#8217;un <strong>Quickie</strong>, ce qui veut dire que je n&#8217;aurais que 15 minutes pour aborder ce sujet tellement vaste. Je serais donc amené à surtout éfleurer ce sujet, mais cela me semble une bonne approche pour un développeur qui souhaite s&#8217;intéresser vraiment à faire du JavaScript propre !</p>

<p>Bref, si vous êtes à Anvers la semaine du 11 novembre, n&#8217;hésitez pas à venir jeter un oeil à ma présentation&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Oyez oyez amis suisses]]></title>
    <link href="http://linsolas.github.com/blog/2013/08/19/oyez-oyez-amis-suisses/"/>
    <updated>2013-08-19T21:46:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2013/08/19/oyez-oyez-amis-suisses</id>
    <content type="html"><![CDATA[<p><a href="http://soft-shake.ch/2013/program/authors/2013/10/24/romain-linsolas.html"><img src="http://linsolas.github.com/images/soft-shake-2013.png" title="Soft Shake 2013" alt="Soft Shake 2013" /></a></p>

<p>Super nouvelle, la présentation &#8221;<a href="http://soft-shake.ch/2013/program/sessions/13_web_dev/2013/10/24/5-Du_Javascript_propre_Challenge_Accepted.html">Du Javascript propre? Challenge Accepted!</a>&#8221; a été retenue pour la conférence <a href="http://soft-shake.ch/2013/fr/">Soft Shake 2013</a> à Genève en Suisse, du 23 au 24 octobre.
La présentation sera sensiblement la même que celle faite à Devoxx avec <a href="http://soft-shake.ch/2013/program/authors/2013/10/25/julien-jakubowski.html">Julien Jakubowski</a>, mais on essaiera de mettre à jour certaines parties.</p>

<p>Si vous venez à la conférence, venez nous voir !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Scrum Day 2013]]></title>
    <link href="http://linsolas.github.com/blog/2013/04/15/scrum-day-2013/"/>
    <updated>2013-04-15T22:10:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2013/04/15/scrum-day-2013</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/Scrum-Day-2013.png" title="Scrum Day 2013" alt="Scrum Day 2013" /></p>

<p>Le jeudi 11 avril s&#8217;est tenue la troisième édition du <a href="http://www.scrumday.fr/">Scrum Day</a>, un événement organisé par le <a href="http://www.frenchsug.org/">French Scrum User Group</a> (ou <em>FSUG</em>) autour de l&#8217;agilité.</p>

<p>Avant d&#8217;aborder mon compte rendu, je tiens à remercier chaudement la société <a href="http://www.zenika.com/">Zenika</a> qui m&#8217;a permis d&#8217;assister à cette conférence. En tant que sponsor de l&#8217;événement, elle a proposé de gagner une place avec un peu jeu concours sur Twitter. Et c&#8217;est moi qui ai gagné \o/ Donc <strong>merci</strong> à eux.</p>

<p>Pour nous accueillir, Xavier Warzee débute avec <a href="http://agenda2013.scrumday.fr/event/94">un discours d&#8217;ouverture</a> où il rappelle ce qu&#8217;est le FSUG, ses activités, son bilan. Il fait également venir les sponsors sur scène, pour une courte présentation. Puis il laisse la main à Robert Richman&#8230;</p>

<!-- more -->


<p><img src="http://linsolas.github.com/images/ScrumDay2013-Xavier.JPG" title="Xavier sur scène" alt="Xavier sur scène" /></p>

<h2><a href="http://agenda2013.scrumday.fr/event/95">Keynote &#8220;Culture Hacking&#8221;</a></h2>

<p>La journée commence vraiment avec la keynote de <a href="http://agenda2013.scrumday.fr/speakers/201">Robert Richman</a>. Il travaille dans le département <a href="http://www.zapposinsights.com/">Zappos Insights</a> de la société <a href="http://www.zappos.com/">Zappos</a>, l&#8217;un des leaders de la vente de chaussures sur Internet (eh oui), aujourd&#8217;hui rachetée par Amazon.</p>

<p>Il se définit comme un <em>Culture Hacker</em>, il est également l&#8217;auteur du livre <a href="http://www.cultureblueprint.com/">Culture Blueprint</a>. Il nous incite ainsi à comprendre comment fonctionne une culture d&#8217;entreprise, de groupe, etc. Il débute en nous racontant une petite histoire à propos du <a href="http://www.burningman.com">Burning Man</a>. Il s&#8217;agit d&#8217;un rassemblement culturel et artistique qui a lieu chaque année dans le désert du Nevada, où se cotoient plusieurs dizaines de milliers de personnes. Cette rencontre pourrait s&#8217;apparenter à un chaos total, pourtant les gens s&#8217;y retrouvent avec bonne humeur, et une harmonie certaine. Le succès tient entre autres à un <a href="http://www.burningman.com/whatisburningman/about_burningman/principles.html">ensemble de règles régissant la communauté</a> :</p>

<ul>
<li><strong>Inclusion radicale</strong> : tout le monde est le bienvenu.</li>
<li><strong>Pratique du don</strong> : pas d&#8217;argent, tout se fait par des cadeaux, des prestations, des dons.</li>
<li><strong>Décommercialisation</strong> : pas de publicité, pratiquement aucune transaction financière.</li>
<li><strong>Auto-suffisance médicale</strong>.</li>
<li><strong>Expression de soi radicale</strong>, poussant ainsi les participants à s&#8217;exprimer sous des formes variées, en particulier à travers des oeuvres artistiques.</li>
<li><strong>Effort en commun</strong>, où l&#8217;on favorise le travail d&#8217;équipe.</li>
<li><strong>Responsabilité civique</strong>.</li>
<li><strong>Pas de trace</strong> : malgré le grand nombre de participants et des manifestations, l&#8217;endroit doit être rendu tel qu&#8217;à l&#8217;origine. Le respect de l&#8217;environnement est omniprésent.</li>
<li><strong>Participation</strong>.</li>
<li><strong>Culture du moment présent</strong>.</li>
</ul>


<p>Robert Richman parle également de l&#8217;ouvrage &#8221;<a href="http://www.amazon.fr/Tribal-Leadership-Leveraging-Thriving-Organization/dp/0061251321/ref=sr_1_1?ie=UTF8&amp;qid=1365426131&amp;sr=8-1&amp;keywords=Tribal+Leadership">Tribal leadership</a>&#8221;, de Dave Logan, où il est montré l&#8217;importance d&#8217;avoir une liste de règles pour qu&#8217;une communauté - ou une tribu - puisse fonctionner. Il nous montre qu&#8217;à Zappos, où il travaille, il est également établi <a href="http://about.zappos.com/our-unique-culture/zappos-core-values">une liste de règles</a>, définissant les valeurs communes de leur &#8220;famille&#8221; :</p>

<ul>
<li><em>Deliver WOW Through Service</em></li>
<li><em>Embrace and Drive Change</em></li>
<li><em>Create Fun and A Little Weirdness</em></li>
<li><em>Be Adventurous, Creative, and Open-Minded</em></li>
<li><em>Pursue Growth and Learning</em></li>
<li><em>Build Open and Honest Relationships With Communication</em></li>
<li><em>Build a Positive Team and Family Spirit</em></li>
<li><em>Do More With Less</em></li>
<li><em>Be Passionate and Determined</em></li>
<li><em>Be Humble</em></li>
</ul>


<p><img src="http://linsolas.github.com/images/ScrumDay2013-Zappos.JPG" title="L'ambiance à Zappos" alt="L'ambiance à Zappos" /> <br> <small>L&#8217;ambiance à Zappos transparait dans l&#8217;excentricité des open spaces</small></p>

<p>Robert Richman nous pose une question. Ne pourrait-on pas considérer qu&#8217;une culture est aussi un <strong>produit</strong> ? C&#8217;est un peu pour cela qu&#8217;à Zappos, ils créent des événements pour &#8220;promouvoir&#8221; leur propre culture. Il ajoute quelque chose qui est tout à fait vrai : parfois, lors de ce genre d&#8217;événement, on est satisfait par l&#8217;information que l&#8217;on en tire, mais c&#8217;est avant tout l&#8217;<strong>expérience</strong> que l&#8217;on vit qui est fantastique (<em>Information is OK, but experience is amazing</em>). Quand il a dit ça, j&#8217;ai tout de suite pensé à ma propre expérience à <a href="http://www.devoxx.com">Devoxx</a> : j&#8217;en tire beaucoup d&#8217;informations intéressantes, mais c&#8217;est vraiment l&#8217;expérience de la conférence elle-même qui reste un souvenir fantastique.</p>

<p>Robert Richman nous fait maintenant une petite liste de <em>Culture Hacks</em> :</p>

<ul>
<li><em>How to walk into a room can shift a culture</em>. Lorsque l&#8217;on entre dans une pièce, il faut montrer son assurance, son énergie de façon à pouvoir faire la différence, créer une synergie.</li>
<li><em>Destroy something</em>. Détruire est tellement plus puissant que créer, et cela apporte de l&#8217;énergie. Il faut détruire quelque chose d&#8217;inutile ou qui ne marche pas.</li>
<li><em>Frustration is gold</em>. La frustration n&#8217;est jamais que de l&#8217;énergie bloquée.</li>
<li><em>Use ritual for energy</em>. Robert Richman nous explique que des petits rituels peuvent créer de l&#8217;énergie au sein d&#8217;une équipe. Il nous explique qu&#8217;à Zappos chaque jeudi à 15h, tout le monde arrête de travailler pendant 10 minutes&#8230; pour danser ! C&#8217;est la <em>3PM Thursday Dance Party</em>.</li>
</ul>


<p>Pour finir, il nous rappelle que Scrum lui-même a ses propres valeurs :</p>

<ul>
<li><strong>Focus</strong></li>
<li><strong>Engagement</strong></li>
<li><strong>Respect</strong></li>
<li><strong>Courage</strong></li>
<li><strong>Ouverture</strong></li>
</ul>


<p>J&#8217;ai adoté cette keynote pour son côté énergique et rafraichissant. De façon générale, les orateurs américains ont un vrai sens du show, et ce n&#8217;est pas Robert Richman qui me fera penser le contraire. J&#8217;ai aussi beaucoup aimé la façon dont il a pu nous transmettre l&#8217;ambiance qui règne chez Zappos.</p>

<hr>


<h2><a href="http://agenda2013.scrumday.fr/event/57">Introduction au leadership tribal</a></h2>

<p><a href="http://agenda2013.scrumday.fr/speakers/65">Florent Lothon</a> est coach agile pour CSC (<a href="http://www.agiliste.fr/">site agiliste.fr</a>). Il nous parle du <em>Leadership Tribal</em>, <a href="http://www.amazon.fr/Tribal-Leadership-Leveraging-Thriving-Organization/dp/0061251321/ref=sr_1_1?ie=UTF8&amp;qid=1365426131&amp;sr=8-1&amp;keywords=Tribal+Leadership">tiré d&#8217;un livre éponyme</a>. Cela fait une bonne transition avec la keynote précédente.</p>

<p><img src="http://linsolas.github.com/images/Tribal-Leadership.jpg" title="Leadership Tribal" alt="Leadership Tribal" /></p>

<p>A l&#8217;origine, il y a une étude, menée pendant 10 ans sur un panel d&#8217;environ 24,000 personnes. Cette étude s&#8217;est concentrée uniquement sur deux aspects : le <strong>langage</strong> et le <strong>comportement</strong> des personnes étudiées, considérant que les mots que l&#8217;on utilise influencent directement notre comportement. Cette étude a permis d&#8217;établir <strong>cinq</strong> stades, et donc cinq discours associés, au sein d&#8217;une <strong>tribu</strong>. Mais avant d&#8217;aller plus loin, il est nécessaire de définir ce qu&#8217;est une tribu.</p>

<blockquote><p>Une tribu est un groupe, une organisation de 20 à 150 personnes qui se connaissent suffisament pour se saluer quand elles se croisent.
Une petite entreprise est une tribu, tandis qu&#8217;une société de taille plus importante est une tribu de tribus.</p></blockquote>

<h3>Les cinq stades</h3>

<ol>
<li><strong>La vie est nulle</strong> (~ 2%). Ces persones vont avoir un comportement de <em>sabotage</em> et un type de relation d&#8217;<em>exclusion</em>.</li>
<li><strong>Ma vie est nulle</strong> (25%). Ces personnes, plutôt <em>isolées</em> se posent en <em>victimes passives</em>. Florent cite la bande dessinée <a href="http://www.dilbert.com">Dilbert</a> comme exemple.</li>
<li><strong>Je suis génial</strong> (sous entendu &#8220;pas les autres&#8221;) (49%). À ce stade, on rencontre plutôt des <em>guerriers solitaires</em> ayant une tendance à la <em>domination personnelle</em>.</li>
<li><strong>Nous sommes géniaux</strong> (mais &#8220;pas les autres&#8221;) (22%). À ce stade déjà très élevé, les membres ont une <em>fierté tribale</em>, et établissent des <em>partenariats stables</em>.</li>
<li><strong>La vie est géniale</strong> (&lt; 2%). Le comportement de ces personnes est un <em>émerveillement innoncent</em>, et forme une véritable <em>équipe</em>. À un tel niveau, l&#8217;énergie de la tribu rayonne au delà de leur cercle, et &#8220;contamine&#8221; les personnes alentours. Florent nous cite l&#8217;histoire de <a href="http://www.wherethehellismatt.com/">Matt</a>, un anonyme qui a filmé ses scènes de danse au quatre coins du monde. Florent rebondit aussi sur la keynote précédente en citant Zappos comme exemple de société de niveau #5.</li>
</ol>


<h3>Les leviers d&#8217;évolution</h3>

<p>Au delà de ce constat, la question que tout le monde se pose est de savoir comment on peut passer d&#8217;un niveau à l&#8217;autre ? Une chose importante est de savoir qu&#8217;il ne faut pas sauter des étapes. On ne pourra pas passer du stade #1 au stade #3 sans passer par le deuxième stade, car chaque stade se base sur les acquis du précédent.</p>

<ol>
<li><strong>Du Stade #1 au stade #2</strong>. Les principaux leviers à ce stade sont les suivants :</li>
<li>Il faut aller là où est l&#8217;action : participer à des réunions, des conférences, ou simplement aller déjeuner avec les gens.</li>
<li>Se convaincre que la vie peut fonctionner, même pour soi.</li>
<li>Se couper des autres personnes qui stagnent à ce stade #1.</li>
<li><strong>Du Stade #2 au stade #3</strong>, les leviers sont :</li>
<li>La création des relations dyadiques (2 personnes).</li>
<li>Souligner les compétences et les forces des personnes.</li>
<li>Proposer des projets à court terme avec une forte probabilité de succès, et qui nécessite peu de suivi.</li>
<li><strong>Du Stade #3 au stade #4</strong>. À ce niveau-là, les personnes ont appris à se faire confiance, mais ils ont tendance à vouloir conserver un certain nombre d&#8217;informations pour eux, pour garder une sorte de <strong>pouvoir</strong>. On pourra tenter de les élever au stade supérieur ainsi :</li>
<li>Encourager des relations triadiques (3 personnes), et dont le succès nécessite un partenariat fort.</li>
<li>Faire comprendre que le vrai pouvoir n&#8217;est pas dans les connaissances, mais dans les <strong>réseaux</strong>.</li>
<li>Forcer la transparence grâce à une communication à outrance, plutôt que de n&#8217;y avoir recours qu&#8217;au besoin, en se limitant au strict nécessaire.</li>
<li><strong>Du Stade #4 au stade #5</strong>. Au stade #4, le niveau est déjà élevé. Pour atteindre le nirvana, le stade #5, des leviers ne suffisent plus, il faut mettre en place une <strong>stratégie</strong>. Celle-ci doit résulter de la tribu dans son ensemble, selon le contexte, et non seulement d&#8217;une personne, d&#8217;un leader. La stratégie est celle-ci :</li>
<li>Définir les <strong>valeurs fondamentales</strong> de la tribu. Ce sera la moteur de la stratégie.</li>
<li>Les <strong>résultats</strong> : que voulons-nous atteindre ?</li>
<li>Les <strong>actifs</strong> : qu&#8217;avons-nous ?</li>
<li>Les <strong>actions</strong> : qu&#8217;allons nous faire ?</li>
</ol>


<p><img src="http://linsolas.github.com/images/strategie-leadership-tribal.png" title="La stratégie pour atteindre le niveau 5" alt="La stratégie pour atteindre le niveau 5" /> <br> <small>Image de Florent Lothon, http://www.agiliste.fr</small></p>

<p>Florent termine la présentation par une citation tirée du livre de Dave Logan :</p>

<blockquote><p>Alors que les leaders tribaux travaillent pour le bien du groupe, non pas pour eux même, ils sont récompensés par la loyauté, le travail acharné, l’innovation et la collaboration. La tribu produit un travail de la plus grande qualité en moins de temps. [&#8230;] L’avenir de l’entreprise est le stade 5.</p></blockquote>

<p>Juste avant de nous laisser, il nous parle du <a href="http://www.culturesync.net/21days/">21 days challenge</a>, une sorte de challenge à réaliser en 3 semaines. L&#8217;idée est de regarder une petite vidéo chaque matin, qui va nous lancer une sorte de défi dont le but final est de faire de nous un meilleur leader. Il cite un exemple de défi : aller voir 3 personnes dans son entourage professionnel, et demander ce qu&#8217;ils pensent de nous, de notre réputation.</p>

<p>A lire, <a href="http://www.agiliste.fr/items/introduction-au-leadership-tribal/">le billet sur son blog retraçant cette présentation</a> et sa <a href="http://prezi.com/0sz0zvudacdg/introduction-au-leadership-tribal/">présentation sous Prezi</a></p>

<hr>


<h2><a href="http://agenda2013.scrumday.fr/event/51">Transition agile dans une grande banque européenne à l&#8217;aide des Innovation Games</a></h2>

<p><a href="http://agenda2013.scrumday.fr/speakers/58">Catherine Boudlal</a> et <a href="http://agenda2013.scrumday.fr/speakers/57">Xavier Warzee</a> de Palo-IT nous raconte comment ils ont mis en place l&#8217;agilité d&#8217;une grande banque (non, ce n&#8217;est pas la mienne ;o)) grâce aux <strong>Innovation Games</strong>. La situation est simple lorsqu&#8217;ils arrivent chez le client : l&#8217;agilité est totalement absente, mais ils veulent la mettre en place afin de pallier à leurs problèmes récurrents sur les développements, les mises en production, etc. Hélas, cela doit se faire en peu de temps (quelques semaines tout au plus). Xavier et Catherine décident donc d&#8217;opter pour les Innovation Games afin d&#8217;engager le processus de transformation agile. Les étapes sont les suivantes :</p>

<ul>
<li>Collecter des informations sur la situation actuelle, sur les blocages.</li>
<li>Démarrer la transformation agile.</li>
<li>Faire émerger de nouvelles organisations agiles.</li>
</ul>


<p><img src="http://linsolas.github.com/images/ScrumDay2013-Xavier_Catherine.JPG" title="Xavier et Catherine sur scène" alt="Xavier et Catherine sur scène" /></p>

<p>Les jeux (qui sont appelés &#8220;ateliers&#8221; auprès du management, ça passe mieux !), sont les suivants :</p>

<ul>
<li><a href="http://innovationgames.com/swot-analysis-game/">SWOT</a>. Le principe de SWOT est l&#8217;identification des forces, des faiblesses, des opportunités et des risques. Ils ont ainsi pu collecter des informations sur les pratiques, identifier les problèmes et processus des développements. De ces informations sortent des recommandations, telles que la mise en place de l&#8217;intégration continue et d&#8217;autres outils, de la réorganisation des équipes et des espaces de travail, la définition de KPI simples, etc.</li>
<li><a href="http://innovationgames.com/2020-vision/">20/20 vision</a>. Le but est d&#8217;apprendre à prioriser des fonctionnalités. Ainsi, on peut définir des sortes de <em>lois</em>, qui établiront un chemin commun vers l&#8217;agilité (cf http://guide.agilealliance.org/subway.html).</li>
<li><a href="http://innovationgames.com/buy-a-feature/">$100 test</a>. Grâce à ce jeu, Xavier et Catherine ont pu mettre en place la transformation agile d&#8217;<em>une</em> équipe, et améliorer le fonctionnement de cette équipe en tant qu&#8217;équipe, et non plus en fonction d&#8217;individualité ou de coeur de métier.</li>
<li><a href="http://www.gogamestorm.com/?p=636">Graphic Gameplan</a>. Ici, l&#8217;intérêt est de trouver les blocages, et de définir les étapes qui permettent de les résoudre.</li>
</ul>


<p>Xavier et Catherine nous ont aussi parlé de la façon dont les participants ont réagi par rapport à cette approche &#8220;ludique&#8221; de l&#8217;agilité. À part une poignée d&#8217;irreductibles, il semble que la grande majorité des personnes présentes lors de ces &#8220;ateliers&#8221; a apprécié la démarche et a joué le jeu.</p>

<p>Au final, cette session était un retour intéressant, mais avec un bémol. Ils nous expliquent qu&#8217;une fois ce stade des IG terminée, ils ne sont pas restés dans la société (une autre entreprise a pris la suite). Du coup, nous n&#8217;avons pas pu savoir si cela a vraiment porté ses fruits, si l&#8217;agile a bien été adopté, et quel niveau de maturité pouvaient avoir les équipes aujourd&#8217;hui.</p>

<hr>


<h2><a href="http://agenda2013.scrumday.fr/event/46">Transformation à grande échelle, 18 mois plus tard&#8230; (SGCIB)</a></h2>

<p>J&#8217;assiste donc à un retour d&#8217;expérience sur la transformation agile à la SGCIB, société que je connais plutôt bien :) Celle-ci nous est racontée par <a href="http://agenda2013.scrumday.fr/speakers/48">Clémo Charnay</a> et <a href="http://agenda2013.scrumday.fr/speakers/49">Myriam Roux</a> de la SGCIB ainsi que de <a href="http://agenda2013.scrumday.fr/speakers/50">Céline Stauder</a>, coach agile chez Coactiv.</p>

<p>Ils nous présentent donc l&#8217;histoire de la transformation agile qu&#8217;ils ont initiée à la SGCIB pendant plus d&#8217;une année dans un service gérant environ 70 applications. Tout commence par un constat : le service informatique est en perte de contrôle du SI. Les mises en production sont sans cesse décalées, la qualité n&#8217;est pas au rendez-vous, et la complexité omniprésente. Ainsi, une demande peut faire intervenir jusqu&#8217;à 7 équipes différentes !</p>

<p>Ils commencent par mettre en place 2 <em>PoC</em> :</p>

<ul>
<li>Le premier se fait dans un contexte favorable, où le projet démarre de rien, et où il est ainsi beaucoup plus facile d&#8217;y intégrer des notions d&#8217;agilité (TDD, intégration continue, etc.). Le succès est au rendez-vous.</li>
<li>Dans la deuxième équipe, les choses sont plus compliquées, car le contexte est une application <em>legacy</em> - essentiellement de la maintenance ou du catalogue. Ici, le succès est plus mitigé, comme on pouvait s&#8217;y attendre.</li>
</ul>


<p>La mise en place de l&#8217;agilité permet de passer d&#8217;un rythme de 4 releases par an à une presque tous les mois. Toutefois, si cela peut paraitre une bonne chose, elle est aussi un défaut. En effet, cela implique une plus forte charge pour les équipes, et cela implique une certaine fatigue.</p>

<p>Les trois présentateurs soulèvent 4 points importants à prendre en considération durant une transformation agile :</p>

<ul>
<li>Il faut savoir gérer les demandes du support. Le &#8221;<em>Production first</em>&#8221; ne doit absolument pas devenir le &#8221;<em>Production only</em>&#8221;. Il faut savoir faire la part des choses.</li>
<li>Faire attention aux process de release, parfois (souvent ?) trop lours.</li>
<li>Le découpage d&#8217;un projet est souvent orienté coûts plutôt que valeurs.</li>
<li>Il faut savoir prendre du recul, et se demander pourquoi on fait certaines choses.</li>
</ul>


<p>Au final, il y a une vraie prise de conscience que l&#8217;agilité est un plus. Mais il faut savoir comment la mettre en place. L&#8217;un des avantages de l&#8217;agilité, qui pourrait être vu comme un défaut par certains, est qu&#8217;elle a tendance à mettre en lumière des problèmes.</p>

<p>Les orateurs finissent par citer quelques problèmes rencontrés lors de cette transformation :</p>

<ul>
<li>L&#8217;organisation même d&#8217;ITEC, qui impose certaines limites, en particulier au niveau des budgets.</li>
<li>Pas de reconnaissance ni de valorisation des profils agiles par les Ressources Humaines (peut être anxiogène pour certains).</li>
<li>La mise en place de beaucoup de chantiers dont beaucoup ne sont pas terminés est un processus épuisants.</li>
</ul>


<p>Voilà un retour d&#8217;expérience assez classique, rien de bien nouveau sous le soleil au final.</p>

<hr>


<h2><a href="http://agenda2013.scrumday.fr/event/47">Mon DSI veut un indicateur sur l&#8217;agilité : Cadeau ou Poison ? (REX Total)</a></h2>

<p><a href="http://agenda2013.scrumday.fr/speakers/51">Yann Poles</a> travaille pour Total, et nous raconte son expérience sur la mise en place de l&#8217;agilité chez eux. La DSI y est assez importante, puisqu&#8217;elle concerne un millier de personnes pour environ 200 projets par an.</p>

<p>En 2011, c&#8217;est le début de l&#8217;agilité chez Total, avec une vingtaine d&#8217;expériences plutôt concluantes. Toutefois, on reste dans une situation où le management laisse faire.</p>

<p>En 2012, suite à une réorganisation importante, de nouvelles ambitions sont présentées. Parmi elles, il y a ce chiffre de <strong>50% de projets agiles</strong> d&#8217;ici 2017. Très bien, mais ce chiffre, que veut-il dire ? Que mesure-t-il ? Le souci est là justement : avec un tel indicateur, il n&#8217;est pas possible d&#8217;évaluer le degré de <strong>maturité</strong> de chaque équipe, leur niveau d&#8217;efficacité, de vélocité.</p>

<p>Chez Total aussi la transformation agile pose une question importante : comment faire ? Les équipes sont perplexes, les managers, qui ne trouvent pas leur place dans l&#8217;agilité, sont bousculés.</p>

<p>Les changements apportés par l&#8217;agilité vus par l&#8217;équipe :</p>

<ul>
<li>Travailler en équipe.</li>
<li>Prendre des risques.</li>
<li>S&#8217;engager.</li>
<li>Être visible.</li>
<li>Être autonome dans la prise de décision.</li>
<li>Savoir se remettre en question.</li>
</ul>


<p>Du côté des managers :</p>

<ul>
<li>Accompagner le changement.</li>
<li>Déléguer, donner de l&#8217;autonomie.</li>
<li>Avoir une posture de <a href="http://en.wikipedia.org/wiki/Servant_leadership">Servant Leader</a>.</li>
</ul>


<p>Rendre visible cette transformation, c&#8217;est :</p>

<ul>
<li>Être plus exposé (dans ses réussites mais aussi dans ses échecs).</li>
<li>Crainte de la course au label &#8220;Agile&#8221; (que le projet ait à tout prix le tampon &#8221;<em>Ici on est agile</em>&#8221; sans forcément faire de l&#8217;agilité).</li>
<li>L&#8217;échelle n&#8217;est plus la même : on touche de plus grande équipe.</li>
</ul>


<p>Dernière question que pose Yann Poles : comment péréniser l&#8217;agilité, ancrer la transformation ?</p>

<ul>
<li>Du côté de l&#8217;individu, il faut recourir à un <strong>accompagnement</strong>, éventuellement des formations.</li>
<li>Du côté de l&#8217;équipe, il faut investir dans la communauté IT. Savoir aussi mesurer et soutenir la vélocité, la fluidité, la réactivé, le moral des équipes, la satisfaction du client.</li>
</ul>


<p>Il termine par une citation de Gandhi :</p>

<blockquote><p>Vous devez être le changement que vous voulez dans ce monde.</p></blockquote>

<p>Un dernier point, en résonance à la mesure du nombre de projets qui sont agiles chez Total. Yann, ainsi qu&#8217;une partie de l&#8217;assistance, pense qu&#8217;il serait plus pertinent de mesure non pas le nombre de <strong>projets</strong>, mais d&#8217;<strong>équipes</strong> agiles.</p>

<p>Un nouveau retour d&#8217;expérience. Je ne sais pas si c&#8217;est exactement ce que je m&#8217;attendais à avoir en venant dans cette salle, mais c&#8217;était tout de même intéressant.</p>

<hr>


<h2>L&#8217;organisation et bilan</h2>

<p>C&#8217;était ma première participation au Scrum Day (c&#8217;était la 3<sup>ème</sup> édition), et je dois dire que cela m&#8217;a plu, j&#8217;ai eu toutefois une préférence sur mes sessions du matin, en particulier de l&#8217;excellente keynote de Robert Richman. J&#8217;ai vu plusieurs retour d&#8217;expérience sur des transformations agiles au sein de grandes sociétés (dont la mienne !) et j&#8217;ai quand même un peu l&#8217;impression d&#8217;entendre toujours les mêmes discours. Tant pis.</p>

<p>Dans l&#8217;ensemble, l&#8217;organisation s&#8217;est bien déroulée, mais j&#8217;ai quand même 2 critiques à formuler. Premièrement, les locaux (merci à IBM pour les avoir fournis) n&#8217;étaient pas toujours adaptés, car certaines salles étaient trop petites pour profiter de certaines sessions, en particulier les ateliers. J&#8217;ai ainsi dû passer mon tour pour la session <a href="http://agenda2013.scrumday.fr/event/84">L&#8217;agilité selon Starcraft 2</a> à 12h45. L&#8217;autre reproche c&#8217;est peut-être un manque d&#8217;accompagnement des speakers et du cadrage des sessions. Certaines ont un peu débordé, ce qui fait que le timing n&#8217;était pas toujours respecté. Cela n&#8217;enlève en rien toutefois le travail formidable des organisateurs, et de leur travail bénévole.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Faire du CasperJS en CoffeeScript sur Windows]]></title>
    <link href="http://linsolas.github.com/blog/2013/04/09/faire-du-casperjs-en-coffeescript-sur-windows/"/>
    <updated>2013-04-09T21:07:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2013/04/09/faire-du-casperjs-en-coffeescript-sur-windows</id>
    <content type="html"><![CDATA[<h1><img src="http://linsolas.github.com/images/logo_windows.png" title="Windows" alt="Windows" /> + <img src="http://linsolas.github.com/images/casperjs_mini.jpg" title="CasperJS" alt="CasperJS" /> = <img src="http://linsolas.github.com/images/icon_love.png" title="Loooove" alt="Loooove" /></h1>

<p>Je suis revenu de Devoxx France avec quelques idées en tête, dont celle de mettre du <a href="http://casperjs.org/">CasperJS</a> dans des applications (merci <a href="http://linsolas.github.io/blog/2013/03/27/devoxx-france-2013-jour-1/">Jean-Laurent et Pierre</a>). Pour faciliter les choses, ma machine tourne sur du Windows (version 7 en l&#8217;occurrence), ce qui n&#8217;est pas forcément le meilleur environnement pour ce type de chose. Mais on ne va pas se décourager si vite, hein ?</p>

<!-- more -->


<p>Commençons petit, et essayons de faire marcher un test simple en JavaScript sur CasperJS.</p>

<h2>Installation des outils</h2>

<p>La première chose à faire, c&#8217;est d&#8217;installer CasperJS sur la machine Windows. Mais avant cela, il est nécessaire de disposer d&#8217;une version assez récente de <a href="http://phantomjs.org">PhantomJS</a> (CasperJS utilise PhantomJS pour s&#8217;exécuter). Donc on <a href="http://phantomjs.org/download.html">télécharge PhantomJS</a> et on l&#8217;installe (enfin on décompresse le ZIP). Dans mon cas, il s&#8217;agit de la version <strong>1.9</strong>. Même chose ensuite, je dézippe le ZIP de CasperJS (v<strong>1.0.2</strong>), et je finis par ajouter dans mon <code>PATH</code> les chemins vers les exécutables. Voyons si ça marche bien :</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>D:\dev&gt;phantomjs -v
</span><span class='line'>1.9.0
</span><span class='line'>D:\dev&gt;casperjs --version
</span><span class='line'>1.0.2</span></code></pre></td></tr></table></div></figure>


<p>Les choses s&#8217;annoncent bien ! Exécutons un test maintenant. Prennons celui-ci, assez simple :</p>

<figure class='code'><figcaption><span>Le code en version JavaScript</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">casper</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;casper&#39;</span><span class="p">).</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">verbose</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">logLevel</span><span class="o">:</span> <span class="s1">&#39;debug&#39;</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">casper</span><span class="p">.</span><span class="nx">start</span><span class="p">(</span><span class="s1">&#39;https://mon-application:8080/login/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">echo</span><span class="p">(</span><span class="s1">&#39;Log in&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">test</span><span class="p">.</span><span class="nx">assertTitle</span><span class="p">(</span><span class="s1">&#39;Sign in&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">test</span><span class="p">.</span><span class="nx">assertNotVisible</span><span class="p">(</span><span class="s1">&#39;label#error&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">fill</span><span class="p">(</span><span class="s1">&#39;form#loginForm&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;j_username&#39;</span><span class="o">:</span> <span class="s1">&#39;romain.linsolas&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="s1">&#39;j_password&#39;</span><span class="o">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>    <span class="p">},</span> <span class="kc">false</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">click</span><span class="p">(</span><span class="s2">&quot;form#loginForm input.button&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">test</span><span class="p">.</span><span class="nx">assertVisible</span><span class="p">(</span><span class="s1">&#39;label.error&#39;</span><span class="p">);</span> <span class="c1">// Une boite d&#39;erreur doit apparaitre</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">fill</span><span class="p">(</span><span class="s1">&#39;form#loginForm&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;j_username&#39;</span><span class="o">:</span> <span class="s1">&#39;romain.linsolas&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="s1">&#39;j_password&#39;</span><span class="o">:</span> <span class="s1">&#39;abc123&#39;</span>
</span><span class='line'>    <span class="p">},</span> <span class="kc">false</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">click</span><span class="p">(</span><span class="s2">&quot;form#loginForm input.button&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">casper</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">capture</span><span class="p">(</span><span class="s1">&#39;test-screen.png&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">test</span><span class="p">.</span><span class="nx">assertTitle</span><span class="p">(</span><span class="s1">&#39;Hello World&#39;</span><span class="p">);</span> <span class="c1">// Nous sommes loggués</span>
</span><span class='line'>    <span class="c1">// Suite du test</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">casper</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">test</span><span class="p">.</span><span class="nx">renderResults</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>En gros, il se divise ainsi :</p>

<ul>
<li>J&#8217;initialise un contexte <code>casper</code> (dans mon cas, je lui demande d&#8217;être un peu pipelette, ça facilitera les choses en cas de problème).</li>
<li>Ensuite, je démarre un test où il va exécuter certaines tâches :

<ul>
<li>se connecter à une application ;</li>
<li>vérifier le titre de la page ;</li>
<li>remplir un formulaire de login sans le mot de passe ;</li>
<li>cliquer sur un lien, et vérifier qu&#8217;un message d&#8217;erreur apparait ;</li>
<li>retester en saisissant un mot de passe.</li>
</ul>
</li>
<li>Enfin, je vérifie que je suis bien connecté (le titre de la page a changé) et pour le fun, je fais une capture d&#8217;écran de la page telle qu&#8217;elle est à ce moment-là.</li>
</ul>


<p>Allez zou, il est temps de tester. Le verdict va tomber très vite, il suffit d&#8217;écrire <code>casperjs [mon fichier].js</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>D:\dev&gt;casperjs test-casper.js
</span><span class='line'>[info] [phantom] Starting...
</span><span class='line'>[info] [phantom] Running suite: 3 steps
</span><span class='line'>[debug] [phantom] opening url: https://mon-application:8080/login/, HTTP GET
</span><span class='line'>[debug] [phantom] Navigation requested: url=https://mon-application:8080/login/, type=Other, lock=true, isMainFrame=true
</span><span class='line'>[debug] [phantom] url changed to &quot;https://mon-application:8080/login/&quot;
</span><span class='line'>[debug] [phantom] Successfully injected Casper client-side utilities
</span><span class='line'>[info] [phantom] Step 2/3 https://mon-application:8080/login/ (HTTP 200)
</span><span class='line'>Log in
</span><span class='line'>PASS Page title is: &quot;Sign in&quot;
</span><span class='line'>PASS Selector is not visible
</span><span class='line'>[info] [remote] attempting to fetch form element from selector: &#39;form#loginForm&#39;
</span><span class='line'>[debug] [remote] Set &quot;j_username&quot; field value to romain.linsolas
</span><span class='line'>[debug] [remote] Set &quot;j_password&quot; field value to
</span><span class='line'>[debug] [phantom] Mouse event &#39;click&#39; on selector: form#loginForm input.button
</span><span class='line'>PASS Selector is visible
</span><span class='line'>[info] [remote] attempting to fetch form element from selector: &#39;form#loginForm&#39;
</span><span class='line'>[debug] [remote] Set &quot;j_username&quot; field value to romain.linsolas
</span><span class='line'>[debug] [remote] Set &quot;j_password&quot; field value to ******
</span><span class='line'>[debug] [phantom] Mouse event &#39;click&#39; on selector: form#loginForm input.button
</span><span class='line'>[info] [phantom] Step 2/3: done in 718ms.
</span><span class='line'>[debug] [phantom] Navigation requested: url=https://mon-application:8080/logincheck;jsessionid=808FD9D0EDD9D9C5CCAE7F11F4AE05DE, type=FormSubmitted, lock=true, isMainFrame=true
</span><span class='line'>[debug] [phantom] Navigation requested: url=https://mon-application:8080/, type=FormSubmitted, lock=true, isMainFrame=true
</span><span class='line'>[debug] [phantom] url changed to &quot;https://mon-application:8080/&quot;
</span><span class='line'>[debug] [phantom] Successfully injected Casper client-side utilities
</span><span class='line'>[info] [phantom] Step 3/3 https://mon-application:8080/ (HTTP 200)
</span><span class='line'>[debug] [phantom] Capturing page to D:/dev/test-screen.png
</span><span class='line'>[info] [phantom] Capture saved to D:/dev/.png
</span><span class='line'>PASS Page title is: &quot;Hello World&quot;
</span><span class='line'>[info] [phantom] Step 3/3: done in 1224ms.
</span><span class='line'>[info] [phantom] Done 3 steps in 1226ms
</span></code></pre></td></tr></table></div></figure>


<p>Cool, ça marche !</p>

<h2>Passons au CoffeeScript</h2>

<p><img src="http://linsolas.github.com/images/CoffeeScript.png" title="CoffeeScript" alt="CoffeeScript" /></p>

<p>Le JavaScript c&#8217;est bien, mais c&#8217;est un peu verbeux, surtout quand le code des tests va grandissant. Tentons maintenant de passer à <a href="http://coffeescript.org/">CoffeeScript</a>. CasperJS est l&#8217;ami de CoffeeScript et accepte très bien que les scripts à exécuter soient écrits avec. D&#8217;après la documentation, il est écrit qu&#8217;il suffit de lancer simplement la commande <code>casperjs [mon fichier].coffee</code>. Ca a l&#8217;air pas mal. Ecrivons tout d&#8217;abord le même code de test, mais cette fois-ci en CoffeeScript. Cela nous donne quelque chose comme ça :</p>

<figure class='code'><figcaption><span>Le code en version CoffeeScript</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">casper = </span><span class="nx">require</span><span class="p">(</span><span class="s">&#39;casper&#39;</span><span class="p">).</span><span class="nx">create</span><span class="p">(</span>
</span><span class='line'>    <span class="nv">verbose: </span><span class="kc">true</span>
</span><span class='line'>    <span class="nv">logLevel: </span><span class="s">&#39;debug&#39;</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nx">casper</span><span class="p">.</span><span class="nx">start</span> <span class="s">&#39;https://mon-application:8080/login/&#39;</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@echo</span> <span class="s">&#39;Log in&#39;</span>
</span><span class='line'>    <span class="nx">@test</span><span class="p">.</span><span class="nx">assertTitle</span> <span class="s">&#39;Sign in&#39;</span>
</span><span class='line'>    <span class="nx">@test</span><span class="p">.</span><span class="nx">assertNotVisible</span> <span class="s">&#39;label#error&#39;</span>
</span><span class='line'>    <span class="nx">@fill</span> <span class="s">&#39;form#loginForm&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="nv">j_username: </span><span class="s">&#39;romain.linsolas&#39;</span>
</span><span class='line'>        <span class="nv">j_password: </span><span class="s">&#39;&#39;</span>
</span><span class='line'>    <span class="p">},</span> <span class="kc">false</span>
</span><span class='line'>    <span class="nx">@click</span> <span class="s">&quot;form</span><span class="err">#</span><span class="s">loginForm input.button&quot;</span>
</span><span class='line'>    <span class="nx">@test</span><span class="p">.</span><span class="nx">assertVisible</span><span class="p">(</span><span class="s">&#39;label.error&#39;</span><span class="p">)</span> <span class="c1">## Error box is displayed</span>
</span><span class='line'>    <span class="nx">@fill</span> <span class="s">&#39;form#loginForm&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="nv">j_username: </span><span class="s">&#39;romain.linsolas&#39;</span>
</span><span class='line'>        <span class="nv">j_password: </span><span class="s">&#39;abc123&#39;</span>
</span><span class='line'>    <span class="p">},</span> <span class="kc">false</span>
</span><span class='line'>    <span class="nx">@click</span> <span class="s">&quot;form</span><span class="err">#</span><span class="s">loginForm input.button&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">casper</span><span class="p">.</span><span class="k">then</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@capture</span> <span class="s">&#39;test-screen.png&#39;</span>
</span><span class='line'>    <span class="nx">@test</span><span class="p">.</span><span class="nx">assertTitle</span> <span class="s">&#39;Hello World&#39;</span> <span class="c1">## Now we are logged</span>
</span><span class='line'>    <span class="c1">## Suite du test</span>
</span><span class='line'>
</span><span class='line'><span class="nx">casper</span><span class="p">.</span><span class="nx">run</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@test</span><span class="p">.</span><span class="nx">renderResults</span> <span class="kc">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>Allez, maintenant on exécute tout ça :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>D:\dev\&gt;casperjs test-casper.coffee
</span><span class='line'>[info] [phantom] Starting...
</span><span class='line'>[info] [phantom] Running suite: 3 steps
</span><span class='line'>[debug] [phantom] opening url: https://mon-application:8080/login/, HTTP GET
</span><span class='line'>[debug] [phantom] Navigation requested: url=https://mon-application:8080/login/, type=Other, lock=true, isMainFrame=true
</span><span class='line'>[debug] [phantom] url changed to &quot;https://mon-application:8080/login/&quot;
</span><span class='line'>[debug] [phantom] Successfully injected Casper client-side utilities
</span><span class='line'>[info] [phantom] Step 2/3 https://mon-application:8080/login/ (HTTP 200)
</span><span class='line'>Log in
</span><span class='line'>PASS Page title is: &quot;Sign in&quot;
</span><span class='line'>PASS Selector is not visible
</span><span class='line'>[info] [remote] attempting to fetch form element from selector: &#39;form#loginForm&#39;
</span><span class='line'>[debug] [remote] Set &quot;j_username&quot; field value to romain.linsolas
</span><span class='line'>[debug] [remote] Set &quot;j_password&quot; field value to
</span><span class='line'>[debug] [phantom] Mouse event &#39;click&#39; on selector: form#loginForm input.button
</span><span class='line'>PASS Selector is visible
</span><span class='line'>[info] [remote] attempting to fetch form element from selector: &#39;form#loginForm&#39;
</span><span class='line'>[debug] [remote] Set &quot;j_username&quot; field value to romain.linsolas
</span><span class='line'>[debug] [remote] Set &quot;j_password&quot; field value to ******
</span><span class='line'>[debug] [phantom] Mouse event &#39;click&#39; on selector: form#loginForm input.button
</span><span class='line'>[info] [phantom] Step 2/3: done in 1099ms.
</span><span class='line'>[debug] [phantom] Navigation requested: url=https://mon-application:8080/logincheck;jsessionid=0A26317CDA05D97D63D6538EE4212B07, type=FormSubmitted, lock=true, isMainFrame=true
</span><span class='line'>[debug] [phantom] Navigation requested: url=https://mon-application:8080/, type=FormSubmitted, lock=true, isMainFrame=true
</span><span class='line'>[debug] [phantom] url changed to &quot;https://mon-application:8080/&quot;
</span><span class='line'>[debug] [phantom] Successfully injected Casper client-side utilities
</span><span class='line'>[info] [phantom] Step 3/3 https://mon-application:8080/ (HTTP 200)
</span><span class='line'>PASS Page title is: &quot;Hello World&quot;
</span><span class='line'>[debug] [phantom] Mouse event &#39;click&#39; on selector: xpath selector: //*[text()=&quot;Administration&quot;]
</span><span class='line'>[debug] [phantom] Navigation requested: url=https://mon-application:8080/domain/account/index, type=LinkClicked, lock=true, isMainFrame=true
</span><span class='line'>[info] [phantom] Step 3/3: done in 1389ms.
</span><span class='line'>[debug] [phantom] url changed to &quot;https://mon-application:8080/domain/account/index&quot;
</span><span class='line'>[debug] [phantom] Successfully injected Casper client-side utilities
</span><span class='line'>[info] [phantom] Done 3 steps in 1749ms
</span></code></pre></td></tr></table></div></figure>


<p>Voilà qui est génial, CasperJS gère nativement le CoffeeScript sans avoir besoin de l&#8217;installer séparément. Mais on va quand même procéder à son installation, comme ça on disposera d&#8217;un compilateur CoffeeScript.</p>

<p>La première étape, c&#8217;est l&#8217;installation de <a href="http://nodejs.org/">NodeJS</a>. Les choses se font assez simplement, il y a un <code>.msi</code> <a href="http://nodejs.org/download/">à télécharger</a>. Il me faudra juste ajouter le chemin d&#8217;installation de NodeJS dans mon <code>PATH</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>D:\dev&gt;node -v
</span><span class='line'>v0.10.3
</span><span class='line'>D:\dev&gt;npm -v
</span><span class='line'>1.2.17
</span></code></pre></td></tr></table></div></figure>


<p>Maintenant, installons CoffeeScript grâce à la commande <code>npm install -g coffee-script</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>D:\dev\nodejs&gt;npm install -g coffee-script
</span><span class='line'>npm http GET https://registry.npmjs.org/coffee-script
</span><span class='line'>npm http GET https://registry.npmjs.org/coffee-script
</span><span class='line'>npm http GET https://registry.npmjs.org/coffee-script
</span><span class='line'>npm ERR! Error: getaddrinfo ENOTFOUND
</span><span class='line'>npm ERR!     at errnoException (dns.js:37:11)
</span><span class='line'>npm ERR!     at Object.onanswer [as oncomplete] (dns.js:124:16)
</span><span class='line'>npm ERR! If you need help, you may report this log at:
</span><span class='line'>npm ERR!     &lt;http://github.com/isaacs/npm/issues&gt;
</span><span class='line'>npm ERR! or email it to:
</span><span class='line'>npm ERR!     &lt;npm-@googlegroups.com&gt;
</span><span class='line'>npm ERR! System Windows_NT 6.1.7601
</span><span class='line'>npm ERR! command &quot;D:\\dev\\nodejs\\\\node.exe&quot; &quot;D:\\dev\\nodejs\\node_modules\\npm\\bin\\npm-cli.js&quot; &quot;install&quot; &quot;-g&quot; &quot;coffee-script&quot;
</span><span class='line'>npm ERR! cwd D:\dev\nodejs
</span><span class='line'>npm ERR! node -v v0.10.3
</span><span class='line'>npm ERR! npm -v 1.2.17
</span><span class='line'>npm ERR! syscall getaddrinfo
</span><span class='line'>npm ERR! code ENOTFOUND
</span><span class='line'>npm ERR! errno ENOTFOUND
</span><span class='line'>npm ERR!
</span><span class='line'>npm ERR! Additional logging details can be found in:
</span><span class='line'>npm ERR!     D:\dev\nodejs\npm-debug.log
</span><span class='line'>npm ERR! not ok code 0
</span></code></pre></td></tr></table></div></figure>


<p>Comme les choses ne sont pas simples chez moi, je suis derrière un proxy :) Il faut donc donner les informations de connexion à npm pour se connecter à Internet. Cela se fait dans le fichier <code>&lt;répertoire home&gt;\.npmrc</code> (par exemple <code>C:\Users\chuck.norris\.npmrc</code>). Dans ce fichier, on définit l&#8217;adresse des proxies ainsi que le registre npm :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>proxy = http://[user]:[mot de passe]@[url proxy]:[port]/
</span><span class='line'>https-proxy = http://[user]:[mot de passe]@[url proxy]:[port]/
</span><span class='line'>registry = http://registry.npmjs.org
</span></code></pre></td></tr></table></div></figure>


<p>On relance la même commande, et cette fois-ci ça marche mieux :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>D:\dev\nodejs&gt;npm install -g coffee-script
</span><span class='line'>npm http GET http://registry.npmjs.org/coffee-script
</span><span class='line'>npm http 200 http://registry.npmjs.org/coffee-script
</span><span class='line'>npm http GET http://registry.npmjs.org/coffee-script/-/coffee-script-1.6.2.tgz
</span><span class='line'>npm http 200 http://registry.npmjs.org/coffee-script/-/coffee-script-1.6.2.tgz
</span><span class='line'>C:\Users\chuck.norris\AppData\Roaming\npm\cake -&gt; C:\Users\chuck.norris\AppData\Roaming\npm\node_modules\coffee-script\bin\cake
</span><span class='line'>C:\Users\chuck.norris\AppData\Roaming\npm\coffee -&gt; C:\Users\chuck.norris\AppData\Roaming\npm\node_modules\coffee-script\bin\coffee
</span><span class='line'>coffee-script@1.6.2 C:\Users\chuck.norris\AppData\Roaming\npm\node_modules\coffee-script
</span></code></pre></td></tr></table></div></figure>


<p>Cool ! Voyons maintenant s&#8217;il est possible de lancer la commande <code>coffee</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>D:\dev&gt;coffee -v
</span><span class='line'>CoffeeScript version 1.6.2
</span></code></pre></td></tr></table></div></figure>


<p>Houra !</p>

<h2>Intégration au build</h2>

<p>Dernière étape de ce petit tutoriel : comment allons-nous faire pour exécuter automatiquement les tests CoffeeScript, pour les intégrer par exemple dans notre <em>build</em> continu sur Jenkins ? On pourrait effectivement ajouter une étape dans la configuration Jenkins qui irait lancer un script, mais ce n&#8217;est pas très propre.</p>

<p>J&#8217;ai trouvé quelques plugins Maven, mais rien de folichon. J&#8217;ai donc décidé <a href="https://github.com/linsolas/casperjs-runner-maven-plugin">d&#8217;en créer un moi-même</a>, mais il n&#8217;est pas encore stabilisé.</p>

<p>En attendant, je vais passer par un test <strong>JUnit</strong>, qui aura pour tâche de lister les <code>*.js</code> et <code>*.coffee</code> d&#8217;un répertoire donné. C&#8217;est une version très simple, elle ne gère que les cas standards (j&#8217;essaierais de faire les choses plus proprement dans mon plugin Maven). Elle ne supporte pas non plus les options de la commande <code>casperjs</code> (comme par exemple les <code>--pre</code> ou <code>--post</code>), mais c&#8217;est un premier pas et surtout, ça marche :)</p>

<figure class='code'><figcaption><span>Classe JUnit d&#8217;exécution des fichiers JavaScript et CoffeeScript</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">fr</span><span class="o">.</span><span class="na">linsolas</span><span class="o">.</span><span class="na">javascript</span><span class="o">.</span><span class="na">casperjs</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.commons.exec.CommandLine</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.commons.exec.DefaultExecutor</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.apache.commons.lang.StringUtils</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.junit.BeforeClass</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.junit.Test</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.FilenameFilter</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">fest</span><span class="o">.</span><span class="na">assertions</span><span class="o">.</span><span class="na">Assertions</span><span class="o">.</span><span class="na">assertThat</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Run CasperJS on any *.js or *.coffee files found in a specific folder.</span>
</span><span class='line'><span class="cm"> * @author Romain Linsolas</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">RunCasperJSTest</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">static</span> <span class="kt">boolean</span> <span class="n">casperFound</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">CASPER_JS</span> <span class="o">=</span> <span class="s">&quot;casperjs.bat %s&quot;</span><span class="o">;</span>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">TESTS_DIR</span> <span class="o">=</span> <span class="s">&quot;D:\\dev\\mon-application\\src\\test\\javascript\\casperjs&quot;</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@BeforeClass</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">checkEnvironment</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="c1">// Vérification que l&#39;on a bien CasperJS installé.</span>
</span><span class='line'>        <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="n">execute</span><span class="o">(</span><span class="n">CASPER_JS</span><span class="o">,</span> <span class="s">&quot;--version&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">assertThat</span><span class="o">(</span><span class="n">res</span><span class="o">).</span><span class="na">isNotEqualTo</span><span class="o">(-</span><span class="mi">1</span><span class="o">);</span>
</span><span class='line'>        <span class="n">casperFound</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Test</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">runJavaScriptTests</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">File</span><span class="o">[]</span> <span class="n">files</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">TESTS_DIR</span><span class="o">).</span><span class="na">listFiles</span><span class="o">(</span><span class="k">new</span> <span class="n">FilenameFilter</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>            <span class="nd">@Override</span>
</span><span class='line'>            <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">accept</span><span class="o">(</span><span class="n">File</span> <span class="n">dir</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="n">StringUtils</span><span class="o">.</span><span class="na">endsWithIgnoreCase</span><span class="o">(</span><span class="n">name</span><span class="o">,</span> <span class="s">&quot;.js&quot;</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>        <span class="o">});</span>
</span><span class='line'>        <span class="n">runTests</span><span class="o">(</span><span class="n">files</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nd">@Test</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">runCoffeeScriptTests</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">File</span><span class="o">[]</span> <span class="n">files</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">TESTS_DIR</span><span class="o">).</span><span class="na">listFiles</span><span class="o">(</span><span class="k">new</span> <span class="n">FilenameFilter</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>            <span class="nd">@Override</span>
</span><span class='line'>            <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">accept</span><span class="o">(</span><span class="n">File</span> <span class="n">dir</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="n">StringUtils</span><span class="o">.</span><span class="na">endsWithIgnoreCase</span><span class="o">(</span><span class="n">name</span><span class="o">,</span> <span class="s">&quot;.coffee&quot;</span><span class="o">);</span>
</span><span class='line'>            <span class="o">}</span>
</span><span class='line'>        <span class="o">});</span>
</span><span class='line'>        <span class="n">runTests</span><span class="o">(</span><span class="n">files</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="kt">void</span> <span class="nf">runTests</span><span class="o">(</span><span class="n">File</span><span class="o">[]</span> <span class="n">files</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">assertThat</span><span class="o">(</span><span class="n">casperFound</span><span class="o">).</span><span class="na">isTrue</span><span class="o">();</span>
</span><span class='line'>        <span class="kt">int</span> <span class="n">ok</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>        <span class="kt">int</span> <span class="n">ko</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>        <span class="k">for</span> <span class="o">(</span><span class="n">File</span> <span class="n">f</span> <span class="o">:</span> <span class="n">files</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="n">execute</span><span class="o">(</span><span class="n">CASPER_JS</span><span class="o">,</span> <span class="n">f</span><span class="o">.</span><span class="na">getAbsolutePath</span><span class="o">());</span>
</span><span class='line'>            <span class="k">if</span> <span class="o">(</span><span class="n">res</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="n">ok</span><span class="o">++;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">ko</span><span class="o">++;</span> <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Results: &quot;</span> <span class="o">+</span> <span class="n">ok</span> <span class="o">+</span> <span class="s">&quot; test(s) successful, &quot;</span> <span class="o">+</span> <span class="n">ko</span> <span class="o">+</span> <span class="s">&quot; test(s) failed. Total of &quot;</span> <span class="o">+</span> <span class="o">(</span><span class="n">ok</span> <span class="o">+</span> <span class="n">ko</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot; test(s).&quot;</span><span class="o">);</span>
</span><span class='line'>        <span class="n">assertThat</span><span class="o">(</span><span class="n">ko</span><span class="o">).</span><span class="na">isEqualTo</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="kd">private</span> <span class="kd">static</span> <span class="kt">int</span> <span class="nf">execute</span><span class="o">(</span><span class="n">String</span> <span class="n">command</span><span class="o">,</span> <span class="n">Object</span><span class="o">...</span> <span class="n">arguments</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">DefaultExecutor</span> <span class="n">exec</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DefaultExecutor</span><span class="o">();</span>
</span><span class='line'>        <span class="n">CommandLine</span> <span class="n">line</span> <span class="o">=</span> <span class="n">CommandLine</span><span class="o">.</span><span class="na">parse</span><span class="o">(</span><span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="n">command</span><span class="o">,</span> <span class="n">arguments</span><span class="o">));</span>
</span><span class='line'>        <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">exec</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">line</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>




<hr>


<p><small>Logo Windows<sup>>TM</sup> par <a href="http://www.yootheme.com/">YOOTheme</a>, image de coeur par <a href="http://www.icon-king.com">David Vignoni</a></small></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Devoxx France 2013 - Du JavaScript propre ? Challenge Accepted]]></title>
    <link href="http://linsolas.github.com/blog/2013/04/03/devoxx-france-2013-du-javascript-propre-challenge-accepted/"/>
    <updated>2013-04-03T08:59:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2013/04/03/devoxx-france-2013-du-javascript-propre-challenge-accepted</id>
    <content type="html"><![CDATA[<p><img src="http://linsolas.github.com/images/affiche-conference.jpg" title="Du JavaScript propre ? Challenge Accepted!" alt="Du JavaScript propre ? Challenge Accepted!" /></p>

<p>Dernier billet sur la conférence Devoxx France 2013 (ouf !). Je vais parler de notre session, <a href="http://www.devoxx.com/display/FR13/Du+Javascript+propre+++Challenge+Accepted">Du JavaScript propre ? Challenge Accepted!</a>, présentée avec <a href="http://www.devoxx.com/display/FR13/Julien+Jakubowski">Julien Jakubowski</a> d&#8217;<a href="http://www.octo.com">OCTO</a>.</p>

<!-- more -->


<p>Alors pour la petite histoire, il faut savoir que Julien et moi ne nous connaissions pas personnellement un mois et demi avant Devoxx ! Nous avions tous les deux proposé une conférence durant le CFP (<em>Call For Paper</em>) très similaire.
De son côté, Julien avait proposé une version améliorée de sa présentation <a href="http://fr.slideshare.net/jak78/javascript-ce-nest-pas-si-sale">Le JavaScript ce n&#8217;est pas si sale</a> qu&#8217;il avait faite au <a href="http://chtijug.org/">Ch&#8217;ti JUG</a> dont il est le fondateur.
De mon côté, j&#8217;avais proposé à peu près la même chose, mais dont le but était plutôt de faire un état des lieux de l&#8217;écosystème autour de JavaScript en 2013, et montrer que celui-ci est extrêmement riche, presque à l&#8217;image de celui du monde Java.
Le comité de direction, ne sachant qui choisir, nous a demandé s&#8217;il était possible de mixer nos présentations. Ce qui fut fait. On est donc parti de la présentation de Julien, puis on l&#8217;a améliorée, suite à nos nombreuses discussions. Je pense également que le fait de la présenter à deux la rend plus vivante, plus intéressante.</p>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-salle-vide.jpg" title="Le calme avant la tempête" alt="Le calme avant la tempête" /></p>

<h2>Le contenu</h2>

<p>La session se divise en deux parties :</p>

<ul>
<li>Les problèmes courants en JavaScript.</li>
<li>Les solutions que l&#8217;on propose pour coder proprement en JavaScript.</li>
</ul>


<h3>Les problèmes</h3>

<p>Tout d&#8217;abord, nous expliquons pourquoi nous faisons cette présentation. Le constat est double :</p>

<ul>
<li>JavaScript est partout, et les sites sont de plus en plus riches en partie grâce à lui. On ne peut donc pas l&#8217;ignorer, surtout avec l&#8217;avénement du HTML5.</li>
<li>JavaScript a une mauvaise réputation. Le langage est sale, plus adapté à la bidouille sur sa page HTML que pour faire de <em>vraies</em> applications, difficulté de trouver un bon environnement de travail.</li>
</ul>


<p>Bref, il y a du boulot pour redorer le blason de JavaScript. Après une petite partie ludique, où l&#8217;on montre quelques résultats <em>étonnants</em> de JavaScript (je vous conseille fortement de regarder <a href="https://www.destroyallsoftware.com/talks/wat">cette vidéo</a>), on passe aux vrais problèmes que l&#8217;on est susceptible de rencontrer dans ses projets :</p>

<ul>
<li><strong>Pollution de l&#8217;espace de nommage</strong>. Quand on définit des fonctions dans les fichiers JavaScript sans prendre garde, il se peut qu&#8217;il y ait des collisions entre plusieurs fonctions ayant le même nom. Par exemple, si l&#8217;on définit une méthode <code>checkForm()</code> dans un fichier JS, rien ne dit que nous n&#8217;aurons pas une méthode au même nom dans un autre fichier. Dans pareille situation, JS ne considère que la dernière méthode définie, et cela peut poser des problèmes.</li>
<li><strong>Le scope global par défaut</strong>. Par défaut, les variables ont un scope global, et cela peut aussi entrainer des problèmes. Dans le code suivant, la variable <code>i</code> sera la même dans les 2 boucles, ce qui fait que nous n&#8217;applerons le <em>logger</em> que 10 fois et non 100 fois comme attendu :</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">subLoop</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">subLoop</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><strong>Tout est public par défaut</strong>. Difficile de cacher certains détails de son implémentation, le mot clé <code>private</code> n&#8217;existant pas en JS. Dans le code suivant, la variable censée être privée ne l&#8217;est pas du tout :</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">counter</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">privateValue</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">increment</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">counter</span><span class="p">.</span><span class="nx">privateValue</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">counter</span><span class="p">.</span><span class="nx">privateValue</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">counter</span><span class="p">.</span><span class="nx">increment</span><span class="p">();</span> <span class="c1">// 1</span>
</span><span class='line'><span class="nx">counter</span><span class="p">.</span><span class="nx">privateValue</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// Aie</span>
</span><span class='line'><span class="nx">counter</span><span class="p">.</span><span class="nx">increment</span><span class="p">();</span> <span class="c1">// 1</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><strong>Code non testé</strong>. Tout est dit :)</li>
</ul>


<p>Assez parlé des problèmes, voyons les solutions !</p>

<h3>Les solutions</h3>

<p>Première idée : on pourrait simplement déléguer le code JavaScript à son framework préféré (GWT, JSF, etc.) Nous ne souhaitons pas aller dans cette direction. Faisons du JavaScript ! Autre idée, pour au moins limiter les dégâts : utiliser <a href="https://code.google.com/p/dart/">Google Dart</a> ou <a href="http://coffeescript.org/">CoffeeScript</a> qui permettent une écriture plus fluide, plus sécurisée du code JavaScript.</p>

<p>D&#8217;un point de vue architectural, donc assez haut niveau, il existe aujourd&#8217;hui une tendance à ne pas négliger : les architectures MVC/MVW/MV* <strong>côté client</strong>. Autrement dit, plutôt que d&#8217;avoir un serveur qui va s&#8217;occuper de toute la partie fonctionnelle (couches modèle, contrôleur et vue), on va déporter tout ou partie de ceci côté client. Pour se faire, on se fera aider de solutions telles que <a href="http://backbonejs.org/">Backbone.js</a>, <a href="http://emberjs.com/">Ember</a> ou le très à la mode <a href="http://angularjs.org/">AngularJS</a>. Ce type d&#8217;architecture offre d&#8217;autres avantages : comme le code est exécuté côté client, le temps de réponse est instantané, on transfère beaucoup moins d&#8217;informations entre le client et le serveur (ce qui privilégie les réseaux mobiles), et offre plus facilement un mode déconnecté à son application. Mais ce n&#8217;est pas magique, il faudra faire attention à d&#8217;autres points, en particulier l&#8217;aspect sécurité (bah oui, tout le code est sur le client, donc il lui est plus facile de le comprendre et de le contourner).</p>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-architecture-mvc.png" title="Et si on déplaçait le code métier du côté client ?" alt="Et si on déplaçait le code métier du côté client ?" /></p>

<p>On a cité, parmi les problèmes, le fait que tout est public par défaut. Pour le résoudre, on propose d&#8217;opter pour la modularité. Cela revient un peu à simuler une classe en Java (attention, ce n&#8217;est pas exactement ça, c&#8217;est juste pour faire comprendre l&#8217;idée), en n&#8217;exposant à l&#8217;extérieur que ce que l&#8217;on souhaite (une sorte d&#8217;interface). Le code de notre compteur devient au final quelque chose comme ça :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Notre counter sera notre objet utilisé par la suite.</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">counter</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">privateValue</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">publicMethod</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">privateValue</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">privateValue</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="c1">// On retourne un objet qui contient une méthode &quot;increment&quot;, seul élément qui sera visible de l&#39;extérieur.</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">increment</span><span class="o">:</span> <span class="nx">publicMethod</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">})();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// On passe à l&#39;utilisation du compteur :</span>
</span><span class='line'><span class="nx">counter</span><span class="p">.</span><span class="nx">increment</span><span class="p">();</span>  <span class="c1">// 1</span>
</span><span class='line'><span class="nx">counter</span><span class="p">.</span><span class="nx">privateValue</span><span class="p">;</span> <span class="c1">// undefined</span>
</span><span class='line'><span class="nx">counter</span><span class="p">.</span><span class="nx">privateValue</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// Cela ne pose pas de problème. JS va ajouter une propriété &quot;privateValue&quot; à l&#39;objet &quot;counter&quot;, mais elle sera différente du &quot;privateValue&quot; que nous utilisons dans notre implémentation. Pas de conflit du coup !</span>
</span><span class='line'><span class="nx">counter</span><span class="p">.</span><span class="nx">increment</span><span class="p">();</span>  <span class="c1">// 2</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pour accroitre encore la lisibilité et la propreté de son code, on pourra créer des sortes de packages pour nos modules :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">myapp</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">subpackage</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">counter</span><span class="o">:</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">// ...</span>
</span><span class='line'>      <span class="p">})()</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Et son utilisation :</span>
</span><span class='line'><span class="nx">myapp</span><span class="p">.</span><span class="nx">subpackage</span><span class="p">.</span><span class="nx">counter</span><span class="p">.</span><span class="nx">increment</span><span class="p">();</span> <span class="c1">// 1</span>
</span></code></pre></td></tr></table></div></figure>


<p>On aborde ensuite la question du chargement des librairies JS. Plutôt que d&#8217;avoir 15 fichiers JS chargés au chargement de la page (chargement séquentiel, qui plus est, ce qui ralentit d&#8217;autant le chargement), on va utiliser les principes de l&#8217;AMD (<em>Asynchronous Modules Definition</em>), par exemple grâce à la librairie <a href="http://requirejs.org/">require.js</a>. Cela apporte en particulier deux avantages :</p>

<ul>
<li>Chargement <strong>asynchrone</strong> et/ou en <strong>parallèle</strong>, et donc cela ne bloque pas le chargement des pages, qui se fait normalement de façon séquentielle.</li>
<li>Chargement à la <strong>demande</strong>. Certaines fonctionnalités de la page peuvent ne pas être utilisées. Alors autant ne pas charger les ressources liées. On pourra ainsi dire &#8220;quand l&#8217;utilisateur souhaite faire ceci, alors on chargera <em>à ce moment-là</em> les librairies X et Y&#8221;.</li>
<li>Définition des <strong>dépendances</strong>. Un peu comme dans le point précédent, on pourra indiquer que la librairie X dépend de Y, et donc on chargera Y avant X.</li>
</ul>


<p>Intéressons-nous au code en lui-même maintenant. Il existe des outils pour s&#8217;assurer que nous n&#8217;écrivons pas (trop) de bêtises dans notre code JavaScript, un peu comme le fait Checkstyle ou PMD en Java. Nous avons ainsi <a href="http://www.jslint.com/">JsLint</a> ou <a href="http://www.jshint.com/">JsHint</a> pour remplir cette tâche. On tâchera aussi d&#8217;écrire un code plus expressif, c&#8217;est-à-dire plus simple, plus lisible, plus concis. J&#8217;aime l&#8217;expression qui dit <em>qu&#8217;il faut écrire le code comme si la personne qui va le maintenir est un psychopathe qui connait mon adresse</em>, ça traduit bien l&#8217;intérêt d&#8217;écrire correctement son code.</p>

<p>Un vieux code tel que celui-ci :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">checkForm</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">beerName</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;beer_name&quot;</span><span class="p">).</span><span class="nx">value</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">beerName</span> <span class="o">===</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;beer_name&quot;</span><span class="p">).</span><span class="nx">className</span> <span class="o">+=</span> <span class="s2">&quot;invalid&quot;</span><span class="p">;</span>
</span><span class='line'>      <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;error_box&quot;</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="s2">&quot;block&quot;</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>pourra être <em>refactoré</em> avec <a href="http://jquery.com/">jQuery</a> de cette façon, rendant le code plus lisible, plus facile à maintenir :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#beerForm&#39;</span><span class="p">).</span><span class="nx">submit</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#beer_name&#39;</span><span class="p">).</span><span class="nx">val</span><span class="p">()</span> <span class="o">===</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#beer_name&#39;</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;invalid&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#error_box&#39;</span><span class="p">).</span><span class="nx">show</span><span class="p">();</span>
</span><span class='line'>      <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Autre chose pour simplifier l&#8217;écriture : utiliser des moteurs de <em>templating</em>, tels que <a href="http://mustache.github.com/">Mustache.js</a> ou <a href="http://handlebarsjs.com/">Handlebars.js</a>, qui permettent d&#8217;insérer des données dans du HTML de façon fluide. Ainsi, si <code>beers</code> est un tableau de bières (au format JSON), on pourra écrire ceci :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">ul</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;beers-list&quot;</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="p">{{</span><span class="err">#</span><span class="nx">beers</span><span class="p">}}</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;</span><span class="p">{{</span><span class="nx">name</span><span class="p">}}</span> <span class="o">-</span> <span class="p">{{</span><span class="nx">color</span><span class="p">}}</span> <span class="o">-</span> <span class="p">{{</span><span class="nx">alcohol</span><span class="p">}}</span><span class="o">%&lt;</span><span class="err">/li&gt;</span>
</span><span class='line'>  <span class="p">{{</span><span class="err">/beers}}</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/ul&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="nx">script</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#beers-list&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Appel du moteur de rendu de Mustache</span>
</span><span class='line'>  <span class="nx">template</span><span class="p">.</span><span class="nx">html</span><span class="p">(</span> <span class="nx">Mustache</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nx">html</span><span class="p">(),</span> <span class="nx">data</span><span class="p">)</span> <span class="p">);</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Autre sujet important, les tests. Nous n&#8217;allons pas dans le détail, mais nous expliquons qu&#8217;il existe de nombreux outils pour cela : Jasmine, QUnit, Mocha, CapserJS, PhantomJS, Karma, etc. Je vous renvoie à l&#8217;<a href="http://linsolas.github.com/blog/2013/03/27/devoxx-france-2013-jour-1/">université de Jean-Laurent de Morlhon et Pierre Gayvallet à ce sujet</a>.</p>

<p>Le message est clair : tous les outils sont là pour faire des tests, du TDD, du BDD, des tests d&#8217;intégration, etc. Bref, on n&#8217;a plus d&#8217;excuses !</p>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-batmanrobin.png" title="Faites des tests en JavaScript" alt="Faites des tests en JavaScript" /></p>

<p>Dernier point abordé : l&#8217;automatisation. On peut facilement intégrer son application JavaScript dans un serveur d&#8217;intégration continue comme Jenkins ou un outil d&#8217;analyse qualité tel que Sonar. Je vous renvoie <a href="http://www.parleys.com/#play/5148922a0364bc17fc56c7cf">à mon Tools In Action de l&#8217;année dernière pour voir tout ça en pratique</a>.
Niveau IDE, nous recommandons <a href="http://www.jetbrains.com/idea/">IntelliJ IDEA de JetBrains</a> (ou <a href="http://www.jetbrains.com/webstorm/">WebStorm</a>) qui offre un <em>vrai</em> support des langages web comme le JavaScript, le HTML ou le CSS.</p>

<h3>La présentation à Devoxx France</h3>

<p>Voilà un retour personnel sur la présentation elle-même. Déjà, on était très content avec Julien, car la salle était pleine, ce qui fait 300 personnes à nous écouter (sans compter les millions qui nous verront sur Parleys). Si si, j&#8217;avais compté les chaises pendant que la salle était vide ! :o)</p>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-salle-1.jpg" title="Y a du monde à gauche..." alt="Y a du monde à gauche" />
<img src="http://linsolas.github.com/images/devoxxfr-2013-salle-2.jpg" title="... et aussi à droite !" alt="... et aussi à droite !" /></p>

<p>On a plutôt bien géré notre temps, on a fini un peu en avance même - environ 8 minutes avant - ce qui nous a permis de prendre près d&#8217;une dizaine de questions. Les retours que j&#8217;ai eu en direct ou sur le Net semblent montrer que la présentation a été appréciée, et c&#8217;est ce qui nous rend encore plus heureux (<a href="http://blog.soat.fr/2013/04/devoxx-fr-2013-du-javascript-propre-challenge-accepted/">un exemple ici</a>).</p>

<p>Une chose toutefois, que l&#8217;on fera peut-être si notre présentation est prise sur une autre conférence. Il semblerait, d&#8217;après les questions, que certaines personnes s&#8217;attendaient à avoir un peu la <em>stack</em> idéale pour développer en JavaScript. Tout d&#8217;abord, elle n&#8217;existe pas. Choisir un framework JavaScript va dépendre de vos besoins, mais aussi de votre maitrise du langage, et du risque que vous acceptez de courrir par rapport à la pérénnité de tel ou tel outil.
Je ne conseillerais pas AngularJS ou Backbone.js sans connaitre le contexte. Partir sur une application exécutée côté clent, cela a un impact à plus ou moins long terme, et faire ce choix n&#8217;est pas anodin.</p>

<p>L&#8217;un des points sur lequel il faut faire attention, c&#8217;est l&#8217;intégration des outils entre eux. Il n&#8217;est pas toujours évident de faire fonctionner X avec Y. Aussi, peut-être proposerons-nous dans une version améliorée de la présentation deux ou trois <em>stacks</em> qui fonctionnent bien ensemble.</p>

<h3>Références</h3>

<ul>
<li>Les slides sur Slideshare <a href="http://fr.slideshare.net/linsolas/java-script-devoxxfrance2013">ici</a> ou <a href="http://fr.slideshare.net/jak78/java-script-devoxxfrance2013ppt">là</a>.</li>
<li>Les slides et bientôt la vidéo sur <a href="http://www.parleys.com/#play/515aac03e4b0c779d7881496">Parleys</a>.</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Devoxx France 2013 - Bilan]]></title>
    <link href="http://linsolas.github.com/blog/2013/04/02/devoxx-france-2013-bilan/"/>
    <updated>2013-04-02T23:23:00+02:00</updated>
    <id>http://linsolas.github.com/blog/2013/04/02/devoxx-france-2013-bilan</id>
    <content type="html"><![CDATA[<p><img src="http://www.devoxx.com/download/attachments/6816022/DevoxxFR-2012-web-400-267.png" title="Devoxx France 2013" alt="Devoxx France" /></p>

<p>L&#8217;édition française de Devoxx 2013 s&#8217;est donc achevée la semaine dernière. A nouveau, un énorme <strong>BRAVO</strong> à toute l&#8217;équipe organisatrice, aux sponsors, aux speakers, aux participants. C&#8217;était magique. Devoxx, c&#8217;est un peu le Disneyland du développeur geek. On y voit des &#8220;stars&#8221; (pas dans le mauvais sens du terme) et on s&#8217;amuse énormément.</p>

<p>Allez, un petit bilan personnel :</p>

<h3>Les plus</h3>

<ul>
<li>Les gens.</li>
<li>L&#8217;organisation, toujours au poil.</li>
<li>L&#8217;équipe des organisateurs, toujours gentils et disponibles.</li>
<li>Les rencontres, surtout voir en vrai des personnes que l&#8217;on ne connait que <em>via</em> Twitter.</li>
<li>Les présentations de qualité, plutôt variées et nombreuses.</li>
<li>Les gens.</li>
<li>Certains goodies. Personnellement, j&#8217;en ai un peu marre des t-shirts (sauf celui d&#8217;Atlassian qui est au top, et que je portais durant ma présentation) et des mugs. Certains sponsors innovent plus que d&#8217;autres en la matière : boite à Meuh d&#8217;OCTO, décapsuleurs, gants, etc.</li>
<li>Les concours, bien que je n&#8217;ai rien gagné !</li>
<li>Le site de Parleys qui diffuse toutes les sessions que l&#8217;on a dû rater parce que parfois c&#8217;était dur de choisir, ou que l&#8217;on discutait avec des personnes. En plus, le site a été refait en HTML 5 !</li>
<li>Le diner des speakers.</li>
<li>La soirée &#8221;<em>Meet &amp; greet</em>&#8221;.</li>
<li>Les gens.</li>
</ul>


<h3>Les moins</h3>

<ul>
<li>Pas assez de <em>Hands On</em> le mercredi. Comme je l&#8217;ai dit, j&#8217;aimerais beaucoup que Devoxx France 2014 se déroule en quatre jours : 2 jours d&#8217;universités et Labs avec une attention particulière pour les sessions où l&#8217;auditoire code vraiment, et 2 jours de conférences.</li>
<li>Le Marriott devient trop petit. L&#8217;année passée, avec un peu plus de 1200 personnes, on se sentait à l&#8217;étroit. Cette année, avec 1400 et quelques participants, c&#8217;était encore plus vrai. De nombreuses personnes se sont faites recaler à l&#8217;entrée des salles de conférences pleines pour des raisons de sécurité. Cela se comprend, mais c&#8217;est rageant. Le problème est de trouver un lieu ayant une capacité d&#8217;accueil d&#8217;au moins 1500 personnes à Paris pour un budget raisonnable. Difficile à mon avis !</li>
<li>La nourriture le midi. Sans être mauvaise, ce n&#8217;était quand même pas ça, et ça manquait un peu de variété. En plus, sauf erreur de ma part, il n&#8217;y avait pas de desserts le midi. A noter que cette année, contrairement à 2012, les boissons étaient toujours à disposition et ça c&#8217;est bien (petit bémol : pas de Coca light, que du Coca &#8220;normal&#8221; :o) ).</li>
<li>Toujours pas de NAO à gagner :)</li>
<li>Faute de place, les BOF sont toujours un peu tard le soir (certains finissent à 22h). Guère pratique quand on a déjà 2 jours de Devoxx dans les pates !</li>
</ul>


<p>Voilà, hormis le problème du lieu qui devient trop petit, rien de méchant. Devoxx confirme qu&#8217;il s&#8217;agit d&#8217;une superbe conférence, et encore une fois, j&#8217;étais très fier d&#8217;y assister, surtout en tant que speaker ! A l&#8217;année prochaine (et en fin d&#8217;année pour la version World à Anvers) !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Devoxx France 2013 - Jour 3]]></title>
    <link href="http://linsolas.github.com/blog/2013/03/29/devoxx-france-2013-jour-3/"/>
    <updated>2013-03-29T09:17:00+01:00</updated>
    <id>http://linsolas.github.com/blog/2013/03/29/devoxx-france-2013-jour-3</id>
    <content type="html"><![CDATA[<p><img src="http://www.devoxx.com/download/attachments/6816022/DevoxxFR-2012-web-400-267.png" title="Devoxx France 2013" alt="Devoxx France" /></p>

<p>Aie, déjà le dernier jour de la conférence Devoxx France. Que le temps passe vite ! Cette dernière journée reste toutefois très intense, en particulier parce qu&#8217;à 10h40, c&#8217;était ma présentation &#8221;<em>Du JavaScript propre ? Challenge Accepted!</em>&#8221; avec Julien Jakubowski. Je ferais un billet dédié à cette présentation.</p>

<!-- more -->


<h3><a href="http://www.devoxx.com/display/FR13/Web+Oriented+Architecture%2C+une+transmutation+des+pratiques+de+construction+des+SI">Web oriented architecture, une transmutation des pratiques de construction des SI</a></h3>

<p>J&#8217;avais raté les keynotes du jeudi, je me suis dit qu&#8217;il serait dommage d&#8217;en faire autant le vendredi. Bon, j&#8217;ai raté une partie de la première keynote, celle d&#8217;<a href="http://www.devoxx.com/display/FR13/Alexis+Moussine-pouchkine">Alexis Moussine-Pouchkine</a>, &#8221;<a href="http://www.devoxx.com/display/FR13/Normal+ou+decafeine">Normal ou décafeiné</a>&#8221;. En gros, le message de sa keynote est que l&#8217;avenir, en particulier le Cloud, peut - et doit - se faire avec Java.</p>

<p>Passons à la deuxième keynote, celle de <a href="http://www.devoxx.com/display/FR13/Habib+Guergachi">Habib Guergachi</a>, CEO de <a href="http://zenexity.com/">Zenexity</a>. Je voulais la voir car il l&#8217;avait <a href="http://www.parleys.com/#play/5148922a0364bc17fc56c738">déjà jouée l&#8217;année passée</a> sous forme de conférence, et j&#8217;avais entendu d&#8217;excellents retours. Au delà du message, c&#8217;est vraiment le bonhomme qui impressionne. Il avait une telle énergie que cela en devenait contagieux. Rien de mieux pour bien démarrer une journée intense !</p>

<p>Revenons au message lui-même. Il est un peu polémique, mais je crois qu&#8217;il n&#8217;a pas complètement tort sur un certain nombre de choses.</p>

<p>Quand il s&#8217;agit de faire un choix important, il y a deux solutions possibles. On peut opter et pousser le changement, au risque d&#8217;innover. Certes, il y a le risque de se faire virer, mais ce sera dans la gloire :) L&#8217;autre chemin, c&#8217;est la soumission, et ne pas bousculer les choses établies. On ne risque pas de se faire virer à court terme, mais peut-être que dans 2 ans, on vous reprochera de ne pas avoir sû anticiper le changement, et vous vous ferez virer dans la honte !</p>

<p>Ok, c&#8217;est une vision un peu simpliste, mais y a un soupçon de vérité là-dedans quand même.</p>

<p>Habib, au cours de sa présentation, parle de <a href="http://www.playframework.com/">Play</a>. Bien entendu, il prêche pour sa paroisse, Zenexity est l&#8217;éditeur du framework. Il s&#8217;agit d&#8217;une innovation française. Pourtant, au début c&#8217;était plutôt un défaut, que ce soit pour les français (qui ne jurent que par des produits américains) ou par les américains eux-mêmes. Utiliser une technologie française c&#8217;est un peu comme voler dans un avion congolais : ça ne rassure pas vraiment ! Pourtant, Play! a été adopté par de grands noms (surtout américains), comme LinkedIn, Typesafe, etc. Dès lors, tout le monde, y compris les français, encense le framework.</p>

<p>On ne peut pas tout comprendre, il faut savoir se concentrer sur un problème précis, un petit bout d&#8217;une architecture entière. Et si l&#8217;on se jette à l&#8217;eau, que l&#8217;on prend le problème à bras le corps, peut-être que l&#8217;on sera la personne qui a vraiment sû comprendre et aborder ce problème, et que la solution que l&#8217;on proposera deviendra la solution que tout le mondre utilisera. Mais pour cela, il faut se lancer !</p>

<p>Pour résumer, la keynote de Habib Guergachi était pleine de panache, et donne à réflechir. Rien de mieux pour continuer la journée, surtout que la présentation suivante est celle de <a href="http://www.devoxx.com/display/FR13/Julien+Jakubowski">Julien Jakubowski</a> et&#8230; <a href="http://www.devoxx.com/display/FR13/Romain+Linsolas">moi-même</a>. J&#8217;y reviendrais très vite.</p>

<hr/>


<h3><a href="http://www.devoxx.com/display/FR13/Animez+vos+pages+HTML5++un+tour+d%27horizon+complet+des+techniques+d%27animation+en+HTML5">Animez vos pages HTML5: un tour d&#8217;horizon complet des techniques d&#8217;animation en HTML5</a></h3>

<p><a href="http://www.devoxx.com/display/FR13/Martin+Gorner">Martin Gorner</a> (<a href="https://twitter.com/martingorner">@martingorner</a>) de Google nous parle d&#8217;animation en HTML5. Sa présentation est visible <a href="http://animateyourhtml5.appspot.com/pres/#1">en live sur ce site</a>.</p>

<p>En CSS 3, <code>transition</code> permet d&#8217;animer des éléments. Le navigateur va calculer lui-même toutes les étapes intermédiaires.
La propriété <code>animation</code> permet de faire des animations plus complexes, en définissant les propriétés CSS à appliquer à différentes étapes.
Le CSS 3 dispose également de transformations géométriques 2D (rotation, agrandissement, étirement, etc.).
Il y a également des transformations 3D : <code>translateZ</code>, <code>rotateY</code>, etc.
A noter qu&#8217;il faut définir soi même la perspective via une propriété CSS : <code>-webkit-perspective: 1000px;</code>.
Par défaut, la valeur par défaut est <code>-webkit-tansform-style: flat</code>. Ce n&#8217;est pas ce que l&#8217;on souhaite, il faut donc la mettre à <code>preserve-3d</code>. Attention, Internet Explorer 10 ne gère pas cette propriété (mais on peut bidouiller avec du JavaScript pour remplir cette lacune).</p>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-animation-1.jpg" title="Finalement, animer un cube en CSS, ce n'est pas si compliqué" alt="Finalement, animer un cube en CSS, ce n'est pas si compliqué" /></p>

<p>Les bonnes habitudes pour travailler en 3D :</p>

<ul>
<li>Créer un <code>div</code> qui représente la scène.</li>
<li>Créer un objet qui supportera l&#8217;animation.</li>
<li>Y affecter des images.</li>
<li>Définir les propriétés d&#8217;animation.</li>
</ul>


<p>Après avoir passé en revue l&#8217;utilisation des Canvas 2D, Martin aborde le Canvas 3D, connu aussi sous le nom de <strong>WebGL</strong>. Après quelques explications, Martin propose d&#8217;aborder la partie pratique à l&#8217;aide de la librairie <a href="https://github.com/mrdoob/three.js/">Three.js</a>, qui permet de coder dans le moteur WebGL en JavaScript : définition de la scène, création d&#8217;une &#8220;caméra&#8221;, des &#8220;lumières&#8221;. Ensuite on peut ajouter des objets (des <em>Meshs</em>). Enfin, on définit les actions.
Voici un exemple de code avec cette librairie :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">camera</span><span class="p">,</span> <span class="nx">scene</span><span class="p">,</span> <span class="nx">renderer</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">geometry</span><span class="p">,</span> <span class="nx">material</span><span class="p">,</span> <span class="nx">mesh</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">init</span><span class="p">();</span>
</span><span class='line'><span class="nx">animate</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">init</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">camera</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">PerspectiveCamera</span><span class="p">(</span> <span class="mi">75</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span> <span class="o">/</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">10000</span> <span class="p">);</span>
</span><span class='line'>    <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">scene</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">Scene</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">geometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">CubeGeometry</span><span class="p">(</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">200</span> <span class="p">);</span>
</span><span class='line'>    <span class="nx">material</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">MeshBasicMaterial</span><span class="p">(</span> <span class="p">{</span> <span class="nx">color</span><span class="o">:</span> <span class="mh">0xff0000</span><span class="p">,</span> <span class="nx">wireframe</span><span class="o">:</span> <span class="kc">true</span> <span class="p">}</span> <span class="p">);</span>
</span><span class='line'>    <span class="nx">mesh</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">Mesh</span><span class="p">(</span> <span class="nx">geometry</span><span class="p">,</span> <span class="nx">material</span> <span class="p">);</span>
</span><span class='line'>    <span class="nx">scene</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span> <span class="nx">mesh</span> <span class="p">);</span>
</span><span class='line'>    <span class="nx">renderer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">CanvasRenderer</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">renderer</span><span class="p">.</span><span class="nx">setSize</span><span class="p">(</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span> <span class="p">);</span>
</span><span class='line'>    <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span> <span class="nx">renderer</span><span class="p">.</span><span class="nx">domElement</span> <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">animate</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// note: three.js includes requestAnimationFrame shim</span>
</span><span class='line'>    <span class="nx">requestAnimationFrame</span><span class="p">(</span> <span class="nx">animate</span> <span class="p">);</span>
</span><span class='line'>    <span class="nx">mesh</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">+=</span> <span class="mf">0.01</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">mesh</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">+=</span> <span class="mf">0.02</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">renderer</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span> <span class="nx">scene</span><span class="p">,</span> <span class="nx">camera</span> <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Three.js gère également des modèles d&#8217;objets 3D (via la spécification <a href="https://collada.org">Collada</a> par exemple).</p>

<p>Un point sur les préfixes (ici <code>-webkit-*</code>) : il y a une &#8220;convention&#8221;. Tant qu&#8217;une spécification n&#8217;est pas officielle, les navigateurs utilisent des préfixes. Une fois la spécification entérinée, alors le préfixe peut disparaître. On peut sinon utiliser des outils tels que <a href="http://leaverou.github.com/prefixfree/">prefixfree.js</a> ou <a href="http://sass-lang.com/">SASS</a> qui vont s&#8217;occuper d&#8217;ajouter les préfixes pour nous.</p>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-animation-2.jpg" title="Les 4 possibilités d'animations en web" alt="Les 4 possibilités d'animations en web" /></p>

<hr/>


<h2><a href="http://www.devoxx.com/display/FR13/Peut+on+toujours+etre+developpeur+apres+40+ans">Peut on toujours être développeur après 40 ans ?</a></h2>

<p><a href="http://www.devoxx.com/display/FR13/Benjamin+Marron">Benjamin Marron</a> (<a href="https://twitter.com/bmarron">@bmarron</a>) nous explique s&#8217;il est possible</p>

<p>Être boucher à 40 ans ? Artisan à 40 ans ? La question ne se pose pas tant elle est évidente. Pourtant, pour un développeur, la question se pose.
Y a-t-il une obscolescence des développeur ? Si la personne est concernée, se forme, alors non. Mais sans ces efforts, cela risque d&#8217;arriver. Et direction chef de projet :)</p>

<p>Grâce à leur expérience, les développeurs expérimentés savent mieux filtrer les informations, choisir les outils ou les librairies.</p>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-40ans.jpg" title="Développeur à 40 ans, c'est ça ?" alt="Développeur à 40 ans, c'est ça ?" /></p>

<p>Alors la question est peut-être de savoir si nous sommes usés ?
Il ne faut pas rester dans sa zone de confort.
Les conférences comme Devoxx permettent de se gonfler à bloc, le leitmotiv c&#8217;est &#8221;<strong>soyez fiers d&#8217;être développeurs</strong>&#8221;</p>

<p>Quid du choc générationnel ? Comme travailler avec des &#8220;petits jeunes&#8221; de 20 ans ? Il faut rester humble, dire que l&#8217;on a toujours à apprendre.</p>

<p>Il y a aussi le problème de disponibilité, avec la vie de famille, les enfants, etc. Mais cela reste jouable, et le fait de ne pas être toujours 100% disponible pour son travail n&#8217;est pas un frein.</p>

<p>Le message de Benjamin Marron est que la passion doit nous faire continuer dans cette voie, et que nous avons les moyens d&#8217;y parvenir. Un sujet n&#8217;a pas été vraiment abordé, si ce n&#8217;est lors des questions du public : la reconnaissance de l&#8217;expérience par l&#8217;employeur. Il est vrai qu&#8217;en France, niveau salaire, on a tendance à stagner assez vite (disons à partir d&#8217;une dizaine d&#8217;années d&#8217;expérience), et continuer sa progression n&#8217;est pas toujours facile. Ca reste compliqué aujourd&#8217;hui, mais les choses semblent changer. Doucement en tout cas.</p>

<hr/>


<h2><a href="http://www.devoxx.com/display/FR13/Winter+is+coming">Winter is coming</a></h2>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-winter.jpg" title="Winter is coming" alt="Winter is coming" /></p>

<p>Je finis (ou presque) ma journée avec la présentation de <a href="http://www.devoxx.com/display/FR13/Didier+Girard">Didier Girard</a> et <a href="http://www.devoxx.com/display/FR13/Aurelien+Pelletier">Aurélien Pelletier</a> de <a href="http://www.sfeir.com/">SFEIR</a>. J&#8217;avoue que j&#8217;ai un peu du mal à savoir quoi tirer de cette présentation, tant le message n&#8217;était pas très clair. L&#8217;idée, du moins une partie de ce qui a été dit, c&#8217;est de savoir comment juger de la pertinence d&#8217;un framework, d&#8217;une librairie, et de savoir estimer son espérance de vie, dans un monde très concurrentiel.</p>

<p>Didier Girard décide donc d&#8217;utiliser <a href="http://www.google.com/trends/?hl=en">Google Trends</a> pour juger de la popularité d&#8217;un framework. Cet outil de Google permet de mesurer, et comparer, le nombre de fois où tel ou tel mot est <em>recherché</em> sur Google.
Plutôt que simplement comparer deux noms de technologies via le site de Google, il décide d&#8217;y ajouter le terme <em>tutorial</em>, supposant que plus on recherche de tutoriels sur une technologie, plus celle-ci intéresse les gens, et sera facile à maitriser.
Bien sûr, Didier Girard insiste sur le fait que cela doit aider à se faire une opinion, mais que cela ne saurait suffire. Pourtant, il n&#8217;ira guère plus loin dans sa démonstration, ce qui est un peu contradictoire au final. Dommage.</p>

<p>Pour résumer, on va dire que ce n&#8217;est pas forcément la présentation que j&#8217;ai préféré à Devoxx :)</p>

<hr/>


<h2><a href="http://www.devoxx.com/display/FR13/Les+Cast+Codeurs+Podcast...+putain+4+ans+deja%21">Les CastCodeurs, putain 4 ans déjà</a></h2>

<p><img src="http://linsolas.github.com/images/devoxxfr-2013-castcodeurs.jpg" title="Merci Atlassian, une fois de plus !" alt="Merci Atlassian, une fois de plus !" /></p>

<p>Ca devient une tradition, finir un Devoxx avec une session live des <a href="http://lescastcodeurs.com/">Cast Codeurs</a>. A vrai dire, je ne vois <strong>aucune</strong> raison de ne pas y assister : récapitulatif de la conférence, bonne ambiance, bonnes blagues (quoique ?) et bières offertes par Atlassian ! Rien de mieux pour terminer en beauté une magnifique conférence. Allez écouter le podcast, bientôt disponible. En attendant, il y a les podcasts de <a href="http://lescastcodeurs.com/2011/11/28/les-cast-codeurs-podcast-episode-49-devoxx-2011-les-dix-ans/">Devoxx 2011</a>, <a href="http://lescastcodeurs.com/2012/04/21/les-cast-codeurs-podcast-episode-57-en-direct-de-devoxx-france-2012/">Devoxx France 2012</a>, et enfin <a href="http://lescastcodeurs.com/2012/11/29/les-cast-codeurs-podcast-episode-68-devoxx-2012-et-les-putchettes/">Devoxx 2012</a>.</p>

<p>A l&#8217;année prochaine !</p>
]]></content>
  </entry>
  
</feed>
