<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/category/java/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Thu, 13 Feb 2014 16:40:38 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://blog.infine.com/wp-content/uploads/2021/03/cropped-vignette-32x32.png</url>
	<title>Java - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Java Mission Control : l&#8217;outil qu&#8217;il manquait</title>
		<link>https://blog.infine.com/java-mission-control-loutil-quil-manquait-2651?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java-mission-control-loutil-quil-manquait</link>
					<comments>https://blog.infine.com/java-mission-control-loutil-quil-manquait-2651#comments</comments>
		
		<dc:creator><![CDATA[tristan]]></dc:creator>
		<pubDate>Wed, 16 Oct 2013 16:59:51 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=2651</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">2</span> <span class="rt-label rt-postfix">min.</span></span> La nouvelle est passée presque inaperçue : Java Mission Controlest disponible dans le JDK7 u40. Tous ceux qui sont confrontés à des problématiques de performance ou d'optimisation au sein de leur application java vont apprécier ...</p>
<p>The post <a href="https://blog.infine.com/java-mission-control-loutil-quil-manquait-2651">Java Mission Control : l’outil qu’il manquait</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">2</span> <span class="rt-label rt-postfix">min.</span></span><p>La nouvelle est passée presque inaperçue : <a href="http://www.oracle.com/technetwork/java/javase/2col/jmc-relnotes-2004763.html">Java Mission Control</a> est disponible dans le JDK7 u40. Tous ceux qui sont confrontés à des problématiques de performance ou d&#8217;optimisation au sein de leur application java vont apprécier</p>
<p><span id="more-2651"></span>: Ils avaient jusqu&#8217;à présent le choix entre le profiler intégré dans leur IDE préféré, ou des outils commerciaux du genre jProfiler, YouKit etc&#8230; L&#8217;inconvénient majeur ces outils est leur impact sur le programme monitoré, que ce soit sur la rapidité d&#8217;exécution et/ou leur taille mémoire.</p>

<a href='https://blog.infine.com/wp-content/uploads/2013/10/dashborad1.png' class="fancyboxgroup" rel="gallery-2651"><img decoding="async" width="150" height="150" src="https://blog.infine.com/wp-content/uploads/2013/10/dashborad1-150x150.png" class="attachment-thumbnail size-thumbnail" alt="" /></a>
<a href='https://blog.infine.com/wp-content/uploads/2013/10/calltree.png' class="fancyboxgroup" rel="gallery-2651"><img decoding="async" width="150" height="150" src="https://blog.infine.com/wp-content/uploads/2013/10/calltree-150x150.png" class="attachment-thumbnail size-thumbnail" alt="" /></a>
<a href='https://blog.infine.com/wp-content/uploads/2013/10/hotspots.png' class="fancyboxgroup" rel="gallery-2651"><img decoding="async" width="150" height="150" src="https://blog.infine.com/wp-content/uploads/2013/10/hotspots-150x150.png" class="attachment-thumbnail size-thumbnail" alt="" /></a>
<a href='https://blog.infine.com/wp-content/uploads/2013/10/Capture-du-2013-10-16-115505.png' class="fancyboxgroup" rel="gallery-2651"><img loading="lazy" decoding="async" width="150" height="150" src="https://blog.infine.com/wp-content/uploads/2013/10/Capture-du-2013-10-16-115505-150x150.png" class="attachment-thumbnail size-thumbnail" alt="" /></a>

<p>Java Mission Control est outil qui était déjà disponible depuis longtemps sur JRockit. Comme jvisualvm il permet de suivre les informations classiques de la jvm (cpu, mémoire, gc, mbeans, threads &#8230;). La valeur ajoutée est sur les fonctions de profiling  : On y retrouve les toutes les fonctions des profilers classiques (cpu, mémoire), avec un impact beaucoup (!) plus faible (moins de 2% selon oracle) que les profilers classiques. Cerise sur le gâteau, si vous utilisez Java sur solaris, il y a un plugin avec Dtrace ce qui permet d&#8217;avoir une vision à la fois applicative  de l&#8217;application, mais également de son impact sur le système. Pour profiter de jmc, il faut tout de même ajouter sur la ligne de commande de la jvm</p>
<p><code>-XX:+UnlockCommercialFeatures -XX:+FlightRecorder</code></p>
<p>Pour conclure, les développeurs java n&#8217;ont plus l&#8217;excuse du &#8220;je ne peux pas profiler le serveur d&#8217;app parceque ça trop sur mon pc&#8221; car ils disposent désormais d&#8217;un outil pour optimiser une application. Pour ceux qui ont accès à la prod et qui doivent investiguer l&#8217;origine des problèmes de performance ou de stabilité, c&#8217;est un nouvel outil qui n&#8217;a pas d&#8217;équivalent : On vient de dépanner un client (site internet 10 frontaux jetty/spring/jsf) qui avait un problème récurrent de memory leak sur son appli. On a observé une instance de son appli (relativement 60% cpu et heap de 2Go avec beaucoup de phases de gc) avec jmc et trouvé le problème rapidement, là ou c&#8217;était impossible avec les outils traditionnels à cause de leur impact sur les performances.</p>
<p>A mettre d&#8217;urgence entre toutes les mains &#8230;</p><p>The post <a href="https://blog.infine.com/java-mission-control-loutil-quil-manquait-2651">Java Mission Control : l’outil qu’il manquait</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/java-mission-control-loutil-quil-manquait-2651/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>infine@Devoxx : Javascript pour les javamen</title>
		<link>https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=infinedevoxx-javascript-pour-les-javamen</link>
					<comments>https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636#respond</comments>
		
		<dc:creator><![CDATA[Antoine]]></dc:creator>
		<pubDate>Tue, 23 Apr 2013 08:58:17 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript java devoxx]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=2636</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">&#60; 1</span> <span class="rt-label rt-postfix">min.</span></span> Lors de devoxx 2013, Florian nous à fait une présentation dont le succès (la plus grande salle pleine à craquer) montre à quel point javascript  avec lequel tout le monde à &#8220;joué&#8221;, reste méconnu par une grande majorité de javamen. Pourtant avec l&#8217;émergence des derniers frameworks javascript (angular, ember, backbone, knockout &#8230;), on ne peut &#8230;</p>
<p>The post <a href="https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636">infine@Devoxx : Javascript pour les javamen</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">&lt; 1</span> <span class="rt-label rt-postfix">min.</span></span><p><img loading="lazy" decoding="async" class="wp-image-2638 alignleft" style="margin-left: 20px; margin-right: 20px;" title="florian_devoxx" src="https://blog.infine.com/wp-content/uploads/2013/04/florian_devoxx1-300x225.jpg" alt="" width="300" height="225" srcset="https://blog.infine.com/wp-content/uploads/2013/04/florian_devoxx1-300x225.jpg 300w, https://blog.infine.com/wp-content/uploads/2013/04/florian_devoxx1-1024x768.jpg 1024w, https://blog.infine.com/wp-content/uploads/2013/04/florian_devoxx1.jpg 1280w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>Lors de devoxx 2013, Florian nous à fait une présentation dont le succès (la plus grande salle pleine à craquer) montre à quel point javascript  avec lequel tout le monde à &#8220;joué&#8221;, reste méconnu par une grande majorité de javamen. Pourtant avec l&#8217;émergence des derniers frameworks javascript (angular, ember, backbone, knockout &#8230;), on ne peut plus faire l&#8217;économie de vraiment se mettre à javascript. Même google avec la mise à l&#8217;écart de GWT, mise sur le développement natif du côté client, qu&#8217;il soit dart ou javascript avec angular &#8230;</p>
<p>Florian, javaman qui s&#8217;est mis à javascript,  aborde lors de cette présentation les pièges qui nous guettent.</p>
<p><a href="http://parleys.com/play/51572cf7e4b0ffdd7e058b28/chapter0/about">http://parleys.com/play/51572cf7e4b0ffdd7e058b28/chapter0/about</a></p>
<iframe loading="lazy" src="https://www.slideshare.net/slideshow/embed_code/17918206" width="600" height="489" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><p>The post <a href="https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636">infine@Devoxx : Javascript pour les javamen</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Calcul de VWAP avec Hadoop en StandAlone</title>
		<link>https://blog.infine.com/calcul-de-vwap-avec-hadoop-en-standalone-2214?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=calcul-de-vwap-avec-hadoop-en-standalone</link>
					<comments>https://blog.infine.com/calcul-de-vwap-avec-hadoop-en-standalone-2214#comments</comments>
		
		<dc:creator><![CDATA[Jonathan Blaisius]]></dc:creator>
		<pubDate>Mon, 12 Nov 2012 09:00:45 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[BigData]]></category>
		<category><![CDATA[GridComputing]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[Vwap]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=2214</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">6</span> <span class="rt-label rt-postfix">min.</span></span> Hadoop dans les grandes lignes  Hadoop est un framework java destiné à faciliter la création d&#8217;applications distribuées et scalables. Il permet aux applications de travailler avec des milliers de nœuds et des pétaoctets de données. Hadoop repose sur son système de fichier (HDFS) ainsi que sur son algorithme de Map/Reduce. Généralement, tous les tutoriaux ou exemples &#8230;</p>
<p>The post <a href="https://blog.infine.com/calcul-de-vwap-avec-hadoop-en-standalone-2214">Calcul de VWAP avec Hadoop en StandAlone</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">6</span> <span class="rt-label rt-postfix">min.</span></span><h1></h1>
<h1><strong>Hadoop dans les grandes lignes </strong></h1>
<p><strong><img loading="lazy" decoding="async" class="alignleft" src="http://hadoop.apache.org/images/hadoop-logo.jpg" alt="" width="300" height="71" /></strong></p>
<p>Hadoop est un framework java destiné à faciliter la création d&#8217;applications distribuées et scalables. Il permet aux applications de travailler avec des milliers de nœuds et des pétaoctets de données.</p>
<p>Hadoop repose sur son système de fichier (HDFS) ainsi que sur son algorithme de Map/Reduce.</p>
<p>Généralement, tous les tutoriaux ou exemples d’implémentation d’Hadoop concernent un calcul basique de calcul du nombre de différents mots contenu dans des fichiers.</p>
<p>Dans cet article, je vais m’attacher à vous présenter un cas concret d’utilisation d’Hadoop pour le calcul de VWAP.</p>
<p><strong> </strong></p>
<h1>Qu&#8217;est ce qu&#8217;une VWAP et pourquoi utiliser Hadoop pour la calculer ?</h1>
<p>La VWAP (Volume-weighted average price) est un indice financier correspondant au ratio de la valeur échangée par le volume échangé. <a title="Vwap" href="http://en.wikipedia.org/wiki/Volume-weighted_average_price">Plus d&#8217;info ici</a></p>
<p>Notre but est de calculer la VWAP pour tous les titres, sur tout l&#8217;historique disponible à des heures données.</p>
<p><span id="more-2214"></span></p>
<p>Les fichiers historiques sont de la forme txt. Il y a un fichier par jour, ce fichier pèse en moyenne 1GigaOctet. Donc selon la taille de notre historique, ce calcul peut s&#8217;avérer très fastidieux et couteux en ressources.</p>
<p>Voici à quoi ressemble un fichier en entrée (enfin une infime partie) :</p>
<p><span style="font-size: x-small">C;FR0000130338;09:00:03;3;310;24.6;50;24.5</span><br />
<span style="font-size: x-small">C;FR0000130338;09:00:03;4;231;24.62;665;24.4</span><br />
<span style="font-size: x-small">C;FR0000130338;09:00:03;5;686;24.63;309;24.37</span><br />
<span style="font-size: x-small">C;BE0003796134;09:00:03;1;3360;4.51;5306;4.5</span><br />
<span style="font-size: x-small">N;FR0000120222;09:00:00;00000042;67.99</span><br />
<span style="font-size: x-small">N;FR0000120222;09:00:00;00000019;67.99</span><br />
<span style="font-size: x-small">N;FR0000120222;09:00:00;00000012;67.99</span><br />
<span style="font-size: x-small">N;FR0000120222;09:00:00;00000002;67.99</span><br />
<span style="font-size: x-small">N;FR0000120222;09:00:00;00000041;67.99</span></p>
<p>En séparant par &#8220;;&#8221;</p>
<ol>
<li>C ou N, C pour carnet d&#8217;ordre N pour une transaction</li>
<li>Code ISIN du titre</li>
<li>Heure de la transaction</li>
<li>Volume de titres échangés</li>
<li>Prix</li>
</ol>
<p>Hadoop va donc être utilisé pour ces fonctionnalitées de calcul distribués afin de répartir la charge de parsing et calcul sur différentes machines et tout aggréger pour donner en sortie un fichier avec les vwap demandées.</p>
<p>Voici un extrait du fichier de sortie :</p>
<p><span style="font-size: x-small">FR0010112524-20100104-09:00:00     25.656256</span><br />
<span style="font-size: x-small"> FR0010112524-20100104-12:00:00     26.125364</span><br />
<span style="font-size: x-small"> FR0010112524-20100104-17:00:00     26.28817</span><br />
<span style="font-size: x-small"> FR0010112524-20100106-09:00:00     26.560003</span><br />
<span style="font-size: x-small"> FR0010112524-20100106-12:00:00     26.684067</span><br />
<span style="font-size: x-small"> FR0010112524-20100106-17:00:00     26.756487</span><br />
<span style="font-size: x-small"> FR0010112524-20100217-09:00:00     25.949999</span></p>
<h1><strong>Implémentation d&#8217;Hadoop pour un calcul de VWAP</strong></h1>
<p>En entrée, on a donc toute une série de fichiers txt. Chaque fichier correspond aux extractions Euronext des transactions d’un jour donné.</p>
<p>Seules les lignes commençant par «N;» nous intéressent, les autres correspondant aux carnets d’ordre.</p>
<p>Au niveau du Mapper, nous allons extraire toutes les lignes commençant par «N;» pour un ou plusieurs code ISIN donnés.</p>
<p>Dans le Reducer, on va vouloir récupérer toutes les lignes correspondant à notre/nos ISIN triées par jour puis heure afin de calculer la Vwap pour les heures données. Or Hadoop ne permet pas de trier directement la liste de &lt;Values&gt; reçue par le Reducer</p>
<h1></h1>
<h1><strong>Tri des &lt;Values&gt; grâce à une clé composite</strong></h1>
<p>Avec Hadoop il est impossible d’effectuer un tri sur les valeurs. Par contre, à la place on peut placer les données qu’on veut trier dans la clé et ainsi utiliser une clé composite. Ensuite on utilise une classe de Partition spécifique ainsi que deux classes RawComparator afin de trier et partitionner notre map en sortie correctement.</p>
<p>La solution est d’utiliser un système de clé composite, dans notre exemple, je la nomme <strong>IsinKey</strong>.</p>
<p>L&#8217;objet IsinKey sera utilisé comme la <strong>Clé</strong> et contient :</p>
<ul>
<li>Une String key qui est la concaténation de l’ISIN puis du jour de l’extraction (par exemple : FR0010112524-20120913)</li>
<li>Une String hour qui correspond à l’heure d’une transaction</li>
</ul>
<p>Un objet <strong>Tick</strong> sera lui utilisé comme <strong>Valeur</strong> pour stocker le volume et le prix.</p>
<p>Ensuite, il va nous falloir définir 3 réglages dans le JobConf d’Hadoop :</p>
<ul>
<li>setPartitionerClass</li>
<li>setOutputValueGroupingComparator</li>
<li>setOutputKeyComparatorClass</li>
</ul>
<h2><strong>Le Partitioner</strong></h2>
<p>La première classe qu’on doit setter étend de org.apache.hadoop.mapred.Partitioner. Cette classe a pour unique fonction de déterminer dans quelle partition notre map de sortie doit aller. On ne peut aller en dessous de 0 ou au dessus de numPartitions -1 dans notre retour. En général il est préférable de récupérer le HashCode d’une partie de la Clé et d’y appliquer un modulo du nombre de partitions.</p>
<p>Dans notre exemple, on récupère le hashcode de notre Clé qu’on module ensuite avec le numPartitions.</p>
<pre class="brush: java; title: ; notranslate">public int getPartition(IsinKey key, Tick val, int numPartitions) {
   int hash = key.getKey().hashCode();
   return hash % numPartitions;
}</pre>
<h2><strong>L&#8217; Output Value Grouping Comparator</strong></h2>
<p>L’OutputValueGroupingComparator dans les paramètres du JobConf utilise un org.apache.hadoop.io.RawComparator. Le RawComparator est utilisé pour déterminer dans quel Reducer notre ligne de sortie de mapping doit aller. Ce RawComparator ne trie pas la liste de Valeurs du Reducer, mais trie l’entrée du Reducer,  pour que le Reducer sache quand un nouveau groupe commence.</p>
<p>Dans notre exemple, le grouping comparator va trier par la «Key» de notre object IsinKey (c’est a dire «Isin-date»</p>
<pre class="brush: java; title: ; notranslate">public int compare(WritableComparable w1, WritableComparable w2) {
   IsinKey k1 = (IsinKey)w1;
   IsinKey k2 = (IsinKey)w2;
   return k1.getKey().compareTo(k2.getKey());
}</pre>
<h2><strong>L’ Output Key Comparator</strong></h2>
<p>L’outputKeyComparatorClass dans les paramètre du JobConf utilise aussi un org.apache.hadoop.io.RawComparator. Ce RawComparator est utilisé pour trier les Clés que reçoit le Reducer. Les données envoyées au comparateur sont nos objets clés (IsinKey dans notre exemple). Il est très important aussi de retenir que le KeyComparator doit comprendre la règle définie dans l’OutputValueComparator.</p>
<p>Dans notre exemple, ça veut dire qu’on va d’abord comparer la Key de l’objet IsinKey, puis, si ces Key sont égales, alors on va comparer les champs Hours de l’objet IsinKey.</p>
<pre class="brush: java; title: ; notranslate">public int compare(WritableComparable w1, WritableComparable w2) {
   IsinKey k1 = (IsinKey)w1;
   IsinKey k2 = (IsinKey)w2;
   SimpleDateFormat f = new SimpleDateFormat(&quot;HH:mm:ss&quot;);
   int result = k1.getKey().compareTo(k2.getKey());

   if(0 == result) {
      try {
         result = f.parse(k1.getDate()).compareTo(f.parse(k2.getDate()));
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
return result;
}</pre>
<p>Grâce à ces trois classes redéfinies, le Reducer sera appelé une fois par clé IsinDate, puis lorsque l’on itère sur les «values», l’heure de la «Key» prend successivement ses différentes valeurs, ce qui nous permet  de déterminer la vwap à chaque tick, et de repartir à 0 pour chaque nouvelle journée</p>
<h1></h1>
<h1>Lancement en “Stand-Alone” et reste des classes</h1>
<p>Afin de démarrer le projet en mode «Stand-Alone», il suffit d’inclure les sources d’hadoop dans un projet eclipse par exemple, puis d’inclure ce projet dans le projet courant.</p>
<h2>CalcVWAPDriver</h2>
<pre class="brush: java; title: ; notranslate">public class CalcVWAPDriver {
   public static void main(String&#x5B;] args) throws IOException, InterruptedException, ClassNotFoundException {

      Configuration conf = new Configuration();
      GenericOptionsParser parser = new GenericOptionsParser(conf, args);
      args = parser.getRemainingArgs();
      conf.setStrings(&quot;ISIN&quot;, &quot;FR0010112524&quot;);
      conf.setStrings(&quot;DATES&quot;, &quot;09:00:00&quot;, &quot;12:00:00&quot;, &quot;17:00:00&quot;);
      Job job = new Job(conf, &quot;calcVWAP&quot;);
      job.setPartitionerClass(NaturalKeyPartitioner.class);
      job.setGroupingComparatorClass(NaturalKeyGroupingComparator.class);
      job.setSortComparatorClass(CompositeKeyComparator.class);
      job.setMapOutputKeyClass(IsinKey.class);
      job.setMapOutputValueClass(Tick.class);
      job.setInputFormatClass(TextInputFormat.class);
      job.setOutputFormatClass(TextOutputFormat.class);
      job.setMapperClass(CalcVWAPMapper.class);
      job.setReducerClass(CalcVWAPReducer.class);
      FileInputFormat.setInputPaths(job, new Path(args&#x5B;0]));
      FileOutputFormat.setOutputPath(job, new Path(args&#x5B;1]));
      System.out.println(job.waitForCompletion(true));
   }
}</pre>
<p>Dans l&#8217;exemple, on attribue en dur des valeurs ISIN et DATES dans la configuration d&#8217;Hadoop (lignes 7 et 8) afin d&#8217;y avoir accès dans le Mapper et le Reducer. Il est tout à fait envisageable de le rendre paramétrable avec les arguments passés à la méthode main.</p>
<h2>CalcVWAPMapper</h2>
<pre class="brush: java; title: ; notranslate">public class CalcVWAPMapper extends Mapper&lt;LongWritable, Text, IsinKey, Tick&gt; {
   private String currFile = null;
   private String currDate = null;
   private String currHour = null;
   private String currIsin = null;
   private List&lt;String&gt; isins = null;

   public String getFileName(Context context) {
      FileSplit fileSplit = (FileSplit)context.getInputSplit();
      return fileSplit.getPath().getName().toString();
   }

   protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
      if (!getFileName(context).equals(currFile)) {
         currFile = getFileName(context);
         currDate = currFile.replace(&quot;.txt&quot;, &quot;&quot;);
      }
      if (isins == null) {
         isins = Arrays.asList(context.getConfiguration().getStrings(&quot;ISIN&quot;));
      }

      String line = value.toString();
      if (line.startsWith(&quot;N;&quot;)) {
         String&#x5B;] result = line.split(&quot;;&quot;);
         if (result.length &gt;= 5) {
            if (isins.contains(result&#x5B;1])) {
               if (!result&#x5B;1].equals(currIsin)) {
                  currIsin = result&#x5B;1];
               }
               if (!result&#x5B;2].equals(currHour)) {
                  currHour = result&#x5B;2];
               }
               String volume = result&#x5B;3];
               String price = result&#x5B;4];
               context.write(new IsinKey(currIsin+&quot;-&quot;+currDate, currHour), new Tick(volume, price));
            }
         }
      }
   }
}</pre>
<p>Le Mapper est assez simple. Si ce n&#8217;est pas déjà fait, on prend le nom du fichier traité afin d&#8217;en extraire la date. Puis pareil, on récupère la liste d&#8217;ISIN entrée  en paramètre dans la JobConf Hadoop. (lignes 14 à 20)</p>
<p>Ensuite, on lit ligne par ligne le fichier. Si la ligne commence par &#8220;N;&#8221; alors on la split (lignes 23 et 24). L&#8217;Isin est la deuxième partie, l&#8217;heure la troisième, tandis que le volume et le prix sont respectivement les quatrièmes et cinquièmes parties.</p>
<p>Enfin, on écrit dans le context nos objets. D&#8217;un côté, la <strong>Clé </strong>composé de l&#8217;Isin-Date et de l&#8217;heure, et de l&#8217;autre côté la <strong>Valeur</strong> qui est composé du volume et du prix. (ligne 35)</p>
<h2>CalcVWAPReducer</h2>
<pre class="brush: java; title: ; notranslate">public class CalcVWAPReducer extends Reducer&lt;IsinKey, Tick, IsinKey, OutputVWAP&gt; {

   private String isin = null;
   private float vwap = 0.0f;
   private long totalVolume = 0;
   private List&lt;Date&gt; hoursList = null;
   private SimpleDateFormat f = new SimpleDateFormat(&quot;HH:mm:ss&quot;);

   protected void reduce(IsinKey key, Iterable&lt;Tick&gt; values, Context context) throws IOException, InterruptedException {
      IsinKey lastKey = null;
      OutputVWAP lastOutput = null;
      int currIdx = 0;

      if (hoursList == null) {
         hoursList = new ArrayList&lt;Date&gt;();
         String &#x5B;]dates = context.getConfiguration().getStrings(&quot;DATES&quot;);
         for (int i = 0; i &lt; dates.length; i++) {
            try {
               hoursList.add(f.parse(dates&#x5B;i]));
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      }

      for (Tick value : values) {
         try {
            if (currIdx &gt;= hoursList.size()) {
               return;
            }
            if (f.parse(key.getDate()).after(hoursList.get(currIdx))) {
               context.write(lastKey, lastOutput);
               if (currIdx &lt; hoursList.size()-1) {
                  currIdx++;
               } else {
                  return;
               }
            }
            Float price = Float.parseFloat(value.getPrice());
            Integer volume = Integer.parseInt(value.getVolume());
            vwap = (volume * price + totalVolume * vwap)
               / (totalVolume + volume);
            totalVolume += volume;

            lastKey = new IsinKey(key.getKey(), f.format(hoursList.get(currIdx)));
            lastOutput = new OutputVWAP(vwap);
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
   context.write(lastKey, lastOutput);
   }
}</pre>
<p>Pour le Reducer, dans un premier temps, on récupère les heures rentrés dans la configuration d&#8217;hadoop (lignes 14 à 24). Le but est d&#8217;écrire en sortie la vwap pour les heures voulues et ordonnées.</p>
<p>Puis on itère sur les &lt;Values&gt;. A chaque itération on calcule la vwap et on stocke le retour. (lignes 26 à 50)</p>
<p>Si à l&#8217;itération d&#8217;après l&#8217;heure de la clé dépasse l&#8217;heure en paramètre, alors on écrit la dernière vwap calculé dans le context. Puis on passe à l&#8217;heure d&#8217;après en paramètre. Une fois qu&#8217;on a traité toutes les heures voulues, on sort de la méthode. (lignes 28 à 38)</p>
<p>Vous pouvez récupérer les sources complètes sur le <a href="https://github.com/InfineHub/VWAP-Hadoop">GitHub Infine</a></p>
<h1>Conclusion</h1>
<p>Nous avons donc vu comment calculer les vwap en utilisant le framework Hadoop en mode Stand-Alone.<br />
Mais la où Hadoop tire toute sa puissance, c&#8217;est dans la parallélisation et le clustering.<br />
Je vous montrerai donc dans un prochain article comment monter, configurer et utiliser un cluster avec Hadoop.</p><p>The post <a href="https://blog.infine.com/calcul-de-vwap-avec-hadoop-en-standalone-2214">Calcul de VWAP avec Hadoop en StandAlone</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/calcul-de-vwap-avec-hadoop-en-standalone-2214/feed</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Conseils à un jeune développeur Java</title>
		<link>https://blog.infine.com/conseils-a-un-jeune-developpeur-java-2133?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=conseils-a-un-jeune-developpeur-java</link>
					<comments>https://blog.infine.com/conseils-a-un-jeune-developpeur-java-2133#comments</comments>
		
		<dc:creator><![CDATA[Antoine]]></dc:creator>
		<pubDate>Fri, 28 Sep 2012 22:22:44 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=2133</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span> Tu viens de démarrer (ou vas bientôt démarrer) dans la vie active , tu sors d&#8217;une école d&#8217;ingénieur ou de l&#8217;université et tu as choisi d&#8217;être développeur (souvent java d&#8217;ailleurs). C&#8217;est cool, tu as choisi un beau métier pas forcément encore très reconnu et estimé à sa juste valeur en France, mais ça c&#8217;est une &#8230;</p>
<p>The post <a href="https://blog.infine.com/conseils-a-un-jeune-developpeur-java-2133">Conseils à un jeune développeur Java</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span><p>Tu viens de démarrer (ou vas bientôt démarrer) dans la vie active , tu sors d&#8217;une école d&#8217;ingénieur ou de l&#8217;université et tu as choisi d&#8217;être développeur (souvent java d&#8217;ailleurs). C&#8217;est cool, tu as choisi un beau métier pas forcément encore très reconnu et estimé à sa juste valeur en France, mais ça c&#8217;est une autre histoire.</p>
<p>Toujours est-il que je te vois très souvent, que ce soit en face à face lors d&#8217;un entretien ou directement sur un projet et si je peux me permettre j&#8217;aimerais te donner quelques conseils parce que &#8230; tu me déprimes.<br />
<span id="more-2133"></span></p>
<ul>
<li>J2ee tu n’écriras plus sur ton CV : pour ton info ça s&#8217;écrit JEE (voire comme me le fait remarquer sami, Java EE). Et arrête de mettre spring, struts dans cette norme, mais jette un œil <a href="http://fr.wikipedia.org/wiki/Java_EE" target="_blank">ici</a> une fois pour toutes. Parfois tu n’écris pas j2ee mais java/j2ee (java-ji-deux-e) comme s&#8217;il s&#8217;agissait d&#8217;un seul mot. Tu as certainement du t&#8217;inspirer de CVs qu&#8217;on t&#8217;a recommandés à l&#8217;école ou  d&#8217;une version retravaillée par une ssii. Et au fait, depuis quand struts et spring font-ils partie de la norme Java EE.</li>
<li>Le langage et le Sdk tu connaîtras : c&#8217;est quand même le minimum lorsqu&#8217;on programme dans un langage que de connaitre ses possibilités : et pourtant combien de fois je me surprends en train de t&#8217;expliquer l’intérêt d&#8217;utiliser telle collection plutôt que telle autre. Ça veut aussi dire que tu suivras les évolutions du jdk : on en est à la version 7 et combien de nouvelles fonctionnalités peux-tu me citer ?</li>
<li>Au Jug tu iras : il y en a certainement <a href="http://blog.alexis-hassler.com/2011/01/jugs-en-france.html" target="_blank">un près de chez toi</a>. Les cast codeurs tu écouteras (<a href="http://javaposse.com/" target="_blank">http://javaposse.com/</a> également si tu es anglophone). Les flux rss tu liras, et les bonnes personnes tu &#8216;followeras&#8217; sur twitter. Si tu es plutôt du matin ce sera <a href="http://thecodersbreakfast.net/" target="_blank">http://thecodersbreakfast.net/</a> ou du soir <a href="http://blog.paumard.org/" target="_blank">http://blog.paumard.org/</a> : bref, intéresse toi un minimum.</li>
<li>A vie tu apprendras : c&#8217;est vrai pour n&#8217;importe quel programmeur mais tu devras le faire encore plus que tes collègues dans d&#8217;autres langages. Tu as choisi un écosystème de cinglé ou il ne se passe pas un jour sans qu&#8217;un nouveau framework/langage/concept ne sorte et il te faudra discernement et courage pour suivre le rythme car le tempo est soutenu.</li>
<li>Les bases de l&#8217;informatique tu &#8220;réviseras&#8221; : j&#8217;écris tu réviseras mais c&#8217;est uniquement pour ne pas faire répétition avec le conseil précédent. C&#8217;est vrai que l&#8217;industrie du software n&#8217;est pas hyper poussée en France et qu&#8217;il y a de fortes chances pour que tu travailles sur une application de gestion (avec une base de données , des serveurs/services web &#8230;) ce n&#8217;est pas une raison pour ignorer tout ce qui est en dessous, la JVM et la façon dont sont utilisées les ressources que tu sollicites sans t&#8217;en rendre compte.</li>
<li>Performance tu penseras : attention je n&#8217;ai pas dit &#8220;tu optimiseras&#8221; (chaque chose en son temps) : mais déjà essaye de penser que quand ton appli sera livrée, tu risques d&#8217;avoir légèrement plus de données à gérer, plus d&#8217;utilisateurs, plus de pression sur les ressources, plus de concurrence d&#8217;accès &#8230; : si tu en as la possibilité, prends une configuration pas trop puissante pour exécuter ton code, tu vas t&#8217;apercevoir des lenteurs plus tôt dans ton projet; utilise un jeu de données représentatif tant au niveau des valeurs qu&#8217;au niveau du volume. Pour coder en revanche, débrouille toi pour avoir la config la plus puissante : Quand je vois le temps perdu par jour et par développeur rien qu&#8217;à attendre que son build se termine ou que son serveur d&#8217;appli veuille bien démarrer &#8230;</li>
<li>Le sql tu maîtriseras : tu <del>penses que tu</del> connais hibernate/jpa et tu penses que ce vieux langage (qui a ton age !?) qu&#8217;est le sql ne vaut pas la peine que tu t&#8217;y attardes parce que c&#8217;est &#8220;has been&#8221; : d&#8217;ailleurs avoue que tu n&#8217;as jamais pensé à regarder quelles étaient les requêtes générées par ta couche de persistance préférée. Et si je te demande pourquoi ton code rame ne me dis pas &#8220;je ne sais pas, mais, le dba regarde&#8221; ou &#8220;c&#8217;est hibernate&#8221; : il faut te rendre à l&#8217;évidence : le problème est avant tout entre la chaise et le clavier.</li>
<li>D&#8217;ailleurs ton clavier par coeur tu connaîtras. Fais d&#8217;une pierre deux coups et profites-en pour en faire de même avec ton ide/éditeur : quand je te mets devant un écran pour observer comment tu codes, (en ayant bien entendu pris soin de te laisser le choix des armes &#8211; eclipse, netbeans, intellij, voire emacs ou vi), je ne te sens pas hyper à l&#8217;aise : tu regardes ton clavier, cherches tes touches, et passes un temps fou sur cette satanée souris pour fouiller dans les menus, lancer des commandes etc : tu es freiné par des considérations d&#8217;ordre purement techniques, des frottements qui t&#8217;empêchent de coder plus vite : débranche ton mulot et force toi à utiliser le clavier en le regardant un minimum voire en le cachant, apprends les raccourcis clavier : tu vas découvrir à quel point tu étais handicapé &#8230;</li>
<li>Pour terminer, outille toi avec tout ce qui pourras améliorer la qualité et la rapidité de tes développements : analyse de code, profiler, couverture de code, tests unitaires, jrebel  &#8230;</li>
</ul>
<p>Tu as choisi un langage dont la difficulté ne réside ni dans le langage en lui même ni dans le sdk déjà bien fourni, mais dans la recherche et le choix des bons composants/framework et dans leur configuration / paramétrage : tu as passé beaucoup de temps à essayer de faire fonctionner ton assemblage de composants et tu as oublié de creuser les sujets qui te donneront des bases solides pour la suite de ta carrière.</p>
<p>Bref tu auras compris, si tu veux être un bon développeur et ne pas être obligé de passer chef de projet ou côté métier par la force des choses plus que par choix, donne toi les moyens et prends tout de suite les bons réflexes, reprends les bases et ne brûle pas les étapes, reste humble (il y en toujours qui en savent plus que toi)  &#8230; et code !</p><p>The post <a href="https://blog.infine.com/conseils-a-un-jeune-developpeur-java-2133">Conseils à un jeune développeur Java</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/conseils-a-un-jeune-developpeur-java-2133/feed</wfw:commentRss>
			<slash:comments>21</slash:comments>
		
		
			</item>
		<item>
		<title>Bilan de Devoxx France</title>
		<link>https://blog.infine.com/bilan-de-devoxx-france-1987?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bilan-de-devoxx-france</link>
					<comments>https://blog.infine.com/bilan-de-devoxx-france-1987#comments</comments>
		
		<dc:creator><![CDATA[Florian Boulay]]></dc:creator>
		<pubDate>Fri, 11 May 2012 13:00:20 +0000</pubDate>
				<category><![CDATA[Conférence]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1987</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span> La première édition de Devoxx France s&#8217;est terminée depuis quelques jours, voici donc un bref retour d&#8217;expérience ainsi que les réponses au concours que nous avions organisé. L&#8217;organisation était au top. Les gilets rouges ont bien pris en main l’organisation globale, et malgré la jeunesse de l&#8217;évènement, aucun aléa n&#8217;est venu perturbé ces 3 journées. &#8230;</p>
<p>The post <a href="https://blog.infine.com/bilan-de-devoxx-france-1987">Bilan de Devoxx France</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span><p><a href="https://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate.jpg" class="fancyboxgroup" rel="gallery-1987" title="Logo Devoxx France"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate-300x154.jpg" alt="Logo Devoxx France" title="Logo Devoxx France" width="300" height="154" class="alignleft size-medium wp-image-1984" srcset="https://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate-300x154.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate.jpg 400w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>La première édition de Devoxx France s&#8217;est terminée depuis quelques jours, voici donc un bref retour d&#8217;expérience ainsi que les réponses au concours que nous avions organisé.</p>
<p>L&#8217;organisation était au top. Les gilets rouges ont bien pris en main l’organisation globale, et malgré la jeunesse de l&#8217;évènement, aucun aléa n&#8217;est venu perturbé ces 3 journées. Les sessions étaient très variées, et certaines demandaient un niveau technique assez élevé. D&#8217;autres au contraire permettaient de découvrir des sujets qui ne sont pas forcément connus des développeurs Java comme par exemple la session d&#8217;Alexandre Bertails sur la théorie des langages.</p>
<p><span id="more-1987"></span></p>
<p>D&#8217;un point de vue personnel, j&#8217;ai adoré cette première édition. On sentait que l&#8217;expérience de Stephan Janssen a permis à Devoxx France de paraître déjà rodé. J&#8217;ai pu assisté à de nombreuses sessions très intéressantes et enrichissantes comme celle de Pablo Lopez présentant Hadoop pour gérer les 7Go de logs produites chez son client. J&#8217;en ai malheureusement loupé d&#8217;autres. Vivement que les sessions soient sur Parleys. Devoxx a vraiment été une cure technique revigorante de part la diversité des sujets et la maîtrise technique des speakers.<br />
D&#8217;autre part, en jouant chez divers sponsors j&#8217;ai pu gagner un Samsung Galaxy Tab et un Kindle ! Un petit bonus qui a contribué à passer un excellent moment.</p>
<h2>Application In Fine Devoxx France</h2>
<p>Nous avions mis à disposition des utilisateurs Android <a href="https://play.google.com/store/apps/details?id=com.infine.android.devoxx">une application</a> permettant de gérer son planning pendant les 3 jours de Devoxx France. Les retours des utilisateurs ont été très bons et peu de bugs ont été recensés.<br />
Lors du deuxième jour, le planning a pu indiquer des salles qui ne correspondaient pas à la réalité. Ceci est en fait dû une désynchronisation entre l&#8217;application et l&#8217;API du site Devoxx. L&#8217;API REST ne renvoyait pas les bonnes salles ce qui a pu en gêner certains. Le troisième jour, tout est rentré dans l&#8217;ordre et l&#8217;API renvoyait les données exactes.</p>
<p>Comme nous l&#8217;avons annoncé avant Devoxx France, nous mettons en open source le code de cette application. Le code source est en licence Apache 2 et est disponible sur <a href="https://github.com/fboulay/devoxx-france-android-in-fine">mon GitHub</a>.</p>
<p>Cette application est censée se connecter à un serveur qui renvoie des données JSON qui ont un format spécifiques. Cette partie peut être adaptée facilement pour récupérer les données renvoyées par le serveur devoxx.</p>
<h2>Concours In Fine avec un Mac Book Air à la clé</h2>
<p>En tant que sponsor, nous organisions un concours de code. Le gagnant pouvait emporter un Mac Book Air. Le principe était simple : modifier 6 morceaux de code en sept minutes trente.<br />
La difficulté venait du fait que le code était édité dans un navigateur web et pas dans un IDE ! A chaque modification de code, une compilation automatique était envoyée à un serveur permettant de valider la réponse du candidat.</p>
<p>Les réponses aux questions ne nécessitaient pas de connaître les API du JDK par coeur, seules le nom des classes et leur constructeur étaient utiles. Les questions et réponses sont données un peu plus loin dans ce post.</p>
<p>Nicolas De Loof <a href="http://blog.loof.fr/2012/04/yeahhhhh.html">a emporté haut la main</a> le concours en étant le seul à donner les 6 bonnes réponses dans le temps imparti. Les autres participants n&#8217;ont pas démérité, mais le fait de coder dans un navigateur a dû en déconcerter plus d&#8217;un.</p>
<figure id="attachment_1989" aria-describedby="caption-attachment-1989" style="width: 223px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2012/04/boss_loof_mac_book_air.jpg" class="fancyboxgroup" rel="gallery-1987" title="Antoine Ramponi et Nicolas de Loof sur le stand In Fine"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2012/04/boss_loof_mac_book_air-223x300.jpg" alt="Antoine Ramponi et Nicolas de Loof sur le stand In Fine" title="Antoine Ramponi et Nicolas de Loof sur le stand In Fine" width="223" height="300" class="size-medium wp-image-1989" srcset="https://blog.infine.com/wp-content/uploads/2012/04/boss_loof_mac_book_air-223x300.jpg 223w, https://blog.infine.com/wp-content/uploads/2012/04/boss_loof_mac_book_air.jpg 537w" sizes="(max-width: 223px) 100vw, 223px" /></a><figcaption id="caption-attachment-1989" class="wp-caption-text"><em>Nicolas de Loof vient de gagner le Mac Book Air. Il fete ça en présence du boss Antoine Ramponi</em></figcaption></figure>
<h3>Questions du concours</h3>
<p>Chaque question comprend un énoncé, une partie de code éditable par l&#8217;utilisateur ainsi que du code non éditable. Les imports se font automatiquement.</p>
<h4>Question 1</h4>
<p>Comment faire en sorte que myMap puisse garder l&#8217;ordre d&#8217;insertion</p>
<pre class="brush: java; title: ; notranslate">
// Début de la partie éditable

Map&lt;String, Integer&gt; myMap = new HashMap&lt;String, Integer&gt;();

// Fin de la partie éditable
myMap.put(&quot;val2&quot;, 2);
myMap.put(&quot;val1&quot;, 1);
myMap.put(&quot;val3&quot;, 4);

Iterator&lt;Integer&gt; i = myMap.values().iterator();
assert(result = i.next() == 2 &amp;&amp; i.next() == 1 &amp;&amp; i.next() == 4);
</pre>
<h4>Réponse 1</h4>
<p>Il faut une certaine connaissance des collections Java. TreeMap n&#8217;est pas utilisable ici car il réordonne les entréés à chaque insertion.</p>
<pre class="brush: java; title: ; notranslate">
Map&lt;String, Integer&gt; myMap = new LinkedHashMap&lt;String, Integer&gt;();
</pre>
<h4>Question 2</h4>
<p>Le test est valide lorsque myVar vaut 66666</p>
<pre class="brush: java; title: ; notranslate">
// Début de la partie éditable

long myVar = 5432l;

// Fin de la partie éditable
myVar += 12345;
assert(myVar == 66666);
</pre>
<h4>Réponse 2</h4>
<p>Il fallait mettre un 1 au lieu du l minuscule. Cette question est une référence à Josh Bloch.</p>
<pre class="brush: java; title: ; notranslate">
long myVar = 54321;
</pre>
<h4>Question 3</h4>
<p>Ecrivez une méthode qui calcule la factorielle d&#8217;un nombre n . Si n est négatif alors on retourne Double.NaN</p>
<pre class="brush: java; title: ; notranslate">
// Début de la partie éditable
double fact(int n) {
    return 0;
}
// Fin de la partie éditable
</pre>
<h4>Réponse 3</h4>
<p>Faire une fonction récursive était la manière la plus évidente et la plus naturelle.</p>
<pre class="brush: java; title: ; notranslate">
double fact(int n) {
    if (n == 0)
        return 1;
    else if (n == 1)
        return 1;
    else if (n &lt; 0)
        return Double.NaN;
    return n * fact(n-1);
}
</pre>
<h4>Question 4</h4>
<p>Ecrivez la méthode getDayOfWeek qui prend en entrée le nombre de jour depuis le 1 Janvier 1970 ( ce jour était un jeudi ) et qui retourne le jour correspondant.</p>
<pre class="brush: java; title: ; notranslate">
public final static int SUNDAY = 1;
public final static int MONDAY = 2;
public final static int TUESDAY = 3;
public final static int WEDNESDAY = 4;
public final static int THURSDAY = 5;
public final static int FRIDAY = 6;
public final static int SATURDAY = 7;

// Début de la partie éditable
int getDayOfWeek(int day) {
    return 0;
}
// Fin de la partie éditable
</pre>
<h4>Réponse 4</h4>
<p>Cette question probablement était probablement la plus difficile. Ceux qui ont essayé de trouver une formule qui marche sur une ligne avec un modulo ont tous échoué. D&#8217;autres ont essayé d&#8217;utiliser la classe Calendar, mais sans auto-complétion et sans connaissance de l&#8217;API ils ont échoué également. La solution la plus simple est celle ci-dessous.</p>
<pre class="brush: java; title: ; notranslate">
int getDayOfWeek(int day) {
    int moduloDay = day % 7;
    switch(moduloDay){
        case 0 : return THURSDAY;
        case 1 : return FRIDAY;
        case 2 : return SATURDAY;
        case 3 : return SUNDAY;
        case 4 : return MONDAY;
        case 5 : return TUESDAY;
        default : return WEDNESDAY;
    }
}
</pre>
<h4>Question 5</h4>
<p> Modifiez le code pour que le resultat de la soustraction soit égal à 0.9</p>
<pre class="brush: java; title: ; notranslate">
void substract() {
// Début du code éditable

    BigDecimal a = new BigDecimal(2.00);
    BigDecimal b = new BigDecimal(1.10);
	
// Fin du code éditable
    assert(a.subtract(b).doubleValue() == 0.9);
}
</pre>
<h4>Réponse 5</h4>
<p>Un énoncé et une réponse simple encore une fois. Il fallait connaître les spécifités de ce constructeur. En initialisant un BigDecimal avec un double, la valeur initialisée est une valeur approchante au paramètre. En utilisant un paramètre de type String, alors c&#8217;est la valeur exacte qui est utilisée.</p>
<pre class="brush: java; title: ; notranslate">
    BigDecimal a = new BigDecimal(&quot;2.00&quot;);
    BigDecimal b = new BigDecimal(&quot;1.10&quot;);
</pre>
<h4>Question 6</h4>
<p>Comment accède-t&#8217;on dans la méthode getSuperVal à l&#8217;attribut val de la classe B ?</p>
<pre class="brush: java; title: ; notranslate">
class B {

    int val = 2;
    A a = new A();

    class A {
        final public int val = 3;

        int getSuperVal() {
            // Début du code éditable
            return ;
            // Fin du code éditable

        }
    }
}
</pre>
<h4>Réponse 6</h4>
<p>Syntaxe peu utilisée, mais encore une fois cette réponse était simple à donner dans un navigateur sans auto-complétion.</p>
<pre class="brush: java; title: ; notranslate">
return B.this.val;
</pre>
<h4>Question 7</h4>
<p>NB : Cette question a remplacé 6 la question le dernier jour de Devoxx France.<br />
Comment faire en sorte que myMap ait une taille de 3 ? La Map ne doit contenir que des clés &#8220;test&#8221;.</p>
<pre class="brush: java; title: ; notranslate">
// Début du code éditable
Map&lt;String, Integer&gt; myMap = new HashMap&lt;String, Integer&gt;();
// Fin du code éditable

myMap.put(new String(&quot;test&quot;), 1);
myMap.put(new String(&quot;test&quot;), 2);
myMap.put(&quot;test&quot;, 3);

int size = myMap.size();
assert(size == 3);
</pre>
<h4>Réponse 7</h4>
<p>Encore une fois il fallait un peu connaître les classes qui composent l&#8217;API Collection.</p>
<pre class="brush: java; title: ; notranslate">
Map&lt;String, Integer&gt; myMap = new IdentityHashMap&lt;String, Integer&gt;();
</pre>
<p>Merci à tous ceux qui sont venus nous voir sur le stand, on a passé de bon moments. A l&#8217;année prochaine !</p><p>The post <a href="https://blog.infine.com/bilan-de-devoxx-france-1987">Bilan de Devoxx France</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/bilan-de-devoxx-france-1987/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>RequestFactory ou comment faire du CRUD avec GWT</title>
		<link>https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=requestfactory-ou-comment-faire-du-crud-avec-gwt</link>
					<comments>https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108#comments</comments>
		
		<dc:creator><![CDATA[aina.razafimahefa]]></dc:creator>
		<pubDate>Fri, 24 Feb 2012 16:54:35 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1108</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span> Historique Lors de la sortie de la version 2.1 de Google Web Toolkit, une nouvelle API : RequestFactory a fait son apparition. Cette API a été conçue dans le but de simplifier l&#8217;interaction et la manipulation de données côté serveur depuis le client (javascript). Auparavant, les développeurs utilisaient essentiellement GWT-RPC pour les appels de service &#8230;</p>
<p>The post <a href="https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108">RequestFactory ou comment faire du CRUD avec GWT</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span><h2>Historique</h2>
<p>Lors de la sortie de la version 2.1 de Google Web Toolkit, une nouvelle API : RequestFactory a fait son apparition. Cette API a été conçue dans le but de simplifier l&#8217;interaction et la manipulation de données côté serveur depuis le client (javascript).<br />
Auparavant, les développeurs utilisaient essentiellement GWT-RPC pour les appels de service impliquant des manipulations de données côté serveur.<br />
Etant donné que le code côté client interagit avec du Java côté serveur, GWT-RPC fournit nativement<br />
un mécanisme de sérialisation de données puissant. Cependant, cela ajoutait également un certain nombre de contraintes. Entres autres, le fait que tout objet échangé entre le client et le serveur devait être Serializable (au sens GWT), l&#8217;utilisation du pattern DTO qui induisait une redondance du code métier serveur au niveau du client etc.</p>
<h2>Différence entre GWT-RPC et RequestFactory</h2>
<p>La différence fondamentale entre les deux API réside dans l&#8217;orientation. GWT-RPC  est une API orientée service. A la base, elle permet d&#8217;invoquer des méthodes distantes d&#8217;une couche service pour interagir avec les données.</p>
<p>RequestFactory quant à elle est une API orientée donnée. Elle invoque directement des méthodes exposées non pas sur une couche service, mais sur les entités métiers (selon la terminologie GWT) elles-mêmes. C&#8217;est comme si on rendait les données serveurs disponibles au niveau du client. Les méthodes invoquées sont alors les méthodes des objets métiers.</p>
<h2>Concepts de base</h2>
<p>RequestFactory se base sur la notion de Proxy. Pour effectuer des opérations sur les données côté serveur, il définit un objet proxy qui &#8220;représente&#8221; cet objet serveur au niveau du client. Ce proxy est en fait une &#8220;interface&#8221; qui définit l&#8217;ensemble des méthodes qu&#8217;on voudrait exposer sur l&#8217;objet métier lui-même. Pour déclencher l&#8217;exécution d&#8217;une action sur l&#8217;objet côté serveur, il suffit de l&#8217;invoquer sur l&#8217;interface du proxy et RequestFactory se charge de l&#8217;envoi de la requête ainsi que de la sérialisation/déserialisation des données. Il est à noter qu&#8217;il utilise un protocole de sérialisation qui lui est propre et qui est différent de GWT-RPC.</p>
<h2>Quelques règles à respecter</h2>
<p>Le fonctionnement interne de RequestFactory impose quelques contraintes au niveau des classes métiers dont :</p>
<p>L&#8217;objet métier doit avoir un constructeur sans argument</p>
<p>la nécéssité d&#8217;avoir un champ VERSION dans la classe métier (annoté @Version en JPA). Ce champ permet à RequestFactory de tester si un objet a changé d&#8217;état.</p>
<p>Chaque Entité doit également disposer d&#8217;une méthode statique permettant de retrouver une instance de l&#8217;objet par son identifiant. Par exemple, pour l&#8217;entité de type Person, ce sera :</p>
<pre class="brush: java; title: ; notranslate">
public static findPerson(Long id) {

// retrieving object by Id using EntityManager

}
</pre>
<h2>Cas d&#8217;utilisation</h2>
<p>Supposons alors qu&#8217;on ait un objet métier Personne dans notre application. Les objets de cette classe sont déstinés à être sauvegardés dans une base de données. On les appelle tout naturellement des &#8220;Entités&#8221; dans RequestFactory. On supposera que la persistance est gérée par Hibernate dans notre application et que tout a déjà été configuré (hibernate.cfg.xml, etc.). Nous avons donc dans notre domaine, le code suivant :</p>
<pre class="brush: java; title: ; notranslate">
@Entity public class Person {
  @Id
@Column(name = &quot;id&quot;)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Version
@Column(name = &quot;version&quot;)
private Integer version;

@Version
@Column(name = &quot;name&quot;)
private String name;
@Column(name = &quot;surname&quot;)
private String surname;

  @JoinColumn(name=&quot;address_id&quot;)
  Address address;

  public Personne() { }  // Getters and setters ...

}
</pre>
<p>Après avoir défini notre objet métier, on va donc lui adjoindre un &#8220;Proxy&#8221; qui sera une représentation de cet objet métier côté client. RequestFactory se charge alors de<br />
propager les opérations invoquées sur les proxy vers les entités côté serveur. Il est également important de noter que RequestFactory envoie seulement les différences entre<br />
ce qu&#8217;il y a côté serveur et côté client, économisant ainsi la bande passante.</p>
<h3>Entity Proxy</h3>
<p>Une entity proxy est un proxy qui comme son nom l&#8217;indique, représente une entité côté serveur. Pour la définir il suffit de créer une interface qui étend EntityProxy<br />
et d&#8217;indiquer la classe métier qu&#8217;il représente via l&#8217;annotation @ProxyFor.</p>
<pre class="brush: java; title: ; notranslate">
@ProxyFor(Person.class)
public interface PersonProxy extends EntityProxy {
public Person() { }
// Les méthodes exposées ...
public String getName();
public void setName(String name);
public AddressProxy getAddress();
public void setAddress(AddressProxy address);
// Les méthodes exposées ...
public String getName();
public void setName(String name);
public AddressProxy getAddress();
public void setAddress(AddressProxy address);
}
</pre>
<p>Les méthodes qu&#8217;on a défini dans le proxy sont les méthodes &#8220;invocables&#8221; sur l&#8217;objet métier. Ainsi, si on veut restreindre l&#8217;appel à certaines méthodes de l&#8217;objet métier<br />
côté serveur, il suffit de ne pas l&#8217;indiquer dans le proxy. Ici par exemple, on a omis les modificateurs de Surname, ce qui veut dire qu&#8217;on ne pourra pas invoquer la méthode<br />
de modification du prénom depuis le côté client.<br />
Remarquons également que si une Entité A possède une référence vers une autre Entité B, les signatures du proxy AProxy feront référence à des BProxy (dans notre cas, AddressProxy).</p>
<h3>Le lien entre le client et le serveur : RequestFactory</h3>
<p>Après avoir défini les entités et leurs proxy, on crée maintenant la RequestFactory elle-même. C&#8217;est une interface qui comme son nom l&#8217;indique va créer les &#8220;stubs&#8221;<br />
permettant la communication entre le client et le serveur.</p>
<pre class="brush: java; title: ; notranslate">
public interface ApplicationRequestFactory extends RequestFactory

{

    PersonRequest personRequest();

    AddressRequest addressRequest();
}
</pre>
<p>PersonRequest et AddressRequest sont nos stubs pour les opérations concernant respectivement les entités Person et Address.</p>
<pre class="brush: java; title: ; notranslate">
@Service(PersonServiceDAO.class)
public interface PersonneRequestContext extends RequestContext {

Request&lt;List&lt;PersonProxy&gt;&gt; getPersonList();

Request&lt;PersonProxy&gt; findPersonById(Long id);

}
</pre>
<p>Notons que les stubs utilisent toujours Request comme type de retour, où X est le paramètre de retour de la méthode de service.<br />
Le stub doit nommer via une annotation, la méthode qui implémente les services côté serveur. Ainsi, dans notre exemple on a deux méthodes qu&#8217;on peut invoquer côté serveur<br />
pour les entités de la classe Personne : on peut retrouver la liste complète ou encore retrouver une Personne par son identifiant.<br />
On pourrait imaginer une classe service comme la suivante ( j&#8217;ai omis volontairement toute la partie de gestion des exceptions liées à la persistance des données pour une raison de lisibilité) :</p>
<pre class="brush: java; title: ; notranslate">
public class PersonServiceDAO {

public List&lt;PersonProxy&gt; getPersonList()
  {
      List&lt;Person&gt; personList = new ArrayList();
      EntityManager entityManager = PersistenceManager.getEntityManagerFactory().createEntityManager();
      try {
          personList = entityManager.createQuery(&quot;FROM Person&quot;).getResultList();
      } catch (Exception e) {
          e.printStackTrace();
      }
      return personList;
  }

public Personne findPersonById(Long id) {
      EntityManager entityManager = PersistenceManager.getEntityManagerFactory().createEntityManager();
      Person person = null;
      try {
          person = entityManager.find(Person.class, id);
      } catch (Exception e) {
          e.printStackTrace();
      }
      return person;
  }
}
</pre>
<h3>Utiliser RequestFactory</h3>
<p>Enfin la dernière étape pour l&#8217;exécution de RequestFactory est de l&#8217;invoquer depuis le code client. Dans un premier temps, on doit initialiser le bus d&#8217;évènement. Une manière de procéder c&#8217;est de faire l&#8217;initialisation dans le constructeur de la classe dans laquelle on va utiliser RequestFactory.</p>
<pre class="brush: java; title: ; notranslate">
public class OurClassWindow {
final EventBus eventBus = new SimpleEventBus();
ApplicationRequestFactory requestFactory = GWT.create(ApplicationRequestFactory.class);

public OurClassWindow() {
// Initialize event bus
requestFactory.initialize(eventBus);
}

}
</pre>
<p>Le mécanisme d&#8217;appels dans RequestFactory est très similaire à ce que l&#8217;on retrouve dans GWT-RPC. Après avoir retrouvé la requestContext, on invoque la méthode tout en<br />
passant un callback qui sera appelé par RequestFactory au retour de la fonction.</p>
<pre class="brush: java; title: ; notranslate">
Receiver&lt;List&lt;PersonProxy&gt;&gt; receiver = new Receiver&lt;List&lt;PersonProxy&gt;&gt;(){
@Override 	public void onSuccess(List&lt;PersonProxy&gt; response) {

// Do something with the response from RequestFactory

} };

requestFactory.personRequestContext.getPersonList().fire(receiver);
</pre>
<p>receiver ici, représente la méthode callback qui sera appelée au retour de la fonction. Comme dans GWT-RPC, il dispose de méthodes onSuccess et onFailure permettant de gérer<br />
les cas de réussite ou d&#8217;échecs après l&#8217;appel.</p>
<h3>Conclusion</h3>
<p>Si vous avez déjà codé en GWT, vous savez à quel point il est fastidieux d&#8217;écrire des services uniquement pour ramener des données stockées en base  : RequestFactory est une manière <del>élégante</del> simple pour effectuer à moindre coût des appels vers un backend. L&#8217;API et la mise en oeuvre sont similaires à ceux de GWT-RPC, il est ainsi très facile de l&#8217;appréhender même si on est habitué à GWT-RPC.</p>
<p>pour aller plus loin : <a href="https://developers.google.com/web-toolkit/doc/latest/DevGuideRequestFactory">https://developers.google.com/web-toolkit/doc/latest/DevGuideRequestFactory</a></p><p>The post <a href="https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108">RequestFactory ou comment faire du CRUD avec GWT</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Tomcat 6 &#8211; JNDI &#8211; password crypté et pool de connexion V7</title>
		<link>https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7</link>
					<comments>https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275#respond</comments>
		
		<dc:creator><![CDATA[Christian Nguyen Van Than]]></dc:creator>
		<pubDate>Thu, 02 Feb 2012 09:00:11 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jndi]]></category>
		<category><![CDATA[pool]]></category>
		<category><![CDATA[tomcat]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1275</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span> Cet article est destiné à ceux qui ont la &#8216;chance&#8217; d&#8217;avoir Tomcat 6 comme serveur pour leurs applications et qui doivent paramétrer le pool de connexions par JNDI. Voici un petit article issu d&#8217;une demande d&#8217;un client. Le client : C&#8217;est bien la configuration par JNDI, ça serait mieux si on ne voyait pas le &#8230;</p>
<p>The post <a href="https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275">Tomcat 6 – JNDI – password crypté et pool de connexion V7</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span><p>Cet article est destiné à ceux qui ont la &#8216;chance&#8217; d&#8217;avoir Tomcat 6 comme serveur pour leurs applications et qui doivent paramétrer le pool de connexions par JNDI.</p>
<p>Voici un petit article issu d&#8217;une demande d&#8217;un client.</p>
<p><strong><em>Le client</em></strong> : <em>C&#8217;est bien la configuration par JNDI, ça serait mieux si on ne voyait pas le mot de passe en clair <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f641.png" alt="🙁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> &#8230;</em></p>
<p><em><strong>Moi</strong>: No problem, everything is possible (enfin je crois) &#8230;</em></p>
<p>Effectivement c&#8217;est possible. D&#8217;après la documentation, il suffit d&#8217;implémenter une classe de type &#8216;factory&#8217; pour instancier les connexions avec la base de données.</p>
<p>Dans cet article, vous verrez comment crypter facilement un mot de passe ou autre mais aussi comment remplacer le pool de connexion DBCP  par le pool de connexion de Tomcat 7 (plus performant à  mon goût).</p>
<p>Tout ceci se fait en 3 étapes :</p>
<ul>
<li>Codage d&#8217;une classe &#8216;Factory&#8217;</li>
<li>Configuration de la ressource JNDI</li>
<li>Copier les jar dans le répertoire lib de Tomcat</li>
</ul>
<p><span id="more-1275"></span></p>
<p>Le processus de cryptage ne sera pas détaillé ici.<br />
Pour plus d&#8217;information, vous avez une classe &#8220;EncryptHelper&#8221; dans les sources (voir à la fin).</p>
<ul></ul>
<h2>1° La classe Factory</h2>
<p>Ici j&#8217;utilise le pool de connexion de Tomcat 7 :</p>
<pre class="brush: java; title: ; notranslate">
public class Tomcat7EncryptedFactory extends org.apache.tomcat.jdbc.pool.DataSourceFactory implements SecuredFactory{

	@SuppressWarnings(&quot;rawtypes&quot;)
	@Override
	public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {
		Object o = super.getObjectInstance(obj, name, nameCtx, environment);
		if (o != null &amp;&amp; o instanceof org.apache.tomcat.jdbc.pool.DataSource) {
			org.apache.tomcat.jdbc.pool.DataSource ds = (org.apache.tomcat.jdbc.pool.DataSource) o;
			// recuperation du login et mot de passe cryptes
			String cryptedUsername = ds.getUsername();
			String cryptedPassword = ds.getDbProperties().getProperty(&quot;password&quot;);
			// on decrypte le password
			if (cryptedPassword != null &amp;&amp; cryptedPassword.length() &gt; 0) {
				String pwd = EncryptHelper.decryptData(secretKeyPassword, cryptedPassword);
				ds.setPassword(pwd);
			}
			// on decrypte le login
			if (cryptedUsername != null &amp;&amp; cryptedUsername.length() &gt; 0) {
				String username = EncryptHelper.decryptData(secretKeyUser, cryptedUsername);
				ds.setUsername(username);
			}
			// on set la taille initiale avec le minimum idle
			// on doit laisser le initialSize a 0 car il ne faut pas cree de connexion tout de suite car on a les identifiants cryptes.
			int minIdleSize = ds.getMinIdle();
			ds.setInitialSize(minIdleSize);
			ds.setConnectionProperties(ds.getConnectionProperties());

			// on ferme le pool deja parametre
			ds.close();
			// on recree le pool avec les nouveaux parametres
			ds.createPool();
			System.out.println(&quot;Initialisation de la datasource JNDI : OK&quot;);
			return ds;
		} else {
			System.out.println(&quot;Initialisation de la datasource JNDI : KO&quot;);
			return null;
		}
	}
}
</pre>
<p>Juste que la rien de difficile ^_^</p>
<h2 style="font-size: 1.5em">2° Configuration JNDI</h2>
<p>Extrait du fichier de configuration des ressources de Tomcat 6 (conf/context.xml)</p>
<div><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;line-height: 18px">&lt;Resource name=&#8221;jdbc/mydatabase&#8221;</span></div>
<pre>    auth="Container" type="javax.sql.DataSource"
    factory="fr.cnvt.tomcat.Tomcat7EncryptedFactory"
    username="sD20tsCeFQPP3HuQV17yXw=="
    password="LoPCUiDWD47S6wIOTZWvBX7X9XTLt2vS9Sv52csoEGo="
    driverClassName="my.driver.class"
    url="my.jdbc.url"
    initialSize="0" maxActive="20" minIdle="5" maxIdle="10"
    validationQuery="SELECT 1 FROM Dual" validationQueryTimeout="300"
    maxWait="30000"
    removeAbandoned="true" removeAbandonedTimeout="600" logAbandoned="true"
    timeBetweenEvictionRunsMillis="20000"
    testWhileIdle="true"
    connectionProperties="CHARSET=utf8;" /&gt;</pre>
<p>Comme vous pouvez le voir, le login (username) et le mot de passe (password) sont cryptés.</p>
<p>Vous pouvez avoir le même login et mot de passe (c&#8217;est bizarre comme c&#8217;est fréquent&#8230;) , les 2 chaines cryptés seront différentes (normal j&#8217;utilise 2 clés de cryptage différentes ^_^)</p>
<h2>3° Librairies dans Tomcat</h2>
<p>Dernières étapes, il suffit de copier les fichiers tomcat-datasource-factory-1.0.0.jar et tomcat-jdbc-7.0.22.jar(dans le répertoire lib du zip) dans le répertoire &#8220;lib&#8221; de Tomcat 6.</p>
<p>Voila en 3 copié-collé, vous avez un pool de connexion sans mot de passe en clair ^_^</p>
<p>Pour générer vos propres login et password cryptés, il suffit d&#8217;utiliser la classe EncryptHelper comme ceci:</p>
<pre class="brush: java; title: ; notranslate">
	@Test
	public void generateEncryptedValues(){
		String login = &quot;monsupertest&quot;;
		String password = &quot;monsupertestaussi&quot;;
		String cryptedLogin = EncryptHelper.encryptData(SecuredFactory.secretKeyUser, login);
		String cryptedPassword = EncryptHelper.encryptData(SecuredFactory.secretKeyPassword, password);
		String decryptedLogin = EncryptHelper.decryptData(SecuredFactory.secretKeyUser, cryptedLogin);
		String decryptedPassword = EncryptHelper.decryptData(SecuredFactory.secretKeyPassword, cryptedPassword);
		assertEquals(login, decryptedLogin);
		assertEquals(password, decryptedPassword);
		System.out.println(&quot;Login crypte : &quot; + cryptedLogin);
		System.out.println(&quot;Mot de passe crypte : &quot; + cryptedPassword);
	}
</pre>
<p>Pour les curieux, le fichier zip contient également un pool DBCP et C3P0 qui gèrent aussi le login et mot de passe cryptés. Les clés de cryptages sont dans l&#8217;interface SecuredFactory.</p>
<p>Enjoy <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Les sources sont disponibles <a href="https://github.com/nguyenvanthan/Tomcat-Datasource-Factory" target="_blank">ici</a></p><p>The post <a href="https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275">Tomcat 6 – JNDI – password crypté et pool de connexion V7</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Devoxx 2011 &#8211; Comparatif de performances des frameworks web Java et plus encore &#8230;</title>
		<link>https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore</link>
					<comments>https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411#respond</comments>
		
		<dc:creator><![CDATA[Christian Nguyen Van Than]]></dc:creator>
		<pubDate>Thu, 26 Jan 2012 11:00:56 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Spring MVC]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1411</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span> Comparatifs de frameworks web à Devoxx 2011 Cet article a pour but de présenter brièvement la présentation de Stijn Van den Enden, lors du Devoxx 2011, sur les performances brutes de plusieurs frameworks connus et de partager quelques impressions sur ce sujet. Dans la première partie, il présente la méthodologie de tests ainsi que les &#8230;</p>
<p>The post <a href="https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411">Devoxx 2011 – Comparatif de performances des frameworks web Java et plus encore …</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span><h1>Comparatifs de frameworks web à Devoxx 2011</h1>
<p>Cet article a pour but de présenter brièvement la présentation de  Stijn Van den Enden, lors du Devoxx 2011, sur les performances brutes de  plusieurs frameworks connus et de partager quelques impressions sur ce  sujet.</p>
<p>Dans la première partie, il présente la méthodologie de tests ainsi que les outils : le coté test.<br />
Dans la seconde partie, il nous montre les résultats qu&#8217;il a obtenu : le coté performance.<br />
Les slides de la présentation sont disponibles <a href="http://prezi.com/dr3on1qcajzw/www-world-wide-wait-devoxx-edition/">ici<br />
</a><br />
En résumé, on y voit la mise en place de la plateforme de tests ainsi que les outils utilisés.</p>
<p><span id="more-1411"></span></p>
<p><span style="text-decoration: underline">Plateforme de tests :</span></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1.png" class="fancyboxgroup" rel="gallery-1411"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1450" src="https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1-1024x646.png" alt="plateforme de test" width="807" height="509" srcset="https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1-1024x646.png 1024w, https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1-300x189.png 300w, https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1.png 1439w" sizes="(max-width: 807px) 100vw, 807px" /></a></p>
<p><span style="text-decoration: underline">Conclusion :</span></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/11/conclusion.png" class="fancyboxgroup" rel="gallery-1411"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1449" src="https://blog.infine.com/wp-content/uploads/2011/11/conclusion-1024x283.png" alt="conclusion des tests" width="778" height="215" srcset="https://blog.infine.com/wp-content/uploads/2011/11/conclusion-1024x283.png 1024w, https://blog.infine.com/wp-content/uploads/2011/11/conclusion-300x82.png 300w, https://blog.infine.com/wp-content/uploads/2011/11/conclusion.png 1172w" sizes="(max-width: 778px) 100vw, 778px" /></a></p>
<p>Sa conclusion étant qu&#8217;en terme de performance brute, on a :</p>
<ol>
<li>GWT</li>
<li>Spring MVC</li>
<li>JSF 2.1.2 (Implementation Mojarra) ou Wicket</li>
<li>MyFaces (n&#8217;apparait pas dans le slide)</li>
</ol>
<p>Dans sa conclusion, qui n&#8217;apparait pas dans les slides, il dit aussi que  souvent, ce n&#8217;est pas le framework web qui est la principale cause de  la mauvaise performance d&#8217;une application.<br />
Pendant sa présentation,  il a souligné que le seul framework qui a posé problème est JSF 2  (problème de mémoire, ce qui ne m&#8217;étonne pas).<br />
Enfin, il nous rappelle qu&#8217;il faut aussi penser à la facilité de développement pour garder une bonne productivité.</p>
<h1>Avis personnel</h1>
<p>Pour ma part, la conclusion de Stijn Van den Enden ne doit pas tenir  compte du temps de rendu de la page, sinon Spring MVC serait 1er avec  GWT voire même devant.</p>
<p>Sur le point où il faut privilégier la  facilité de développement, on regrettera l&#8217;absence du comparatif des  frameworks Grails et Play qui sont tous deux excellents sur ce point.</p>
<p>Si  vous avez envie de changer de framework, d&#8217;après plusieurs  présentations vu sur le même sujet (par exemple l&#8217;article de Peter  Thomas), il faut se fixer un prototype de page à faire et si cela vous  parait trop difficile, c&#8217;est que celui-ci n&#8217;est surement pas adapté à  vos besoins.</p>
<p>Personnellement, je me demande pourquoi il y a tant  de personnes qui démarrent un projet encore avec JSF pour le web alors  qu&#8217;il a autant de problèmes de performance et qu&#8217;il est parfois si  compliqué de faire des choses simples avec (exemple pagination coté  serveur&#8230;).</p>
<p>Pour finir, son approche de Spring MVC est  intéressante car elle tend vers une pratique que j&#8217;ai adopté. Pour ma  part, j&#8217;ai abandonné l&#8217;idée que le Java était fait pour le web, car  c&#8217;est loin d&#8217;être le cas. Je préfère juste garder Java pour la partie  serveur et utiliser essentiellement des langages du web pour la vue :  très peu de JSP et EL(Expression Language) avec beaucoup de HTML, CSS et  JQuery (avec des données fournies au format JSON, d&#8217;ailleurs Spring MVC  fait très bien cela).</p>
<p>S&#8217;il fallait choisir un framework pour le  web en ce moment, je prendrai Grails pour un projet &#8216;from scratch&#8217; ou  Spring MVC pour un projet existant. Je n&#8217;ai pas assez d&#8217;expérience sur  GWT mais sa génération du javascript me fait hésiter&#8230; Je garderai dans  les deux cas, JQuery pour les composants riches car il existe  énormément de plugins pour ce framework javascript ou ExtJS ou voir même  du flash (flex).</p>
<p>En ce qui concerne Wicket, sa programmation  ressemble un peu à du Swing (client lourd) qui pourrait dérouter un  développeur web. Tapestry est intéressant mais le temps d&#8217;apprentissage  est assez important.</p>
<h1>Comparatif plus étendu</h1>
<p>Pour ceux qui comme moi ont regretté l&#8217;absence de Grails et Play, voici  un article intéressant avec un comparatif des deux et surtout une légère  &#8216;customisation&#8217; pour gagner en performance.<br />
Notez que l&#8217;utilisation de Japid pour Play booste grandement ses performances et que Netty semble plus rapide que Tomcat.</p>
<p><em>Extrait du site JT Dev (vous pouvez cliquer sur les images pour les agrandir)</em></p>
<p><em><br />
</em></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/12/results_numbers.jpg" class="fancyboxgroup" rel="gallery-1411"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1838" src="https://blog.infine.com/wp-content/uploads/2011/12/results_numbers.jpg" alt="" width="511" height="445" srcset="https://blog.infine.com/wp-content/uploads/2011/12/results_numbers.jpg 511w, https://blog.infine.com/wp-content/uploads/2011/12/results_numbers-300x261.jpg 300w" sizes="(max-width: 511px) 100vw, 511px" /></a></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph.jpg" class="fancyboxgroup" rel="gallery-1411"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1839" src="https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph-1024x615.jpg" alt="" width="1024" height="615" srcset="https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph-1024x615.jpg 1024w, https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph-300x180.jpg 300w, https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph.jpg 1596w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p><a href="http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/">Plus de détails ici</a></p><p>The post <a href="https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411">Devoxx 2011 – Comparatif de performances des frameworks web Java et plus encore …</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>J&#8217;ai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier</title>
		<link>https://blog.infine.com/jai-teste-le-livre-apache-maven-version-2-et-3-par-nicolas-de-loof-et-arnaud-heritier-1248?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=jai-teste-le-livre-apache-maven-version-2-et-3-par-nicolas-de-loof-et-arnaud-heritier</link>
					<comments>https://blog.infine.com/jai-teste-le-livre-apache-maven-version-2-et-3-par-nicolas-de-loof-et-arnaud-heritier-1248#comments</comments>
		
		<dc:creator><![CDATA[Florian Boulay]]></dc:creator>
		<pubDate>Fri, 20 Jan 2012 12:30:34 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[livre]]></category>
		<category><![CDATA[maven]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1248</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span> La seconde édition de ce livre est sortie il y a déjà quelques mois. Cette nouvelle édition apporte le support de Maven 3 ainsi que des corrections. Je n&#8217;avais entendu que du bien de la première version, allons voir ce que donne cette seconde édition ! Depuis quelques années j&#8217;utilise 2 ressources principales afin de &#8230;</p>
<p>The post <a href="https://blog.infine.com/jai-teste-le-livre-apache-maven-version-2-et-3-par-nicolas-de-loof-et-arnaud-heritier-1248">J’ai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span><p><a href="https://blog.infine.com/wp-content/uploads/2011/09/apache_maven.jpg" class="fancyboxgroup" rel="gallery-1248"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-1249" src="https://blog.infine.com/wp-content/uploads/2011/09/apache_maven-300x300.jpg" alt="apache maven cover" width="200" height="200" srcset="https://blog.infine.com/wp-content/uploads/2011/09/apache_maven-300x300.jpg 300w, https://blog.infine.com/wp-content/uploads/2011/09/apache_maven-150x150.jpg 150w, https://blog.infine.com/wp-content/uploads/2011/09/apache_maven.jpg 500w" sizes="(max-width: 200px) 100vw, 200px" /></a></p>
<p>La seconde édition de ce livre est sortie il y a déjà quelques mois. Cette nouvelle édition apporte le support de Maven 3 ainsi que des corrections. Je n&#8217;avais entendu que du bien de la première version, allons voir ce que donne cette seconde édition !<br />
Depuis quelques années j&#8217;utilise 2 ressources principales afin de m&#8217;aider dans mon utilisation quotidienne de Maven : la documentation officielle et l&#8217;ebook <em>Maven The Definitive Guide</em> dont j&#8217;ai toujours une copie dans ma dropbox. Cet ebook a beaucoup de lacunes et n&#8217;approfondie par certaines notions Maven qui pourtant le mériteraient, mais je le consulte tout de même régulièrement.</p>
</p>
<p>Je me considère comme un bon utilisateur de Maven, mais je suis loin d&#8217;être un expert. Cela fait déjà plusieurs années que je le pratique, et je l&#8217;utilise quotidiennement dans le cadre de mes missions chez les clients. En lisant le livre <em>Apache maven</em> l&#8217;objectif était double :</p>
<ul>
<li>Apprendre de nouvelles choses ou appronfondir certaines notions que j&#8217;utilise peu</li>
<li>Trouver un complément à <em>Maven The Definitive Guide</em> qui date désormais quelque peu</li>
</ul>
<p><span id="more-1248"></span></p>
<h2>Ce livre propose un scénario&#8230;</h2>
<p>Ceci peut paraître étrange pour un livre d&#8217;informatique, mais il y a effectivement un scénario. Arnaud et Nicolas sont 2 compères qui retrouvent un vieille application sur une disquette gérant une liste de courses. Cette application se construit grâce à des scripts spécifiques à chaque OS : un fichier <code>.bat</code> et un fichier <code>.sh</code>.</p>
<p>Ils décident d&#8217;améliorer l&#8217;application en lui ajoutant de nouvelles fonctionnalités. D&#8217;une simple application, elle deviendra un vrai gros site web. Qui dit grosse application, dit industrialisation dans le process de livraison, de tests etc&#8230; Et c&#8217;est là que Maven intervient.</p>
<figure id="attachment_1884" aria-describedby="caption-attachment-1884" style="width: 300px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2012/01/csi_maven.png" class="fancyboxgroup" rel="gallery-1248" title="CSI Maven"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2012/01/csi_maven-300x258.png" alt="CSI Maven" title="CSI Maven" width="300" height="258" class="size-medium wp-image-1884" srcset="https://blog.infine.com/wp-content/uploads/2012/01/csi_maven-300x258.png 300w, https://blog.infine.com/wp-content/uploads/2012/01/csi_maven.png 383w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-1884" class="wp-caption-text"><em>Et en plus, cet ouvrage est drôle</em></figcaption></figure>
<p>Déboussolés par les divers problèmes qui se posent à eux, Nicolas et Arnaud seront aidés dans leur quête à créer l&#8217;application de gestion de course ultime, par d&#8217;autres personnes ayant les connaissances nécessaires afin de surmonter ces épreuves. Citons parmi ces seconds couteaux Olivier Lamy, Vincent Massol, Antonio Goncalves, Guillaume Laforge et bien d&#8217;autres.<br />
Désolé de vous avoir spoilé une bonne part du scénario, mais je vous assure qu&#8217;il y a encore beaucoup de rebondissements dont je ne vous ai pas parlé.</p>
<p>Avoir un scénario est déroutant pour un livre d&#8217;informatique. La forme habituelle didactique est ici changé en &#8220;roman&#8221; avec ses rebondissements et une belle fin. Par conséquent ce livre se lit d&#8217;une traite malgré le sujet qui peut sembler difficile au premier abord. Le livre prend le parti de montrer des situations concrètes issues des expériences de Nicolas et Maven, et nous propose une solution généralement grâce à une fonctionnalité de Maven ou à l&#8217;un de ses plugins.</p>
<h2>&#8230; Et du contenu</h2>
<p>En effet Maven est généralement considéré comme compliqué. Cet ouvrage veut prouver le contraire. Maven est prévu pour répondre à plusieurs problématiques courantes des projets. Ce qui le rend difficile (son cycle de vie, ses plugins&#8230;) est abordé progressivement dans le livre au travers de problèmes que n&#8217;importe quel utilisateur de Maven pourrait rencontrer sur un projet.</p>
<p>Le livre n&#8217;aborde pas que les bases de Maven et par exemple des plugins peu courants sont présentés tels que le <em>maven-osgi-compiler-plugin</em> ou le <em>flexmojos-maven-plugin</em>. D&#8217;autres points liés à Maven sont abordés tels qu&#8217;une comparaison des IDE ou des différents gestionnaires de dépôt.</p>
<p>Cette seconde édition apporte évidemment quelques nouveautés. La plus importante est lié à Maven 3. Dans cette édition, la plupart des chapitres contiennent un encart détaillant les spécificités de Maven 3. Ces encarts ne sont pas très nombreux, Maven 3 étant en grande partie compatible avec Maven 2. Les autres nouveautés concernent les corrections de la première édition, ainsi que l&#8217;ajout d&#8217;un chapitre. Pour être clair, si vous possédez la première édition, les nouveautés ne justifient pas de se procurer la nouvelle.</p>
<h2>Le livre parfait ?</h2>
<p>Ce livre comporte de très nombreuses qualités. Le sujet est bien maitrisé et l&#8217;apprentissage est progressif sans pour autant être trop lent. L&#8217;approche est très pragmatique et les fonctionnalités de Maven sont présentées par une approche très pratique, plutôt que par une approche théorique que de nombreux ouvrages d&#8217;informatique indigestes privilégient. De plus les livres en français et de qualité sont rares, celui-ci en fait partie, et je le recommande vivement. Apprendre Maven ou se perfectionner n&#8217;aura jamais été plus facile.</p>
<figure id="attachment_1887" aria-describedby="caption-attachment-1887" style="width: 300px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2012/01/Extreme_makeover_maven.png" class="fancyboxgroup" rel="gallery-1248" title="Extreme Makeover Maven"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2012/01/Extreme_makeover_maven-300x128.png" alt="Extreme Makeover Maven" title="Extreme Makeover Maven" width="300" height="128" class="size-medium wp-image-1887" srcset="https://blog.infine.com/wp-content/uploads/2012/01/Extreme_makeover_maven-300x128.png 300w, https://blog.infine.com/wp-content/uploads/2012/01/Extreme_makeover_maven.png 577w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-1887" class="wp-caption-text"><em>Quand je vous disais qu'il était drôle</em></figcaption></figure>
<p>Me concernant j&#8217;ai trouvé le parfait complément à <em>Maven The Definitive Guide</em>. Il ne me manque plus qu&#8217;une version électronique afin de l&#8217;avoir dans ma Dropbox, et je pourrais presque me passer de <em>Maven The Definitive Guide</em>.</p>
<p>Chaque lecteur, en fonction de sa propre expérience, trouvera des choses à redire. Pour ma part, j&#8217;aurais souhaité que certains points soient approfondis comme les extensions ou l&#8217;écriture de plugins. Cette seconde édition apporte certainement son lot de correction, mais inévitablement les nouvelles parties ajoutées comportent leur lot d&#8217;erreurs. Heureusement elles restent mineures et ne nuisent pas à la compréhension du passage concernée. La perle étant le listing du code de la page 185 (à lire si vous avez le bouquin sous la main <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ).</p>
<p>Assez de bavardages, cet excellent ouvrage est à mettre entre toutes vos mains, car vous utilisez tous Maven. Voici la <a href="http://www.pearson.fr/livre/?GCOI=27440100487310" target="_blank">page du livre chez l&#8217;éditeur</a> contenant la table des matières ainsi que des extraits.</p><p>The post <a href="https://blog.infine.com/jai-teste-le-livre-apache-maven-version-2-et-3-par-nicolas-de-loof-et-arnaud-heritier-1248">J’ai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/jai-teste-le-livre-apache-maven-version-2-et-3-par-nicolas-de-loof-et-arnaud-heritier-1248/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Devoxx 2011 &#8211; Ceylon</title>
		<link>https://blog.infine.com/devoxx-2011-ceylon-1414?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=devoxx-2011-ceylon</link>
					<comments>https://blog.infine.com/devoxx-2011-ceylon-1414#respond</comments>
		
		<dc:creator><![CDATA[Florian Boulay]]></dc:creator>
		<pubDate>Wed, 30 Nov 2011 15:00:49 +0000</pubDate>
				<category><![CDATA[Conférence]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[language]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1414</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span> Ceylon est un nouveau langage s&#8217;exécutant sur la JVM. Il rejoint une liste désormais assez longue qui comprend notamment : Groovy Jython Jruby Scala Kotlin Fantom Gosu &#8230; Gavin King a créé Ceylon parce qu&#8217;il était frustré par les limitations de Java. Cette session a été animée par deux français, Emmanuel Bernard et Stéphane Epardaud &#8230;</p>
<p>The post <a href="https://blog.infine.com/devoxx-2011-ceylon-1414">Devoxx 2011 – Ceylon</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span><p><a href="https://blog.infine.com/wp-content/uploads/2011/11/ceylon-logo.png" class="fancyboxgroup" rel="gallery-1414" title="ceylon logo"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/11/ceylon-logo.png" alt="ceylon logo" title="ceylon logo" width="325" height="100" class="alignright size-full wp-image-1417" srcset="https://blog.infine.com/wp-content/uploads/2011/11/ceylon-logo.png 325w, https://blog.infine.com/wp-content/uploads/2011/11/ceylon-logo-300x92.png 300w" sizes="(max-width: 325px) 100vw, 325px" /></a></p>
<p>Ceylon est un nouveau langage s&#8217;exécutant sur la JVM. Il rejoint une liste désormais assez longue qui comprend notamment :</p>
<ul>
<li>Groovy</li>
<li>Jython</li>
<li>Jruby</li>
<li>Scala</li>
<li>Kotlin</li>
<li>Fantom</li>
<li>Gosu</li>
<li>&#8230;</li>
</ul>
<p>Gavin King a créé Ceylon parce qu&#8217;il était frustré par les limitations de Java. Cette session a été animée par deux français, Emmanuel Bernard et Stéphane Epardaud qui sont commiters sur le projet. Ils ont débuté la session en définissant les objectifs de Ceylon, avant de continuer sur ses fonctionnalités à l&#8217;aide de code. Je ne vais pas reproduire le code qu&#8217;ils ont utilisé pendant la présentation dans cet article, je vais essayer d&#8217;être plus concis.</p>
<p><span id="more-1414"></span></p>
<p>Emmanuel commence par nous indiquer les objectifs de Ceylon :</p>
<ul>
<li>Permettre d&#8217;écrire du code plus simple que l&#8217;équivalent en java</li>
<li>Éviter au développeur de tomber dans les principaux pièges de java</li>
</ul>
<p>Ceylon est pensé pour être lu facilement par des développeurs venant du monde Java. Emmanuel insiste bien sur ce point : Ceylon doit être simple à utiliser mais également simple à lire. Le code ne doit pas soulever d’ambiguïté. </p>
<h1>Principes de base</h1>
<h2>Classe simple</h2>
<pre class="brush: java; title: ; notranslate">
shared class User(String username, Natural age) {
    shared String username = username;
    shared Natural age = age;

    shared void printUser() {
        print(&quot;User name : &quot; username &quot; with age &quot; age &quot; is printed&quot;);
    }
}
</pre>
<p>Cette classe est courte, mais il y a déjà plusieurs choses à dire dessus :</p>
<ul>
<li>Le mot-clé <code>class</code> indique évidemment qu&#8217;il s&#8217;agit d&#8217;une déclaration de classe</li>
<li>Le mot-clé <code>shared</code> est l&#8217;équivalent du <code>public</code> de Java. Si le mot-clé <code>shared</code> est omis, alors la visibilité est privée (visibilité par défaut en Ceylon)</li>
<li>A la suite de la déclaration de la classe <code>User</code> se trouvent des paramètres <code>(String username, Natural age)</code>, il s&#8217;agit de la déclaration du constructeur. Je dis bien <strong>du</strong> car une Ceylon interdit la surcharge de méthode et donc un seul constructeur est autorisé</li>
<li><code>Natural</code> est l&#8217;objet représentant un nombre entier naturel. En Ceylon, il n&#8217;y a pas de type primitif</li>
<li>Les attributs de la classe sont obligatoirement initialisés, il n&#8217;y a pas de valeur par défaut, même <code>null</code> n&#8217;est pas implicite. Ici, les valeurs sont celles fournies au constructeur</li>
<li>La déclaration de la méthode <code>printUser</code> se fait comme en Java, le mot-clé <code>shared</code> en plus si on souhaite l&#8217;exposer</li>
<li>La concaténation de chaîne de caractère peut se faire sans le caractère <strong>+</strong>. La concaténation avec le caractère <strong>+</strong> fonctionne également</li>
</ul>
<h2>Méthodes</h2>
<pre class="brush: java; highlight: [2,6,12,22]; title: ; notranslate">
shared class Parent() {
    shared default void printMe() {
         print(&quot;I'm in parent class&quot;);
    }

    shared void printMessage(String messageToPrint = &quot;default argument value&quot;) {
         print(&quot;I'm in parent class and I print &quot; + messageToPrint);
    }
}

shared class Child() extends Parent() {
    shared actual void printMe() {
         print(&quot;I'm in child class&quot;);
    }
}

void testCeylon() {
    // appel de méthodes
    Parent p = Parent();
    p.printMe();
    p.printMessage(); // default value of parameter used - will work on milestone 2
    p.printMessage(&quot;message given as argument&quot;);  // classic call
    p.printMessage {  // name argument used
        messageToPrint = &quot;message with named arguments&quot;;
    };
}
</pre>
<p>Encore une fois, malgré la petite taille de code et sa lisibilité, plusieurs fonctionnalités sont à décrire :</p>
<ul>
<li>Comme dit plus haut, les méthodes ne sont pas surchargeables. Pour palier à cette obligation les paramètres peuvent avoir des valeurs par défaut (ligne 6), des <em>varargs</em> peuvent être utilisés (comme en java), ou des <em>union types</em> peuvent être utilisés (voir la doc pour plus de détails)</li>
<li>Les paramètres des méthodes sont nommés &#8211; ligne 22</li>
<li>Les méthodes peuvent être redéfinies dans les classes filles mais il faut l&#8217;autoriser explicitement grâce au mot clé <code>default</code> dans la classe parent (équivalent du <code>virtual</code> du C++ utilisé dans la classe parent) &#8211; ligne 2</li>
<li>Lors de la rédéfinition de la méthode dans une classe fille, il faut obligatoirement utiliser le mot-clé <code>actual</code> (équivalent à l&#8217;annotation <code>@Override</code> de Java) &#8211; ligne 12</li>
</ul>
<h2>null et immuabilité</h2>
<p>Par défaut toutes les variables sont immuables en Ceylon. Afin de les rendre modifiables il faut explicitement adapter la syntaxe de déclaration d&#8217;une variable en ajoutant le mot-clé <code>variable</code> et effectuer l&#8217;affectation avec l&#8217;opérateur <strong>:=</strong> : </p>
<pre class="brush: java; title: ; notranslate">
shared class ImmutableExample(Natural year) {
    // immutable
    Natural year = year;
    // Mutable
    variable Natural writableYear := year;
}
</pre>
<p>Afin d&#8217;éviter les trop nombreux <code>NullPointerException</code> de Java, une variable qui pourrait contenir la valeur  <code>null</code> doit être déclaré à l&#8217;aide d&#8217;un <code>?</code>. Ceci a des conséquences sur la manière d&#8217;utiliser ces variables comme le montre le code ci-dessous :</p>
<pre class="brush: java; title: ; notranslate">
// myBestVariable can be null
String? myBestVariable = functionThatCanReturnNull();
// to work on myBestVariable, a null check must be done
if (exists myBestVariable) {
    functionThatNeedAString(myBestVariable);
}
else {
    functionThatNeedAString(&quot;default value&quot;);
}
</pre>
<h2>Autres fonctionnalités</h2>
<p>Emmanuel et Stéphane ont présenté d&#8217;autres fonctionnalités importantes de Ceylon telles que les <em>union type</em> et les <em>intersection type</em>. Pour plus de détails, reportez vous à la <a href="http://ceylon-lang.org/documentation/tour/types/">documentation officielle.</a><br />
Malgré les arguments nommés, il est possible d&#8217;utiliser les generics. Les annotations sont également disponibles.<br />
La compatibilité entre Java et Ceylon est également disponible. Ceylon peut utiliser du code écrit en Java, et Java peut appeler du code Ceylon.</p>
<h1>En pratique</h1>
<p>Emmanuel et Stéphane, après avoir transmis les bases à l&#8217;auditoire, effectuent une démo en live de Ceylon dans Eclipse. Un plugin Eclipse a été développé et est déjà fontionnel. L&#8217;autocomplétion fonctionne bien, la coloration syntaxique et le refactoring également. Plus d&#8217;infos sur le <a href="https://github.com/ceylon/ceylon-ide-eclipse">repo git</a> associé.</p>
<p>Aucune version de Ceylon n&#8217;a encore été releasée. La prochaine version à sortir sera la milestone 1 qui ne comprendra pas encore toutes les fonctionnalités de la spécification. Trois milestones sont prévues avant que la version 1.0 ne sorte.</p>
<h2>Test de Ceylon</h2>
<p>Il est évidemment possible aujourd&#8217;hui de tester dès aujourd&#8217;hui Ceylon et pour cela, j&#8217;ai réalisé un petit screencast afin de vous montrer qu&#8217;avoir le compilateur Ceylon utilisable sur son poste est vraiment simple et rapide.</p>
<p>Les prérequis sont d&#8217;avoir sur sa machine Java 6, Ant et Git. Dans le screencast, je clone les trois repositories Git nécessaires à la création du compilateur. Chacun nécessite Ant afin d&#8217;être compilé. Une fois le compilateur généré, je le teste en compilant l&#8217;exemple de code que j&#8217;ai donné ci-dessus dans le paragraphe <em>Méthodes</em>, et je l&#8217;exécute.</p>
<p><iframe loading="lazy" src="http://player.vimeo.com/video/32661574?title=0&amp;portrait=0&amp;color=ff9933" width="660" height="371" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p>Pour ceux qui veulent tester, je vous retranscrits les commandes utilisées dans le screencast afin de faciliter le copier coller</p>

<table id="wp-table-reloaded-id-1-no-1" class="wp-table-reloaded wp-table-reloaded-id-1">
<thead>
	<tr class="row-1 odd">
		<th class="column-1">Repository Git</th><th class="column-2">Commande pour compiler le repository</th>
	</tr>
</thead>
<tbody class="row-hover">
	<tr class="row-2 even">
		<td class="column-1">git://github.com/ceylon/ceylon.language.git</td><td class="column-2">ant clean publish</td>
	</tr>
	<tr class="row-3 odd">
		<td class="column-1">git://github.com/ceylon/ceylon-spec.git</td><td class="column-2">ant clean tree publish</td>
	</tr>
	<tr class="row-4 even">
		<td class="column-1">git://github.com/ceylon/ceylon-compiler.git</td><td class="column-2">ant clean build</td>
	</tr>
</tbody>
</table>

<p>Une fois le compilateur généré, je l&#8217;ai testé. Mon fichier source se nomme <em>florian_boulay.ceylon</em> et se trouve dans le répertoire <em>samples</em>. Le répertoire <em>build</em> contient les fichiers Ceylon compilés. <em>testCeylon</em> correspond au nom de la fonction appelée pour lancer le programme.</p>

<table id="wp-table-reloaded-id-2-no-1" class="wp-table-reloaded wp-table-reloaded-id-2">
<tbody class="row-hover">
	<tr class="row-1 odd">
		<td class="column-1">Compilation du fichier Ceylon</td><td class="column-2">~/ceylon/ceylon-compiler/bin/ceylonc -src samples -out build samples/florian_boulay.ceylon</td>
	</tr>
	<tr class="row-2 even">
		<td class="column-1">Exécution du fichier Ceylon</td><td class="column-2">~/ceylon/ceylon-compiler/bin/ceylon -cp build/unversioned/default_module-unversioned.car testCeylon</td>
	</tr>
</tbody>
</table>

<p>Ceylon est un langage simple à comprendre pour qui vient de Java. En écrire est également à la portée de tous. Jusque là les objectifs de Gavin King sont atteints.</p>
<h2> Fin de la session</h2>
<p>Pour finir, Emmanuel nous indique que Ceylon a enfin sont site web : <a href="http://ceylon-lang.org">http://ceylon-lang.org</a></p>
<p>Il contient une documentation très complète, la spécification du langage écrite par Gavin King, un blog et tout ce qu&#8217;il faut pour contribuer au développement du langage. C&#8217;est là bas qu&#8217;il faut aller si vous souhaitez tester le langage qui n&#8217;a pas encore été releasé, mais peut être testé via la récupération du code source sur Github.</p>
<p>Comme vous le voyez, le logo de Ceylon est un éléphant, est-ce un hommage à PHP ? On peut lui souhaiter qu&#8217;il ait le même succès que PHP</p>
<p>De nombreux nouveaux langages ont émergé ces derniers mois fonctionnant sur la JVM (Eclipse Xtend, JetBrains Kotlin). Comme dit plus haut, Ceylon veut rester accessible à tout le monde en restant simple et facilement compréhensible. Est-ce que ces atouts seront suffisants pour faire de Ceylon une alternative à Java réellement utilisée, comme l&#8217;est Scala aujourd&#8217;hui ? Faites vous votre propre opinion et essayez le.</p><p>The post <a href="https://blog.infine.com/devoxx-2011-ceylon-1414">Devoxx 2011 – Ceylon</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/devoxx-2011-ceylon-1414/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
