<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France</title> <atom:link href="http://blog.xebia.fr/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>Agile Enterprise Java, Cloud / NoSQL, Web Oriented Architectures, Mobile</description> <lastBuildDate>Wed, 16 May 2012 09:38:29 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>2ème anniversaire de Duchess France !</title><link>http://blog.xebia.fr/2012/05/16/2eme-anniversaire-de-duchess-france/</link> <comments>http://blog.xebia.fr/2012/05/16/2eme-anniversaire-de-duchess-france/#comments</comments> <pubDate>Wed, 16 May 2012 09:37:16 +0000</pubDate> <dc:creator>Ellène Dijoux</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[JDuchess]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11508</guid> <description><![CDATA[Le 30 Mai Duchess France vous invite à fêter ses 2 ans d&#8217;existence. Comme l&#8217;année dernière l&#8217;équipe organisera un Trivial Java avec des questions autour de Java mais pas uniquement ! Vous n&#8217;avez pas pu y assister l&#8217;année dernière ? C&#8217;est le moment de vous rattraper ! Vous y étiez l&#8217;année dernière et vous avez [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/duchessfr_bandeau_anniversaire_2.png" style="margin: 1em 1em 1em 1em;" /></p><p>Le 30 Mai <a
href="http://jduchess.org/duchess-france/" rel="nofollow">Duchess France</a> vous invite à fêter ses 2 ans d&#8217;existence. Comme l&#8217;année dernière l&#8217;équipe organisera un Trivial Java avec des questions autour de Java mais pas uniquement !<br
/> Vous n&#8217;avez pas pu y assister l&#8217;année dernière ? C&#8217;est le moment de vous rattraper !<br
/> Vous y étiez l&#8217;année dernière et vous avez apprécié la soirée ? Courez vous inscrire et parlez-en autour de vous !</p><h3><a
name="2%C3%A8meanniversairedeDuchessFrance%21-Informationspratiques"></a>Informations pratiques</h3><ul><li>A quelle heure ? L&#8217;accueil débute à 19h et la soirée débutera à 19h30.</li><li>Où aura lieu la soirée ? A l&#8217;ECE : 37 quai de Grenelle dans le 15ème arrondissement.</li><li>Comment s&#8217;inscrire ? Sur <a
href="http://duchessfr-2ans.eventbrite.com/" rel="nofollow">EventBrite</a> et pour plus d&#8217;informations ça se passe <a
href="http://jduchess.org/duchess-france/blog/2eme-anniversaire/" rel="nofollow">ici</a>.</li></ul><p>L&#8217;équipe vous attend nombreuses et nombreux !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/05/16/2eme-anniversaire-de-duchess-france/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Offre promotionnelle &#8211; Formation MongoDB Administration animée par 10GEN</title><link>http://blog.xebia.fr/2012/05/16/offre-promotionnelle-formation-mongodb-administration-animee-par-10gen/</link> <comments>http://blog.xebia.fr/2012/05/16/offre-promotionnelle-formation-mongodb-administration-animee-par-10gen/#comments</comments> <pubDate>Wed, 16 May 2012 08:41:05 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[10gen]]></category> <category><![CDATA[MongoDB]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11503</guid> <description><![CDATA[Xebia Training a le plaisir de vous faire part d’une offre promotionnelle pour la formation MongoDB pour Administrateurs en partenariat avec 10Gen qui aura lieu les 12 et 13 juin dans nos locaux à Paris. Nous proposons actuellement cette formation au tarif de 1 300 euros au lieu de 1 400 jusqu’au 1er juin. Ce tarif inclut [...]]]></description> <content:encoded><![CDATA[<p><span
style="float: left"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/08/xebia-training.png" style="margin: 1em 1em 1em 1em;" /></span><br
/> <a
href="http://training.xebia.fr/" rel="nofollow">Xebia Training</a> a le plaisir de vous faire part d’une offre promotionnelle pour la <b><a
href="http://training.xebia.fr/formations-java-jee/formation-mongodb-for-administrators-animee-par-10gen/" rel="nofollow">formation MongoDB pour Administrateurs en partenariat avec 10Gen</a></b> qui aura lieu les <b>12 et 13 juin</b> dans nos locaux à Paris.<br
/> Nous proposons actuellement cette formation au tarif de 1 300 euros au lieu de 1 400 <b>jusqu’au 1er juin</b>. Ce tarif inclut également l’accès gratuit au <a
href="http://www.10gen.com/events/mongodb-paris" rel="nofollow">MongoDay qui se déroulera le 14 juin</a>.</p><p>Cette formation de 2 jours couvre tout ce dont a besoin un administrateur, un développeur et un responsable d’exploitation pour déployer et maintenir une base de donnée MongoDB en production. Au delà du déploiement et de la maintenance, les stagiaires aborderont les problématiques de performance, d’import et d’export de données ainsi que les backups. A la fin de la formation, les stagiaires auront également une compréhension du shell MongoDB, de l’API de query et des drivers tools.</p><p>Si cette formation vous intéresse, n’hésitez pas à nous contacter au 01.53.89.99.99 ou par courriel à <a
href="mailto:info@xebia-training.fr" rel="nofollow">info@xebia-training.fr</a>.</p><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/01/mongodb-10gen.png" style="margin: 1em 1em 1em 1em;" /></span></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/05/16/offre-promotionnelle-formation-mongodb-administration-animee-par-10gen/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Scrum Master Academy &#8211; Règle n°2 &#8211; Le manifeste agile n&#8217;est pas la déclaration des droits du développeur</title><link>http://blog.xebia.fr/2012/05/16/scrum-master-academy-regle-n2-le-manifeste-agile-nest-pas-la-declaration-des-droits-du-developpeur/</link> <comments>http://blog.xebia.fr/2012/05/16/scrum-master-academy-regle-n2-le-manifeste-agile-nest-pas-la-declaration-des-droits-du-developpeur/#comments</comments> <pubDate>Wed, 16 May 2012 04:49:02 +0000</pubDate> <dc:creator>Gilles Mantel</dc:creator> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Agile]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[Scrum Master Academy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11498</guid> <description><![CDATA[Voici (enfin!) la suite des règles de la Scrum Master Academy après un mois d&#8217;Avril bien occupé me concernant. Pour ceux qui n&#8217;auraient pas suivi les nouvelles du French SUG, sachez que les vidéos des sessions du Scrum Day sont maintenant en ligne. Vous pouvez donc y retrouver les règles que Jean-Laurent et moi avons présentées [...]]]></description> <content:encoded><![CDATA[<p>Voici (enfin!) la suite des règles de la <a
href="http://blog.xebia.fr/2012/04/05/scrum-master-academy/" rel="nofollow">Scrum Master Academy</a> après un mois d&#8217;Avril bien occupé me concernant. Pour ceux qui n&#8217;auraient pas suivi les nouvelles du <a
href="http://www.frenchsug.org/display/FRSUG/French+Scrum+User+Group" rel="nofollow">French SUG</a>, sachez que les vidéos des sessions du Scrum Day sont maintenant<a
href="http://www.youtube.com/user/FrenchSUG" rel="nofollow"> en ligne</a>. Vous pouvez donc y retrouver les règles que Jean-Laurent et moi avons présentées lors de notre session dont voici la vidéo.</p><div
align="center"> <iframe
type="text/html" style="width: 400px; height: 300px" src="http://www.youtube.com/embed/9y9VTw7nL3Q" frameborder="0"><br
/> </iframe></div><p>La règle n°2 sera une découverte pour beaucoup car nous n&#8217;en avons pas encore parlé en dehors des murs de Xebia. C&#8217;est une règle qui s&#8217;avère polémique à souhait et qui vient en complément de la règle n°1. Nous espérons bien qu&#8217;elle fera couler de l&#8217;encre dans les commentaires.</p><h3><a
name="ScrumMasterAcademy-R%C3%A8glen%C2%B02-Lemanifesteagilen%27estpaslad%C3%A9clarationdesdroitsdud%C3%A9veloppeur-R%C3%A8glen%C2%B02%3ALemanifesteagilen%27estpaslad%C3%A9clarationdesdroitsdud%C3%A9veloppeur"></a>Règle n°2: Le manifeste agile n&#8217;est pas la déclaration des droits du développeur</h3><p>En 2012, l&#8217;agilité en France est une réalité pour de nombreuses équipes de développement. Beaucoup d&#8217;observateurs s&#8217;accordent pour dire que la courbe d&#8217;adoption de l&#8217;agilité a franchi le point critique au delà duquel le sujet devient un courant dominant. A titre d&#8217;exemple, <a
href="http://www.frenchsug.org/download/attachments/591296/Enqu%C3%AAte_m%C3%A9thodes_agiles_2009_FrenchSUG.pdf?version=2" rel="nofollow">l&#8217;enquête nationale</a> qu&#8217;avait menée le French SUG il y a maintenant 3 ans montrait déjà l&#8217;ampleur du phénomène. Les <a
href="http://www.versionone.com/state_of_agile_development_survey/11/" rel="nofollow">enquêtes régulières</a> menées par l&#8217;éditeur de logiciel VersionOne nous éclairent également sur la profondeur de cette adoption au niveau mondial. Cette popularisation entraîne immanquablement une dilution des valeurs et des principes fondateurs parmi la masse des adoptions. Les agilistes de la première heure y voient, souvent à juste titre, une perversion du modèle. Cette dérive est souvent portée par des organisations soucieuses de ne pas se laisser déborder par le vent nouveau qui souffle sur le développement logiciel mais qui ne veulent pas vraiment changer de culture. C&#8217;est l&#8217;objet de la <a
href="http://blog.xebia.fr/2012/04/13/scrum-master-academy-regle-n1-connais-tes-valeurs-agiles/" rel="nofollow">règle n°1</a>: oublier les valeurs du manifeste conduit à une application faussée de l&#8217;agile. Autrement dit faire de l&#8217;agile ne signifie pas être agile. Cependant, les strates décisionnelles ne sauraient être les seules responsables de ces dérives. J&#8217;observe au sein de certaines équipes agiles l&#8217;émergence de comportements qui se réclament de l&#8217;agilité mais me paraissent dépasser largement le cadre du manifeste agile. Ces comportements peuvent prendre la forme de combat social &#8211; &laquo;&nbsp;J&#8217;ai le droit de ne pas faire d&#8217;heures supplémentaires&nbsp;&raquo;, ou de lutte des classes &#8211; &laquo;&nbsp;J&#8217;ai le droit de dire Non à mon client&nbsp;&raquo;, ou encore de plaidoyer pour la sauvegarde des libertés individuelles &#8211; &laquo;&nbsp;J&#8217;ai le droit de choisir mes tâches&nbsp;&raquo;. Je force volontairement le trait, mais n&#8217;appelons pas &laquo;&nbsp;agiles&nbsp;&raquo; tous les arguments qui visent à améliorer le confort et le bien-être des équipes de développement. À l&#8217;heure de son adoption massive, cela me paraît desservir le mouvement agile plus que de l&#8217;encourager.</p><p>Il faut reconnaître que le mouvement agile draine dans son sillage un écosystème riche de pratiques manageriales et organisationnelles plus humaines. Ces pratiques tirent leurs inspirations de la psychologie sociale ou de l&#8217;observation de systèmes complexes. Les experts agiles piochent allègrement dans ce vivier pour étayer le bien-fondé des principes agiles ou développer de nouvelles approches, comme par exemple: <a
href="http://www.stevedenning.com/Radical-Management/default.aspx" rel="nofollow">Radical Management</a>, <a
href="http://en.wikipedia.org/wiki/Cynefin" rel="nofollow">Cynefin Model</a>, <a
href="http://www.management30.com/" rel="nofollow">Management 3.0</a>. Certains créent même de nouveaux mouvements à part entière, comme le réseau <a
href="http://www.stoosnetwork.org/" rel="nofollow">STOOS</a>. Cette démarche, louable pour des experts, ne doit pas faire oublier la nécessaire courbe d&#8217;apprentissage pour maîtriser ces concepts. Pour un Scrum Master qui fait ses armes, je lui conseille de rester simple dans son discours et son application des techniques agiles. Si vous venez juste d&#8217;apprendre à skier, vous n&#8217;allez pas prendre une piste noire (je l&#8217;ai fait mais j&#8217;étais jeune), vous risquez de vous blesser et de mettre les autres skieurs en danger. Alors je m&#8217;adresse à toi, jeune Scrum Master, ne te laisse pas griser par les perspectives d&#8217;un lendemain qui chante grâce à l&#8217;agilité. L&#8217;agilité met les problèmes en lumière beaucoup plus vite, et les problèmes s&#8217;appellent souvent &laquo;&nbsp;course à la productivité&nbsp;&raquo;, &laquo;&nbsp;manque de budget&nbsp;&raquo;, &laquo;&nbsp;indisponibilité&nbsp;&raquo;, &laquo;&nbsp;visions divergentes&nbsp;&raquo;, &laquo;&nbsp;culture d&#8217;entreprise&nbsp;&raquo;, &laquo;&nbsp;décisions des actionnaires&nbsp;&raquo;, etc. Les réponses à tous ces problèmes sont à chercher ailleurs que dans le manifeste agile. Cette règle n°2 vise à apporter du discernement lors de l&#8217;utilisation du mot agile.</p><p>A venir: règle n°3 &#8211; Le burndown est publié tous les jours après le standup.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/05/16/scrum-master-academy-regle-n2-le-manifeste-agile-nest-pas-la-declaration-des-droits-du-developpeur/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2012/05/15/revue-de-presse-xebia-2012-20/</link> <comments>http://blog.xebia.fr/2012/05/15/revue-de-presse-xebia-2012-20/#comments</comments> <pubDate>Tue, 15 May 2012 06:36:36 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Hadoop]]></category> <category><![CDATA[Hive]]></category> <category><![CDATA[Node.js]]></category> <category><![CDATA[Vert.x]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11491</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. Le coin de la technique Vert.x 1.0, le node killer ? (par Aurélien Maury) Hive 0.9 (par Bertrand Dechoux) Le coin de la technique Vert.x 1.0, le node killer ? Vert.x est un nouveau framework applicatif inspiré par Node.js tournant sur la JVM (7 [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/05/15/revue-de-presse-xebia-2012-20/#RevuedePresseXebia-Vert.x1.0%2Clenodekiller%3F">Vert.x 1.0, le node killer ?</a> <em>(par <a
href="http://blog.xebia.fr/author/amaury/" rel="nofollow">Aurélien Maury</a>)</em></li></li><li><a
href="http://blog.xebia.fr/2012/05/15/revue-de-presse-xebia-2012-20/#RevuedePresseXebia-Hive0.9">Hive 0.9</a> <em>(par <a
href="http://blog.xebia.fr/author/bdechoux" rel="nofollow">Bertrand Dechoux</a>)</em></li></li></ul><h3><a
name="RevuedePresseXebia-Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="RevuedePresseXebia-Vert.x1.0%2Clenodekiller%3F"></a>Vert.x 1.0, le node killer ?</h4><p>Vert.x est un nouveau framework applicatif inspiré par Node.js tournant sur la JVM (7 uniquement). Vert.x expose son API en Java, et Groovy, mais également en Ruby et JavaScript (merci à <a
href="http://jruby.org/" rel="nofollow">JRuby</a> et <a
href="http://www.mozilla.org/rhino/" rel="nofollow">Rhino</a>). Les supports de Scala, Clojure et Python sont sur la roadmap. Et la version <a
href="http://vertxproject.wordpress.com/2012/05/09/vert-x-1-0-final-is-released/" rel="nofollow">1.0 vient juste de sortir</a>.</p><p>Il y a un certain nombre de composants out-of-the-box :</p><ul><li>un bus évènementiel distribué (entre les instances Vert.x qui supportent un mode cluster)</li><li>gestion des WebSockets</li><li>gestion de SockJS</li><li>un persisteur MongoDB</li></ul><p>Parmi les fonctionnalités clés :</p><ul><li>Polyglotte : Il est possible de choisir entre les langages supportés pour son application, ou de mixer selon les modules et de les faire communiquer via le bus évènementiel.</li><li>Modèle de concurrence simplifié : Vert.x permet d&#8217;écrire son code comme single-threadé, tout en exploitant au maximum les capacités de la machine.</li><li>Modèle de programmation asynchrone et librairies pour écrire de vraies applications non bloquantes.</li><li>Le bus évènementiel inter-module traverse les cotés client et serveur pour les faire communiquer de façon transparente.</li></ul><p>Les briques sous-jacentes incluent : <a
href="http://www.netty.io/" rel="nofollow">Netty</a>, <a
href="http://www.jruby.org/" rel="nofollow">JRuby</a>, <a
href="http://www.mozilla.org/rhino/" rel="nofollow">Rhino</a> et <a
href="http://www.hazelcast.com/" rel="nofollow">Hazelcast</a>. Ce projet parait très prometteur et est sponsorisé par SpringSource (donc VMWare). Tout y est, une bonne documentation, des exemples de code à la pelle et il est également possible de l&#8217;embarquer sans soucis (et comme tout framework qui se respecte, <a
href="http://vertxproject.wordpress.com/2012/05/09/vert-x-vs-node-js-simple-http-benchmarks/" rel="nofollow">les benchmarks</a>).</p><p>Prenez quelques minutes pour <a
href="http://vertx.io/" rel="nofollow">en savoir plus</a>. Il devrait faire parler de lui sous peu.</p><p>Autour du sujet : une <a
href="http://www.infoq.com/news/2012/05/vertx" rel="nofollow">interview sur InfoQ</a> et un post de blog sur le déploiement d&#8217;application <a
href="http://fbflex.wordpress.com/2012/05/02/running-vert-x-applications-on-heroku/" rel="nofollow">Vert.x sur Heroku</a>.</p><h4><a
name="RevuedePresseXebia-Hive0.9"></a>Hive 0.9</h4><p><a
href="http://hive.apache.org/" rel="nofollow">Hive</a> est un outil de requêtage inspiré de SQL pour <a
href="http://hadoop.apache.org/mapreduce/" rel="nofollow">Hadoop MapReduce</a>. Le 30 avril, <a
href="http://hive.apache.org/releases.html#News" rel="nofollow">la version 0.9</a> est sortie et Cloudera a fourni <a
href="http://www.cloudera.com/blog/2012/05/announcing-apache-hive-0-9-0/" rel="nofollow">une vue d&#8217;ensemble</a> du <a
href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310843&amp;version=12317742" rel="nofollow">changelog</a>. Coté utilisateur, Hive supporte maintenant l&#8217;opérateur between, la comparaison compatible avec NULL et quelques nouvelle fonctions dont printf() et sort_array(). Coté performance, la planification et exécution des requêtes a été améliorée pour les UNIONs, pour les jointures coté map et pour les group by multiples.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/05/15/revue-de-presse-xebia-2012-20/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Soirée Les coulisses du Cloud français &#8216;made in&#8217; OVH chez Xebia le 22 mai !</title><link>http://blog.xebia.fr/2012/05/14/soiree-les-coulisses-du-cloud-francais-made-in-ovh-chez-xebia-le-22-mai/</link> <comments>http://blog.xebia.fr/2012/05/14/soiree-les-coulisses-du-cloud-francais-made-in-ovh-chez-xebia-le-22-mai/#comments</comments> <pubDate>Mon, 14 May 2012 15:13:00 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[OVH]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11481</guid> <description><![CDATA[Un Cloud français ? Déjà en production ? Sans subventions ?  Certains avaient peut-être oublié qu&#8217;OVH est le 4e hébergeur mondial et qu&#8217;ils n&#8217;ont pas attendu un plan quinquennal parisien pour lancer leurs ingénieurs dans l&#8217;aventure du Cloud. Iaas, Paas et Saas, nous vous invitons le 22 Mai 19h15 à découvrir les coulisses du Cloud OVH. Pierre [...]]]></description> <content:encoded><![CDATA[<p>Un Cloud français ? Déjà en production ? Sans subventions ? </p><p><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/pierre-ourdouille-ovh.jpg" style="margin: 1em 1em 1em 1em; float:right;" /></p><p>Certains avaient peut-être oublié qu&#8217;OVH est le 4<sup>e</sup> hébergeur mondial et qu&#8217;ils n&#8217;ont pas attendu un plan quinquennal parisien pour lancer leurs ingénieurs dans l&#8217;aventure du Cloud.</p><p>Iaas, Paas et Saas, nous vous invitons <strong>le 22 Mai 19h15</strong> à découvrir les <strong>coulisses du Cloud OVH</strong>.</p><p><strong>Pierre Ourdouillé</strong>, staff engineer chez Ovh.com, lèvera le voile sur un des fleurons de l&#8217;IT française.</p><p>Cette présentation se prolongera autour d&#8217;un buffet campagnard.</p><p>Inscription et informations pratiques sur EventBrite vous attendent <a
href="http://xfr-cloud-day-2012-ovh.eventbrite.com/" rel="nofollow">ici</a> pour participer à notre soirée.</p><p><em>Par ailleurs, il reste des places pour les sessions &laquo;&nbsp;<b>les essentiels pour aller sur le Cloud</b>&nbsp;&raquo; de 10h45 à 18h30, l&#8217;inscription et les informations pratiques sont <a
href="http://xfr-cloud-day-2012.eventbrite.com/" rel="nofollow">ici</a>.</em></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/05/14/soiree-les-coulisses-du-cloud-francais-made-in-ovh-chez-xebia-le-22-mai/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/</link> <comments>http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#comments</comments> <pubDate>Fri, 04 May 2012 06:08:37 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[CDH4]]></category> <category><![CDATA[Cloud Foundry]]></category> <category><![CDATA[Embedmongo]]></category> <category><![CDATA[Guava]]></category> <category><![CDATA[Hadoop]]></category> <category><![CDATA[java]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[MeteorJS]]></category> <category><![CDATA[MongoDB]]></category> <category><![CDATA[MRUnit]]></category> <category><![CDATA[Oracle]]></category> <category><![CDATA[Sonar]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11436</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. Actualité éditeurs / SSII Sonar 3.0 (par Bertrand Dechoux) Oracle reprend Java sous Mac OSX (Par Mathieu Breton) Le coin de la technique Embedmongo : un mongo &#171;&#160;light&#160;&#187; pour java (par Jean Helou) MRUnit 0.9 (par Bertrand Dechoux) CDH4, Hadoop en haute disponibilité (par [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#RevuedePresseXebia-Sonar3.0">Sonar 3.0</a> <em>(par <a
href="http://blog.xebia.fr/author/bdechoux" rel="nofollow">Bertrand Dechoux</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#RevuedePresseXebia-OraclereprendJavasousMacOSX">Oracle reprend Java sous Mac OSX</a> <em>(Par <a
href="https://twitter.com/#!/MatBreton" rel="nofollow">Mathieu Breton</a>)</em></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#RevuedePresseXebia-Embedmongo%3Aunmongo%22light%22pourjava">Embedmongo : un mongo &laquo;&nbsp;light&nbsp;&raquo; pour java</a> <em>(par <a
href="http://blog.xebia.fr/author/jhelou" rel="nofollow">Jean Helou</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#RevuedePresseXebia-MRUnit0.9">MRUnit 0.9</a> <em>(par <a
href="http://blog.xebia.fr/author/bdechoux" rel="nofollow">Bertrand Dechoux</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#RevuedePresseXebia-CDH4%2CHadoopenhautedisponibilit%C3%A9">CDH4, Hadoop en haute disponibilité</a> <em>(par <a
href="http://blog.xebia.fr/author/bdechoux" rel="nofollow">Bertrand Dechoux</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#RevuedePresseXebia-Guavarelease12">Guava release 12</a> <em>(Par <a
href="http://blog.xebia.fr/author/fsarradin" title="fsarradin" >François Sarradin</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#RevuedePresseXebia-Sortiedelaversion1.0deCloudFoundryEclipsePlugin">Sortie de la version 1.0 de Cloud Foundry Eclipse Plugin</a> <em>(Par <a
href="https://twitter.com/#!/dlresende" rel="nofollow">Diego Lemos</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/#RevuedePresseXebia-Meteor">Meteor</a> <em>(Par <a
href="http://blog.xebia.fr/author/xbucchiotty" rel="nofollow">Xavier Bucchiotty</a>)</em></li></ul><h3><a
name="RevuedePresseXebia-Actualit%C3%A9%C3%A9diteurs%2FSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="RevuedePresseXebia-Sonar3.0"></a>Sonar 3.0</h4><p>Cette plateforme de contrôle de qualité de code arrive avec <a
href="http://www.sonarsource.org/sonar-3-0-in-screenshots/" rel="nofollow">son lot d&#8217;améliorations</a> :</p><ul><li>Meilleure gestion de la sécurité : cryptage du mot de passe de la base de données, mots de passe cachés (***), informations sur les licences &#8230;</li><li>Définition d&#8217;alertes sur les métriques booléennes.</li><li>Nouveau design de la TimeMachine : les curieux pourront regarder le <a
href="http://nemo.sonarsource.org/dashboard/index/48569" rel="nofollow">sonar pour sonar</a> et sa <a
href="http://nemo.sonarsource.org/dashboard/index/48569?did=16" rel="nofollow">TimeMachine</a>.</li></ul><h4><a
name="RevuedePresseXebia-OraclereprendJavasousMacOSX"></a>Oracle reprend Java sous Mac OSX</h4><p>Flashback ! C&#8217;est ce qu&#8217;il aura fallu pour qu&#8217;Oracle se décide enfin à prendre en charge le développement de la JVM sur Mac OS.</p><p>Pour rappel, Flashback est un trojan qui affecte les machines sous Mac OS Léopard et Lion, en utilisant une faille Java permettant de transformer votre machine en BotNet. Ce n&#8217;est pas la première fois qu&#8217;un problème survient au sujet de la mise à  jour de Java sous Mac OS. Fin 2010, la firme de Cupertino avait fait savoir qu&#8217;elle ne maintiendrait plus la version de Java pour Mac, et que cela reviendrait donc désormais à Oracle.</p><p>Cette décision d&#8217;Oracle pérennise le support de Java sous Mac OS, après une longue période d&#8217;incertitude (comme l&#8217;avait expliqué l&#8217;<a
href="http://lescastcodeurs.com/2010/11/les-cast-codeurs-podcast-episode-30-java-et-le-mouvement-brownien/" rel="nofollow">épisode 30 des cast-codeurs</a>). Une bonne nouvelle pour les développeurs fans de laptops à pomme.</p><p>On peut donc espérer que les mises à jour et autres corrections de failles de sécurité seront dorénavant beaucoup plus rapides que par le passé ( ~ 6 mois de délais pour certaines failles). Vous pouvez d&#8217;ailleurs dès maintenant retrouver le <a
href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u4-downloads-1591156.html" rel="nofollow">JDK 7 pour Mac OS sur le site d&#8217;Oracle</a>.</p><h3><a
name="RevuedePresseXebia-Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="RevuedePresseXebia-Embedmongo%3Aunmongo%22light%22pourjava"></a>Embedmongo : un mongo &laquo;&nbsp;light&nbsp;&raquo; pour java</h4><p>Il existe plusieurs questions stackoverflow sur la &laquo;&nbsp;bonne&nbsp;&raquo; façon de faire des tests d&#8217;intégration automatisés pour du code qui interagit avec MongoDB. La plupart des réponses invitent à installer un serveur mongo sur la machine et à contrôler l&#8217;état du serveur depuis un @BeforeClass / @AfterClass.  Outre que cela rend complexe la parallélisation des builds, on ne maîtrise pas toujours son serveur d&#8217;intégration continue.<br
/> Heureusement, Michael Mosmann propose une <a
href="https://github.com/michaelmosmann/embedmongo.flapdoodle.de" rel="nofollow">librairie maven</a> qui permet d&#8217;émuler le comportement de mongoDB pour les tests. La documentation de la librairie est assez légère pour le moment, mais des exemples commentés sont présents sur <a
href="http://stackoverflow.com/a/9830861" rel="nofollow">stackoverflow </a> et dans un <a
href="http://www.cubeia.com/index.php/blog/archives/436" rel="nofollow">article sur le blog cubeia</a>. (hat tip <a
href="http://twitter.com/samklr" rel="nofollow">@samklr</a> pour le pointeur)</p><h4><a
name="RevuedePresseXebia-MRUnit0.9"></a>MRUnit 0.9</h4><p><a
href="https://blogs.apache.org/mrunit/" rel="nofollow">MRunit </a> est un librairie de test unitaire (<a
href="http://en.wikipedia.org/wiki/XUnit" rel="nofollow">xUnit</a>) pour <a
href="http://hadoop.apache.org/mapreduce/" rel="nofollow">Hadoop MapReduce</a>. La <a
href="https://blogs.apache.org/mrunit/entry/apache_mrunit_0_9_0" rel="nofollow">version 0.9 vient de sortir</a>. On notera :</p><ul><li>Une façon plus concise d&#8217;exprimer ses attentes vis à vis des compteurs.</li><li>L&#8217;ordre de la sortie peut désormais ne plus être validé.</li><li>Les combiners peuvent désormais être testés avec l&#8217;API mapreduce (la nouvelle) tout comme avec l&#8217;API mapred (l&#8217;ancienne).</li><li>Un meilleur support des différentes sérialisations en enlevant toute supposition sur celle utilisée.</li><li>De meilleurs messages d&#8217;erreurs pour prévenir d&#8217;une utilisation incorrecte de la librairie.</li></ul><h4><a
name="RevuedePresseXebia-CDH4%2CHadoopenhautedisponibilit%C3%A9"></a>CDH4, Hadoop en haute disponibilité</h4><p>Le 27 décembre 2011, <a
href="http://hadoop.apache.org/" rel="nofollow">Hadoop</a> est sorti en <a
href="http://hadoop.apache.org/common/releases.html#27+December%2C+2011%3A+release+1.0.0+available" rel="nofollow">version 1.0</a>, témoignant de sa maturité. Cependant un problème n&#8217;était toujours pas résolu : la haute disponibilité. En effet, le <a
href="http://hadoop.apache.org/common/docs/current/hdfs_design.html#NameNode+and+DataNodes" rel="nofollow">Namenode</a>, le processus responsable de la structure du système de fichier, était un point unique de défaillance (SPOF). En cas d&#8217;arrêt de la machine l&#8217;hébergeant, aucune action n&#8217;était prévue par défaut pour assurer la continuité du fonctionnement du cluster sans intervention manuelle, humaine.</p><p>Le 24 avril 2012, <a
href="https://www.cloudera.com/company/press-center/releases/cloudera-delivers-cdh4-beta/" rel="nofollow">Cloudera a annoncé la beta publique de CDH4</a> (Cloudera&#8217;s Distribution Including Apache Hadoop). La <a
href="https://ccp.cloudera.com/display/CDH4B2/CDH4+Beta+2+High+Availability+Guide" rel="nofollow">haute disponibilité </a>est parmi les avancées majeures décrites. La <a
href="https://ccp.cloudera.com/display/CDH4B2/Introduction+to+Hadoop+High+Availability" rel="nofollow">solution implémentée</a> est une approche maitre-esclave. Les deux processus Namenode se synchronisent sur un espace de stoquage partagé. En cas de défaillance, le Namenode esclave prend la relève évitant ainsi toute coupure de service due à un arrêt du Namenode maitre pour cause de défaillance ou de maintenance.</p><h4><a
name="RevuedePresseXebia-Guavarelease12"></a>Guava release 12</h4><p>Si vous utilisez <a
href="http://code.google.com/p/guava-libraries/" rel="nofollow">Guava</a> sur votre projet, c&#8217;est le moment de le mettre à jour, car Guava vient de passer récemment en version 12. La grande particularité de cette version est qu&#8217;elle brise la compatibilité avec le JDK 5. Vous avez bien lu ! Pour utiliser Guava 12, vous devrez d&#8217;abord installer au moins un JDK 6 ou plus, car cette version interagit avec les nouveaux types de collections introduites dans cette version du JDK (Deque, NavigableMap, NavigableSet). Si vous ne pouvez pas décoller du JDK 5, vous pouvez toujours utiliser la version 11.0.2 de Guava.</p><p>Pour en revenir à la version 12, voici une liste de certaines nouveautés :</p><ul><li>L&#8217;ajout d&#8217;un package reflect, contenant des outils pour étendre votre expérience avec la réflexion de Java.</li><li>La classe FluentIterable qui permet de faire des chaînages de méthodes spécialisées dans le traitement de flux (donnant au passage un avant goût de ce que sera Java 8).</li><li>Un début d&#8217;utilisation du type Optional dans d&#8217;autres classes de Guava (dans FluentInterface et Enums).</li><li>Ajout de la méthode transform() dans Optional qui permet d&#8217;appliquer une fonction sur la valeur contenue dans Optional si elle existe. Optional devient un <em><a
href="http://en.wikipedia.org/wiki/Functor" rel="nofollow">functor</a></em> au sens théorie des catégories.</li><li>Ajout de nouvelles <em>factory methods</em> pour les collections (newArrayDeque, newCopyOnWriteArrayList, Maps.unmodifiableNavigableMap, etc.).</li><li>Collections2 est capable de générer l&#8217;ensemble des permutations d&#8217;une collection.</li><li>La classe CacheBuilderSpec vous permet de spécifier le comportement de votre cache en une chaîne de caractères (et éventuellement de charger cette spec depuis un fichier, par exemple).</li></ul><h4><a
name="RevuedePresseXebia-Sortiedelaversion1.0deCloudFoundryEclipsePlugin"></a>Sortie de la version 1.0 de Cloud Foundry Eclipse Plugin</h4><p>La semaine dernière, SpringSource <a
href="http://www.springsource.org/node/3515" rel="nofollow">a annoncé</a> la sortie de la version 1.0 du plugin Eclipse pour <a
href="http://www.cloudfoundry.com/" rel="nofollow">CloudFroundry</a>. À l&#8217;aide du plugin, les développeurs pourront contrôler leurs applications déployées sur CloudFoundry à partir d&#8217;Eclipse.</p><p>Voici quelques fonctionnalités proposées :</p><ul><li>Déploiement et contrôle des applications à partir du workspace</li><li>Support web : Java native, Spring, Grails et Scala</li><li>Paramétrage des instances et monitoring</li><li>Navigation dans les répertoires du serveur</li><li>Support au debug pour Micro Cloud Foundry</li><li>Amélioration des mises à jour incrémentales</li></ul><p>Le plugin peut être installé sur Eclipse Indigo (version recommandée par SpringSource) à partir d&#8217;Eclipse Marketplace et également sur <a
href="http://www.springsource.com/developer/sts" rel="nofollow">STS</a> à l&#8217;aide de STS Dashboard.</p><p>Pour rappel, CloudFoundry est une plateforme PaaS open source développée par VMware/SpringSouce.</p><p>Plus de détails sur l&#8217;annonce <a
href="http://www.infoq.com/news/2012/04/cloudfoundry-eclipse-plugin" rel="nofollow">InfoQ</a>.</p><h4><a
name="RevuedePresseXebia-Meteor"></a>Meteor</h4><p><a
href="http://www.meteor.com" rel="nofollow">Meteor</a>, c&#8217;est le framework web dont tout le monde parle en ce moment. Vous voulez faire du web, avez une exigence d&#8217;avoir un comportement temps-réel, et surtout vous voulez développer rapidement? Vous devriez alors y jeter un coup d&#8217;oeil.<br
/> Les trois <a
href="http://www.meteor.com/examples/" rel="nofollow">screencasts </a> proposés sont bluffants de simplicité et d&#8217;efficacité.<br
/> Voici quelques points qu&#8217;il faut retenir :</p><ul><li><b>1 langage, Javascript</b><br
/> Tout est en Javascript, côté client bien sûr, mais aussi côté serveur avec Node.JS. Le même code peut être exécuté des deux côtés sans avoir besoin de câbler en RPC. Meteor s&#8217;en charge pour vous. La priorité est donnée au code côté client. Ainsi, tout le code Javascript que vous pouvez écrire (en dehors des dossiers réservés public et server) est packagé, compressé et servi aux clients. Le concept est intéressant. Tout le modèle et le métier ne sont codés qu&#8217;une seule fois, et chargé indifféremment des deux côtés.<br
/> En outre, il est aussi possible d&#8217;utiliser votre framework de templating préféré, Coffeescript ou encore Less sans problème.</li></ul><ul><li><b>Une base de donnée aussi côté client</b><br
/> Avec Meteor, on attaque la base de données côté client! Les documents utilisées depuis la base (MongoDB par défaut) sont copiée pour faire un cache client, mais l&#8217;API reste la même pour manipuler ce cache ou la base. L&#8217;écran est rafraîchi et dans le même temps les modifications de données sont automatiquement envoyées au serveur. Les deux se synchronisent ensuite. Le client adopte l&#8217;état du serveur s&#8217;il y a conflit. Meteor se charge de la communication entre cette requête côté client et sa diffusion, par un mécanisme <em>publish/suscribe</em>. L&#8217;asynchronisme a pour effet de compenser les problèmes de latence des applications sur Internet et d&#8217;avoir ce comportement proche du temps-réel.</li></ul><ul><li><b>Le Live Coding</b><br
/> Changer votre code HTML, et le résultat apparait automatiquement dans votre navigateur. Cela tient presque de la magie car il n&#8217;y même pas recours à un plugin de rafraichissement automatique de la page. Meteor détecte le changement, et l&#8217;envoie à tous les clients. En plus de cela, il garde votre contexte (session et DOM après possible manipulation) pour afficher la page avec le même état qu&#8217;avant le rechargement. Si vous voulez avoir un retour rapide des effets de votre code, vous êtes servis.</li></ul><ul><li><b>Deploiement simplifié</b><br
/> Peut-on faire plus simple?<br
/> Démarrer en local :</p><pre class="brush: java; gutter: false; title: ; notranslate">
meteor
</pre><p> Déployer votre application sur Internet (ils offrent pour l&#8217;instant un service d&#8217;hébergement gratuit)</p><pre class="brush: java; gutter: false; title: ; notranslate">
meteor deploy www.myapp.com
</pre><p> Vous souhaitez vous désengager de Meteor.</p><pre class="brush: java; gutter: false; title: ; notranslate">
meteor bundle myapp.tgz
</pre></li></ul><p>L&#8217;idée est d&#8217;avoir une plateforme ouverte avec le moins de contrainte possible. Ils proposent une solution simplifiée. Si elle ne vous convient plus, vous pouvez sortir du framework à tout moment.<br
/> Quand on épluche la documentation, on remarque quelques points gênants que Cédric Exbrayat a pris le soin de relever dans <a
href="http://hypedrivendev.wordpress.com/2012/04/23/so-what-is-meteor/" rel="nofollow">ce post</a> sur son blog.</p><p>C&#8217;est encore frais mais très prometteur. Bien sûr ce framework ne s&#8217;applique pas à tous les besoins. Mais en bon craftsman que vous êtes, vous savez déjà adapter les outils à votre cas d&#8217;utilisation. Pour vous tenir au courant, ce se passe sur <a
href="http://twitter.com/meteorjs" rel="nofollow">Twitter</a> et <a
href="https://github.com/AVGP/meteor" rel="nofollow">github</a> .</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/05/04/revue-de-presse-xebia-2012-18/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Cloud Day le 22 Mai chez Xebia</title><link>http://blog.xebia.fr/2012/05/02/cloud-day-le-22-mai-chez-xebia/</link> <comments>http://blog.xebia.fr/2012/05/02/cloud-day-le-22-mai-chez-xebia/#comments</comments> <pubDate>Wed, 02 May 2012 08:54:18 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[Amazon AWS]]></category> <category><![CDATA[Cloud Foundry]]></category> <category><![CDATA[CloudBees]]></category> <category><![CDATA[Google App Engine]]></category> <category><![CDATA[Heroku]]></category> <category><![CDATA[OpenStack]]></category> <category><![CDATA[OVH]]></category> <category><![CDATA[vCloud]]></category> <category><![CDATA[VMWare]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11413</guid> <description><![CDATA[Deux millions d&#8217;utilisateurs salesforce.com, quarante millions de comptes mail professionnels Google Apps ou, plus vertigineux encore, 1% du traffic internet mondial servi par les infrastructures Amazon &#8230; le Cloud n&#8217;est plus réservé aux startups hype, il concerne tous les services IT. Nous vous invitons le 22 Mai 2012 à un Cloud Day chez Xebia. Venez [...]]]></description> <content:encoded><![CDATA[<p>Deux millions d&#8217;utilisateurs salesforce.com, quarante millions de comptes mail professionnels Google Apps ou, plus vertigineux encore, 1% du traffic internet mondial servi par les infrastructures Amazon &#8230; le Cloud n&#8217;est plus réservé aux startups <em>hype</em>, il concerne tous les services IT.</p><p>Nous vous invitons <b>le 22 Mai 2012</b> à un <b>Cloud Day</b> chez Xebia. Venez découvrir les conseils des grands du Cloud autour de cas d&#8217;études concrets .</p><p><a
href="http://blog.xebia.fr/22-mai-2012-cloud-day-chez-xebia/" rel="nofollow">Au programme</a> :</p><ul><li>09h15 &#8211; 11h00 : <b>&laquo;&nbsp;Meet the CEO&nbsp;&raquo;</b> : Questions / réponses avec Sacha Labourey, CEO and Founder CloudBees <em>(nombre de places limitées)</em>.</li><li>11h00 &#8211; 18h30 : <b>&laquo;&nbsp;Les essentiels pour partir sur le Cloud&nbsp;&raquo;</b>, des présentations, études de cas et ateliers par les grands du cloud et des professionnels du Cloud <em>(Alexis MP &#8211; Google, Carlos Condé &#8211; Amazon AWS, Raphël Ferreira &#8211; eNovance, &#8230;)</em>.</li><li>19h30 &#8211; 22h00 : <b>&laquo;&nbsp;Les coulisses du Public Cloud <em>made in</em> OVH&nbsp;&raquo;</b>.</li></ul><p>Retrouvez le <a
href="http://blog.xebia.fr/22-mai-2012-cloud-day-chez-xebia/" rel="nofollow">programme détaillé et inscrivez-vous</a>.</p><div
align="center"><p> <img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/cloudbees-logo.png" width="88" style="margin: 1em 1em 1em 1em;" /><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/amazon-aws-logo.gif" width="88" style="margin: 1em 1em 1em 1em;" /><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/google-app-engine-horizontal.jpg" width="128" style="margin: 1em 1em 1em 1em;" /><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/cloud-foundry-logo.png" width="88" style="margin: 1em 1em 1em 1em;" /></p><p><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/heroku-logo-light-88x31.png" width="88" style="margin: 1em 1em 1em 1em;" /><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/vmware-vcloud-logo.png" width="88" style="margin: 1em 1em 1em 1em;" /><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/ovh-logo.jpg" width="88" style="margin: 1em 1em 1em 1em;" /><img
src="http://blog.xebia.fr/wp-content/uploads/2012/05/openstack-logo.jpg" width="88" style="margin: 1em 1em 1em 1em;" /></p></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/05/02/cloud-day-le-22-mai-chez-xebia/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Xebia à Lyon pour la conférence MIX-IT 2012 !</title><link>http://blog.xebia.fr/2012/04/26/xebia-a-lyon-pour-la-conference-mix-it-2012/</link> <comments>http://blog.xebia.fr/2012/04/26/xebia-a-lyon-pour-la-conference-mix-it-2012/#comments</comments> <pubDate>Thu, 26 Apr 2012 09:51:04 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[MixIT]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11376</guid> <description><![CDATA[Aujourd&#8217;hui se tient pour la deuxième année consécutive, la conférence Mix-IT à l&#8217;école Supinfo de Lyon. 33 speakers animeront la journée à travers des sessions d’expertise, des jeux et des rencontres, et 300 participants sont attendus. &#160; Le but est de fournir des sujets variés et complémentaires, autour de 5 thèmes : Techy : Java [...]]]></description> <content:encoded><![CDATA[<p><span
style="float: left"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/mixit-banner.png" style="margin: 1em 1em 1em 1em;" /></span><br
/> Aujourd&#8217;hui se tient pour la deuxième année consécutive, la conférence <b><a
href="http://www.mix-it.fr/" rel="nofollow">Mix-IT</a></b> à l&#8217;école Supinfo de Lyon. 33 speakers animeront la journée à travers des sessions d’expertise, des jeux et des rencontres, et 300 participants sont attendus.</p><p>&nbsp;</p><p></p><p>Le but est de fournir des sujets variés et complémentaires,  autour de 5 thèmes :</p><ul><li>Techy : Java et son écosystème,</li><li>Agility : L’agilité pour débutants et passionnés,</li><li>Trendy : Tendances novatrices et avant-gardistes,</li><li>Mixy : Le meilleur de l’agilité et des technologies Java,</li><li>Gamy : Jeux agiles et coding dojos.</li></ul><p>Cet évènement est organisé par le <a
href="http://www.lyonjug.org/" rel="nofollow">Lyon JUG</a> et le <a
href="http://clubagile.org/" rel="nofollow">Club Agile Rhône-Alpes</a>.<br
/> En  vrac, on y parlera de : Play 2.0, Kanban, HTML5, Automatisation des tests, BigData/Hadoop, Lean Startup, DevOps, Social architecture et bien  d’autres sujets.</p><p><b>Xebia participe évidemment à cet évènement en animant 2 slots :</b></p><ul><li><b><a
href="http://www.mix-it.fr/session/83/bigdata-hadoop-exploiter-des-teraoctets-de-logs" rel="nofollow">BigData/Hadoop, exploiter des téraoctets de logs</a></b>, par <a
href="http://blog.xebia.fr/author/plopez/" rel="nofollow">Pablo Lopez</a>.</li><li><b><a
href="http://www.mix-it.fr/session/40/automatisation-des-tests-le-mythe-du-roi" rel="nofollow">Automatisation des tests, le mythe du ROI</a></b>, par <a
href="http://blog.xebia.fr/author/gmantel/" rel="nofollow">Gilles Mantel</a></li></ul><p>Vous pouvez découvrir le programme complet <a
href="http://www.mix-it.fr/" rel="nofollow">ici</a> et suivre la conférence en direct <a
href="http://www.mix-it.fr/live" rel="nofollow">ici</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/26/xebia-a-lyon-pour-la-conference-mix-it-2012/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>remote safe push</title><link>http://blog.xebia.fr/2012/04/20/remote-safe-push/</link> <comments>http://blog.xebia.fr/2012/04/20/remote-safe-push/#comments</comments> <pubDate>Fri, 20 Apr 2012 08:16:27 +0000</pubDate> <dc:creator>Xavier Bucchiotty</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[git]]></category> <category><![CDATA[Github]]></category> <category><![CDATA[intégration continue]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[TeamCity]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11309</guid> <description><![CDATA[Dans les principes de l&#8217;agilité, l&#8217;un des ingrédients essentiels est d&#8217;avoir une boucle de retour rapide. En tant que développeur, vous êtes donc profondément convaincu par l&#8217;intégration continue. Seulement, vous en avez assez de cette situation : À tout moment de la journée peut retentir cette fameuse phrase: &#171;&#160;Mais qui a (encore) cassé le build [...]]]></description> <content:encoded><![CDATA[<p>Dans les principes de l&#8217;agilité, l&#8217;un des ingrédients essentiels est d&#8217;avoir une boucle de retour rapide. En tant que développeur, vous êtes donc profondément convaincu par l&#8217;intégration continue. Seulement, vous en avez assez de cette situation :</p><p>À tout moment de la journée peut retentir cette fameuse phrase: &laquo;&nbsp;<b>Mais qui a (encore) cassé le build ??</b>&laquo;&nbsp;<br
/> Il y a alors plusieurs stratégies d&#8217;équipe :</p><ul><li>ce n&#8217;est pas grave, cela arrive tout le temps. Cela va bien finir par passer au vert !</li><li>celui qui casse paie et corrige le problème</li><li>l&#8217;ensemble de l&#8217;équipe se sent concerné, une personne se dévoue pour enquêter et corriger le problème.</li></ul><p>La règle d&#8217;or : aucune modification ne peut être apportée sur le code tant que l&#8217;intégrité du projet n&#8217;est pas restaurée.<br
/> Une fois le problème résolu, au Scrum Master de créer un système à base de croissants à offrir, de cagnottes à remplir, d&#8217;avatars à afficher ou encore de lance-missile USB pour que cela se produise le moins souvent possible.<br
/> Une carte Xebia Essentials illustre cette démarche : <b><a
href="http://essentials.xebia.com/no-blame-no-mercy" rel="nofollow">NO BLAME BUT NO MERCY</a></b>.</p><p>Vient alors l&#8217;idée de s&#8217;assurer que le commit que je me prépare à envoyer correspond un minimum aux critères de validation de l&#8217;intégration continue. Le processus de validation doit être automatisé et en mode bac-à-sable (son exécution ne doit perturber personne).</p><p><span
style="float: right"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/gep-enjoy.jpg" style="border: 0px solid black" /></span></p><h3><a
name="remotesafepush-PersonalBuilddansTeamcity"></a>Personal Build dans Teamcity</h3><p>Le serveur d&#8217;intégration continue <a
href="http://www.jetbrains.com/teamcity/" rel="nofollow">Teamcity</a>, de Jetbrains, propose ce service sous forme de personnal build. On peut les déclencher à la demande. Ces jobs ne sont pas visibles aux autres utilisateurs et des plugins permettent d&#8217;être averti dans l&#8217;IDE du résultat de build.<br
/> Cela présente l&#8217;avantage de déporter la charge de compilation et tests à des serveurs d&#8217;intégration. Vous économisez ainsi de la mémoire et de la CPU sur votre poste de développement.<br
/> Si vous utilisez un gestionnaire de source non-distribué (comme SVN), vous pouvez alors déclenchez des Personal Builds sur vos modifications prêtes à être commitées.</p><p>Cela va transmettre vos sources sous forme de Patch à Teamcity. Celui-ci va ensuite lancer le job de votre choix. Si le build est un succès, vous avez gagné le droit de voir vos sources promues sur le repository. Sinon, l&#8217;IDE vous invite à corriger les erreurs remontées et à retenter votre chance plus tard.<br
/> Cette solution est simple et rapide à mettre en place. Teamcity est gratuit jusqu&#8217;à trois agents et vingt projets.</p><p>Seulement avec Git, Teamcity peut seulement exécuter des Personal-Build sur vos changements en cours, ou vos commits en attente. Il ne pourra pas (en version actuelle) les pousser si le résultat du job est OK.</p><h3><a
name="remotesafepush-PersonalBuildenscript"></a>Personal Build en script</h3><p>Chez notre client, nous avons donc développé une solution pragmatique qui serait indépendante du serveur d&#8217;intégration, une solution à base de script. Pour l&#8217;environnement de travail, nous avons :</p><ul><li>MacOS</li><li>Git</li><li>un projet Java</li><li>Maven</li><li>un serveur d&#8217;intégration pour chaque développeur, avec les mêmes versions de JDK, Maven et serveur d&#8217;application, et un repository Git local</li></ul><p>Comme chaque développeur possède sa machine virtuelle distante, chacune d&#8217;entre elles possède un repository local Git. On peut alors pousser ses commits sur cette machine, et avec Maven, lancer une liste de tâches pour vérifier l&#8217;état des commits.</p><h4><a
name="remotesafepush-InitialisationdurepositoryGitdistant"></a>Initialisation du repository Git distant</h4><p>Voici la liste des commandes Git pour initialiser ce repository distant:</p><pre class="brush: bash; gutter: false; title: ; notranslate">
git init .
git config receive.denyCurrentBranch ignore
git config receive.denyDeleteCurrent ignore
</pre><p>Les deux commandes précédentes permettent à Git d&#8217;autoriser un repository distant (celui du développeur) à modifier et supprimer la branche qui est en cours de checkout (interdit par défaut).</p><h4><a
name="remotesafepush-Lescriptc%C3%B4t%C3%A9d%C3%A9veloppeur"></a>Le script côté développeur</h4><p>Le script repose essentiellement sur la puissance de Git et de communication SSH pour lancer des commandes Maven. Le principe est simple</p><ul><li>Récupération des sources depuis origin</li><li>Détection en local de la branche courante ainsi que la dernière révision à pousser</li><li>Envoi du code sur la machine distante</li><li>Exécution des tests sur la machine distante</li><li>Si tous les tests passent, les sources sont envoyées sur origin.</li></ul><p>Le script est disponible sur le repository Github.com de <a
href="http:///www.financeactive.com" rel="nofollow">Financeactive</a> (<a
href="https://github.com/financeactive/fa-toolkit/blob/master/git/safe-push/safe-push.sh" rel="nofollow">https://github.com/financeactive/fa-toolkit/</a>). Il contient certes des commandes de tests spécifiques au projet mais reste simple à lire.</p><h4><a
name="remotesafepush-Sch%C3%A9madescriptif"></a>Schéma descriptif</h4><p>La solution est détaillée sur ce schéma.</p><p><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Capture-d’écran-2012-04-19-à-21.26.32.png" width="700" style="border: 0px solid black" /></p><h4><a
name="remotesafepush-Descriptiondelasolution"></a>Description de la solution</h4><p>Vous souhaitez plus d&#8217;explication sur le fonctionnement du script ? Voici la liste détaillée de ses étapes.</p><p><b>1. Détection des informations suivantes :</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
git rev-parse --show-toplevel #Root du projet en cours
git rev-parse --symbolic --abbrev-ref $(git symbolic-ref HEAD) #Branche locale de travail
git log --pretty=%H -1 #Dernière révision à pousser 
git config branch.$CURRENT_BRANCH.remote #L'alias du remote associé à cette branche
git config remote.$REMOTE_ALIAS.url #L'url du remote
git config branch.$CURRENT_BRANCH.merge #Le nom de la branche remote suivie
</pre><p><b>2. Présentation à l&#8217;écran de la liste des commits prêts à pousser</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
git log $REMOTE_ALIAS/$REMOTE_BRANCH.. --format='; ;%Cred%h%Creset;%C(yellow)%cd%Creset;%f' --date=iso | column -t -s';'
</pre><p><b>3. Vérification de l&#8217;état du repository local avant de faire le pull</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
git status --porcelain | grep -v '??' | wc -l
</pre><p>==&gt; S&#8217;il y a des modifications en cours (fichiers suivis par Git, modifiés mais non commités)</p><p>=&gt; SI OUI</p><pre class="brush: bash; gutter: false; title: ; notranslate">
git stash
</pre><p>==&gt; SINON RIEN</p><p><b>4. On récupère l&#8217;historique distant</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
git pull $REMOTE_ALIAS $CURRENT_BRANCH
</pre><p>==&gt; S&#8217;il y avait un stash</p><pre class="brush: bash; gutter: false; title: ; notranslate">
git stash pop
</pre><p><b>5. On recharge la révision à tester car le pull a pu créer des commits de merge ou de rebase</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
git log --pretty=%H -1
</pre><p><b>6. On tente un push en dry-run pour détecter au plus tôt les possibles problèmes de merge</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
git push -n  $REMOTE_REPO $CURRENT_REVISION:$REMOTE_BRANCH
</pre><p>exemple : git push -n origin f313ae:master</p><p><b>7. On envoie le code sur la VM</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
git push remote-run +$CURRENT_BRANCH:$CURRENT_BRANCH
</pre><p>Le + avant current-branch permet de forcer l&#8217;update quoi qu&#8217;il arrive, après-tout c&#8217;est votre VM, vous en faites ce que vous voulez. Attention, ne surtout pas utiliser sur Github. Vous écrasez alors tout l&#8217;historique de Github avec le vôtre.</p><p><b>8. Sur la VM, on charge la branche</b></p><p>Le git push n&#8217;envoie que les blobs dans le répertoire .git. Pour que cela ait un impact sur le filesystem, il faut faire :</p><pre class="brush: bash; gutter: false; title: ; notranslate">
git checkout -f ${CURRENT_BRANCH}
git clean -df
</pre><p>Le git clean permet de supprimer les fichiers non trackés par git (dans le cas de passage de master à patch par exemple)</p><p><b>9. Lancement de tous les tests</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
mvn clean install #via SSH
</pre><p><b>10. On pousse si tout va bien</b></p><pre class="brush: bash; gutter: false; title: ; notranslate">
git push $GIT_DRY_RUN $REMOTE_REPO $CURRENT_REVISION:$REMOTE_BRANCH
</pre><p>Le fait d&#8217;utiliser la commande git push, avec le nom de la révision, le remote et la branche, permet de continuer à travailler sur son environnement local sans soucis. Vous pouvez même changer de branche durant l&#8217;exécution du script. Cela n&#8217;aura pas d&#8217;impact sur le code envoyé en cas de succès. La seule possibilité est d&#8217;amender le dernier commit en cours de test. Mais le but de ce script est d&#8217;aider le développeur, pas de l&#8217;empêcher de faire ce qu&#8217;il veut.</p><p>Nous avons créer un alias sous git pour appeler ce script. Ainsi, un git remote-safe-push nous lance la validation de notre code avant le push. Nous n&#8217;utilisons pas de hook pour permettre une plus grande flexibilité.</p><h3><a
name="remotesafepush-Retourd%27exp%C3%A9rience"></a>Retour d&#8217;expérience</h3><p>L&#8217;exécution dure aujourd&#8217;hui quinze minutes. Cela peut paraître aberrant d&#8217;attendre autant de temps pour pouvoir pousser votre code sur le repository central. Mais vous n&#8217;êtes pas obligés d&#8217;attendre la fin du script pour continuer de travailler. Il y a donc très peu d&#8217;impact pour le développeur.</p><p>Dans son discours sur le déploiement continu lors du dernier Devoxx, Dave Farley aborde ce sujet. Il explique que dans son équipe, chaque développeur devait attendre la fin de l&#8217;intégration continue pour son commit avant de prendre une autre tâche. Ils n&#8217;avaient pas à ce moment de &laquo;&nbsp;Personal Build&nbsp;&raquo;. Chaque développeur s&#8217;assurait donc que son commit n&#8217;allait pas impacter les autres. Quand on pense chaque commit comme une release-candidate, cela change la vision des choses !</p><p>C&#8217;est une solution simple et pragmatique qui répond au besoin : garder une intégration continue en parfait état. Elle est personnalisable et facile à mettre en place. Elle est aussi évolutive ; ajouter des tests fonctionnels avec Selenium, de charge avec JMeter, ou plein d&#8217;autres choses reste possible car après tout, c&#8217;est un script.<br
/> Si vous envisagez de faire du déploiement continu, cela présente encore un avantage. Vous pouvez déjà tester votre procédure de déploiement de production sur cette machine, et cela plusieurs fois par jour et par développeur. Il n&#8217;est jamais facile d&#8217;avoir un environnement local identique à la production. La virtualisation est une bonne technique pour palier à cela. Si vous pensez à utiliser des solutions cloud de type PaaS, le script peut permettre aussi de tester la création d&#8217;instances à la demande, de tester l&#8217;installation complète d&#8217;un environnement d&#8217;un serveur, d&#8217;une base de données, ou encore de tester les configurations des proxys.</p><p>Nous envisageons d&#8217;ailleurs d&#8217;utiliser la virtualisation. Des outils comme <a
href="http://vagrantup.com/" rel="nofollow">Vagrant</a> permettent de créer des machines virtuelles sur <a
href="https://www.virtualbox.org/" rel="nofollow">VirtualBox</a>. <a
href="http://puppetlabs.com/puppet/what-is-puppet/" rel="nofollow">Puppet</a> peut ensuite nous permettre de monter un environnement similaire à la production mais en local. Toute la chaîne de déploiement est ainsi testable en local.</p><p>Le script personnalisé revêt néanmoins quelques inconvénients. Il ne nous permet pas de gérer des files d&#8217;attentes de jobs, ou de l&#8217;intégrer pour l&#8217;instant dans l&#8217;IDE. Plus le temps entre la commande git pull (je reçois) et git push (j&#8217;envoie) est long, plus le risque d&#8217;avoir un commit &laquo;&nbsp;étranger&nbsp;&raquo; poussé entre-temps est grand. Git ne vous permettra pas de pousser un seul commit si votre historique n&#8217;est pas à jour. Vous serez alors condamné à mettre à jour votre historique local avant de pousser. Il faut donc trouver l&#8217;équilibre à mettre en place dans ce mécanisme, pour ne pas rendre l&#8217;envoi de modifications complètement impossible. Nous avons avec notre client l&#8217;objectif de descendre sous la barre des 10 minutes, ce qui nous semble un temps satisfaisant.</p><p>Cette solution nous a permis d&#8217;augmenter la qualité globale de l&#8217;application en encourageant les développeurs à faire des tests. Depuis, nous poussons notre code beaucoup plus régulièrement. Cela permet d&#8217;avoir des retours toujours plus rapides sur nos stories de la part de l&#8217;équipe produit.</p><p>Un dernier petit inconvénient (c&#8217;est à voir) : si vous aviez choisi la méthode &laquo;&nbsp;croissants&nbsp;&raquo; au petit-déjeuner pour limiter le nombre de casseurs de builds, il faudra vous trouver autre chose pour avoir des viennoiseries le matin !</p><p><em>source image</em> <em><a
href="http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef0162ffaf1e71970d-800wi" rel="nofollow">http://www.geekandpoke.com</a></em></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/20/remote-safe-push/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Xebia Studio</title><link>http://blog.xebia.fr/2012/04/18/xebia-studio/</link> <comments>http://blog.xebia.fr/2012/04/18/xebia-studio/#comments</comments> <pubDate>Wed, 18 Apr 2012 04:01:07 +0000</pubDate> <dc:creator>Hugo Geissmann</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Craftsmanship]]></category> <category><![CDATA[Software Craftsmanship]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11299</guid> <description><![CDATA[Il y a quelques mois Xebia a lancé Xebia Studio, son studio de développement agile dédié à la réalisation de projets innovants. Le Studio est la force de frappe qui aide nos clients à relever leurs défis : délais de livraison très courts, traitement de fortes volumétries, plates-formes hautement scalables mais aussi applications mobiles d&#8217;entreprise [...]]]></description> <content:encoded><![CDATA[<p><span
style="float: left"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/xebia-studio.png" style="border: 0px solid black" /></span><br
/> Il y a quelques mois Xebia a lancé <a
href="http://studio.xebia.fr/" rel="nofollow">Xebia Studio</a>, son studio de développement agile dédié à la réalisation de projets innovants. Le Studio est la force de frappe qui aide nos clients à relever leurs défis : délais de livraison très courts, traitement de fortes volumétries, plates-formes hautement scalables mais aussi applications mobiles d&#8217;entreprise et web sociales. </p><p>A travers la création de <a
href="http://studio.xebia.fr/" rel="nofollow">Xebia Studio</a>, nous cherchons à répondre à un défi de taille : Réaliser des applications innovantes, dans des délais courts avec une qualité et une robustesse irréprochables, le tout dans un climat de confiance et de transparence. Un doux rêve ? Tout est question d’ambition, de culture et d’organisation.</p><p>Notre conviction profonde est qu’il est possible de développer des logiciels autrement que ce qui se fait depuis des années, en plaçant la qualité au centre du développement, en accueillant favorablement le changement et en s&#8217;imprégnant intimement du métier et des contraintes de nos clients.</p><p>Notre philosophie pourrait se résumer en deux mots : <b>Software Craftsmanship</b>.<br
/> <em>“Craftsmanship”</em> est difficile à traduire <em>(et à prononcer)</em>, il s’agit d’un état d’esprit très particulier que Bob Martin décrit ainsi dans son livre <em>&laquo;&nbsp;Clean Coder&nbsp;&raquo;</em> :</p><blockquote><p>“Un craftsman est une personne qui travaille rapidement, mais sans précipitation, qui donne des estimations réalistes et qui tient ses engagements. Un craftsman sait dire non, mais fait tout son possible pour dire oui. En un mot, un craftsman est un professionnel.”</p></blockquote><p>D’un point de vue opérationnel, nous construisons des équipes de développeurs agiles expérimentés et complémentaires. Nous proposons à nos clients un mode de co-développement qui permet d’embarquer dans le projet un ou plusieurs développeurs de leurs équipes. Pour nos clients, c’est une garantie d’être au même niveau de connaissance de l’application que nous et ainsi de gagner très rapidement en autonomie. Pour nous, c’est un moyen de s’aligner rapidement sur la culture et les contraintes de notre client.</p><p>Nos choix technologiques sont pragmatiques : pas de frameworks inutiles ni d’architectures alambiquées. Un projet réussi c&#8217;est avant tout des fonctions utiles à ses utilisateurs. La technologie se met au service du projet et pas l’inverse. Notre expérience et notre connaissance des solutions de PaaS <em>(Platform as a Service)</em> nous permettent de démarrer un projet en moins d&#8217;une journée et de délivrer en production et en continu des applications disponibles pour les utilisateurs.</p><p>Nous mettons en oeuvre les meilleurs pratiques d’ingénierie conformément aux valeurs de l’eXtreme Programming et nos projets sont tous conduits suivant la méthode agile Scrum.</p><p>D’un point de vue contractuel, nous jugeons le forfait incompatible avec notre philosophie agile. Nous privilégions un <a
href="http://contrat-agile.org/" rel="nofollow">contrat agile</a> porteur d’engagements forts de notre part.</p><p>Nous cherchons en permanence de nouveaux talents pour renforcer nos équipes. Si vous avez déjà plusieurs années d’expérience et que vous êtes fiers de dire : <em>“Je suis développeur !”</em>, alors n’hésitez pas, postulez !</p><p>Pour tout ceux qui auront la chance d’y être, nous vous invitons à venir nous rencontrer à Devoxx France sur le stand de Xebia.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/18/xebia-studio/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Publication du code source de l&#8217;application Devoxx Mobile et retour d&#8217;expérience</title><link>http://blog.xebia.fr/2012/04/17/publication-du-code-source-de-lapplication-devoxx-mobile-et-retour-dexperience/</link> <comments>http://blog.xebia.fr/2012/04/17/publication-du-code-source-de-lapplication-devoxx-mobile-et-retour-dexperience/#comments</comments> <pubDate>Tue, 17 Apr 2012 14:00:11 +0000</pubDate> <dc:creator>Alexis Kinsella</dc:creator> <category><![CDATA[Mobilité]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[iOS]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[mobile]]></category> <category><![CDATA[Web]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11251</guid> <description><![CDATA[La semaine dernière nous vous annoncions la sortie de l&#8217;application mobile Xebia pour Devoxx France, ainsi que la publication prochaine du code source de l&#8217;application. C&#8217;est aujourd&#8217;hui chose faite puisque vous pouvez le consulter sur notre espace GitHub à l&#8217;adresse suivante : https://github.com/xebia-france/devoxx-mobile. Le code source est publié sous license MIT. Nous vous encourageons bien [...]]]></description> <content:encoded><![CDATA[<p>La semaine dernière nous vous annoncions la sortie de l&#8217;<a
href="http://blog.xebia.fr/2012/04/10/une-application-mobile-devoxx-france-2012-pour-tous/" rel="nofollow">application mobile</a> Xebia pour Devoxx France, ainsi que la publication prochaine du code source de l&#8217;application. C&#8217;est aujourd&#8217;hui chose faite puisque vous pouvez le consulter sur notre espace GitHub à l&#8217;adresse suivante : <a
href="https://github.com/xebia-france/devoxx-mobile" rel="nofollow">https://github.com/xebia-france/devoxx-mobile</a>.</p><p>Le code source est publié sous license <a
href="http://fr.wikipedia.org/wiki/Licence_MIT" rel="nofollow">MIT</a>. Nous vous encourageons bien entendu à aller le consulter, le forker ainsi qu&#8217;à partager vos retours d&#8217;expériences autour de développements d&#8217;applications mobiles basées sur des technologies web.</p><h3><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-G%C3%A9n%C3%A8seetobjectifs"></a>Génèse et objectifs</h3><p>Le développement de l&#8217;application s&#8217;est focalisé autour des axes et objectifs suivants :</p><ul><li>Explorer les technologies web pour développer une application mobile, que cela soit par l&#8217;utilisation d&#8217;HTML5 et CSS3 via le cadre de développement proposé par la librairie jQueryMobile ou bien par l&#8217;intégration de différentes librairies JavaScript telles que <a
href="http://requirejs.org/" rel="nofollow">Require</a>, <a
href="http://documentcloud.github.com/backbone/" rel="nofollow">Backbone</a>, <a
href="http://documentcloud.github.com/underscore/" rel="nofollow">Underscore</a> ou <a
href="http://westcoastlogic.com/lawnchair/" rel="nofollow">Lawnchair</a>.</li><li>Mettre en oeuvre <a
href="https://www.phonegap.com/" rel="nofollow">PhoneGap</a> et son usine logicielle en ligne <a
href="https://build.phonegap.com/apps" rel="nofollow">PhoneGap Build</a> pour délivrer des applications web encapsulées dans des coquilles natives afin de pouvoir les publier sur les markets Android, Chrome ou bien encore iOS.</li><li>Fournir une application qui sera utilisable sur l&#8217;ensemble des matériels du marché et vérifier dans quelle mesure les applications mobiles web peuvent se comparer aujourd&#8217;hui face aux applications natives. </li><li>Développer une application ayant une base de code unique afin d&#8217;éviter d&#8217;avoir à gérer la fragmentation des plateformes.</li><li>Etre en mesure de répondre à un cahier des charges complet en un temps réduit. Ce cahier des charges comprenant:<ul><li>Le développement des différents écrans applicatifs : Liste des sessions par journée avec affichage complet des détails, ainsi que les listes et détails des speakers, des salles, et des tracks.</li><li>La gestion et le stockage des favoris (On parle ici des sessions)</li><li>La présentation du programme Xebia pendant les 3 jours de la conférence</li><li>Une application étant capable de fonctionner en mode offline avec synchronisation et stockage des données</li><li>Un affichage de la timeline twitter XebiaFr et DevoxxFr</li><li>Un fonctionnement effectif sur un ensemble étendu des matériels allant du téléphone au PC en passant par la tablette quelque soit l&#8217;OS</li></ul></li></ul><h3><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Unpremierbilan"></a>Un premier bilan</h3><p>Le pari du développement d&#8217;une application mobile web fonctionnant sur un grand nombre d&#8217;OS et de matériels est un succès. L&#8217;application fonctionne aussi bien sur des plateformes mobiles telles qu&#8217;iOS ou Android que sur les navigateurs web classiques. Malgré des avantages évidents, le développement mobile web n&#8217;est pas exempt de difficultés. Pour rendre compte de cela nous allons tenter de dresser une liste de points positifs et des difficultés rencontrées au cours du développement de l&#8217;application.</p><h3><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Lespointspositifs"></a>Les points positifs</h3><h4><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Und%C3%A9veloppementunifi%C3%A9"></a>Un développement unifié</h4><p>Un aspect majeur vient du fait qu&#8217;il n&#8217;a pas été nécessaire de gérer différentes bases de code. Le travail de gestion de la fragmentation n&#8217;a été que secondaire.</p><p>Bien que la plateforme web propose un mode de développement unifié avec les technologies HTML, CSS et JavaScript, les différentes OS et matériels imposent des contraintes variées qui peuvent apporter des problématiques venant complexifier les développements : taille de l&#8217;écran, performance des navigateurs, latence et vitesse des réseaux de données, etc.</p><p>Afin de ne pas se tromper, il est nécessaire de s&#8217;assurer de la plateforme cible principale et d&#8217;y apporter une expérience utilisateur optimale, vous pouvez ensuite vous assurer du bon fonctionnement des développements sur les environnements cibles secondaires. Il n&#8217;est pas difficile dans le cas d&#8217;un développement mobile de faire fonctionner l&#8217;application dans un navigateur classique. Il est d&#8217;ailleurs possible en introduisant quelques notions de <em>Responsive UI</em> d&#8217;obtenir un résultat efficace sur l&#8217;ensemble des navigateurs.</p><p>Les principaux navigateurs mobiles étant basés sur WebKit, il est possible de travailler la majorité du temps avec un navigateur desktop compatible tel que Chrome ou bien Safari. Il est cependant nécessaire de tester dès le départ ses développements sur mobile pour éviter les mauvaises surprises. Pour cela, rien de plus facile, il vous suffit de préparer une configuration Apache pointant sur vos développements, ce qui rend accessible votre application sur vos matériels mobiles via Wifi sans même avoir à déployer quoi que ce soit. Il est biensûr important d&#8217;avoir un environnement de recette disponible sur un hébergement externe afin de rendre vos développements testables sur d&#8217;autres matériels auxquels vous n&#8217;avez accès qu&#8217;occasionnellement.</p><p>Ce dernier point soulève la problématique du déploiement. Heureusement le déploiement d&#8217;une application web n&#8217;a rien de bien complexe, et quelques commandes de scripts répondront avec succès à vos besoins.</p><h4><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Destechnologiesma%C3%AEtris%C3%A9es"></a>Des technologies maîtrisées</h4><p>Les technologies web ont pour avantage d&#8217;être généralement déjà maîtrisées par les équipes de développement, par conséquent leur coût d&#8217;apprentissage reste faible. Le web fourmillant de tutoriaux, il est facile de trouver les informations dont vous avez besoin pour démarrer ou progresser dans vos développements.</p><p>Ce qu&#8217;il faut retenir c&#8217;est qu&#8217;il n&#8217;est plus nécessaire d&#8217;apprendre les arcanes du SDK de chacune des plateformes que vous ciblez! Le gain à ce niveau est extraordinaire, vous n&#8217;avez à vous concentrer que sur une seule technologie ce qui favorise votre montée en compétences, et vous permet d&#8217;éviter de vous disperser. Ceci est d&#8217;autant plus vrai lorsque vous avez une équipe restreinte à disposition : vous n&#8217;aurez qu&#8217;une seule application à peaufiner, à maintenir ou bien encore à débogguer. Vous irez d&#8217;autant plus vite à fournir une solution viable à vos utilisateurs sans entraîner de déception en excluant telle ou telle plateforme.</p><h3><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Lesdifficult%C3%A9s"></a>Les difficultés</h3><h4><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Desprobl%C3%A8mesd%27int%C3%A9gration"></a>Des problèmes d&#8217;intégration</h4><p>jQueryMobile est une formidable librairie mobile adressant avec succès la fragmentation des plateformes, mais pour autant cette librairie n&#8217;est pas exempt de défaut. La gestion des hashtags ne permet pas jusqu&#8217;à présent de traiter correctement les paramètres d&#8217;URL, ceci reste secondaire puisqu&#8217;il est possible de contourner le problème en utilisant un routeur externe tel que celui fourni par le projet <a
href="https://github.com/azicchetti/jquerymobile-router" rel="nofollow">jQueryMobile Router</a>. Il est à noter que jQueryMobile ne s&#8217;intègre pas parfaitement avec le router de Backbone au moins dans sa version 1.0, il reste à vérifier si la situation a changé avec la version 1.1 de la librairie.</p><h4><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Desprobl%C3%A8mesdeperformance"></a>Des problèmes de performance</h4><p>Les environnements mobiles sont contraints par les performances des processeurs qui équipent votre matériel. De surcroît, de nombreuses optimisations Webkit ne sont pas intégrées aux navigateurs mobiles actuels. Les différences se jouent également sur différents aspects selon les plateformes. Ainsi, la plateforme Android propose de faibles performances concernant les animations CSS, tandis que la plateforme iOS a du mal à optimiser le scroll ce qui pose des problème de transition entre les page d&#8217;une application jQueryMobile (Ce problème est décrit dans le <a
href="http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/" rel="nofollow">changelog de la version 1.1</a>).</p><h4><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Desfonctionalit%C3%A9smanquantes"></a>Des fonctionalités manquantes</h4><p>Il n&#8217;est hélas pas possible de reproduire l&#8217;ensemble des fonctionnalités d&#8217;une application native dans une application mobile. Il n&#8217;est ainsi pas possible de synchroniser des données en tâche de fond avec les technologies web actuelles. Seuls les WebWorkers pourraient répondre à cette problématique, cependant ils ne sont pas encore supportés correctement sur la majorité des plateformes mobiles. Il est donc nécessaire d&#8217;étudier dès le démarrage de votre projet mobile les solutions de contournement possibles.</p><h4><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Lepi%C3%A8gedelavalidation"></a>Le piège de la validation</h4><p>Attention à ne pas sous-estimer la difficulté de passer l&#8217;étape de validation de votre application sur le market iOS. S&#8217;y prendre en avance n&#8217;est parfois pas suffisant. Apple conditionne l&#8217;acceptation des applications à des contraintes extrêmement sévères. Par exemple, une application fonctionnelle mais juste correcte visuellement n&#8217;est pas nécessairement suffisante. Si vous voulez mettre toutes les chances de votre côté, il est nécessaire de mettre en avant les possibilités et les qualités de la plateforme iOS. Il est également nécessaire de soumettre uniquement des applications avec un graphisme irréprochable, proposant de préférences des fonctionnalités inédites et originales. </p><p>Il faut également savoir que les applications HTML5 peuvent être refusées pour le simple motif qu&#8217;elles n&#8217;utilisent pas de fonctionnalités natives, et cela même si aucune application ne propose encore la même fonctionnalité sur le market. Dans ce cas, Apple vous enjoint à proposer votre application via le web. Ce dernier point peut être très dommageable en terme de diffusion et de retour sur investissement. Il est donc nécessaire de prévoir d&#8217;exploiter des fonctionnalités natives d&#8217;iOS si vous voulez mettre toutes les chances de votre côté. Les solutions sont nombreuses, vous pouvez par exemple utiliser les notifications iOS via PhoneGap et le tour est joué. Quelques tests de support de fonctionnalités natives dans votre code via la présence des API PhoneGap suffiront à faire l&#8217;affaire.</p><p>A toutes fins utiles, sachez qu&#8217;il faut attendre en moyenne 9 jours pour que votre application passe la validation Apple. Prévoyez également la possibilité que votre application soit refusée et qu&#8217;il faille la soumettre à nouveau. Ceci nous amène à un délai d&#8217;au-moins un mois. Il est nécessaire d&#8217;anticiper ces délais si vous ne voulez pas avoir de mauvaises surprises !</p><h3><a
name="Publicationducodesourcedel%27applicationDevoxxMobileetretourd%27exp%C3%A9rience-Conclusion"></a>Conclusion</h3><p>Le développement d&#8217;applications mobiles viables basées sur des technologies web est bel et bien aujourd&#8217;hui une réalité, mais les difficultés sont encore nombreuses, et le support des technologies et des pratiques demandent encore à mûrir. Cependant les choses évoluent très vite, et même si nous sommes aujourd&#8217;hui dans un <a
href="http://julien.dollon.net/post/Sommes-nous-dans-un-trou-technologique.aspx" rel="nofollow">trou technologique</a> entre une fragmentation des développements natifs de plus en plus difficile à adresser et une plateforme de développement unifiée autour des technologies web qui ne demandent qu&#8217;à mûrir, il serait dommage de rester là à regarder le train passer sans se mettre à apprendre ce qui sera sans aucun doute une solution de premier choix dans un futur très proche !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/17/publication-du-code-source-de-lapplication-devoxx-mobile-et-retour-dexperience/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Devoxx France &#8211; Découvrez le programme du stand Xebia</title><link>http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/</link> <comments>http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#comments</comments> <pubDate>Tue, 17 Apr 2012 10:30:00 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Devoxx]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11257</guid> <description><![CDATA[Attachés au partage de connaissances, nous avons décidé de vous proposer des ateliers technologiques dans un format très court, afin que chaque participant à Devoxx France puisse aussi profiter des moments de pause, en parlant technique, en apprenant et en échangeant. Découvrez donc 9 mini TechEvent (dans l’idée de ceux que Xebia a l&#8217;habitude de [...]]]></description> <content:encoded><![CDATA[<p>Attachés au partage de connaissances, nous avons décidé de vous proposer des ateliers technologiques dans un format très court, afin que chaque participant à Devoxx France puisse aussi profiter des moments de pause, en parlant technique, en apprenant et en échangeant.</p><p>Découvrez donc <b>9 mini TechEvent</b> <em>(dans l’idée de ceux que Xebia a l&#8217;habitude de proposer gratuitement à l’ensemble de la communauté Java)</em> sur notre stand.</p><p>Pour participer, rien de plus simple, rendez vous directement sur notre stand, à l’heure et au jour indiqué ci-dessous en fonction de vos envies.</p><ul><li> <strong>Les 9 mini TechEvent</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-LegoMindstormFight">Lego Mindstorm Fight</a></li><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-D%C3%A9couvrezlaProgrammationFonctionnelle">Découvrez la Programmation Fonctionnelle</a></li><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-TDDenPairProgramming">TDD en Pair Programming</a></li><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-D%C3%A9ployezduGrailssurHeroku">Déployez du Grails sur Heroku</a></li><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-ContinuousDeploymentavecJenkins">Continuous Deployment avec Jenkins</a></li><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-BigDataavecHadoop">Big Data avec Hadoop</a></li><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-Troubleshootingd%E2%80%99application">Troubleshooting d’application</a></li><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-MongoDB">MongoDB</a></li><li><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-D%C3%A9ploiementContinuavecDeployIt">Déploiement Continu avec DeployIt</a></li></ul></li><li><strong><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-XebiavousproposedegagnerunMacBookAir%5C%21">Xebia vous propose de gagner un MacBook Air &#33;</a></strong></li><li><strong><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-Retrouveztousnosspeakers">Retrouvez tous nos speakers</a></strong></li><li><strong><a
href="http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/#DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-NemanquezpasCodestory%5C%21">Ne manquez pas Code story &#33;</a></strong></li></ul><h3><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-9miniTechEvent"></a>9 mini TechEvent</h3><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-LegoMindstormFight"></a>Lego Mindstorm Fight</h4><p><a
href="http://blog.xebia.fr/2012/04/16/devoxx-france-j-2-etes-vous-prets-a-combattre/" rel="nofollow">Programmez votre robot en Java sur notre stand et affrontez ceux des autres participants dans un tournoi de sumo</a>.<br
/> <em>Par sessions de 30 minutes : Mercredi à 12h30 ; Jeudi à 11h00, 12h55 et 16h30 ; Vendredi à 12h55 et 16h30.</em></p><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-D%C3%A9couvrezlaProgrammationFonctionnelle"></a>Découvrez la Programmation Fonctionnelle</h4><p>Envie de voir à quoi ressemblera les lambda dans Java 8 ? Découvrez les en action dans cet atelier de programmation fonctionnelle en &laquo;&nbsp;pairant&nbsp;&raquo; avec un xebian. Au programme : Java 8, flèches, Guava, cartes et ticket.<em>Par sessions de 15 minutes : Jeudi à 10h45 et 17h55.</em></p><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-TDDenPairProgramming"></a>TDD en Pair Programming</h4><p>Que vous soyez Padawan ou Jedi, venez découvrir ou vous améliorer en TDD.<br
/> <em>Par sessions de 15 minutes : Jeudi à 12h25 et 15h25.</em></p><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-D%C3%A9ployezduGrailssurHeroku"></a>Déployez du Grails sur Heroku</h4><p>Une application Facebook en 15 minutes avec Grails et Heroku. Deviendrez-vous le prochain Instagram ?<br
/> <em>Par sessions de 15 minutes : Jeudi à 12h40 et vendredi à 15h25.</em></p><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-ContinuousDeploymentavecJenkins"></a>Continuous Deployment avec Jenkins</h4><p>Scriptez le déploiement continu d’une appli avec Jenkins et Rundeck.<br
/> <em>Par sessions de 15 minutes : Mercredi à 11h00 et vendredi à 14h20.</em></p><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-BigDataavecHadoop"></a>Big Data avec Hadoop</h4><p>Découvrez les bases du map /reduce avec Hadoop en mettant en valeur les mots-clés les   plus twittés de Devoxx.<br
/> <em>Par sessions de 15 minutes : Mercredi à 15h00 et vendredi à 10h45.</em></p><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-Troubleshootingd%E2%80%99application"></a>Troubleshooting d’application</h4><p>Devenez un héros de la performance en traquant impitoyablement les bugs de notre application web.<br
/> <em>Une session de 30 minutes : Vendredi à 11h00.</em></p><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-MongoDB"></a>MongoDB</h4><p>Mettez un pied dans le NoSql avec le phénomène du moment.<br
/> <em>Par sessions de 15 minutes : Jeudi à 14h20 et vendredi à 12h25.</em></p><h4><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-D%C3%A9ploiementContinuavecDeployIt"></a>Déploiement Continu avec DeployIt</h4><p>Découvrez DeployIt, un outil d’automatisation des déploiements.<br
/> <em>Par sessions de 15 minutes : Mercredi à 17h15 et 17h55.</em></p><h3><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-XebiavousproposedegagnerunMacBookAir%5C%21"></a>Xebia vous propose de gagner un MacBook Air !</h3><p>Pour gagner, n’oubliez pas de vous inscrire à notre tirage au sort,  via le formulaire d’inscription de notre <a
href="http://blog.xebia.fr/2012/04/10/une-application-mobile-devoxx-france-2012-pour-tous/" rel="nofollow">application Mobile Devoxx France 2012</a>.<br
/> Vous pouvez aussi vous inscrire directement sur notre stand.<br
/> Le tirage au sort aura lieu jeudi 19 avril, à 19h00.</p><h3><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-Retrouveztousnosspeakers"></a>Retrouvez tous nos speakers</h3><ul><li><b><a
href="http://devoxx.xebia.fr/#presentation?id=1335" rel="nofollow">BigData et Hadoop au secours de téraoctets de logs inexploitables chez l&#8217;un des plus grands sites marchands du web européen</a></b>, par <a
href="http://blog.xebia.fr/author/plopez/" rel="nofollow">Pablo Lopez</a>, jeudi à 17h00/17h55 <em>(salle la seine C)</em>.</li><li><b><a
href="http://devoxx.xebia.fr/#presentation?id=1330" rel="nofollow">Pour un développement durable</a></b>, par <a
href="http://blog.xebia.fr/author/fdubois/" rel="nofollow">Frédéric Dubois</a>, jeudi à 18h05/19h00 <em>(salle la seine C)</em>.</li><li><b><a
href="http://devoxx.xebia.fr/#presentation?id=1303" rel="nofollow">Changeons la conception de nos applications grâce aux services Cloud</a></b>, par <a
href="http://blog.xebia.fr/author/cleclerc/" rel="nofollow">Cyrille Le Clerc</a>, vendredi à 11h30/12h25 <em>(salle la seine B)</em>.</li></ul><h3><a
name="DevoxxFrance-D%C3%A9couvrezleprogrammedustandXebia-NemanquezpasCodestory%5C%21"></a>Ne manquez pas Code story !</h3><p><a
href="http://devoxx.xebia.fr/#speaker?id=1382" rel="nofollow">David Gageot</a> et <a
href="http://blog.xebia.fr/author/jlmorlhon/" rel="nofollow">Jean-Laurent de Morlhon</a>, coderont avec leur équipe <em>(</em><em><a
href="http://devoxx.xebia.fr/#speaker?id=1743" rel="nofollow">Eric Le Merdy</a></em> <em>&amp;</em> <em><a
href="http://devoxx.xebia.fr/#speaker?id=1745" rel="nofollow">Sébastian Le Merdy</a></em><em>)</em> une application en direct pendant 2 jours.<br
/> L’idée : <a
href="http://www.code-story.net/2011/11/17/but.html" rel="nofollow">Produire une application exceptionnelle tout en montrant au public des techniques exceptionnelles</a>.</p><p><b>L&#8217;équipe Xebia vous souhaite un excellent Devoxx France 2012 !</b></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/17/devoxx-france-decouvrez-le-programme-du-stand-xebia/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2012/04/17/revue-de-presse-xebia-2012-16/</link> <comments>http://blog.xebia.fr/2012/04/17/revue-de-presse-xebia-2012-16/#comments</comments> <pubDate>Tue, 17 Apr 2012 07:53:03 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Agile]]></category> <category><![CDATA[Amazon]]></category> <category><![CDATA[cloudsearch]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Lucene]]></category> <category><![CDATA[Serious games]]></category> <category><![CDATA[Solr]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11283</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. Actualité éditeurs / SSII Amazon dévoile CloudSearch (par Bertrand Dechoux) &#8230;Et Apache dévoile Lucene et Solr 3.6 (par Alexandre Dutra) Agilité Premier Agile Games France (par Gilles Mantel) Web Frameworks en Javascript : réactifs et innombrables &#33; (par Jean Helou) Actualité éditeurs / SSII [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/04/17/revue-de-presse-xebia-2012-16/#RevuedePresseXebia-Amazond%C3%A9voileCloudSearch%28parBertrandDechoux">Amazon dévoile CloudSearch</a> <em>(par <a
href="http://blog.xebia.fr/author/bdechoux" rel="nofollow">Bertrand Dechoux</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/04/17/revue-de-presse-xebia-2012-16/#RevuedePresseXebia-...EtApached%C3%A9voileLuceneetSolr3.6%28parAlexandreDutra">&#8230;Et Apache dévoile Lucene et Solr 3.6</a> <em>(par <a
href="http://blog.xebia.fr/author/adutra" rel="nofollow">Alexandre Dutra</a>)</em></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/04/17/revue-de-presse-xebia-2012-16/#RevuedePresseXebia-PremierAgileGamesFrance%28parGillesMantel">Premier Agile Games France</a> <em>(par <a
href="http://blog.xebia.fr/author/gmantel" rel="nofollow">Gilles Mantel</a>)</em></li></ul><p><strong>Web</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/04/17/revue-de-presse-xebia-2012-16/#RevuedePresseXebia-FrameworksenJavascript%3Ar%C3%A9actifsetinnombrables%5C%21%28parJeanHelou">Frameworks en Javascript : réactifs et innombrables &#33;</a> <em>(par <a
href="http://blog.xebia.fr/author/jhelou" rel="nofollow">Jean Helou</a>)</em></li></ul><h3><a
name="RevuedePresseXebia-Actualit%C3%A9%C3%A9diteurs%2FSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="RevuedePresseXebia-Amazond%C3%A9voileCloudSearch%28parBertrandDechoux"></a>Amazon dévoile CloudSearch</h4><p>Amazon <a
href="http://www.allthingsdistributed.com/2012/04/amazon-cloudsearch.html" rel="nofollow">ajoute un moteur de recherche</a> en mode PAAS à son portefeuille de services: <a
href="http://aws.amazon.com/cloudsearch/" rel="nofollow">CloudSearch</a>. Le <a
href="http://aws.amazon.com/cloudsearch/pricing/" rel="nofollow">coût</a> est lié aux nombres et à la taille des instances, <a
href="http://aws.amazon.com/cloudsearch/faqs/#Do_I_need_to_select_the_number_and_type_of_search_instances" rel="nofollow">Amazon déterminant quelle est la meilleure configuration</a>. Ce nouveau produit est une sérieuse alternative à l&#8217;utilisation d&#8217;un cluster <a
href="http://lucene.apache.org/solr/" rel="nofollow">Solr</a> ou <a
href="http://www.elasticsearch.org/" rel="nofollow">ElasticSearch</a> qu&#8217;il faut administrer par soi-même. CloudSearch est actuellement en bêta, limité à un maximum de 50 instances et possède certaines limites comme l&#8217;explique la <a
href="http://aws.amazon.com/cloudsearch/faqs/" rel="nofollow">FAQ</a> et le <a
href="https://forums.aws.amazon.com/forum.jspa?forumID=137" rel="nofollow">forum</a>. L&#8217;anglais est la <a
href="http://aws.amazon.com/cloudsearch/faqs/#What_languages_does_Amazon_CloudSearch_support" rel="nofollow">seule langue supportée</a> et le moteur ne supporte a priori pas le <em>highlighting</em> ou les recherches spatiales. Mais on peut s&#8217;attendre à voir cette offre s&#8217;améliorer, une fois le business model confirmé.</p><h4><a
name="RevuedePresseXebia-...EtApached%C3%A9voileLuceneetSolr3.6%28parAlexandreDutra"></a>&#8230;Et Apache dévoile Lucene et Solr 3.6</h4><p>Hasard du calendrier: Apache vient d&#8217;annoncer la sortie conjointe de <a
href="http://wiki.apache.org/lucene-java/ReleaseNote36" rel="nofollow">Lucene</a> et <a
href="http://wiki.apache.org/solr/ReleaseNote36" rel="nofollow">Solr</a> en version 3.6.</p><p>Parmi les nouveautés à la clé, outre le support emblématique de Java 7, nous pouvons citer les suivantes:</p><ul><li>Analyse et recherche:<ul><li>Le filtre <code>HTMLStripCharFilter</code>, utile pour indexer du texte en HTML/XML, a subi un lifting complet corrigeant de nombreux bugs tout en en améliorant les performances.</li><li>De nombreux analyseurs sont désormais capables d&#8217;appliquer automatiquement une insensibilité à la casse aux recherches de type <em>wildcard</em> portant sur des champs de type <code>TextField</code>; cela se fait par l&#8217;ajout d&#8217;un attribut <code>ignoreCaseForWildcards="true"</code> à la déclaration du champ.</li><li>De nouveaux analyseurs et tokenizers pour le Japonais, fondés sur <a
href="http://www.atilika.org/" rel="nofollow">Kuromoji</a>, permettent désormais une prise en charge <em>out-of-the-box</em> du Japonais dans Solr.</li></ul></li><li>Mémoire et Performance:<ul><li>En plus du cache <a
href="http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used" rel="nofollow">LRU</a>, un nouveau cache <a
href="http://en.wikipedia.org/wiki/Cache_algorithms#Least-Frequently_Used" rel="nofollow">LFU</a> est désormais disponible; un cache <a
href="http://en.wikipedia.org/wiki/Cache_algorithms#Adaptive_Replacement_Cache" rel="nofollow">ARC</a> serait également à l&#8217;étude.</li><li>Amélioration des performances de tous les <em>suggesters</em> fondés sur des automates de type <a
href="http://fr.wikipedia.org/wiki/Transducteur_fini" rel="nofollow">Transducteur fini</a>.</li></ul></li><li>Mode cluster:<ul><li>Le <em>faceting</em> par plage de valeurs (dates et nombres) est désormais compatible avec Solr en mode distribué.</li><li>Nouvelles options pour la configuration des niveaux de concurrence pour les recherches distribuées: le pool de threads utilisé par les noeuds agrégateurs est désormais totalement configurable pour un équilibre optimal entre débit et latence.</li></ul></li><li>API cliente (SolrJ):<ul><li>Un nouveau connecteur SolrJ est disponible, s&#8217;appuyant sur Apache <a
href="http://hc.apache.org/" rel="nofollow">Http Components</a>, le successeur de Commons HttpClient.</li><li><code>StreamingUpdateSolrServer</code>, l&#8217;implémentation recommandée en cas de mises à jour massives en mode batch, supporte désormais tous les formats reconnus, y compris le protocole binaire propre à Solr (aka <a
href="http://wiki.apache.org/solr/javabin" rel="nofollow">Javabin</a>).</li></ul></li></ul><p>A noter que la version 3.6 sera probablement la dernière de la branche 3.x de Lucene, qui a <a
href="http://wiki.apache.org/lucene-java/ReleaseNote36" rel="nofollow">fêté ses 10 bougies</a> l&#8217;année dernière. La version 4.0 de ce qu&#8217;il convient désormais d&#8217;appeler le projet unifié Lucene/Solr devrait notamment apporter <a
href="http://wiki.apache.org/solr/SolrCloud" rel="nofollow">SolrCloud</a>, mais celle-ci n&#8217;a pas encore de date de sortie arrêtée, bien qu&#8217;une bêta release <a
href="http://search-lucene.com/m/iC2wPhQU4F" rel="nofollow">semble se préciser</a>.</p><h3><a
name="RevuedePresseXebia-Agilit%C3%A9"></a>Agilité</h3><h4><a
name="RevuedePresseXebia-PremierAgileGamesFrance%28parGillesMantel"></a>Premier Agile Games France</h4><p>Les 11 et 12 Mai prochains se tiendra à Nantes la première conférence uniquement basée sur les jeux en milieu professionnel. Devant le succès de ce thème lors d&#8217;événements agiles, comme la <a
href="http://www.meetup.com/frenchsug/events/37782582/" rel="nofollow">Scrum Night</a> en décembre dernier, et l&#8217;utilisation grandissante des jeux pédagogiques en milieu professionnel, un <a
href="https://groups.google.com/group/agiles-games-france?hl=fr" rel="nofollow">petit groupe d&#8217;agilistes</a> a mis au point cette conférence <a
href="http://www.agilex.fr/2011/10/conference-agile-game-en-france/" rel="nofollow">en s&#8217;inspirant</a> des références que sont Play4Agile en Allemagne, ou Agile Games à Boston. Cette conférence est organisée sur le format Open Space, c&#8217;est-à-dire sans ordre du jour précis: venez avec vos jeux, ou avec la liste de ceux auxquels vous voudriez jouer, et vous trouverez des participants pour partager une expérience enrichissante. Cette conférence sera sûrement le bon moment pour découvrir ou redécouvrir des jeux agiles qui ont prouvé leur efficacité comme le <a
href="http://www.xp.be/xpgame.html/" rel="nofollow">XP Game</a>, ou le <a
href="http://www.xp.be/businessvaluegame.html/" rel="nofollow">Business Value Game</a>, mais aussi de jouer à des jeux plus expérimentaux comme <a
href="http://fearlessjourney.info/" rel="nofollow">FearlessJourney</a>. Vous pouvez réserver votre place dès maintenant sur la <a
href="http://www.weezevent.com/Agile-Games-France-2012" rel="nofollow">billetterie en ligne</a> ou lire le <a
href="https://sites.google.com/site/agilegamesfrance/communique-de-presse" rel="nofollow">communiqué de presse</a> si vous souhaitez plus d&#8217;information.</p><h3><a
name="RevuedePresseXebia-Web"></a>Web</h3><h4><a
name="RevuedePresseXebia-FrameworksenJavascript%3Ar%C3%A9actifsetinnombrables%5C%21%28parJeanHelou"></a>Frameworks en Javascript : réactifs et innombrables !</h4><p>Le site &laquo;&nbsp;<em>A list apart</em>&nbsp;&raquo; nous propose un article sur <a
href="http://www.alistapart.com/articles/dive-into-responsive-prototyping-with-foundation/" rel="nofollow">la création rapide de prototypes d&#8217;IHM réactive</a> en Javascript avec le framework <a
href="http://foundation.zurb.com/" rel="nofollow">Foundation</a>. Si vous vous demandez ce qu&#8217;est une application réactive, vous trouverez sur le même site un article expliquant <a
href="http://www.alistapart.com/articles/responsive-web-design/" rel="nofollow">la conception web réactive</a>. En deux mots, il s&#8217;agit d&#8217;avoir un site dont le contenu et la mise en page s&#8217;ajustent automatiquement à la taille de la zone de rendu. Le framework Foundation est un concurrent de <a
href="http://twitter.github.com/bootstrap/" rel="nofollow">Twitter Bootstrap</a>, qui tente d&#8217;éviter l&#8217;uniformisation naturelle amenée par ce type de framework en incitant fortement la surcharge de l&#8217;apparence de par sa conception. Foundation ne favorise pas le mobile et n&#8217;est pas totalement sémantique mais il ne pollue pas trop le code HTML et offre quand même des moyens d&#8217;ajuster le layout pour le mobile et mérite d&#8217;être investigué ne serait-ce que pour du prototypage.<br
/> Dans le même temps, Scott Hanselman publie <a
href="http://www.hanselman.com/blog/TheBigGlossaryOfOpenSourceJavaScriptAndWebFrameworksWithCoolNames.aspx" rel="nofollow">un glossaire, ou plutôt une liste</a>, de frameworks web et Javascript open source &laquo;&nbsp;<em>with cool names</em>&laquo;&nbsp;. A sa lecture, on voit vite que le choix d&#8217;un framework ou d&#8217;une librairie n&#8217;est pas encore aussi simple qu&#8217;il peut l&#8217;être côté serveur où les choix sont plus restreints et peut-être plus mûrs. Ces frameworks sont plutôt orientés sur l&#8217;organisation et la mise en oeuvre de logiques métiers côté client: ils viennent donc en complément de Foundation ou de Bootstrap.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/17/revue-de-presse-xebia-2012-16/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Devoxx France J-2 &#8211; Etes vous prêts à combattre ?</title><link>http://blog.xebia.fr/2012/04/16/devoxx-france-j-2-etes-vous-prets-a-combattre/</link> <comments>http://blog.xebia.fr/2012/04/16/devoxx-france-j-2-etes-vous-prets-a-combattre/#comments</comments> <pubDate>Mon, 16 Apr 2012 10:14:51 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Devoxx]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11246</guid> <description><![CDATA[Pour cette première édition de Devoxx en France, Xebia vous a concocté son lot de surprises tout au long de ces 3 jours de conférence ! La première d’entre elles, c’est notre Lego Mindstorm Battle. Programmez votre robot en java et affrontez ceux des autres participants dans un tournoi de sumo ! Le tournoi débutera [...]]]></description> <content:encoded><![CDATA[<p>Pour cette première édition de Devoxx en France, Xebia vous a concocté son lot de surprises tout au long de ces 3 jours de conférence ! La première d’entre elles, c’est notre <b>Lego Mindstorm Battle</b>.</p><p><b>Programmez votre robot en java et affrontez ceux des autres participants dans un tournoi de sumo !</b></p><div
align="center"> <iframe
src="http://player.vimeo.com/video/40296837?color=6d0091" width="720" height="405" frameborder="0" webkitallowfullscreen="webkitAllowFullScreen" mozallowfullscreen="mozallowfullscreen" allowfullscreen="allowFullScreen"></iframe></div><p>Le tournoi débutera mercredi à 12h30 sur le stand de Xebia et se terminera le vendredi à 16h30 par un tirage au sort sur l&#8217;ensemble des participants pour déterminer le grand gagnant d&#8217;un super <a
href="http://mindstorms.lego.com/" rel="nofollow">Robot Lego Mindstorm</a> ! Des goodies Lego et des decks <a
href="http://blog.xebia.fr/xebia-essentials/" rel="nofollow">Xebia Essentials</a> sont également mis en jeu !</p><p>Rendez-vous sur notre stand dès mercredi <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/16/devoxx-france-j-2-etes-vous-prets-a-combattre/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Talend Open Studio par Cedric Carbone au Hadoop User Group France</title><link>http://blog.xebia.fr/2012/04/13/talend-open-studio-par-cedric-carbone-au-hadoop-user-group-france/</link> <comments>http://blog.xebia.fr/2012/04/13/talend-open-studio-par-cedric-carbone-au-hadoop-user-group-france/#comments</comments> <pubDate>Fri, 13 Apr 2012 10:05:08 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Hadoop]]></category> <category><![CDATA[Talend]]></category> <category><![CDATA[Talend Open Studio]]></category> <category><![CDATA[vidéo]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11240</guid> <description><![CDATA[Cedric Carbone présente Talend Open Studio au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012. Tous les podcasts Xebia France :]]></description> <content:encoded><![CDATA[<p><a
href="https://twitter.com/#!/carbone" rel="nofollow">Cedric Carbone</a> présente <a
href="http://fr.talend.com/products-big-data/open-studio-bd.php" rel="nofollow">Talend Open Studio</a> au premier <a
href="https://twitter.com/#!/hugfrance" rel="nofollow">Hadoop User Group France</a> qui s&#8217;est déroulé chez Xebia le 15 mars 2012.</p><div
align="center"> <iframe
src="http://player.vimeo.com/video/39612816?color=6d0091" width="720" height="405" frameborder="0" webkitallowfullscreen="webkitAllowFullScreen" mozallowfullscreen="mozallowfullscreen" allowfullscreen="allowFullScreen"></iframe></div><div
align="center"><div
style="width:425px" id="__ss_12165264"> <iframe
src="http://www.slideshare.net/slideshow/embed_code/12165264" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></div></div><hr
/> <strong>Tous les podcasts Xebia France :</strong></p><ul><li><a
href="itpc://blog.xebia.fr/feed/podcast/" title="Subscribe to the Podcast Feed with iTunes"><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/itunes.png" alt="Subscribe with iTunes" /></a></li><li><a
href="http://blog.xebia.fr/feed/podcast/" title="Les podcasts de Xebia France vous permettent de suivre l'actualité autour de Java, de l'agilité, des technologies Web et bien d'autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile."><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/feed_button-rss-podcast.png" alt="Xebia France Podcast Feed" /></a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/13/talend-open-studio-par-cedric-carbone-au-hadoop-user-group-france/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <enclosure
url="http://xebia-video.s3-website-eu-west-1.amazonaws.com/2012-03/xfr-hadoop-user-group-france-2012-03-talend-640x360.mp4" length="120082144" type="audio/mpeg" /> <itunes:duration>0:22:24</itunes:duration> <itunes:subtitle>Cedric Carbone présente Talend Open Studio au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012.
Tous les podcasts Xebia France : </itunes:subtitle> <itunes:summary>Cedric Carbone présente Talend Open Studio au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012.
Tous les podcasts Xebia France : </itunes:summary> <itunes:author>Xebia France</itunes:author> <itunes:explicit>no</itunes:explicit> <itunes:block>no</itunes:block> </item> <item><title>Scrum Master Academy &#8211; Règle N°1 &#8211; Connais tes valeurs agiles</title><link>http://blog.xebia.fr/2012/04/13/scrum-master-academy-regle-n1-connais-tes-valeurs-agiles/</link> <comments>http://blog.xebia.fr/2012/04/13/scrum-master-academy-regle-n1-connais-tes-valeurs-agiles/#comments</comments> <pubDate>Fri, 13 Apr 2012 04:39:46 +0000</pubDate> <dc:creator>Gilles Mantel</dc:creator> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Agile]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[Scrum Master Academy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11232</guid> <description><![CDATA[Avant de détailler la première règle, je souhaite vous préciser un principe général de notre liste : toutes les règles s&#8217;adressent aux Scrum Masters, elles sont donc formulées au présent de l&#8217;impératif. Bien sûr n&#8217;importe quel membre de l&#8217;équipe peut s&#8217;approprier ces règles, mais le Scrum Master est la pierre angulaire de la bonne application [...]]]></description> <content:encoded><![CDATA[<p>Avant de détailler la première règle, je souhaite vous préciser un principe général de notre liste : toutes les règles s&#8217;adressent aux Scrum Masters, elles sont donc formulées au présent de l&#8217;impératif. Bien sûr n&#8217;importe quel membre de l&#8217;équipe peut s&#8217;approprier ces règles, mais le Scrum Master est la pierre angulaire de la bonne application de Scrum. Dans un passé lointain où j&#8217;étais ingénieur qualité, on parlait beaucoup de 2 niveaux de qualité : la qualité du produit et la qualité du processus. Le Scrum Master est garant de la qualité du processus, même s&#8217;il n&#8217;en est pas le dépositaire unique. Nous avons donc adressé cette liste de règles au garant de la qualité du processus.</p><p>Les règles ne sont pas classées dans un ordre précis, ni même regroupées par thème. Même si certaines le sont parfois, nous les avons simplement listées dans l&#8217;ordre de notre réflexion. En revanche, nous avons choisi avec soin la règle n°1 car c&#8217;est une place symbolique et il fallait une règle emblématique. La règle n°1 c&#8217;est là où tout commence, la base de la base, la règle dont on se souvient.</p><h3><a
name="ScrumMasterAcademy-R%C3%A8gleN%C2%B01-Connaistesvaleursagiles-R%C3%A8glen%C2%B01%3AConnaistesvaleursagiles"></a>Règle n°1 : Connais tes valeurs agiles</h3><p>Nous commençons donc notre liste avec une règle pleine de bon sens et à la limite de l&#8217;évidence pour tout agiliste qui se respecte. Mais la réalité n&#8217;est hélas pas aussi triviale. Lors de notre session au Scrum Day et avant de dévoiler cette première règle, nous avons posé les questions suivantes à la cinquantaine de participants:</p><blockquote><p>- Qui pratique l&#8217;agilité au quotidien ? Pouvez-vous vous lever ?</p></blockquote><p>90% de la salle était debout.</p><blockquote><p>- Qui connait par coeur les 4 valeurs du Manifeste Agile ? Si vous ne pouvez pas citer les 4 de mémoire asseyez-vous</p></blockquote><p>Il restait moins de 10 personnes debout.</p><blockquote><p>- Qui connaît par coeur les 12 principes du Manifeste Agile ?</p></blockquote><p>Les dernières personnes debout se sont assises.</p><p>Cette étude de marché complètement improvisée est malheureusement assez représentative de notre niveau de maîtrise <a
href="http://agilemanifesto.org/" rel="nofollow">des valeurs de l&#8217;agilité</a>. Et je m&#8217;inclus dans ce constat, car je suis bien incapable de citer de mémoire les <a
href="http://agilemanifesto.org/principles.html" rel="nofollow">12 principes</a> qui découlent des 4 valeurs. Il se trouve que le manifeste agile est plein de bonnes ressources et que les réponses à certains des problèmes que nous rencontrons sur le terrain se trouvent souvent dans ce manifeste.</p><p>Le manifeste agile nous pousse également à garder du discernement dans l&#8217;application d&#8217;une méthode agile. Tout agiliste fait des compromis avec la méthode qu&#8217;il applique, que ce soit Scrum, XP, ou autre. Ce qui est important c&#8217;est d&#8217;être cohérent avec les valeurs qui sous-tendent cette méthode, et ces valeurs sont celles du manifeste. Par exemple, je vois sur le terrain des équipes se perdre dans des débats sur par exemple le manque de formalisme des critères d&#8217;acceptation, alors même que le Product Owner est un nouvel arrivant qui connaît à peine son produit. Voici un syndrome typique d&#8217;une équipe qui a remis l&#8217;accent sur le suivi d&#8217;un processus, certes agile, plutôt que de chercher si les individus sont les bons et s&#8217;ils ont les bonnes interactions avec eux.</p><p>Autre exemple d&#8217;un principe souvent oublié: &laquo;&nbsp;Business people and developers must work together <b>daily</b> throughout the project.&nbsp;&raquo; Est-ce le cas dans votre projet agile ?</p><p>Beaucoup des règles qui suivent dans notre liste ne seront qu&#8217;une pâle redite du manifeste, c&#8217;est pour cela que s&#8217;il ne doit rester qu&#8217;une règle c&#8217;est la n°1. Relisez le manifeste et les 12 principes qui en découlent. Si vous avez réappris un élément de base, laissez nous un commentaire <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><p>A venir : règle n°2 &#8211; Le Manifeste Agile n&#8217;est pas la déclaration des droits du développeur.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/13/scrum-master-academy-regle-n1-connais-tes-valeurs-agiles/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>JavaScript Core par Nicolas Demengel et François Sarradin</title><link>http://blog.xebia.fr/2012/04/12/javascript-core-par-nicolas-demengel-et-francois-sarradin/</link> <comments>http://blog.xebia.fr/2012/04/12/javascript-core-par-nicolas-demengel-et-francois-sarradin/#comments</comments> <pubDate>Thu, 12 Apr 2012 08:00:49 +0000</pubDate> <dc:creator>Nicolas Demengel</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[vidéo]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10710</guid> <description><![CDATA[Lors de notre XKE de février, Nicolas et François nous ont présenté les bases du langage JavaScript en guise d&#8217;introduction à des exercices pratiques. Vous pouvez retrouver cette présentation vidéo dans cet article et ainsi découvrir toutes le possibilités mais aussi les pièges de ce langage du Web difficilement contournable. &#160; Tous les podcasts Xebia [...]]]></description> <content:encoded><![CDATA[<p>Lors de notre <a
href="http://blog.xebia.fr/tag/xke/" rel="nofollow">XKE</a> de février, <a
href="http://blog.xebia.fr/author/ndemengel/" rel="nofollow">Nicolas</a> et <a
href="http://blog.xebia.fr/author/fsarradin/" rel="nofollow">François</a> nous ont présenté les bases du langage JavaScript en guise d&#8217;introduction à des exercices pratiques. Vous pouvez retrouver cette présentation vidéo dans cet article et ainsi découvrir toutes le possibilités mais aussi les pièges de ce langage du Web difficilement contournable.</p><p><script src="http://code.jquery.com/jquery-1.7.1.min.js" type="text/javascript"></script><br
/> <script src="http://a.vimeocdn.com/js/froogaloop2.js" type="text/javascript"></script><br
/> <script src="http://s3-eu-west-1.amazonaws.com/xebia-video/vimeo-slides-sync-1.0.0.min.js" type="text/javascript"></script></p><div
style="float: left;"><iframe
id="javascript-core" src="http://player.vimeo.com/video/36673916?api=1&#038;player_id=javascript-core&#038;color=6d0091" width="360" height="260" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div><div
id="javascript-core-slides" style="width: 360px; height: 260px; float: left;"></div><style type="text/css">#javascript-core-slides > img {
  width: 360px;
  height: 260px;
}</style><p><script type="text/javascript">$(function() {
  $("#javascript-core").vimeoSlidesSync([
    {src: "/videos/javascript-core-slides/javascript-core-01.jpg", timing: "00:00"},
    {src: "/videos/javascript-core-slides/javascript-core-02.jpg", timing: "00:09"},
    {src: "/videos/javascript-core-slides/javascript-core-03.jpg", timing: "01:46"},
    {src: "/videos/javascript-core-slides/javascript-core-04.jpg", timing: "04:42"},
    {src: "/videos/javascript-core-slides/javascript-core-05.jpg", timing: "06:34"},
    {src: "/videos/javascript-core-slides/javascript-core-06.jpg", timing: "06:53"},
    {src: "/videos/javascript-core-slides/javascript-core-07.jpg", timing: "07:30"},
    {src: "/videos/javascript-core-slides/javascript-core-08.jpg", timing: "08:41"},
    {src: "/videos/javascript-core-slides/javascript-core-09.jpg", timing: "12:02"},
    {src: "/videos/javascript-core-slides/javascript-core-10.jpg", timing: "14:57"},
    {src: "/videos/javascript-core-slides/javascript-core-11.jpg", timing: "16:07"},
    {src: "/videos/javascript-core-slides/javascript-core-12.jpg", timing: "16:40"},
    {src: "/videos/javascript-core-slides/javascript-core-13.jpg", timing: "17:46"},
    {src: "/videos/javascript-core-slides/javascript-core-14.jpg", timing: "18:14"},
    {src: "/videos/javascript-core-slides/javascript-core-15.jpg", timing: "19:01"},
    {src: "/videos/javascript-core-slides/javascript-core-16.jpg", timing: "20:45"},
    {src: "/videos/javascript-core-slides/javascript-core-17.jpg", timing: "22:35"},
    {src: "/videos/javascript-core-slides/javascript-core-18.jpg", timing: "24:04"},
    {src: "/videos/javascript-core-slides/javascript-core-19.jpg", timing: "24:53"},
    {src: "/videos/javascript-core-slides/javascript-core-20.jpg", timing: "25:20"},
    {src: "/videos/javascript-core-slides/javascript-core-21.jpg", timing: "26:09"},
    {src: "/videos/javascript-core-slides/javascript-core-22.jpg", timing: "27:37"},
    {src: "/videos/javascript-core-slides/javascript-core-23.jpg", timing: "28:20"},
    {src: "/videos/javascript-core-slides/javascript-core-24.jpg", timing: "28:32"},
    {src: "/videos/javascript-core-slides/javascript-core-25.jpg", timing: "29:47"},
    {src: "/videos/javascript-core-slides/javascript-core-26.jpg", timing: "31:33"},
    {src: "/videos/javascript-core-slides/javascript-core-27.jpg", timing: "33:52"},
    {src: "/videos/javascript-core-slides/javascript-core-28.jpg", timing: "35:16"},
    {src: "/videos/javascript-core-slides/javascript-core-29.jpg", timing: "36:51"},
    {src: "/videos/javascript-core-slides/javascript-core-30.jpg", timing: "39:01"},
    {src: "/videos/javascript-core-slides/javascript-core-29.jpg", timing: "39:28"},
    {src: "/videos/javascript-core-slides/javascript-core-31.jpg", timing: "41:08"},
    {src: "/videos/javascript-core-slides/javascript-core-32.jpg", timing: "44:10"},
    {src: "/videos/javascript-core-slides/javascript-core-33.jpg", timing: "46:12"},
    {src: "/videos/javascript-core-slides/javascript-core-01.jpg", timing: "47:50"},
  ]);
});</script></p><div
style="clear: both;">&nbsp;</div><hr/> <strong>Tous les podcasts Xebia France :</strong></p><ul><li><a
href="itpc://blog.xebia.fr/feed/podcast/" title="Subscribe to the Podcast Feed with iTunes"><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/itunes.png" class="podpress_feed_buttons" alt="Subscribe with iTunes"></a></li><li><a
href="http://blog.xebia.fr/feed/podcast/" title="Les podcasts de Xebia France vous permettent de suivre l'actualité autour de Java, de l'agilité, des technologies Web et bien d'autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile."><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/feed_button-rss-podcast.png" class="podpress_feed_buttons" alt="Xebia France Podcast Feed"></a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/12/javascript-core-par-nicolas-demengel-et-francois-sarradin/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <enclosure
url="http://xebia-video.s3-website-eu-west-1.amazonaws.com/2012-04/xfr-javascript-core-640x360.mp4" length="202242966" type="audio/mpeg" /> <itunes:duration>1:00:29</itunes:duration> <itunes:subtitle>Lors de notre XKE de février, Nicolas et François nous ont présenté les bases du langage JavaScript en guise d&#8217;introduction à des exercices pratiques. Vous pouvez retrouver cette présentation vidéo dans cet article et ainsi découvrir toutes le[...]</itunes:subtitle> <itunes:summary>Lors de notre XKE de février, Nicolas et François nous ont présenté les bases du langage JavaScript en guise d&#8217;introduction à des exercices pratiques. Vous pouvez retrouver cette présentation vidéo dans cet article et ainsi découvrir toutes le possibilités mais aussi les pièges de ce langage du Web difficilement contournable.
&#160;
Tous les podcasts Xebia France : </itunes:summary> <itunes:author>Xebia France</itunes:author> <itunes:explicit>no</itunes:explicit> <itunes:block>no</itunes:block> </item> <item><title>Hadoop chez Kobojo par Yann Schwartz au Hadoop User Group France</title><link>http://blog.xebia.fr/2012/04/11/hadoop-chez-kobojo-par-yann-schwartz-au-hadoop-user-group-france/</link> <comments>http://blog.xebia.fr/2012/04/11/hadoop-chez-kobojo-par-yann-schwartz-au-hadoop-user-group-france/#comments</comments> <pubDate>Wed, 11 Apr 2012 06:26:42 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Hadoop]]></category> <category><![CDATA[vidéo]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11221</guid> <description><![CDATA[Yann Schwartz présente Hadoop chez Kobojo au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012. Tous les podcasts Xebia France :]]></description> <content:encoded><![CDATA[<p>Yann Schwartz présente Hadoop chez <a
href="http://www.kobojo.com/" rel="nofollow">Kobojo</a> au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012.</p><div
align="center"> <iframe
src="http://player.vimeo.com/video/39597715?color=6d0091" width="720" height="405" frameborder="0" webkitallowfullscreen="webkitAllowFullScreen" mozallowfullscreen="mozallowfullscreen" allowfullscreen="allowFullScreen"></iframe></div><div
align="center"><div
style="width:425px" id="__ss_12165241"> <iframe
src="http://www.slideshare.net/slideshow/embed_code/12165241" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></div></div><hr
/> <strong>Tous les podcasts Xebia France :</strong></p><ul><li><a
href="itpc://blog.xebia.fr/feed/podcast/" title="Subscribe to the Podcast Feed with iTunes"><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/itunes.png" alt="Subscribe with iTunes" /></a></li><li><a
href="http://blog.xebia.fr/feed/podcast/" title="Les podcasts de Xebia France vous permettent de suivre l'actualité autour de Java, de l'agilité, des technologies Web et bien d'autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile."><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/feed_button-rss-podcast.png" alt="Xebia France Podcast Feed" /></a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/11/hadoop-chez-kobojo-par-yann-schwartz-au-hadoop-user-group-france/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <enclosure
url="http://xebia-video.s3-website-eu-west-1.amazonaws.com/2012-03/xfr-hadoop-user-group-france-2012-03-kobojo-640x360.mp4" length="109522902" type="audio/mpeg" /> <itunes:duration>0:20:30</itunes:duration> <itunes:subtitle>Yann Schwartz présente Hadoop chez Kobojo au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012.
Tous les podcasts Xebia France : </itunes:subtitle> <itunes:summary>Yann Schwartz présente Hadoop chez Kobojo au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012.
Tous les podcasts Xebia France : </itunes:summary> <itunes:author>Xebia France</itunes:author> <itunes:explicit>no</itunes:explicit> <itunes:block>no</itunes:block> </item> <item><title>Une application Mobile Devoxx France 2012 pour tous !</title><link>http://blog.xebia.fr/2012/04/10/une-application-mobile-devoxx-france-2012-pour-tous/</link> <comments>http://blog.xebia.fr/2012/04/10/une-application-mobile-devoxx-france-2012-pour-tous/#comments</comments> <pubDate>Tue, 10 Apr 2012 11:30:42 +0000</pubDate> <dc:creator>Alexis Kinsella</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Devoxx]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11193</guid> <description><![CDATA[La première édition de Devoxx France arrive à grand pas. Mais peut-être cherchez-vous encore l&#8217;application qui vous accompagnera tout au long de ces trois jours ? Chez Xebia, nous nous sommes creusés le ciboulot pour vous proposer une solution originale et innovante qui soit utilisable sur votre téléphone préféré, qu&#8217;il soit équipé d&#8217;Android, d&#8217;iOS ou [...]]]></description> <content:encoded><![CDATA[<p>La première édition de Devoxx France arrive à grand pas. Mais peut-être cherchez-vous encore l&#8217;application qui vous accompagnera tout au long de ces trois jours ?</p><p>Chez Xebia, nous nous sommes creusés le ciboulot pour vous proposer une solution originale et innovante qui soit utilisable sur votre téléphone préféré, qu&#8217;il soit équipé d&#8217;Android, d&#8217;iOS ou bien encore d&#8217;un système super Geeky !!</p><h3><a
name="UneapplicationMobileDevoxxFrance2012pourtous%21-Fonctionnalit%C3%A9s"></a>Fonctionnalités</h3><p>Voici quelques fonctionnalités proposées par l&#8217;application :</p><ul><li>Détail du programme jour par jour <em>(disponible également par track et par salle)</em>.</li><li>Liste complète des speakers avec leur bio.</li><li>Gestion des favoris.</li><li>Mode offline et synchronisation des données</li><li>Le flux Twitter #DevoxxFR et #XebiaFR.</li><li>Le programme du stand Xebia, ainsi que l&#8217;enregistrement au jeu/concours !</li></ul><h3><a
name="UneapplicationMobileDevoxxFrance2012pourtous%21-Installation"></a>Installation</h3><p>Pour installer l&#8217;application, il suffit de choisir un des deux liens suivant ou bien de flasher son QR Code correspondant directement depuis votre téléphone !</p><div
align="center"><table><tbody><tr><th
align="center"> Web Mobile &#8211; Tout OS</th><th
align="center"> PhoneGap pour Android</th><th
align="center"> Google Chrome</th></tr><tr><td
align="center"> <a
href="http://devoxx.xebia.fr" rel="nofollow">http://devoxx.xebia.fr</a></td><td
align="center"> <a
href="https://play.google.com/store/apps/details?id=fr.xebia.devoxx" rel="nofollow">Cliquez ici !</a></td><td
align="center"> <a
href="https://chrome.google.com/webstore/detail/ajpicohfonkgbbbhefmgkmknboodlobb" rel="nofollow">Cliquez ici !</a></td></tr><tr><td> <span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/qrcode-devoxx-xebia-fr.png" vspace="4" width="155" style="border: 1px solid black" /></span></td><td> <span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/qrcode-playstore.png" vspace="4" width="155" style="border: 1px solid black" /></span></td><td> <span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/qrcode-google-chrome-store.png" vspace="4" width="155" style="border: 1px solid black" /></span></td></tr></tbody></table></div><h3><a
name="UneapplicationMobileDevoxxFrance2012pourtous%21-Codesource"></a>Code source</h3><p>Qu&#8217;en est-il du code source de l&#8217;application ? Chez Xebia, nous pensons que le partage des connaissances est une valeur essentielle. C&#8217;est pourquoi nous mettrons à disposition de tous le code source de l&#8217;application la semaine de la conférence. Cela sera l&#8217;occasion de découvrir nos petites recettes de fabrication d&#8217;applications mobiles !</p><h3><a
name="UneapplicationMobileDevoxxFrance2012pourtous%21-Lesindispensablesscreenshots%5C%21"></a>Les indispensables screenshots !</h3><div
align="center"><table><tbody><tr><td> <img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Xebia-Devoxx-Android-1.png" width="200" style="border: 1px solid black" /></td><td> <img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Xebia-Devoxx-Android-2.png" width="200" style="border: 1px solid black" /></td><td> <img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Xebia-Devoxx-Android-3.png" width="200" style="border: 1px solid black" /></td></tr><tr><td> <img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Xebia-Devoxx-Android-4.png" width="200" style="border: 1px solid black" /></td><td> <img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Xebia-Devoxx-Android-5.png" width="200" style="border: 1px solid black" /></td><td> </td></tr></tbody></table></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/10/une-application-mobile-devoxx-france-2012-pour-tous/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2012/04/10/revue-de-presse-xebia-2012-15/</link> <comments>http://blog.xebia.fr/2012/04/10/revue-de-presse-xebia-2012-15/#comments</comments> <pubDate>Tue, 10 Apr 2012 06:29:47 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Dart]]></category> <category><![CDATA[Hadoop]]></category> <category><![CDATA[java]]></category> <category><![CDATA[MacOS]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11207</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. Web Dart Hackathon, c’est l’Happy Hour chez Google &#33;﻿ (Par Mathieu Breton) Le coin de la technique Faille de sécurité Java sous Mac OS X (Par Matthieu Dumas) Evènements de notre communauté en France et à l&#8217;étranger Second meetup du Hadoop User Group France, [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><p><strong>Web</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/04/10/revue-de-presse-xebia-2012-15/#RevuedePresseXebia-DartHackathon%2Cc%E2%80%99estl%E2%80%99HappyHourchezGoogle%5C%21%EF%BB%BF">Dart Hackathon, c’est l’Happy Hour chez Google &#33;﻿</a> <em>(Par <a
href="https://twitter.com/#!/MatBreton" rel="nofollow">Mathieu Breton</a>)</em></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/04/10/revue-de-presse-xebia-2012-15/#RevuedePresseXebia-Failledes%C3%A9curit%C3%A9JavasousMacOSX">Faille de sécurité Java sous Mac OS X</a> <em>(Par <a
href="https://twitter.com/#!/matthieudumas" rel="nofollow">Matthieu Dumas</a>)</em></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/04/10/revue-de-presse-xebia-2012-15/#RevuedePresseXebia-SecondmeetupduHadoopUserGroupFrance%2Cle11Avril%C3%A0Paris">Second meetup du Hadoop User Group France, le 11 Avril à Paris</a> <em>(Par <a
href="http://blog.xebia.fr/author/bdechoux" rel="nofollow">Bertrand Dechoux</a>)</em></li></ul><h3><a
name="RevuedePresseXebia-Web"></a>Web</h3><h4><a
name="RevuedePresseXebia-DartHackathon%2Cc%E2%80%99estl%E2%80%99HappyHourchezGoogle%5C%21%EF%BB%BF"></a>Dart Hackathon, c’est l’Happy Hour chez Google !﻿</h4><p><span
style="float: left"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/dart-beer.png" width="50px" style="margin: 1em 1em 1em 1em;" /></span></p><p>Le Dart Hackathon est un évènement organisé par l’équipe Dart chez Google ayant pour but de vous faire essayer <a
href="http://www.dartlang.org/" rel="nofollow">Dart</a> le langage web de nouvelle génération made in Google.</p><blockquote><p><b>Un Hackathon ? Que nous dit Wikipédia ?</b><br
/> Un hackaton est un événement où des développeurs se réunissent pour faire de la programmation informatique collaborative, sur plusieurs jours. Le terme est un mot-valise constitué de hack et marathon.</p></blockquote><p>De fin avril à début mai dans plusieurs villes du globes, des équipes pourrons participer a ces &laquo;&nbsp;ateliers&nbsp;&raquo; animés par Google. Chaque équipe devra proposer une idée de projet, et la réaliser. Après démonstration et délibération des juges, des prix seront attribués à l’équipe ayant montrer la meilleur qualité technique. En plus de ces prix, chaque équipe gagnante dans les différentes villes pourra rencontrer l’équipe Dart à l’occasion d’une call conf.<br
/> Malheureusement pas de date prévu en France :(</p><p>Pour plus de détail, vous pouvez aller voir ici : <a
href="http://www.dartlang.org/hackathons/2012/happy-hour/" rel="nofollow">http://www.dartlang.org/hackathons/2012/happy-hour/</a>.</p><h3><a
name="RevuedePresseXebia-Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="RevuedePresseXebia-Failledes%C3%A9curit%C3%A9JavasousMacOSX"></a>Faille de sécurité Java sous Mac OS X</h4><p><span
color="#000000" style=";font-family=;font-size=;">Apple vient de sortir</span> <span
color="#000000" style=";font-family=;font-size=;"><a
href="http://support.apple.com/kb/HT5228?viewlocale=en_US&amp;locale=en_US" rel="nofollow">une mise à jour de sécurité</a></span> touchant<span
color="#000000" style=";font-family=;font-size=;"> la version</span> <span
color="#000000" style=";font-family=;font-size=;"><b>1.6.0 update 29</b></span> <span
color="#000000" style=";font-family=;font-size=;">de Java sous Mac OS X</span> <span
color="#000000" style=";font-family=;font-size=;"><b>Leopard</b></span> <span
color="#000000" style=";font-family=;font-size=;">(10.6) et</span> <span
color="#000000" style=";font-family=;font-size=;"><b>Lion</b></span> <span
color="#000000" style=";font-family=;font-size=;">(10.7). Ce patch vient notamment combler une faille de sécurité liée à une variante du malware Flashback (encore lui). Ce dernier conçerneraient plus d&#8217;un demi million d&#8217;utilisateurs Mac OS X (600 000 dont 4000 en France selon les estimations). Un bon nombre de journaux spécialisés et d&#8217;entreprises de sécurité en profitent d&#8217;ailleurs pour pointer du doigt le fait qu&#8217;OS X est loin d&#8217;être imperméable aux malwares, ceci remettant fortement en cause l&#8217;image de robustesse que s&#8217;était forgée la firme de Cupernito autour de ses produits. Par exemple, Trend Micro a produit une</span> <span
color="#000000" style=";font-family=;font-size=;"><a
href="http://www.trendmicro.fr/infographies/pourri-jusqu-a-l-os/index.html" rel="nofollow">infographie</a></span> <span
color="#000000" style=";font-family=;font-size=;">présentant 12 programmes malveillants à éviter sous Mac OS X.</span></p><p><span
color="#000000" style=";font-family=;font-size=;">Pour rappel, Flashback a été découvert en septembre 2011, tout d’abord sous la forme d’images érotiques, puis d’un document pdf et enfin d&#8217;un faux installeur du player Flash exécutable depuis Safari. A l’origine, le malware désactivait les paramètres de sécurité réseau et envoyait des données personnelles à destination d&#8217;un serveur distant via une porte dérobée.</span></p><p>La dernière variante du malware quant à elle, nom de code <a
href="http://www.f-secure.com/v-descs/trojan-downloader_osx_flashback_k.shtml" rel="nofollow">Flashback.K</a>, exploite la faille de sécurité du runtime Java <a
href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-0507" rel="nofollow">CVE-2012-0507</a>, <a
href="http://www.oracle.com/technetwork/topics/security/javacpufeb2012-366318.html" rel="nofollow">patchée par Oracle</a> <b>courant février</b> pour le système d&#8217;exploitation de Microsoft. Elle a été découverte par F-Secure, qui fournit un <a
href="http://www.f-secure.com/v-descs/trojan-downloader_osx_flashback_k.shtml" rel="nofollow">descriptif détaillée</a> du malware ainsi que des procédures pour vérifier sa présence et l&#8217;éradiquer du système.</p><p>Cette faille permet notamment à une applet non signée, d&#8217;exécuter du code en dehors de la sandbox Java, et ce, avec les privilèges de l&#8217;utilisateur courant. Imaginez si vous avez lancé votre navigateur en root <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . L&#8217;applet invite alors l&#8217;utilisateur à saisir son mot de passe, bien que le malware tentera d&#8217;infecter le système qu&#8217;il soit saisit ou non, ceci influant juste la manière dont il s&#8217;y introduira.</p><p><span
color="#000000" style=";font-family=;font-size=;">Jusqu&#8217;ici la seule manière d&#8217;éviter cette faille était de désactiver Java de son navigateur, voire de désactiver Java tout court. </span><span
color="#000000" style=";font-family=;font-size=;">Désormais, Apple invite à appliquer la mise à jour</span> <span
color="#000000" style=";font-family=;font-size=;"><b><a
href="http://www.oracle.com/technetwork/java/javase/6u31-relnotes-1482342.html" rel="nofollow">1.6.0 update 31</a></b></span><span
color="#000000" style=";font-family=;font-size=;">. Pour se faire, 2 solutions s&#8217;offrent à vous :</span></p><ul><li>Vous pouvez exécuter l&#8217;utilitaire de mises à jour de l&#8217;OS pour découvrir l&#8217;écran suivant :</li></ul><p><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Screen-shot-2012-04-04-at-7.42.16-PM.png" style="margin: 1em 1em 1em 1em;" /></p><ul><li>Ou bien télécharger la mise à jour via le site <a
href="https://developer.apple.com/" rel="nofollow">developer d&#8217;Apple</a> où il vous faudra créer un compte (gratuit <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) si ce n&#8217;est pas déjà fait.</li></ul><p>Sinon, rien ne vous empêche d&#8217;aller jeter un coup d&#8217;oeil du côté du projet <a
href="http://code.google.com/p/openjdk-osx-build/" rel="nofollow">OpenJDK</a> où la version 7 et 8 (avec lambdas) sont disponibles !</p><p>A noter tout de même, bien qu&#8217;Apple ait été très passif quant à sa gestion des mises à jour de Java, ce patch est sorti en moins d&#8217;une semaine après la mise en évidence concrète de la faille. Malgré tout, il est désormais clair que la clientèle type &laquo;&nbsp;développeur&nbsp;&raquo; n&#8217;est pas la priorité d&#8217;Apple, d&#8217;autant plus que l&#8217;OS de la firme n&#8217;intègre plus nativement le runtime Java. Au moins, les nouveaux utilisateurs n&#8217;auront pas ce problème ﻿!</p><h3><a
name="RevuedePresseXebia-Ev%C3%A8nementsdenotrecommunaut%C3%A9enFranceet%C3%A0l%27%C3%A9tranger"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="RevuedePresseXebia-SecondmeetupduHadoopUserGroupFrance%2Cle11Avril%C3%A0Paris"></a>Second meetup du Hadoop User Group France, le 11 Avril à Paris</h4><p>Le premier meetup a eu lieu le 15 mars. On a pu assister à une <a
href="http://blog.xebia.fr/2012/04/02/introduction-a-hadoop-par-slim-tebourbi-au-hadoop-user-group-france/" rel="nofollow">introduction à Hadoop</a> ainsi qu&#8217;à une <a
href="http://blog.xebia.fr/2012/04/06/cascalog-par-bertrand-dechoux-au-hadoop-user-group-france/" rel="nofollow">présentation de Cascalog</a> mais aussi à un retour d&#8217;expérience de Kobojo et une démonstration de Talend Open Studio. Les <a
href="http://blog.xebia.fr/tag/video/" rel="nofollow">dernières vidéos</a> seront bientôt publiées sur ce blog afin de ne pas léser ceux qui n&#8217;ont pas pu se libérer.</p><p>Le programme, le lieu et la date pour le second meetup sont déjà fixés! Il s&#8217;agit de demain (le mercredi 11 avril) dans les locaux parisiens de l&#8217;INRIA. <a
href="http://blog.xebia.fr/2012/02/16/mongo-day-paris-mongo-db-in-production-by-chris-harris-and-alvin-richards/" rel="nofollow">Chris Harris de 10gen</a> présentera l&#8217;intégration de MongoDB avec Hadoop. <a
href="http://msdn.microsoft.com/fr-fr/downloads/bb852063" rel="nofollow">Benjamin Guinebertière de Microsoft</a> parlera d&#8217;Hadoop sur Azure. Et enfin, <a
href="http://www.ezako.com/en/profile.html" rel="nofollow">Ziad Bizri d&#8217;Ezako</a> détaillera MapReduce.</p><p>Pour assister à l&#8217;événement, vous pouvez <a
href="http://www.amiando.com/XSWTIYD.html?page=758461" rel="nofollow">vous inscrire</a>, tant qu&#8217;il reste des places!</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/10/revue-de-presse-xebia-2012-15/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Xebia aux coté de Salesforce et de sa vedette Heroku, le 10 avril</title><link>http://blog.xebia.fr/2012/04/06/xebia-aux-cote-de-salesforce-et-de-sa-vedette-heroku-le-10-avril/</link> <comments>http://blog.xebia.fr/2012/04/06/xebia-aux-cote-de-salesforce-et-de-sa-vedette-heroku-le-10-avril/#comments</comments> <pubDate>Fri, 06 Apr 2012 15:03:08 +0000</pubDate> <dc:creator>Emilie Fruh</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Heroku]]></category> <category><![CDATA[salesforce]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11180</guid> <description><![CDATA[Partenaire de Salesforce sur Heroku, Xebia participera le 10 avril 2012, à l’évènement Cloudforce Social Enterprise Tour, suivi du &#171;&#160;developer garage&#160;&#187;, à la maison de la mutualité à Paris. Xebia a choisi Heroku pour la création d&#8217;un outil de recrutement social sur Facebook et présentera un retour d&#8217;expérience à cette occasion à partir de 16h30. [...]]]></description> <content:encoded><![CDATA[<p><span
style="float: right"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/logo-force-heroku.jpg" style="margin: 1em 1em 1em 1em;" /></span><br
/> <b>Partenaire de Salesforce sur Heroku, Xebia</b> participera le 10 avril 2012, à l’évènement <b>Cloudforce Social Enterprise Tour,</b> suivi du &laquo;&nbsp;developer garage&nbsp;&raquo;, à la maison de la mutualité à Paris.</p><p><b>Xebia a choisi Heroku pour la création d&#8217;un outil de recrutement social sur Facebook et présentera un retour d&#8217;expérience à cette occasion à partir de 16h30.</b></p><p>Ce sont des invités de renom, des experts de  salesforce.com et leurs partenaires qui seront présents pour débattre et comprendre comment les leaders de  la révolution sociale et collaborative transforment leur industrie. Durant cette journée, de nombreux  ateliers présenteront tous les produits sociaux et collaboratifs,  ainsi que les toutes dernières technologies cloud computing</p><p>Il reste encore quelques places pour ceux qui ne pourront pas être présents lors de cette journée, mais qui souhaitent assister au <b>&laquo;&nbsp;Developer Garage&nbsp;&raquo;</b>, de 18h00 à 21h00 .Cette édition rassemble pour la première fois en France, 200 développeurs venus participer à cette révolution sociale et mobile et créer leurs applications !</p><p>Vous pourrez rencontrer et échanger avec les équipes engineering sur les technologies force.com et heroku, et :</p><ul><li>Assister à des démos temps réel.</li><li>Découvrir les dernières APIs.</li><li>Récupérer les astuces des experts Cloudforce.</li></ul><p>Attention, le nombre de places est limité, <a
href="https://www.salesforce.com/fr/events/details/a1x300000004DwDAAU.jsp" rel="nofollow">inscrivez-vous</a> rapidement !</p><p>Événement en anglais.<br
/> Pensez à venir avec votre laptop !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/06/xebia-aux-cote-de-salesforce-et-de-sa-vedette-heroku-le-10-avril/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Cascalog par Bertrand Dechoux au Hadoop User Group France</title><link>http://blog.xebia.fr/2012/04/06/cascalog-par-bertrand-dechoux-au-hadoop-user-group-france/</link> <comments>http://blog.xebia.fr/2012/04/06/cascalog-par-bertrand-dechoux-au-hadoop-user-group-france/#comments</comments> <pubDate>Fri, 06 Apr 2012 13:25:49 +0000</pubDate> <dc:creator>Bertrand Dechoux</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Cascalog]]></category> <category><![CDATA[Hadoop]]></category> <category><![CDATA[vidéo]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11171</guid> <description><![CDATA[Bertrand Dechoux présente Cascalog au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012. Tous les podcasts Xebia France :]]></description> <content:encoded><![CDATA[<p>Bertrand Dechoux présente <a
href="https://github.com/nathanmarz/cascalog#readme" rel="nofollow">Cascalog</a> au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012.</p><div
align="center"> <iframe
src="http://player.vimeo.com/video/39327244?color=6d0091" width="720" height="405" frameborder="0" webkitallowfullscreen="webkitAllowFullScreen" mozallowfullscreen="mozallowfullscreen" allowfullscreen="allowFullScreen"></iframe></div><div
align="center"><div
style="width:425px" id="__ss_12295055"> <iframe
src="http://www.slideshare.net/slideshow/embed_code/12295055" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></div></div><hr
/> <strong>Tous les podcasts Xebia France :</strong></p><ul><li><a
href="itpc://blog.xebia.fr/feed/podcast/" title="Subscribe to the Podcast Feed with iTunes"><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/itunes.png" alt="Subscribe with iTunes" /></a></li><li><a
href="http://blog.xebia.fr/feed/podcast/" title="Les podcasts de Xebia France vous permettent de suivre l'actualité autour de Java, de l'agilité, des technologies Web et bien d'autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile."><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/feed_button-rss-podcast.png" alt="Xebia France Podcast Feed" /></a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/06/cascalog-par-bertrand-dechoux-au-hadoop-user-group-france/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <enclosure
url="http://xebia-video.s3-website-eu-west-1.amazonaws.com/2012-03/xfr-hadoop-user-group-france-2012-03-cascalog-640x360.mp4" length="113836761" type="audio/mpeg" /> <itunes:duration>0:21:17</itunes:duration> <itunes:subtitle>Bertrand Dechoux présente Cascalog au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012.
Tous les podcasts Xebia France : </itunes:subtitle> <itunes:summary>Bertrand Dechoux présente Cascalog au premier Hadoop User Group France qui s&#8217;est déroulé chez Xebia le 15 mars 2012.
Tous les podcasts Xebia France : </itunes:summary> <itunes:author>Xebia France</itunes:author> <itunes:explicit>no</itunes:explicit> <itunes:block>no</itunes:block> </item> <item><title>Les types monadiques de Scala &#8211; Le type Either</title><link>http://blog.xebia.fr/2012/04/05/les-types-monadiques-de-scala-le-type-either/</link> <comments>http://blog.xebia.fr/2012/04/05/les-types-monadiques-de-scala-le-type-either/#comments</comments> <pubDate>Thu, 05 Apr 2012 05:02:48 +0000</pubDate> <dc:creator>David Galichet</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Programmation fonctionnelle]]></category> <category><![CDATA[scala]]></category> <category><![CDATA[Types monadiques]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11167</guid> <description><![CDATA[Dans un premier article, nous avons introduit le type monadique Option. Nous avons vu que ce type permet de traduire l&#8217;absence de valeur ou de résultat et comment l&#8217;exploiter efficacement à l&#8217;aide des méthodes map et flatMap. Si vous n&#8217;avez pas eu l&#8217;occasion de le lire, je vous encourage fortement à le faire avant de [...]]]></description> <content:encoded><![CDATA[<p>Dans <a
href="http://blog.xebia.fr/2012/03/19/les-types-monadiques-de-scala-le-type-option/" rel="nofollow">un premier article</a>, nous avons introduit le type monadique <code>Option</code>. Nous avons vu que ce type permet de traduire l&#8217;absence de valeur ou de résultat et comment l&#8217;exploiter efficacement à l&#8217;aide des méthodes <code>map</code> et <code>flatMap</code>. Si vous n&#8217;avez pas eu l&#8217;occasion de le lire, je vous encourage fortement à le faire avant de commencer la lecture de ce qui suit.</p><p>Dans ce nouvel article, je vous propose d&#8217;aborder le type monadique <code>Either</code>, particulièrement utile pour la gestion des erreurs et qui peut remplacer de manière très avantageuse les mécanismes de <em><a
href="http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions" rel="nofollow">checked exceptions</a></em>. Nous approfondirons à cette occasion notre compréhension des monades et nous verrons comment combiner deux types de monades différents.</p><h3><a
name="LestypesmonadiquesdeScala-LetypeEither-D%C3%A9finitiondutypeEither"></a>Définition du type Either</h3><p>Comme dans le dernier article, je me permettrai un abus de langage en parlant des types <code>Either</code> et <code>Option</code> même s&#8217;ils réfèrent à des <em>types abstrait</em> (aussi appelé constructeur de type) et non à des types concrets (comme <code>Either[A, B]</code> ou <code>Option[A]</code>).</p><p><span
style="float: right"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Either.png" style="margin: 1em 1em 1em 1em;" /></span></p><p>Le type <code>Either[A, B]</code> est un type abstrait générique ayant deux sous types concrets à savoir <code>Left[A, B]</code> et <code>Right[A, B]</code>. Dans le <a
href="http://blog.xebia.fr/2012/03/19/les-types-monadiques-de-scala-le-type-option/" rel="nofollow">précédent article</a> sur le type <code>Option</code>, nous avions présenté l&#8217;implémentation d&#8217;une méthode <code>divide</code> retournant une instance de <code>Some[Double]</code> ou <code>None</code> si le dénominateur est <code>0</code>. Nous pourrions changer notre approche et utiliser le type <code>Either</code> pour retourner soit la valeur calculée, soit un message d&#8217;erreur :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
scala&gt; def divide(x:Double, y:Double):Either[String, Double] = if (y == 0) Left(&quot;Can't divide by 0&quot;) else Right(x/y)
divide: (x: Double, y: Double)Either[String,Double]
scala&gt; divide(4, 0)
res0: Either[String,Double] = Left(Can't divide by 0)
scala&gt; divide(4, 2)
res1: Either[String,Double] = Right(2.0)
</pre><p>Si la valeur du diviseur est <code>0</code>, la fonction <code>divide</code> retourne le message d&#8217;erreur encapsulé dans un <code>Left</code>. Dans le cas contraire, elle retournera le quotient dans un <code>Right</code>. Par convention, les erreurs sont retournées à gauche et le résultat à droite. Cette convention n&#8217;est pas forcément très explicite mais en l&#8217;appliquant scrupuleusement, il n&#8217;y a pas de soucis à avoir. Un moyen mnémotechnique pour ne pas les confondre est de voir que Right peut se traduire en &laquo;&nbsp;Correct&nbsp;&raquo; comme dans <em>it&#8217;s all <ins>right</ins>!</em> et de voir que Left vient du verbe anglais <em>to leave</em> et qu&#8217;il peut se traduire en &laquo;&nbsp;Parti&nbsp;&raquo;, car en cas d&#8217;erreur nous sommes <ins>parti</ins> du traitement.</p><h3><a
name="LestypesmonadiquesdeScala-LetypeEither-TraitementdesvaleursdetypeEither"></a>Traitement des valeurs de type Either</h3><p>Nous pouvons maintenant nous demander comment exploiter la valeur retournée par notre méthode. La première méthode est la suivante :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
scala&gt; val result = divide(4, 2)
result: Either[String,Double] = Right(2.0)
scala&gt; if (result.isRight) {
     |   &quot;Result is = &quot; + result.right.get
     | } else {
     |   result.left.get
     | }
res2: java.lang.String = Result is = 2.0
</pre><p>Ce code procédural peut être avantageusement remplacé par l&#8217;utilisation de la méthode <code>fold</code>. Pour un type <code>Either[A, B]</code>, la méthode <code>fold</code> prendra en argument deux fonctions :</p><ul><li>la première de type <code>f: A =&gt; C</code> qui sera appliquée à la valeur gauche,</li><li>la seconde de type <code>g: B =&gt; C</code> qui sera appliquée à la valeur droite et retournera un résultat de type <code>C</code>.</li></ul><pre class="brush: scala; gutter: true; title: ; notranslate">
scala&gt; result.fold(
     |   { y =&gt; y },
     |   { x =&gt; &quot;Result is = &quot; + x })
res3: java.lang.String = Result is = 2.0
</pre><h3><a
name="LestypesmonadiquesdeScala-LetypeEither-CompositionavecletypeEither"></a>Composition avec le type Either</h3><p>Imaginons maintenant que nous souhaitons ajouter les résultats de deux divisions effectuées avec la méthode <code>divide</code> :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
scala&gt; def add(x:Either[String, Double], y:Either[String, Double]) =
     | if (x.isRight &amp;&amp; y.isRight) {
     |     Right(x.right.get + y.right.get)
     | } else if (x.isLeft) {
     |     x
     | } else {
     |     y
     | }
add: (x: Either[String,Double], y: Either[String,Double])Either[String,Double]
scala&gt; add(divide(4, 2), divide(3, 4))
res4: Either[String,Double] = Right(2.75)
scala&gt; add(divide(4, 0), divide(3, 4))
res5: Either[String,Double] = Left(Can't divide by 0)
</pre><p>Cette implémentation de <code>add</code> est correcte mais peut facilement aboutir à une erreur d&#8217;implémentation (surtout si nous augmentons le nombre de <code>Either</code> à composer). Heureusement, il existe une façon beaucoup plus sûre d&#8217;implémenter cette fonction <code>add</code> en appliquant le principe : <em>flatmap that shit !</em>.</p><pre class="brush: scala; gutter: true; title: ; notranslate">
scala&gt; def add(eX:Either[String, Double], eY:Either[String, Double]) = eX.right.flatMap { x =&gt; eY.right.map { y =&gt; x + y } }
add: (eX: Either[String,Double], eY: Either[String,Double])Either[String,Double]
</pre><p>Nous retrouvons ici les méthodes <code>map</code> et <code>flatMap</code> que nous avions rencontrées dans l&#8217;article sur les <code>Options</code>. La différence avec le type <code>Either</code> est que nous appliquons ces méthodes sur la <em>projection</em> à gauche ou à droite (<code>.left</code>, <code>.right</code>) de la valeur. Dans notre cas, nous souhaitons appliquer ces méthodes sur la <em>projection</em> à droite des valeurs de type <code>Either</code>, afin de n&#8217;appliquer les transformations que si le résultat de la méthode divide est un succès (et donc une instance de <code>Right</code>).</p><p>La méthode <code>map</code> appliquée à la projection à droite du type <code>Either[A, B]</code> prend en argument une fonction <code>f: B =&gt; C</code> et retourne un objet de type <code>Either[A, C]</code>. La méthode <code>flatMap</code> appliquée à la projection à droite du type <code>Either[A, B]</code> prend en argument une fonction <code>f: B =&gt; Either[A, C]</code> et retourne un objet de type <code>Either[A, C]</code>. Dans notre cas, <code>A</code> est de type <code>String</code> et <code>B</code> et <code>C</code> sont de type <code>Double</code>.</p><p>Nous pouvons aussi utiliser une <em>for comprehension</em> pour définir cette même méthode :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
def add(eX:Either[String, Double], eY:Either[String, Double]) = for {
    x &lt;- eX.right
    y &lt;- eY.right
} yield x+y
</pre><p>Là encore, l&#8217;utilisation d&#8217;une <em>for comprehension</em> apporte un peu plus de lisibilité, qui sera accentuée dans le cas où nous avons non plus deux, mais trois <em>monades</em> ou plus pour lesquelles nous souhaitons extraire la donnée. Le compilateur transforme ensuite la <em>for comprehension</em> en suite de (<code>n-1</code>) <code>flatMap</code> et un <code>map</code>.</p><p>Comment faire maintenant si nous souhaitons appliquer un traitement sur la projection à gauche ? Nous allons modifier légèrement notre implémentation de la méthode <code>add</code> :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
scala&gt; def add(eX:Either[String, Double], eY:Either[String, Double]):Either[String, Double] = eX.right
       .flatMap { x =&gt; eY.right.map { y =&gt; x + y } }.left.map { m =&gt; &quot;Error during add process : &quot; + m }
add: (eX: Either[String,Double], eY: Either[String,Double])Either[String,Double]
scala&gt; add(divide(4, 0), divide(3, 4))
res6: Either[String,Double] = Left(Error during add process : Can't divide by 0)
</pre><h3><a
name="LestypesmonadiquesdeScala-LetypeEither-Patternmatching"></a>Pattern matching</h3><p>Comme pour le cas de l&#8217;<code>Option</code>, il est possible de faire du <em>pattern matching</em> sur le type <code>Either</code> afin de récupérer la valeur qu&#8217;il contient :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
def addParams(x:Double, y:Double) = divide(x, y) match {
  case Left(error) =&gt; BadRequest(error)
  case Right(result) =&gt; Ok(&quot;The result of %d / %d is %d&quot;.format(x, y, result))
}
</pre><p>Nous aurions bien évidemment pu utiliser la méthode <code>fold</code> pour arriver au même résultat.</p><h3><a
name="LestypesmonadiquesdeScala-LetypeEither-CompositiondeEitheretOption"></a>Composition de Either et Option</h3><p>Il peut arriver de rencontrer des méthodes retournant des <code>Options</code> et d&#8217;autres des <code>Either</code> et que nous souhaitions les combiner pour obtenir un résultat. Prenons l&#8217;exemple de notre méthode <code>divide</code> retournant une valeur de type <code>Either</code> et d&#8217;une autre méthode retournant une <code>Option</code> contenant un taux quelconque :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
def findValue(id:Long):Option[Double] = if (id == 1) None else Some(id - 2)
</pre><p>Cette méthode retourne <code>Some(taux)</code> si l&#8217;<code>id</code> passé en argument correspond à un taux existant et <code>None</code> dans le cas contraire.</p><p>Nous allons maintenant coupler cette méthode avec <code>divide</code> (définie plus haut) pour effectuer un calcul simple :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
def calcValue(id:Long):Either[String, Double] =
    findValue(id).map( x =&gt; Right(x) ).getOrElse(Left(&quot;The ID doesn't match&quot;)) // transform the Option to Either
    .right.flatMap( x =&gt; divide(1, x) )                                        // compose it with another Either
</pre><p>De prime abord, cette méthode peut sembler un peu complexe. Nous pouvons la décomposer en deux parties pour mieux la comprendre :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
findValue(id).map( x =&gt; Right(x) ).getOrElse(Left(&quot;The ID doesn't match&quot;))
</pre><p>la méthode <code>findValue</code> retourne une <code>Option[Double]</code>. Or, nous souhaitons la combiner avec une méthode retournant un type <code>Either[String, Double]</code>. La méthode <code>map</code> nous permet de transformer notre <code>Option[Double]</code> en <code>Option[Right[Nothing, Double]]</code>. Nous souhaitons ensuite extraire la valeur de l&#8217;<code>Option</code> et nous utilisons pour ce faire la méthode <code>getOrElse</code> qui retournera un <code>Left</code> contenant un message d&#8217;erreur dans le cas où <code>findValue</code> retournerait <code>None</code>. A l&#8217;issue de cette première étape, nous avons transformé notre <code>Option[Double]</code> en <code>Either[String, Double]</code>.</p><p>L&#8217;étape suivante consiste à combiner l&#8217;appel à la méthode <code>divide</code>. Ceci se fait simplement en appelant <code>flatMap</code> sur la projection à droite du résultat issu de la première étape. Pour rappel, le <code>flatMap</code> est défini comme suit :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
Either[A, B].right.flatMap(B =&gt; Either[A, C]):Either[A, C]
</pre><p>Nous pouvons aussi vérifier que notre méthode retourne bien le résultat escompté :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
scala&gt; calcValue(3)
res7: Either[String,Double] = Right(1.0)
scala&gt; calcValue(2)
res8: Either[String,Double] = Left(Can't divide by 0)
scala&gt; calcValue(1)
res9: Either[String,Double] = Left(Id doesn't match)
</pre><h3><a
name="LestypesmonadiquesdeScala-LetypeEither-Intuitions"></a>Intuitions</h3><p>Nous commençons à mieux appréhender ce qu&#8217;est une monade et comment l&#8217;utiliser. Nous avons vu qu&#8217;elles sont caractérisées par la présence des méthodes <code>map</code> et <code>flatMap</code> permettant d&#8217;appliquer des transformations sur leur contenu.</p><p>Nous pourrions maintenant nous intéresser à une implémentation possible de ces deux méthodes en commençant par la <em>monade</em> <code>Option</code> :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
trait Option[+A] {
  def map[B](f: A =&gt; B):Option[B] = ...
  def flatMap[B](f: A =&gt; Option[B]):Option[B] = ...
}
case object None extends Option[Nothing]
case class Some[A](a:A) extends Option[A]
</pre><p>Nous avons ici une définition du type abstrait <code>Option[A]</code> et de ses deux sous types <code>Some[A]</code> et <code>None</code>. Notez que nous utilisons le mot-clé <code>case</code> afin de pouvoir utiliser le <em>pattern matching</em> sur <code>Some</code> et <code>None</code>. Nous définissons aussi <code>A</code> comme étant <em>covariant</em> dans <code>Option[+A]</code> afin de permettre l&#8217;assignation d&#8217;un <code>None</code> à une valeur de type <code>Option[A]</code> où <code>A</code> est quelconque. <code>Nothing</code> étant sous type de n&#8217;importe quel type et <code>A</code> étant <em>covariant</em>, <code>Option[Nothing]</code> est un sous type de <code>Option[A]</code> ce qui permet d&#8217;avoir une assignation du genre :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
val d:Option[Double] = None
</pre><p>Voici une implémentation possible des méthodes <code>map</code> et <code>flatMap</code> :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
def map[B](f: A =&gt; B):Option[B] = this match {
    case None =&gt; None
    case Some(a) =&gt; Some(f(a))
  }
  def flatMap[B](f: A =&gt; Option[B]):Option[B] = this match {
    case None =&gt; None
    case Some(a) =&gt; f(a)
  }
</pre><p>On peut voir que l&#8217;implémentation est assez simple. Si nous sommes en présence d&#8217;un <code>None</code>, les deux méthodes renverront <code>None</code>. Dans le cas où l&#8217;<code>Option</code> renferme une valeur, celle-ci est extraite grâce au <em>pattern matching</em> et appliquée à la fonction <code>f</code>.</p><p>Nous pouvons aussi imaginer l&#8217;implémentation partielle de la <em>monade</em> <code>Either</code>. Celle-ci est un peu moins triviale car nous devons considérer les types relatifs aux projections à droite et à gauche comme vous pouvez le constater dans le code suivant :</p><pre class="brush: scala; gutter: true; title: ; notranslate">
trait Either[+A, +B] {
  def left = new LeftProjection(this)
  def right = new RightProjection(this)
}
// right projection of an Either type
class LeftProjection[+A, +B](e:Either[A, B]) {
  def map[C](f: A =&gt; C):Either[C, B] = e match {
    case Left(a) =&gt; Left(f(a))   // returns a Left with a transformed value a
    case Right(b) =&gt; Right(b)
  }
  def flatMap[C, BB &gt;: B](f: A =&gt; Either[C, BB]):Either[C, BB] = e match {
    case Left(a) =&gt; f(a)         // returns a new Either calculated from f applied to a
    case Right(a) =&gt; Right(a)
  }
}
// left projection of an Either type
class RightProjection[+A, +B](e:Either[A, B]) {
  def map[C](f: B =&gt; C):Either[A, C] = e match {
    case Left(a) =&gt; Left(a)
    case Right(b) =&gt; Right(f(b)) // returns a Right with a transformed value a
  }
  def flatMap[AA &gt;: A, C](f: B =&gt; Either[AA, C]):Either[AA, C] = e match {
    case Left(a) =&gt; Left(a)
    case Right(b) =&gt; f(b)        // returns a new Either calculated from f applied to a
  }
}
case class Left[A, B](a:A) extends Either[A, B]
case class Right[A, B](b:B) extends Either[A, B]
</pre><p>Nous voyons que <code>Left</code> et <code>Right</code> sont deux sous types de <code>Either</code> qui lui même implémente les méthodes <code>left</code> et <code>right</code> permettant d&#8217;obtenir les projections à gauche et à droite. Les implémentations des méthodes <code>map</code> et <code>flatMap</code> dans les projections à gauche et à droite sont opposées dans le sens où l&#8217;application d&#8217;une fonction sur une projection à gauche ne s&#8217;appliquera que sur une valeur gauche (<code>Left</code>) et inversement.</p><p>Nous ne nous attarderons pas sur les définitions des types des classes et des méthodes dans cet article, ce sujet pourrait faire l&#8217;objet d&#8217;un article à lui tout seul. Néanmoins, vous connaissez maintenant suffisamment bien les méthodes <code>map</code> et <code>flatMap</code> pour comprendre ce qu&#8217;elles attendent en argument et ce qu&#8217;elles retournent.</p><h3><a
name="LestypesmonadiquesdeScala-LetypeEither-Conclusion"></a>Conclusion</h3><p>Voilà pour ce nouvel article sur les types <em>monadiques</em> en Scala et plus particulièrement sur le type <code>Either[A, B]</code>. Nous avons pu voir comment utiliser cette nouvelle <em>monade</em>, comment la composer avec d&#8217;autres du même type et avec la <em>monade</em> <code>Option</code> et pour finir, nous avons vu comment ces deux monades pourraient être implémentées, ce qui a conduit au passage à comprendre un peu mieux leur fonctionnement grâce à cette vue <em>sous le capot</em>.</p><p>Dans notre prochain article, je vous proposerai l&#8217;étude d&#8217;une autre <em>monade</em>, probablement l&#8217;une des plus utilisées puisqu&#8217;il s&#8217;agit de la <code>Liste</code>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/05/les-types-monadiques-de-scala-le-type-either/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Scrum Master Academy</title><link>http://blog.xebia.fr/2012/04/05/scrum-master-academy/</link> <comments>http://blog.xebia.fr/2012/04/05/scrum-master-academy/#comments</comments> <pubDate>Thu, 05 Apr 2012 04:13:51 +0000</pubDate> <dc:creator>Gilles Mantel</dc:creator> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Agile]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[Scrum Day]]></category> <category><![CDATA[Scrum Master Academy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11161</guid> <description><![CDATA[Lors du dernier Scrum Day qui s&#8217;est déroulé le 27 Mars à Paris, Jean-Laurent et moi avons animé la Scrum Master Academy. Cette présentation était la version raccourcie d&#8217;une session XKE de février dernier. Je vais vous expliquer dans ce billet la genèse et les principes fondateurs de ce séminaire. La Scrum Master Academy est [...]]]></description> <content:encoded><![CDATA[<p><span
style="float: left"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Photo-02-04-12-21-52-52.jpeg" hspace="10" width="300" style="margin: 1em 1em 1em 1em;" /></span> Lors du dernier <a
href="http://www.scrumday.fr/" rel="nofollow">Scrum Day</a> qui s&#8217;est déroulé le 27 Mars à Paris, Jean-Laurent et moi avons animé la <a
href="http://www.scrumday.fr/?presentation=scrum-master-academy" rel="nofollow">Scrum Master Academy</a>. Cette présentation était la version raccourcie d&#8217;une session <a
href="http://www.xebia.fr/notre-point-de-vue" rel="nofollow">XKE</a> de février dernier.</p><p>Je vais vous expliquer dans ce billet la genèse et les principes fondateurs de ce séminaire. La Scrum Master Academy est une idée qui m&#8217;est venue il y a quelques mois alors que je cherchais un moyen de transmettre mon expérience agile à mes collègues de Xebia dans un format pédagogique, sans écrire un livre de 500 pages et sans donner de certification précise.</p><p>Il y a beaucoup de réflexes que j&#8217;ai acquis &laquo;&nbsp;sur le tas&nbsp;&raquo; en me confrontant aux difficultés de certaines situations et sans spécialement lire de livre. L&#8217;expérience s&#8217;acquiert en faisant des erreurs, en en tirant des enseignements. Les bons réflexes se construisent sur la base d&#8217;un vécu. Pour autant, est-il souhaitable de laisser vos collègues se tromper si vous avez de bons conseils à leur donner ? D&#8217;autre part, j&#8217;ai constaté à de nombreuses reprises que les personnes fraîchement issues de formations agiles (certifiantes ou non) font une application naïve, intégriste, ou pas assez éclairée des méthodes agiles. J&#8217;ai aussi remarqué que mes entorses à certaines méthodes agiles étaient parfois perçues comme des actes de crime contre l&#8217;agilité. J&#8217;ai donc voulu transmettre un message pragmatique dans un format pédagogique et ludique. Mais comment diffuser cette expérience et la rendre accessible au moins expérimentés sans ré-inventer la roue ?</p><p>Comme souvent dans ce genre de situation, la réponse est là où on ne l&#8217;attend pas. Pour l&#8217;occasion, c&#8217;est la série américaine <a
href="http://fr.wikipedia.org/wiki/NCIS_:_Enqu%C3%AAtes_sp%C3%A9ciales" rel="nofollow">NCIS</a>, diffusée le vendredi soir sur M6, qui m&#8217;a inspirée. Dans cette série, le chef d&#8217;une équipe d&#8217;enquêteurs sur des affaires criminelles de la marine américaine a créé une liste de <a
href="http://www.ncisfr.net/Dossiers/regles_gibbs/regles_gibbs.php" rel="nofollow">50 règles d&#8217;enquêtes</a> basées sur son expérience du terrain. Il considère que son métier est de les enseigner à ses équipiers, au fil des différentes situations, afin qu&#8217;ils deviennent des enquêteurs excellents. Le propre de ces règles est qu&#8217;elles ne sont écrites nulle part, elles forment une référence commune à tous ses équipiers et contribuent à renforcer l&#8217;esprit de groupe.</p><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/ScrumMasterAcademy.jpeg" style="margin: 1em 1em 1em 1em;" /></span></p><p>L&#8217;idée était là ! Restait à formaliser le contenu.</p><p>Avec Jean-Laurent, nous avons travaillé d&#8217;arrache-pied (le mot est faible) pour rassembler nos expériences agiles depuis 10 ans et définir un ensemble de règles &laquo;&nbsp;à la NCIS&nbsp;&raquo;. Nous avons ensuite saisi le premier XKE pour présenter une première mouture de la Scrum Master Academy, habillés de treillis militaires, sifflet au bec et casquettes pour renforcer l&#8217;impact. Nous avons beaucoup apprécié cette session XKE, non pas parce qu&#8217;on aime s&#8217;habiller en treillis, mais pour deux raisons. Tout d&#8217;abord parce qu&#8217;elle a permis aux participants de partager leurs expériences à travers nos règles et de mettre sur la table des situations parfois délicates. Ensuite, parce que cela nous a apporté à Jean-Laurent et moi quelque chose qui nous manquait : la volonté de formaliser notre expérience en confrontant nos histoires sans tomber dans le syndrome de la brève de comptoir. Le résultat auquel nous sommes arrivés dépasse largement l&#8217;idée initiale. Encore une preuve de l&#8217;intérêt du travail en binôme.</p><p><span
style="float: left"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/Photo-27-03-12-17-13-24.jpeg" hspace="10" width="300" style="margin: 1em 1em 1em 1em;" /></span> C&#8217;est donc tout naturellement que nous avons proposé cette session pour le Scrum Day 2012. Pour l&#8217;occasion, nous n&#8217;avons pas présenté les 50 règles, car le créneau d&#8217;1h ne suffisait pas et le contenu complet nécessite un minimum d&#8217;échanges avec les participants. Nous avons donc extrait un sous-ensemble de celles qui nous paraissaient importantes, originales ou trop souvent oubliées. L&#8217;exercice s&#8217;annonçait délicat car le propre de l&#8217;agilité est de ne pas donner de règles d&#8217;or et nous allions précisément faire le contraire devant un auditoire comprenant des agilistes forcenés.</p><p>Nous sommes vraiment heureux des retours très positifs que nous avons reçus après la session (voir photo), et encore après sur la blogosphère <a
href="http://blog.developpez.com/todaystip/p10891/conference/scrum-day-fr-2012/retour-sur-la-conference-scrum-master-ac/" rel="nofollow">ici</a> ou encore <a
href="http://www.coffee-meeting.com/retour-scrum-day-2012-retrospective" rel="nofollow">là</a>. Comme promis aux participants, je vais vous dévoiler sur ce blog les 50 règles de la Scrum Master Academy. Mais pas toutes en même temps. Je vous l&#8217;ai dit, elles nécessitent un minimum d&#8217;explication. Chaque règle fera l&#8217;objet d&#8217;un article qui lui est propre avec quelques explications et des tranches de vie agiles qui vont avec. Pour patienter, vous pouvez consulter les slides de la présentation qui vous donneront déjà quelques règles&#8230; sans les explications. Donc restez à l&#8217;écoute du blog.</p><p>Je profite également de ce billet pour vous dévoiler le démarrage de deux chantiers:</p><ul><li>la mise au point d&#8217;un module de formation sur le principe de la Scrum Master Academy: destiné aux Scrum Master, l&#8217;objectif sera de distiller les principes des règles au travers d&#8217;ateliers, de retours d&#8217;expérience, et de mises en situation</li><li>la création d&#8217;un deck de cartes synthétisant ces règles, dans la même forme que les Xebia Essentials</li></ul><p><b>À venir: règle n°1 &#8211; Know Your Agile Values</b></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/05/scrum-master-academy/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Monades + Java = monstre cosmique ?</title><link>http://blog.xebia.fr/2012/04/04/monades-java-monstre-cosmique/</link> <comments>http://blog.xebia.fr/2012/04/04/monades-java-monstre-cosmique/#comments</comments> <pubDate>Wed, 04 Apr 2012 09:29:56 +0000</pubDate> <dc:creator>François Sarradin</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[java]]></category> <category><![CDATA[monade]]></category> <category><![CDATA[programmationfonctionnelle]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=11142</guid> <description><![CDATA[Il arrive même en programmation fonctionnelle de devoir réaliser des traitements en présence de bons gros états mutables, partagés et gluants. Nous devons cette situation à la nature même du support (eg. réseau, machine — dépendant de l&#8217;architecture de von Neumann parfois mise en accusation [1] &#8212;, périphérique, etc.) ou des services (eg. I/O, base [...]]]></description> <content:encoded><![CDATA[<p>Il arrive même en programmation fonctionnelle de devoir réaliser des traitements en présence de bons gros états mutables, partagés et gluants. Nous devons cette situation à la nature même du support (eg. réseau, machine — dépendant de l&#8217;architecture de von Neumann parfois mise en accusation [<a
href="http://blog.xebia.fr/2012/04/04/monades-java-monstre-cosmique/#Monades%2BJava%3Dmonstrecosmique%3F-1">1</a>] &#8212;, périphérique, etc.) ou des services (eg. I/O, base de données, bus de messages, etc.) avec lesquels le programme évolue. Afin de permettre au développeur de rester dans cette zone de confort que représente l&#8217;immutabilité, il a la possibilité de confiner cette notion d&#8217;état au sein d&#8217;un instrument portant le doux nom de monade.</p><p><span
style="float: right"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/04/affiche_godzilla_003.jpg" height="400" hspace="10" style="margin: 1em 1em 1em 1em;" /></span>Aussi académique que puisse être cette notion, les monades en informatique correspondent à un concept bien précis, qui peut s&#8217;avérer utile pour se sortir de situations délicates. Les monades ont fait leur apparition en informatique dans les années 90. Elles ont été utilisées afin de pouvoir conserver la <a
href="http://en.wikipedia.org/wiki/Purely_functional" rel="nofollow"><em>pureté</em> fonctionnelle</a> au sein des applications (ie. limitation des modifications destructrices / updates) et ainsi de pouvoir bénéficier des divers optimisations qu&#8217;offre cette pureté. C&#8217;est l&#8217;objectif fixé dans le langage Haskell où l&#8217;utilisation des monades est très répandue.</p><p>Mais <em>quid</em> de la définition des monades ? Une petite recherche sur <a
href="http://en.wikipedia.org/wiki/Monad_%28functional_programming%29" rel="nofollow">Wikipédia</a>, vous permettra de trouver ce qui ressemble à une définition perdue au milieu de code à tout va et de décorations mathématiques déroutantes, à défaut de signes cabalistiques. Une recherche sur le <a
href="http://www.haskell.org/haskellwiki/Monad" rel="nofollow">wiki du langage Haskell</a> vous mènera à des morceaux de code et des définitions qui ne semblent avoir ni queue ni tête. Une autre recherche enfin vous mènera peut-être à cette fausse citation issue d&#8217;un <a
href="http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html" rel="nofollow">article</a> que nous devons à <a
href="https://twitter.com/#!/jamesiry" rel="nofollow">James Iry</a> (et qu&#8217;il attribue à <a
href="http://homepages.inf.ed.ac.uk/wadler/" rel="nofollow">Philip Wadler</a>). À sa manière, cette définition représente bien l&#8217;hermétisme qui enveloppe le concept de monade.</p><blockquote><p>Une monade est un monoïde de la catégorie des endofunctors, où est le problème ?<br
/> <em>(a monad is a monoid in the category of endofunctors, what&#8217;s the problem?)</em></p></blockquote><p><em>NB: depuis Philip Wadler aurait fait des progrès :</em> <em><a
href="http://vimeo.com/38223410" rel="nofollow">http://vimeo.com/38223410</a></em></p><p>Mais pour rester dans le commun des mortels, les monades sont avant tout une abstraction permettant de représenter une séquence de traitements et de définir le comportement de cette séquence. Ainsi, les monades sont :</p><ol><li>une solution issue de la programmation fonctionnelle permettant de représenter une succession de traitements, tout comme la programmation impérative représente par une séquence d&#8217;instructions cette succession de traitements,</li><li>un moyen d&#8217;encapsuler la notion d&#8217;état mutable et le confiner dans un « espace de travail »,</li><li>des contextes d&#8217;exécution permettant de modifier le comportement non pas des traitements mais du chaînage sur ces traitements.</li></ol><p>Il faut bien comprendre qu&#8217;en terme de traitement, nous nous attendons ici à des fonctions qui retournent une valeur à transmettre au traitement suivant.</p><p>Si à un moment ou à un autre, vous avez pensé ici <a
href="http://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_aspect" rel="nofollow">AOP</a>, c&#8217;est que vous êtes sur la bonne voie [<a
href="http://blog.xebia.fr/2012/04/04/monades-java-monstre-cosmique/#Monades%2BJava%3Dmonstrecosmique%3F-2">2</a>, <a
href="#Monades%2BJava%3Dmonstrecosmique%3F-5">5</a>].</p><p>Dans cette article, vous trouverez une introduction à la notion de monade à travers le langage Java avec implémentations et exemples. Plus précisément, nous verrons deux types de monades : la monade Option et la monade List. Nous terminerons cet article en discutant notamment de l&#8217;intérêt ou non d&#8217;utiliser les monades en Java. Bref, faisons du fonctionnel en Java :</p><pre class="brush: java; gutter: true; title: ; notranslate">
public interface Function&lt;T, R&gt; {
  R apply(T value);
}
</pre><h3><a
name="Monades%2BJava%3Dmonstrecosmique%3F-MonadeOption"></a>Monade Option</h3><p>La monade Option est la monade la plus simple et la plus accessible. Parfois appelée Maybe, elle permet de chaîner des traitements unitaires qui peuvent potentiellement ne pas retourner de valeur. Le cas échéant, le chaînage doit être « cassé ». Autrement dit, si l&#8217;une des fonctions ne retourne pas de valeur, il faut pouvoir ignorer les fonctions qui suivent dans le chaînage. Habituellement, le développeur Java utiliserait une référence <code>null</code> pour représenter l&#8217;absence de valeur et se baserait sur une levée d&#8217;exception (typiquement NullPointerException) pour « casser » le chaînage. La référence nulle est ce que Tony Hoare décrit comme étant son <em><a
href="http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare" rel="nofollow">erreur d&#8217;un milliard de dollars</a></em>. Nous allons voir que Option peut être une alternative intéressante.</p><h4><a
name="Monades%2BJava%3Dmonstrecosmique%3F-D%C3%A9finition"></a>Définition</h4><p>Pour notre monade, il nous faut d&#8217;abord représenter les notions de <em>valeur</em> et d&#8217;<em>absence de valeur</em>. C&#8217;est le rôle du type Option. Si nous représentons le type Option par une classe, elle aura alors deux sortes d&#8217;instances possibles :</p><ul><li>les instances de type Some qui encapsulent une valeur,</li><li>les instances de type None qui représentent l&#8217;absence de valeur.</li></ul><p>À partir de là, nous pouvons définir les opérations de la monade Option. Celle-ci, comme les autres monades d&#8217;ailleurs, contient deux principales opérations. Pour plus de clarté, nous étendrons la notation introduite par <a
href="http://twitter.com/#!/djspiewak" rel="nofollow">Daniel Spiewak</a> [<a
href="http://blog.xebia.fr/2012/04/04/monades-java-monstre-cosmique/#Monades%2BJava%3Dmonstrecosmique%3F-4">4</a>].</p><ul><li><code>wrap</code> : qui converti un objet en Option. Cette opération est parfois nommée <code>unit</code>, <code>pure</code> ou <code>return</code> dans d&#8217;autres langages.</li><li><code>andThen</code> : qui s&#8217;applique à une Option pour retourner une autre Option suivant un traitement unitaire. Cette opération est parfois nommée <code>bind</code>, <code>flatMap</code> ou notée <code>&gt;&gt;=</code> dans d&#8217;autres langages.</li></ul><p><code>andThen</code> prend en paramètre une fonction qui permet de transformer le contenu de l&#8217;Option en une autre Option. C&#8217;est cette fonction passée en paramètre qui va représenter le traitement unitaire. C&#8217;est aussi à partir d&#8217;une succession de <code>andThen</code> que nous représenterons un chaînage de traitements. Pour terminer, <code>andThen</code> est similaire au point-virgule (<code>;</code>), que vous utilisez sans forcément en avoir conscience entre deux instructions dans votre Java quotidien.</p><p>À ces deux opérations, nous ajoutons l&#8217;opération <code>fail</code> qui représente la situation d&#8217;échec ou une situation exceptionnelle. Dans le cadre du type Option, <code>fail</code> renvoie simplement une instance de None.</p><p>Voici l&#8217;implémentation choisie pour le type Option qui est représenté par le biais d&#8217;une classe abstraite.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public abstract class Option&lt;T&gt; {
  // opérations de base
  public abstract T get();
  public abstract boolean isPresent();
  // opérations monadiques
  public static &lt;T&gt; Option&lt;T&gt; wrap(T element) { return new Some&lt;T&gt;(element); }
  public static &lt;T&gt; Option&lt;T&gt; fail() { return new None&lt;T&gt;(); }
  public abstract &lt;U&gt; Option&lt;U&gt; andThen(Function&lt;T, Option&lt;U&gt;&gt; function);
}
</pre><p>Et voici l&#8217;implémentation des sous-classes None et Some :</p><pre class="brush: java; gutter: true; title: ; notranslate">
public class None&lt;T&gt; extends Option&lt;T&gt; {
  public T get() { throw new IllegalStateException(); }
  public boolean isPresent() { return false; }
  public &lt;U&gt; Option&lt;U&gt; andThen(Function&lt;T, Option&lt;U&gt;&gt; function) {
    return new None&lt;U&gt;();
  }
}
public class Some&lt;T&gt; extends Option&lt;T&gt; {
  private T element;
  private Some(T element) { this.element = element; }
  public T get() { return element; }
  public boolean isPresent() { return true; }
  public &lt;U&gt; Option&lt;U&gt; andThen(Function&lt;T, Option&lt;U&gt;&gt; function) {
    return function.apply(this.element);
  }
}
</pre><h4><a
name="Monades%2BJava%3Dmonstrecosmique%3F-Exemple%3Aacc%C3%A8sdesMapdeMapdeMapde..."></a>Exemple : accès des Map de Map de Map de&#8230;</h4><p>Nous allons voir maintenant comment utiliser la monade Option. Pour nous mettre en situation, nous allons partir d&#8217;un exemple de code comme nous pouvons en trouver dans des projets légués. Le principe sera ici d&#8217;accéder à la capitale d&#8217;un pays classée par continent et par pays. Pour cela, nous allons organiser ces données au moyen d&#8217;une structure récursive et complexe basée sur des Map (la classe <a
href="http://docs.guava-libraries.googlecode.com/git-history/v11.0.2/javadoc/com/google/common/base/Splitter.html" rel="nofollow">Splitter</a> ci-dessous provient de <a
href="http://code.google.com/p/guava-libraries/" rel="nofollow">Guava</a>).</p><pre class="brush: java; gutter: true; title: ; notranslate">
Splitter.MapSplitter splitter = Splitter.on(&quot;, &quot;).withKeyValueSeparator(&quot; -&gt; &quot;);
Map&lt;String, Map&lt;String, String&gt;&gt; capitalCities = new HashMap&lt;String, Map&lt;String, String&gt;&gt;() {{
  put(&quot;Europe&quot;, splitter.split(&quot;France -&gt; Paris, Espagne -&gt; Madrid&quot;));
  put(&quot;Amérique&quot;, splitter.split(&quot;Etats-Unis -&gt; Washington&quot;));
}};
</pre><p>Potentiellement, pour récupérer ici la capitale d&#8217;un pays en se basant sur la programmation impérative, il est nécessaire de passer un ensemble de <code>if</code> imbriqués pour vérifier qu&#8217;à chaque étape du parcours de la structure de données, nous n&#8217;ayons pas récupéré une référence <code>null</code>. Avec notre monade Option, le code permettant d&#8217;accéder à la capitale d&#8217;un pays s&#8217;en trouve simplifié.</p><pre class="brush: java; gutter: true; title: ; notranslate">
Option&lt;String&gt; city;
city = Option.wrap(map)
             .andThen(accessContinent(&quot;Europe&quot;))
             .andThen(accessCountry(&quot;France&quot;));
assertThat(city.isPresent()).isTrue();
assertThat(city.get()).isEqualTo(&quot;Paris&quot;);
city = Option.wrap(map)
             .andThen(accessContinent(&quot;Europe&quot;))
             .andThen(accessCountry(&quot;Assyrie&quot;));
assertThat(city.isPresent()).isFalse();
</pre><p>Pour obtenir ce résultat, il faut définir les méthodes <code>accessContinent</code> et <code>accessCountry</code>. Pour cela, nous utilisons la méthode <code>getFromKey</code>, sachant que les deux méthodes d&#8217;accès ont le même objectif : accéder à un élément d&#8217;une Map par une clé et retourner l&#8217;instance d&#8217;Option qui convient selon la présence ou non de la clé. <code>getFromKey</code> prend donc en entrée une clé, mais elle renvoie une <a
href="http://fr.wikipedia.org/wiki/Fermeture_%28informatique%29" rel="nofollow">closure</a> — c&#8217;est-à-dire une fonction conservant le contexte d&#8217;exécution dans lequel elle a été créée &#8212;. En effet, au moment d&#8217;appeler <code>getFromKey</code>, nous n&#8217;avons pas encore de Map sur laquelle effectuer la recherche de la clé. Nous retournons donc une closure qui emmagasine la clé dans son propre contexte. Elle va donc attendre un appel avec en entrée une Map et se servir de la clé fournie précédemment pour obtenir la valeur associée en appelant la méthode <code>get</code>. Nous avons ici l&#8217;expression de <b><a
href="http://fr.wikipedia.org/wiki/%C3%89valuation_paresseuse" rel="nofollow">l&#8217;évaluation retardée</a></b> à la Java. Selon le résultat retourné par <code>get</code>, la closure nous renvoie soit une instance de None en cas d&#8217;absence de résultat soit une instance de Some sinon.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public static Function&lt;Map&lt;String, Map&lt;String, String&gt;&gt;, Option&lt;Map&lt;String, String&gt;&gt;&gt; accessContinent(String continent) {
    return getFromKey(continent);
}
public static Function&lt;Map&lt;String, String&gt;, Option&lt;String&gt;&gt; accessCountry(String country) {
    return getFromKey(country);
}
public static &lt;K, V&gt; Function&lt;Map&lt;K, V&gt;, Option&lt;V&gt;&gt; getFromKey(final K key) {
    return new Function&lt;Map&lt;K, V&gt;, Option&lt;V&gt;&gt;() {
        @Override
        public Option&lt;V&gt; apply(Map&lt;K, V&gt; map) {
            V value = map.get(key);
            if (value == null) {
                return Option.none();
            }
            return Option.wrap(value);
        }
    };
}
</pre><p>Notons que le fait d&#8217;être obligé de définir des méthodes tels que <code>accessCountry</code> ou <code>accessContinent</code> est nécessaire, plutôt que d&#8217;utiliser directement la méthode <code>getFromKey</code>. En effet, utiliser directement la méthode <code>getFromKey</code> vous contraindrait à devoir résoudre à la main des problèmes de type générique plus complexes que ceux présents ici. Néanmoins, il faut reconnaître qu&#8217;écrire ces quelques lignes de code n&#8217;est pas forcément évident pour tout le monde. Mais vous devez le faire, car Java ne sait pas encore deviner pour vous la signature des méthodes. C&#8217;est aussi pour ça qu&#8217;en Java un bon IDE est nécessaire. En principe, celui-ci est capable de vous aider à déterminer, voire de générer pour vous, la signature de méthodes tels que <code>accessCountry</code> ou <code>accessContinent</code>.</p><h3><a
name="Monades%2BJava%3Dmonstrecosmique%3F-MonadeList"></a>Monade List</h3><p>Nous avons vu la monade Option. Celle-ci peut prendre deux formes : une forme vide et une forme singleton. En fait, Option est en quelque sorte un conteneur. On pourrait très bien représenter le type Option au moyen d&#8217;une List ayant soit aucun élément pour représenter None soit un élément pour représenter Some. Mais que représenterai dans ce cas une liste contenant plus d&#8217;un élément&nbsp;?</p><p>Car oui, même dans ce cas, une liste est aussi une monade. Et avec la monade List, vous allez pouvoir adresser des problèmes liés au non-déterminisme.</p><h4><a
name="Monades%2BJava%3Dmonstrecosmique%3F-D%C3%A9finition"></a>Définition</h4><p>Nous allons retrouver les opérations monadiques que nous avons vues précédemment :</p><ul><li><code>wrap</code> qui retourne un singleton à partir de l&#8217;objet passé en paramètre,</li><li><code>fail</code> qui retourne une liste vide,</li><li><code>andThen</code>.</li></ul><p>Comme la classe <a
href="http://docs.oracle.com/javase/6/docs/api/java/util/List.html" rel="nofollow">java.util.List</a> ne possède de pas ces opérations monadiques, nous allons passer par un <em>wrapper</em> que nous nommerons ListM. Pour faciliter l&#8217;exploitation des instances de cette classe notamment dans les boucles <em>for each</em>, nous lui faisons implémenter l&#8217;interface <a
href="http://docs.oracle.com/javase/6/docs/api/java/lang/Iterable.html" rel="nofollow">Iterable</a> afin que ListM définisse la méthode <code>iterator</code>.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public class ListM&lt;T&gt; implements Iterable&lt;T&gt; {
  private List&lt;T&gt; list;
  public ListM(List&lt;T&gt; list) {
    this.list = list;
  }
  // opérations de base
  public List&lt;T&gt; get() { return list; }
  @Override
  public Iterator&lt;T&gt; iterator() { return list.iterator(); }
  // opérations monadiques
  public static &lt;T&gt; ListM&lt;T&gt; wrap(T element) { return new ListM&lt;T&gt;(Collections.singletonList(element)); }
  public static &lt;T&gt; ListM&lt;T&gt; fail() { return new ListM&lt;T&gt;(Collections.EMPTY_LIST); }
  public &lt;T, U&gt; ListM&lt;U&gt; andThen(Function&lt;T, ListM&lt;U&gt;&gt; function) { return flatten(map(function)); }
  // opération complémentaire
  public static &lt;T&gt; ListM&lt;T&gt; of(List&lt;T&gt; list) { return new ListM&lt;T&gt;(list); }
}
</pre><p>Les opérations <code>flatten</code> et <code>map</code> dont dépend <code>andThen</code> sont définies ci-dessous. <code>map</code> a pour rôle d&#8217;appliquer une fonction sur chaque élément d&#8217;une liste. Il en ressort une liste contenant les éléments transformés. Dans le cas de notre monade List, chaque élément est converti en une instance de ListM, contenant zéro, une ou plusieurs valeurs selon ce que retourne la fonction donnée en paramètre. Donc, plus exactement, il ressort de <code>map</code> une liste de listes, qu&#8217;il faut aplatir. C&#8217;est le rôle de <code>flatten</code>.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public &lt;U&gt; ListM&lt;U&gt; map(Function&lt;T, U&gt; function) {
  return new ListM&lt;U&gt;(Lists.transform(list, function));
}
public static &lt;T&gt; ListM&lt;T&gt; flatten(ListM&lt;ListM&lt;T&gt;&gt; list) {
  List&lt;T&gt; result = new ArrayList&lt;T&gt;();
  for (ListM&lt;T&gt; sublist : list) {
    result.addAll(sublist.get());
  }
  return new ListM&lt;T&gt;(result);
}
// autre définition pour flatten
public static &lt;T&gt; ListM&lt;T&gt; flatten(ListM&lt;T&gt;... list) {
  List&lt;T&gt; result = new ArrayList&lt;T&gt;();
  for (ListM&lt;T&gt; sublist : list) {
    result.addAll(sublist.get());
  }
  return new ListM&lt;T&gt;(result);
}
</pre><p>Avec les monades List, nous allons être capable d&#8217;établir des relations entre des ensembles de valeurs. Nous ajoutons donc l&#8217;opération <code>guard</code> afin d&#8217;exprimer ce type de relation. Dans le code ci-dessous, il faut bien comprendre que les valeurs retournées par <code>guard</code> nous importent peu. Ce qui nous intéresse c&#8217;est l&#8217;effet qu&#8217;elle aura sur le chaînage. Si le paramètre de <code>guard</code> est <code>true</code>, alors le chaînage doit pouvoir continuer. Dans le cas contraire, si le paramètre est <code>false</code>, le chaînage doit être « cassé ». Pour en faciliter sa compréhension, il faut voir <code>guard</code> comme un filtre ou un <code>if</code> au niveau du chaînage.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public static ListM&lt;Object&gt; guard(boolean ok) {
  return ok ? ListM.wrap(null) : fail();
}
</pre><h4><a
name="Monades%2BJava%3Dmonstrecosmique%3F-Exemple%3Aaugmentationdesalaire%5C%21"></a>Exemple : augmentation de salaire !</h4><p>Nous allons voir un exemple d&#8217;utilisation de la monade liste. L&#8217;exemple ci-dessous permet de mettre en place des augmentations de salaire pour un ensemble d&#8217;employés. Ces augmentations suivent une règle complexe :</p><ul><li>10 % pour les salaires de moins de 20&#8217;000,</li><li>5 % pour les salaires à partir de 20&#8217;000 jusqu&#8217;à 30&#8217;000,</li><li>2 % pour les salaires à partir de 30&#8217;000 jusqu&#8217;à 100&#8217;000.</li></ul><pre class="brush: java; gutter: true; title: ; notranslate">
List&lt;Double&gt; SALARIES = Arrays.asList(10000.0, 20000.0, 30000.0, 40000.0, 50000.0);
ListM&lt;Double&gt; result = ListM.flatten(
    ListM.of(SALARIES).andThen(whenSalaryInRange(    0.0,  20000.0, increaseSalaryBy(0.10))),
    ListM.of(SALARIES).andThen(whenSalaryInRange(20000.0,  40000.0, increaseSalaryBy(0.05))),
    ListM.of(SALARIES).andThen(whenSalaryInRange(30000.0, 100000.0, increaseSalaryBy(0.02))));
assertThat(result.get()).containsExactly(11000.0, 21000.0, 30600.0, 40800.0, 51000.0);
</pre><p>Dans cet exemple, chaque ligne située en paramètre dans la méthode <code>flatten</code> produit une liste dont nous donnerons les détails plus bas. <code>flatten</code> permet de concaténer ces listes. Remarquons que dans cet exemple, la liste <code>SALARIES</code> est parcourue trois fois, soit à chaque fois que <code>ListM.of(SALARIES)...</code> apparaît.</p><p>Les définitions de <code>whenSalaryInRange</code> et <code>increaseSalaryBy</code> sont données ci-dessous. <code>increaseSalaryBy</code> applique une augmentation par rapport à un taux. <code>whenSalaryInRange</code> vérifie qu&#8217;un salaire se situe dans une fourchette donnée grâce à la méthode <code>guard</code>. Le cas échéant, elle exécute la fonction donnée en paramètre.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public static Function&lt;Double, ListM&lt;Double&gt;&gt; whenSalaryInRange(
      final double lower,
      final double upper,
      final Function&lt;Double, ListM&lt;Double&gt;&gt; function) {
  return new Function&lt;Double, ListM&lt;Double&gt;&gt;() {
    @Override
    public ListM&lt;Double&gt; apply(final Double salary) {
      return ListM.guard((lower &lt;= salary) &amp;&amp; (salary &lt; upper))
                  .andThen(apply(function, salary));
    }
  };
}
public static &lt;T, R&gt; Function&lt;Object, R&gt; apply(Function&lt;T, R&gt; function, final T element) {
  return new Function&lt;Object, R&gt;() {
    @Override
    public R apply(Object _) {
      return function.apply(element);
    }
  };
}
public static Function&lt;Double, ListM&lt;Double&gt;&gt; increaseSalaryBy(final double rate) {
  return new Function&lt;Double, ListM&lt;Double&gt;&gt;() {
    @Override
    public ListM&lt;Double&gt; apply(Double salary) {
      return ListM.wrap(salary * (1.0 + rate));
    }
  };
}
</pre><p>Le but de <code>apply</code> est de retarder l&#8217;évaluation de la fonction passée en paramètre sur <code>salary</code>. En effet, dans <code>whenSalaryInRange</code>, <code>guard</code> va vérifier que le salaire qui sera fournit est bien présent dans les bornes données en paramètres. Nous avons donc d&#8217;abord besoin de savoir si l&#8217;évaluation de <code>guard</code> à réussi avant de pouvoir appliquer <code>function</code>, sans quoi son évaluation n&#8217;a aucun sens. Remarquez l&#8217;utilisation de _ au niveau de la fonction retournée par la méthode <code>apply</code>. Il s&#8217;agit, par convention, d&#8217;indiquer que le paramètre doit être présent mais que nous ne tenons pas compte de sa valeur.</p><h3><a
name="Monades%2BJava%3Dmonstrecosmique%3F-Conclusion"></a>Conclusion</h3><p>Nous venons de voir les implémentations de deux monades : la monade Option et la monade List. La monade Option permet de gérer une succession d&#8217;opérations sans que nous ayons à gérer explicitement l&#8217;absence de valeur. La monade List permet, elle, d&#8217;appliquer des opérations unitaires sur des ensembles de valeurs. Au delà de toute considération académique, ce qu&#8217;apportent en premier lieu les monades dans ce que nous avons vu, c&#8217;est la possibilité de traiter des objets sans avoir à se soucier réellement des cas particuliers. Tout ce que vous avez à faire est d&#8217;écrire votre succession d&#8217;opérations. Si un cas exceptionnel apparaît, il sera absorbé par la monade et transparaîtra d&#8217;une manière ou d&#8217;une autre dans le résultat sans que cela se traduise par une fin tragique à coup de chaînage d&#8217;exceptions sans origine apparente. Cependant, la valeur ajoutée des monades peut sembler moyenne voire minime en Java. Elle varie d&#8217;un côté avec notre aisance à lire et écrire des types génériques alambiqués. Elle varie aussi avec notre capacité à comprendre l&#8217;enchevêtrement de closures qui n&#8217;est pas forcément mis à l&#8217;honneur avec la verbosité de Java (même si elle est améliorée avec Java 8 ) et ne rentre pas non plus forcément dans les habitudes du développeur Java. Enfin, et c&#8217;est surtout valable pour la monade List, il n&#8217;y a aucun gain de performance.</p><p>Le gain que va apporter les monades en Java ne se situe donc pas dans la définition des monades et des fonctions annexes ni dans les performances. Le gain des monades en Java se situe en fait dans son intégration dans le code métier et dans la lisibilité qu&#8217;elle y apporte. L&#8217;adoption des monades en Java sera donc contraint par le gain en lisibilité et le besoin en performance que peut vous apporter une solution impérative. Si vous êtes en présence de code légué et torturé, il y a de fortes chances qu&#8217;une monade puisse vous aider à y voir plus clair. Par contre, si vous avez une bonne maîtrise du code de votre projet, la solution impérative sera en général préférable. Mais, dans le cas où c&#8217;est la monade qui gagne, prenez le temps d&#8217;expliquer le concept à vos collègues en faisant <del>un</del> des points techniques et par le biais du <em>pair programming</em>.</p><p>L&#8217;ensemble des monades présentées ici est loin d&#8217;être exhaustif. Il y en a d&#8217;autres pour des usages divers et variés, mais qui n&#8217;ont pas forcément d&#8217;intérêt en Java au vu de la complexité qu&#8217;aurait leur implémentation. Parmi celles-ci, nous avons la monade Writer qui offre un moyen d&#8217;ajouter des informations à chaque traitement exécuté et de les agréger. Plus concrètement, la monade Writer permet de mettre en place un système de log ou un système de calcul d&#8217;un sous-total. La monade Reader permet de disposer d&#8217;un contexte d&#8217;exécution en lecture seule. La monade IO permet de confiner les opérations d&#8217;entrée/sortie. Toutes ces monades existent afin de conserver la <em>pureté fonctionnelle</em> de l&#8217;application et se justifient parfaitement pour des langages comme Scala et plus particulièrement pour le langage Haskell. Ces deux langages offrent un bon nombre de facilités d&#8217;écriture pour définir et utiliser des monades ; facilités qui manquent malheureusement en Java.</p><p>Vous pouvez comparer ce qui a été vu ici avec l&#8217;approche proposée par Scala pour les monades à travers la série d&#8217;articles de <a
href="http://blog.xebia.fr/author/dgalichet/" rel="nofollow">David Galichet</a> sur le sujet, à commencer par [<a
href="http://blog.xebia.fr/2012/04/04/monades-java-monstre-cosmique/#Monades%2BJava%3Dmonstrecosmique%3F-3">3</a>].</p><p>Enfin, une petite citation issue de Twitter :</p><blockquote><p><a
href="https://twitter.com/#!/codemonkeyism" rel="nofollow">@codemonkeyism</a> With all monads you can *flatmap that shit* (© <a
href="https://twitter.com/#!/runarorama" rel="nofollow">@runarorama</a>) and that powers all of them .. (including Option)<br
/> – <a
href="https://twitter.com/#!/debasishg" rel="nofollow">@debasishg</a> &#8211; 7:23 PM &#8211; 15 Mar 12</p></blockquote><h3><a
name="Monades%2BJava%3Dmonstrecosmique%3F-R%C3%A9f%C3%A9rences"></a>Références</h3><ul><li><a
name="Monades%2BJava%3Dmonstrecosmique%3F-1"></a>[1] John Backus. &laquo;&nbsp;Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs&nbsp;&raquo;. ACM Turing Awards Lecture. 1977 (<a
href="http://www.stanford.edu/class/cs242/readings/backus.pdf" rel="nofollow">http://www.stanford.edu/class/cs242/readings/backus.pdf</a>).</li><li><a
name="Monades%2BJava%3Dmonstrecosmique%3F-2"></a>[2] Wolfgang De Meuter. &laquo;&nbsp;Monads as Theoretical Foundation for AOP&nbsp;&raquo;. International Workshop on Aspect-Oriented Programming<br
/> at ECOOP. 1997 (<a
href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.4757" rel="nofollow">http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.4757</a>).</li><li><a
name="Monades%2BJava%3Dmonstrecosmique%3F-3"></a>[3] David Galichet. &laquo;&nbsp;Les types monadiques de Scala &#8211; Le type Option&nbsp;&raquo;. <a
href="http://blog.xebia.fr/" rel="nofollow">Blog Xebia France</a>. Mars 2012 (<a
href="http://blog.xebia.fr/2012/03/19/les-types-monadiques-de-scala-le-type-option/" rel="nofollow">http://blog.xebia.fr/2012/03/19/les-types-monadiques-de-scala-le-type-option/</a>).</li><li><a
name="Monades%2BJava%3Dmonstrecosmique%3F-4"></a>[4] Daniel Spiewack. &laquo;&nbsp;Monads Are Not Metaphors&nbsp;&raquo;. <a
href="http://www.codecommit.com/blog/" rel="nofollow">Code Commit</a>. Décembre 2010 (<a
href="http://www.codecommit.com/blog/ruby/monads-are-not-metaphors" rel="nofollow">http://www.codecommit.com/blog/ruby/monads-are-not-metaphors</a>).</li><li><a
name="Monades%2BJava%3Dmonstrecosmique%3F-5"></a>[5] Nicolas Tabareau. &laquo;&nbsp;A Monadic Interpretation of Execution Levels and Exceptions for AOP&nbsp;&raquo;. Modularity: AOSD&#8217;12. 2012 (<a
href="http://hal.inria.fr/docs/00/66/30/88/PDF/aspect_2_category_aosd_2012.pdf" rel="nofollow">http://hal.inria.fr/docs/00/66/30/88/PDF/aspect_2_category_aosd_2012.pdf</a>).</li></ul><p><em>Illustration : Godzilla vs. Cosmic Monster, Downtown Distribution, 1974.</em></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/04/04/monades-java-monstre-cosmique/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> </channel> </rss>
