<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2frenchfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Le Blog d'Ippon Technologies</title>
	
	<link>http://blog.ippon.fr</link>
	<description>Les experts Java EE, Portail et SOA</description>
	<lastBuildDate>Fri, 17 May 2013 07:38:18 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/LeBlogDesExpertsJ2ee" /><feedburner:info uri="leblogdesexpertsj2ee" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=fr&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/bn/intatm_fr_1.gif">Subscribe with Mon Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/LeBlogDesExpertsJ2ee" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FLeBlogDesExpertsJ2ee" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Big Data : La jungle des différentes distributions open source Hadoop</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/pjoYCNhZ65Q/</link>
		<comments>http://blog.ippon.fr/2013/05/14/big-data-la-jungle-des-differentes-distributions-open-source-hadoop/#comments</comments>
		<pubDate>Tue, 14 May 2013 07:30:34 +0000</pubDate>
		<dc:creator>Christophe PARAGEAUD</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Outils]]></category>
		<category><![CDATA[BigData]]></category>
		<category><![CDATA[Cloudera]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[HDFS]]></category>
		<category><![CDATA[HortonWorks]]></category>
		<category><![CDATA[MapR]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7863</guid>
		<description><![CDATA[Aujourd’hui il est difficile de se retrouver dans la jungle d’Hadoop pour les raisons suivantes : - Ce sont des technologies jeunes. - Beaucoup de buzz et de communication de sociétés qui veulent prendre le train Big Data en marche. - Des raccourcis sont souvent employés (non MapReduce ou un équivalent n’est pas suffisant pour parler d’Hadoop). - Beaucoup d’acteurs différents (des mastodontes, des spécialistes du web, des startups, …). Dans cet article on évoquera les trois distributions majeures que sont Cloudera, Hortonworks et MapR, toutes les trois se basant sur Apache Hadoop.  <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/05/14/big-data-la-jungle-des-differentes-distributions-open-source-hadoop/">Big Data : La jungle des différentes distributions open source Hadoop</a></span>]]></description>
				<content:encoded><![CDATA[<style type="text/css" media="screen"><!--
BODY { counter-reset: h2counter; } H1.t1 { counter-reset: h2counter; margin-top: 15px; } H2.t2 { counter-reset: h3counter; margin-top: 30px;} H3.t3 { counter-reset: h4counter; margin-top: 20px;} H4.t4 { counter-reset: h5counter; } H5.t5 { counter-reset: h6counter; } H2.t2:before { content: counter(h2counter) ". "; counter-increment: h2counter; } H3.t3:before { content: counter(h2counter) "." counter(h3counter) ". "; counter-increment: h3counter; } H4.t4:before { content: counter(h2counter) "." counter(h3counter) "." counter(h4counter) ". "; counter-increment: h4counter; } H5.t5:before { content: counter(h2counter) "." counter(h3counter) "." counter(h4counter) "." counter(h5counter) ". "; counter-increment: h5counter; }
--></style>
<h1 class="t1">L&#8217;écosystème Hadoop</h1>
<p dir="ltr">En 2004, Google a publié un article présentant son algorithme de calcul à grande échelle, MapReduce, ainsi que son système de fichier en cluster, GoogleFS. Rapidement (2005) une version open source voyait le jour sous l’impulsion de Yahoo.</p>
<p dir="ltr">Aujourd’hui il est difficile de se retrouver dans la jungle d’Hadoop pour les raisons suivantes :</p>
<ol>
<li dir="ltr">
<p dir="ltr">Ce sont des technologies jeunes.</p>
</li>
<li dir="ltr">
<p dir="ltr">Beaucoup de buzz et de communication de sociétés qui veulent prendre le train Big Data en marche.</p>
</li>
<li dir="ltr">
<p dir="ltr">Des raccourcis sont souvent employés (non MapReduce ou un équivalent n’est pas suffisant pour parler d’Hadoop).</p>
</li>
<li dir="ltr">
<p dir="ltr">Beaucoup d’acteurs différents (des mastodontes, des spécialistes du web, des start-up, …).</p>
</li>
</ol>
<p dir="ltr">Dans une distribution Hadoop on va retrouver les éléments suivants (ou leur équivalence) HDFS, MapReduce, ZooKeeper, HBase, Hive, HCatalog, Oozie, Pig,  Sqoop, &#8230;</p>
<p dir="ltr">Ces solutions sont des projets Apache et donc disponibles mais l’intérêt d&#8217;un package complet est évident : compatibilité entre les composants, simplicité d’installation, support, &#8230;</p>
<p dir="ltr">Dans cet article on évoquera les trois distributions majeures que sont Cloudera, HortonWorks et MapR, toutes les trois se basant sur Apache Hadoop.</p>
<p dir="ltr">On peut toutefois les distinguer en fonction de la distance qu’elles prennent avec cette base :</p>
<ul>
<li dir="ltr">
<p dir="ltr">MapR : noyau Hadoop mais repackagé et enrichi de solutions propriétaires.</p>
</li>
<li dir="ltr">
<p dir="ltr">Cloudera : fidèle en grande partie sauf pour les outils d’administration.</p>
</li>
<li dir="ltr">
<p dir="ltr">HortonWorks : fidèle à la distribution Apache et donc 100% open source.</p>
</li>
</ul>
<p dir="ltr">Il existe d&#8217;autres distributions, voire des offres cloud, mais qui n&#8217;offrent pas l&#8217;ensemble des fonctionnalités d&#8217;une plate forme Hadoop ou ne sont pas open source (ou a minima gratuites) comme Intel Distribution for Hadoop ou bien Greenplum (Pivotal HD).<span id="more-7863"></span></p>
<h2 class="t2">Le cœur : Hadoop kernel</h2>
<p dir="ltr">Hadoop est le framework le plus utilisé actuellement pour manipuler et faire du Big Data.</p>
<p dir="ltr">Apache Hadoop est un framework qui va permettre le traitement de données massives sur un cluster allant de une à plusieurs centaines de machines, c&#8217;est un projet open source (Apache v2 licence).</p>
<p dir="ltr">Hadoop est écrit en Java et a été créé par <em><strong>Doug Cutting</strong></em> et <em><strong>Michael Cafarella</strong></em> en 2005 (Doug, travaillait alors pour Yahoo sur son projet de crawler web Nutch).</p>
<p dir="ltr">C&#8217;est lui qui va gérer la distribution des données au cœur des machines du cluster, leurs éventuelles défaillances mais aussi l&#8217;agrégation du traitement final.</p>
<p dir="ltr">L’architecture est de type « Share nothing » : aucune donnée n’est traitée par deux noeuds différents même si les données sont réparties sur plusieurs noeuds (principe d’un noeud primaire et de noeuds secondaires).<b> </b></p>
<h3 class="t3">HDFS (Hadoop Distributed File System)</h3>
<p dir="ltr">HDFS est un système de fichiers Java utilisé pour stocker des données structurées ou non sur un ensemble de serveurs distribués.</p>
<p dir="ltr">HDFS s’appuie sur le système de fichier natif de l’OS pour présenter un système de stockage unifié reposant sur un ensemble de disques et de systèmes de fichiers hétérogènes.</p>
<p dir="ltr">La consistance des données est basée sur la redondance. Une donnée est stockée sur au moins n volumes différents.</p>
<p dir="ltr"><span style="text-decoration: underline;">Éléments importants :</span></p>
<p dir="ltr">Node (Master/slave) : Dans une architecture Hadoop chaque membre pouvant traiter des données est appelé node (Noeud). Un seul d&#8217;entre eux peut être master même s&#8217;il peut changer au cours de la vie du cluster.</p>
<p dir="ltr">Il est responsable de la localisation des données dans le cluster (il est appelé Name Node). Les autres sont des slaves appelés Data Nodes.</p>
<p dir="ltr">Bien qu’il puisse y avoir plusieurs Name Nodes, la “promotion” doit se faire manuellement (Hadoop 2.0, actuellement en version alpha, introduit un failover automatisé).</p>
<p dir="ltr">Le Name Node est donc un Single Point Of Failure (SPOF) dans un cluster Hadoop.</p>
<p dir="ltr">Au sein du cluster, les données sont découpées et distribuées en blocks selon les deux paramètres suivants :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Blocksize : Taille unitaire de stockage (généralement 64 Mo ou 128 Mo). C&#8217;est à dire qu&#8217;un fichier de 1 Go (et une taille de block de 128 Mo) sera divisé en 8 blocks.</p>
</li>
<li dir="ltr">
<p dir="ltr">Replication factor : C&#8217;est le nombre de copies d&#8217;une données devant être réparties sur les différents noeuds du cluster (souvent 3, c&#8217;est à dire une primaire et deux secondaires).</p>
</li>
</ul>
<p>Enfin, un principe important d&#8217;HDFS est que les fichiers sont de type &#8220;write-once&#8221; car dans des opérations analytiques on lit la donnée beaucoup plus qu&#8217;on l&#8217;écrit. C&#8217;est donc sur la lecture que les efforts ont été portés.<br />
Ce qui signifie que l&#8217;on ne modifie pas les données déjà présentes.</p>
<p>Un principe lié est qu&#8217;à partir du moment ou un fichier HDFS est ouvert en écriture, il est verrouillé pendant toute la durée du traitement.<br />
Il est donc impossible d&#8217;accéder à des données ou à un résultat tant que le job n&#8217;est pas terminé et n&#8217;a pas fermé le fichier (et un fichier peut être très volumineux avec Hadoop).</p>
<p><b></b><b><a href="http://blog.ippon.fr/wp-content/uploads/2013/05/HDFS.png"><img class="wp-image-7881 aligncenter" alt="HDFS" src="http://blog.ippon.fr/wp-content/uploads/2013/05/HDFS.png" width="460" height="417" /></a> </b></p>
<h4 class="t4">Alternatives</h4>
<h5 class="t5">MapR</h5>
<p dir="ltr">En mai 2011, MapR a annoncé une alternative au système HDFS. Ce système permet d&#8217;éviter le SPOF qu&#8217;est le Name Node. Ce système n&#8217;est pas inconnu car il s&#8217;agit de HBase, dont elle propose une version propriétaire.</p>
<h5 class="t5">HBase (Apache)</h5>
<p dir="ltr">HBase est un sous-projet d&#8217;Hadoop, c’est un système de gestion de base de données non relationnelles distribué, écrit en Java, disposant d&#8217;un stockage structuré pour les grandes tables.</p>
<p dir="ltr">HBase est inspirée des publications de Google sur BigTable. Comme BigTable, c’est une base de données orientée colonnes.</p>
<p dir="ltr">HBase est souvent utilisé conjointement au système de fichiers HDFS, ce dernier facilitant la distribution des données de HBase sur plusieurs noeuds.</p>
<p dir="ltr">Contrairement à HDFS, HBase permet de gérer les accès aléatoires read/write pour des applications de type temps réel.</p>
<h5 class="t5">Cassandra (Facebook)</h5>
<p dir="ltr">Cassandra est une base de données orientée colonnes développée sous l’impulsion de Facebook.</p>
<p dir="ltr">Cassandra supporte l’exécution de jobs MapReduce qui peuvent y puiser les données en entrée et y stocker les résultats en retour (ou bien dans un système de fichiers).</p>
<p dir="ltr">Cassandra comparativement à HBase est meilleur pour les écritures alors que ce dernier est plus performant pour les lectures.</p>
<h5 class="t5">Offre Cloud</h5>
<p dir="ltr">Le cloud est un complément idéal au monde Hadoop, en offrant des possibilités de stockage et de traitement extensibles.</p>
<p dir="ltr">Il est donc possible d’utiliser un système de fichiers situé dans le cloud pour le stockage des données et l’exécution des traitements.</p>
<p dir="ltr">Solutions supportées :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Amazon S3.</p>
</li>
<li dir="ltr">
<p dir="ltr">Kosmix’s CloudStore.</p>
</li>
<li dir="ltr">
<p dir="ltr">IBM GPFS (General Parallel File System).</p>
</li>
</ul>
<h3 class="t3">MapReduce</h3>
<p dir="ltr">A l&#8217;origine crée par Google pour son outil de recherche web.</p>
<p dir="ltr">C&#8217;est un framework qui permet le décomposition d&#8217;une requête importante en un ensemble de requêtes plus petites qui vont produire chacune un sous ensemble du résultat final : c’est la fonction Map.</p>
<p dir="ltr">L’ensemble des résultats est traité (agrégation, filtre) : c’est la fonction Reduce.</p>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/05/MR.png"><img class="wp-image-7883 aligncenter" alt="MR" src="http://blog.ippon.fr/wp-content/uploads/2013/05/MR.png" width="525" height="390" /></a></p>
<h4 class="t4">Alternatives</h4>
<h5 class="t5">YARN (HortonWorks)</h5>
<p dir="ltr">YARN (Yet-Another-Resource-Negotiator) est aussi appelé  MapReduce 2.0, ce n&#8217;est pas une refonte mais une évolution du framework MapReduce.</p>
<p dir="ltr">YARN apporte une séparation claire entre les problématiques suivantes :</p>
<ul>
<li>Gestion de l&#8217;état du cluster et des ressources.</li>
<li>Gestion de l&#8217;exécution des jobs.</li>
</ul>
<p dir="ltr">YARN est compatible avec les anciennes versions de MapReduce (il faut simplement recompiler le code).</p>
<h2 class="t2">Les extensions</h2>
<h3 class="t3">Requêtage des données : Hive (Facebook)</h3>
<p dir="ltr">Hive est à l&#8217;origine un projet Facebook qui permet de faire le lien entre le monde SQL et Hadoop.</p>
<p dir="ltr">Il permet l&#8217;exécution de requêtes SQL sur un cluster Hadoop en vue d&#8217;analyser et d’agréger les données.</p>
<p dir="ltr">Le langage SQL est nommé HiveQL. C&#8217;est un langage de visualisation uniquement, c&#8217;est pourquoi seules les instructions de type “Select” sont supportées pour la manipulation des données.</p>
<p dir="ltr">Dans certains cas, les développeurs doivent faire le mapping entre les structures de données et Hive.</p>
<p dir="ltr">Hive utilise un connecteur jdbc/odbc.</p>
<h3 class="t3">Scripting sur les données : Pig (Yahoo)</h3>
<p dir="ltr">Pig est à l&#8217;origine un projet Yahoo qui permet le requêtage des données Hadoop à partir d&#8217;un langage de script.</p>
<p dir="ltr">Contrairement à Hive, Pig est basé sur un langage de haut niveau PigLatin qui permet de créer des programmes de type MapReduce.</p>
<p dir="ltr">Contrairement à Hive, Pig ne dispose pas d&#8217;interface web.</p>
<h3 class="t3">Intégration SGBD-R : Sqoop (Cloudera)</h3>
<p dir="ltr">Sqoop permet le transfert des données entre un cluster Hadoop et des bases de données relationnelles.</p>
<p dir="ltr">C&#8217;est un produit développé par Cloudera.</p>
<p dir="ltr">Il permet d’importer/exporter des données depuis/vers Hadoop et Hive.</p>
<p dir="ltr">Pour la manipulation des données Sqoop utilise MapReduce et des drivers JDBC.</p>
<h3 class="t3">Ordonnanceur : Apache Oozie (Yahoo)</h3>
<p dir="ltr">Oozie est une solution de workflow (au sens scheduler d’exploitation) utilisée pour gérer et coordonner les tâches de traitement de données à destination de Hadoop.</p>
<p dir="ltr">Oozie s’intègre parfaitement avec l’écosystème Hadoop puisqu’il supporte les types de jobs suivant :</p>
<ul>
<li dir="ltr">
<p dir="ltr">MapReduce (Java et Streaming).</p>
</li>
<li dir="ltr">
<p dir="ltr">Pig.</p>
</li>
<li dir="ltr">
<p dir="ltr">Hive.</p>
</li>
<li dir="ltr">
<p dir="ltr">Sqoop.</p>
</li>
<li dir="ltr">
<p dir="ltr">Autres tels que programmes Java ou scripts de type Shell.</p>
</li>
</ul>
<h2 class="t2">Gestion des clusters Hadoop</h2>
<h3 class="t3">Clustering</h3>
<h4 class="t4">Apache ZooKeeper</h4>
<p dir="ltr">ZooKeeper est un service de coordination des services d’un cluster Hadoop.</p>
<p dir="ltr">En particulier, le rôle de ZooKeeper est de fournir aux composants Hadoop les fonctionnalités de distribution.</p>
<p dir="ltr">Pour cela il centralise les éléments de configuration du cluster Hadoop, propose des services de clusterisation et gère la synchronisation des différents éléments (événements).</p>
<p dir="ltr">ZooKeeper est un élément indispensable au bon fonctionnement de HBase.<b> </b></p>
<h3 class="t3">Supervision</h3>
<h4 class="t4">Apache Ambari (HortonWorks)</h4>
<p dir="ltr">Ambari est un projet d’incubation Apache initié par HortonWorks et destiné à la supervision et à l’administration de clusters Hadoop.</p>
<p dir="ltr">C’est un outil web qui propose un tableau de bord. Cela permet de visualiser rapidement l’état d’un cluster.</p>
<p dir="ltr">Ambari dispose d’un tableau de bord dont le rôle est de fournir une représentation :</p>
<ul>
<li dir="ltr">
<p dir="ltr">De l’état des services.</p>
</li>
<li dir="ltr">
<p dir="ltr">De la configuration du cluster et des services.</p>
</li>
<li dir="ltr">
<p dir="ltr">Des informations issues de Ganglia et de Nagios.</p>
</li>
<li dir="ltr">
<p dir="ltr">De l’exécution des jobs.</p>
</li>
<li dir="ltr">
<p dir="ltr">Des métriques de chaque machine et du cluster.</p>
</li>
</ul>
<p dir="ltr">De plus Ambari inclue un système de gestion de configuration permettant de déployer des services d’Hadoop ou de son écosystème sur des clusters de machines.</p>
<p dir="ltr">Ambari se positionne en alternative à Chef, Puppet pour les solutions génériques ou encore à Cloudera Manager pour le monde Hadoop.</p>
<p dir="ltr">Ambari ne se limite pas à Hadoop mais permet de gérer également tous les outils de l’écosystème.</p>
<p dir="ltr">Les outils annoncés sont :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Hadoop</p>
</li>
<li dir="ltr">
<p dir="ltr">HDFS</p>
</li>
<li dir="ltr">
<p dir="ltr">MapReduce</p>
</li>
<li dir="ltr">
<p dir="ltr">Hive, HCatalog</p>
</li>
<li dir="ltr">
<p dir="ltr">Oozie</p>
</li>
<li dir="ltr">
<p dir="ltr">HBase</p>
</li>
<li dir="ltr">
<p dir="ltr">Ganglia, Nagios</p>
</li>
</ul>
<h2 class="t2">Autres</h2>
<h3 class="t3">Apache Flume (Cloudera)</h3>
<p dir="ltr">Flume est une solution de collecte et d&#8217;agrégation de fichiers logs, destinés à être stockés et traités par Hadoop.</p>
<p dir="ltr">Il a été conçu pour s’interfacer directement avec HDFS au travers d’une API native.</p>
<p dir="ltr">Flume est à l’origine un projet Cloudera, reversé depuis à la fondation Apache.</p>
<p dir="ltr">Alternatives : Apache Chukwa.</p>
<h3 class="t3">Apache Mahout</h3>
<p dir="ltr">Apache Mahout est un projet de la fondation Apache visant à créer des implémentations d&#8217;algorithmes d&#8217;apprentissage automatique et de datamining.</p>
<p dir="ltr">Même si les principaux algorithmes d’apprentissage se basent sur MapReduce, il n’y a pas d’obligation à utiliser Hadoop. Apache Mahout ayant été conçu pour pouvoir fonctionner sans cette dépendance.<b> </b></p>
<h3 class="t3">Apache Drill (MapR)</h3>
<p dir="ltr">Initié par MapR, Drill est un système distribué permettant d’effectuer des requêtes sur de larges données. Il implémente les concepts exposés par le projet Google Dremel.</p>
<p dir="ltr">Drill permet d’adresser le besoin temps réel d’un projet Hadoop. MapReduce étant plutôt conçu pour traiter de larges volumes de données en batch sans objectif de rapidité et sans possibilité de redéfinir la requête à la volée.</p>
<p dir="ltr">Drill est donc un système distribué qui permet l’analyse interactive des données, ce n’est pas un remplacement de MapReduce mais un complément qui est plus adapté pour certains besoins.</p>
<h3 class="t3">Apache HCatalog (HortonWorks)</h3>
<p dir="ltr">HCatalog permet l&#8217;interopérabilité d&#8217;un cluster de données Hadoop avec des systèmes externes.</p>
<p dir="ltr">HCatalog est un service de management de tables et de schéma des données Hadoop :</p>
<ul>
<li>Permet d’attaquer les données HDFS via des schémas de type tables de données en lecture/écriture.</li>
<li>Permet d&#8217;opérer sur des données issues de MapReduce, Pig ou Hive.</li>
</ul>
<h3 class="t3">Apache Tez (HortonWorks)</h3>
<p dir="ltr">Tez est un nouveau framework en incubation chez Apache.</p>
<p dir="ltr">Utilisant YARN il remplace MapReduce afin de fournir des requêtes dites “temps réel”. La faible latence est en effet un pré requis à l’exploration interactive des données stockées sur un cluster Hadoop.</p>
<p dir="ltr">C’est un concurrent d’Apache Drill (MapR) ou de Cloudera Impala.</p>
<h2 class="t2">Vue d&#8217;ensemble de la plate forme Hadoop</h2>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/05/Apache-Hadoop.png"><img class="wp-image-7873 aligncenter" alt="Apache Hadoop" src="http://blog.ippon.fr/wp-content/uploads/2013/05/Apache-Hadoop.png" width="477" height="402" /></a></p>
<h2 class="t2">Les distributions</h2>
<h3 class="t3">HortonWorks</h3>
<h4 class="t4">Présentation</h4>
<p dir="ltr">HortonWorks a été formé en juin 2011 par des membres de l’équipe Yahoo en charge du projet Hadoop.</p>
<p dir="ltr">Leur but est de faciliter l’adoption de la plate forme Hadoop d’Apache, c’est pourquoi tous les composants sont open source et sous licence Apache.</p>
<p dir="ltr">Le modèle économique d’HortonWorks est de ne pas vendre de licence mais uniquement du support et des formations.</p>
<p dir="ltr">Cette distribution est la plus conforme à la plate forme Hadoop d’Apache et HortonWorks est un gros contributeur Hadoop.</p>
<p dir="ltr">Parmi les projets reversés il y a :</p>
<ul>
<li dir="ltr">
<p dir="ltr">YARN,</p>
</li>
<li dir="ltr">
<p dir="ltr">HCatalog,</p>
</li>
<li dir="ltr">
<p dir="ltr">Ambari,</p>
</li>
<li dir="ltr">
<p dir="ltr">&#8230;</p>
</li>
</ul>
<h4 class="t4">Composants de la plate forme HDP</h4>
<p dir="ltr">Les éléments suivants composent la plate forme HortonWorks :</p>
<ol>
<li dir="ltr">
<p dir="ltr">Cœur Hadoop (HDFS/MapReduce).</p>
</li>
<li dir="ltr">
<p dir="ltr">NoSQL (Apache HBase).</p>
</li>
<li dir="ltr">
<p dir="ltr">Méta-données (Apache HCatalog).</p>
</li>
<li dir="ltr">
<p dir="ltr">Plate forme de script (Apache Pig).</p>
</li>
<li dir="ltr">
<p dir="ltr">Requêtage (Apache Hive).</p>
</li>
<li dir="ltr">
<p dir="ltr">Planification(Apache Oozie).</p>
</li>
<li dir="ltr">
<p dir="ltr">Coordination (Apache Zookeeper).</p>
</li>
<li dir="ltr">
<p dir="ltr">Gestion et supervision (Apache Ambari).</p>
</li>
<li dir="ltr">
<p dir="ltr">Services d’intégration (HCatalog APIs, WebHDFS, Talend Open Studio for Big Data, Apache Sqoop).</p>
</li>
<li dir="ltr">
<p dir="ltr">Gestion distribuée des logs (Apache Flume).</p>
</li>
<li dir="ltr">
<p dir="ltr">Apprentissage (Apache Mahout).</p>
</li>
</ol>
<h4 class="t4">Vision d’ensemble de la distribution</h4>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/05/Horton.png"><img class="size-full wp-image-7869 aligncenter" alt="Horton" src="http://blog.ippon.fr/wp-content/uploads/2013/05/Horton.png" width="580" height="312" /></a></p>
<h4 class="t4">Déploiement de la plate forme</h4>
<h5 class="t5">Machine Virtuelle prête à l’emploi</h5>
<p dir="ltr">HortonWorks met à disposition une machine virtuelle ou sont pré installés les composants de la plate forme Hadoop.</p>
<p dir="ltr">C’est l’idéal pour l’apprentissage de la plate forme mais incompatible avec les exigences de production ou même celles d’un POC.</p>
<h5 class="t5">Installation automatique avec Ambari</h5>
<p dir="ltr">En plus de la gestion du cluster, Ambari permet le déploiement de l&#8217;ensemble des composants Hadoop de manière centralisée.</p>
<h5 class="t5">Installation manuelle avec Linux RPM</h5>
<p dir="ltr">HortonWorks met à disposition des packages RPM.</p>
<p dir="ltr">En utilisant le principe des RPM Linux il est possible d’installer les composants HDP manuellement.</p>
<h3 class="t3">Cloudera</h3>
<h4 class="t4">Présentation</h4>
<p dir="ltr">Cloudera se veut comme la compagnie commerciale Hadoop.</p>
<p dir="ltr">Fondée par des experts Hadoop en provenance de Facebook, Google, Oracle et Yahoo.</p>
<p dir="ltr">Si leur plate forme est en grande partie basée sur Hadoop d’Apache, elle est complétée avec des composants maison essentiellement pour la gestion du cluster.</p>
<p dir="ltr">A noter aussi que la version d’Apache Hadoop distribuée est la dernière version stable complétée de patchs critiques ainsi que de quelques fonctionnalités de la version de développement.</p>
<p dir="ltr">Le modèle économique de Cloudera est la vente de licences mais aussi du support et des formations.<b> </b></p>
<p dir="ltr">Cloudera propose une version entièrement open source de leur plate forme (Licence Apache 2.0).</p>
<h4 class="t4">Composants de la plate forme CDH (Cloudera’s Distribution including Apache Hadoop)</h4>
<p dir="ltr"><span style="text-decoration: underline;">Composants Apache :</span></p>
<ul>
<li dir="ltr">
<p dir="ltr">HDFS : File System distribué.</p>
</li>
<li dir="ltr">
<p dir="ltr">MapReduce : Framework de traitement parallélisé.</p>
</li>
<li dir="ltr">
<p dir="ltr">HBase : Base de données NoSQL (accès read/write aléatoires).</p>
</li>
<li dir="ltr">
<p dir="ltr">Hive : Requêtage de type SQL.</p>
</li>
<li dir="ltr">
<p dir="ltr">Pig : Scripting et requêtage Hadoop.</p>
</li>
<li dir="ltr">
<p dir="ltr">Oozie : Workflow et planification de jobs Hadoop.</p>
</li>
<li dir="ltr">
<p dir="ltr">Sqoop : Intégration de bases SQL.</p>
</li>
<li dir="ltr">
<p dir="ltr">Flume : Exploitation de fichiers (log) dans Hadoop.</p>
</li>
<li dir="ltr">
<p dir="ltr">ZooKeeper : Service de coordination pour les applications distribuées.</p>
</li>
<li dir="ltr">
<p dir="ltr">Mahout : Framework d’apprentissage et de datamining pour Hadoop.</p>
</li>
</ul>
<p dir="ltr"><span style="text-decoration: underline;">Composants d’origine Cloudera :</span></p>
<ul>
<li dir="ltr">
<p dir="ltr">Hadoop Common: Un ensemble d’utilitaires.</p>
</li>
<li dir="ltr">
<p dir="ltr">Hue : SDK permettant de développer des interfaces utilisateur pour les applications Hadoop.</p>
</li>
<li dir="ltr">
<p dir="ltr">Whirr : Librairies et scripts pour l’exécution d’Hadoop et de services liés dans le cloud.</p>
</li>
</ul>
<p dir="ltr"><span style="text-decoration: underline;">Composants non Apache Hadoop :</span></p>
<ul>
<li dir="ltr">
<p dir="ltr">Cloudera Impala : Moteur temps réel de requêtage SQL parallélisé de données stockées dans HDFS ou HBase. Contrairement à Hive de Hadoop, Impala n&#8217;utilise pas le framework MapReduce qui exige que les résultats de recherche soient écrits sur le disque, ce qui lui permet d&#8217;exécuter les requêtes plus rapidement. La consultation des données peut être interactive. Licence : ASLv2.</p>
</li>
</ul>
<ul>
<li dir="ltr">
<p dir="ltr">Cloudera Manager : Déploiement et gestion des composants Hadoop.</p>
</li>
</ul>
<p dir="ltr">A noter que Cloudera Manager n’est pas entièrement Open Source mais dispose d’une version gratuite avec quelques restrictions :</p>
<ul>
<li dir="ltr">
<p dir="ltr">La version gratuite est limitée à 50 noeuds.</p>
</li>
<li dir="ltr">
<p dir="ltr">Certaines fonctionnalités sont uniquement disponibles sur la version commerciale (comme le monitoring, les sauvegardes et les mises à jour automatiques).</p>
</li>
<li dir="ltr">
<p dir="ltr">Support uniquement pour la version payante.</p>
</li>
</ul>
<h4 class="t4">Vision d’ensemble de la distribution</h4>
<p><b><a href="http://blog.ippon.fr/wp-content/uploads/2013/05/Cloudera.png"><img class="size-full wp-image-7870 aligncenter" alt="Cloudera" src="http://blog.ippon.fr/wp-content/uploads/2013/05/Cloudera.png" width="656" height="321" /></a></b><b><br />
</b></p>
<h4 class="t4">Déploiement de la plate forme</h4>
<h5 class="t5">Automatique avec Cloudera Manager</h5>
<p dir="ltr">Cloudera Manager permet l’installation des composants de la plate forme sur une machine (y compris distante).</p>
<p dir="ltr">Cloudera Manager permet la configuration centralisée des composants du cluster.</p>
<p dir="ltr">Enfin Cloudera Manager permet de finaliser l’installation en vérifiant le bon fonctionnement de chacun des composants.</p>
<h5 class="t5">Manuel avec les packages</h5>
<p dir="ltr">Récupération des archives tarball (tgz) contenant la distribution.</p>
<p dir="ltr">Configuration et installation à l’aide des scripts fournis.</p>
<h3 class="t3">MapR</h3>
<h4 class="t4">Présentation</h4>
<p dir="ltr">MapR a été fondée en 2009 par d’anciens membres de Google.</p>
<p dir="ltr">Bien que son approche soit commerciale, MapR contribue à des projets Apache Hadoop comme HBase, Pig, Hive, ZooKeeper et surtout Drill.<b> </b></p>
<p dir="ltr">MapR se distingue surtout de la version d’Apache Hadoop par sa prise de distance avec le cœur de la plate-forme. Ils proposent ainsi leur propre système de fichier distribué ainsi que leur propre version de MapReduce : MapR FS et MapR MR.</p>
<p dir="ltr">Trois versions de leur solution sont disponibles :</p>
<ul>
<li dir="ltr">
<p dir="ltr">M3 : version open source.</p>
</li>
<li dir="ltr">
<p dir="ltr">M5 : Ajoute des fonctions de haute disponibilité et du support.</p>
</li>
<li dir="ltr">
<p dir="ltr">M7 : Environnement HBase optimisé.</p>
</li>
</ul>
<p dir="ltr">MapR a remporté de beaux succès commerciaux depuis sa création.</p>
<ul>
<li dir="ltr">
<p dir="ltr">Un partenariat avec EMC pour une la création et le support d’une version spécifique à la plate forme Hadoop d&#8217;EMC.</p>
</li>
<li dir="ltr">
<p dir="ltr">MapR est à l’origine de la version cloud de MapReduce d’Amazon : Elastic Map Reduce (EMR).</p>
</li>
<li dir="ltr">
<p dir="ltr">Enfin ils ont été retenu par Google pour l’offre Big Data de Google Compute Engine (GCE).</p>
</li>
</ul>
<h4 class="t4">Contenu de la distribution MapR M3</h4>
<p dir="ltr"><span style="text-decoration: underline;">Composants Apache :</span></p>
<ul>
<li dir="ltr">
<p dir="ltr">HBase,</p>
</li>
<li dir="ltr">
<p dir="ltr">Pig,</p>
</li>
<li dir="ltr">
<p dir="ltr">Hive,</p>
</li>
<li dir="ltr">
<p dir="ltr">Mahout,</p>
</li>
<li dir="ltr">
<p dir="ltr">Cascading,</p>
</li>
<li dir="ltr">
<p dir="ltr">Sqoop,</p>
</li>
<li dir="ltr">
<p dir="ltr">Flume</p>
</li>
</ul>
<p dir="ltr">MapR propose son propre système en remplacement de HDFS :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Une version maison de HBase (performance et fiabilité améliorées).</p>
</li>
</ul>
<p dir="ltr">Avantages :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Système plus adapté au mode read/write que HDFS.</p>
</li>
<li dir="ltr">
<p dir="ltr">MapR intègre un serveur NFS (Network File System) pour l’intégration au SI de l’entreprise.</p>
</li>
<li dir="ltr">
<p dir="ltr">Simplification de mise en oeuvre (surcouche du File System de l’OS et non remplacement comme HDFS).</p>
</li>
<li dir="ltr">
<p dir="ltr">Plus de Single Point Of Failure.</p>
</li>
</ul>
<p dir="ltr">MapR FS reste compatible avec les API MapReduce/HDFS et HBase.</p>
<p dir="ltr">MapR propose son propre système en remplacement de MapReduce d’Apache.</p>
<p dir="ltr">Avantages :</p>
<ul>
<li dir="ltr">
<p dir="ltr">MapR annonce de meilleures performances.</p>
</li>
<li dir="ltr">
<p dir="ltr">Entièrement optimisé pour HBase.</p>
</li>
</ul>
<p dir="ltr"><span style="text-decoration: underline;">MapR Control System (MCS)</span></p>
<p dir="ltr">MCS permet la gestion et la supervision du cluster Hadoop. C’est un outil web permettant à la fois les ressources du cluster (CPU, Ram, Disque) que les services et les jobs.</p>
<p dir="ltr">MCS permet de définir des alarmes sur des seuils ou des quotas &#8230;</p>
<p dir="ltr">La visualisation des informations est assurée par le composant HeatMap.</p>
<p dir="ltr"><span style="text-decoration: underline;">Autres spécificités :</span></p>
<p dir="ltr"><strong>Apache Cascading</strong></p>
<p dir="ltr">Cascading est un framework Java dédié à Hadoop. Il permet à un développeur Java de retrouver ses marques (JUnit, Spring, etc&#8230;) et de manipuler les concepts d’Hadoop avec un langage de haut niveau sans en  connaître les API.</p>
<p dir="ltr"><strong>Apache Vaidya</strong></p>
<p dir="ltr">Hadoop Vaidya est un outil d’analyse des performances des jobs MapReduce.</p>
<p dir="ltr">Son principe de fonctionnement est basé sur des règles qu’il confronte aux statistiques d’exécution des jobs et aux fichiers de configuration.</p>
<p dir="ltr">Le rapport est produit au format XML.</p>
<p dir="ltr"><strong>Apache Drill</strong></p>
<p dir="ltr">MapReduce a la réputation d’être puissant mais complexe à manipuler (il faut en maîtriser l&#8217;API).</p>
<p dir="ltr">De plus, il est impossible de redéfinir les requêtes à la volée.</p>
<p dir="ltr">Drill vient compléter MapReduce et se présente sous la forme d’une API permettant de créer plus rapidement des requêtes en se basant sur le modèle SQL.<b><br />
</b></p>
<p dir="ltr">SQL plutôt qu&#8217;une nouvelle API, c&#8217;est donc le choix de la capitalisation fait par Drill.</p>
<h4 class="t4">Vision d’ensemble de la distribution</h4>
<p><b></b><b><a href="http://blog.ippon.fr/wp-content/uploads/2013/05/MapR.png"><img class="size-full wp-image-7871 aligncenter" alt="MapR" src="http://blog.ippon.fr/wp-content/uploads/2013/05/MapR.png" width="656" height="324" /></a> </b></p>
<h4 class="t4">Déploiement de la plate forme</h4>
<h5 class="t5">Machine virtuelle</h5>
<p dir="ltr">MapR fourni une machine virtuelle avec un seul noeud et l’ensemble des composants installés.</p>
<p dir="ltr">C’est l’idéal pour une prise en main de la plate-forme mais incompatible avec les exigences de production.</p>
<h5 class="t5">Manuelle avec les packages</h5>
<p dir="ltr">MapR ne fournit pas de système de déploiement Hadoop.</p>
<p dir="ltr">L’installation est donc essentiellement manuelle avec des automatisations possibles.</p>
<p dir="ltr">Tout d’abord il faut récupérer les composants à installer :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Depuis le repository internet</p>
</li>
<li dir="ltr">
<p dir="ltr">Depuis un repository local</p>
</li>
<li dir="ltr">
<p dir="ltr">Avec des packages Debian/Linux</p>
</li>
</ul>
<p dir="ltr">Après édition de la configuration il faut ensuite exécuter les scripts fourni pour installer les composants MapR sur chaque machine.</p>
<p dir="ltr">A noter que la distribution ne contient pas les composants Apache et qu’il faut les installer manuellement.</p>
<h2 class="t2">Conclusion</h2>
<p dir="ltr">Les trois distributions ont une approche et un positionnement différent en ce qui concerne la vision d’une plate forme Hadoop (open source, modèle économique&#8230;).</p>
<p dir="ltr">Le choix se portera sur l’une ou l’autre solution en fonction des exigences :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Solution open source.</p>
</li>
<li dir="ltr">
<p dir="ltr">Maturité de la solution.</p>
</li>
<li dir="ltr">
<p dir="ltr">Partenariats et compatibilité avec les produits satellites.<b> </b></p>
</li>
</ul>
<p dir="ltr">Le choix d&#8217;une distribution est d&#8217;autant plus difficile que l&#8217;avenir d&#8217;Hadoop est loin d&#8217;être tout tracé.</p>
<p dir="ltr">En effet des virages technologiques importants sont d&#8217;ores et déjà annoncés :</p>
<ol>
<li dir="ltr">
<p dir="ltr">Hadoop est né afin de répondre à la problématique suivante : comment traiter des téra-octets de données simplement ?</p>
</li>
</ol>
<p dir="ltr" style="padding-left: 30px;">La réponse proposée alors, un système de fichier distribué, est arrivée à un moment où il était impossible de traiter de tels volumes de données en mémoire. Maintenant le coût de la RAM a fortement baissé et avec la généralisation des architecture 64 bits ce n&#8217;est plus tout à fait exact.</p>
<ol start="2">
<li dir="ltr">
<p dir="ltr">La sécurité : elle est encore balbutiante malgré quelques initiatives comme Apache Knox.</p>
</li>
</ol>
<ol start="3">
<li dir="ltr">
<p dir="ltr">L&#8217;intégration avec le SI, une plate forme Hadoop isolée et non intégrée au système d&#8217;information ne sera plus possible dans le futur (en tout cas certains besoins exigeront une interaction plus grande).</p>
</li>
</ol>
<ol start="4">
<li dir="ltr">
<p dir="ltr">Un support direct des transactions ce qui a toujours été un challenge très important dans le monde des données distribuées.</p>
</li>
</ol>
<h3 class="t3">Cloudera</h3>
<p dir="ltr">Le vétéran ce qu’il lui donne une légitimité et un nombre de clients supérieur à ces concurrents.</p>
<p dir="ltr">Un autre avantage est de disposer dans ses rangs de <em><strong>Doug Cutting</strong></em> le créateur d’Hadoop.</p>
<p dir="ltr">Cloudera est très prompt à sortir les dernières versions d’Hadoop (les premiers à sortir une distribution compatible Hadoop 2.0).</p>
<p dir="ltr">Les principaux partenaires sont IBM, HP, Oracle.</p>
<h3 class="t3">MapR</h3>
<p dir="ltr">La plus éloignée d’Apache Hadoop car elle intègre leur propre vision de MapReduce et HDFS. Après Cloudera c’est la solution la plus mature.</p>
<p dir="ltr">C’est aussi la solution la plus simple à  installer grâce à leur utilisation du file system natif.</p>
<p dir="ltr">Beaucoup de partenariats de haut niveau et très stratégiques sur le cloud (Amazon Elastic MapReduce et Google Compute Engine).</p>
<h3 class="t3">HortonWorks</h3>
<p dir="ltr">C’est la seule plate forme 100 % Apache Hadoop.</p>
<p dir="ltr">La stratégie assumée d’HortonWorks est de se baser sur les versions stables et testées d’Apache Hadoop plutôt que sur les dernières versions.</p>
<p dir="ltr">Leur solution de gestion du cluster, Ambari, n’est pas aussi mature que la concurrence : Cloudera Manager et HeatMap.</p>
<p dir="ltr">Malgré sa relative jeunesse, HortonWorks a signé des partenariats importants avec IBM, Microsoft, Teradata et Talend. Ils ont notamment signé avec Microsoft un accord pour le déploiement de leur plate forme sur Azure.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/pjoYCNhZ65Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/05/14/big-data-la-jungle-des-differentes-distributions-open-source-hadoop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/05/14/big-data-la-jungle-des-differentes-distributions-open-source-hadoop/</feedburner:origLink></item>
		<item>
		<title>Des portlets à la sauce Ember.js</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/Doeqk2fw9zQ/</link>
		<comments>http://blog.ippon.fr/2013/05/07/des-portlets-a-la-sauce-ember-js/#comments</comments>
		<pubDate>Tue, 07 May 2013 10:00:47 +0000</pubDate>
		<dc:creator>Bertrand PINEL</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Portail]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Ember.js]]></category>
		<category><![CDATA[Emberjs]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[Liferay]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7803</guid>
		<description><![CDATA[Le revival du Javascript <p>Il y a une poignée d&#8217;années, prononcer le mot Javascript face à un développeur JavaEE, c&#8217;était comme parler de la valeur du ticket restaurant lors d&#8217;un premier entretien d&#8217;embauche… Juste un truc pas complètement à côté de la plaque, mais plutôt à éviter, un aspect de la réalisation qu&#8217;il fallait mieux <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/05/07/des-portlets-a-la-sauce-ember-js/">Des portlets à la sauce Ember.js</a></span>]]></description>
				<content:encoded><![CDATA[<h2>Le revival du Javascript</h2>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/04/ember-logo.jpg"><img class="size-full wp-image-7806 alignleft" alt="ember-logo" src="http://blog.ippon.fr/wp-content/uploads/2013/04/ember-logo.jpg" width="225" height="225" /></a>Il y a une poignée d&#8217;années, prononcer le mot Javascript face à un développeur JavaEE, c&#8217;était comme parler de la valeur du ticket restaurant lors d&#8217;un premier entretien d&#8217;embauche… Juste un truc pas complètement à côté de la plaque, mais plutôt à éviter, un aspect de la réalisation qu&#8217;il fallait mieux cacher comme la poussière qu&#8217;on pousse sous le tapis…</p>
<p>Et puis, progressivement, une révolution a eu lieu : le HTML5 s&#8217;est précisé, l&#8217;outillage s&#8217;est raffiné (merci Firebug et Chrome !) et surtout des frameworks de plus en plus puissants et faciles à utiliser ont fleuri (en commençant par JQuery), permettant d&#8217;exploiter à fond les capacités impressionnantes de ce langage. Et petit à petit, les technologies Front ont retrouvé grâce auprès des développeurs JavaEE.</p>
<p>Dernier acte à ce jour, la parution de plusieurs solutions dites de MVC javascript, telles que BackBone.js (qui fait déjà figure d&#8217;ancêtre !), Angular.js et Ember.js (pour ne citer que les plus populaires).</p>
<h2>Ember.js : mon petit préféré&#8230;</h2>
<p>Dans ce post, nous nous intéresserons uniquement à <a title="Ember.js" href="http://emberjs.com" target="_blank">Ember.js</a>, qui est à mon goût, la solution la plus complète et la plus &#8220;élégante&#8221; (en tout cas de celles que j&#8217;ai pu aborder…)</p>
<p>Ember est un framework Javascript issu du projet SproutCore, grandement utilisé par Apple notamment pour ses applications Web. Contrairement à <a title="Backbone.js" href="http://backbonejs.org" target="_blank">Backbone.js</a>, Ember est directement conçu pour être couplé à <a title="Handlebars.js" href="http://handlebarsjs.com" target="_blank">Handlebars</a> pour les aspects templating, et offre immédiatement des possibilités de binding bi-directionnelles. Il est dépendant de JQuery.</p>
<p>Son apprentissage est relativement rapide, grâce à un site Web plutôt didactique et à une bonne documentation de l&#8217;API (en tout cas, tant qu&#8217;on ne touche pas à Ember-data qui fera sûrement l&#8217;objet d&#8217;un autre post&#8230;). Je recommande cependant l&#8217;excellent article d&#8217;Andy Matthews (http://www.adobe.com/devnet/html5/articles/flame-on-a-beginners-guide-to-emberjs.html) pour une première plongée. C&#8217;est clairement cet article qui m&#8217;a permis d&#8217;écrire le mien ! Il y a également un très bon tutoriel vidéo directement disponible sur le site.</p>
<p>Étant un amateur de portail (j&#8217;ai prononcé un gros mot ?), je me suis dit qu&#8217;il serait intéressant de voir dans quelle mesure il pourrait être possible d&#8217;utiliser Ember dans le cadre particulier d&#8217;une portlet. Il n&#8217;y a rien d&#8217;évident à cela, sachant que ce type de framework est généralement conçu pour manipuler une page Web, alors même qu&#8217;une portlet ne produira qu&#8217;un fragment de la page… La cible retenue est l&#8217;inusable Liferay.</p>
<h2>Maven et Liferay : c&#8217;est possible !</h2>
<p>Depuis la version 6.1 du portail <a title="Liferay" href="http://www.liferay.com" target="_blank">Liferay</a>, il est possible d&#8217;abandonner le plugin sdk de l&#8217;éditeur pour une structure plus classique de projet Maven. Liferay publie en effet à la fois les artefacts du portail et les plugins de construction ou de déploiement sur des repositories publics.</p>
<p>Pour aller plus loin, vous aurez donc besoin :</p>
<ul>
<li>De télécharger et de dézipper un bundle Liferay/tomcat (disponible à l&#8217;URL http://www.liferay.com/downloads/liferay-portal/available-releases),</li>
<li>D&#8217;avoir une installation Maven opérationnelle sur votre station.</li>
</ul>
<p>Pour plus de simplicité, il est préférable de définir au préalable un profile spécifique à l&#8217;installation locale de son portail Liferay dans le fichier settings.xml du répertoire .m2. Ce profile est du type :</p>
<pre class="brush: xml; title: ; notranslate">
  &lt;profile&gt;
    &lt;id&gt;emberlf&lt;/id&gt;
    &lt;properties&gt;
       &lt;liferay.version&gt;6.1.1&lt;/liferay.version&gt;
       &lt;liferay.auto.deploy.dir&gt;%path to liferay bundle%/Liferay6.1/liferay-portal-6.1.1-ce-ga2/deploy&lt;/liferay.auto.deploy.dir&gt;
    &lt;/properties&gt;
  &lt;/profile&gt;
</pre>
<p>Démarrer votre portail et lancer la création du squelette de projet de portlet par la commande suivante :</p>
<pre class="brush: bash; title: ; notranslate">
  mvn archetype:generate -DarchetypeArtifactId=liferay-portlet-archetype -DarchetypeGroupId=com.liferay.maven.archetypes -DarchetypeVersion=6.1.0 -DgroupId=fr.ippon.liferay.ember -DartifactId=ember-portlet -Dversion=1.0-SNAPSHOT -DinteractiveMode=false
</pre>
<p>Charger le projet dans votre éditeur, et vous avez alors une magnifique portlet qui ne fait rien… On peut même la déployer sur le portail à l&#8217;aide d&#8217;une commande :</p>
<pre class="brush: bash; title: ; notranslate">
  mvn -Pemberlf package liferay:deploy
</pre>
<p>Ah si, elle affiche &#8220;This is the ember-portlet.&#8221;.</p>
<p>Le reste de cet article va vous montrer comment faire rapidement bien mieux !</p>
<h2>Intégration d&#8217;Ember à la portlet</h2>
<p>Avant toute chose, il faut bien entendu récupérer la distribution d&#8217;Ember.js et les frameworks associés. Cet article se base sur la version 1.0.0-rc3.</p>
<p>La première chose à faire est de recopier les ressources ember dans le projet</p>
<ul>
<li> ember-1.0.0-rc.3.js, handlebars-1.0.0-rc3.js et jquery-1.9.1.min.js dans le répertoire ember-portlet/src/main/webapp/js</li>
</ul>
<p>Une fois ces ressources copiées, il convient de les déclarer à la portlet. Cette déclaration s&#8217;effectue au travers du fichier liferay-portlet.xml en y ajoutant les lignes :</p>
<pre class="brush: xml; title: ; notranslate">
        &lt;footer-portlet-javascript&gt;/js/jquery-1.9.1.min.js&lt;/footer-portlet-javascript&gt;
        &lt;footer-portlet-javascript&gt;/js/handlebars.js&lt;/footer-portlet-javascript&gt;
        &lt;footer-portlet-javascript&gt;/js/ember-1.0.0-rc.1.js&lt;/footer-portlet-javascript&gt;
</pre>
<p>On va également ajouter dans le fichier main.js déjà présent (créé par défaut par Liferay), la déclaration de l&#8217;application Ember.js, plus quelques petites subtilités permettant de valider le fonctionnement d&#8217;Ember.js :</p>
<pre class="brush: jscript; gutter: true; title: ; notranslate">
  App = Ember.Application.create({
    rootElement: $('section#portlet_emberportlet_WAR_emberportlet')
  });

  App.ApplicationView = Ember.View.extend({
    click: function(evt) {
      alert(&quot;Well done ! En plein sur la View Ember de la portlet !&quot;);
    }
  });

  App.ApplicationController = Ember.Controller.extend({
    templateName: 'Ember portlet',
    people: [
      {firstName: &quot;Kitien&quot;, lastName: &quot;Laroutte&quot;},
      {firstName: &quot;Sophie&quot;, lastName: &quot;Fonsec&quot;},
      {firstName: &quot;Igor&quot;, lastName: &quot;Saherseize&quot;}
    ]
  });
</pre>
<p>Le point le plus important (et peu documenté…) est que l&#8217;on initialise l&#8217;application en lui passant un &#8216;rootElement&#8217; correspondant au contenu de la portlet. Cela permet de limiter et de positionner les actions sur le DOM effectuées par le framework, qui est ainsi restreint au fragment de page servi par la portlet.</p>
<p>Le reste est assez standard :</p>
<ul>
<li>On crée une vue, dans laquelle on définit un événement sur le clic,</li>
<li>On crée un contrôleur qui se contente pour le moment de définir des données pour affichage dans la JSP…</li>
</ul>
<p>Rien de très dynamique pour le moment.</p>
<p>vous pouvez alors modifier votre fichier view.jsp de la façon suivante :</p>
<pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;%@ taglib uri=&quot;http://java.sun.com/portlet_2_0&quot; prefix=&quot;portlet&quot; %&gt;

&lt;portlet:defineObjects /&gt;

&lt;script type=&quot;text/x-handlebars&quot;&gt;

    &lt;h3&gt;{{templateName}} &lt;/h3&gt;
    &lt;ul&gt;
        {{#each people}}
            &lt;li&gt;Hello {{firstName}}&lt;/li&gt;
        {{/each}}
    &lt;/ul&gt;
&lt;/script&gt;
</pre>
<p>Après déploiement de la portlet par un mvn -Pember-liferay clean package liferay:deploy et placement dans une page du portail, on obtient la vue de la liste des personnes déclarées précédemment.</p>
<p>Et un clic sur le fragment de page affichant la portlet produit l&#8217;affichage d&#8217;une boîte d&#8217;alerte.</p>
<p>Il est maintenant temps d&#8217;aller un cran plus loin !</p>
<h2>Service Liferay et JSON</h2>
<p>Liferay est un portail offrant une architecture de services particulièrement ouverte. On bénéficie ainsi de nombreux services SOAP ou REST/JSon permettant de manipuler les principaux objets créés au travers du &#8220;service builder&#8221;.</p>
<p>Pour consulter (et tester !) ces services JSON, il suffit de se rendre sur la page suivante de son portail local :</p>
<pre class="brush: bash; title: ; notranslate">

http://localhost:8080/api/jsonws

</pre>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/05/get-file-entries.jpg"><img class="size-full wp-image-7806 alignleft" alt="ember-logo" src="http://blog.ippon.fr/wp-content/uploads/2013/05/get-file-entries.jpg" width="225" height="400" /></a></p>
<p>L&#8217;appel suivant, une fois les valeurs de repositoryId et de token d&#8217;authentification fixés permet par exemple de récupérer les fichiers stockés dans le répertoire de la bibliothèque :</p>
<pre class="brush: bash; title: ; notranslate">
http://localhost:8080/api/secure/jsonws/dlapp/get-file-entries?repositoryId=&lt;repoId&gt;&amp;folderId=0&amp;p_auth=&lt;token secu&gt;
</pre>
<p>On va donc mettre à profit cette capacité pour construire une petite interface permettant de lister les répertoires de la bibliothèque Liferay et les fichiers qu&#8217;ils contiennent.</p>
<h2>C&#8217;est beau la mécanique Ember !</h2>
<p>Dans toute application Ember.js, l&#8217;essentiel de l&#8217;interface et de la cinématique applicative est réparti entre les fichiers HTML et Javascript. Les deux sont intimement liés et doivent normalement s&#8217;aborder simultanément, ce qui est assez difficile dans le cas d&#8217;un post de Blog, vous en conviendrez&#8230; On va donc commencer par s&#8217;intéresser à la partir JSP de notre portlet. Pour cela, il convient de remplacer le contenu de view.jsp par le code suivant :</p>
<pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;%@ page import=&quot;com.liferay.portlet.documentlibrary.model.DLFolderConstants&quot; %&gt;
&lt;%@ page import=&quot;com.liferay.portal.kernel.util.WebKeys&quot; %&gt;
&lt;%@ page import=&quot;com.liferay.portal.theme.ThemeDisplay&quot; %&gt;
&lt;%@ page import=&quot;com.liferay.portal.security.auth.AuthTokenUtil&quot; %&gt;

&lt;%@ taglib uri=&quot;http://java.sun.com/portlet_2_0&quot; prefix=&quot;portlet&quot; %&gt;
&lt;%@ taglib prefix=&quot;liferay-portlet&quot; uri=&quot;http://liferay.com/tld/portlet&quot; %&gt;

&lt;portlet:defineObjects /&gt;
&lt;%
    String auth= AuthTokenUtil.getToken(request);
    ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
    long defaultRepoId = DLFolderConstants.getDataRepositoryId(themeDisplay.getScopeGroupId(), DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
%&gt;

&lt;script language=&quot;javascript&quot;&gt;
     var repoId = &lt;%=defaultRepoId%&gt;;
&lt;/script&gt;

&lt;script type=&quot;text/x-handlebars&quot;&gt;
    &lt;div id=&quot;selector&quot;&gt;
        &lt;div id=&quot;file-entries-frm&quot;&gt;
            &lt;b&gt;Select File Directory: &lt;/b&gt;
            {{view Ember.Select
            contentBinding=&quot;App.fileDirectoriesSelector.content&quot;
            optionLabelPath=&quot;content.folderName&quot;
            optionValuePath=&quot;content.id&quot;
            valueBinding=&quot;App.fileDirectoriesSelector.selectedFolderId&quot;
            prompt=&quot;Select a folder :&quot;
            }}
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;hr/&gt;
    &lt;div id=&quot;filelist&quot;&gt;
        {{view App.FileListView}}
    &lt;/div&gt;
&lt;/script&gt;

&lt;script type=&quot;text/x-handlebars&quot; data-template-name=&quot;filelist&quot;&gt;

    &lt;div id=&quot;file-entries-content&quot;&gt;
        &lt;div id=&quot;file-entries&quot;&gt;
            &lt;ul&gt;
                {{#each App.fileEntriesController}}
                &lt;li&gt;
                    &lt;span&gt;{{size}} octets&lt;/span&gt;
                    &lt;h3&gt;{{name}}-{{title}}&lt;/h3&gt;
                    &lt;p&gt;{{description}}&lt;/p&gt;
                &lt;/li&gt;
                {{/each}}
            &lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;

&lt;/script&gt;
</pre>
<p>Évidemment, ce code, même assez concis mérite quelques explications. Explorons le ligne par ligne :</p>
<ul>
<li>Lignes 11 à 19 : Un premier point à résoudre, purement Liferay, consiste à récupérer l&#8217;identifiant du repository par défaut du portail.On doit pouvoir faire mieux, mais cette partie de la JSP n&#8217;existe que pour cela&#8230;</li>
<li>Lignes 21 : On pose le template d&#8217;affichage de la vue Ember. Ce template ne dispose pas d&#8217;attribut data_template_name (on peut aussi fixer cette attribut à &#8220;application&#8221;).</li>
<li>Ligne 25 : Introduction d&#8217;un sélecteur Ember avec toute la magie de ce framework ! Ainsi on binde non seulement les valeurs affichées sur une variable Javascript (<em>contentBinding</em>), mais également le résultat d&#8217;une action de sélection (<em>valueBinding</em>). Tout cela sera plus clair en analysant le fichier Javascript</li>
<li>Ligne 35 : On intègre la vue définie par <em>App.FileListView</em>. On verra que cette vue s&#8217;appuie sur le template défini en ligne 40</li>
<li>Ligne 45 : On utilise les capacités de boucle du framework pour afficher autant de blocs HTML qu&#8217;il y a de fichiers présents dans le répertoire sélectionné. Libre à vous d&#8217;afficher d&#8217;autres informations, liées à l&#8217;objet <em>App.FileEntry</em></li>
</ul>
<p>Comme déjà précisé plus haut, le seul fichier JSP est largement insuffisant pour comprendre la mécanique Ember, l&#8217;essentiel de l&#8217;application étant dans le fichier javascript. Pour cela, on va modifier le fichier main.js pour qu&#8217;il contienne le code suivant :</p>
<pre class="brush: jscript; gutter: true; title: ; notranslate">
/**************************
* Application
**************************/
var App;

App = Ember.Application.create({
  rootElement: $('section#portlet_emberportlet_WAR_emberportlet'),
  LOG_TRANSITIONS: true
});

/**************************
* Models
**************************/
App.FileEntry = Em.Object.extend({
  companyId: null,
  createDate: null,
  custom1ImageId: null,
  custom2ImageId: null,
  description: null,
  extension: null,
  extraSettings: null,
  fileEntryId: null,
  fileEntryTypeId: null,
  folderId: null,
  groupId: null,
  largeImageId: null,
  mimeType: null,
  modifiedDate: null,
  name: null,
  readCount: null,
  repositoryId: null,
  size: null,
  smallImageId: null,
  title: null,
  userId: null,
  userName: null,
  uuid: null,
  version: null,
  versionUserId: null,
  versionUserName: null
});

/**************************
* Views
**************************/
App.FileListView = Ember.View.extend({
  templateName: 'filelist',
  classNames: ['filelist']
});

App.FileDirectoriesSelector = Ember.Object.extend({
  selectedFolderName: &quot;&quot;,
  selectedFolderId: -1,
  selectedFolderIdChanged: function(){
  App.fileEntriesController.loadFileEntriesBySelect();}.observes('selectedFolderId')
});

App.fileDirectoriesSelector = App.FileDirectoriesSelector.create({
  content: getFolders()
});

function getFolders() {
  var url = 'http://localhost:8080/api/secure/jsonws/dlapp/get-folders/repository-id/%@/parent-folder-id/0?p_auth=%@'.fmt(repoId,Liferay.authToken);
  // Push Default folder by default
  folders = Ember.ArrayProxy.create({content:[Ember.Object.create({folderName: &quot;Root Folder&quot;, id: 0})]});
  $.getJSON(url,function(data){
    $(data).each(function(index,value){
      folders.addObject(Ember.Object.create({folderName: value.name, id: value.folderId}));
    })
  });
  return folders;
  }

/**************************
* Controllers
**************************/
App.fileEntriesController = Em.ArrayController.create({
  content: [],
  loadFileEntriesBySelect: function() {
    var me = this;
    if (App.fileDirectoriesSelector.selectedFolderId != null) {
      var url = 'http://localhost:8080/api/secure/jsonws/dlapp/get-file-entries?repositoryId=%@'.fmt(repoId);
      url += '&amp;folderId=%@&amp;p_auth=%@'.fmt(App.fileDirectoriesSelector.selectedFolderId, Liferay.authToken);
      $.getJSON(url,function(data){
        me.set('content', []);
        $(data).each(function(index,value){
          var t = App.FileEntry.create({
            description: value.description,
            extension: value.extension,
            largeImageId: value.largeImageId,
            mimeType: value.mimeType,
            modifiedDate: value.modifiedDate,
            name: value.name,
            readCount: value.readCount,
            size: value.size,
            smallImageId: value.smallImageId,
            title: value.title,
            userId: value.userId,
            userName: value.userName
          });
          me.pushObject(t);
        })
      });
    }
  }
});
</pre>
<p>Voici quelques explications concernant le contenu du fichier javascript :</p>
<ul>
<li>Lignes 6 : On déclare l&#8217;application Ember. Le premier paramètre permet de restreindre la portée du framework à la section définissant la portlet, le second est optionnel et permet de logguer les transitions dans la console Javascript (peu utile dans notre cas où l&#8217;unique transition amène sur la page par défaut).</li>
<li>Ligne 14 : On définit un objet Ember.js qui est le symétrique de l&#8217;objet manipulé par Liferay pour décrire les <em>FileEntry</em>. J&#8217;y ai mis tous les attributs, même si la plupart d&#8217;entre eux ne sont pas utilisés ici.</li>
<li>Ligne 46 : La vue intégrée dans le template par défaut est définie et pointe vers le template du même nom. Ember permet de faire plus court en utilisant des conventions de nommage. Mais pour être plus clair, j&#8217;ai préféré faire de la sorte.</li>
<li>Ligne 51 à 58 : On déclare ici un objet qui va jouer un rôle prépondérant dans le fonctionnement de l&#8217;application. Il s&#8217;agit en effet de la vue javascript du sélecteur de répertoire affiché dans le template. Cette déclaration se fait en deux temps : par extend() puis par create, car on utilise un &#8216;observateur&#8217; sur la variable <em>selectedFolderId</em> qui ne peut porter que sur un objet étendu (Attention, cette information est très mal documentée et n&#8217;est valable que sur les distributions récentes d&#8217;Ember.js). A noter également que la variable <em>content</em> s&#8217;appuie sur le retour d&#8217;une fonction</li>
<li>Ligne 62 : Cette fonction s&#8217;appuie sur les services REST de Liferay et sur JQuery pour construire la liste des répertoires présents dans la bibliothèque Liferay de premier niveau.</li>
<li>Ligne 71 : On crée un contrôleur Ember.js qui va contenir le résultat de l&#8217;appel aux services REST Liferay listant les fichiers présents dans le répertoire passé en argument. Ce contrôleur pourra ensuite être exploité dans le template d&#8217;affichage <em>filelist</em></li>
</ul>
<p>En synthèse, <em>selectedFolderId</em> est directement lié à la valeur du sélecteur HTML et toute modification de sa valeur provoquera un appel à la fonction liée à la propriété <em>selecteFolderIdChanged</em>. Elégant, non ?</p>
<p>Pour teminer et uniquement pour des aspects purement esthétiques, on va utiliser le fichier main.css suivant, qui va décorer les boites correspondant à chacun des fichiers trouvés :</p>
<pre class="brush: css; title: ; notranslate">
  #p_p_id_emberportlet_WAR_emberportlet_ {
    font-family: 'tahoma', sans-serif;
    background: #eeeeee;
  }

  #file-entries-frm {
    margin: 0 auto 15px auto;
    text-align: center;
  }

  #file-entries-content {
    border: 1px solid blue;
    margin: 0 auto;
  }

  #file-entries ul {
    padding: 0;
    border: 1px solid #999999;
  }

  #file-entries ul li {
    text-align: left;
    margin: 0;
    padding: 10px;
    list-style: none;
    border-bottom: 1px solid #999999;
    min-height: 50px;
    background: #eeeeee; /* Old browsers */
    background: -moz-linear-gradient(top, #eeeeee 0%, #dddddd 100%); /* FF3.6+ */
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eeeeee), color-stop(100%,#dddddd)); /* Chrome,Safari4+ */
    background: -webkit-linear-gradient(top, #eeeeee 0%,#dddddd 100%); /* Chrome10+,Safari5.1+ */
    background: -o-linear-gradient(top, #eeeeee 0%,#dddddd 100%); /* Opera 11.10+ */
    background: -ms-linear-gradient(top, #eeeeee 0%,#dddddd 100%); /* IE10+ */
    background: linear-gradient(top, #eeeeee 0%,#dddddd 100%); /* W3C */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#dddddd',GradientType=0 ); /* IE6-9 */
  }

  #file-entries ul li:hover {
    background: #cfe7fa; /* Old browsers */
    background: -moz-linear-gradient(top, #cfe7fa 0%, #6393c1 100%); /* FF3.6+ */
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#cfe7fa), color-stop(100%,#6393c1)); /* Chrome,Safari4+ */
    background: -webkit-linear-gradient(top, #cfe7fa 0%,#6393c1 100%); /* Chrome10+,Safari5.1+ */
    background: -o-linear-gradient(top, #cfe7fa 0%,#6393c1 100%); /* Opera 11.10+ */
    background: -ms-linear-gradient(top, #cfe7fa 0%,#6393c1 100%); /* IE10+ */
    background: linear-gradient(top, #cfe7fa 0%,#6393c1 100%); /* W3C */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cfe7fa', endColorstr='#6393c1',GradientType=0 ); /* IE6-9 */
  }

  #file-entries ul li span {
    float: right;
    font-size: 8pt;
    color: #888888;
  }

  #file-entries ul li img {
    float: left;
    margin: 0 10px 0 0;
    width: 48px;
    height: 48px;
  }

  #file-entries ul li h3 {
    font-size: 11pt;
    margin: 0;
  }

  #file-entries ul li p {
    margin: 0;
    font-size: 10pt;
  }
</pre>
<h2>Lancement de la compilation et du déploiement</h2>
<p>Reste maintenant à compiler et déployer le tout, par une commande du type :</p>
<pre class="brush: bash; title: ; notranslate">
  mvn -Pemberlf package liferay:deploy
</pre>
<p>ATTENTION, la portlet est relativement simpliste et ne fonctionne que pour un utilisateur loggué. Donc, placez la sur une page secondaire et identifiez-vous avant d&#8217;y accéder.<br />
Pour que la démonstration soit pertinente, il faut également que la bibliothèque contiennent des répertoires et des documents, histoire d&#8217;avoir des choses à afficher !</p>
<p>Vous devez dorénavant obtenir une portlet du type :<br />
<a href="http://blog.ippon.fr/wp-content/uploads/2013/05/Portlet.png"><img class="size-full wp-image-7806 alignleft" alt="ember-logo" src="http://blog.ippon.fr/wp-content/uploads/2013/05/Portlet.png" width="225" height="400" /></a></p>
<p>Pour information, voici la vue Back-office standard de Liferay sur ma bibliothèque de document, pour le même répertoire :<br />
<a href="http://blog.ippon.fr/wp-content/uploads/2013/05/Back-office.png"><img class="size-full wp-image-7806 alignleft" alt="ember-logo" src="http://blog.ippon.fr/wp-content/uploads/2013/05/Back-office.png" width="225" height="400" /></a></p>
<p>En moins de 200 lignes de code et avec une lisibilité très correct, on arrive donc à mettre en place un fonctionnement AJAX évolué sans gros effort. C&#8217;est beau le Javascript, non ?</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/Doeqk2fw9zQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/05/07/des-portlets-a-la-sauce-ember-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/05/07/des-portlets-a-la-sauce-ember-js/</feedburner:origLink></item>
		<item>
		<title>DevopsDays 2013</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/PhI9doXUfs0/</link>
		<comments>http://blog.ippon.fr/2013/05/05/devopsdays-2013/#comments</comments>
		<pubDate>Sun, 05 May 2013 08:47:48 +0000</pubDate>
		<dc:creator>Thibault CHASSAGNETTE</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Devops]]></category>
		<category><![CDATA[devopsdays]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7808</guid>
		<description><![CDATA[<p dir="ltr">Le printemps des conférences informatiques parisiennes se poursuit, après Devoxx puis le Scrum Day place aux DevopsDays qui ont eu lieu le 18 et le 19 avril dernier.</p> <p dir="ltr">Le format de ces journées est assez atypique car elles sont découpées en deux parties distinctes :</p> <p dir="ltr">Des conférences le matin concernant la culture <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/05/05/devopsdays-2013/">DevopsDays 2013</a></span>]]></description>
				<content:encoded><![CDATA[<p dir="ltr">Le printemps des conférences informatiques parisiennes se poursuit, après <a href="http://www.devoxx.com/display/FR13/Home">Devoxx </a>puis le <a href="http://www.scrumday.fr/">Scrum Day</a> place aux <a href="http://devopsdays.org/">DevopsDays</a> qui ont eu lieu le 18 et le 19 avril dernier.</p>
<p dir="ltr">Le format de ces journées est assez atypique car elles sont découpées en deux parties distinctes :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Des conférences le matin concernant la culture devops</p>
</li>
<li dir="ltr">
<p dir="ltr">Des “open spaces” l’après-midi afin de favoriser les échanges entre les participants.</p>
</li>
</ul>
<p>Différents types de profils étaient présents : les 100% ops qui cherchent à en savoir plus sur le monde du dev, les devops (50% dev, 50% ops) qui viennent parfaire leurs connaissances et trouver de nouvelles idées, les 100% devs qui cherchent quant à eux, à en savoir plus sur le monde des ops (je me range dans cette catégorie). Vous verrez, en lisant la suite, que le contenu de ces deux jours comblera les attentes des différents profils.</p>
<p><b></b><b> </b></p>
<h1 dir="ltr">Les conférences</h1>
<p><b></b><b> </b></p>
<p dir="ltr"><strong>1ère présentation : CustomerOps ou le devops appliqué au service client.</strong></p>
<p dir="ltr">Cette première présentation nous explique comment la culture devops permet d’améliorer le service client et la qualité de support chez Datadog. Leur définition du devops tient en 4 éléments :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Culture &#8211; Tous les développeurs se succèdent sur les tâches de support client afin de parfaire leur connaissance du produit.</p>
</li>
<li dir="ltr">
<p dir="ltr">Automatisation &#8211; Automatiser un maximum de processus pour gagner et réactivité et même pouvoir être pro-actif. Automatiser également les sources de retour d’utilisation de l’application (email, réseaux sociaux etc &#8230;)</p>
</li>
<li dir="ltr">
<p dir="ltr">Mesure &#8211; Utilisation de différentes métriques afin de mesurer tout ce qui se passe sur le produit.</p>
</li>
<li dir="ltr">
<p dir="ltr">Partage &#8211; Exposer ces métriques</p>
</li>
</ul>
<p><b></b><b><i></i><br />
</b></p>
<p dir="ltr"><strong>2ème présentation : Améliorer ses développements grâce aux devops</strong></p>
<p dir="ltr"><a href="https://speakerdeck.com/skade/how-devops-improved-my-dev">https://speakerdeck.com/skade/how-devops-improved-my-dev</a></p>
<p dir="ltr">Ici le speaker nous explique avec un cas concret comment la culture devops lui a permis d’améliorer la qualité et l’organisation de ses développements.</p>
<p dir="ltr">Grâce à la communication avec les ops il a pu rendre son application plus maintenable et plus facilement déployable en production.</p>
<p dir="ltr">Il a ensuite insisté sur le besoin d’avoir des métriques et du log dans chacune des applications que l’on développe afin d’avoir un maximum de retour sur son utilisation.</p>
<p dir="ltr">Le dernier point important à ses yeux est la polyvalence des développeurs; ils doivent pouvoir passer facilement d’un rôle de dev front à personne en charge du déploiement de l’application.</p>
<p><b></b><b> </b></p>
<p dir="ltr"><strong>3ème présentation : Projet ou produit ?</strong></p>
<p dir="ltr"><a href="https://speakerdeck.com/elpicador/how-products-can-improve-projects">https://speakerdeck.com/elpicador/how-products-can-improve-projects</a></p>
<p dir="ltr">Cette présentation nous montre tout d’abord les différences entre un produit (totalement orienté client) et un projet plus géré en fonction de son coût et des délais impartis.</p>
<p dir="ltr">Ensuite le speaker nous présente quels sont à ses yeux les clés du succès d’un produit :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Construire rapidement un MVP : Minimum Viable Product</p>
</li>
<li dir="ltr">
<p dir="ltr">Mesurer en ayant des feedbacks réguliers sur son produit</p>
</li>
<li dir="ltr">
<p dir="ltr">Apprendre de ses erreurs afin de construire un produit meilleur</p>
</li>
</ul>
<p dir="ltr">Ces éléments ne sont pas valables seulement pour un produit mais aussi pour un projet : “Think product, do project”</p>
<p><b></b><b> </b></p>
<p dir="ltr"><strong>4ème présentation : Transformer des devs en devops</strong></p>
<p dir="ltr">Fabrice Bernhard nous présente les éléments mis en place chez Theodo pour former ses développeurs junior à la culture devops.</p>
<p dir="ltr">La clé est d’intéresser ces nouveaux développeurs aux problématiques des ops en les confrontant à la production et en organisant du “pair devopsing” lors des phases de développement et de déploiement de l’application. Il faut ensuite les sensibiliser à l’utilisation des bons outils (mise en place de bacs à sable pour effectuer des tests) et aux problématiques de performances.</p>
<p dir="ltr">Cependant cela ne fait pas tout et un bon dev ne devient pas devops grâce à des outils. L’expérience et la responsabilité de la plateforme sont des bons leviers pour devenir devops.</p>
<p><b></b><b> </b></p>
<p dir="ltr"><strong>5ème présentation : How we release software for gov.uk</strong></p>
<p dir="ltr">Retour d’expérience sur  la “success story” anglaise du moment : la refonte du site du gouvernement.</p>
<p dir="ltr">Tout part d’un rapport intitulé “Revolution not evolution” qui préconise de créer un centre d’excellence pour rationaliser les services existants puis mettre en place les nouveaux services numériques du gouvernement. S’en suit une une accélération des cycles de livraison (4h pour envoyer un développement en production, 20 déploiements par jour),  une simplification des interfaces, une plus grande transparence (publication sur GitHub, ouverture des API), une refonte graphique (titre de “<a href="http://designmuseum.org/exhibitions/2013/designs-of-the-year-2013">Design of the year 2013</a>”). Leur mot d’ordre pour développer ce site est “digital services so good that people prefer to use them”.</p>
<p dir="ltr">Le site est effectivement, clair, pratique et utilisable depuis d’autres applications car toutes les données sont accessibles via une API ou en JSON. Exemple de question simple d’utilisation : Quand s’effectue le prochain changement d’heure ? <a href="https://www.gov.uk/when-do-the-clocks-change">https://www.gov.uk/when-do-the-clocks-change</a> ou <a href="https://www.gov.uk/when-do-the-clocks-change.json">https://www.gov.uk/when-do-the-clocks-change.json</a></p>
<p>Toujours dans un esprit de transparence et de partage leur façon de travailler est expliquée sur ce même site : <a href="https://www.gov.uk/service-manual">https://www.gov.uk/service-manual</a></p>
<p><b></b><b> </b></p>
<p dir="ltr"><strong>6ème présentation : Map &amp; Territory: A story of visibility</strong></p>
<p dir="ltr">Cette présentation part du principe qu’une fois un produit ou projet en production on passe la majeure partie de son temps à effectuer des corrections. Si l’on veut réduire ces temps de corrections on a besoin d’extraire des informations qui ont un sens depuis des sources de données hétérogènes (logs, base de données, &#8230;). Ces informations nous permettront de mieux comprendre l’utilisation faite du produit.</p>
<p dir="ltr">Avant de les extraire il faut définir des métriques clés qui indiqueront quels sont les éléments à surveiller aussi bien techniques que métiers.</p>
<p dir="ltr">Le speaker explique ensuite l’approche “event stream” : “Plenty of small producers, few big consumers”. Tout ce qui bouge doit être loggé pour être ensuite agrégé puis corrélé avec les autres métriques. Suite à cela, une décision peut être prise sur le plan d’action à mener pour corriger ou enrichir une fonctionnalité.</p>
<p dir="ltr">L’ensemble de ces métriques forme donc une carte de l’application qui nous permet de surveiller le territoire (application).</p>
<p><b></b><b> </b></p>
<p dir="ltr"><strong>7ème présentation : Les 10 pièges à éviter lors d’une transition devops</strong></p>
<p dir="ltr">Dans cette présentation les speakers nous indiquent les pièges dans lesquels il ne faut pas tomber lors de la mise en place d’une approche devops dans un projet.</p>
<p dir="ltr">Ces quelques conseils résument bien l’ensemble de ces deux jours :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Devops ce n’est pas que de l’outillage mais un ensemble outil + processus + culture</p>
</li>
<li dir="ltr">
<p dir="ltr">Il ne faut pas penser qu’au déploiement de l’application mais plutôt à la vie de l’application dans son ensemble.</p>
</li>
<li dir="ltr">
<p dir="ltr">Il ne suffit pas de désigner des équipes devops, la transition doit être faite par les équipes elles même. L’utilisation d’un coach Devops peut être nécessaire pour les aider.</p>
</li>
<li dir="ltr">
<p dir="ltr">Les aspects culturels ne sont pas à négliger et certains éléments de la transition agile peuvent être utilisés :</p>
</li>
</ul>
<ul>
<li dir="ltr">
<p dir="ltr">Amélioration continue</p>
</li>
<li dir="ltr">
<p dir="ltr">Collaboration entre les équipes</p>
</li>
<li dir="ltr">
<p dir="ltr">Transparence</p>
</li>
</ul>
<ul>
<li dir="ltr">
<p dir="ltr">Il faut mesurer un maximum de choses afin d’évaluer les progrès effectués</p>
</li>
<li dir="ltr">
<p dir="ltr">Ne pas oublier l’amélioration continue</p>
</li>
</ul>
<p><b></b><b><i></i><br />
</b></p>
<p dir="ltr">Suite aux conférences quelques Ignite Talks (présentations de 5 min chronométrées) ont eu lieu. Dur de creuser un sujet en ce court laps de temps mais quelques slides sympas :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Si Devops avait été inventé par Coca-Cola : <a href="http://www.slideshare.net/devopsdays/what-if-devops-was-invented-by-coca-cola">http://www.slideshare.net/devopsdays/what-if-devops-was-invented-by-coca-cola</a></p>
</li>
<li dir="ltr">
<p dir="ltr">Tests de performance en continue : <a href="http://devopsdays.org/events/2013-paris/proposals/PerformancesPerpetuellesIgnite/">http://devopsdays.org/events/2013-paris/proposals/PerformancesPerpetuellesIgnite/</a></p>
</li>
</ul>
<p><b></b><b><i></i><br />
</b></p>
<h1 dir="ltr">Les openspaces</h1>
<p><b></b><b> </b></p>
<p dir="ltr">Les openspaces sont des espaces de discussion libres où les règles suivantes s’appliquent :</p>
<ul>
<li dir="ltr">
<p dir="ltr">Les personnes qui se présentent, sont les bonnes.</p>
</li>
<li dir="ltr">
<p dir="ltr">Ce qui arrive, est la seule chose qui pouvait arriver.</p>
</li>
<li dir="ltr">
<p dir="ltr">Ça commence quand ça commence.</p>
</li>
<li dir="ltr">
<p dir="ltr">Quand c’est fini, c’est fini.</p>
</li>
</ul>
<p dir="ltr">Les thèmes des différents openspaces sont proposés au préalable par les personnes présentes aux DevopsDays, puis chacun s’inscrit aux discussions de son choix. Les participants aux openspaces ne sont pas obligés de rester tout le long de la discussion et sont même invités à aller de salle en salle pour assister à différentes discussions.</p>
<p>Ce format est assez intéressant car il permet de recueillir et d’échanger rapidement et facilement des idées assez variées sur un même sujet. Cependant les discussions étaient parfois décousues ou s’éloignaient assez rapidement du sujet de base. Dur pour un pur dev de rentrer dans certaines discussions mais néanmoins quelques discussions intéressantes où l’on sentait que les ops veulent mieux comprendre le monde des devs afin d’améliorer la qualité de leur travail et inversement.</p>
<p><b></b><b> </b></p>
<h1 dir="ltr">Conclusion</h1>
<p>Ces deux jours ont été très intéressants et plutôt surprenants. Je m’étais préparé (man page sur les genoux) à assister à des conférences très techniques qui parleraient de virtualisation, de configuration réseaux, de scripts de déploiement, etc &#8230; Pas du tout, les conférences étaient parfaitement accessibles et très orientées cycle de vie du projet.</p>
<p dir="ltr">L’élément le plus souvent cité est le fait de mesurer un maximum de choses sur une application. De ces mesures découleront un meilleur retour sur l’utilisation et une meilleure réactivité des équipes en charge de la maintenance du produit.</p>
<p dir="ltr">D’autres éléments présentés rejoignent aussi des arguments déjà entendus dans des conférences agiles : améliorer la communication entre les équipes, réduire les silos, apprendre en continue de ses erreurs, chercher à s’améliorer, partager ses connaissances, …</p>
<p dir="ltr">Suite à ce printemps de l’informatique, on se rapproche donc tout doucement de la recette magique pour développer rapidement une application de qualité : des équipes impliquées, une grande dose de communication, une cuillère d’agilité le tout agrémenté de métriques permettant d’avoir un retour constant.</p>
<p><b></b><b> </b></p>
<p dir="ltr"><strong>En bonus quelques bons mots des devopsdays :</strong></p>
<p dir="ltr">“I don’t want to be woken up at night, so I call myself a developper”, Florian Gilcher</p>
<p dir="ltr">“Speed is important but momentum is everything”, <a href="https://twitter.com/KushalP">Kushal Pisavadia</a></p>
<p dir="ltr">“It’s not the big that eat the small, it’s the fast that eat the slow”, <a href="https://twitter.com/theodo">Fabrice Bernhard</a></p>
<p>“Think product, do project”, <a href="https://twitter.com/El_Picador">Rémy-Christophe Schermesser</a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/PhI9doXUfs0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/05/05/devopsdays-2013/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/05/05/devopsdays-2013/</feedburner:origLink></item>
		<item>
		<title>Ippevent AngularJS le 16 mai prochain à 19h</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/zbJAAYymZ8M/</link>
		<comments>http://blog.ippon.fr/2013/04/29/ippevent-angularjs-le-16-mai-prochain-a-19h/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 13:21:22 +0000</pubDate>
		<dc:creator>Antoine SABOT-DURAND</dc:creator>
				<category><![CDATA[Ippevents]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Firebase]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7788</guid>
		<description><![CDATA[<p>Au pays des frameworks JavaScript MVC, AngularJS est une valeur montante. En rutpture avec les autres frameworks MVC, Anugular est fondé sur une approche déclarative et la mise en oeuvre de composants pour concevoir les IHM web. Il adapte et étend le HTML traditionnel pour servir le contenu dynamique via un mécanisme de data-binding permettant la <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/29/ippevent-angularjs-le-16-mai-prochain-a-19h/">Ippevent AngularJS le 16 mai prochain à 19h</a></span>]]></description>
				<content:encoded><![CDATA[<p>Au pays des frameworks JavaScript MVC, AngularJS est une valeur montante. En rutpture avec les autres frameworks MVC, Anugular est fondé sur une approche déclarative et la mise en oeuvre de composants pour concevoir les IHM web. Il adapte et étend le HTML traditionnel pour servir le contenu dynamique via un mécanisme de data-binding permettant la synchronisation automatique des modèles et des vues. Bref, AngularJS réduit considérablement le besoin de manipuler le DOM HTML et produit du code plus concis et facile à tester.</p>
<p>Lors de cet Ippevent, nous n&#8217;aurons pas 1 mais 3 speakers :</p>
<ul>
<li>Sébastien Letélié (dévelopeur Web depuis 15 ans et CTO chez Intuitive) nous fera fera une démo de live coding sur AngularJS</li>
<li>Thierry Lau (Développeur front end chez Sfeir) fera une présentation sur les modules $http et $resource du Framework.</li>
<li>Et enfin Patrick Aljord (indépendant et ancien d&#8217;IsoHunt) fera une intervention sur AngularJS et Firebase</li>
</ul>
<div>Une soirée chargée et riche en perspective.</div>
<div></div>
<div>Pour vous inscrire comme à chaque fois, utilisez le bandeau ci-dessous.</div>
<div></div>
<div style="width: 100%; text-align: left;"><iframe frameborder="0" height="214" marginheight="5" marginwidth="5" scrolling="auto" src="https://www.eventbrite.fr/tickets-external?eid=6490436069&amp;ref=etckt&amp;v=2" width="100%"></iframe></p>
<div style="font-family: Helvetica, Arial; font-size: 10px; padding: 5px 0 5px; margin: 2px; width: 100%; text-align: left;"><a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr/r/etckt" target="_blank">Gestion d&#8217;un événement</a><span style="color: #ddd;"> pour </span><a style="color: #ddd; text-decoration: none;" href="http://ippevent-angularjs.eventbrite.fr?ref=etckt" target="_blank">Ippevent AngularJS</a> <span style="color: #ddd;">réalisé par</span> <a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr?ref=etckt" target="_blank">Eventbrite</a></div>
</div>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/zbJAAYymZ8M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/29/ippevent-angularjs-le-16-mai-prochain-a-19h/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/29/ippevent-angularjs-le-16-mai-prochain-a-19h/</feedburner:origLink></item>
		<item>
		<title>Vidéo – Retour sur le Devoxx Paris 2013</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/eVe4TK4C5SM/</link>
		<comments>http://blog.ippon.fr/2013/04/28/video-retour-sur-le-devoxx-paris-2013/#comments</comments>
		<pubDate>Sun, 28 Apr 2013 08:30:04 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Devoxx]]></category>
		<category><![CDATA[événement]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JUG]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7782</guid>
		<description><![CDATA[<p></p> ]]></description>
				<content:encoded><![CDATA[<p><iframe frameborder="0" height="360" src="http://www.youtube.com/embed/XQcVP6reL9I" width="640"></iframe></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/eVe4TK4C5SM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/28/video-retour-sur-le-devoxx-paris-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/28/video-retour-sur-le-devoxx-paris-2013/</feedburner:origLink></item>
		<item>
		<title>Vidéo – Introduction to NoSQL using Couchbase par Tugdual Grall chez Ippon</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/45spsOqtlEI/</link>
		<comments>http://blog.ippon.fr/2013/04/25/video-introduction-to-nosql-using-couchbase-par-tugdual-grall-chez-ippon/#comments</comments>
		<pubDate>Thu, 25 Apr 2013 20:00:13 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7734</guid>
		<description><![CDATA[<p></p> ]]></description>
				<content:encoded><![CDATA[<p><iframe frameborder="0" height="281" src="http://player.vimeo.com/video/60238086" width="500"></iframe></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/45spsOqtlEI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/25/video-introduction-to-nosql-using-couchbase-par-tugdual-grall-chez-ippon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/25/video-introduction-to-nosql-using-couchbase-par-tugdual-grall-chez-ippon/</feedburner:origLink></item>
		<item>
		<title>Un job en or</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/PjAqjE9-BaQ/</link>
		<comments>http://blog.ippon.fr/2013/04/24/un-job-en-or/#comments</comments>
		<pubDate>Wed, 24 Apr 2013 16:00:27 +0000</pubDate>
		<dc:creator>Antoine SABOT-DURAND</dc:creator>
				<category><![CDATA[Expertise Java]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7741</guid>
		<description><![CDATA[<p>Une fois n’est pas coutume, il ne s’agit ni d’un post technique ni d’une annonce concernant les Ippevents, mais ayant publié une quarantaine d’articles sur ce blog depuis 2009 je me suis permis de l’utiliser pour vous dire au revoir. Le 27 mai prochain je quitterai le monde de l&#8217;ESN (avant on disait SSII mais <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/24/un-job-en-or/">Un job en or</a></span>]]></description>
				<content:encoded><![CDATA[<p><em>Une fois n’est pas coutume, il ne s’agit ni d’un post technique ni d’une annonce concernant les Ippevents, mais ayant publié une quarantaine d’articles sur ce blog depuis 2009 je me suis permis de l’utiliser pour vous dire au revoir.</em><br />
Le 27 mai prochain je quitterai le monde de l&#8217;ESN (avant on disait SSII mais ça, <a href="http://www.usinenouvelle.com/article/ne-m-appelez-plus-ssii.N194981" target="_blank">c&#8217;était avant</a>) pour commencer une nouvelle aventure en tant que “Senior Software Engineer” chez Red Hat. Conscient de ce que je dois à Ippon, je souhaitais revenir sur mon parcours et donner une idée de comment une carrière peut se dérouler au sein de la société.</p>
<p><span id="more-7741"></span></p>
<h2>Quarante cinq mois intenses</h2>
<p>Je suis arrivé chez Ippon en Septembre 2009 avec le rôle de “Manager Technique en charge de la capitalisation des savoirs faire”. En plus d’un poste de consultant classique je disposais d’un mi-temps pour recenser l’expertise au sein de la société et communiquer sur cette expertise pour la faire connaître à l’extérieur et contribuer au rayonnement de l’entreprise. Deux rôles pour le même poste, en somme.<br />
Dans mon premier rôle de consultant au sein du pôle conseil, j’ai été servi : près de 20 missions en 3 ans et demi comportant des prestations critiques (audit technique ou d’architecture) ou décisives (conseil au choix d’outils ou de frameworks). Il s’est donc agit en majorité de conseil à haute valeur ajoutée des missions courtes aux enjeux importants : ouverture de compte, décisions engageantes.<br />
Dans mon deuxième rôle, Ippon m’a laissé carte blanche, me permettant d’expérimenter un certain nombre de choses. Pour mener à bien cette tâche de capitalisation j’ai repris en main le blog (en incitant et aidant mes collègues à contribuer), créé et animé les comptes Twitter et Facebook de la société et testé des approches différentes pour le recrutement des nouveaux collaborateurs.<br />
L’année 2011 a été celle de la création des Ippevents qui rencontrent toujours un beau succès (et qui permettent à des consultants Ippon de faire leur premières armes de conférencier) et en 2012 mes premier pas de speaker dans les Jugs puis à Devoxx.</p>
<h2>Les projets Open Source et le JCP</h2>
<p>C’est grâce à Ippon, que je me suis rendu à Devoxx en novembre 2010 et que j’ai rencontré mes premiers contacts chez Red Hat. Soucieux de rester crédible dans mes missions de conseil, je cherchais un moyen de garder le contact avec le développement (tâche difficile quand on effectue des missions courtes sur des aspects conseils) et la contribution open source m’est apparue comme la meilleure solution pour ne pas me rouiller sur le développement. C’est ainsi qu’avec le soutien d’Ippon je commençais à travailler sur le projet Seam Social devenu Agorava depuis, et participer au JCP sur CDI 1.1 et une tentative de JSR avortée avec Java Social (JSR 357)</p>
<h2>Alors pourquoi partir ?</h2>
<p>Tout cela aurait pu durer encore longtemps si je n’avais pas eu cette opportunité qui fait partie des quelques rares susceptibles de me faire quitter Ippon. En fait, c’est plus le monde du service (dans lequel j’évolue depuis 17 ans) que je quitte, qu’Ippon Technologies pour aller donner dans le développement open source professionnel.<br />
Et une chose est sûre, sans Ippon je n’aurai certainement pas pu accéder à cette nouvelle carrière. Les nombreuses missions internes et externes m’ont permis d’apprendre plein de choses et de nouer les contacts qui me permettent aujourd’hui de tourner cette page. J’ai clairement bénéficié de l’excellence d’Ippon pour décrocher ce job.</p>
<h2>Place à prendre</h2>
<p>Je m’en vais donc vers de nouvelles aventures en laissant <a title="Ippon recrute un consultant senior" href="http://blog.ippon.fr/2013/04/14/ippon-recrute-un-consultant-senior/" target="_blank">un poste vacan</a>t au sein d’Ippon Technologies. Ce poste de manager en charge de la capitalisation des savoir faire possède suffisamment de facettes pour que chacun s’y retrouve. Il comporte quelques figures imposées pas forcément désagréables (blog, organisation des Ippevents) et pas mal de figures libres (contribution à des projets Open Sources, relation avec la communauté, organisation d’ateliers internes, etc&#8230;) et un mi-temps pour le faire. Si tout ça vous tente (et j’espère vous avoir donné envie) contactez Julien Dubois (jdubois {at} ippon.fr) notre directeur du pôle conseil.<br />
Pour ma part, je dis “au revoir Ippon et merci !”</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/PjAqjE9-BaQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/24/un-job-en-or/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/24/un-job-en-or/</feedburner:origLink></item>
		<item>
		<title>Vidéo – User eXperience Driven Design avec MyDraft chez Ippon</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/6zqJcSh6EGQ/</link>
		<comments>http://blog.ippon.fr/2013/04/22/video-user-experience-driven-design-avec-mydraft-chez-ippon/#comments</comments>
		<pubDate>Mon, 22 Apr 2013 18:00:39 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7731</guid>
		<description><![CDATA[<p></p> ]]></description>
				<content:encoded><![CDATA[<p><iframe frameborder="0" height="281" src="http://player.vimeo.com/video/63806538" width="500"></iframe></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/6zqJcSh6EGQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/22/video-user-experience-driven-design-avec-mydraft-chez-ippon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/22/video-user-experience-driven-design-avec-mydraft-chez-ippon/</feedburner:origLink></item>
		<item>
		<title>Coach Retreat à Nantes le 29 juin</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/cDtmy0lUWvw/</link>
		<comments>http://blog.ippon.fr/2013/04/19/coach-retreat-a-nantes-le-29-juin/#comments</comments>
		<pubDate>Fri, 19 Apr 2013 07:41:15 +0000</pubDate>
		<dc:creator>Alvin BERTHELOT</dc:creator>
				<category><![CDATA[Agilité]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7720</guid>
		<description><![CDATA[<p></p> <p>Le samedi 29 juin prochain, un Coach Retreat se tiendra à Nantes.</p> <p>C’est une journée de pratique du coaching qui s’adresse en premier lieu aux Coaches Agiles, mais aussi aux managers et aux scrum masters expérimentés désireux de développer leur capacité à accompagner des équipes.</p> <p>Ce Coach Retreat sera facilité par Oana Juncu, Coach <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/19/coach-retreat-a-nantes-le-29-juin/">Coach Retreat à Nantes le 29 juin</a></span>]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/04/6271655691-1-300x187.jpg"><img class="alignnone size-full wp-image-7721" alt="6271655691-1-300x187" src="http://blog.ippon.fr/wp-content/uploads/2013/04/6271655691-1-300x187.jpg" width="300" height="187" /></a></p>
<p>Le samedi 29 juin prochain, un Coach Retreat se tiendra à Nantes.</p>
<p>C’est une journée de pratique du coaching qui s’adresse en premier lieu aux Coaches Agiles, mais aussi aux managers et aux scrum masters expérimentés désireux de développer leur capacité à accompagner des équipes.</p>
<p>Ce Coach Retreat sera facilité par Oana Juncu, Coach Agile, qui a initié les événements de ce type avec le format actuel.</p>
<p>L’événement est gratuit, ceci grâce aux soutiens de l’association <a title="Agile Nantes" href="http://agilenantes.org" target="_blank">Agile Nantes</a> et d&#8217;<a href="http://www.ippon.fr/">Ippon Technologies</a> qui accueillera l&#8217;évènement dans ces locaux Nantais.</p>
<p>Pour tout savoir sur l’événement et pour s’inscrire : <a title="Inscription Coach Retreat" href="http://coachretreat.eventbrite.fr" target="_blank">http://coachretreat.eventbrite.fr</a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/cDtmy0lUWvw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/19/coach-retreat-a-nantes-le-29-juin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/19/coach-retreat-a-nantes-le-29-juin/</feedburner:origLink></item>
		<item>
		<title>Jeu “Ippon Recrute”, 3ème édition !</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/TkwlW9vDl1s/</link>
		<comments>http://blog.ippon.fr/2013/04/18/jeu-ippon-recrute-3eme-edition/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 10:00:03 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Recrutement]]></category>
		<category><![CDATA[Ippon Technologies]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7714</guid>
		<description><![CDATA[<p>Suite au succès des deux premières éditions de notre jeu &#8220;Ippon Recrute&#8221;, nous vous proposons une toute nouvelle version, avec de nouveaux challenges !</p> <p>Cette nouvelle édition a les mêmes buts que les précédentes :</p> Nous permettre de recruter des gens qui savent réfléchir et qui savent coder Tout en ayant un support amusant, aussi <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/18/jeu-ippon-recrute-3eme-edition/">Jeu &#8220;Ippon Recrute&#8221;, 3ème édition !</a></span>]]></description>
				<content:encoded><![CDATA[<p>Suite au <a href="http://blog.ippon.fr/2011/12/12/attaque-brute-force-java-et-parallelisme/" target="_blank">succès</a> des <a href="http://blog.ippon.fr/2011/11/30/jeu-ippon-recrute-deuxieme-edition/" target="_blank">deux premières éditions</a> de notre jeu &#8220;Ippon Recrute&#8221;, nous vous proposons une toute nouvelle version, avec de nouveaux challenges !</p>
<p>Cette nouvelle édition a les mêmes buts que les précédentes :</p>
<ul>
<li><span style="line-height: 13px;">Nous permettre de recruter des gens qui savent réfléchir et qui savent coder</span></li>
<li>Tout en ayant un support amusant, aussi bien pour les gens qui postulent que pour nous-mêmes (oui, faire passer des entretiens c&#8217;est dur pour nous aussi&#8230;)</li>
</ul>
<p>L&#8217;esprit reste donc le même, avec quelques nouveautés, par exemple le premier challenge est cette fois-ci en JavaScript !</p>
<p>Rappelons tout de même quelques règles pour les participants :</p>
<ul>
<li><span style="line-height: 13px;">Notre but est de recruter des personnes de tout niveau : le challenge n&#8217;est pas fait pour être impossible, et n&#8217;est pas réservé à des &#8220;experts&#8221; particuliers</span></li>
<li>Vous pouvez être &#8220;malins&#8221;, comme sur le challenge précédent, et donc contourner les obstacles : en fait, nous sommes intéressés par vos solutions (et nous avons déjà eu des solutions surprenantes lorsque nous avons fait les tests en interne&#8230;)</li>
<li>N&#8217;oubliez pas, en postulant, de décrire vos solutions ou d&#8217;envoyer votre code source !</li>
<li>Enfin, une règle de bonne conduite : laissez les autres jouer&#8230; Si vous avez trouvé la solution, ne la publiez pas sur Twitter ou sur votre blog dans les 5 minutes, même si vous êtes très contents de vous&#8230; Ce n&#8217;est pas un concours de vitesse, ni un concours où il faut être le premier (d&#8217;ailleurs nous avons plus d&#8217;un poste à pourvoir !)</li>
</ul>
<p>Sur ce :</p>
<ul>
<li><span style="line-height: 13px;">Le code sera disponible sur ce repository Github <a href="https://github.com/ippontech/IpponRecrute3" target="_blank">https://github.com/ippontech/IpponRecrute3</a> aujourd&#8217;hui (Jeudi 18 Avril 2013) à 14h00. Bon jeu !</span></li>
</ul>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/TkwlW9vDl1s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/18/jeu-ippon-recrute-3eme-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/18/jeu-ippon-recrute-3eme-edition/</feedburner:origLink></item>
		<item>
		<title>JavaFX – jamais parti, déjà has been ?</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/1HCE7nxSH8o/</link>
		<comments>http://blog.ippon.fr/2013/04/17/javafx-jamais-parti-deja-has-been/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 18:30:55 +0000</pubDate>
		<dc:creator>Thomas ESCOLAN</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaFX]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7615</guid>
		<description><![CDATA[<p>Un de nos clients est récemment venu vers nous pour être conseillé sur la technologie JavaFX. Il souhaitait avoir un retour d&#8217;expérience (un rex, comme disent les commerciaux) et un support de ses équipes qui sont expérimentées mais débutent sur cette technologie. Il faut bien avouer que nous avons été pris au dépourvu&#8230; Bien que datant <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/17/javafx-jamais-parti-deja-has-been/">JavaFX &#8211; jamais parti, déjà has been ?</a></span>]]></description>
				<content:encoded><![CDATA[<p>Un de nos clients est récemment venu vers nous pour être conseillé sur la technologie <a title="JavaFX Developer Home" href="http://javafx.com">JavaFX</a>. Il souhaitait avoir un retour d&#8217;expérience (un <em>rex</em>, comme disent les commerciaux) et un support de ses équipes qui sont expérimentées mais débutent sur cette technologie. Il faut bien avouer que nous avons été pris au dépourvu&#8230; Bien que datant de 2007 et faisant partie des standards de Java (JavaFX est intégré à la JVM depuis la version 7 ; rappelez-vous que le JDK 6 n&#8217;est plus supporté !), quasiment personne chez nous n&#8217;a acquis d&#8217;expérience dessus &#8211; Note pour plus tard : est-ce qu&#8217;on peut vraiment écrire CA dans un blog pro ?? <img src='http://blog.ippon.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Pour moi, il s&#8217;agissait d&#8217;une API de client lourd destinée à faire évoluer l&#8217;antédiluvienne techno Swing, pour contrer celle développée par Eclipse (RCP) SWT (c&#8217;est moi qui suppute). Or, renseignement pris, il s&#8217;avère que JavaFX se positionne dans le secteur <strong>RIA</strong> et les plateformes mobiles par l&#8217;intégration à <a title="Java ME Landing" href="http://www.oracle.com/technetwork/java/javame/index.html">Java ME</a>. Donc, il faut bien admettre que cela ressemble à un projet de bon aloi, ambitieux et suivi. Quel est le problème, alors ? Je me suis mis à creuser dans les possibilités de la bête.</p>
<p>Comme pas mal de technos Java (souvenez-vous des EJB 2&#8230;), JavaFX a connu une première mouture partiellement avortée. A l&#8217;époque, elle nécessitait une étape de précompilation qui est aujourd&#8217;hui abandonnée pour une solution &#8220;tout Java&#8221;. JavaFX 1 disposait également d&#8217;un langage propre, JavaFX Script, abandonné également. Pendant un moment, le projet <a title="Visage - Declarative language for expressing user interfaces" href="https://code.google.com/p/visage/">Visage</a> a prétendu prendre la relève ; il existe également <a title="GroovyFX Project" href="http://groovyfx.org/">GroovyFX</a> et <a title="Scala Bindings for JavaFX 2" href="https://code.google.com/p/scalafx/">ScalaFX</a>, pour les amateurs. Actuellement, la version officielle est JavaFX 2, et une version 3 est <a title="JavaFX roadmap" href="http://www.oracle.com/technetwork/java/javafx/overview/roadmap-1446331.html">annoncée</a> pour cette année 2013.<br />
Enfin, <strong>NetBeans</strong> intègre les outils nécessaires à son exploitation, et un <a title="JavaFX Tools" href="http://www.oracle.com/technetwork/java/javafx/tools/index.html">Scene Builder</a> est disponible pour les autres. Il y aura aussi un plugin IntelliJ IDEA, incessamment (il est encore immature, d&#8217;après ce que l&#8217;on m&#8217;a dit).</p>
<p>OK, voilà pour la partie historique. Alors, qu&#8217;avons-nous là ? Entre nos mains, une solution IHM événementielle multiplateforme (<em>desktop</em>, <em>web</em>) intégrant le <em>skinning</em> <strong>CSS</strong> pour la personnalisation du rendu et supportant HTML pour le formatage des textes. Il y a aussi des <strong>effets</strong> en veux-tu en voilà (animations, transformations, transitions animées).<br />
Pas de dépendances volumineuses en exécution, donc, sur Java SE 7 qui devrait (n&#8217;est-ce pas) être votre JVM par défaut maintenant. Du côté des composants (UI Controls), on peut leur appliquer des <em>layouts</em> et tous les effets précités.<br />
On dispose en outre d&#8217;une extensibilité poussée. D&#8217;ailleurs, <a title="JFXtras 2" href="http://jfxtras.org/">JFXtras</a> (très inspiré mais relativement étroit d&#8217;esprit) et <a title="DataFX" href="http://www.javafxdata.org/">DataFX</a> (qui fournit un effort d&#8217;abstraction des sources de données) ne sont qu&#8217;un exemple parmi les nombreux projets avancés sur le sujet &#8211; Nan, j&#8217;déconne, en fait je n&#8217;en ai pas trouvé tant que ça <img src='http://blog.ippon.fr/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Voici un tour des composants de base de JavaFX :</p>
<blockquote style="background-color: #f0a541; padding: 10px; text-align: justify; -moz-border-radius: 10px; -webkit-border-radius: 10px;"><p>Label, Button, Radio Button, Toggle Button, Checkbox, Choice Box, Text Field, <strong>Password Field</strong>, Scroll Bar, Scroll Pane, List View, Table View, Tree View, Combo Box, Separator, Slider, Progress Bar and<strong> Progress Indicator</strong>, Hyperlink, Tooltip, HTML Editor, Titled Pane and Accordion, Menu, Color Picker, <strong>Pagination Control</strong>&#8230;</p></blockquote>
<p>De plus, JavaFX propose aussi une API de <a title="Using JavaFX Charts" href="http://docs.oracle.com/javafx/2/charts/jfxpub-charts.htm">graphiques</a> (<strong>Charts</strong>) complète, fondée sur du <a title="Scalable Vector Graphics" href="http://fr.wikipedia.org/wiki/Scalable_Vector_Graphics">SVG</a>, de quoi rendre <a title="Business Intelligence and Reporting Tools" href="http://www.eclipse.org/birt/">Birt</a> jaloux (ou pas).</p>
<p>Tout cela, mesdames et messieurs, pouvant coexister dans des <a title="JavaFX for Swing Developers" href="http://docs.oracle.com/javafx/2/swing/jfxpub-swing.htm">applications Swing</a> (par le biais d&#8217;une <em>Scene</em>)&#8230; Et, j&#8217;ai envie de dire : c&#8217;est bien la moindre des choses ! Parce que finalement, à mon avis, c&#8217;est ici que se trouve le &#8220;noeud d&#8217;adoption&#8221; de la technologie. Franchement, qui a envie de faire du Web avec JavaFX alors qu&#8217;il existe des<em> frameworks web</em> ultra poussés avec des composants surpuissants (<a title="PrimeFaces" href="http://primefaces.org/">PrimeFaces</a>, si tu me regardes&#8230;) ?? Il n&#8217;importe donc que de savoir si JavaFX a une valeur ajoutée en terme de <strong>productivité</strong> par rapport à Swing, en se limitant aux clients lourds, donc. Sans cela, qui en voudrait ?</p>
<p>J&#8217;ai relevé en gras, dans l&#8217;encadré ci-dessus, tous les éléments qui me semblent nouveaux, hormis l&#8217;utilisation optionnelle du <strong>FXML</strong> (avec <em>binding</em> tout de même, et l&#8217;utilisation des annotations Java). Honnêtement ? C&#8217;est pas vraiment la révolution&#8230; Je ne sais pas vous, mais moi j&#8217;attends BEAUCOUP plus d&#8217;une librairie de composants ; il faut dire que j&#8217;ai fait du Flex, aussi&#8230; Pour moi, si l&#8217;API GUI de Java doit évoluer, c&#8217;est en fournissant AU MINIMUM des composants de la trempe de ce que l&#8217;on trouve sur le web. Ce n&#8217;est pas comme si les clients lourds avaient le vent en poupe, n&#8217;est-ce pas ?.. Il faudrait donc qu&#8217;ils fassent montre de capacités inédites pour percer, CQFD.</p>
<p>Si vous voulez ajouter facilement (et rapidement) des éléments de <em>data visualisation </em>à vos applications existantes, vous serez heureux d&#8217;adopter JavaFX. Je ne sais même pas si les graphiques peuvent être rendus suffisamment <a title="Animating the JavaFX PieChart a bit" href="http://tomsondev.bestsolution.at/2012/11/21/animating-the-javafx-piechart-a-bit/">interactifs</a>, d&#8217;ailleurs.  Mais sinon ? Je ne vois pas comment justifier la courbe d&#8217;apprentissage d&#8217;une nouvelle technologie (<em>in cauda venenum</em>, il y aura forcément de la charge de débugage), simplement pour dire qu&#8217;on a arrêté de faire du Swing (de l&#8217;AWT, d&#8217;accord ; on doit poser des limites à la résistance au changement).</p>
<p><strong>Ce qu&#8217;il manque à Swing &#8220;out of the box&#8221; </strong>(SwingX est mort, mais il reste <a title="JGoodies" href="http://www.jgoodies.com/">JGoodies</a> ou <a title="Advanced Swing Components (ASC Suite)" href="http://www.smardec.com/products/advanced-swing-components.html">ASC Suite</a> &#8211; c&#8217;est payant)<strong>, ce sont des composants avancés </strong>(un pauvre composant de saisie de dates/calendrier ; des champs auto-complétés, auto-validés ; des tables auto-paginés, auto-filtrés, auto-triés ; l&#8217;intégration de cartes géographiques ; des listes de sélection liées ; des graphes, des <em>mindmaps</em> ; ou que sais-je encore, clef en main). C&#8217;est quand même un comble que les interfaces utilisateur distantes soient aujourd&#8217;hui plus riches que les interfaces locales&#8230; Or, l&#8217;offre de JavaFX me semble encore inférieure à ce qui peut être fait avec HTML5. C&#8217;est la fin de la discussion, je pense&#8230; JavaFX est à la traîne, et je n&#8217;ai rien trouvé d&#8217;<a href="http://en.wikipedia.org/wiki/JavaFX#Future_work">annoncé</a> pour la version 3 qui remédierait à cela (Ah, il y a l&#8217;intégration de la 3D au menu &#8211; pourquoi pas ?).<br />
[mode_perfide]A ce compte-là, on pouvait très bien se contenter des bibliothèques de composants Swing externes développées depuis de longues années. Mais c&#8217;est peut-être bêtement un problème de <em>copyright</em>&#8230;[/mode_perfide]</p>
<p>Conclusion : oui, JavaFX est décevant, non content d&#8217;avoir eu du mal à décoller. Et compte tenu des besoins en termes d&#8217;applications client lourd ces dernières années, il est tout à fait normal que son adoption soit médiocre. La tentative de vente forcée avec le JDK 7 n&#8217;y fera rien, à mon avis.<br />
JavaFX n&#8217;a pas un problème de <strong>visibilité</strong> (des livres existent, notamment chez <a title="JavaFX books" href="http://www.apress.com/java/javafx">Apress</a>, entre autres) mais un problème de <strong>productivité</strong>, comme on l&#8217;a vu. La pénurie de profils expérimentés risque de faire encore longtemps défaut.<br />
C&#8217;est moche, je sais.</p>
<p>PS : Y aurait-t-il des volontaires pour démarrer un projet &#8220;PrimeFX&#8221; ? Levez le doigt ; personne ?..</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/1HCE7nxSH8o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/17/javafx-jamais-parti-deja-has-been/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/17/javafx-jamais-parti-deja-has-been/</feedburner:origLink></item>
		<item>
		<title>Ippon recrute un consultant senior</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/3pQOZxuGclk/</link>
		<comments>http://blog.ippon.fr/2013/04/14/ippon-recrute-un-consultant-senior/#comments</comments>
		<pubDate>Sun, 14 Apr 2013 18:18:04 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7681</guid>
		<description><![CDATA[<p></p> ]]></description>
				<content:encoded><![CDATA[<p><img alt="" src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAm8AAANSCAIAAAC8x74YAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpENjUxQzMyNjk5MkQxMUUyQUZCMEU2MTEwQzI1RTA4OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpENjUxQzMyNzk5MkQxMUUyQUZCMEU2MTEwQzI1RTA4OSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ2NTFDMzI0OTkyRDExRTJBRkIwRTYxMTBDMjVFMDg5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ2NTFDMzI1OTkyRDExRTJBRkIwRTYxMTBDMjVFMDg5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+b4QGnAACV+tJREFUeNrsnQc8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" /></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/3pQOZxuGclk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/14/ippon-recrute-un-consultant-senior/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/14/ippon-recrute-un-consultant-senior/</feedburner:origLink></item>
		<item>
		<title>Le chemin vers le côté lumineux de Scrum</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/--wJcv3a_0s/</link>
		<comments>http://blog.ippon.fr/2013/04/11/le-chemin-vers-le-cote-lumineux-de-scrum/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 06:45:45 +0000</pubDate>
		<dc:creator>Mathieu BELLANGE</dc:creator>
				<category><![CDATA[Agilité]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Scrumday]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7669</guid>
		<description><![CDATA[<p dir="ltr" id="internal-source-marker_0.18215126167645512">Je profite de l&#8217;occasion du Scrum Day pour partager mon expérience sur un projet sur lequel je travaille depuis 6 mois. Ce projet est intéressant pour deux raisons. Premièrement, il démarre de rien et j&#8217;ai eu la chance de le lancer et de le faire évoluer. Deuxièmement, il a été désigné comme projet <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/11/le-chemin-vers-le-cote-lumineux-de-scrum/">Le chemin vers le côté lumineux de Scrum</a></span>]]></description>
				<content:encoded><![CDATA[<p dir="ltr" id="internal-source-marker_0.18215126167645512">Je profite de l&#8217;occasion du Scrum Day pour partager mon expérience sur un projet sur lequel je travaille depuis 6 mois. Ce projet est intéressant pour deux raisons. Premièrement, il démarre de rien et j&#8217;ai eu la chance de le lancer et de le faire évoluer. Deuxièmement, il a été désigné comme projet pilote pour la mise en place de l’agilité au sein de la DSI.</p>
<p dir="ltr">Le changement est toujours  compliqué, surtout après des années de modèle prédictif, et ces 6 mois ont été riches en enseignement. Je pense refaire un billet pour faire le point sur le passage à l’agilité pour toute la DSI et analyser si l&#8217;objectif affiché est atteint (et à quel prix). Pour le moment,  je me contenterai de réaliser un billet sur la vision d&#8217;un membre d’une team scrum, des quelques pièges que j&#8217;ai pu rencontrer et dans lesquels j’espère ne plus tomber.</p>
<ul>
<li dir="ltr">
<p dir="ltr">Le Product owner tu écouteras et tu motiveras</p>
</li>
</ul>
<p dir="ltr">On ne le répétera jamais assez mais scrum ne rime pas avec : “aucune spécification”. C&#8217;est même une composante importante. Tout ce que scrum dit c&#8217;est qu&#8217;il n&#8217;existe aucun format imposé et qu&#8217;elles ne doivent pas impérativement être complètes ni définitives avant le lancement du développement.</p>
<p dir="ltr">Notre projet couvre un besoin nouveau pour le client et nécessite un travail important de conception.  Le product owner (PO) n&#8217;a ni le recul ni le temps nécessaires pour nous donner des spécifications claires et complètes pour démarrer.  Après coup, cette situation n&#8217;est pas insurmontable et l&#8217;important est de rendre au PO ce qui appartient au PO. Il ne faut pas que l&#8217;équipe prenne la responsabilité des spécifications d&#8217;une fonctionnalité,  ce n&#8217;est pas notre application et nos décisions seront forcément incomprises voire critiquées. Et sans l&#8217;appui du PO, les dérives peuvent être nombreuses.</p>
<p dir="ltr">Il est important de remettre le PO au centre des décisions, cela lui redonne de la confiance et ressoude l&#8217;équipe, augmentant ainsi les chances de réussite du projet.</p>
<ul>
<li dir="ltr">
<p dir="ltr">Avec le Scrum master, la communication tu développeras</p>
</li>
</ul>
<p dir="ltr">Scrum met l&#8217;accent sur la communication au sein de l&#8217;équipe et la définit comme composante principale de réussite du projet. Le daily scrum meeting est là pour rendre compte des tâches en cours, réalisées ou restantes à faire et participe à cette communication.</p>
<p dir="ltr">Dans notre cas, le scrum master (SCM) n&#8217;est pas staffé à 100% sur le projet et gère plusieurs autres projets en même temps. Dans cette configuration, il est important que l&#8217;équipe remonte au SCM les alertes potentielles du sprint et en particulier les tâches incertaines pouvant dériver. Ce sont par exemple des tâches nouvelles pour l&#8217;équipe, jamais réalisées par celle-ci. Ou encore une tâche d&#8217;une durée importante, supérieure à une journée. Ces tâches peuvent être sous-estimées et l’augmentation peut entraîner la dérive du Sprint. On peut l’observer facilement sur un Sprint Burndown Chart, avec une courbe qui stagne et ne décroit plus.</p>
<p dir="ltr">Pour les repérer facilement, nous les affichons sur le whiteboard avec des post-it de taille plus importante permettant au SCM de les suivre facilement. Augmenter la communication avec le SCM lui permet de suivre sereinement le projet et de pouvoir réaliser correctement son rôle de protection de l&#8217;équipe.</p>
<ul>
<li dir="ltr">
<p dir="ltr">Les incertitudes, tu élimineras</p>
</li>
</ul>
<p dir="ltr">On l&#8217;a vu, les incertitudes sont une composante importante dans la probabilité de dérive d&#8217;un sprint. Il faut pouvoir les estimer et pour cela, il faut définir ce qui est une tâche incertaine et ce qui ne l’est pas.</p>
<p dir="ltr">Tout d&#8217;abord, Il est important de faire évoluer l&#8217;évaluation de ses tâches pendant le déroulement des sprints. Une tâche réalisée en 2h la première fois prendra nettement moins de temps la seconde fois. Tenir ainsi ses tâches à jour permet de garder une évaluation la plus juste possible et une estimation de sprint cohérente.</p>
<p dir="ltr">Les tâches incertaines ne peuvent être évaluées aisément. Elles peuvent être reconnaissables quand une évaluation ne fait pas le consensus de l&#8217;équipe ou quand une tâche ne peut tout simplement pas être évaluée. Ce sont souvent des tâches jamais réalisées par l&#8217;équipe ou mal spécifiées. Dans le deuxième cas, je déconseille fortement de les prendre dans le sprint. Engager son équipe sur quelque chose qu&#8217;elle ne maîtrise pas est le meilleur moyen de rater le sprint et de perdre en confiance dans le PO.</p>
<p dir="ltr">Dans le cas des tâches inconnues,  elles doivent être évaluées au possible, prises en compte dans le sprint et suivies de près par l&#8217;équipe. Une fois réalisées, elles sortiront de leur statut incertain, pourront être évaluées,  réévaluées et traitées plus sereinement.</p>
<p dir="ltr">Une fois estimées, vient le moment de les réaliser. On peut suivre deux méthodes pour éffectuer ces tâches.  Les résoudre en fin de sprint, après avoir fini l&#8217;ensemble des tâches simples ou en tout début de sprint.</p>
<p dir="ltr">Je conseille fortement de les éliminer le plus tôt possible, ne pas remettre au lendemain ce que l&#8217;on peut réaliser tout de suite ! Une tâche incertaine peut fortement dériver et mettre en péril le sprint. Les réaliser tôt permet de conserver du temps dans le cas où elle échappe à l&#8217;équipe et ainsi permet de garder la possibilité de prendre les décisions nécessaires pour boucler le sprint (retirer une user story, modifier la priorité &#8230;). Un deuxième point à ne pas négliger est le stress généré par une tâche qui dérive. Il est beaucoup plus simple de gérer ce genre de tâche en début de sprint que deux jours avant la démo,  quand rien ne fonctionne.</p>
<p dir="ltr">Plus tôt elles sont résolues et plus sereine est l&#8217;équipe.</p>
<ul>
<li dir="ltr">
<p dir="ltr">En continu, tu t&#8217;amélioreras et pour cela à 100% tu ne te chargeras pas</p>
</li>
</ul>
<p dir="ltr">La gestion des incertitudes demande une certaine souplesse dans le sprint et une partie de celui-ci peut être conservée pour encaisser une dérive éventuelle. Mais conserver du temps pour les tâches incertaines ne doit pas être la principale priorité.</p>
<p dir="ltr">Scrum prône une constante remise en cause de l&#8217;équipe, notamment grâce au sprint review. Une bonne pratique d&#8217;amélioration continue consiste à conserver pour chaque sprint une partie du temps alloué à des tâches non dépendantes d&#8217;une user story. Ce temps peut être utilisé pour du refactoring, pour améliorer la couverture de test d&#8217;une fonctionnalité ou un process de travail. Nous, nous conservons 10% de notre temps (par développeur) à améliorer constamment notre environnement de travail. Dernièrement,  nous avons dépensé ce temps à passer de feuilles Excel partagées à Jira pour la gestion du projet. Excel nous convenait pour la gestion d&#8217;un sprint mais le passage à Jira nous a permis d&#8217;améliorer le travail collaboratif et le bug tracking.</p>
<p dir="ltr">Nous dépensons aussi ce temps pour améliorer nos build maven, notre couverture de tests, nos montées de versions &#8230;</p>
<p dir="ltr">Le chemin vers Scrum est semé d’embûches surtout dans un environnement non préparé pour cette méthode. Le PO est une pièce clef du processus et doit rester maître de l’application. Ne pas prendre de décision à sa place et ne pas hésiter à lui renvoyer tous vos questionnements est une bonne démarche pour conserver le PO dans son rôle.</p>
<p dir="ltr">La communication au sein de l’équipe est importante et le SCM doit être tenu au fait des avancées de l’équipe. On pourra ainsi utiliser tout ce qui est à notre disposition pour qu’il puisse suivre très facilement le bon déroulé du sprint.</p>
<p dir="ltr">L’incertitude au sein du sprint doit être maîtrisée pour plus de sérénité au sein de l’équipe. Conserver une estimation cohérente de ses tâches permet de cibler rapidement ce qui pourrait poser problème. Les résoudre en début de sprint permet d’éviter beaucoup de stress inutile.</p>
<p dir="ltr">Et ne jamais perdre de vue que scrum prône une perpétuelle amélioration de ses processus de travail et qu’il est important de conserver du temps pour les réaliser. Garder 10 % de son temps à réaliser des tâches annexes permet d’augmenter la qualité du projet.</p>
<p dir="ltr">Scrum propose une méthodologie de travail pragmatique qui apporte plus de sérénité au sein de l’équipe. L’équipe ne porte plus seule la responsabilité de l’ensemble des tâches de réalisation d‘un projet et l’environnement de travail est beaucoup plus serein. On peut enfin se recentrer sur ce qu’on fait le mieux, développer, et trouver les meilleures solutions techniques pour que le projet réussisse.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/--wJcv3a_0s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/11/le-chemin-vers-le-cote-lumineux-de-scrum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/11/le-chemin-vers-le-cote-lumineux-de-scrum/</feedburner:origLink></item>
		<item>
		<title>Ippon Technologies est sponsor Gold du Scrum Day 2013</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/Chjl77JjLHM/</link>
		<comments>http://blog.ippon.fr/2013/04/10/ippon-technologies-est-sponsor-gold-du-scrum-day-2013/#comments</comments>
		<pubDate>Wed, 10 Apr 2013 13:48:04 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[Agilité]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Scrumday]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7696</guid>
		<description><![CDATA[<p>Ce Jeudi 11 Avril 2013 aura lieu le Scrum Day France, et comme l&#8217;année dernière Ippon Technologies sera présent sur place ! Nous sommes particulièrement heureux d&#8217;être sponsors Gold de l’évènement, qui est aujourd&#8217;hui le plus grand rendez-vous de la communauté Scrum en France.</p> N&#8217;hésitez pas à passer sur notre stand (Stand n°3) pour discuter avec <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/10/ippon-technologies-est-sponsor-gold-du-scrum-day-2013/">Ippon Technologies est sponsor Gold du Scrum Day 2013</a></span>]]></description>
				<content:encoded><![CDATA[<p>Ce Jeudi 11 Avril 2013 aura lieu le <a href="http://www.scrumday.fr/" target="_blank">Scrum Day France</a>, et comme <a title="ScrumDay 2012 : 2 présentations Ippon retenues" href="http://blog.ippon.fr/2012/02/29/scrumday-2012-2-presentations-ippon-retenues/">l&#8217;année dernière</a> Ippon Technologies sera présent sur place ! Nous sommes particulièrement heureux d&#8217;être sponsors Gold de l’évènement, qui est aujourd&#8217;hui le plus grand rendez-vous de la communauté Scrum en France.</p>
<ul>
<li>N&#8217;hésitez pas à passer sur notre stand (Stand n°3) pour discuter avec nos experts ou vous renseigner sur nos formations</li>
<li>Rendez-vous à 14h00 dans la salle Concorde pour participer à la conférence  &#8217;L'Agilité dans la mobilité&#8217; par Alvin Berthelot, Chef de Projet chez Ippon Technologies</li>
<li>Une dizaine de consultants Ippon seront également présents sur place, dans le cadre de notre participation active aux grands évènements (comme Devoxx ou le futur Devops Day)</li>
</ul>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/Chjl77JjLHM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/10/ippon-technologies-est-sponsor-gold-du-scrum-day-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/10/ippon-technologies-est-sponsor-gold-du-scrum-day-2013/</feedburner:origLink></item>
		<item>
		<title>Devoxx France 2013 : Javascript pour les développeurs Java</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/UZm1a4WGi3s/</link>
		<comments>http://blog.ippon.fr/2013/04/10/javascript-developpeurs-java/#comments</comments>
		<pubDate>Wed, 10 Apr 2013 08:00:23 +0000</pubDate>
		<dc:creator>Pierre TEMPLIER</dc:creator>
				<category><![CDATA[Evénements]]></category>
		<category><![CDATA[Devoxx]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7651</guid>
		<description><![CDATA[<p>Lors de Devoxx France 2013 j&#8217;ai beaucoup apprécié le retour de Florian Boulay intitulé &#8220;Javascript pour les développeurs Java : quels sont les pièges à éviter ?&#8221; . Dans cette conférence, il nous a fait part des surprises qu&#8217;il a rencontré et des solutions qu&#8217;il a pu apporter.</p> Portée des variables <p>Si on ne met <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/10/javascript-developpeurs-java/">Devoxx France 2013 : Javascript pour les développeurs Java</a></span>]]></description>
				<content:encoded><![CDATA[<p>Lors de Devoxx France 2013 j&#8217;ai beaucoup apprécié le retour de Florian Boulay intitulé &#8220;Javascript pour les développeurs Java : quels sont les pièges à éviter ?&#8221; . Dans cette conférence, il nous a fait part des surprises qu&#8217;il a rencontré et des solutions qu&#8217;il a pu apporter.</p>
<h2>Portée des variables</h2>
<p>Si on ne met pas var devant une variable celle-ci est alors globale.<br />
Solution : on met toujours var qui force une portée locale.</p>
<pre class="brush: jscript; title: ; notranslate">
	var foo = 'global'
	function funct() {
		var foo = 'local';
		bar = 'global';
		console.log(foo); // 'local'
		console.log(bar); // 'global'
	}
	funct();
	console.log(foo); // 'global'
	console.log(bar); // 'global' instanciée depuis funct()
</pre>
<p>Pour une meilleure lisibilité et pour identifier facilement que l&#8217;on utilise bien des variables locales, on peut systématiquement déclarer ses variables en début de méthode.</p>
<h2>Isolation du code</h2>
<p>Pour éviter de déclarer des méthodes au niveau global, on les isole de la façon suivante :</p>
<pre class="brush: jscript; title: ; notranslate">
(function() {
	var foo = 'hello';
	//...
})();
</pre>
<p>Cela s&#8217;appelle le module pattern.<br />
Celui-ci permet d&#8217;éviter d&#8217;utiliser le namespace global pour la déclaration de la fonction. On évite ainsi les conflits de noms qui pourraient survenir.</p>
<p>Le module pattern permet aussi d&#8217;émuler le concept de classe de la manière suivante:</p>
<pre class="brush: jscript; title: ; notranslate">
var module = (function() {
	var exposedObject = {},
		privateVariable = 1;

	function privateMethod() {
		// méthode privée
	}
	exposedObject.publicProperty = true;
	exposedObject.publicMethod = function() {
		// méthode exposée
	}
	return exposedObject;
})();

module.publicMethod();
</pre>
<p>Tout ce qui n&#8217;est pas ajouté à l&#8217;objet exposedObject reste invisible &#8220;à l&#8217;extérieur&#8221;, c&#8217;est ce qui différencie les méthodes privées des méthodes publiques du module.</p>
<h2>Objets</h2>
<p>Pour la déclaration d&#8217;objets, Florian conseille de s&#8217;en tenir à la notation littérale pour plus de clarté.</p>
<pre class="brush: jscript; title: ; notranslate">
var obj = {
	prop : true,
	funct : function() {
		return 'me';
	}
};
</pre>
<h2>Quand utiliser new ?</h2>
<p>Que doit-on utiliser ?</p>
<pre class="brush: jscript; title: ; notranslate">
var myvar1 = ApiObject();
</pre>
<p>ou</p>
<pre class="brush: jscript; title: ; notranslate">
var myvar1 = new ApiObject();
</pre>
<p>La convention (tacite) : il faut utiliser new quand la fonction commence par une majuscule.<br />
Si la méthode utilise this alors il faut utiliser new.<br />
L&#8217;objet référencé par this dépend du contexte d&#8217;exécution.</p>
<h2>Egalité</h2>
<p>Lorsque l&#8217;on compare 2 objets avec &#8216;==&#8217;, ceux-ci sont éventuellement modifiés afin de pouvoir être comparés. L&#8217;intention est bonne mais est source de nombreux problèmes. Afin de lever toute ambiguïté on utilisera &#8216;===&#8217; (triple égal) qui ne transformera pas les opérandes au préalable. Ainsi, si on compare 2 objets de types différents, on est alors certain que la triple égalité ne renverra jamais true.</p>
<h2>typeof versus instanceof</h2>
<p>Les 2 opérateurs servent le même but mais:<br />
- typeof renvoie une chaine de caractères<br />
- instanceof renvoie des informations plus complètes sur le type</p>
<p>On utilisera typeof avec les types simples du langage.<br />
On utilisera instanceof avec les types customs</p>
<h2>Les Type Wrappers</h2>
<p>Ils n&#8217;apportent rien et gênent la lisibilité. On leur préférera une écriture claire et concise.</p>
<pre class="brush: jscript; title: ; notranslate">
new Object() =&gt; {}
new Array() =&gt; []
new Number(42) =&gt; 42
new String('42') =&gt; '42'
new Boolean(true) =&gt; true
new Regexp('.*') =&gt; /.*/
</pre>
<h2>Convertir un texte en nombre</h2>
<p>parseInt peut donner des résultats surprenant en parsant une chaîne de caractères. En effet les lettres sont filtrées de manière transparentes lors de la conversion.<br />
pour lever l’ambiguïté on peut préfixer la chaîne à parser par un +, on aura ainsi davantage de NaN (Not a Number) remontés.<br />
Mon collègue <a href="http://blog.ippon.fr/author/aweber/">Arthur Weber</a> me signale également qu&#8217;on peut préfixer les variables à parser avec &#8216;~~&#8217; ce qui en cas d&#8217;erreur renverra la valeur par défaut 0.</p>
<pre class="brush: jscript; title: ; notranslate">
~~'foo'; // 0
parseInt('foo', 10); // NaN
</pre>
<p>Ce qui évite le type de code suivant</p>
<pre class="brush: jscript; title: ; notranslate">
if (x === NaN ) x = 0;
</pre>
<p>Slides de la présentation : <a title="Javascript pour les développeurs Java" href="http://www.slideshare.net/FlorianBoulay/javascript-pour-lesdeveloppeursjava" target="_blank">http://www.slideshare.net/FlorianBoulay/javascript-pour-lesdeveloppeursjava</a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/UZm1a4WGi3s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/10/javascript-developpeurs-java/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/10/javascript-developpeurs-java/</feedburner:origLink></item>
		<item>
		<title>(la) Spring Roo gagne à être connue</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/4iSoZ8CsBN8/</link>
		<comments>http://blog.ippon.fr/2013/04/02/la-spring-roo-gagne-a-etre-connue/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 11:30:36 +0000</pubDate>
		<dc:creator>Thomas ESCOLAN</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[eXtreme Programming]]></category>
		<category><![CDATA[rétroingénierie]]></category>
		<category><![CDATA[scaffolding]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7581</guid>
		<description><![CDATA[<p>Il y a des solutions, comme ça, qui tardent à trouver leur audience. Et j&#8217;ai bien l&#8217;impression que c&#8217;est le cas de Spring Roo. Pourtant, voilà un outil qui est malin (il intègre la crème des bonnes pratiques encouragées par Spring), souple (il s&#8217;appuie sur l&#8217;AOP et les meilleures abstractions de Spring, en particulier Spring <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/04/02/la-spring-roo-gagne-a-etre-connue/">(la) Spring Roo gagne à être connue</a></span>]]></description>
				<content:encoded><![CDATA[<p>Il y a des solutions, comme ça, qui tardent à trouver leur audience. Et j&#8217;ai bien l&#8217;impression que c&#8217;est le cas de <a title="Spring Roo - SpringSource.org" href="http://www.springsource.org/spring-roo" target="_blank">Spring Roo</a>. Pourtant, voilà un outil qui est malin (il intègre la crème des <strong>bonnes pratiques</strong> encouragées par Spring), souple (il s&#8217;appuie sur l&#8217;AOP et les meilleures <strong>abstractions</strong> de Spring, en particulier <a title="Spring Data - SpringSource.org" href="http://www.springsource.org/spring-data" target="_blank">Spring Data</a>), et qui sait se faire discret également (vous pouvez demander à Spring Roo de sortir du projet à n&#8217;importe quel moment).</p>
<p>En gros, il s&#8217;agit d&#8217;un <em>framework</em> qui va à la fois gérer la construction et le paramétrage de vos projets, tout en prenant en charge un ensemble de tâches fastidieuses de vos développements Java (comme l&#8217;implémentation des accesseurs et des fonctions #toString, #hashCode, etc). En fait, Spring Roo fait plus que de générer du code ; à chaque étape du projet, il propose une <strong>aide en ligne contextuelle</strong> qui va vous suggérer les actions à réaliser pour avancer. Et là, moi je dis <em>youpi</em> ! Vous pourrez donc, en ligne de commande (intégrée à <a title="Spring Tool Suite" href="http://www.springsource.org/sts" target="_blank">STS</a> pour ceux qui le veulent), indiquer quelles sont vos <strong>entités</strong> et leurs données, ainsi que leurs relations. Pour cela, Vous demanderez à Spring Roo d&#8217;incorporer les <strong>dépendances</strong> vers vos couches techniques. Ensuite, vous préciserez quels services vous souhaitez fournir, et leur protocole.</p>
<p>En fin de compte, Spring Roo pourra également générer pour vous, par exemple, les contrôleurs et les vues Spring MVC pour obtenir une interface CRUD prête à l&#8217;emploi. En plus elle sera belle, ce qui ne gâche rien ! Comment ? vous vouliez ajouter <a title="Spring Web Flow - SpringSource.org" href="http://www.springsource.org/spring-web-flow">Spring Web Flow</a> ? Qu&#8217;à cela ne tienne, il suffit de demander. Sans oublier de prendre en charge la sécurité, bien entendu <a title="Spring Security - SpringSource.org" href="http://www.springsource.org/spring-security">Spring Security</a> est supporté&#8230; Que demande le peuple ? Pardon ? Vous êtes &#8220;tatillon&#8221; ? Pas de problème, Spring Roo sait <strong>détecter vos modifications</strong> et il ne repassera pas derrière vous. On dit même qu&#8217;il est intelligent&#8230; Brrrrrrr !</p>
<p>Seulement voilà, il y a de grandes chances pour que vous ne connaissiez pas Spring Roo. Et c&#8217;est vraiment dommage, je trouve. Moi-même, avant, je ne connaissais pas Spring Roo. Et je ne connaissais pas <a title="SpringFuse" href="http://www.springfuse.com/">SpringFuse</a> non plus, d&#8217;ailleurs. Je savais, à la rigueur, me servir des <a title="Maven pour les nuls..." href="http://blog.soat.fr/2011/06/maven-pour-les-nuls-les-archetypes/">archétypes Maven</a>. C&#8217;était toujours ça, certes. Ça me permettait de sauver la face, disons.</p>
<p>Alors je codais tout à la main, et je perdais du temps à faire des choses pas drôles, ou à me creuser les méninges pour trouver comment intégrer les différentes briques de mes applications dans des environnements toujours différents. Je ne me concentrais pas sur <strong>le modèle et le code métier</strong>. Je n&#8217;étais pas non plus capable de sortir de mon chapeau une application exécutable en quelques jours, dont je pouvais ensuite me servir tout naturellement comme base de développement. Mes clients et utilisateurs étaient tristes aussi, du coup, parce qu&#8217;ils devaient attendre pour avoir une idée de ce que je faisais dans mon coin. <em>Mais ça, c&#8217;était avant</em>.</p>
<p>Faites moi(vous) plaisir, essayez Spring Roo&#8230;</p>
<p>Pour aller plus loin (et comprendre mieux) :<br />
<a href="http://blog.axones.com/index.php/2012/02/14/spring-roo-developpez-en-roue-libre/">http://blog.axones.com/index.php/2012/02/14/spring-roo-developpez-en-roue-libre/</a><br />
<a href="http://blog.valtech.fr/2010/09/23/tutoriel-spring-roo/">http://blog.valtech.fr/2010/09/23/tutoriel-spring-roo/</a><br />
<a href="http://www.touilleur-express.fr/2010/09/09/spring-roo/">http://www.touilleur-express.fr/2010/09/09/spring-roo/</a><br />
<a href="http://today.java.net/article/2012/06/19/spring-roo-and-webflow-ken-rimple-co-author-spring-roo-action">http://today.java.net/article/2012/06/19/spring-roo-and-webflow-ken-rimple-co-author-spring-roo-action</a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/4iSoZ8CsBN8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/04/02/la-spring-roo-gagne-a-etre-connue/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/04/02/la-spring-roo-gagne-a-etre-connue/</feedburner:origLink></item>
		<item>
		<title>Les prochaines formations Ippon</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/jGd6LVkKfMQ/</link>
		<comments>http://blog.ippon.fr/2013/03/27/prochaines-formations-ippon-technologies/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 17:00:00 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Formation Ippon]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7597</guid>
		<description><![CDATA[<p>Ippon organise de nombreuses formations experts. Il reste quelques places pour les sessions printanières.</p> <p>Si l&#8217;une de ses formations vous intéresse, vous n&#8217;avez qu&#8217;à écrire à formation@ippon.fr pour vous inscrire ou simplement demander plus d&#8217;informations.</p> JSF2/Primefaces Date : du 16 au 18 Avril 2013 Prix : 1650€ HT Descriptif : Cette formation est la formation <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/27/prochaines-formations-ippon-technologies/">Les prochaines formations Ippon</a></span>]]></description>
				<content:encoded><![CDATA[<p>Ippon organise de nombreuses formations experts. Il reste quelques places pour les sessions printanières.</p>
<p>Si l&#8217;une de ses formations vous intéresse, vous n&#8217;avez qu&#8217;à écrire à formation@ippon.fr pour vous inscrire ou simplement demander plus d&#8217;informations.</p>
<ul>
<li><b><span style="color: #ff6600;">JSF2/Primefaces</span> </b></li>
<li>Date : du 16 au 18 Avril 2013</li>
<li>Prix : 1650€ HT</li>
<li>Descriptif : Cette formation est la formation officielle PrimeFaces proposée par Prime Teknoloji. Elle est conçue par Çağatay Çivici, le fondateur et développeur principal de PrimeFaces, les supports de cours (powerpoint) seront donc en anglais.</li>
</ul>
<ul>
<li><span style="color: #ff6600;"><b>Spring</b></span></li>
<li>Date : du 24 au 26 Avril 2013</li>
<li>Prix :  1490€ HT</li>
<li>Descriptif : Si une configuration Spring simple est à la portée de tous, avoir une architecture Spring correcte, en comprendre le fonctionnement interne et connaître les fonctionnalités avancées du framework sont des tâches nettement plus ardues.<br />
L&#8217;objectif de cette formation est de donner les bonnes bases pour comprendre les principaux aspects de Spring, de manière à ce que les participants soient capables de :</p>
<ul>
<li>développer une application Spring complète (persistance, métier, validation, transactions, sécurité, Web, Ajax&#8230;)</li>
<li>comprendre le fonctionnement interne de Spring et donc être autonomes lorsqu&#8217;un bug ou une situation anormale se produit</li>
<li>avoir intégré la philosophie de développement Spring, afin de pouvoir facilement prendre en main un sous-projet ou une fonctionnalité Spring qu&#8217;ils ne connaissent pas encore</li>
</ul>
</li>
</ul>
<ul>
<li><b><span style="color: #ff6600;">MuleESB</span> </b></li>
<li>Date : du 15 au 17 Mai 2013</li>
<li>Prix : 1490€ HT</li>
<li>Descriptif : <span style="font-family: Arial,sans-serif;">Mise en oeuvre d&#8217;un ESB avec Mule: Structurez, partagez vos services et vos flux d&#8217;informations à l&#8217;aide un Bus Open Source accessible</span><b><br />
</b></li>
</ul>
<ul>
<li><span style="color: #ff6600;"><b> Etat de l&#8217;art mobile</b></span></li>
<li>Date : 23 Mai 2013</li>
<li>Prix : 550€ HT</li>
<li>Descriptif : <span style="font-family: Arial,sans-serif;">Solutions natives, web ou hybrides, architectures, ergonomies, marketplaces, tout savoir pour plonger dans l&#8217;univers de la mobilité </span></li>
</ul>
<ul>
<li><b><span style="color: #ff6600;">JS Expert</span> </b></li>
<li>Date : du 29 au 31 Mai 2013</li>
<li>Prix : 1490€ HT</li>
<li>Descriptif : <span style="font-family: Arial,sans-serif;">Javascript, uniquement pour experts ! Venez (re)découvrir le coeur du langage, ses APIs et les frameworks incontournables. Une vraie réflexion sur les applications de demain. </span></li>
</ul>
<p><span style="font-family: Arial,sans-serif;">&#8220;Les API JS avec HTML5, JS avancé, Architectures associées&#8221;</span></p>
<ul>
<li><b><span style="color: #ff6600;">Etat de l&#8217;art du Web</span> </b></li>
<li>Date : 6 Juin 2013</li>
<li>Prix : 550€ HT</li>
<li>Descriptif :  Standards, frameworks, CMS, portails et architectures mis à nu pour alimenter votre veille technologique</li>
</ul>
<ul>
<li><b><span style="color: #ff6600;">Liferay </span> </b></li>
<li>Date : du 12 au 14 Juin 2013</li>
<li>Prix : 1490€ HT</li>
<li>Descriptif : <span style="font-family: Arial,sans-serif;">Liferay: administration et développement. Liferay est une référence dans les solutions de portail. Maîtrisez-en les subtilités de développement et d&#8217;administration </span></li>
</ul>
<p><span style="color: #ff6600;"><strong>Ippon est bien évidemment présent sur Devoxx sur le stand M6  &#8211; Ippon Technologies / Atomes . </strong></span></p>
<p><span style="color: #ff6600;"><strong>Venez poser directement vos questions aux responsables de l&#8217;offre Formation.</strong></span></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/jGd6LVkKfMQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/27/prochaines-formations-ippon-technologies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/27/prochaines-formations-ippon-technologies/</feedburner:origLink></item>
		<item>
		<title>Ippevent le 18 avril à 19h : elasticsearch par David Pilato</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/1d2mQPsGFB4/</link>
		<comments>http://blog.ippon.fr/2013/03/25/ippevent-le-18-avril-a-19h-elasticsearch-par-david-pilato/#comments</comments>
		<pubDate>Mon, 25 Mar 2013 08:50:03 +0000</pubDate>
		<dc:creator>Antoine SABOT-DURAND</dc:creator>
				<category><![CDATA[Ippevents]]></category>
		<category><![CDATA[elasticsearch]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7575</guid>
		<description><![CDATA[<p>Vous utilisez encore des requêtes SQL pour faire des recherches ? Vos utilisateurs vous reprochent de ne pas pouvoir chercher sur toutes les rubriques ? Votre temps de réponse moyen est supérieur à la demi-seconde avec seulement quelques millions de documents ? Il vous faut 3 jours pour produire des statistiques sur vos données ? Vous rêvez d’offrir une <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/25/ippevent-le-18-avril-a-19h-elasticsearch-par-david-pilato/">Ippevent le 18 avril à 19h : elasticsearch par David Pilato</a></span>]]></description>
				<content:encoded><![CDATA[<p><img class="alignleft" alt="Logo elasticsearch" src="http://ww1.prweb.com/prfiles/2012/04/24/9440231/elasticsearch-logo.png" width="128" height="128" />Vous utilisez encore des requêtes SQL pour faire des recherches ? Vos utilisateurs vous reprochent de ne pas pouvoir chercher sur toutes les rubriques ? Votre temps de réponse moyen est supérieur à la demi-seconde avec seulement quelques millions de documents ? Il vous faut 3 jours pour produire des statistiques sur vos données ? Vous rêvez d’offrir une recherche &#8220;à la google&#8221; sur les données de votre SI ?</p>
<p>Ne cherchez plus ! Cet Ippevent est fait pour vous. Présenté par David Pilato Technical advocate chez ElasticSearch,  celui-ci vous présentera au cours de la soirée pourquoi et comment il est passé de la recherche SQL à Elasticsearch en détaillant les apports de ce moteur par rapport à une solution pure Lucene :</p>
<ul>
<li>Pourquoi Elasticsearch ?</li>
<li>L&#8217;indexation</li>
<li>La recherche</li>
<li>La collecte de données (rivers)</li>
<li>Les facettes et le principe de navigation par facettes</li>
<li>La scalabilité horizontale</li>
<li>L&#8217;analyse et le mapping</li>
<li>La percolation</li>
<li>La communauté</li>
</ul>
<p>Pour vous inscrire, rien de plus simple, il vous suffit d&#8217;utiliser le bandeau ci-dessous</p>
<div style="width: 100%; text-align: left;"><iframe frameborder="0" height="214" marginheight="5" marginwidth="5" scrolling="auto" src="https://www.eventbrite.fr/tickets-external?eid=5992701331&amp;ref=etckt&amp;v=2" width="100%"></iframe></p>
<div style="font-family: Helvetica, Arial; font-size: 10px; padding: 5px 0 5px; margin: 2px; width: 100%; text-align: left;"><a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr/r/etckt" target="_blank">Vendez des billets</a> <span style="color: #ddd;">à travers</span> <a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr?ref=etckt" target="_blank">Eventbrite</a></div>
</div>
<p><strong>Bio du speaker</strong></p>
<p>David Pilato est &#8220;technical advocate&#8221; chez <a href="http://elasticsearch.com/">Elasticsearch.com</a>, après avoir passé les deux dernières années à promouvoir le projet open-source Elasticsearch, dont il anime la communauté française. Fidèle des JUG, il a donné une conférence sur le sujet lors de la première édition de Devoxx France en avril 2012 et sillonne désormais les routes de France pour partager sa passion.</p>
<p>Il a implémenté un certain nombre de plugins pour l&#8217;écosystème Elasticsearch (Rivers RSS, FileSystem et DropBox, Factories Spring).</p>
<p>Il a également implémenté Elasticsearch pour plusieurs projets, dont une importante administration française. Il est le co-auteur du projet open-source <a href="http://scrutmydocs.org/" target="_blank">Scrutmydocs.org</a> basé sur Elasticsearch qui permet de disposer d&#8217;un moteur de recherche &#8220;à la google&#8221; des documents de vos disques durs.</p>
<p><a href="http://twitter.com/dadoonet" target="_blank">@dadoonet</a> et <a href="http://twitter.com/ElasticsearchFR" target="_blank">@ElasticsearchFR</a> sur Twitter</p>
<p><a href="https://github.com/dadoonet" target="_blank">dadoonet</a> sur GitHub</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/1d2mQPsGFB4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/25/ippevent-le-18-avril-a-19h-elasticsearch-par-david-pilato/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/25/ippevent-le-18-avril-a-19h-elasticsearch-par-david-pilato/</feedburner:origLink></item>
		<item>
		<title>Pourquoi Flex reviendra</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/ihyN2WfiOyM/</link>
		<comments>http://blog.ippon.fr/2013/03/19/pourquoi-flex-reviendra/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 18:54:42 +0000</pubDate>
		<dc:creator>Nicolas HALLEPEE</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Ippon]]></category>
		<category><![CDATA[Mobilité]]></category>
		<category><![CDATA[cross-browser]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[fragmentation]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7552</guid>
		<description><![CDATA[Pourquoi Flex reviendra <p>Combien de fois n&#8217;ai-je pas entendu : &#8220;mais Flex c&#8217;est mort, non ?&#8221;</p> <p></p> <p>Force est de constater qu&#8217;après l&#8217;annonce d&#8217;Adobe d’arrêter le flash player mobile il y a de ça plus d&#8217;un an, les nouveaux projets web se sont quasi exclusivement construits autour de la pile technique HTML5 (HTML, CSS3, JS). <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/19/pourquoi-flex-reviendra/">Pourquoi Flex reviendra</a></span>]]></description>
				<content:encoded><![CDATA[<h1>Pourquoi Flex reviendra</h1>
<p>Combien de fois n&#8217;ai-je pas entendu : &#8220;mais Flex c&#8217;est mort, non ?&#8221;</p>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/03/flex-vs-html5-940x500.jpg"><img class="alignnone size-medium wp-image-7553" alt="flex-vs-html5-940x500" src="http://blog.ippon.fr/wp-content/uploads/2013/03/flex-vs-html5-940x500-300x159.jpg" width="300" height="159" /></a></p>
<p>Force est de constater qu&#8217;après l&#8217;annonce d&#8217;Adobe d’arrêter le flash player mobile il y a de ça plus d&#8217;un an, les nouveaux projets web se sont quasi exclusivement construits autour de la pile technique HTML5 (HTML, CSS3, JS). Des projets Flex très visibles ont même fini par y migrer (Deezer, peut-être bientôt grooveshark&#8230; ok je viens de griller ma crédibilité sur ma conscience pro et les sites que je fréquente au boulot)<br />
Et pourtant&#8230; Flex apportait tout de même une solution quasi parfaite à une problématique antédiluvienne du développement web : le rendu iso cross-browser.</p>
<h2>Un rendu identique, partout</h2>
<p>Le problème peut s&#8217;énoncer de manière simple : “Goodbye, fragmentation. Hello, world.<br />
Inconsistent browsers and fragmented mobile platforms? Not your problem.“ C’est l’argumentaire choc d’Adobe pour inciter à utiliser leur solution … de développement pour les jeux en Flash&#8230; on y reviendra plus tard. Mais il faut comprendre que chaque browser possède un moteur de rendu qui lui est propre. Il interprétera donc les instructions de la norme en cours (HTML5) selon l&#8217;avancement de son implémentation et le choix stratégique qu&#8217;il aura fait. Or, en 2004, il était prévu que la norme HTML 5 arrive en recommandation W3C en 2022&#8230; même si les choses ont évolué depuis (<a href="http://wiki.whatwg.org/wiki/FAQ#What.27s_this_I_hear_about_2022.3F">http://wiki.whatwg.org/wiki/FAQ#What.27s_this_I_hear_about_2022.3F</a>) avec les avancées du WHATWG et du W3C et le changement de définition de la norme et de son évolution, on peut assez facilement concevoir qu&#8217;il est illusoire d&#8217;espérer qu&#8217;un jour, tous les browsers proposeront le même comportement et cela, ne serait-ce que sur les versions récentes des principaux navigateurs de marché (je ne parle même pas des versions plus vieilles ahhemm&#8230; ie6 ? non non, je n&#8217;en parlerai pas)</p>
<h2>La malédiction de l&#8217;hétérogénéité</h2>
<p>De plus, les éditeurs de browser n&#8217;étant pas le w3c, leur intérêt est principalement de se différencier les uns des autres en proposant des fonctionnalités différentes. Ou du moins en implémentant la norme de manière plus ou moins rapide selon les directions stratégiques empruntées. Et au développeur de tester si telle instruction CSS est disponible pour Firefox 18 et quel mécanisme de fallback utiliser pour les versions ne la prenant pas en charge. On peut citer un site comme caniuse.com qui permet au développeur de s&#8217;y retrouver dans cette jungle.</p>
<h2>Une solution : le plugin</h2>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/03/puzzle-icon.png"><img class="alignnone size-medium wp-image-7555" alt="puzzle-icon" src="http://blog.ippon.fr/wp-content/uploads/2013/03/puzzle-icon-300x300.png" width="300" height="300" /></a><br />
Dans ces circonstances, la solution simple proposée par Adobe était la suivante : puisqu&#8217;on ne peut faire confiance à l&#8217;implémentation de la norme, proposons un environnement propriétaire maîtrisé installable sur tous les environnements : un plugin.<br />
Cette réflexion peut-être un peu nuancée par les dernières nouvelles de la part des éditeurs de navigateur. En effet, avec l&#8217;adoption récente de webkit par Opéra, ce moteur de rendu est présent sur plus de 40% du marché, loin devant Trident (IE) et Gecko (Firefox). Est-ce que cela est synonyme d&#8217;un développement plus facile pour les développeurs ? Pas nécessairement, étant donné que les éditeurs auront encore plus intérêt à se différencier sur d&#8217;autres points.<br />
(<a href="http://techcrunch.com/2013/02/15/why-mozilla-matters-and-wont-switch-to-webkit/">http://techcrunch.com/2013/02/15/why-mozilla-matters-and-wont-switch-to-webkit/</a>)</p>
<p>Du fait du boom des animations flash il y a quelques années, ce player flash offre l&#8217;avantage d&#8217;être présent sur plus de 90% des postes, est mis à jour beaucoup plus rapidement par les utilisateurs que leur navigateur, qui plus est, gratuit depuis sa création. Certains argueront que c&#8217;est une solution propriétaire, que c&#8217;est l&#8217;incarnation du mal sur la planète numérique et qu&#8217;il faut se flageller 3 fois tous les soirs pour avoir vu tourner une animation flash sous Ubuntu&#8230; En l’occurrence je qualifierai cela plutôt comme une qualité (le côté propriétaire, pas la flagellation), étant donné qu&#8217;il constitue désormais un environnement d’exécution fiable, uniforme, proche des avancées du développement web et qui en couvre à peu près tous les besoins. On pourrait parler de binding, de présentation de données de manière extrêmement performante dans des listes virtualisées, bref, du fait que Flex adresse avec beaucoup de réussite les problématiques récurrentes du développement web, mais ce n&#8217;est pas l&#8217;objet de cet article.<br />
A mon sens, la problématique principale que propose de résoudre Flex, c&#8217;est de créer des applications web au comportement riche en les développant une fois, et de permettre de les déployer sur n&#8217;importe quel navigateur/plateforme.<br />
Sans rentrer dans le détail, Flex est au croisement des technologies web (JS, CSS, HTML/XML) et Java (orienté object, interfaçage simple avec des services java, service web&#8230;) et constitue une solution de choix pour quiconque souhaite développer un site web en ayant des connaissances dans ces 2 piles techniques.</p>
<h1>Pourquoi Flex va disparaître</h1>
<p>Délaissé par Adobe, le web design adopte fortement HTML5<br />
Fin 2011, l’annonce d’Adobe de supprimer le flash player mobile ainsi que d’autres outils et solutions peu utilisées et trop coûteuses à entretenir, est très mal passée. A l’époque et encore maintenant, à peu près tout le monde a compris : Flex est mort. Difficile de combattre cette idée, d’autant qu’Adobe a clairement annoncé qu’ils pousseraient en faveur du développement d’application web en HTML5. Flash restant une solution de choix pour l’animation, le jeux et la vidéo. Le framework Flex est confié à la communauté via Apache, mais pas l’environnement d&#8217;exécution (le player flash).<br />
On peut alors se poser la question de la pérennité de l’utilisation de cette technologie pour concevoir des applications métiers, des sites web marchand&#8230; sachant que l’entreprise qui adosse le player (propriétaire) va investir quasi exclusivement dans le but d’améliorer le rendu des jeux vidéo. Quel sera l’interaction avec la communauté qui va continuer à faire évoluer le framework flex ? C’est aujourd’hui une grande inconnue.<br />
Parallèlement à cela, on assiste à un boom des framework JS, ce qui renforce la concurrence d’HTML face au Flex.<br />
Enfin, on peut pointer du doigt l&#8217;échec d’Adobe à proposer une solution performante pour les environnements mobiles et l&#8217;énorme difficulté à pénétrer certains environnement propriétaires (notamment iOS). Aujourd’hui, pour faire tourner du Flex sur un iPhone, il est nécessaire de développer une application AIR. Un site web se contentant d’inclure l’application via un plugin flash ne s’affichera tout simplement pas. Est-ce que tous les clients cibles accepteront d’installer une nième application sur leur smartphone ? Enfin, mi-2012, Adobe a annoncé que le flash player ne supporterait pas les versions d’Androïd supérieur à 4.1. La messe est dite&#8230;</p>
<h2>Le développement mobile</h2>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/03/target_platforms.png"><img class="alignnone size-medium wp-image-7554" alt="target_platforms" src="http://blog.ippon.fr/wp-content/uploads/2013/03/target_platforms-300x121.png" width="300" height="121" /></a></p>
<p>Le développement mobile a cela de particulier que les ressources sont encore très limitées. Et quand bien même il s’agirait du dernier smartphone avec processeur quadricore, une application qui fait dégringoler l’autonomie a très rapidement mauvaise réputation. On privilégie donc encore les développements natifs à des solutions de type Flex, plus difficiles à maîtriser en terme de performance et de fluidité.<br />
Cependant, pour ceux qui ont déjà eu un client qui leur a demandé : “il faut que ça fonctionne sur toutes les plateformes : desktop, tablette, smartphone (dont blackberry&#8230; et windows phone&#8230; non là je trolle)”, ils ont certainement dû se tourner vers les alternatives permettant de factoriser au maximum le développement de leur application pour chaque plateforme cible. On peut alors évoquer Phonegap ou Sencha&#8230; On pourrait en citer d’autres, mais l’important est de comprendre que ce type de solution va basiquement prendre en entrée un langage largement maîtrisé (HTML, CSS, JS), et produire en sortie un livrable pour iOS, un autre pour Androïd, encore un autre pour Blackberry&#8230; sans que le développeur n’ait à recoder toute l’application.<br />
Il faut nuancer ceci par le fait que toutes les plateformes n’offrent pas les mêmes ressources (taille d’écran, présence d’une caméra, d’un GPS, d’un acceléromètre&#8230;) et que donc, certaines portions de l’application restent à coder de manière native ou du moins très spécifique.</p>
<h1>Le retour de flex ?</h1>
<p>Qu’on le regrette ou qu’on s’en réjouisse, vendre un projet en flex relève plus de la gageure que d’une réalité du marché actuel. Ou alors c’est que votre préposé aux réponses aux appels d’offre est un champion et qu’il faut sérieusement penser à l’augmenter.<br />
Quoi qu’il en soit, si on se passe de Flex, quand est-il du rendu iso cross-browser ? Est-ce qu’on continue à faire des tests sur les plateformes les plus représentatives (iphone 4, 5, samsung galaxy III, et sony hello kitty pour faire plaisir à la fille du patron) et “ignorer” les autres, en attendant d’avoir des retours utilisateur (ce fidèle beta testeur gratuit) pour découvrir que tel packaging de webkit ne donne pas le même rendu pour ce composant visuel qui a pris 2 mois à coder ? L’éditeur de logiciel aime l’industrialisation, il aime maîtriser les process de déploiement, il aime l’automatisation, il déteste les surprises, il déteste les surprises, il déteste les surprises&#8230; Le client aussi d’ailleurs.</p>
<p>Très bien, mais alors, quelle est la solution ? Compiler du JS en vue de l’exectuer dans une VM ? Du Flex si la communauté persiste et ne diminue pas ? Une autre technologie ?</p>
<p>A lire pour compléter:<br />
<a href="https://plus.google.com/109047477151984864676/posts/CVGJKLMMehs">https://plus.google.com/109047477151984864676/posts/CVGJKLMMehs</a><br />
<a href="http://www.adobe.com/fr/showcase/pdfs/deezer.pdf">http://www.adobe.com/fr/showcase/pdfs/deezer.pdf</a><br />
<a href="http://www.journaldunet.com/solutions/expert/52435/html5-vs--flash--quel-choix-de-technologie-effectuer-pour-ses-applications-web-et-mobiles.shtml">http://www.journaldunet.com/solutions/expert/52435/html5-vs&#8211;flash&#8211;quel-choix-de-technologie-effectuer-pour-ses-applications-web-et-mobiles.shtml</a><br />
<a href="http://web.appstorm.net/general/opinion/should-all-browsers-use-webkit/">http://web.appstorm.net/general/opinion/should-all-browsers-use-webkit/</a><br />
<a href="http://www.universalmind.com/mindshare/entry/top-5-considerations-for-transitioning-from-flex-to-html5">http://www.universalmind.com/mindshare/entry/top-5-considerations-for-transitioning-from-flex-to-html5</a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/ihyN2WfiOyM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/19/pourquoi-flex-reviendra/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/19/pourquoi-flex-reviendra/</feedburner:origLink></item>
		<item>
		<title>Improving the performance of the Spring-Petclinic sample application (part 5 of 5)</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/KS7TJGsMb8Y/</link>
		<comments>http://blog.ippon.fr/2013/03/15/improving-the-performance-of-the-spring-petclinic-sample-application-part-5-of-5/#comments</comments>
		<pubDate>Fri, 15 Mar 2013 10:00:40 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring-Petclinic]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7527</guid>
		<description><![CDATA[<p>This is part 5 of our 5-part series on improving the performance of the Spring-petclinic application. Here are part 1, part 2, part 3 and part 4.</p> Adding more cache <p>To increase application performance, one of the classic solutions is to add more cache. We already have a cache configured in the application, it is on the JpaVetRepositoryImpl.</p> <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/15/improving-the-performance-of-the-spring-petclinic-sample-application-part-5-of-5/">Improving the performance of the Spring-Petclinic sample application (part 5 of 5)</a></span>]]></description>
				<content:encoded><![CDATA[<p>This is part 5 of our 5-part series on improving the performance of the Spring-petclinic application. Here are <a href="http://blog.ippon.fr/?p=7496" target="_blank">part 1</a>, <a href="http://blog.ippon.fr/?p=7500" target="_blank">part 2</a>, <a href="http://blog.ippon.fr/?p=7512" target="_blank">part 3</a> and <a href="http://blog.ippon.fr/?p=7520" target="_blank">part 4</a>.</p>
<h2>Adding more cache</h2>
<p>To increase application performance, one of the classic solutions is to add more cache. We already have a cache configured in the application, it is on the <a href="https://github.com/jdubois/spring-petclinic/blob/681026758d2f80082c4597ec0393bff07c95be65/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImpl.java#L44" target="_blank">JpaVetRepositoryImpl</a>.</p>
<p>We are going to generalize this cache on 2 different parts of the application:</p>
<ul>
<li>Using the <a href="http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/cache.html" target="_blank">Spring Cache abstraction</a>, like on the <a href="https://github.com/jdubois/spring-petclinic/blob/681026758d2f80082c4597ec0393bff07c95be65/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImpl.java#L44" target="_blank">JpaVetRepositoryImpl</a>, to cache frequently used business methods. The <a href="https://github.com/jdubois/spring-petclinic/blob/05a60b774011c41d522293ec3b2f4ed89b680ec5/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java#L46" target="_blank">JpaOwnerRepositoryImpl.findByLastName()</a> method is a perfect candidate for this: doing a “like” clause is very slow on a database, and people’s last names do not change frequently. So we decided to cache this result for 60 seconds.</li>
<li>Using the Hibernate second level cache: we have cached most entities and collections of the application, and re-coded parts of the application to use this cache. As a result, using Hibernate’s “<em>showSql=true</em>” parameter, we can see that the application does not execute any unnecessary SQL request (as long as there is no write, requests are only executed once).</li>
</ul>
<p>You can see those changes in the following commit:</p>
<p><a href="https://github.com/jdubois/spring-petclinic/commit/05a60b774011c41d522293ec3b2f4ed89b680ec5" target="_blank">[Source code]</a></p>
<p><strong>Our final result goes up to 1225 req/sec</strong>. That’s only a 15% performance boost, but please note that we have a very small database, and that it is running locally. On a real-world system, the improvement should be better, especially for the JpaOwnerRepositoryImpl.findByLastName() method.</p>
<h2>Extreme testing</h2>
<p>We decided to do an extreme testing session, in order to see if we really stabilized the application (using Tomcat’s NIO connector and going stateless, specifically).</p>
<p>So we ran our test again on the Macbook, still with 500 threads, but this time we let it run until we had <strong>100 000 user sessions</strong>.</p>
<p>Our results are extremely good:</p>
<ul>
<li>No HTTP error at all</li>
<li>Memory stays at the same level, no matter how many users are using it</li>
<li>The application runs smoothly, and stabilizes at <strong>1565 req/sec</strong> !!</li>
</ul>
<p>This is, of course, an excellent result.</p>
<h2>Conclusion and final thoughts</h2>
<p>During those five days, we have gone through the classical steps we use at Ippon Technologies when auditing a project:</p>
<ul>
<li>Creating a “real” test case</li>
<li>Removing data in the HTTP Sessions</li>
<li>Removing the JVM locks</li>
<li>Tuning the persistence layer</li>
<li>Adding a cache</li>
</ul>
<p>For each of these steps, JMeter and YourKit were our best tools to stress test the application and monitor how it responded to the test.</p>
<p>Of course, more work could have been done on JVM tuning, and on database tuning (but changing the database schema is outside the scope of this article).</p>
<p>At the beginning of the tests, we had to increase our heap memory size to 1 Gb, and could only serve 548 req/sec, with some HTTP errors. After completing our audit, we are now back to 128 M, and can serve 1225 req/sec with no error at all. We expect those results to be even better on a real server, with many cores and threads, and where removing JVM locks will have a more significant impact.</p>
<p>We also had a great improvement in the application stability, having 0 errors and 1565 req/sec with 100 000 users on our “extreme tests”. The application is now ready to handle a lot of users without any trouble.</p>
<p>Last but not least, we have switched the persistence layer from JDBC to JPA: a quick look at the code shows how much clearer and smaller the JPA code is. And the Spring Data JPA code is even clearer and smaller. It’s great to see that quality code can also be more performant than low-level, hard-to-code classes.</p>
<p>[edit]</p>
<p>You can find the other episodes of this series here : <a href="http://blog.ippon.fr/?p=7496" target="_blank">part 1</a>, <a href="http://blog.ippon.fr/?p=7500" target="_blank">part 2</a>, <a href="http://blog.ippon.fr/?p=7512" target="_blank">part 3</a> and <a href="http://blog.ippon.fr/?p=7520" target="_blank">part 4</a>.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/KS7TJGsMb8Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/15/improving-the-performance-of-the-spring-petclinic-sample-application-part-5-of-5/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/15/improving-the-performance-of-the-spring-petclinic-sample-application-part-5-of-5/</feedburner:origLink></item>
		<item>
		<title>Improving the performance of the Spring-Petclinic sample application (part 4 of 5)</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/zpEZaUS1JLw/</link>
		<comments>http://blog.ippon.fr/2013/03/14/improving-the-performance-of-the-spring-petclinic-sample-application-part-4-of-5/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 10:00:37 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring-Petclinic]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7520</guid>
		<description><![CDATA[<p>This is part 4 of our 5-part series on improving the performance of the Spring-petclinic application. Here are part 1, part 2 and part 3.</p> Testing the other persistence mechanisms: is JDBC really faster? <p>The good thing with the Spring-petclinic application is that we can easily switch between different persistence solutions: JDBC, JPA and Spring <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/14/improving-the-performance-of-the-spring-petclinic-sample-application-part-4-of-5/">Improving the performance of the Spring-Petclinic sample application (part 4 of 5)</a></span>]]></description>
				<content:encoded><![CDATA[<p>This is part 4 of our 5-part series on improving the performance of the Spring-petclinic application. Here are <a href="http://blog.ippon.fr/?p=7496" target="_blank">part 1</a>, <a href="http://blog.ippon.fr/?p=7500" target="_blank">part 2</a> and <a href="http://blog.ippon.fr/?p=7512" target="_blank">part 3</a>.</p>
<h2>Testing the other persistence mechanisms: is JDBC really faster?</h2>
<p>The good thing with the Spring-petclinic application is that we can easily switch between different persistence solutions: JDBC, JPA and Spring Data JPA.</p>
<h2>First tests: JDBC wins!</h2>
<p>We are first doing a very simple test, by switching the Spring profile in the web.xml file and comparing the results.</p>
<p>Here are the results:</p>
<ul>
<li>JDBC: 959 req/sec</li>
<li>JPA: 902 req/sec</li>
<li>Spring Data JPA: 797 req/sec</li>
</ul>
<p>One of the reasons of the difference between the JPA and the Spring Data JPA tests is that there is a cache on the <a href="https://github.com/jdubois/spring-petclinic/blob/197888fef0ad5066006f817c801c99f57e44103d/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImpl.java#L44" target="_blank">JpaVetRepositoryImpl</a>. and not on the <a href="https://github.com/jdubois/spring-petclinic/blob/197888fef0ad5066006f817c801c99f57e44103d/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVetRepository.java#L28" target="_blank">SpringDataVetRepository</a>. So this is rather a non-issue: both repositories have roughly the same performance, and we will generally recommend using Spring Data over JPA as there is a lot less code to write. However, for the rest of the tests we will use JPA as this cache gives us better performance.</p>
<h2>Using Lazy loading and Open Session In View</h2>
<p>The previous tests might have given some people the impression that JPA is not a good technology for performance tuning an application.<br />
This is just plain wrong: JPA is an excellent solution, as long as you use it correctly.</p>
<p>For instance, the biggest problem here is that we have a collection of visits which is eagerly fetched:</p>
<p><a href="https://github.com/jdubois/spring-petclinic/blob/197888fef0ad5066006f817c801c99f57e44103d/src/main/java/org/springframework/samples/petclinic/model/Pet.java#L51" target="_blank">[Source code]</a></p>
<p>Let’s discuss this problem:</p>
<ul>
<li>As this is a sample application, demonstrating that we can switch persistence solutions easily, we are fetching all data in the repository layer. So this decision is understandable.</li>
<li>However, that means that each time we show the “owners” page, we fetch all the visits, for no reason.</li>
</ul>
<p>In order to solve this issue, we have decided to go back to normal and use lazy-loading (which is the default in Hibernate/JPA). As this will cause lazy loading exceptions in the visits page, we have to find a solution, and there are two of them:</p>
<ul>
<li>Create a specific business method that can return the visits eagerly when needed. This is the most performant solution, but it requires recoding a lot of things.</li>
<li>Use the “Open Session In View” pattern</li>
</ul>
<p>You will find a lot of people on the Internet telling that the “Open Session In View” is a bad pattern: indeed, it will make your database transaction live a lot longer than needed. Instead of just using a transaction at the service layer, you will now use it as long as your whole JSP view is not completely generated.<br />
For example, if you configure the Open Session In View filter on your whole application (on the “/*” pattern), and run our stress test again, you will have some transactions errors.</p>
<p>However, we only need it on the owners page, so we are going to configure it on this page only:</p>
<p><a href="https://github.com/jdubois/spring-petclinic/blob/681026758d2f80082c4597ec0393bff07c95be65/src/main/webapp/WEB-INF/web.xml#L78" target="_blank">[Source code]</a></p>
<p>I have personally used this pattern on a lot of production applications, and it really eases development, for a small performance cost. So unless you have some very big performance needs, you can use it without worrying too much.</p>
<p>The resulting code is rather simple to write:</p>
<p><a href="https://github.com/jdubois/spring-petclinic/commit/681026758d2f80082c4597ec0393bff07c95be65" target="_blank">[Source code]</a></p>
<p>And <strong>here are the results: 1066 req/sec</strong> ! So using JPA with the Open Session In View is not such a bad solution after all!</p>
<h2>Conclusion of part 4</h2>
<p>Switching to JPA for our persistence layer has given us a performance boost, as soon as we have tuned it, of course! Besides, we have room for improvement: more tuning can probably be done, and the Open Session In View is not a good performance pattern (but it is an excellent productivity pattern!).</p>
<p>But most importantly, switching to JPA (or, even better, Spring Data JPA) has given us an excellent developer productivity and code quality boost.</p>
<p>We will finish this series with part 5, where we will add more cache to the application, to make it even more performant.</p>
<p>[edit]</p>
<p>You can find the other episodes of this series here : <a href="http://blog.ippon.fr/?p=7496" target="_blank">part 1</a>, <a href="http://blog.ippon.fr/?p=7500" target="_blank">part 2</a>, <a href="http://blog.ippon.fr/?p=7512" target="_blank">part 3</a>, and <a href="http://blog.ippon.fr/?p=7527" target="_blank">part 5</a>.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/zpEZaUS1JLw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/14/improving-the-performance-of-the-spring-petclinic-sample-application-part-4-of-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/14/improving-the-performance-of-the-spring-petclinic-sample-application-part-4-of-5/</feedburner:origLink></item>
		<item>
		<title>Improving the performance of the Spring-Petclinic sample application (part 3 of 5)</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/3uX9sbkQuO4/</link>
		<comments>http://blog.ippon.fr/2013/03/13/improving-the-performance-of-the-spring-petclinic-sample-application-part-3-of-5/#comments</comments>
		<pubDate>Wed, 13 Mar 2013 10:00:09 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring-Petclinic]]></category>
		<category><![CDATA[Webjars]]></category>
		<category><![CDATA[Yourkit]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7512</guid>
		<description><![CDATA[<p>This is part 3 of our 5-part series on improving the performance of the Spring-petclinic application. Here are part 1 and part 2.</p> <p>Yesterday we managed to make the application handle 5000 users, with an average performance of 867 req/sec. Let’s see if we can improve this today.</p> Removing the JVM locks <p>Running the tests <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/13/improving-the-performance-of-the-spring-petclinic-sample-application-part-3-of-5/">Improving the performance of the Spring-Petclinic sample application (part 3 of 5)</a></span>]]></description>
				<content:encoded><![CDATA[<p>This is part 3 of our 5-part series on improving the performance of the Spring-petclinic application. Here are <a href="http://blog.ippon.fr/?p=7496" target="_blank">part 1</a> and <a href="http://blog.ippon.fr/?p=7500" target="_blank">part 2</a>.</p>
<p>Yesterday we managed to make the application handle 5000 users, with an average performance of 867 req/sec. Let’s see if we can improve this today.</p>
<h2>Removing the JVM locks</h2>
<p>Running the tests from part 2 showed us that some requests are taking a lot longer than the others, in fact our application does not answer requests fairly to all users.</p>
<p>As this is rather strange, we run up YourKit again, this time to check if we have some locked threads in the JVM:</p>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/03/screenshot_3.png"><img class="aligncenter size-full wp-image-7504" alt="Spring-petclinic screenshot_3" src="http://blog.ippon.fr/wp-content/uploads/2013/03/screenshot_3.png" width="1280" height="1024" /></a></p>
<p>This YourKit screenshot shows a profiling session, where each time a thread is locked it becomes red.</p>
<p>It seems we have a few locks! This explains why some requests are really slow, they are getting locked by the JVM.</p>
<p>YourKit also shows us 3 main culprits for those locks, which we are going to remove one at a time.</p>
<h2>Removing Commons DBCP</h2>
<p>The first cause of those locks is our database connection pool, Commons DBCP, which is well-known for doing a lot of synchronization.</p>
<p>Let&#8217;s switch to tomcat-jdbc, which is the new Tomcat connection pool :</p>
<p><a href="https://github.com/jdubois/spring-petclinic/commit/bb1b399771fe6748294ec410136aebbdbb327d3f" target="_blank">[Source code]</a></p>
<p>We have limited the number of connections to 8, which is a very small number, for two reasons:</p>
<ul>
<li>This is the default configuration of Commons DBCP, and we wanted to have a comparable configuration</li>
<li>For this test, everything runs on the same machine, so we can’t have too many concurrent connections, or the performance will in fact decrease</li>
</ul>
<p>On a real production system, it is very likely that a number between 30 and 100 would be a better configuration.</p>
<p>Testing the application again, <strong>we now achieve 910 req/sec</strong>.</p>
<h2>Removing Webjars</h2>
<p><a href="http://www.webjars.org/" target="_blank">Webjars</a> is a library that is used to manage client-side libraries like JQuery or Twitter Bootstrap.</p>
<p>We have included a request to get JQuery in the stress test, in fact we expected this to cause some trouble: Webjars is using the same mechanism as Richfaces to provide static resources, and we already had that exact same issue with Richfaces (by the way, many other Web frameworks, like Play!, are doing the same). Indeed, the JVM is doing a big lock each time someone tries to load a Web library.</p>
<p>We have experienced this being an issue at a client site: we are only testing here with one Web library, but if we were using all the libraries from the application, things would be much worse.</p>
<p>For this particular client:</p>
<ul>
<li>We had a few hundred users, not enough to bother setting up a specific system (like a CDN) to handle static resources</li>
<li>Every user was using the application through HTTPS, which minimized browser caching</li>
</ul>
<p>After discussing with James Ward, the author of Webjars, we have the following best practices for using Webjars:</p>
<ul>
<li>Use a caching HTTP Server as a front-end (or a CDN for a bigger Web application)</li>
<li>Use a framework that automatically caches Web resources. Unfortunately Spring doesn’t do it by default, But it shouldn&#8217;t be too hard to add <a href="http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/WebContentInterceptor.html" target="_blank">using an interceptor</a></li>
</ul>
<p>We have decided to simulate that we have a specific caching mechanism (of course, another solution is to remove Webjars and manage your Web libraries manually):</p>
<p><a href="https://github.com/jdubois/spring-petclinic/commit/2b3ed81a9b294587573cf0bd43402264355dd15b" target="_blank">[Source code]</a></p>
<p>For our next steps, we have now disabled the “JS” step in our JMeter test, and have enabled the “JS no webjar” step instead. This will make our stress test use the JQuery script that is served directly by the server, without using Webjars.</p>
<p>So let’s get down to the results: <strong>we are now at 942 req/sec</strong>.</p>
<h2>Removing the monitoring aspect</h2>
<p>This last issue was created on purpose: we have a small lock in the aspect which is provided to monitor the application with JMX.</p>
<p>It’s in fact a very good idea, but it has a negative impact on performance. Let’s remove it:</p>
<p><a href="https://github.com/jdubois/spring-petclinic/commit/197888fef0ad5066006f817c801c99f57e44103d" target="_blank">[Source code]</a></p>
<p><strong>We now reach 959 req/sec</strong>.</p>
<h2>Conclusion of part 3</h2>
<p>We have used our profiler to quickly see that we had some JVM locks on the application. We have removed each of them, and saw each time an increase in the performance of the application.</p>
<p>Using YourKit again, we don’t see any JVM locks any more on the application (no red threads anymore!):</p>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/03/screenshot_4.png"><img class="aligncenter size-full wp-image-7505" alt="Spring-petclinic screenshot_4" src="http://blog.ippon.fr/wp-content/uploads/2013/03/screenshot_4.png" width="816" height="716" /></a></p>
<p>Our application <strong>went up from 867 req/sec to 959 req/sec</strong>. This is of course a better result, and it would probably be even better on a real production server, which has more cores and threads than the Macbook we are using for the tests.</p>
<p>On part 4, we will test if we can do better with JPA than with JDBC.</p>
<p>[edit]</p>
<p>You can find the other episodes of this series here : <a href="http://blog.ippon.fr/?p=7496" target="_blank">part 1</a>, <a href="http://blog.ippon.fr/?p=7500" target="_blank">part 2</a>, <a href="http://blog.ippon.fr/?p=7520" target="_blank">part 4</a> and <a href="http://blog.ippon.fr/?p=7527" target="_blank">part 5</a>.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/3uX9sbkQuO4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/13/improving-the-performance-of-the-spring-petclinic-sample-application-part-3-of-5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/13/improving-the-performance-of-the-spring-petclinic-sample-application-part-3-of-5/</feedburner:origLink></item>
		<item>
		<title>Ippevent le 21 Mars – User eXperience Driven Design avec MyDraft</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/iOTMeX9FscQ/</link>
		<comments>http://blog.ippon.fr/2013/03/12/ippevent-user-experience-driven-design-avec-mydraft-le-21-mars/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 20:05:22 +0000</pubDate>
		<dc:creator>Antoine SABOT-DURAND</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Ippevents]]></category>
		<category><![CDATA[Agilité]]></category>
		<category><![CDATA[MyDraft]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7537</guid>
		<description><![CDATA[<p>Vous trouvez que les user stories sont finalement assez peu parlantes ? Vous trouvez long, un sprint de deux semaines pour découvrir ce qu&#8217;elles peuvent donner à l&#8217;écran ? Vous êtes un peu déçus lorsque vous voyez l&#8217;incarnation de vos intentions ? Vous trouvez qu&#8217;une fois partis sur une piste, c&#8217;est long et cher de <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/12/ippevent-user-experience-driven-design-avec-mydraft-le-21-mars/">Ippevent le 21 Mars &#8211; User eXperience Driven Design avec MyDraft</a></span>]]></description>
				<content:encoded><![CDATA[<p>Vous trouvez que les user stories sont finalement assez peu parlantes ? Vous trouvez long, un sprint de deux semaines pour découvrir ce qu&#8217;elles peuvent donner à l&#8217;écran ? Vous êtes un peu déçus lorsque vous voyez l&#8217;incarnation de vos intentions ? Vous trouvez qu&#8217;une fois partis sur une piste, c&#8217;est long et cher de changer tout et que le refactoring c&#8217;est sympa mais décourageant ? Vous vous dites qu&#8217;on doit pouvoir mieux faire en 2013 ?</p>
<p>Vous avez raison. Dans cet Ippevent présenté par Michael Zam(fondateur et CTO de Karmicsoft), venez rencontrer les cloudjects, une nouvelle espèce d&#8217;objets vivant dans le cloud, investie pour matérialiser vos rêves en sprints de 2 minutes, capable de simuler le fonctionnement des modèles métier objet, domptable par clic, scriptable à la volée et testable unitairement, habillée avec une GUI à la mode façon RIA, tout justement taillée pour la gestion des données complexes.</p>
<p>À bord du vaisseau MyDraft, vous ferez un voyage spatio-temporel, dégusterez les délices des spécifications vivantes animées par des modèles exécutables, sous la coupe protectrice de la traçabilité agile, socialiserez avec des cloudjects à karma ouvert, pour découvrir ensemble comment réconcilier réactivité, économies, sécurisation du périmètre fonctionnel et pur plaisir.</p>
<p>Cet Ippevent aura lieu le jeudi 21 mars à 19h dans nos locaux de Levallois Perret (90 rue Baudin). Pour vous inscrire il suffit de cliquer sur le bandeau ci-dessous.</p>
<div style="width: 100%; text-align: left;"><iframe frameborder="0" height="214" marginheight="5" marginwidth="5" scrolling="auto" src="http://www.eventbrite.fr/tickets-external?eid=5797826455&amp;ref=etckt&amp;v=2" width="100%"></iframe></p>
<div style="font-family: Helvetica, Arial; font-size: 10px; padding: 5px 0 5px; margin: 2px; width: 100%; text-align: left;"><a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr/r/etckt" target="_blank">Vendre des billets en ligne</a> <span style="color: #ddd;">à travers</span> <a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr?ref=etckt" target="_blank">Eventbrite</a></div>
</div>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/iOTMeX9FscQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/12/ippevent-user-experience-driven-design-avec-mydraft-le-21-mars/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/12/ippevent-user-experience-driven-design-avec-mydraft-le-21-mars/</feedburner:origLink></item>
		<item>
		<title>Improving the performance of the Spring-Petclinic sample application (part 2 of 5)</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/fhRZt_YsunQ/</link>
		<comments>http://blog.ippon.fr/2013/03/12/improving-the-performance-of-the-spring-petclinic-sample-application-part-2-of-5/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 10:00:11 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Dandelion]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring-Petclinic]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Yourkit]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7500</guid>
		<description><![CDATA[<p>This is part 2 of our 5-part series on improving the performance of the Spring-petclinic application. You can find the first part here.</p> Let’s profile our application <p>The error from part 1 is quite clear: we fill up all the server memory until the application slows down and crashes.</p> <p>This is time to launch our <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/12/improving-the-performance-of-the-spring-petclinic-sample-application-part-2-of-5/">Improving the performance of the Spring-Petclinic sample application (part 2 of 5)</a></span>]]></description>
				<content:encoded><![CDATA[<p>This is part 2 of our 5-part series on improving the performance of the Spring-petclinic application. You can find the first part <a href="http://blog.ippon.fr/2013/03/11/improving-the-performance-of-the-spring-petclinic-sample-application-part-1-of-5/" target="_blank">here</a>.</p>
<h2>Let’s profile our application</h2>
<p>The error from part 1 is quite clear: we fill up all the server memory until the application slows down and crashes.</p>
<p>This is time to launch our profiler! Our two favorite tools are:</p>
<ul>
<li><a href="http://www.ej-technologies.com/products/jprofiler/overview.html" target="_blank">JProfiler</a>, which is the most complete and is a little bit expensive. This is the one we usually recommend to our clients.</li>
<li><a href="http://www.yourkit.com/" target="_blank">YourKit</a>, which is easier to use and is less expensive. This is the one we use for Tatami, as they provide free licenses for Open Source projects. If you have never used a profiler before, we recommend that you start with Yourkit.</li>
</ul>
<p>We have used YourKit for this profiling session, mainly because we found its screenshots look better.</p>
<p>As we can see from this first screenshot, we have found our first culprit: <a href="http://dandelion.github.com/datatables/" target="_blank">Dandelion</a> (which is a tag library used to display nice-looking HTML tables) is using most of our memory.</p>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/03/screenshot_1.png"><img class="aligncenter size-full wp-image-7502" alt="Spring-petclinic screenshot_1" src="http://blog.ippon.fr/wp-content/uploads/2013/03/screenshot_1.png" width="1415" height="465" /></a></p>
<p>Dandelion is a great project, but it is using too much memory on this version. As we would love to use Dandelion again, <a href="https://github.com/dandelion/issues/issues/34" target="_blank">we have filled a bug</a> on the project’s website, and the project’s developpers have been very quick at resolving it!</p>
<p>So <strong>the next version of Dandelion doesn’t have this problem anymore</strong>, and you can safely use it on high-volume applications.</p>
<h2>Solving the memory issue with Dandelion</h2>
<p>Of course we will upgrade to the next version of Dandelion, which will resolve this issue, but for the moment, as we need to move forward, we will replace it with a classic HTML table, which is then beautified using JavaScript. We have used <a href="http://www.datatables.net/" target="_blank">JQuery DataTables</a>, which provides a similar, but pure-JavaScript, solution:</p>
<p><a href="https://github.com/jdubois/spring-petclinic/commit/b2d628354f327006650506bd531213bd7f3130a2" target="_blank">[Source code]</a></p>
<p>We then ran our tests again: we now <strong>go up to 560 req/sec and then down again</strong>&#8230; The application now <strong>fails at 3000-4000 users</strong>. We have just pushed our memory limit further, but as soon as the heap space is filled up, the whole application starts to fail again.</p>
<p>This is already a big improvement, but it looks like we still have a memory problem. Let’s fire YourKit again:</p>
<p><a href="http://blog.ippon.fr/wp-content/uploads/2013/03/screenshot_2.png"><img class="aligncenter size-full wp-image-7503" alt="Spring-petclinic screenshot_2" src="http://blog.ippon.fr/wp-content/uploads/2013/03/screenshot_2.png" width="1421" height="465" /></a></p>
<p>The heap memory is mostly used by “<em>org.apache.catalina.session.StandardManager</em>”, which is Tomcat’s class that manages HTTP sessions. This means the HTTP sessions are using all the free heap space, until the JVM cannot handle connections anymore.</p>
<h2>Going stateless</h2>
<p>We have fallen into a classical pitfall in Web application design: using stateful data prevents the application from scaling up.</p>
<p>On our application, it is rather easy to become stateless:</p>
<p><a href="https://github.com/jdubois/spring-petclinic/commit/32b14575c085c85ab4f2d0c3922a82cfd186bb52" target="_blank">[Source code]</a></p>
<p>For this project, going stateless is mostly a matter of reloading data from the database instead of using the HTTP session as a kind of cache. Of course things are not always that easy, for instance when you manage “conversations” in a business application. Our goal is to lower the amount of data stored in the user’s HTTP session, as it is one of main scalability issues we encounter: we are here rather lucky, as we can remove all of this data.</p>
<p>Once those modifications have been done, let’s launch our stress test again: YourKit confirms that we do not use the HTTP Session anymore, and we can now handle the load without any problem. The biggest object in memory is now “<em>org.sonatype.aether.util.DefaultRepositoryCache</em>”, which comes from Maven (remember that we launch the application with “<em>mvn clean tomcat7:run</em>”).</p>
<p>The application can now handle our 500 threads doing 10 loops for the first time. However, our results are not perfect: we can serve <strong>532 req/sec, but we still have 0.70% HTTP errors</strong>.</p>
<p>This result is a little bit slower than what we got during the previous step (we reached 560 req/sec before failing), as we now read more data from the database, instead of using the HTTP Session as a cache.</p>
<h2>Tuning Tomcat</h2>
<p>We have HTTP errors, which are distributed on all pages: this is a classical problem with Tomcat, which is using blocking IO by default. Let’s use the new Tomcat NIO connector:</p>
<p><a href="https://github.com/jdubois/spring-petclinic/commit/3388f317f46bfc2a0c9e6c42a7d84a4aa90a197f" target="_blank">[Source code]</a></p>
<p>(Many thanks to <a href="https://twitter.com/olamy/status/306140401901899778" target="_blank">Olivier Lamy</a> for this configuration, which was not explained in the official documentation!).</p>
<p>Now, <strong>we have no HTTP error at all, and we are able to handle 867 req/sec</strong>.</p>
<h2>Conclusion of part 2</h2>
<p>Now the application is starting to work! We can handle our 5000 users without any error at all, and the performance is rather good, at 867 req/sec.</p>
<p>On part 3, we will see that we can do even better.</p>
<p>[edit]</p>
<p>You can find the other episodes of this series here : <a href="http://blog.ippon.fr/?p=7496" target="_blank">part 1</a>, <a href="http://blog.ippon.fr/?p=7512" target="_blank">part 3</a>, <a href="http://blog.ippon.fr/?p=7520" target="_blank">part 4</a> and <a href="http://blog.ippon.fr/?p=7527" target="_blank">part 5</a>.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/fhRZt_YsunQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/12/improving-the-performance-of-the-spring-petclinic-sample-application-part-2-of-5/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/12/improving-the-performance-of-the-spring-petclinic-sample-application-part-2-of-5/</feedburner:origLink></item>
		<item>
		<title>Résultat du concours Devoxx organisé par Ippon Technologies</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/3EWK0O8yCtw/</link>
		<comments>http://blog.ippon.fr/2013/03/12/resultat-du-concours-devoxx-organise-par-ippon-technologies/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 08:47:16 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Devoxx]]></category>
		<category><![CDATA[jeu]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7533</guid>
		<description><![CDATA[<p>Vous avez été nombreux à participer au concours, organisé par Ippon Technologies, pour gagner une place pour Devoxx.</p> <p>David Gageot a été le plus rapide à trouver le mot mystère : &#8220;Tatami&#8221; en seulement 3 minutes &#8230; Un grand bravo à lui. David ayant déjà sa place pour Devoxx il a souhaité en faire profiter <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/12/resultat-du-concours-devoxx-organise-par-ippon-technologies/">Résultat du concours Devoxx organisé par Ippon Technologies</a></span>]]></description>
				<content:encoded><![CDATA[<p>Vous avez été nombreux à participer au concours, organisé par Ippon Technologies, pour gagner une place pour Devoxx.</p>
<p>David Gageot a été le plus rapide à trouver le mot mystère : &#8220;Tatami&#8221; en seulement 3 minutes &#8230; Un grand bravo à lui.<br />
David ayant déjà sa place pour Devoxx il a souhaité en faire profiter une personne de son entourage.</p>
<p><strong>Un petit mot sur la grille : </strong>Le mot mystère était donc &#8220;Tatami&#8221;.<br />
Comme vous avez dû le deviner, le principe était de remplir la grille à l&#8217;aide de lettres devant satisfaire, pour chaque ligne, les expressions régulières affichées.</p>
<p>Voici la solution complète :</p>
<p><a href="http://blog.ippon.fr/2013/03/12/resultat-du-concours-devoxx-organise-par-ippon-technologies/grilleconcours2013solution/" rel="attachment wp-att-7534"><img class="aligncenter size-medium wp-image-7534" alt="grilleConcours2013Solution" src="http://blog.ippon.fr/wp-content/uploads/2013/03/grilleConcours2013Solution-300x280.png" width="300" height="280" /></a></p>
<p>Pour ce qui est de l&#8217;origine de la grille : si cette grille est inédite, nous avons réutilisé le principe d&#8217;une des énigmes d&#8217;un concours récent du MIT.</p>
<p>La grille originale ( créée par Dan Gulotta sur la base d&#8217;une idée de Palmer Mebane) est bien plus complexe : <a href="http://www.coinheist.com/rubik/a_regular_crossword/grid.pdf" target="_blank">http://www.coinheist.com/<wbr></wbr>rubik/a_regular_crossword/<wbr></wbr>grid.pdf</a><br />
Vous trouverez la solution ici : <a href="http://web.mit.edu/puzzle/www/2013/coinheist.com/rubik/a_regular_crossword/answer/index.html" target="_blank">http://web.mit.edu/puzzle/www/<wbr></wbr>2013/coinheist.com/rubik/a_<wbr></wbr>regular_crossword/answer/<wbr></wbr>index.html</a><br />
Pour les plus motivés d&#8217;entre vous, vous pouvez étudier le solver automatique de ce puzzle qui a été posté ici : <a href="https://gist.github.com/LeventErkok/4942496" target="_blank">https://gist.github.com/<wbr></wbr>LeventErkok/4942496</a></p>
<p>Merci à Guillaume Laforge qui a retweeté le tweet qui nous a fait découvrir cette grille :<br />
<a href="https://twitter.com/janl/status/299827579429478401" target="_blank">https://twitter.com/janl/<wbr></wbr>status/299827579429478401</a></p>
<p>Nous vous donnons rendez-vous les 27, 28 et 29 Mars sur le stand <a title="Atomes au Devoxx Fr 2013" href="https://www.atomes.com/accueil" target="_blank">Ippon-Atomes </a>du Devoxx.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/3EWK0O8yCtw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/12/resultat-du-concours-devoxx-organise-par-ippon-technologies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/12/resultat-du-concours-devoxx-organise-par-ippon-technologies/</feedburner:origLink></item>
		<item>
		<title>Improving the performance of the Spring-Petclinic sample application (part 1 of 5)</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/P54aJpC2OYA/</link>
		<comments>http://blog.ippon.fr/2013/03/11/improving-the-performance-of-the-spring-petclinic-sample-application-part-1-of-5/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 10:00:54 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring-Petclinic]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7496</guid>
		<description><![CDATA[<p>This post is a performance audit of the &#8220;spring-petclinic&#8221; sample application provided by VMWare/SpringSource as a demonstration of the latest Spring features and configurations.</p> <p>We are going to do a step-by-step audit of the application, and show:</p> Tools &#38; techniques we usually work with when doing a performance audit Common pitfalls and how to avoid <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/11/improving-the-performance-of-the-spring-petclinic-sample-application-part-1-of-5/">Improving the performance of the Spring-Petclinic sample application (part 1 of 5)</a></span>]]></description>
				<content:encoded><![CDATA[<p>This post is a performance audit of the <a href="https://github.com/SpringSource/spring-petclinic" target="_blank">&#8220;spring-petclinic&#8221; sample application</a> provided by VMWare/SpringSource as a demonstration of the latest Spring features and configurations.</p>
<p>We are going to do a step-by-step audit of the application, and show:</p>
<ul>
<li>Tools &amp; techniques we usually work with when doing a performance audit</li>
<li>Common pitfalls and how to avoid them</li>
</ul>
<p>For doing this audit, we will use our own fork of the project, which is located at: <a href="https://github.com/jdubois/spring-petclinic" target="_blank">https://github.com/jdubois/spring-petclinic</a></p>
<p>As this tuning is a bit long, we have split it into 5 parts, which we will post every day this week:</p>
<ul>
<li>Monday: setting up the tests</li>
<li>Tuesday: going stateless and Tomcat tuning</li>
<li>Wednesday: removing the JVM locks</li>
<li>Thursday: should we stay on JDBC, or is JPA better?</li>
<li>Friday: adding a cache, and final words</li>
</ul>
<p>Many thanks to:</p>
<ul>
<li><a href="https://twitter.com/ptemplier" target="_blank">Pierre Templier</a> and <a href="http://blog.ippon.fr/author/Christophe_PARAGEAUD/" target="_blank">Christophe Parageaud</a>, from Ippon Technologies, for proof-reading this analysis.</li>
<li><a href="https://twitter.com/michaelisvy" target="_blank">Michaël Isvy</a> from SpringSource/VMWare, who is the main developer of the Spring-petclinic application, for helping me and allowing me to torture his application.</li>
<li><a href="https://twitter.com/tduchateau" target="_blank">Thibault Duchateau</a> and <a href="https://twitter.com/rlespinasse" target="_blank">Romain Lespinasse</a> from the Dandelion Project, for correcting their library at an unbelievable speed.</li>
<li><a href="https://twitter.com/_JamesWard" target="_blank">James Ward</a>, the author of WebJars, for best practices in using his library.</li>
</ul>
<h2>Creating a JMeter test</h2>
<p>First of all, we have configured the application to be in &#8220;production&#8221; mode:</p>
<ul>
<li>We defined the logging level to error <a href="https://github.com/jdubois/spring-petclinic/commit/2c9a37179d7abe3aa057fee200966a2412e4c2e8" target="_blank">[Source code]</a></li>
<li>We have configured the application to use MySQL (as in this project HSQLDB runs in the same JVM as the application, and thus will distort profiling) <a href="https://github.com/jdubois/spring-petclinic/commit/58ce7d6d794c69696d23d62616221a4708d13455" target="_blank">[Source code]</a></li>
</ul>
<p>We&#8217;ve created a JMeter test, which is available <a href="https://github.com/jdubois/spring-petclinic/commit/69e55e406db37a386ff8348a5a84343801169f85" target="_blank">here</a>.</p>
<p>We have run this test a first time, with the “POST new visit” step activated, in order to create 10 visits per pet. This means running this test with 10 threads, doing 13 loops each (as there are 13 pets). The “POST new visit” step was then disabled: the application does not paginate visits, so doing inserts will just break it down really quickly.</p>
<p>As visits are the main objects that are being created in the application, they should have been paginated, or there should be at least a limit on the dataset that is returned. On the other hand, it would be really strange that a user has a pet that goes 1000 times to the vet, so this would not be a realistic test case.</p>
<p>That’s why we have decided to limit this test to 10 visits per pet: this is important, as this will have an impact in the future tests.</p>
<p>We have have then run the test normally (using &#8220;<em>mvn clean tomcat7:run</em>&#8220;), with a 2011 Macbook Pro, with 500 concurrent users each doing the test 10 times.</p>
<p>It is also important to mention that:</p>
<ul>
<li>Everything is on the same computer: Tomcat, MySQL, JMeter&#8230; This is not a “production” architecture but it’s easier to diagnose/debug it that way</li>
<li>We use Tomcat 7, with Java 1.6 and 128M of RAM</li>
<li>We have been careful in doing a “<em>mvn clean</em>” in the process, in order to remove older HTTP session states</li>
<li>We do a “warm up” of the application before launching the tests, so the JIT compiler has the time to optimize the application</li>
</ul>
<p>We have also run those tests on several other computers, with the same results (proportionally, some having more CPU power than the others).</p>
<p>The first results are as follow: the application quickly goes up to <strong>285 requests per second (req/sec)</strong>, then slows down and throws “<strong>java.lang.OutOfMemoryError: Java heap space</strong>” errors after nearly 700 users. We then have lots of HTTP errors, and the application gets so slow it is not usable anymore.</p>
<p>Of course, we can give more memory to the application, so that it can handle our 5000 users. With 1 Gigabytes of heap, the application can handle the load, with a result of <strong>548 req/sec and 0,2% of HTTP errors</strong>.</p>
<h2>Conclusion of part 1</h2>
<p>The application cannot handle a lot of load: with 128 MB of RAM, the application starts to <strong>fail after 600 simultaneous users</strong>, which is a rather small number. Of course, we can give it more RAM to push that limit: we will be able to have more users, but as the GC will have more work, it is likely that the application does not perform very well.</p>
<p>We will see tomorrow, in the next episode of this series, how we started to solve that problem.</p>
<p>[edit]</p>
<p>You can find the other episodes of this series here : <a href="http://blog.ippon.fr/?p=7500" target="_blank">part 2</a>, <a href="http://blog.ippon.fr/?p=7512" target="_blank">part 3</a>, <a href="http://blog.ippon.fr/?p=7520" target="_blank">part 4</a> and <a href="http://blog.ippon.fr/?p=7527" target="_blank">part 5</a>.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/P54aJpC2OYA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/11/improving-the-performance-of-the-spring-petclinic-sample-application-part-1-of-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/11/improving-the-performance-of-the-spring-petclinic-sample-application-part-1-of-5/</feedburner:origLink></item>
		<item>
		<title>Gagnez votre place au Devoxx Paris  2013 avec Ippon Technologies</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/yNwXFomLnn0/</link>
		<comments>http://blog.ippon.fr/2013/03/08/jeu-invitation-devoxx-paris/#comments</comments>
		<pubDate>Fri, 08 Mar 2013 11:00:01 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Evénements]]></category>
		<category><![CDATA[Expertise Java]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7479</guid>
		<description><![CDATA[<p class="size-medium wp-image-7480 ">Vous avez envie de participer au Devoxx 2013 mais vous n&#8217;avez pas pu obtenir de places. Ça tombe bien, il reste une place à Ippon Technologies qui ne savait pas à qui l&#8217;offrir.</p> <p>Détails du Challenge :</p> <p>Étape 1 &#8211; Remplir correctement la grille ci-dessous. A vous de trouver comment découvrir le <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/08/jeu-invitation-devoxx-paris/">Gagnez votre place au Devoxx Paris  2013 avec Ippon Technologies</a></span>]]></description>
				<content:encoded><![CDATA[<p class="size-medium wp-image-7480 ">Vous avez envie de participer au Devoxx 2013 mais vous n&#8217;avez pas pu obtenir de places. Ça tombe bien, il reste une place à Ippon Technologies qui ne savait pas à qui l&#8217;offrir.</p>
<p><strong>Détails du Challenge :</strong></p>
<p><strong>Étape 1</strong> &#8211; Remplir correctement la grille ci-dessous. A vous de trouver comment découvrir le mot mystère.</p>
<div>
<dl id="attachment_7480">
<dt><a href="http://blog.ippon.fr/?attachment_id=7480" rel="attachment wp-att-7480"><img alt="A vous de trouver comment et de découvrir le mot mystère." src="http://blog.ippon.fr/wp-content/uploads/2013/03/grilleConcours2013-300x235.jpg" width="300" height="235" /></a></dt>
<dt><a href="http://blog.ippon.fr/2013/03/08/jeu-invitation-devoxx-paris/grilleconcours2013-2/" rel="attachment wp-att-7484">Télécharger la grille Ippon Technologies</a></dt>
<dt></dt>
</dl>
</div>
<p><strong>Étape 2 &#8211; </strong>Vous pensez avoir trouvé le mot mystère et vous voulez valider votre participation. Il vous suffit d&#8217;envoyer le MOT par un tweet de cette façon : “Jeu <a title="twitter ippon technologies" href="https://twitter.com/ippontech" target="_blank">@ippontech</a> : le mot mystère est xxxxx”<br />
Le premier d&#8217;entre vous qui enverra ce tweet, gagnera la place pour Devoxx 2013<b id="internal-source-marker_0.1848713937215507">.</b></p>
<p>Bonne chance à tous</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/yNwXFomLnn0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/08/jeu-invitation-devoxx-paris/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/08/jeu-invitation-devoxx-paris/</feedburner:origLink></item>
		<item>
		<title>Participez au prochain Liferay Roadshow à Paris</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/30c3nMW0vMA/</link>
		<comments>http://blog.ippon.fr/2013/03/07/participez-au-prochain-liferay-roadshow-a-paris/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 07:30:58 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Liferay]]></category>
		<category><![CDATA[Portail]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7428</guid>
		<description><![CDATA[<p>Liferay, portail open source de référence et Ippon Technologies Experts Java, partenaire Liferay depuis 2006,  ont le plaisir de vous inviter au Liferay Roadshow le jeudi 04 avril 2013 de 14h à 17h00.</p> </p> Vendez des billets à travers Eventbrite <p>Au programme :</p> 14h00 – 14h15 : Introduction par Bertrand Pinel, Directeur Technique d’Ippon Technologies <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/03/07/participez-au-prochain-liferay-roadshow-a-paris/">Participez au prochain Liferay Roadshow à Paris</a></span>]]></description>
				<content:encoded><![CDATA[<p>Liferay, portail open source de référence et Ippon Technologies Experts Java, partenaire Liferay depuis 2006,  ont le plaisir de vous inviter au Liferay Roadshow le jeudi 04 avril 2013 de 14h à 17h00.</p>
<div style="width: 100%; text-align: left;"><iframe frameborder="0" height="214" marginheight="5" marginwidth="5" scrolling="auto" src="http://www.eventbrite.fr/tickets-external?eid=5398121928&amp;ref=etckt&amp;v=2" width="100%"></iframe></p>
<div style="font-family: Helvetica, Arial; font-size: 10px; padding: 5px 0 5px; margin: 2px; width: 100%; text-align: left;"><a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr/r/etckt" target="_blank">Vendez des billets</a> <span style="color: #ddd;">à travers</span> <a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr?ref=etckt" target="_blank">Eventbrite</a></div>
</div>
<p>Au programme :</p>
<ul>
<li dir="ltr">14h00 – 14h15 : Introduction par Bertrand Pinel, Directeur Technique d’<a title="Ippon Technologies" href="http://www.ippon.fr/">Ippon Technologies</a></li>
<li dir="ltr">14h15 &#8211; 14h45 : Présentation de Liferay et des dernières innovations de la version 6.1. Marc Brassier mettra l&#8217;accent sur les avantages techniques et commerciaux du portail Liferay.</li>
</ul>
<ul>
<li dir="ltr">14h45 – 15h15 : Retour d&#8217;expérience d&#8217;Amaguiz &#8211; Amaline Assurances &#8211; Un site Internet avec Liferay</li>
</ul>
<ul>
<li dir="ltr">15h15 – 15h30 : Pause</li>
<li dir="ltr">15h30 &#8211; 16h00 : Présentation de l&#8217;offre Liferay Cloud par Yann Vigara, Responsable de l’<a title="Atomes hosting" href="http://www.atomes.com/">Offre hébergement/Cloud</a> d’Ippon Technologies.</li>
<li dir="ltr">16h00-16h30 : Echanges avec nos experts</li>
</ul>
<p>Les équipes d’Ippon Technologies et de Liferay animeront le séminaire et se tiendront à votre disposition pour répondre à vos questions.</p>
<p>Lors de cet évènement vous pourrez :</p>
<ul>
<li dir="ltr">Découvrir et apprécier les avantages de Liferay, le portail J2EE prêt à l’emploi</li>
</ul>
<ul>
<li dir="ltr">Profiter de l’expérience de clients qui utilisent déjà Liferay</li>
<li dir="ltr">Découvrir l&#8217;offre d&#8217;hébergement Liferay développé par Ippon Technologies</li>
<li dir="ltr">Echanger avec nos experts sur des problématiques que vous rencontrez et profiter de leurs retours d&#8217;expérience.</li>
</ul>
<p>Cet évènement s’adresse en particulier à des responsables informatiques et métiers impliqués dans des projets Portails, CMS, eCommerce, Collaboration et réseaux sociaux.</p>
<p>Cet évènement gratuit, aura lieu à Paris (lieu à venir) , le jeudi 4 avril, de 14h à 16h30 .</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/30c3nMW0vMA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/03/07/participez-au-prochain-liferay-roadshow-a-paris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/03/07/participez-au-prochain-liferay-roadshow-a-paris/</feedburner:origLink></item>
		<item>
		<title>Ippevent Agorava (le social framework) le 28/02</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/VLajwS7szjE/</link>
		<comments>http://blog.ippon.fr/2013/02/20/ippevent-agorava-le-social-framework-le-2802/#comments</comments>
		<pubDate>Wed, 20 Feb 2013 14:00:53 +0000</pubDate>
		<dc:creator>Antoine SABOT-DURAND</dc:creator>
				<category><![CDATA[Evénements]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Ippevents]]></category>
		<category><![CDATA[Agorava]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[Jax-RS]]></category>
		<category><![CDATA[Social]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7471</guid>
		<description><![CDATA[<p>Au printemps 2012, la JSR 357 (Java Social) était rejetée par 8 voix contre 5 par le JCP. Toutefois l&#8217;aventure avait permis de créer un groupe de personnes motivées pour créer un framework Java autour des réseaux sociaux : Agorava (précédement Seam Social</p> <p>Dans cet Ippevent présenté par antoine Sabot-Durand nous présenterons le framework Agorava <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/02/20/ippevent-agorava-le-social-framework-le-2802/">Ippevent Agorava (le social framework) le 28/02</a></span>]]></description>
				<content:encoded><![CDATA[<p><img class="alignleft" title="Logo Agorava" alt="" src="http://agorava.org/images/logo.png" width="101" height="89" />Au printemps 2012, la JSR 357 (Java Social) était rejetée par 8 voix contre 5 par le JCP. Toutefois l&#8217;aventure avait permis de créer un groupe de personnes motivées pour créer un framework Java autour des réseaux sociaux : Agorava (précédement Seam Social</p>
<p>Dans cet Ippevent présenté par antoine Sabot-Durand nous présenterons le framework Agorava et son futur, nous évoquerons également la partie standardisable d&#8217;un tel framework. Efin nous détaillerons les technologies mises en oeuvre dans le framework comme :</p>
<ul>
<li>OAuth (1 et 2)</li>
<li>JAX-RS 2.0</li>
<li>CDI</li>
<li>Jackson (JSON Mapping)</li>
</ul>
<p>Cet Ippevent aura lieu<strong> le 28/02 à 19h dans locaux de Levallois</strong>.</p>
<p>Pour vous inscrire il vous suffit de cliquer sur le bandeau ci-dessous</p>
<div style="width: 100%; text-align: left;"><iframe frameborder="0" height="214" marginheight="5" marginwidth="5" scrolling="auto" src="http://www.eventbrite.fr/tickets-external?eid=5585418136&amp;ref=etckt&amp;v=2" width="100%"></iframe></p>
<div style="font-family: Helvetica, Arial; font-size: 10px; padding: 5px 0 5px; margin: 2px; width: 100%; text-align: left;"><a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr/r/etckt" target="_blank">Inscription en ligne pour un événement</a><span style="color: #ddd;"> pour </span><a style="color: #ddd; text-decoration: none;" href="http://ippevent-agorava.eventbrite.fr?ref=etckt" target="_blank">Ippevent &#8211; Agorava et Java Social</a> <span style="color: #ddd;">réalisé par</span> <a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr?ref=etckt" target="_blank">Eventbrite</a></div>
</div>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/VLajwS7szjE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/02/20/ippevent-agorava-le-social-framework-le-2802/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/02/20/ippevent-agorava-le-social-framework-le-2802/</feedburner:origLink></item>
		<item>
		<title>Architecture Mobile, le nouveau livre blanc des Experts Mobiles Ippon</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/cvwQqVqfGko/</link>
		<comments>http://blog.ippon.fr/2013/02/19/architecture-mobile-le-nouveau-livre-blanc-des-experts-mobiles-ippon/#comments</comments>
		<pubDate>Tue, 19 Feb 2013 20:00:06 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[livre blanc]]></category>
		<category><![CDATA[mobilité]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7467</guid>
		<description><![CDATA[<p>Téléchargez le dernier livre blanc d&#8217;Ippon Technologies écrit par Lorys Pognon, Responsable de l&#8217;Offre Mobile </p> <p>Ce que vous allez apprendre :</p> <p>// FORCES ET FAIBLESSES DES DIFFÉRENTS ENVIRONNEMENTS TECHNIQUES 1/ Les applications natives 2/ Les applications web mobiles 3/ Les applications hybrides 4/ L’environnement technique d’une application native 5/ L’environnement technique d’une application web <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/02/19/architecture-mobile-le-nouveau-livre-blanc-des-experts-mobiles-ippon/">Architecture Mobile, le nouveau livre blanc des Experts Mobiles Ippon</a></span>]]></description>
				<content:encoded><![CDATA[<p><a title="téléchargement livre blanc architecture mobile" href="http://www.ippon-mobile.fr/livres-blancs-developpement-mobile/" target="_blank">Téléchargez le dernier livre blanc d&#8217;Ippon Technologies écrit par Lorys Pognon, Responsable de l&#8217;Offre Mobile </a></p>
<p>Ce que vous allez apprendre :</p>
<p>// FORCES ET FAIBLESSES DES DIFFÉRENTS ENVIRONNEMENTS TECHNIQUES<br />
1/ Les applications natives<br />
2/ Les applications web mobiles<br />
3/ Les applications hybrides<br />
4/ L’environnement technique d’une application native<br />
5/ L’environnement technique d’une application web mobile<br />
6/ L’environnement technique d’une application hybride</p>
<p>// LA DISTRIBUTION DES APPLICATIONS<br />
1/ Dans le cas d’applications natives ou hybrides<br />
2/ LE CAS DES SITES MOBILES</p>
<p>// INTÉGRATION DES APPLICATIONS AVEC LE SYSTÈME D’INFORMATION<br />
1/ Les Contraintes de sécurité<br />
2/ Les services web</p>
<p>// L’INDUSTRIALISATION DES APPLICATIONS MOBILES &#8211;</p>
<p>// ÉQUIPE ET ORGANISATION</p>
<p><a title="téléchargement livre blanc architecture mobile" href="http://www.ippon-mobile.fr/livres-blancs-developpement-mobile/" target="_blank">Téléchargez le dernier livre blanc d&#8217;Ippon Technologies écrit par Lorys Pognon, Responsable de l&#8217;Offre Mobile </a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/cvwQqVqfGko" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/02/19/architecture-mobile-le-nouveau-livre-blanc-des-experts-mobiles-ippon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/02/19/architecture-mobile-le-nouveau-livre-blanc-des-experts-mobiles-ippon/</feedburner:origLink></item>
		<item>
		<title>Tatami v2, nouvelle version du réseau social d’entreprise Open Source</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/8sJc2FKpg7U/</link>
		<comments>http://blog.ippon.fr/2013/02/18/tatami-v2-nouvelle-version-du-reseau-social-dentreprise-open-source/#comments</comments>
		<pubDate>Mon, 18 Feb 2013 15:49:36 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[réseau social]]></category>
		<category><![CDATA[Tatami]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7449</guid>
		<description><![CDATA[<p>Le projet Tatami a été initié par Ippon Technologies il y a environ un an. Pour rappel, il s’agit d’un réseau social d’entreprise (appelé couramment “RSE”), ayant plusieurs caractéristiques très particulières par rapport à ses concurrents :</p> Tatami est l’un des très rares RSE Open Source, et le seul à notre connaissance sous license Apache <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/02/18/tatami-v2-nouvelle-version-du-reseau-social-dentreprise-open-source/">Tatami v2, nouvelle version du réseau social d’entreprise Open Source</a></span>]]></description>
				<content:encoded><![CDATA[<p>Le <a href="https://github.com/ippontech/tatami" target="_blank">projet Tatami</a> a été initié par Ippon Technologies il y a environ un an. Pour rappel, il s’agit d’un réseau social d’entreprise (appelé couramment “RSE”), ayant plusieurs caractéristiques très particulières par rapport à ses concurrents :</p>
<ul>
<li>Tatami est l’un des très rares RSE Open Source, et le seul à notre connaissance sous license Apache 2.0 (et donc “business friendly”)</li>
<li>Tatami utilise exclusivement Apache Cassandra pour stocker ses données, ce qui lui donne une performance et une montée en charge nettement supérieures</li>
<li>Tatami possède une interface entièrement HTML5, en responsive design, ce qui lui permet de fonctionner de manière fluide et intuitive sur tout type de support</li>
</ul>
<p>Nous sommes donc heureux de pouvoir annoncer la disponibilité de Tatami 2.0, après plusieurs mois de travail, sur le compte Github du projet: <a href="https://github.com/ippontech/tatami/tree/2.0.0" target="_blank">https://github.com/ippontech/tatami/tree/2.0.0</a></p>
<h2>Un grand merci à Orange Labs</h2>
<p>Tout d’abord, nous voulons dire un grand merci à Orange Labs, qui utilise Tatami en interne, et qui a très largement contribué aux nouvelles fonctionnalités de Tatami v2, en particulier :</p>
<ul>
<li>La gestion des flux RSS</li>
<li>La personnalisation de l’interface graphique</li>
<li>La gestion des emails donnant un résumé de l’activité hebdomadaire ou journalière</li>
</ul>
<p>Le HTML5 et le NoSQL vous intéressent? Vous souhaitez de nouvelles fonctionnalités sur Tatami? Faites comme Orange Labs, et venez participer au développement de l’application sur <a href="https://github.com/ippontech/tatami" target="_blank">https://github.com/ippontech/tatami</a></p>
<h2>Un très grand nombre de nouvelles fonctionnalités</h2>
<p>Cette version a été largement inspirée et voulue par nos utilisateurs, elle propose donc de très nombreuses nouvelles fonctionnalités :</p>
<ul>
<li>La gestion des fichiers attachés (avec gestion d’un quota)</li>
<li>Un nouveau moteur de recherche, plus simple à utiliser (à la Google)</li>
<li>Une toute nouvelle interface graphique pour les pages d’administration, utilisant Backbone.js</li>
<li>De nouveaux algorithmes proposant des personnes, des groupes ou des tags à suivre</li>
<li>Un nouvel écran facilitant la mise en place de son compte Tatami</li>
</ul>
<h2>Utilisez Tatami grâce à Ippon Technologies</h2>
<p>Comme toujours depuis un an, vous pouvez utiliser Tatami gratuitement sur l’instance fournie par Ippon Technologies : <a href="https://tatami.ippon.fr" target="_blank">https://tatami.ippon.fr</a></p>
<p>Cette instance a quelques limitations, en particulier sur la taille des fichiers attachés (pour des raisons évidentes&#8230;), mais vous pouvez nous contacter pour avoir une version “privée” que nous vous hébergerons chez <a href="http://www.atomes.com/" target="_blank">Atomes</a>, notre filiale spécialisée dans l’hébergement d’applications Java.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/8sJc2FKpg7U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/02/18/tatami-v2-nouvelle-version-du-reseau-social-dentreprise-open-source/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/02/18/tatami-v2-nouvelle-version-du-reseau-social-dentreprise-open-source/</feedburner:origLink></item>
		<item>
		<title>Mobilité sans contact –  NFC, RFID Enquête de satisfaction… les vidéos</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/vT491HwzuGM/</link>
		<comments>http://blog.ippon.fr/2013/02/16/mobilite-sans-contact-nfc-rfid-enquete-de-satisfaction-les-videos/#comments</comments>
		<pubDate>Sat, 16 Feb 2013 09:30:31 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7443</guid>
		<description><![CDATA[<p>Bruno Colin, TNS Sofres &#8211; retour d&#8217;expérience suite au lancement d&#8217;une nouvelle offre mobile pour des enquêtes de satisfaction clients </p> <p>Lorys Pognon, Responsable du Pôle Mobile &#8211; Ippon Technologies -  Le parcours d&#8217;achat client en point de vente (la découverte, le scan, la fidélité et le paiement) à partir des opportunités offertes par la <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/02/16/mobilite-sans-contact-nfc-rfid-enquete-de-satisfaction-les-videos/">Mobilité sans contact &#8211;  NFC, RFID Enquête de satisfaction&#8230; les vidéos</a></span>]]></description>
				<content:encoded><![CDATA[<p>Bruno Colin, TNS Sofres &#8211; retour d&#8217;expérience suite au lancement d&#8217;une nouvelle offre mobile pour des enquêtes de satisfaction clients<br />
<iframe frameborder="0" height="281" src="http://player.vimeo.com/video/59049336" width="500"></iframe></p>
<p>Lorys Pognon, Responsable du Pôle Mobile &#8211; Ippon Technologies -  Le parcours d&#8217;achat client en point de vente (la découverte, le scan, la fidélité et le paiement) à partir des opportunités offertes par la mobilité sans contact</p>
<p><iframe frameborder="0" height="281" src="http://player.vimeo.com/video/58979137" width="500"></iframe></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/vT491HwzuGM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/02/16/mobilite-sans-contact-nfc-rfid-enquete-de-satisfaction-les-videos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/02/16/mobilite-sans-contact-nfc-rfid-enquete-de-satisfaction-les-videos/</feedburner:origLink></item>
		<item>
		<title>Utiliser des types personnalisés dans ses routes Play! Framework 2</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/wolMAcQel3A/</link>
		<comments>http://blog.ippon.fr/2013/02/03/utiliser-des-types-personnalises-dans-ses-routes-play-framework-2/#comments</comments>
		<pubDate>Sun, 03 Feb 2013 20:00:52 +0000</pubDate>
		<dc:creator>Alban DERICBOURG</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Play! Framework]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7410</guid>
		<description><![CDATA[<p>L’utilisation des routes de Play! Framework est d’une extrême simplicité lorsque l’on utilise des types « standards ». Lorsqu’il s’agit d’utiliser un type plus exotique (au hasard, quelque chose que l’on n’utilise jamais&#8230; un UUID par exemple), la chose n’est pas aussi évidente.</p> <p>Pour ce faire, il est nécessaire de définir un binder en implémentant <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/02/03/utiliser-des-types-personnalises-dans-ses-routes-play-framework-2/">Utiliser des types personnalisés dans ses routes Play! Framework 2</a></span>]]></description>
				<content:encoded><![CDATA[<p>L’utilisation des routes de Play! Framework est d’une extrême simplicité lorsque l’on utilise des types « standards ». Lorsqu’il s’agit d’utiliser un type plus exotique (au hasard, quelque chose que l’on n’utilise jamais&#8230; un UUID par exemple), la chose n’est pas aussi évidente.</p>
<p>Pour ce faire, il est nécessaire de définir un binder en implémentant l’interface <em>PathBindable</em>. Ce <em>binder</em>, pour l’API Java, doit être auto-récursif.</p>
<pre class="brush: java; title: ; notranslate">class FooBinder extends PathBindable&lt;FooBinder&gt; {
  // Du contenu.
}</pre>
<p><span id="more-7410"></span></p>
<h2>Implémentation</h2>
<p>L’observation de cette interface lève une interrogation sur la méthode <em>unbind</em> : comment « unbinder » la valeur si celle-ci n’est pas passée en paramètre ? Piège.</p>
<pre class="brush: java; title: ; notranslate">/**
* Unbind a URL path parameter.
*
* @param key Parameter key
* @param value Parameter value.
*/
public String unbind(String key);</pre>
<p>L’astuce (grand mot s’il en est) consiste à stocker la valeur au moment de la construction de l’ojet. Prenons comme exemple l’UUID :</p>
<pre class="brush: java; title: ; notranslate">public class UuidBinder implements PathBindable&lt;UuidBinder&gt; {

  private UUID uuid;

  /** {@inheritDoc} */
  @Override
  public UuidBinder bind(String key, String txt) {
    uuid = UUID.fromString(txt);
    return this;
  }

  /** {@inheritDoc} */
  @Override
  public String unbind(String key) {
    return uuid.toString();
  }

  /** {@inheritDoc} */
  @Override
  public String javascriptUnbind() {
    return null;
  }
}
</pre>
<p>Celui-ci sera utilisable dès lors qu’il aura été déclaré dans le fichier <em>Build.scala</em> :</p>
<pre class="brush: scala; title: ; notranslate">val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
  routesImport += &quot;util.binders.UuidBinder.&quot;;
)</pre>
<h2>Utilisation</h2>
<p>L’utilisation depuis les routes est immédiat :<br />
<code>GET /foo/:uuid controllers.MyFooController.viewBar(uuid: util.binders.UuidBinder)</code></p>
<p>L’utilisation depuis les templates l’est un peu moins. Une solution simple consiste à enrichir le modèle :</p>
<pre class="brush: java; title: ; notranslate">class Bar extends Model {
  @Id
  public UUID uuid;

  @Transient
  public UuidBinder bindUuid() {
    return UuidBinder.create(uuid);
  }
}</pre>
<p>La méthode <em>create</em> de <em>UuidBinder</em> se contente d’instancier un nouvel objet et de l’alimenter :</p>
<pre class="brush: java; title: ; notranslate">public static UuidBinder create(final UUID uuid) {
  UuidBinder u = new UuidBinder();
  u.uuid = uuid;
  return u;
}</pre>
<pre class="brush: xml; title: ; notranslate">&lt;a href=&quot;@routes.MyFooController.viewBar(bar.bindUuid)&quot;&gt;View my bar!&lt;/a&gt;</pre>
<p>Il peut être utile également de pouvoir récupérer la valeur de l&#8217;UUID. Ajoutons pour cela dans <em>UuidBinder</em> un simple <em>getter</em> :</p>
<pre class="brush: java; title: ; notranslate">public UUID uuid() {
  return uuid;
}</pre>
<p>Ainsi, on peut l&#8217;utiliser dans le contrôleur :</p>
<pre class="brush: java; title: ; notranslate">public static Result viewBar(UuidBinder id) {
  UUID uuid = id.uuid();
  Bar bar = BarService.getBar(uuid);
  return barDetail(bar);
}</pre>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/wolMAcQel3A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/02/03/utiliser-des-types-personnalises-dans-ses-routes-play-framework-2/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/02/03/utiliser-des-types-personnalises-dans-ses-routes-play-framework-2/</feedburner:origLink></item>
		<item>
		<title>Introduction à la programmation fonctionnelle</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/4E4qyO9UKYA/</link>
		<comments>http://blog.ippon.fr/2013/01/24/introduction-a-la-programmation-fonctionnelle/#comments</comments>
		<pubDate>Thu, 24 Jan 2013 09:00:24 +0000</pubDate>
		<dc:creator>Florence HERROU</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[programmation fonctionnelle]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7369</guid>
		<description><![CDATA[<p>On distingue deux grands paradigmes dans la programmation informatique :</p> L’impératif : basé sur une notion d’états modifiés par des instructions (le modèle de Turing), il s’agit de l’approche la plus répandue. Plus immédiate et intuitive, la plupart des langages informatiques utilisés (notamment les langages objet) sont basés sur ce paradigme. Le déclaratif : le <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/24/introduction-a-la-programmation-fonctionnelle/">Introduction à la programmation fonctionnelle</a></span>]]></description>
				<content:encoded><![CDATA[<p>On distingue deux grands paradigmes dans la programmation informatique :</p>
<ul>
<li>L’impératif : basé sur une notion d’états modifiés par des instructions (le modèle de Turing), il s’agit de l’approche la plus répandue. Plus immédiate et intuitive, la plupart des langages informatiques utilisés (notamment les langages objet) sont basés sur ce paradigme.</li>
<li>Le déclaratif : le programme est décrit sous forme d’une description de la solution par rapport à un état initial. La programmation fonctionnelle en fait partie.</li>
</ul>
<p>Facilement vue comme un joujou pour matheux aimant manier des concepts compliqués, la programmation fonctionnelle n’est pourtant pas incompatible avec les concepts de la programmation orienté objet. De plus, l’impératif n’a pas répondu à toutes les attentes : la concurrence, la parallélisation&#8230;<br />
Scala, Haskell, Erlang ou Groovy sont des langages fonctionnels que vous avez pu rencontrer, mais il est possible également de coder différemment en java en utilisant quelques principes (et librairies) fonctionnels. Java 8 et la JSR 355 introduiront les bases du fonctionnel dans Java.<br />
Voici les quatre concepts de la programmation fonctionnelle.</p>
<h2><strong>La pureté de la fonction</strong></h2>
<p>Une fonction pure, au sens mathématique, est une fonction qui ne change pas l’état du monde. Sa seule fonction est de prendre une ou des données en entrée et retourner un résultat en sortie. Quelle que soit le moment où la fonction est jouée, avec des données identiques en entrée, la sortie reste la même.<br />
Il existe plusieurs intérêts à utiliser au maximum des fonctions pures :</p>
<ul>
<li>Il n’y a aucun risque d’effet de bord à utiliser des fonctions, aucune variable cachée qui sera modifiée involontairement par cette fonction</li>
<li>Tester une fonction pure est très simple</li>
<li>La fonction peut être rejouée à l’infini : tant qu’elle recevra en paramètre la même donnée, elle retournera le même résultat, sans modifier quoi que ce soit</li>
<li>Il est également possible de ne pas jouer cette fonction, et gagner du temps si son résultat n&#8217;est pas utilisé</li>
</ul>
<p>Nous prendrons comme exemple, afin d&#8217;illustrer chacun de ces principes, un programme permettant de calculer les occurrences suivantes de suites. Examinons la fonction ci-dessous.</p>
<p><a href="http://blog.ippon.fr/?attachment_id=7371" rel="attachment wp-att-7371"><img class="alignnone size-medium wp-image-7371" alt="fonction" src="http://blog.ippon.fr/wp-content/uploads/2013/01/fonction-300x128.png" width="360" height="153" /></a></p>
<p>On constate que cette fonction n’est pas pure. Un indice très clair est le fait qu’elle retourne “void”. Si cette fonction ne modifiait pas l’état du monde, elle ne servirait à rien. La modification se situe au niveau de la ligne : majFichier(suites);<br />
Celle-ci met à jour les fichiers correspondant aux suites que l’on manipule. Nous voulons modifier ce fichier, il n’est donc pas question de rendre cette fonction pure. Cependant, pour tester bien plus facilement ce que nous faisons, il est possible d’extraire de cette fonction, un code qui peut être, lui intégré en fonction pure. C’est ce que nous faisons ci-dessous.</p>
<p><a href="http://blog.ippon.fr/?attachment_id=7376" rel="attachment wp-att-7376"><img alt="fonction-pure" src="http://blog.ippon.fr/wp-content/uploads/2013/01/fonction-pure-300x86.png" width="300" height="86" /></a></p>
<p>La fonction calculeProchaineLigne est pure : tant que nous entrons la même chaîne de chiffres en paramètres, le retour sera identique. Elle peut donc être jouée à l’infini et être testée sans modifier l’état du monde.</p>
<p><strong>L’immutabilité (ou immuabilité)</strong></p>
<p>Il s’agit d’un concept allant de pair avec la pureté. Nous ne voulons pas changer l’état du monde, et ainsi nous ne changerons pas non plus l’état des paramètres passés à une fonction.<br />
En java, nous utiliserons le mot-clef final.</p>
<p>Reprenons notre fonction précédente :</p>
<p><a href="http://blog.ippon.fr/?attachment_id=7376" rel="attachment wp-att-7376"><img alt="fonction-pure" src="http://blog.ippon.fr/wp-content/uploads/2013/01/fonction-pure-300x86.png" width="300" height="86" /></a></p>
<p>La ligne : <em>suite.setLigneCalculee(newLine); </em>viole le principe d’immuabilité. D’une manière générale, l’utilisation de getter dans les classes est incompatible avec le principe d’immuabilité. Nous pouvons avoir à la place, dans notre classe Suite :</p>
<p><a href="http://blog.ippon.fr/?attachment_id=7377" rel="attachment wp-att-7377"><img alt="suite" src="http://blog.ippon.fr/wp-content/uploads/2013/01/suite-300x39.png" width="300" height="39" /></a></p>
<p>De la même manière, notre liste passée en paramètre est actuellement modifiée en même temps qu&#8217;elle est parcourue. Nous allons donc créer une nouvelle liste dans laquelle nous insèrerons les nouvelles données, sans modifier la liste existante :</p>
<p><a href="http://blog.ippon.fr/?attachment_id=7375" rel="attachment wp-att-7375"><img alt="fonction-immutable" src="http://blog.ippon.fr/wp-content/uploads/2013/01/fonction-immutable-300x80.png" width="300" height="80" /></a></p>
<p>Ainsi, si la suite passée en paramètre est utilisée à un autre endroit du programme, aucun effet de bord n&#8217;est risqué. On gagne en simplicité de programmation.</p>
<p><strong>L&#8217;expressivité</strong></p>
<p>Cela correspond à l’utilisation de fonctions d’ordre supérieur, c’est-à-dire des fonctions qui prendront d’autres fonctions en paramètre.<br />
Pour illustrer l&#8217;expressivité, nous utiliserons la bibliothèque Google Guava. Nous utiliserons l&#8217;interface Function pour définir comment obtenir un objet de la classe Suite avec la nouvelle ligne calculée à partir d&#8217;un objet de la classe Suite.</p>
<p><a href="http://blog.ippon.fr/?attachment_id=7373" rel="attachment wp-att-7373"><img alt="fonction-expressive-1" src="http://blog.ippon.fr/wp-content/uploads/2013/01/fonction-expressive-1-300x57.png" width="323" height="60" /></a></p>
<p>Nous pouvons l&#8217;utiliser grâce à la fonction transform de Google Guava qui applique une Function sur chaque élément de la liste passée en paramètre et retourne une nouvelle liste. Notre boucle est donc résumée en une seule ligne :</p>
<table border="0">
<tbody>
<tr>
<td>final List&lt;Suite&gt; newListe = Lists.transform(suites, function);</td>
</tr>
</tbody>
</table>
<p><strong>Composabilité</strong></p>
<p>Il s&#8217;agit de la capacité de composer des fonctions ensemble pour obtenir une fonction.<br />
Ainsi, si on modifie la suite de telle manière que la ligne suivante corresponde au calcul de la prochaine ligne sur laquelle on réapplique le même calcul, on aura tout simplement dans notre fonction :</p>
<table border="0">
<tbody>
<tr>
<td>String newLine = calculeProchaineLigne(calculeProchaineLigne(suite.getLastLine()));</td>
</tr>
</tbody>
</table>
<p>La pureté et l&#8217;immutabilité nous permettent de faire cela sans prendre de risque.</p>
<p>Loin d&#8217;être un outil exotique, la programmation fonctionnelle peut nous permettre, en utilisant ses principes, de rendre nos codes plus lisibles et plus maintenables et ce, même dans des langages orientés objet.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/4E4qyO9UKYA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/24/introduction-a-la-programmation-fonctionnelle/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/24/introduction-a-la-programmation-fonctionnelle/</feedburner:origLink></item>
		<item>
		<title>Mobile – les derniers articles de nos experts Mobile</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/zFFbLH9D_Bc/</link>
		<comments>http://blog.ippon.fr/2013/01/24/mobile-les-derniers-articles-de-nos-experts-mobile/#comments</comments>
		<pubDate>Thu, 24 Jan 2013 09:00:12 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[blackberry]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7347</guid>
		<description><![CDATA[<p>Comment gérer l’apparence de vos applications iOS ? par Nicolas Guillot : Il y a différents moyens de personnaliser l’interface d’une application iOS. Le plus simple est de modifier les attributs des vues dans les fichiers xib ou storyboard (pour les non initiés il s’agit des fichiers représentant l’interface graphique construite via Xcode) mais bien <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/24/mobile-les-derniers-articles-de-nos-experts-mobile/">Mobile &#8211; les derniers articles de nos experts Mobile</a></span>]]></description>
				<content:encoded><![CDATA[<p><strong>Comment gérer l’apparence de vos applications iOS ?</strong> par Nicolas Guillot : Il y a différents moyens de personnaliser l’interface d’une application iOS. Le plus simple est de modifier les attributs des vues dans les fichiers xib ou storyboard (pour les non initiés il s’agit des fichiers représentant l’interface graphique construite via Xcode) mais bien souvent cela ne suffit pas et on est obligé d’ajouter quelques lignes de codes pour arriver à nos fins. On se retrouve alors face à différents problèmes</p>
<p><a title="Mobile - Apparence application iOS" href="http://www.ippon-mobile.fr/comment-gerer-lapparence-d-une-application-ios/" target="_blank">Lire la suite</p>
<p></a></p>
<p>&nbsp;</p>
<p><strong>Sécuriser la communication entre vos apps Android et vos serveurs</strong> par Nicolas Guillot : Google vient de publier un article très intéressant sur son blog développeur Android. Il détaille la possibilité d’authentifier la communication entre les apps Android et les services web via un token OAuth fourni par Google. En d’autres termes, l’application Android utilise les services de Google Play pour permettre aux serveurs fournissant les services web utilisés de vérifier la validité de l’appel (vient-il bien de l’application ou a-t-il été corrompu ?) et de reconnaître l’utilisateur de l’application. Les bénéfices sont multiples.</p>
<p><a title="Application android sécurité" href="http://www.ippon-mobile.fr/oauth-facile-pour-apps-android/" target="_blank">Lire la suite</p>
<p></a></p>
<p>&nbsp;</p>
<p><strong>Worklight Studio – La stratégie mobile d’IBM pour les entreprises</strong> par Lorys Pognon : Nous disposons de plusieurs outils pour faire du développement mobile. Worklight studio est l’un de ces outils. Développé par une société israélienne rachetée par IBM, il met à disposition des entreprises un environnement intégré de développement mobile multiplateforme couplé avec un MDM (Mobile Device Management) et d’un module IBM WebSphere Cast Iron qui permet aux entreprises de connecter rapidement leurs applications mobiles à d’autres applications de l’entreprise.</p>
<p><a title="Worklight Studio" href="http://www.ippon-mobile.fr/worklight-studio-la-strategie-mobile-dibm-pour-les-entreprises-2/" target="_blank">Lire la suite</p>
<p></a></p>
<p>&nbsp;</p>
<p><strong>BlackBerry 10… est-ce la dernière chance ?</strong> par Lorys Pognon : BlackBerry a été l’un des acteurs incontournables de la téléphonie. Je dirai que c’est le premier téléphone portable à avoir été adopté en entreprise pour tout ce qui est du push mail et de la messagerie instantanée. Il demeure pour certains, l’un des téléphones les plus sécurisés. En plus de la cible professionnelle, les différents modèles de BlackBerry ont toujours été appréciés par les jeunes. Mais voilà, avec les smartphones Android, iOS, RIM a quelques difficultés à séduire.</p>
<p><a href="http://www.ippon-mobile.fr/blackberry-10-est-ce-la-derniere-chance/" target="_blank">Lire la suite</p>
<p></a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/zFFbLH9D_Bc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/24/mobile-les-derniers-articles-de-nos-experts-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/24/mobile-les-derniers-articles-de-nos-experts-mobile/</feedburner:origLink></item>
		<item>
		<title>Des développeurs et des commerçants (2/2)</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/AMHb3yM4jbM/</link>
		<comments>http://blog.ippon.fr/2013/01/23/des-developpeurs-et-des-commercants-22/#comments</comments>
		<pubDate>Wed, 23 Jan 2013 09:00:47 +0000</pubDate>
		<dc:creator>Thomas ESCOLAN</dc:creator>
				<category><![CDATA[Culture]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=6582</guid>
		<description><![CDATA[Peut-on encore vendre du logiciel ? <p>Dans une première partie, j&#8217;évoquais l&#8217;informatique en tant que produit d&#8217;une culture du développement. On ne rappelle jamais assez (à mon goût) que le développement logiciel est avant tout une production humaine. A ce titre, elle est une œuvre de création intellectuelle, à laquelle s&#8217;appliquent d&#8217;ailleurs les règles du <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/23/des-developpeurs-et-des-commercants-22/">Des développeurs et des commerçants (2/2)</a></span>]]></description>
				<content:encoded><![CDATA[<h1>Peut-on encore vendre du logiciel ?</h1>
<p>Dans une <a title="Des développeurs et des commerçants" href="http://blog.ippon.fr/2012/10/08/des-developpeurs-et-des-commercants-12/" target="_blank">première partie</a>, j&#8217;évoquais l&#8217;informatique en tant que produit d&#8217;une <em>culture</em> du développement. On ne rappelle jamais assez (à mon goût) que le développement logiciel est avant tout une production humaine. A ce titre, elle est une œuvre de création intellectuelle, à laquelle s&#8217;appliquent d&#8217;ailleurs les règles du <em>copyright</em>. Pourtant l&#8217;informatique, par sa nature dématérialisée, est  depuis longtemps l&#8217;objet et le moyen d&#8217;un pillage en règles. L&#8217;échange de disquettes s&#8217;est tout naturellement développé (si j&#8217;ose dire), car cette pratique fut perçue comme aussi <em>normale</em> que la copie privée des disques en vinyle sur cassettes audio.</p>
<p>C&#8217;est la numérisation, la dématérialisation, qui a ouvert grand les vannes de ces pratiques qui jusqu&#8217;alors n&#8217;étaient pas exagérément considérées comme illégitimes. Devant l&#8217;ampleur du phénomène actuel, on est en droit de se demander s&#8217;il est encore rentable de vendre du logiciel.</p>
<h2>À qui vendre ?</h2>
<p>Après tout, on connaît des structures économiques qui parviennent à prospérer en proposant des <strong>prestations</strong> concernant le logiciel libre. Ce ne sont pas les acteurs principaux du marché&#8230; à moins que&#8230; mais c&#8217;est vrai : <a title="Le Modèle Économique De Google" href="http://www.dissertationsgratuites.com/dissertations/Le-Mod%C3%A8le-%C3%89conomique-De-Google/114277.html" target="_blank">Google</a> et <a title="Le modèle économique de Facebook" href="http://www.antithese.fr/reseau-social-le-modele-economique-de-facebook/" target="_blank">Facebook</a> et même Yahoo! mon Dieu, gagnent des sous sans forcément vendre leur <strong>logiciel</strong> ! Force est de constater qu&#8217;il est au moins possible de proposer certains <em>services informatiques</em> gratuitement au grand public.</p>
<p>Bon, nous avons donc la preuve qu&#8217;il est en tout cas possible de <em>produire</em> un logiciel tout en gagnant de l&#8217;argent (et même d&#8217;entrer en bourse, argh).</p>
<p>Mais qu&#8217;en est-il de la distribution ? Peut-on aussi encore espérer rentabiliser un programme informatique sur la base des licences vendues ? A vrai dire, cela dépend avant tout du client. Trois <a title="Immobilier et banque sont les secteurs qui monétisent le mieux" href="http://www.journaldunet.com/ebusiness/internet-mobile/monetisation-applications/secteurs.shtml" target="_blank">secteurs</a> sont particulièrement rentables pour un éditeur de logiciels, par rapport aux autres : l&#8217;immobilier, la banque et les télécoms. A la traîne, on trouve le secteur de l&#8217;informatique lui-même et celui des jeux vidéos ; mais aussi les grands secteurs publics (santé, éducation, administration) qui ont nécessairement des budgets plus frileux par les temps qui courent.</p>
<p>Dans un second temps, on peut imaginer que la monétisation d&#8217;un logiciel dépende également de son architecture et/ou de sa(ses) plate-forme(s) de déploiement. En effet, cette industrie s&#8217;appuie sur différents modèles en la matière (backoffice, desktop app, mobile app, console app, web app, cloud app, etc.), et la façon de commercialiser les logiciels, d&#8217;un environnement à l&#8217;autre, peut varier du tout au tout. En fait, on peut espérer que plus le <em>médium</em> de diffusion sera <a title="IOS monétise mieux qu'Android" href="http://www.journaldunet.com/ebusiness/internet-mobile/monetisation-applications/os.shtml" target="_blank">fermé et protégé</a>, plus il sera difficile aux utilisateurs de s&#8217;affranchir de l&#8217;obligation de régler une licence pour l&#8217;utilisation du logiciel. Cependant, on s&#8217;est aperçu en pratique que la difficulté de piratage des logiciels n&#8217;est pas liée au support mais qu&#8217;elle est inversement proportionnelle à l’<strong>attractivité du produit</strong>. Les jeux sur console, fortement liés au matériel et parfois distribués sur des cartouches électroniques sont, on l&#8217;a vu, parmi les moins rentables. Dans <a title="Les applis de communication en tête de liste" href="http://www.journaldunet.com/ebusiness/internet-mobile/monetisation-applications/type.shtml" target="_blank">ce graphique</a>, on constate que les secteurs de grande consommation sont mal rémunérés ; sauf en ce qui concerne les réseaux sociaux qui, eux, tirent leurs revenus du <strong>trafic généré</strong> par le biais de leurs services (publicités ajoutées aux écrans).</p>
<p>Moralité, si vous voulez vivre de votre programmation, je vous conseillerais de miser sur des clients qui constituent une niche fonctionnelle et qui ne soient pas avares de leurs sous !.. Qui a dit &#8220;nouvelle économie&#8221; ? Il n&#8217;y a rien de nouveau là-dedans, si ?</p>
<p>Encore un élément à considérer : la <a title="Les applis qui prennent du temps ramènent de l'argent" href="http://www.journaldunet.com/ebusiness/internet-mobile/monetisation-applications/duree.shtml" target="_blank">durée du développement</a> semblerait constituer un levier important de profit. Travaillez fort et ne lésinez pas sur les fonctionnalités, vos clients vous en saurons gré ! C&#8217;est quand même bon de voir reconnaître ses efforts, <em>in fine</em>. Le corollaire, c&#8217;est qu&#8217;il vous faudra d&#8217;abord investir avant de pouvoir vendre. On n&#8217;a rien sans rien, même dans les TIC, apparemment. Par ailleurs, bien que le <a title="Le piratage des logiciels en France reste stable selon la BSA" href="http://www.zdnet.fr/actualites/le-piratage-des-logiciels-en-france-reste-stable-selon-la-bsa-39760774.htm" target="_blank">taux de piratage des logiciels en France</a> ait diminué en 2011 pour s&#8217;établir à 37% (merci de me passer les pincettes), il demeure nettement supérieur à celui de pas mal d&#8217;autres pays européens. Peut-être devriez-vous vous expatrier ?</p>
<h2>Pour pouvoir vendre, doit-on se protéger ?</h2>
<p>On estimerait (avec des pincettes, donc) le manque à gagner mondial dû au piratage des logiciels à <a title="Piratage de logiciels : bilan 2011 de la BSA, la France s'améliore" href="http://www.pcinpact.com/news/70989-piratage-logiciels-bsa-bilan-2011-france.htm" target="_blank">63,4 milliards de dollars</a> (1,98 milliard d&#8217;euros en <a title="Chiffres de l’industrie du logiciel 2011" href="http://www.truffle100.fr/2011/chiffres.php" target="_blank">France</a>). Des sommes qu&#8217;il convient de rapporter aux 11,3 milliards d&#8217;euros de <a title="Secteur logiciel en France" href="http://www.journaldunet.com/solutions/saas-logiciel/chiffre-d-affaires-secteur-logiciel-france-0912.shtml" target="_blank">chiffre d&#8217;affaires</a> du secteur français, soit 2% de la production mondiale. Pour comparaison (même si ce n&#8217;est pas raison), on estime le coût de l&#8217;évasion fiscale française entre <a title="SENAT - Evasion fiscale : combien cela coûte-t-il ?" href="http://www.senat.fr/espace_presse/actualites/201207/evasion_fiscale_combien_cela_coute_il.html" target="_blank">30</a> et <a title="Evasion fiscale : 50 milliards d'euros de manque à gagner pour l'Etat" href="http://www.lemonde.fr/economie/article/2012/07/25/evasion-fiscale-50-milliards-d-euros-de-manque-a-gagner-pour-l-etat_1738070_3234.html" target="_blank">50</a> milliards d&#8217;Euros par an.</p>
<p>Le CA du secteur mondial des logiciels est estimé à 132 milliards de dollars (2009). Ce n&#8217;est pas rien, certes, et la demande de logiciels reste très forte. Cependant, il faut également considérer que les produits disponibles sont de moins en moins novateurs, dans le sens où l&#8217;essentiel des travaux aujourd’hui concerne des ravalements d&#8217;IHM ou des portages technologiques (<em>desktop to web</em>, <em>web to mobile</em>, par exemple) ; vous avez regardé Microsoft Office 2010 ?</p>
<p>Aurait-on atteint un seuil fonctionnel ? On s&#8217;aperçoit que certains acteurs de l&#8217;édition logicielle ont (volontairement ?) adopté une stratégie &#8220;de la tortue&#8221; ; certaines fonctionnalités évidentes ne vous semblent-elles pas cruellement manquer à votre OS ou à votre <em>iBidule</em> favoris ? Vivement la prochaine version, hein ? Tous les jours, il y en a un plus <em>geek </em>que vous qui vient vous faire baver devant son nouveau processeur et ses fonds d&#8217;écrans 3D animés, avouez ! Même si on ne vous fait pas forcément payer pour les mises à jour, vous remarquerez tout de même que ces nouvelles fonctions réclament toujours plus de puissance&#8230; incitation détournée à la vente, je vous dis : le revenu vient des machines dont le besoin est provoqué par le logiciel système ou ceux que vous y ajoutez (<a title="App Store Metrics" href="http://148apps.biz/app-store-metrics/" target="_blank">des jeux surtout</a>, gourmands en ressources par définition). Futé, non ? C&#8217;est encore une piste marketing à creuser si vous voulez vous y mettre, ça porte même un nom : l&#8217;<strong>obsolescence programmée</strong>.</p>
<p>Malgré de nouvelles formes de commercialisation, avec des <em>app stores</em> et des cartouches (ma fille de 9 ans sait ce qu&#8217;est une R4, voyez-vous), rien n&#8217;arrête l&#8217;utilisation frauduleuse de logiciels. On peut même prendre le pari que rien ne l&#8217;arrêtera, tant les numéros de licence et <em>cracks</em> divers fourmillent littéralement sur la toile. C&#8217;est un problème culturel aussi bien que technologique. Même sans support physique et avec l&#8217;apparition de nouvelles formes de licence (on peut acheter des logiciels par tronçons, voire en bénéficier par <a title="Software as a Service (SaaS)" href="Logiciel en tant que service" target="_blank">abonnement</a>), rien n&#8217;y fait vraiment. Pourtant, l&#8217;internet comme média de distribution se prête parfaitement à la fourniture d&#8217;un service logiciel dont l&#8217;accès est restreint (en couverture fonctionnelle ou en durée, donc) sans qu&#8217;il soit possible de les héberger soi-même &#8211; autrement dit, de les <a title="La copie privée dans le Cloud" href="http://www.itespresso.fr/copie-privee-cloud-village-nuages-payer-58220.html" target="_blank">copier</a>.</p>
<p>&#8220;Le cloud ! Le cloud ! Le cloud !&#8221; scanderont certains ; mouais&#8230; bof ! L&#8217;avantage compétitif, je pense, ne vient pas de la répartition de charge (traitement et stockage) mais bien du déploiement distant. Impossible d&#8217;installer chez soi, en toute discrétion, quelque chose qui nécessite une infrastructure externe (toutes fonctionnalités de partage ou centralisées en général). Eurêka, CQFD !</p>
<h2>Alors, que vendre ?</h2>
<p>Un éditeur de logiciels est confronté à deux défis : premièrement cibler et faire connaître son produit pour trouver ses utilisateurs dans le monde entier. Deuxièmement opter pour un mode de collecte des revenus qui lui permette de vivre. Au vu des indices récoltés ci-dessus, un profil rémunérateur émerge. En arrière seulement, malheureusement, émerge la question de la productivité et de la qualité du développement. En effet, l’<a title="Les dessous de la HighTech" href="http://www.dessousdelahightech.org/consommation/obsolescence/">obsolescence programmée</a> dont nous avons parlé n&#8217;oblige absolument pas cet éditeur à miser sur une fiabilité à toute épreuve. On fera bien une mise à jour en cas de problème&#8230; Le seul point critique est constitué par la <strong>sécurité</strong>. Et il arrive bien souvent qu&#8217;untel ou tel autre aient chauds aux fesses quand une faille est découverte ! Cela nous apprend à nouveau deux choses : on n&#8217;est jamais à la merci d&#8217;une mauvaise publicité ET certains produits très répandus ne sont pas à la hauteur. En fait, ils ne le seront jamais. Mais ils rapportent de l&#8217;argent.</p>
<p>En gros, les développeurs (jeunes et fougueux) d&#8217;aujourd&#8217;hui, veulent développer des &#8220;applications mobiles&#8221;. C&#8217;est facile, souple, et le circuit de vente incontournable a largement pignon sur rue. Pour celui dont le souci est avant tout de mettre sa solution à disposition largement, au sein d&#8217;un circuit fiable de collecte des revenus, l&#8217;apparition des <em>app stores</em> est une bénédiction. La plupart du temps, ce n&#8217;est pas donné (certes : <a title="App Store, premier magasin d'applications" href="http://www.lefigaro.fr/societes/2012/04/25/20005-20120425ARTFIG00621-app-store-premier-magasin-d-applications.php" target="_blank">Apple</a> par exemple prend 30% sur les ventes), mais il faut reconnaître que cela répond à un vrai besoin, en centralisant des catalogues de l&#8217;offre disponible. Est-ce-à-dire que le meilleur moyen de gagner de l&#8217;argent dans le logiciel serait de vendre ceux des autres ? Sûrement ; et, encore une fois, ceci n&#8217;est pas une règle propre aux TIC. De plus, sachez que l&#8217;essentiel du volume d&#8217;affaires sur ces circuits est accaparé par un nombre très restreint de <strong>produits stars</strong> ; il est dès lors difficile de percer même avec un bon logiciel. Aujourd&#8217;hui, il semblerait que la meilleure niche commerciale pour les logiciels réside dans l&#8217;<strong>intermédiation</strong>. Celui qui dégage les prébendes les plus importantes est celui qui a la capacité de s&#8217;imposer comme intermédiaire, celui qui sait se placer au cœur des <strong>flux</strong> les plus importants (voir encore Google et Facebook). Revenus de la publicité ou rentes d’hébergement étant les filières les plus lucratives, dans un contexte de diffusion publique.</p>
<p>On constate donc que l&#8217;argent ne semble pas aller vers les algorithmes mais vers l&#8217;accès aux services. C&#8217;est moche, je sais.</p>
<h2>TO READ:</h2>
<p><a title="La Nouvelle Economie" href="http://fr.wikipedia.org/wiki/Nouvelle_%C3%A9conomie" target="_blank">La Nouvelle Économie</a> &#8211; Wikipedia (qui a lancé une campagne d&#8217;appel aux dons)</p>
<p>En livre, L&#8217;économie du logiciel (François Horn) &#8211; 2004</p>
<p><a title="Les modèles économiques du logiciel libre" href="http://www.april.org/livre-blanc-sur-les-modeles-economiques-du-logiciel-libre">Livre blanc sur les modèles économiques du logiciel libre</a> &#8211; April</p>
<p><a title="How Free Apps Can Make More Money Than Paid Apps" href="http://m.techcrunch.com/2012/08/26/how-free-apps-can-make-more-money-than-paid-apps/">How Free Apps Can Make More Money Than Paid Apps</a> &#8211; TechCrunch<br />
<a title="When Freemium Fails" href="http://online.wsj.com/article/SB10000872396390443713704577603782317318996.html">When Freemium Fails</a> &#8211; WSJ.com</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/AMHb3yM4jbM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/23/des-developpeurs-et-des-commercants-22/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/23/des-developpeurs-et-des-commercants-22/</feedburner:origLink></item>
		<item>
		<title>Comment Apple a créé un codec d’animation en JPEG</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/6WvtyerLeOY/</link>
		<comments>http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/#comments</comments>
		<pubDate>Sun, 20 Jan 2013 09:00:23 +0000</pubDate>
		<dc:creator>Emmanuel REMY</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[codec]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[jpg]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7231</guid>
		<description><![CDATA[<p>Cela a commencé par une discussion avec un ami lors du réveillon du 31 décembre, qui, après trois cocktails, me soutenait encore qu&#8217;il y avait du Flash sur le site d&#8217;Apple. Ma curiosité piquée et quelques recherches plus tard, je vous propose un article en forme de clin d’œil, décalé, sur le nouveau standard HTML5 de <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/">Comment Apple a créé un codec d&#8217;animation en JPEG</a></span>]]></description>
				<content:encoded><![CDATA[<p>Cela a commencé par une discussion avec un ami lors du réveillon du 31 décembre, qui, après trois cocktails, me soutenait encore qu&#8217;il y avait du Flash sur le site d&#8217;Apple. Ma curiosité piquée et quelques recherches plus tard, je vous propose un article en forme de clin d’œil, décalé, sur le nouveau standard HTML5 de la vidéo qui pourrait être malmené par le &#8220;codec&#8221; d&#8217;animation JPG créé en Javascript par Apple pour son site.</p>
<p>Avec le HTML5 et son élément <em>&lt;video&gt;</em> le multimédia est censé avoir enfin trouvé sa place. Alors pourquoi ne pas en profiter pour ajouter quelques animations bien sympathiques dans les pages Web en se passant de Flash. Voyez par exemple <a title="Site iPhone5 chez Apple" href="http://www.apple.com/iphone/design/" target="_blank">cette page du site d’Apple</a> : animation du « <em>Unlock</em> » de l’iPhone 5, animation des écouteurs en mode Quicktime VR (manipulables à la souris), HTML5 fait la preuve de sa dimension multimédia tant attendue.</p>
<p style="text-align: center;"><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/iphone5-2/" rel="attachment wp-att-7244"><img class="wp-image-7244 aligncenter" title="iphone5" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/iphone51.png" width="200" height="426" /></a></p>
<p><span style="font-size: 13px; line-height: 19px;">Sauf que les choses ne sont ni aussi triviales, ni aussi évidentes : un click droit sur la zone des écouteurs ou sur la zone de l’iPhone à « unlocker » fait apparaître que l’élément est en fait une simple image. Étonnant. Un coup d’œil sur le code source HTML et le DOM en mémoire ne montre aucune balise vidéo, ni flux vidéo chargé. Mais un élément </span><em style="font-size: 13px; line-height: 19px;">&lt;canvas&gt;</em><span style="font-size: 13px; line-height: 19px;"> existe. Pourquoi Apple, créateur du H.264, ne l&#8217;utilise pas et ne met pas de vidéo sur cette page de son site ? Comment ont-ils pu contourner cette contrainte ?</span></p>
<h2>Codecs&#8230; Ho&#8230; Nan !</h2>
<p>Entrons dans les histoires de codecs vidéo. Il existe 3 grands codecs vidéos qui concernent les navigateurs ; deux sont «gratuits», Ogg Theora et WebM, et un est soumis à de multiples brevets de la part de Apple et Microsoft: le H.264/MPEG-4. Résultat, à ce jour il n’existe pas un codec qui soit pris en charge par les principaux navigateurs (lire <a title="Wikipedia HTML Video" href="http://en.wikipedia.org/wiki/HTML5_video#Multiple_sources" target="_blank">ici</a> sur wikipedia). Par exemple Opera ne supporte pas H.264 quand Safari ne supporte que H.264 (sauf si utilisation de plugins) ou quand Firefox supporte H.264, mais pas sous MacOS, pendant que IE ne supporte que H.264… un vrai sac de nœud.</p>
<p>Dans ces conditions, difficile d&#8217;utiliser l’élément HTML5 <em>&lt;video&gt;</em> quand on s’adresse au public le plus large. Une fois constatée cette impasse, la solution naturelle qui s’imposerait serait d&#8217;utiliser Flash. Mais on se souvient tous de la <a title="Steve et Flash" href="http://www.apple.com/hotnews/thoughts-on-flash/">lettre de Steve Jobs</a>  dans laquelle il livre ses réflexions sur Flash, et on imagine aisément que personne d&#8217;intellectuellement sain chez Apple n&#8217;a du se risquer à cette proposition peu corporate…</p>
<p>Reste donc un rare dénominateur commun pour effectuer des animations et des sorties graphiques maîtrisées: l’élément <em>&lt;canvas&gt;</em> associé à des images. Une vidéo n’est-elle pas une succession d’images ? En téléchargeant <em>N</em> images puis en effectuant une copie de ces images sur le <em>canvas</em> à intervalle régulier, on arrive au résultat escompté. Oui mais… Oui mais rapidement le téléchargement peut devenir conséquent, à raison de 25 images/sec… Solution viable, donc, mais coûteuse en terme de bande passante. Reste finalement une seule solution cohérente dans l&#8217;esprit d&#8217;Apple: écrire <span style="text-decoration: underline;">son</span> « codec » vidéo en Javascript. Un codec qui doit être simple à manipuler, qui ne doit pas dégrader l’image (à la différence de ce que fait le DivX par exemple) et qui doit rester efficace quel que soit le navigateur, depuis IE7 (il existe de quoi émuler le <em>&lt;canvas&gt;</em>) jusqu’à iOS, Chrome ou Opera. Pour un puriste le terme « codec » n’est peut-être pas exact mais il reste conforme dans le contexte, on s’en contentera.</p>
<p>Sans rentrer dans les détails, examinons de plus près comment Apple s&#8217;y est pris pour faire en javascript une animation optimisée à partir d&#8217;images JPG.</p>
<h2>Codec, la ration en Javascript et JSON</h2>
<p>Nous pendrons comme exemple le « Unlock » animé vu précédemment <a href="http://www.apple.com/iphone/design/" target="_blank">sur le site d&#8217;Apple</a>. L’idée de base du codec est très simple : on part d’une image initiale clé I1 (une « keyframe » en matière de vidéo), à laquelle on applique ensuite la différence nécessaire pour atteindre l’image suivante I2. On procède ainsi par récurrence jusqu’à atteindre l’image finale de l’animation qui est aussi implémentée comme une keyframe. En observant les images chargées par le navigateur on découvre ainsi:</p>
<ul>
<li>unlock_keyframe.jpg</li>
<li>unlock_001.jpg,</li>
<li>unlock_002.jpg ,</li>
<li>unlock_endframe.jpg.</li>
</ul>
<p><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/codec/" rel="attachment wp-att-7233"><img class="aligncenter size-full wp-image-7233" title="codec" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/codec.png" width="671" height="315" /></a></p>
<p>Techniquement les images <span style="text-decoration: underline;"><em>unlock_001.jpg</em> et <em>unlock_002.jpg</em> forment un flux continu de données pour les images intermédiaires</span>. (je n’ai mis qu’une copie d’écran partielle, j’expliquerai plus loin pourquoi il y a deux images et pas une seule, ainsi que leurs formes carrées…).</p>
<p>Il nous faut maintenant savoir quelle partie du flux <em>unlock_001</em> et <em>unlock_002</em> il faut copier pour passer de l&#8217;image I<em>n</em> à l’image I<em>n+1</em>. En observant les ressources chargées par le navigateur on découvre un fichier manifest <em>unlock_manifest.json</em> chargé via AJAX.</p>
<p><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/unlock_manifest/" rel="attachment wp-att-7235"><img class=" wp-image-7235 alignnone" title="unlock_manifest" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/unlock_manifest.png" width="740" height="499" /></a></p>
<p>Ce manifest décrit parfaitement notre animation : elle nécessite 2 images de données (<em>imagesRequired:2, </em>nos deux jpg <em>unlock_NN.jpg</em>) pour réaliser les mises à jour entre les images (frames)  et elle sera composée de 91 images (frames) intermédiaires. Quant au blockSize (<em>blockSize:8</em>), on verra plus tard sa signification, mais partons du principe que l’unité de mise à jour d’une image est un bloc de 8&#215;8 pixels. Nous allons maintenant examiner les données du tableau des frames. Pour cela observons comment le codec fonctionne, bref soulevons le capot du code Javascript mis en place par Apple.</p>
<p>Apple fournit divers fichiers de script nommés <em>ac_XXXX.js</em> (pourquoi AC ? A pour Apple, C pour quoi? Codec ? Suis pas sûr) qui prennent en charge la problématique habituelle des différents navigateurs (pas de jQuery dans cette page) en mettant en œuvre un namespace AC. On trouve donc des objets <em>AC.Element, AC.Function, AC.Object, AC.RegExp</em> etc…</p>
<p>A noter que les fichiers JS sont optimisés et minimisés, donc le code vu dans le navigateur est souvent peu lisible : <span style="text-decoration: underline;">je recréerai quelques noms de variables pour la bonne compréhension</span>.</p>
<p>Intéressons nous au fichier <em>ac_flow.js</em> qui est celui qui implémente le codec et sa manipulation. Il définit notamment les classes suivantes qui concernent notre exemple:</p>
<ul>
<li><span style="font-size: 13px; line-height: 19px;"><strong>AC.Flow</strong>: la classe principale chargée de jouer l&#8217;animation</span></li>
<li><span style="font-size: 13px; line-height: 19px;"><strong>AC.Flow.Manifest</strong>: la classe qui gère le manifeste associé à l&#8217;animation</span></li>
<li><span style="font-size: 13px; line-height: 19px;"><strong>AC.Flow.Manifest.Keys</strong>: les infos issues du manifeste pour construire chaque image intermédiaire</span></li>
<li><span style="font-size: 13px; line-height: 19px;"><strong>AC.Flow.SharedMethods</strong>: les fonctions diverses</span></li>
</ul>
<p>Une fois chargé via AJAX, le fichier manifest est parsé ainsi:</p>
<p><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/code01/" rel="attachment wp-att-7236"><img class="size-full wp-image-7236 alignnone" title="code01" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/code01.png" width="555" height="213" /></a></p>
<p>Une frame du fichier JSON (exemple de la frame 1) : <span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">&#8220;</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">AAxACABhABAFgABAKAABA</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">1</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">yACA</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">11</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">ABA</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">2</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">jADA</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">2</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">vABA</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">3</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">SADA</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">3</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">dACA</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">4</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">BAD</span></span></span><span style="color: #000000;"><span style="font-family: 'Lucida Console', monospace;"><span style="font-size: small;">&#8220;) </span></span></span>est donc décomposée par bloc de 5 caractères codés en base64 : les 3 premiers caractères indiquent la position où doit avoir lieu la modification sur le canvas cible (<em>location)</em>, les 2 suivants le nombre de blocs à lire pour la mise à jour (<em>length)</em>. &#8220;<span style="font-size: 13px; line-height: 19px;">AAxAC&#8221; s&#8217;interprète donc ainsi : lire 2 blocs (AC) à la position actuelle dans le flux (<em>unlock_NN.jpg</em>) et effectuer la mise à jour sur le canvas en position 49 (AAx). Simple et efficace. On pourra juste noter que Apple a adapté le <a href="http://fr.wikipedia.org/wiki/Base64" target="_blank">décodage Base64</a>, qui normalement est toujours constitué de blocs de 4 caractères pour coder 3 octets, (soit 6 bits par caractère &#8211; ce point précis est d&#8217;ailleurs respecté ici).</span></p>
<p><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/code02/" rel="attachment wp-att-7238"><img class="size-full wp-image-7238 alignnone" title="code02" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/code02.png" width="473" height="364" /></a></p>
<h2>On anime le canvas&#8230;</h2>
<p>Maintenant que le manifest est décodé et les blocs identifiés il reste à jouer l’animation en copiant les blocs concernés à partir du flux. Ainsi, on trouve des méthodes habituelles <em>play</em>, <em>pause</em>, <em>showFrame</em> etc… Elles effectuent leurs sorties sur le canvas cible. Mais la méthode la plus intéressante est __<em>applyDiffRange</em> chargée d’appliquer les modifications entre deux images (note : j’ai injecté quelques commentaires et noms de variables pour clarifier le code):</p>
<p><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/code_033/" rel="attachment wp-att-7250"><img class="wp-image-7250 alignnone" title="code_033" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/code_033.png" width="749" height="374" /></a></p>
<p>On retrouve les notions vues plus hauts, à savoir la lecture de <em>n</em> blocs à partir de l’image de diff en cours (<em>unlock_xx</em>) qui sont ensuite copiés vers le canvas à la position décodée à partir du manifest. Ces traitements sont visibles dans la console du navigateur:</p>
<p style="text-align: center;"><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/timeline/" rel="attachment wp-att-7255"><img class=" wp-image-7255 aligncenter" title="timeline" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/timeline.png" width="361" height="436" /></a></p>
<p>De même, les structures Base64 des 91 frames qui renseignent sur le nombre de blocs à mettre à jour sont celles-ci, une fois réduites en taille:</p>
<p><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/graph_json/" rel="attachment wp-att-7256"><img class="alignnone  wp-image-7256" title="graph_json" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/graph_json-1024x79.jpg" width="717" height="55" /></a></p>
<p>Les 60 premières mises à jour sont limitées, elle concernent l&#8217;animation de la zone du &#8220;unlock&#8221;. Puis ensuite les choses s&#8217;accélèrent avec les 30 dernières mises à jour conséquentes en nombre, correspondant à l&#8217;apparition des icônes de l&#8217;iPhone et à leurs déplacements  jusqu&#8217;à ce qu&#8217;elles trouvent leur place sur l&#8217;écran et se superposent à la keyframe finale.</p>
<p><span style="font-size: 13px; line-height: 19px;">Si on continue à lire ce fichier JS, on note encore l&#8217;existence d&#8217;une classe <em>AC.Flow.VR</em> qui émule Quicktime VR (oui oui, vous lisez bien), utilisée d&#8217;ailleurs dans le cas de la rotation des écouteurs. De même on découvre que Apple a dû fournir précédemment une version de l&#8217;animation composée basiquement d&#8217;un ensemble de <em>n</em> images brutes enchainées à partir d&#8217;un élément <em>&lt;img&gt;</em> ! Peut-être la première version.</span></p>
<p><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/showframe/" rel="attachment wp-att-7240"><img class="size-full wp-image-7240 alignnone" title="showFrame" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/showFrame.png" width="613" height="240" /></a></p>
<p>Enfin on découvre que la description de l&#8217;animation actuellement dans le fichier manifest JSON est prévue aussi pour être intégrée dans un fichier image PNG, ce qui améliorerait certainement les performances pour coder/décoder les informations (plus besoin de passer par du Base64, lecture en masse).</p>
<p><a href="http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/showconfpng/" rel="attachment wp-att-7241"><img class="size-full wp-image-7241 alignnone" title="showConfPNG" alt="" src="http://blog.ippon.fr/wp-content/uploads/2013/01/showConfPNG.png" width="562" height="364" /></a></p>
<p>Avant de refermer cet article, revenons sur la notion de <em>blockSize</em> vue dans le fichier manifest. Les images de données ont ces dimensions: <em>unlock_01.jpg,</em> w=1624 , h=1624 et<em> unlock_02.jpg</em>, w= 160 , h=160. Le format des images est du JPG. La <a href="http://fr.wikipedia.org/wiki/JPEG">norme JPG</a> nous renseigne qu&#8217;un JPG est décomposé en blocs de 8&#215;8 pixels ou 16&#215;16 pixels. Or dans notre cas le <em>blockSize</em> inscrit dans le manifest est de 8 pixels : Apple a donc créé des JPG en veillant à respecter cette caractéristique de compression, sans perte de qualité, ce qui permet une relecture parfaite des pixels du block. On constate bien d&#8217;ailleurs que les images <em>unlock_NN.jpg</em> sont constituées de bandes de 8 pixels de haut et de largeur un multiple de 8 (1624=8x 203, 160=8&#215;20). Astucieux.  Pour être complet, le fait que les images soient carrées simplifie les calculs (mais sans plus), et impose donc de fabriquer deux images pour optimiser la taille globale en Ko qui devra être téléchargée .</p>
<p>En conclusion, alors que le HTML5 semble devenir pour beaucoup un standard enfin respecté par les navigateurs, qu&#8217;il dispose des moyens modernes pour jouer des animations et gérer l&#8217;interactivité souhaitée, Apple nous prend à contre-pied et nous montre si besoin était, que le chemin sera encore long avant de pouvoir fédérer définitivement les acteurs.</p>
<p>En attendant, les animations sont faites à partir d&#8217;images JPG !</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/6WvtyerLeOY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/20/comment-apple-a-cree-un-codec-danimation-en-jpeg/</feedburner:origLink></item>
		<item>
		<title>Ippon Agile en 2012 et encore plus en 2013</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/4YqxDgIqFNA/</link>
		<comments>http://blog.ippon.fr/2013/01/18/ippon-methodes-agiles/#comments</comments>
		<pubDate>Fri, 18 Jan 2013 16:00:07 +0000</pubDate>
		<dc:creator>Pascal POUSSARD</dc:creator>
				<category><![CDATA[Agilité]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Devops]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[méthodes agiles]]></category>
		<category><![CDATA[Scrumday]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7358</guid>
		<description><![CDATA[<p dir="ltr" id="internal-source-marker_0.8910188520645372">Chaque début d’année est propice à une petite rétrospective. Pour Ippon, l&#8217;année 2012 a été l&#8217;occasion de confirmer son investissement dans la communauté Agile en accueillant le French Scrum User Group et en sponsorisant le ScrumDay (Sponsoring du ScrumDay réitéré en 2013) ou encore l&#8217;Agile Tour du côté de Nantes. Ces évènements ont <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/18/ippon-methodes-agiles/">Ippon Agile en 2012 et encore plus en 2013</a></span>]]></description>
				<content:encoded><![CDATA[<p dir="ltr" id="internal-source-marker_0.8910188520645372">Chaque début d’année est propice à une petite rétrospective. Pour Ippon, l&#8217;année 2012 a été l&#8217;occasion de confirmer son investissement dans la communauté Agile en accueillant le French Scrum User Group et en sponsorisant le ScrumDay (<a title="ScrumDay 2013 - Ippon sponsor " href="http://www.scrumday.fr/" target="_blank">Sponsoring du ScrumDay réitéré en 2013</a>) ou encore l&#8217;Agile Tour du côté de Nantes. Ces évènements ont également permis de faire partager nos envies et nos réussites avec un atelier Lego4Scrum et un retour d&#8217;expérience du projet Pages Jaunes qui profite de 5 ans d&#8217;usage de Scrum.</p>
<p>&nbsp;</p>
<p dir="ltr">Pour nos clients, nous nous sommes employés à utiliser les méthodes les plus adaptées à leurs besoins et à leurs attentes que se soit dans le suivi des projets, comme nous le faisons chez Darty, Suez ou encore EDF ou dans une réflexion plus globale sur la mise en place d&#8217;une démarche Agile, comme nous le faisons chez Thalès.</p>
<p>&nbsp;</p>
<p dir="ltr">Notre défi pour l&#8217;avenir est de continuer à démontrer l&#8217;efficacité des méthodes Agiles sur un marché concurrentiel ayant besoin d&#8217;une grande réactivité. Montrer que ces méthodes ne sont pas que des discussions de principes mais avant tout des atouts pour la réussite de nos projets.</p>
<p>&nbsp;</p>
<p dir="ltr">Plus que jamais l’Agilité fait partie intégrante de l&#8217;activité d&#8217;Ippon. Sur les projets classiques bien entendu, mais aussi de plus en plus sur les projets mobiles encore plus exigeants en termes de changement et d&#8217;adaptation. La nouvelle offre complète de <a title="Atomes, hébergeur Java Ippon " href="http://www.atomes.com/">Cloud Ippon</a>, suite à l’acquisition d’Atomes, va fournir le cadre idéal pour mettre en pratique notre expertise Agile jusqu’en production, avec les pratiques DevOps, et confirmer la réussite et la création de valeur jusqu’au bout du projet.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/4YqxDgIqFNA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/18/ippon-methodes-agiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/18/ippon-methodes-agiles/</feedburner:origLink></item>
		<item>
		<title>Ippon accompagne les changements technologiques avec son programme de formations</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/1SSMoYnHwWM/</link>
		<comments>http://blog.ippon.fr/2013/01/17/formation-ippon/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 17:00:10 +0000</pubDate>
		<dc:creator>Emmanuel REMY</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[formation]]></category>
		<category><![CDATA[Ippon]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Formation]]></category>
		<category><![CDATA[ippon]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7343</guid>
		<description><![CDATA[<p>2013. Nous y sommes. Chaque mois de janvier voit apparaître les mêmes états des lieux des douze derniers mois, comme s’il était possible d’aligner les bilans technologiques sur les bilans comptables.</p> <p>Or nous savons tous, que dans nos domaines, la dynamique prévaut, la réalité est autre. Nos semaines sont rythmées par l&#8217;émergence de nouvelles technologies, <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/17/formation-ippon/">Ippon accompagne les changements technologiques avec son programme de formations</a></span>]]></description>
				<content:encoded><![CDATA[<p>2013. Nous y sommes. Chaque mois de janvier voit apparaître les mêmes états des lieux des douze derniers mois, comme s’il était possible d’aligner les bilans technologiques sur les bilans comptables.</p>
<p>Or nous savons tous, que dans nos domaines, la dynamique prévaut, la réalité est autre. Nos semaines sont rythmées par l&#8217;émergence de nouvelles technologies, la validation de spécifications ou encore la consolidation des architectures.<br />
Aussi, si nous prenons le temps de regarder dans le rétroviseur à chaque nouvelle année, nous devrions plutôt prendre le temps de le faire régulièrement, pour pratiquer, tester, construire ou encore asseoir nos réflexions et anticiper autant que possible comment et de quoi seront faites nos futures architectures et applications.</p>
<p>La tâche n’est pas toujours aisée car on touche là des domaines novateurs ou experts qui demandent un fort investissement personnel &#8211; et d’entreprise. C’est pour vous accompagner et vous permettre d’atteindre ce niveau de satisfaction qu’Ippon a décidé de lancer une offre originale de formation dès 2013. Encore un catalogue formation comme il en existe des dizaines sur le marché me direz-vous ? Certainement pas.<br />
Nous ne rentrerons pas dans la course à « celui qui aura le plus gros catalogue de formations », le plus de pages, le plus lourd&#8230; Non, nous vous proposons volontairement uniquement des formations d’expertise animées par des experts, conçues comme telles, pour que les quelques jours que vous consacrerez répondent concrètement à vos attentes et vos problématiques. Que vous soyez confrontés en pratique au NoSQL, à la Mobilité, à JEE, au Cloud ou encore à l’Agilité, que vous recherchiez des états de l’art pertinents dans ces domaines, suivre une formation chez Ippon c’est aussi appartenir à une communauté active qui vous accompagne avant, pendant et après votre stage. Répondre à vos questions, nous assurer de la parfaite compréhension du stage suivi, voilà notre conception de la formation chez Ippon. Une histoire d’experts et de passionnés qui vont se relayer dès maintenant pour vous apporter ce niveau d’exigence, de pédagogie et de suivi.</p>
<p>Et je vous le promets, le bonheur et la santé iront de pair !</p>
<p>Bonne année 2013</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/1SSMoYnHwWM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/17/formation-ippon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/17/formation-ippon/</feedburner:origLink></item>
		<item>
		<title>Participez à la formation Mule ESB – Février 2013</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/ocyNkwyAXBM/</link>
		<comments>http://blog.ippon.fr/2013/01/17/participez-a-la-formation-mule-esb-fevrier-2013/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 08:00:04 +0000</pubDate>
		<dc:creator>Fabien ARRAULT</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[formation]]></category>
		<category><![CDATA[Ippon]]></category>
		<category><![CDATA[Formation]]></category>
		<category><![CDATA[Mule]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7327</guid>
		<description><![CDATA[ <p>Ippon Technologies organise une formation Mule ESB du 4 au 6 février 2013 &#8211; Il reste quelques places :</p> Description <p>Grâce à sa configuration simple, à son intégration avec de nombreuses technologies Open Source, à son écosystème de connecteurs riches et à son ouverture forte sur les services Cloud, Mule ESB est un choix <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/17/participez-a-la-formation-mule-esb-fevrier-2013/">Participez à la formation Mule ESB &#8211; Février 2013</a></span>]]></description>
				<content:encoded><![CDATA[<div>
<p>Ippon Technologies organise une<strong> formation Mule ESB du 4 au 6 février 2013</strong> &#8211; Il reste quelques places :</p>
<h2>Description</h2>
<p>Grâce à sa configuration simple, à son intégration avec de nombreuses technologies Open Source, à son écosystème de connecteurs riches et à son ouverture forte sur les services Cloud, Mule ESB est un choix pertinent pour de nombreux cas d&#8217;usage d&#8217;intégration d&#8217;applications.</p>
<p>L&#8217;objectif de cette formation est de fournir aux stagiaires les clefs nécessaires à la mise en oeuvre des principaux patterns d&#8217;intégration à l&#8217;aide de Mule.</p>
</div>
<p>Résolument orientée pratique, les nombreux TPs permettront de réaliser progressivement un système complet utilisant les principales technos : WebService, JMS, Base de données, Transactions, etc&#8230;</p>
<div>
<h2>Objectifs</h2>
<p>A l&#8217;issue de cette formation le stagiaire sera autonome pour concevoir et mettre en oeuvre des flux d&#8217;intégration d&#8217;applications dans le respect des meilleures pratiques SOA.</p>
<h2>Public</h2>
<p>Chefs de Projets, Architectes Experts, Développeurs</p>
<h2>Prérequis</h2>
<p>Bonne pratique de Java</p>
<p>Découvrez l&#8217;ensemble du programme : <a title="formation mule ESB Ippon Technologies" href="http://www.ippon.fr/formation/mule" target="_blank">http://www.ippon.fr/formation/mule</a></p>
<h2>Pour nous contacter</h2>
<p>Cette formation vous intéresse, vous souhaitez avoir plus d&#8217;informations sur les modalités d&#8217;inscription :</p>
<ul>
<li>Tél : <a href="tel:%2B%2033%20%280%291%2046%2012%2048%2048" target="_blank">+ 33 (0)1 46 12 48 48</a></li>
<li>Fax : <a href="tel:%2B%2033%20%280%291%2046%2012%2048%2049" target="_blank">+ 33 (0)1 46 12 48 49</a></li>
<li>E-mail : <a href="mailto:formation@ippon.fr" target="_blank">formation@ippon.fr</a></li>
</ul>
<h2>Une question technique sur le programme de formation</h2>
</div>
<p>Fabien Arrault, votre formateur expert Ippon vous répond : <a href="mailto:farrault@ippon.fr" target="_blank">farrault@ippon.fr</a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/ocyNkwyAXBM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/17/participez-a-la-formation-mule-esb-fevrier-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/17/participez-a-la-formation-mule-esb-fevrier-2013/</feedburner:origLink></item>
		<item>
		<title>2013 sera toujours plus Mobile</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/HdM7ED4VDQQ/</link>
		<comments>http://blog.ippon.fr/2013/01/16/2013-sera-toujours-plus-mobile/#comments</comments>
		<pubDate>Wed, 16 Jan 2013 13:00:51 +0000</pubDate>
		<dc:creator>Lorys POGNON</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[MDM]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[nfc]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7332</guid>
		<description><![CDATA[<p dir="ltr">Plusieurs événements ont marqué l’univers mobile durant l’année écoulée. On notera entre autres, pour les développeurs :</p> <p dir="ltr">la fragmentation tant redoutée pour la plateforme Apple avec l’arrivée de l’iPhone 5 et de l’iPad Mini</p> <p dir="ltr">la sortie du Windows Phone 8 (qui ne les attirent pas pour autant)</p> <p dir="ltr">la percée des terminaux <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/16/2013-sera-toujours-plus-mobile/">2013 sera toujours plus Mobile</a></span>]]></description>
				<content:encoded><![CDATA[<p dir="ltr">Plusieurs événements ont marqué l’univers mobile durant l’année écoulée. On notera entre autres, pour les développeurs :</p>
<ul>
<li>
<p dir="ltr">la fragmentation tant redoutée pour la plateforme Apple avec l’arrivée de l’iPhone 5 et de l’iPad Mini</p>
</li>
<li>
<p dir="ltr">la sortie du Windows Phone 8 (qui ne les attirent pas pour autant)</p>
</li>
<li>
<p dir="ltr">la percée des terminaux Android avec l’intérêt particulier qu’ils portent à cette plate-forme.</p>
</li>
</ul>
<p dir="ltr">Les entreprises ont été très demandeuses en applications et services mobiles poussant même certaines à créer des entités dédiées aux développements et à leur stratégie mobile. Les entreprises sont enfin passées à l’étape des applications intégrées au système d’information avec des services mobiles plus complexes mais plus riches et plus utiles pour leurs utilisateurs.</p>
<p dir="ltr">2013 sera la suite logique, agitée et créative, d’un mouvement qui n’a pas encore dévoilé tous ses secrets. On assistera à une forte demande d’applications mobiles d’entreprises destinées aux employés et des systèmes de gestion de parc mobile adaptés.</p>
<p dir="ltr">Les applications répondront de plus en plus aux besoins spécifiques de la société et des entreprises. Elles sauront lier, dans un même univers, diverses technologies et thématiques dont la sécurité, le NFC (sujet que nous aborderons lors de <a title="Inscription conférence NFC " href="http://piaippon-es2001.eventbrite.fr/">notre petit-déjeuner du 27 janvier 2013</a>), le geofencing, la réalité augmentée, la géolocalisation, le cloud , la synchronisation, l’analyse prédictive et j&#8217;en passe.</p>
<p dir="ltr">2013 sera l’année des services connectés sans oublier la croissance et l’avancement technologique des terminaux pour répondre aux besoins.</p>
<p dir="ltr">C&#8217;est dans cette optique qu&#8217;<a title="Ippon Mobile " href="http://www.ippon-mobile.fr/" target="_blank">Ippon Technologies et ses experts</a> continueront à vous accompagner et vous aider à atteindre vos objectifs</p>
<p dir="ltr">Découvrez l&#8217;ensemble de notre offre et de notre expertise mobile sur notre <a title="Ippon Mobile le site" href="http://www.ippon-mobile.fr/" target="_blank">site responsive web design</a></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/HdM7ED4VDQQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/16/2013-sera-toujours-plus-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/16/2013-sera-toujours-plus-mobile/</feedburner:origLink></item>
		<item>
		<title>2012 … Un an chez Ippon en images</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/zNtmQctLCgY/</link>
		<comments>http://blog.ippon.fr/2013/01/15/2012-un-an-chez-ippon-en-images/#comments</comments>
		<pubDate>Tue, 15 Jan 2013 20:00:29 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Ippon]]></category>
		<category><![CDATA[Sport et business]]></category>
		<category><![CDATA[Devoxx]]></category>
		<category><![CDATA[Ippevent]]></category>
		<category><![CDATA[ippon]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7306</guid>
		<description><![CDATA[<p></p> ]]></description>
				<content:encoded><![CDATA[<p><iframe frameborder="0" height="315" src="http://www.youtube.com/embed/HVVVW-qKSy8" width="560"></iframe></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/zNtmQctLCgY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/15/2012-un-an-chez-ippon-en-images/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/15/2012-un-an-chez-ippon-en-images/</feedburner:origLink></item>
		<item>
		<title>Bulletin météo 2013 : Cloud et DevOps</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/Pn9Ivy8qDdU/</link>
		<comments>http://blog.ippon.fr/2013/01/15/cloud-devops-2013/#comments</comments>
		<pubDate>Tue, 15 Jan 2013 08:30:34 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Devops]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[atomes]]></category>
		<category><![CDATA[hébergement]]></category>
		<category><![CDATA[openstack]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7288</guid>
		<description><![CDATA[<p>Par Yann Vigara, Atomes Hosting </p> <p>La fin du monde n&#8217;a pas eu lieu ! Pourtant on a cru à plusieurs reprises cette année, que les Mayas ne s&#8217;étaient pas trop trompés. Un éternuement d&#8217;Amazon et c&#8217;est une grande partie d&#8217;Internet qui se retrouve dans le noir ! Beaucoup parlent et vendent du Cloud comme <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/15/cloud-devops-2013/">Bulletin météo 2013 : Cloud et DevOps</a></span>]]></description>
				<content:encoded><![CDATA[<p>Par Yann Vigara, <a title="Atomes, hébergeur Java filiale d'Ippon Technologies" href="http://www.atomes.com/" target="_blank">Atomes Hosting </a></p>
<p>La fin du monde n&#8217;a pas eu lieu !<br />
Pourtant on a cru à plusieurs reprises cette année, que les Mayas ne s&#8217;étaient pas trop trompés. Un éternuement d&#8217;Amazon et c&#8217;est une grande partie d&#8217;Internet qui se retrouve dans le noir !<br />
Beaucoup parlent et vendent du Cloud comme la promesse d&#8217;un service toujours disponible. Feraient-ils eux aussi des prédictions qui ne se sont pas vérifiées ? Il faut le croire. En même temps on parle d’informatique. Et qui n&#8217;a jamais vu un ordinateur planter ?<br />
Pourtant quelques rares services n&#8217;ont pas été impactés par ces pannes. Leur secret : ils ont pensé leur infrastructure pour qu’elle soit résiliente aux pannes, 100% automatisée et ils l&#8217;ont réparti sur plusieurs Clouds.<br />
Avec la guerre des prix qui s’opère entre les différents fournisseurs, le Cloud va devenir de plus en plus abordable. On va donc voir de plus en plus de projets dans le Cloud sans y être vraiment préparés.<br />
Et avec l&#8217;arrivée des deux mastodontes français financés par le Grand Emprunt, beaucoup de sociétés françaises vont sauter le pas pour mettre leurs services dans le Cloud.<br />
On peut prédire sans se tromper qu&#8217;en 2013 les blackouts d&#8217;Internet suite à une panne d&#8217;un fournisseur Cloud seront encore plus visibles.</p>
<p>En 2013 OpenStack gagnera la guerre des solutions de gestion des infrastructures Cloud OpenSource. La solution arrive à maturité et de plus en plus d&#8217;infrastructures vont l&#8217;utiliser en production. Avec OpenStack, les Clouds privés vont pousser comme des champignons (enfin plutôt comme des pyrocumulus <img src='http://blog.ippon.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Dans la course à l&#8217;automatisation et à la virtualisation, le réseau restait le parent pauvre du datacenter. On a assisté en 2012 à une consolidation du marché de la virtualisation réseau (SDN). Les premiers équipements réseau virtualisables vont apparaître courant de l&#8217;année 2013. C’était la brique manquante pour pouvoir créer et mettre en place des infrastructures réseau complexes et à la demande, comme ce qui se fait pour les serveurs. On verra apparaître de plus en plus de Clouds hybrides mélangeant le meilleur de toutes ces technologies (serveurs physiques, serveurs virtuels, débordement dans un Cloud public) pour offrir encore plus de services et de performance.</p>
<p>Tout ça ne sera rendu possible que grâce à la mise en place de pratiques DevOps. Là aussi les méthodes et les outils commencent à être matures. Automatiser son infrastructure, déployer en continus ses services et prévoir un plan de reprise d&#8217;activité, sont les solutions pour garantir un service toujours disponible.</p>
<p>Une bonne résolution à prendre en 2013 si vous voulez aller dans le Cloud sans en faire les frais : Cassez le silo qui existe entre les développeurs et les administrateurs systèmes et commencez tout de suite à mettre en place les pratiques DevOps.</p>
<p>2013 sera l&#8217;année du DevOps et du <a title="Atomes, hébergeur Java filiale d'Ippon Technologies" href="https://www.atomes.com/accueil" target="_blank">Cloud</a>.</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/Pn9Ivy8qDdU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/15/cloud-devops-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/15/cloud-devops-2013/</feedburner:origLink></item>
		<item>
		<title>Ippevent Couchbase le 31 Janvier</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/jWAucb6CV6c/</link>
		<comments>http://blog.ippon.fr/2013/01/15/ippevent-couchbase-le-31-janvier/#comments</comments>
		<pubDate>Tue, 15 Jan 2013 05:53:28 +0000</pubDate>
		<dc:creator>Antoine SABOT-DURAND</dc:creator>
				<category><![CDATA[Ippevents]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[Ippevent]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7292</guid>
		<description><![CDATA[<p>Le 31 Janvier se tiendra notre premier Ippevent 2013 qui aura pour thème la solution NoSQL Couchbase server 2.0 et sera animé par Tugdual Grall, &#8220;Technical Evangelist&#8221; chez Couchbase.</p> <p>Cette présentation commencera par une rapide introduction au NoSQL expliquant les raisons pour lesquelles de plus en plus de projets utilisent ce type de solutions. Tugdual <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/15/ippevent-couchbase-le-31-janvier/">Ippevent Couchbase le 31 Janvier</a></span>]]></description>
				<content:encoded><![CDATA[<p><img class=" wp-image-7295 alignleft" alt="Logo Couchbase" src="http://blog.ippon.fr/wp-content/uploads/2013/01/couchbase.jpg" width="130" height="130" />Le 31 Janvier se tiendra notre premier Ippevent 2013 qui aura pour thème la solution NoSQL Couchbase server 2.0 et sera animé par Tugdual Grall, &#8220;Technical Evangelist&#8221; chez Couchbase.</p>
<p>Cette présentation commencera par une rapide introduction au NoSQL expliquant les raisons pour lesquelles de plus en plus de projets utilisent ce type de solutions. Tugdual fera également le tour des différentes approches (Clé Valeur, Document, Colonnes, Graph) et solutions du marché.</p>
<p>Une fois cette introduction effectuée vous verrez en détail la solution Couchbase Server 2.0.  Couchbase est une base de données NoSQL orientée Document, qui est développée en Open Source. Tugdual la présentera en s&#8217;appuyant sur des démonstrations :</p>
<ul>
<li>le développement d&#8217;applications Java (et/ou autres selon les gouts) sur du NoSQL</li>
<li>l&#8217;utilisation de JSON pour le stockage et les bénéfices et défis associés à l&#8217;approche &#8220;Schemaless&#8221;</li>
<li>l&#8217;utilisation de Map Reduce pour la création de requêtes complexes</li>
<li>la mise en place et l&#8217;administration d&#8217;un cluster, et les défis associés</li>
</ul>
<p>Une soirée riche en perspective.</p>
<p>Pour vous inscrire il vous suffit d&#8217;utiliser le bandeau ci-dessous.</p>
<div style="width: 100%; text-align: left;">
<p><iframe frameborder="0" height="214" marginheight="5" marginwidth="5" scrolling="auto" src="http://www.eventbrite.fr/tickets-external?eid=5233688102&amp;ref=etckt&amp;v=2" width="100%"></iframe></p>
<div style="font-family: Helvetica, Arial; font-size: 10px; padding: 5px 0 5px; margin: 2px; width: 100%; text-align: left;"><a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr/r/etckt" target="_blank">Inscription pour un événement</a><span style="color: #ddd;"> pour </span><a style="color: #ddd; text-decoration: none;" href="http://ippevent-couchbase.eventbrite.fr?ref=etckt" target="_blank">Ippevent &#8211; Soirée NoSQL avec Couchbase Server 2.0</a> <span style="color: #ddd;">réalisé par</span> <a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.fr?ref=etckt" target="_blank">Eventbrite</a></div>
</div>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/jWAucb6CV6c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/15/ippevent-couchbase-le-31-janvier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/15/ippevent-couchbase-le-31-janvier/</feedburner:origLink></item>
		<item>
		<title>3 prédictions pour Java en 2013</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/jP99MXe6694/</link>
		<comments>http://blog.ippon.fr/2013/01/13/3-predictions-pour-java-en-2013/#comments</comments>
		<pubDate>Sun, 13 Jan 2013 08:00:17 +0000</pubDate>
		<dc:creator>Julien DUBOIS</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[hébergement]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[logiciel]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7226</guid>
		<description><![CDATA[1. L&#8217;explosion de la demande en expertise Java <p dir="ltr">Les besoins en développement Java n&#8217;ont jamais été aussi importants, et la demande va être démultipliée par plusieurs tendances de fond :</p> <p dir="ltr">- L&#8217;arrivée d&#8217;HTML5 et d&#8217;une multitude de frameworks JavaScript/CSS est en train de considérablement moderniser le Web. Cela pousse les entreprises à revoir <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/13/3-predictions-pour-java-en-2013/">3 prédictions pour Java en 2013</a></span>]]></description>
				<content:encoded><![CDATA[<h2 id="internal-source-marker_0.06847134023962076">1. L&#8217;explosion de la demande en expertise Java</h2>
<p dir="ltr">Les besoins en développement Java n&#8217;ont jamais été aussi importants, et la demande va être démultipliée par plusieurs tendances de fond :</p>
<p dir="ltr">- L&#8217;arrivée d&#8217;HTML5 et d&#8217;une multitude de frameworks JavaScript/CSS est en train de considérablement moderniser le Web. Cela pousse les entreprises à revoir entièrement l&#8217;ergonomie et le design de leurs applications.</p>
<p dir="ltr">- L&#8217;explosion des smartphones et des tablettes sur Android. Android a maintenant dépassé iOS en nombre d&#8217;utilisateurs, mais surtout en termes de croissance. Les nouveaux appareils proposés par Amazon et Google sont à des prix très abordables. A tel point que le marché des &#8220;liseuses&#8221; et autres &#8220;e-book readers&#8221; est d&#8217;ailleurs en train de disparaître.</p>
<p dir="ltr">- L&#8217;hébergement d&#8217;applications Java, jusqu&#8217;ici complexe et coûteux, est en train de devenir aussi simple et bon marché que de l&#8217;hébergement PHP. A nouveau, des acteurs comme Google ou Amazon y sont pour beaucoup, ainsi qu&#8217;une multitude d&#8217;acteurs spécialisés, dont Ippon Technologies avec sa filiale <a title="Atomes, hébergeur Java filiale d'Ippon Technologies" href="http://www.atomes.com/" target="_blank">Atomes</a>.</p>
<p dir="ltr">
<p dir="ltr">Ces 3 tendances nécessitent toutes des compétences pointues, et réussir un projet Java &#8220;moderne&#8221; est paradoxalement devenu à la fois très facile (grâce à la multitude des frameworks et outils) et très complexe (car il faut maîtriser toutes ces technologies). L&#8217;expertise Java, c&#8217;est-à-dire la compétence et l&#8217;expérience permettant de réaliser ce type de projet va donc être particulièrement demandée cette année.</p>
<p>&nbsp;</p>
<h2>2. La guerre des géants du logiciel va s&#8217;amplifier</h2>
<p dir="ltr">En 2012 déjà, les géants du logiciels comme Microsoft, Oracle, IBM, Google, Amazon, Apple ou VMWare ont arrêté de prendre des gants et se sont affrontés sur les terrains économiques mais aussi légaux (guerre des brevets, en particulier).</p>
<p>&nbsp;</p>
<p dir="ltr">Cette guerre n&#8217;est pas du tout à l&#8217;avantage de leurs utilisateurs français :</p>
<p dir="ltr">- L&#8217;ensemble de ces entreprises est américaine : nous ne sommes qu&#8217;un marché qu&#8217;ils vont se partager, et les entreprises et administrations françaises vont continuer de payer très chers des logiciels et une technologie que nous ne possédons pas.</p>
<p dir="ltr">- L&#8217;évolution de Java, un moment boostée avec l&#8217;arrivée de Java EE (suite à la concurrence de Spring), va continuer de stagner. Le JCP est redevenu englué dans des guerres de tranchées qui empêchent, à nouveau, toute innovation.</p>
<p>&nbsp;</p>
<p dir="ltr">Les sommes en jeu sont ici considérables, et certains de ces acteurs vont mieux tirer leur épingle du jeu que les autres : pour moi les mieux placés en 2013 sont Google, Oracle et Amazon. Et quoi qu&#8217;il en soit les vainqueurs seront américains !</p>
<p>&nbsp;</p>
<h2>3. La fin de la mode des langages &#8220;alternatifs&#8221; sur la JVM</h2>
<p dir="ltr">Pour finir je vous propose une prédiction plus audacieuse et risquée : la fin de la mode des langages alternatifs comme Groovy, Scala, Jython, Clojure, Kotlin ou Ceylon. Plus précisément, je pense que seul Groovy va subsister car il est le plus populaire, l&#8217;un des plus anciens, et qu&#8217;il est soutenu par l&#8217;excellente stack Grails.</p>
<p>&nbsp;</p>
<p dir="ltr">Tout d&#8217;abord, cette prédiction est liée ma première prédiction : il y a aujourd&#8217;hui tellement de nouveautés à apprendre (HTML5, mobilité, devops), que je rencontre peu de développeurs qui ont le temps d&#8217;apprendre en plus un langage supplémentaire. Et s&#8217;ils ont ce temps, il vont plutôt s&#8217;orienter vers un langage et une stack en dehors de la JVM, comme Ruby on Rails.</p>
<p>&nbsp;</p>
<p dir="ltr">Cette prédiction s&#8217;appuie également sur les points suivants :</p>
<p dir="ltr">- La demande en compétences dans ces langages a commencé à stagner en 2012 : <a href="http://www.indeed.com/jobtrends?q=groovy%2C+jython%2C+scala%2C+clojure&amp;l=">http://www.indeed.com/jobtrends?q=groovy%2C+jython%2C+scala%2C+clojure&amp;l=</a></p>
<p dir="ltr">- Les très rares projets Play! que j&#8217;ai pu voir chez des clients étaient tous codés en Java</p>
<p dir="ltr">- Les langages &#8220;populaires&#8221; comme Groovy ou Scala n&#8217;ont pas de bonnes statistiques Github (nombre de &#8220;stars&#8221; ou de &#8220;forks&#8221;)</p>
<p dir="ltr">- Les projets moins populaires comme Kotlin ou Ceylon, annoncés à grand renfort de pub en 2011, ne sont toujours pas en version stable en 2013</p>
<p>&nbsp;</p>
<p dir="ltr">Sur ce, je vous souhaite une bonne année 2013 et vous donne rendez-vous dans un an pour faire un bilan de l&#8217;année !</p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/jP99MXe6694" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/13/3-predictions-pour-java-en-2013/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/13/3-predictions-pour-java-en-2013/</feedburner:origLink></item>
		<item>
		<title>Regards d’experts pour 2013 – Java, mobile, formation, agile, hébergement</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/FHyfjDM5mLU/</link>
		<comments>http://blog.ippon.fr/2013/01/11/2013-java-mobile-cloud-agile-formation/#comments</comments>
		<pubDate>Fri, 11 Jan 2013 08:30:37 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7218</guid>
		<description><![CDATA[<p>Vous vous posez des questions sur ce qui va se passer en 2013 ?  La semaine prochaine, suivez attentivement l&#8217;actualité du blog Ippon.</p> <p>5 responsables de pôle partageront, jour après jour, UNE vision de leur domaine d&#8217;expertise pour l&#8217;année (ou plutôt les mois ) à venir : Java, Agile, Mobile, Formation et Cloud&#8230; il y <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/11/2013-java-mobile-cloud-agile-formation/">Regards d&#8217;experts pour 2013 &#8211; Java, mobile, formation, agile, hébergement</a></span>]]></description>
				<content:encoded><![CDATA[<p>Vous vous posez des questions sur ce qui va se passer en 2013 ?  La semaine prochaine, suivez attentivement l&#8217;actualité du blog Ippon.</p>
<p>5 responsables de pôle partageront, jour après jour, UNE vision de leur domaine d&#8217;expertise pour l&#8217;année (ou plutôt les mois ) à venir : Java, Agile, Mobile, Formation et Cloud&#8230; il y en aura pour tous les goûts.</p>
<p><img class="aligncenter" src="http://blog.ippon.fr/wp-content/uploads/2013/01/carte_voeux_anim_blog.gif" alt="Voeux 2013 - Ippon Technologies" width="567" height="422" /></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/FHyfjDM5mLU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/11/2013-java-mobile-cloud-agile-formation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/11/2013-java-mobile-cloud-agile-formation/</feedburner:origLink></item>
		<item>
		<title>De nouvelles offres d’emploi chez Ippon… pour accompagner l’Offre d’hébergement Java</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/OaR9jQZYlxw/</link>
		<comments>http://blog.ippon.fr/2013/01/07/de-nouveaux-recrutements-chez-ippon-pour-accompagner-loffre-dhebergement-java/#comments</comments>
		<pubDate>Mon, 07 Jan 2013 17:00:47 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Ippon RH]]></category>
		<category><![CDATA[Le conseil des consultants]]></category>
		<category><![CDATA[Recrutement]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[Devops]]></category>
		<category><![CDATA[emploi]]></category>
		<category><![CDATA[marseille]]></category>
		<category><![CDATA[rh]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7209</guid>
		<description><![CDATA[Administrateur Système Linux / Java / Cloud Vous devrez assurer l&#8217;administration système et réseau courante de notre infrastructure et de celle dédiée à nos clients. Vous serez impliqué dans la résolution de problèmes pointus liés à l&#8217;exploitation de ces infrastructures. En savoir plus à propos de Administrateur Système Linux / Java / Cloud » Experts <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2013/01/07/de-nouveaux-recrutements-chez-ippon-pour-accompagner-loffre-dhebergement-java/">De nouvelles offres d&#8217;emploi chez Ippon&#8230; pour accompagner l&#8217;Offre d&#8217;hébergement Java</a></span>]]></description>
				<content:encoded><![CDATA[<h3><a href="http://www.ippon.fr/offres-d-emploi/-/asset_publisher/Mo85/content/administrateur-systeme-linux-java-cloud?redirect=http%3A%2F%2Fwww.ippon.fr%2Foffres-d-emploi%3Fp_p_id%3D101_INSTANCE_Mo85%26p_p_lifecycle%3D0%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_col_id%3Dcolumn-2%26p_p_col_count%3D2">Administrateur Système Linux / Java / Cloud</a></h3>
<div>
<div>Vous devrez assurer l&#8217;administration système et réseau courante de notre infrastructure et de celle dédiée à nos clients. Vous serez impliqué dans la résolution de problèmes pointus liés à l&#8217;exploitation de ces infrastructures.</div>
<div><a href="http://www.ippon.fr/offres-d-emploi/-/asset_publisher/Mo85/content/administrateur-systeme-linux-java-cloud?redirect=http%3A%2F%2Fwww.ippon.fr%2Foffres-d-emploi%3Fp_p_id%3D101_INSTANCE_Mo85%26p_p_lifecycle%3D0%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_col_id%3Dcolumn-2%26p_p_col_count%3D2">En savoir plus à propos de Administrateur Système Linux / Java / Cloud » </a></div>
</div>
<div></div>
<div></div>
<div>
<div><a id="_101_INSTANCE_Mo85_rhsw" href="http://www.ippon.fr/offres-d-emploi?p_p_auth=SIWC6kBL&amp;p_p_id=15&amp;p_p_lifecycle=0&amp;p_p_state=maximized&amp;p_p_mode=view&amp;p_p_col_id=column-2&amp;p_p_col_count=2&amp;_15_struts_action=%2Fjournal%2Fedit_article&amp;_15_groupId=10226&amp;_15_articleId=36327&amp;_15_version=1.2&amp;_15_redirect=http%3A%2F%2Fwww.ippon.fr%2Foffres-d-emploi%3Fp_p_id%3D101_INSTANCE_Mo85%26p_p_lifecycle%3D0%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_col_id%3Dcolumn-2%26p_p_col_count%3D2"> <img src="http://www.ippon.fr/ippon.fr-theme/images/spacer.png" alt="" /></a></div>
<h3><a href="http://www.ippon.fr/offres-d-emploi/-/asset_publisher/Mo85/content/experts-devops-openstack-java?redirect=http%3A%2F%2Fwww.ippon.fr%2Foffres-d-emploi%3Fp_p_id%3D101_INSTANCE_Mo85%26p_p_lifecycle%3D0%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_col_id%3Dcolumn-2%26p_p_col_count%3D2">Experts DevOps / OpenStack / Java</a></h3>
<div>
<div>Vous mangez du Puppet au p&#8217;tit dej et faites votre 4 heures avec du OpenStack ?<br />
Vous n&#8217;en pouvez plus de la grisaille parisienne et des JVMs qui ne démarrent pas par temps froid ? Venez vous occuper d&#8217;une infrastructure Cloud, sous le soleil de Provence et les pieds dans la Méditerranée.</div>
<div><a href="http://www.ippon.fr/offres-d-emploi/-/asset_publisher/Mo85/content/experts-devops-openstack-java?redirect=http%3A%2F%2Fwww.ippon.fr%2Foffres-d-emploi%3Fp_p_id%3D101_INSTANCE_Mo85%26p_p_lifecycle%3D0%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_col_id%3Dcolumn-2%26p_p_col_count%3D2">En savoir plus à propos de Experts DevOps / OpenStack / Java » </a></div>
</div>
<div></div>
</div>
<div id="aui_3_2_0_1782">
<div></div>
<h3><a href="http://www.ippon.fr/offres-d-emploi/-/asset_publisher/Mo85/content/ingenieur-d-affaires?redirect=http%3A%2F%2Fwww.ippon.fr%2Foffres-d-emploi%3Fp_p_id%3D101_INSTANCE_Mo85%26p_p_lifecycle%3D0%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_col_id%3Dcolumn-2%26p_p_col_count%3D2">Ingénieur d&#8217;Affaires</a></h3>
<div id="aui_3_2_0_1781">
<div id="aui_3_2_0_1780">Vous aimez les challenges ? Voici le nôtre : doubler chaque année notre chiffre d&#8217;affaires de 250K€ pendant 2 années consécutives. Vous n&#8217;en pouvez plus de la grisaille Parisienne ?</div>
<div>Nous cherchons un ingénieur d&#8217;affaires motivé et dynamique pour développer nos activités (solutions d&#8217;hébergement et d&#8217;infogérance).</div>
</div>
<div><a href="http://www.ippon.fr/offres-d-emploi/-/asset_publisher/Mo85/content/ingenieur-d-affaires?redirect=http%3A%2F%2Fwww.ippon.fr%2Foffres-d-emploi%3Fp_p_id%3D101_INSTANCE_Mo85%26p_p_lifecycle%3D0%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_col_id%3Dcolumn-2%26p_p_col_count%3D2">En savoir plus à propos de Ingénieur d&#8217;Affaires » </a></div>
</div>
<div></div>
<div>Et de nombreuses autres opportunités à découvrir sur notre espace recrutement.</div>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/OaR9jQZYlxw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2013/01/07/de-nouveaux-recrutements-chez-ippon-pour-accompagner-loffre-dhebergement-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2013/01/07/de-nouveaux-recrutements-chez-ippon-pour-accompagner-loffre-dhebergement-java/</feedburner:origLink></item>
		<item>
		<title>Les Méthodes Agiles – Définition de l’Agilité</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/hSqyt1MCOoo/</link>
		<comments>http://blog.ippon.fr/2012/12/07/gestion-projet-methodes-agiles/#comments</comments>
		<pubDate>Fri, 07 Dec 2012 08:15:10 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Agilité]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[gestion de projet]]></category>
		<category><![CDATA[nantes]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7154</guid>
		<description><![CDATA[<p>Ippon Technologies revient sur l&#8217;Agile Tour de Nantes&#8230;</p> <p>Notre reporter a été demander aux participants ce qu&#8217;évoque pour eux &#8216;l&#8217;Agilité&#8217;&#8230; Des réponses aussi riches et personnelles que surprenantes!</p> <p></p> ]]></description>
				<content:encoded><![CDATA[<p>Ippon Technologies revient sur l&#8217;Agile Tour de Nantes&#8230;</p>
<p>Notre reporter a été demander aux participants ce qu&#8217;évoque pour eux &#8216;l&#8217;Agilité&#8217;&#8230; Des réponses aussi riches et personnelles que surprenantes!</p>
<p><iframe frameborder="0" height="360" src="http://www.youtube.com/embed/Uun_dQ16JTA" width="640"></iframe></p>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/hSqyt1MCOoo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2012/12/07/gestion-projet-methodes-agiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2012/12/07/gestion-projet-methodes-agiles/</feedburner:origLink></item>
		<item>
		<title>Business – Ippon Technologies acquiert Atomes et renforce son offre Cloud</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/wK-Y47WGZBQ/</link>
		<comments>http://blog.ippon.fr/2012/12/05/ippon-technologies-acquiert-atomes-et-renforce-son-offre-cloud/#comments</comments>
		<pubDate>Wed, 05 Dec 2012 07:50:49 +0000</pubDate>
		<dc:creator>Geoffray GRUEL</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Devops]]></category>
		<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[acquisition]]></category>
		<category><![CDATA[atomes]]></category>
		<category><![CDATA[hébergement]]></category>
		<category><![CDATA[hybride]]></category>
		<category><![CDATA[serveur]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7131</guid>
		<description><![CDATA[<p>Nous n&#8217;avons pas pour habitude d&#8217;utiliser le blog pour des news business mais celle-ci mérite un billet dans cette arène technique car Ippon Technologies vient d&#8217;acquérir un hébergeur spécialisé Java, pour renforcer ses offres Run, Cloud et Devops.</p> <p>Le choix d’Ippon Technologies s’est naturellement porté sur Atomes &#8211; http://www.atomes.com -, l’hébergeur Java de référence en <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2012/12/05/ippon-technologies-acquiert-atomes-et-renforce-son-offre-cloud/">Business &#8211; Ippon Technologies acquiert Atomes et renforce son offre Cloud</a></span>]]></description>
				<content:encoded><![CDATA[<p>Nous n&#8217;avons pas pour habitude d&#8217;utiliser le blog pour des news business mais celle-ci mérite un billet dans cette arène technique car Ippon Technologies vient d&#8217;acquérir un hébergeur spécialisé Java, pour renforcer ses offres Run, Cloud et Devops.</p>
<div>
<p>Le choix d’Ippon Technologies s’est naturellement porté sur Atomes &#8211; <a title="Atomes" href="http://www.atomes.com/accueil" target="_blank">http://www.atomes.com</a> -, l’hébergeur Java de référence en France, qui dispose d’une expertise logicielle Java / JVM en plus de l’expertise système / matériel / réseau. C’est aussi le fruit d’une collaboration de plus de 4 ans entre les deux entreprises, qui ont déjà plusieurs succès en commun à leurs actifs : CCIP, Carrefour, Dhatim, Groupe La Poste, Intellinium&#8230;,sur des applications Java critiques avec des solutions intégrées telles que Liferay ou Alfresco.</p>
<div>
<p>Atomes est le spécialiste de l’hébergement et de l’infogérance d’applications Java EE en France. La société gère les infrastructures nécessaires à la mise en ligne d’applications Java EE critiques. Depuis 2007, Atomes accompagne ses clients dans le cycle d’exploitation de leurs services : conception, installation, paramétrage, exploitation, réversibilité.</p>
<p>L’une de ses forces d&#8217;Atomes réside dans la lecture critique d’une «Stack-Trace» : en cas d’incident de production, cette expertise fait toute la différence avec un hébergeur classique car en plus d’une résolution rapide de l’incident, ses experts apportent une réponse qualifiée aux équipes de développement.<br />
Atomes dispose par ailleurs d’une infrastructure de haut niveau : Datacenters de tiers III et tiers IV, Cloud privé OpenStack et Xen Cloud Platform, provisioning d’infrastructures Puppet, monitoring de dernière génération, haute-disponibilité, PRA et sécurité.</p>
</div>
<p>Dès aujourd’hui, Atomes porte l’offre Devops, Run et Cloud au sein du groupe Ippon Technologies, proposant ainsi à nos clients :</p>
<ul>
<li>Des services d’hébergement à la demande : virtualisé, dédié, cloud privé, cloud public,</li>
<li>Des services d’infogérance 24/7,</li>
<li>Des services de conseil sur les sujets Run, Devops et Cloud.</li>
</ul>
<p>Ippon Technologies va donc attaquer 2013 avec :</p>
<ul>
<li>Une offre front renforcée par <a href="http://www.ippon-mobile.fr/" target="_blank">Ippon Mobile</a>,</li>
<li>Une offre back solide qui est le point fort historique d&#8217;Ippon et que nous avons pu renforcer avec par exemple un <a href="http://tatami.ippon.fr/tatami/presentation" target="_blank">Tatami</a> déployé en SaaS sur Cassandra,</li>
<li>Une offre hébergement et cloud renforcée par <a href="http://www.atomes.com/accueil" target="_blank">Atomes</a>.</li>
<li>Nos offres Agile et Devops (avec des inputs Ippon et Atomes) qui viennent soutenir tous ces projets.</li>
</ul>
<p>Cette couverture du cycle complet en Java va permettre à Ippon Technologies de se positionner en tant que partenaire &#8220;end to end&#8221; des projets critiques de nos clients en 2013. Nous pouvons nous engager du Design jusqu&#8217;au Run avec une offre 100% Ippon et des garanties fortes en terme de &#8220;Time To Market&#8221;.</p>
<p>Vous verrez donc au fil des semaines de nouveaux articles sur le blog sur des sujets Cloud et Devops autour de Puppet, Xen ou OpenStack.</p>
<p>Si vous souhaitez de plus amples informations sur cette offre n&#8217;hésitez pas à nous contacter :</p>
<ul>
<li>Business : Geoffray Gruel &#8211; ggruel(at)ippon.fr</li>
<li>Technique : Yann Vigara &#8211; yvigara(at)atomes.com</li>
</ul>
</div>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/wK-Y47WGZBQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2012/12/05/ippon-technologies-acquiert-atomes-et-renforce-son-offre-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2012/12/05/ippon-technologies-acquiert-atomes-et-renforce-son-offre-cloud/</feedburner:origLink></item>
		<item>
		<title>Ippevent Mobilité – Applications mobiles – ouverture des inscriptions</title>
		<link>http://feedproxy.google.com/~r/LeBlogDesExpertsJ2ee/~3/GcJYERHTfoQ/</link>
		<comments>http://blog.ippon.fr/2012/12/03/ippevent-mobilite-applications-mobiles-ouverture-des-inscriptions/#comments</comments>
		<pubDate>Mon, 03 Dec 2012 17:00:05 +0000</pubDate>
		<dc:creator>Communication Ippon Technologies</dc:creator>
				<category><![CDATA[Expertise Java]]></category>
		<category><![CDATA[Ippevents]]></category>
		<category><![CDATA[Mobilité]]></category>
		<category><![CDATA[application mobile]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[Ippevent]]></category>
		<category><![CDATA[POC]]></category>

		<guid isPermaLink="false">http://blog.ippon.fr/?p=7143</guid>
		<description><![CDATA[ <p>Ippon Technologies vous accueille le Jeudi 20 décembre 2012 à partir de 19h00 pour une soirée Mobile First dans les locaux d&#8217;Ippon Technologies.</p> <p>Les consultants mobiles d&#8217;Ippon reviennent sur les grands projets qui ont rythmé l&#8217;année.</p> <p>Vous découvrirez des projets sous iOs, Android&#8230; Des applications natives et hybrides&#8230; Un socle d&#8217;architecture&#8230;.le tout appliqué au <span style="color:#777"> . . . &#8594; Lire la suite: <a href="http://blog.ippon.fr/2012/12/03/ippevent-mobilite-applications-mobiles-ouverture-des-inscriptions/">Ippevent Mobilité &#8211; Applications mobiles &#8211; ouverture des inscriptions</a></span>]]></description>
				<content:encoded><![CDATA[<div style="width: 100%; text-align: left;">
<p>Ippon Technologies vous accueille <strong>le Jeudi 20 décembre 2012 à partir de 19h00</strong> pour une soirée Mobile First dans les locaux d&#8217;Ippon Technologies.</p>
<p>Les consultants mobiles d&#8217;Ippon reviennent sur les grands projets qui ont rythmé l&#8217;année.</p>
<p>Vous découvrirez des projets sous iOs, Android&#8230; Des applications natives et hybrides&#8230; Un socle d&#8217;architecture&#8230;.le tout appliqué au secteur des médias, de centres commerciaux et à l&#8217;environnement bancaire.</p>
<p><strong>Programme de la soirée :</strong></p>
<p>- <strong>&#8220;Le développement natif iOS versus développement d&#8217;application mobile hybride&#8221;</strong> par Nicolas Guillot, consultant mobile.</p>
<p><a title="site information judopro" href="http://www.judopro.fr/" target="_blank">Judopro</a> est à la fois une application native (iPad) et hybride (Android). Il vous présentera les principaux écueils rencontrés. Pour finir, il effectuera un comparatif des deux techniques de développement.</p>
<p>- <strong>&#8220;L&#8217;adaptation des services métiers pour le développement mobile&#8221;</strong> par Lorys Pognon, architecte mobile.</p>
<p>Lorys s&#8217;appuyera sur un projet de mise en place de l&#8217;architecture d’un socle pour les futurs développements sous iOS pour un environnement bancaire</p>
<p>- <strong>&#8220;Application iOs de services au sein des centres commerciaux&#8221;</strong> par Raphaël Despinasse, Scrum Master.</p>
<p>Les 3 interventions seront suivies d&#8217;un buffet pour continuer à échanger dans un cadre Encore plus convivial.</p>
</div>
<div style="width: 100%; text-align: left;"><iframe frameborder="0" height="214" marginheight="5" marginwidth="5" scrolling="auto" src="http://www.eventbrite.com/tickets-external?eid=4964954312&amp;ref=etckt&amp;v=2" width="100%"></iframe></div>
<div style="font-family: Helvetica, Arial; font-size: 10px; padding: 5px 0 5px; margin: 2px; width: 100%; text-align: left;"><a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.com/r/etckt" target="_blank">Vendre des billets en ligne</a> <span style="color: #ddd;">à travers</span> <a style="color: #ddd; text-decoration: none;" href="http://www.eventbrite.com?ref=etckt" target="_blank">Eventbrite</a></div>
<div style="font-family: Helvetica, Arial; font-size: 10px; padding: 5px 0 5px; margin: 2px; width: 100%; text-align: left;">
<p><strong>L&#8217;essentiel </strong></p>
<p>Ippevent &#8211; Retour d&#8217;expérience Applications Mobiles</p>
<p>Date : Jeudi 20 décembre 2012</p>
<p>Heure : 19h00 &#8211; 22h00</p>
<p>Lieu : Ippon Technologies &#8211; 90 rue Baudin, Levallois Perret</p>
<p>Comment venir : Métro Pont de Levallois (l.3) &#8211; Transilien Clichy Levallois</p>
<p>Des questions ? marketing@ippon.fr</p>
<p>Suivez-nous : <a title="twitter ippon technologies" href="https://twitter.com/ippontech" target="_blank">@ippontech</a> &#8211; <a title="blog ippon technologies" href="http://blog.ippon.fr/" target="_blank">http://blog.ippon.fr/</a> &#8211; <a title="Ippon Mobile" href="http://www.ippon-mobile.fr/" target="_blank">www.ippon-mobile.fr</a></p>
</div>
<!-- Start Shareaholic ClassicBookmarks Automatic --><!-- End Shareaholic ClassicBookmarks Automatic --><img src="http://feeds.feedburner.com/~r/LeBlogDesExpertsJ2ee/~4/GcJYERHTfoQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ippon.fr/2012/12/03/ippevent-mobilite-applications-mobiles-ouverture-des-inscriptions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ippon.fr/2012/12/03/ippevent-mobilite-applications-mobiles-ouverture-des-inscriptions/</feedburner:origLink></item>
	</channel>
</rss>
