<?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>In Fine blog</title> <atom:link href="http://blog.infine.com/feed" rel="self" type="application/rss+xml" /><link>http://blog.infine.com</link> <description>Blog JEE, Android, .NET, BRMS, Finance - In Fine Consulting</description> <lastBuildDate>Fri, 11 May 2012 13:26:58 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Bilan de Devoxx France</title><link>http://blog.infine.com/bilan-de-devoxx-france-1987</link> <comments>http://blog.infine.com/bilan-de-devoxx-france-1987#comments</comments> <pubDate>Fri, 11 May 2012 13:00:20 +0000</pubDate> <dc:creator>Florian Boulay</dc:creator> <category><![CDATA[Conférence]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[devoxx]]></category><guid isPermaLink="false">http://blog.infine.com/?p=1987</guid> <description><![CDATA[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. [...]]]></description> <content:encoded><![CDATA[<p><a href="http://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate.jpg" class="fancyboxgroup" rel="gallery-1987" title="Logo Devoxx France"><img src="http://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate-300x154.jpg" alt="logo devoxx fr negate 300x154 Bilan de Devoxx France" title="Logo Devoxx France" width="300" height="154" class="alignleft size-medium wp-image-1984" /></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><div id="attachment_1989" class="wp-caption aligncenter" style="width: 233px"><a href="http://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 src="http://blog.infine.com/wp-content/uploads/2012/04/boss_loof_mac_book_air-223x300.jpg" alt="boss loof mac book air 223x300 Bilan de Devoxx France" title="Antoine Ramponi et Nicolas de Loof sur le stand In Fine" width="223" height="300" class="size-medium wp-image-1989" /></a><p 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></p></div><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 0;
    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(){
        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é 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> ]]></content:encoded> <wfw:commentRss>http://blog.infine.com/bilan-de-devoxx-france-1987/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>L&#8217;application Devoxx France d&#8217;In Fine est disponible sur le Google Play Store</title><link>http://blog.infine.com/lapplication-devoxx-france-din-fine-est-disponible-sur-le-google-play-store-1954</link> <comments>http://blog.infine.com/lapplication-devoxx-france-din-fine-est-disponible-sur-le-google-play-store-1954#comments</comments> <pubDate>Fri, 30 Mar 2012 11:21:45 +0000</pubDate> <dc:creator>Florian Boulay</dc:creator> <category><![CDATA[Android]]></category> <category><![CDATA[Conférence]]></category> <category><![CDATA[android]]></category> <category><![CDATA[devoxx]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[play framework]]></category><guid isPermaLink="false">http://blog.infine.com/?p=1954</guid> <description><![CDATA[In Fine, en tant que partenaire de l&#8217;évènement majeur qu&#8217;est Devoxx France, a le plaisir de mettre à disposition une application pour Devoxx France sur Android. Cette première version permet : De mettre en favoris vos sessions préférées De consulter le planning des sessions, et le détail des speakers De voir ce qui se passe [...]]]></description> <content:encoded><![CDATA[<p><a href="http://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate.jpg" class="fancyboxgroup" rel="gallery-1954" title="Logo Devoxx France"><img src="http://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate-300x154.jpg" alt="logo devoxx fr negate 300x154 Lapplication Devoxx France dIn Fine est disponible sur le Google Play Store" title="Logo Devoxx France" width="300" height="154" class="alignright size-medium wp-image-1984" /></a></p><p>In Fine, en tant que partenaire de l&#8217;évènement majeur qu&#8217;est Devoxx France, a le plaisir de mettre à disposition une application pour Devoxx France sur Android. Cette première version permet :</p><ul><li>De mettre en favoris vos sessions préférées</li><li>De consulter le planning des sessions, et le détail des speakers</li><li>De voir ce qui se passe sur Twitter avec le tag <em>devoxxfr</em></li><li>D&#8217;avoir accès au plan des 2 étages de l&#8217;hôtel où se déroulera la conférence</li><li>Et d&#8217;autres fonctionnalités&#8230;</li></ul><p><span id="more-1954"></span></p><p>Cette application fonctionne parfaitement sur téléphone , mais n&#8217;est pas encore totalement adaptée pour les tablettes. Dans les semaines qui viennent, nous allons continuer à mettre à jour l&#8217;application pour qu&#8217;elle soit la plus simple à utiliser possible. Voici une prévision des futures évolutions  :</p><ul><li>Complète adaptation de l&#8217;ergonomie de l&#8217;application aux tablettes</li><li>Ajout de la recherche sur les speakers. Actuellement elle ne fonctionne que sur les sessions</li><li>Quand on clique sur une salle, afficher la carte de l&#8217;étage correspondant</li><li>Pouvoir mettre en favori des speakers</li><li>Et bien d&#8217;autres choses qui dépendront des retours que nous aurons</li></ul><p>Nous sommes très fiers de mettre à disposition cette application. Elle sera mise en open source au moment de la conférence Devoxx France, certainement en licence Apache 2.<br /> Si vous rencontrez des problèmes ou avez des suggestions, écrivez un commentaire ici, ou envoyer un mail au compte indiqué sur la fiche du Google Play Store.</p><p>Dans la suite de l&#8217;article, nous allons approfondir l&#8217;aspect technique de l&#8217;application. Si au contraire vous souhaitez directement aller télécharger l&#8217;application, alors il faut aller ici : <a href="https://play.google.com/store/apps/details?id=com.infine.android.devoxx">Play Store</a></p><h2>Architecture technique</h2><div id="attachment_1964" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.infine.com/wp-content/uploads/2012/03/archi_appli_android_devoxx1.png" class="fancyboxgroup" rel="gallery-1954" title="Lapplication Devoxx France dIn Fine est disponible sur le Google Play Store"><img class="size-medium wp-image-1964" src="http://blog.infine.com/wp-content/uploads/2012/03/archi_appli_android_devoxx1-300x164.png" alt="archi appli android devoxx1 300x164 Lapplication Devoxx France dIn Fine est disponible sur le Google Play Store" width="300" height="164" title="Lapplication Devoxx France dIn Fine est disponible sur le Google Play Store" /></a><p class="wp-caption-text"><em>Architecture applicative de l&#039;application Devoxx France In Fine</em></p></div><p>Comme le montre le schéma ci-dessus, nous n&#8217;avons pas directement connecté l&#8217;application Android avec les API RESTful fournies par le site Devoxx. En effet les temps de réponse sont très variables, certains service ont déjà mis plus de 5 minutes à répondre. D&#8217;autre part, certains service renvoient des données en double ou incomplètes.<br /> Le serveur intérmédiaire permet donc de mieux maîtriser les données. Grâce à Play et à Mongo DB, les temps de réponse sont excellents et la charge que peut encaisser le serveur est bien au dessus de ce que nous atteindrons. Un test JMeter a mesuré que le serveur pouvait encaisser 300 requêtes par secondes. La plupart des requêtes répondent en moins de 0.1 seconde. Nous estimons que le serveur aurait à supporter, au maximum de son activité, 25 requêtes par minute</p> ]]></content:encoded> <wfw:commentRss>http://blog.infine.com/lapplication-devoxx-france-din-fine-est-disponible-sur-le-google-play-store-1954/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Tomcat 6 &#8211; JNDI &#8211; password crypté et pool de connexion V7</title><link>http://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275</link> <comments>http://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275#comments</comments> <pubDate>Thu, 02 Feb 2012 09:00:11 +0000</pubDate> <dc:creator>Christian Nguyen Van Than</dc:creator> <category><![CDATA[Intermédiaire]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[jndi]]></category> <category><![CDATA[pool]]></category> <category><![CDATA[tomcat]]></category><guid isPermaLink="false">http://blog.infine.com/?p=1275</guid> <description><![CDATA[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 [...]]]></description> <content:encoded><![CDATA[<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='http://blog.infine.com/wp-includes/images/smilies/icon_sad.gif' alt="icon sad Tomcat 6   JNDI   password crypté et pool de connexion V7" class='wp-smiley' title="Tomcat 6   JNDI   password crypté et pool de connexion V7" /> &#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='http://blog.infine.com/wp-includes/images/smilies/icon_smile.gif' alt="icon smile Tomcat 6   JNDI   password crypté et pool de connexion V7" class='wp-smiley' title="Tomcat 6   JNDI   password crypté et pool de connexion V7" /></p><p>Les sources sont disponibles <a href="https://github.com/nguyenvanthan/Tomcat-Datasource-Factory" target="_blank">ici</a></p> ]]></content:encoded> <wfw:commentRss>http://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>http://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411</link> <comments>http://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411#comments</comments> <pubDate>Thu, 26 Jan 2012 11:00:56 +0000</pubDate> <dc:creator>Christian Nguyen Van Than</dc:creator> <category><![CDATA[Débutant]]></category> <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">http://blog.infine.com/?p=1411</guid> <description><![CDATA[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 [...]]]></description> <content:encoded><![CDATA[<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="http://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1.png" class="fancyboxgroup" rel="gallery-1411" title="Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..."><img class="alignnone size-large wp-image-1450" src="http://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1-1024x646.png" alt="plateforme de test1 1024x646 Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..." width="807" height="509" title="Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..." /></a></p><p><span style="text-decoration: underline">Conclusion :</span></p><p><a href="http://blog.infine.com/wp-content/uploads/2011/11/conclusion.png" class="fancyboxgroup" rel="gallery-1411" title="Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..."><img class="alignnone size-large wp-image-1449" src="http://blog.infine.com/wp-content/uploads/2011/11/conclusion-1024x283.png" alt="conclusion 1024x283 Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..." width="778" height="215" title="Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..." /></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="http://blog.infine.com/wp-content/uploads/2011/12/results_numbers.jpg" class="fancyboxgroup" rel="gallery-1411" title="Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..."><img class="alignnone size-full wp-image-1838" src="http://blog.infine.com/wp-content/uploads/2011/12/results_numbers.jpg" alt="results numbers Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..." width="511" height="445" title="Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..." /></a></p><p><a href="http://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph.jpg" class="fancyboxgroup" rel="gallery-1411" title="Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..."><img class="alignnone size-large wp-image-1839" src="http://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph-1024x615.jpg" alt="conc users graph 1024x615 Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..." width="1024" height="615" title="Devoxx 2011   Comparatif de performances des frameworks web Java et plus encore ..." /></a></p><p><a href="http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/">Plus de détails ici</a></p> ]]></content:encoded> <wfw:commentRss>http://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>http://blog.infine.com/jai-teste-le-livre-apache-maven-version-2-et-3-par-nicolas-de-loof-et-arnaud-heritier-1248</link> <comments>http://blog.infine.com/jai-teste-le-livre-apache-maven-version-2-et-3-par-nicolas-de-loof-et-arnaud-heritier-1248#comments</comments> <pubDate>Fri, 20 Jan 2012 12:30:34 +0000</pubDate> <dc:creator>Florian Boulay</dc:creator> <category><![CDATA[Java]]></category> <category><![CDATA[livre]]></category> <category><![CDATA[maven]]></category><guid isPermaLink="false">http://blog.infine.com/?p=1248</guid> <description><![CDATA[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 [...]]]></description> <content:encoded><![CDATA[<p><a href="http://blog.infine.com/wp-content/uploads/2011/09/apache_maven.jpg" class="fancyboxgroup" rel="gallery-1248" title="Jai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier"><img class="alignleft size-medium wp-image-1249" src="http://blog.infine.com/wp-content/uploads/2011/09/apache_maven-300x300.jpg" alt="apache maven 300x300 Jai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier" width="200" height="200" title="Jai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier" /></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><div id="attachment_1884" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.infine.com/wp-content/uploads/2012/01/csi_maven.png" class="fancyboxgroup" rel="gallery-1248" title="CSI Maven"><img src="http://blog.infine.com/wp-content/uploads/2012/01/csi_maven-300x258.png" alt="csi maven 300x258 Jai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier" title="CSI Maven" width="300" height="258" class="size-medium wp-image-1884" /></a><p class="wp-caption-text"><em>Et en plus, cet ouvrage est drôle</em></p></div><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><div id="attachment_1887" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.infine.com/wp-content/uploads/2012/01/Extreme_makeover_maven.png" class="fancyboxgroup" rel="gallery-1248" title="Extreme Makeover Maven"><img src="http://blog.infine.com/wp-content/uploads/2012/01/Extreme_makeover_maven-300x128.png" alt="Extreme makeover maven 300x128 Jai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier" title="Extreme Makeover Maven" width="300" height="128" class="size-medium wp-image-1887" /></a><p class="wp-caption-text"><em>Quand je vous disais qu'il était drôle</em></p></div><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='http://blog.infine.com/wp-includes/images/smilies/icon_smile.gif' alt="icon smile Jai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier" class='wp-smiley' title="Jai testé le livre : Apache Maven version 2 et 3 par Nicolas De Loof et Arnaud Héritier" /> ).</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> ]]></content:encoded> <wfw:commentRss>http://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>Extreme programming : retour d&#8217;expérience</title><link>http://blog.infine.com/extreme-programming-retour-dexperience-1780</link> <comments>http://blog.infine.com/extreme-programming-retour-dexperience-1780#comments</comments> <pubDate>Tue, 10 Jan 2012 14:00:12 +0000</pubDate> <dc:creator>Nicolas Lecrique</dc:creator> <category><![CDATA[Agilité]]></category> <category><![CDATA[agile]]></category> <category><![CDATA[experience]]></category> <category><![CDATA[extreme]]></category> <category><![CDATA[programming]]></category> <category><![CDATA[retour]]></category> <category><![CDATA[XP]]></category><guid isPermaLink="false">http://blog.infine.com/?p=1780</guid> <description><![CDATA[Intro SCRUM, Extreme Programming (XP), Lean-management, le développement agile, c’est tendance ! Objectifs : améliorer la réactivité, la qualité et le coût du logiciel avec en ligne de mire la sacro-sainte satisfaction client. J’ai participé, pendant deux ans, à un projet réalisé « from scratch » en suivant une méthodologie agile : l’Extreme programming. En tant que développeur (sur [...]]]></description> <content:encoded><![CDATA[<h2><strong>Intro</strong></h2><p>SCRUM, Extreme Programming (XP), Lean-management, le développement agile, c’est tendance !</p><p>Objectifs : améliorer la réactivité, la qualité et le coût du logiciel avec en ligne de mire la sacro-sainte satisfaction client.</p><p>J’ai participé, pendant deux ans, à un projet réalisé « from scratch » en suivant une méthodologie agile : l’Extreme programming. En tant que développeur (sur les deux ans), et « coach XP » (sur les six derniers mois).  L’objectif du projet était le développement d’une application de trading « in-house » dans une banque d’investissement, la taille de l’équipe a varié au cours de ces deux ans de 3 à 7 (manager compris).</p><p>Ce post a pour but d’expliquer les pour et les contre de cette méthode tel que je l’ai vécu.</p><p><span id="more-1780"></span></p><h2><strong>L’extreme programming</strong></h2><p>Sans chercher à être exhaustif (wikpedia est ton ami), voici les grands principes XP :</p><ul><li><strong>Pair-programming</strong> : on code à deux devant un PC, le codeur et le reviewer. les rôles s&#8217;inversant régulièrement. On change de binôme à chaque tâche.</li><li> <strong>TDD</strong> (Test driven development) : chaque méthode, chaque portion de code est systématiquement testée <span style="text-decoration: underline">avant</span> d’être codée.</li><li><strong>KISS</strong> (Keep It Simple, Stupid) : On cherche toujours la solution la plus simple sans anticiper les besoins futures (pêché mignon du développeur ?).</li><li><strong>Refactoring</strong> : On cherche en permanence à avoir le code le plus propre possible</li><li> <strong>Itérations courtes</strong> : le cycle développement-release est très court (1 semaine à 1 mois)</li></ul><h2><strong>Les plus</strong></h2><ul><li><strong>Un code clean</strong> : Non seulement l’XP via ses principes favorise une plus grande qualité de code, mais j’irai plus loin : il l’impose ! En effet, le TDD dans du code spaghettis, dupliqué, du code mort…c’est sinon impossible, franchement pénible. Idem pour le refactoring, très cher s’il n’est pas fait suffisamment tôt.</li><li><strong>Agilité</strong> : Je vous entends « Il est malin le type, c’est l’objectif ! ». Ok, mais c’est un objectif atteint. Le client peut changer d’avis et ses priorités comme de chemise (et il ne s’en prive pas).</li><li><strong>L’équipe te rend plus fort</strong> : Grace au pair-programming, les développeurs montent rapidement en compétence. Pour le développeur, c’est l’opportunité de se former grâce au reste de l’équipe. Se former sur l’application bien sur, mais aussi sur tout ce qu’on peut apprendre à observer un autre développeur à l’oeuvre.</li><li><strong>Interchangeabilité</strong> : XP refuse la spécialisation, chaque développeur doit maîtriser l’ensemble de l’application. C’est possible en associant sur chaque développement un « sachant » et un « ignorant » sur la partie concernée. C’est clairement un luxe pour le manager étant donné le turnover dans la plupart des projets informatiques. Les mauvaises langues parleront de développeur « jetable », mais pour le projet, c’est un plus.</li></ul><h2><strong>Les moins</strong></h2><ul><li><strong>Dites au revoir à votre « Touch »</strong> : Si vous aimez utiliser vos raccourcis « custom », vos conventions de nommage, vos patterns, vos lib. Bref ! VOTRE façon de coder : Oubliez ! vous allez coder la moitié du temps sur un autre PC, et quelqu’un d’autre codera sur le votre. L’uniformisation des l’environnement, des outils et des pratiques est par conséquent obligatoire. C’est positif pour le projet, mais l’effort d’adaptation est réel.</li><li><strong>Explications, négociations, compromis :</strong> Développer à deux, ce n’est pas naturel. Il faut en permanence argumenter, expliquer son cheminement de pensée. Quand au reviewer, il doit rester concentrer sans le clavier, challenger chaque décision,  être force de proposition et chasser chaque bug ou coquille, il doit enfin être patient s’il maitrise mieux le sujet sans chercher à « attraper » le clavier. Il faut aussi veiller à garder un équilibre, le plus timide ou le plus junior ne devant pas se faire « manger ». Bref, c’est formateur, le code écrit est meilleur, mais je suis convaincu que c’est plus exigent que de coder seul.</li><li><strong>Le TDD, ce n’est pas sexy : </strong>Je suis fermement convaincu de l’intérêt du TDD (limitation des bugs et des régressions, refactoring sure, spécification, code découplé), mais il faut avouer qu’écrire des centaines de tests et avoir la (fausse ?) impression d’aller deux fois moins vite, c’est parfois rébarbatif.</li><li><strong>Pas de petit chef</strong> : Le pair-programming, l’absence de spécialisation et la volonté en XP d’aller vers l’essentiel (le code) limite quelque part les responsabilités du développeur. Dans une équipe classique, chaque développeur deviendra probablement référent sur certains domaines, participera à des réunions, et prendra en charge certaines responsabilités.  En XP, le manager manage, les codeurs codent (PS : si c’est tout ce que vous aimez, vous pouvez passer cela dans la rubrique plus), et nul n’est indispensable.</li></ul><p>Avant de conclure, quelques remarques inclassables, ni en plus, ni en moins</p><h2><strong>L&#8217;extreme programming, à prendre ou a laisser.</strong></h2><p>Je ne vois pas les différentes pratiques de l’XP comme une boîte à outil où l’on prend et on jette en fonction des envies. Les différentes pratiques se complètent et se renforcent mutuellement.</p><ul><li>Pour livrer très fréquemment, il faut pouvoir valider une version très rapidement, d’où le TDD. (Si vous voulez tester l’application de fond en comble tous les 15 jours à la main, ce sera sans moi).</li><li>Prendre systématiquement la solution la plus simple en négligeant le refactoring, c’est la porte ouverte au code spaggeti et autres rustines.</li><li>Faire du refactoring fréquemment sans couverture de tests unitaires, c’est l’assurance de régressions.</li><li>Refactorer, c’est bien plus sûr avec une deuxième paire d’yeux.</li></ul><p>Bien sur, ça n’est pas vrai pour tout,  le TDD n’a pas attendu l’XP pour exister.</p><h2><strong>N’est pas XP qui veut</strong></h2><p>Tout projet n’est pas adapté à l’XP. Il faut un client accessible et prêt à s’investir et des développeurs ouverts aux pratiques XP. Il faut enfin que le manager soit convaincu par la méthode et à l’écoute des développeurs (accepter les coûts donnés par des développeurs et les dépassements inévitables par exemple).</p><p>L’environnement de développement est également primordial. Framework de tests unitaires, de mocking, outils de refactoring, d’analyse statique de code, de couverture de tests, usine de build…Tous ces outils « nice-to-have » dans un autre projet deviennent plus ou moins indispensables en XP. En conséquence,  un projet C++ ou dans un langage web est sans doute moins adapté à l’XP qu’un projet Java ou .NET.</p><h2><strong>Conclusion</strong></h2><p>Au final, même si j’ai la critique un petit peu facile par nature, je me range plutôt du côté des « pro-XP / pro-agiles » .Le projet auquel j’ai participé est à mon avis un succès, mais il est important de noter qu’il correspond en tous points au « contexte idéal » décrit ci-dessus.</p><p>Quant aux objectifs mentionnés au début du post (améliorer la réactivité, la qualité et le coût du logiciel), les deux premiers sont clairement atteints. Pour le troisième,  c’est la question à 1 Milliard.</p><p>Ce qui est sûr, c’est que l’on est très loin d’un coût multiplié par quatre. Certes on code deux fois plus (TDD), et à un instant donné, la moitié de l’équipe ne code pas (elle ne dort pas non plus). Mais cela est compensé par des bugs à fixer en moins, un code de meilleur qualité, une montée en compétence plus rapide et un scope correspondant exactement au besoin client. Est-ce que c’est « surcompensé » ou « sous-compensé », là est le vrai débat. Mon intuition c’est que le gain est négatif dans un premier temps (un an, peut-être deux) puis positif par la suite.</p><p>Voilà pour ma vision de l’Extreme programming, à prendre pour ce que c’est, un avis basé sur une expérience mais certainement pas une vérité.</p> ]]></content:encoded> <wfw:commentRss>http://blog.infine.com/extreme-programming-retour-dexperience-1780/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Marchés actions: un rallye de noël en 2011?</title><link>http://blog.infine.com/marches-actions-un-rallye-de-noel-en-2011-1788</link> <comments>http://blog.infine.com/marches-actions-un-rallye-de-noel-en-2011-1788#comments</comments> <pubDate>Wed, 14 Dec 2011 08:00:05 +0000</pubDate> <dc:creator>Seb Berrier</dc:creator> <category><![CDATA[Finance]]></category> <category><![CDATA[actions]]></category> <category><![CDATA[bourse]]></category> <category><![CDATA[CAC 40]]></category> <category><![CDATA[finance]]></category> <category><![CDATA[marchés]]></category> <category><![CDATA[noël]]></category> <category><![CDATA[rallye]]></category><guid isPermaLink="false">http://blog.infine.com/?p=1788</guid> <description><![CDATA[Traditionnellement, les fêtes de fin d’année sont une période faste pour les marchés actions. Les pessimistes en vacances, les bonus de fin d’année ou la joie de cette période de fête sont autant de raisons discutables avancées pour expliquer ce phénomène. Toujours est-il que pratiquement tous les ans, pendant les deux semaines incluant noël et [...]]]></description> <content:encoded><![CDATA[<p style="text-align: justify">Traditionnellement, les fêtes de fin d’année sont une période faste pour les marchés actions. Les pessimistes en vacances, les bonus de fin d’année ou la joie de cette période de fête sont autant de raisons discutables avancées pour expliquer ce phénomène. Toujours est-il que pratiquement tous les ans, pendant les deux semaines incluant noël et le nouvel an, le marché progresse mieux que sa moyenne de l’année, dans des volumes restant toutefois assez faibles.</p><p style="text-align: justify">Pour quantifier cet effet sur les dix dernières années, j’ai reconstitué les performances annuelles du CAC 40 depuis 2001 que j’ai comparées aux performances de ce même CAC 40 sur la période allant du 15 décembre au 03 janvier, chaque année. Ces performances sont ensuite annualisées pour faciliter la comparaison. Les résultats sont visibles dans le tableau suivant :</p><p><span id="more-1788"></span></p><p style="text-align: justify"><div id="attachment_1791" class="wp-caption aligncenter" style="width: 574px"><a href="http://blog.infine.com/wp-content/uploads/2011/12/XmasRally.png" class="fancyboxgroup" rel="gallery-1788" title="Marchés actions: un rallye de noël en 2011?"><img class="size-full wp-image-1791 " src="http://blog.infine.com/wp-content/uploads/2011/12/XmasRally.png" alt="XmasRally Marchés actions: un rallye de noël en 2011?" width="564" height="314" title="Marchés actions: un rallye de noël en 2011?" /></a><p class="wp-caption-text">Performances comparées du CAC 40 sur la période des fêtes et sur l&#039;année entière</p></div><p style="text-align: justify"><p style="text-align: justify"><p style="text-align: justify">La magie de noël semble faire son office avec une certaine régularité puisque tous les ans excepté 2007 (soit 9 années sur 10), le CAC 40 est monté sur la période des fêtes de fin d’année, toujours mieux que sa performance sur l’année entière ! En annualisé il enregistre une performance moyenne de 51.2% du 15 décembre au 03 Janvier, quand il a en moyenne perdu 2.8% sur l’année écoulée.</p><p style="text-align: justify">2011 et ses problèmes de dettes en Europe et aux Etats-Unis semblent annoncer une fin d’année un peu plus agitée que d’ordinaire, alors qu’attendre des marchés pour les jours qui viennent ?</p><p style="text-align: justify">Phénomène fantaisiste autoalimenté ou réalité saisonnière, le statisticien prônera la méfiance quant à l’interprétation d’un échantillon de données si petit, mais même à l’âge adulte, il est encore possible de croire au père noël ;-)</p> ]]></content:encoded> <wfw:commentRss>http://blog.infine.com/marches-actions-un-rallye-de-noel-en-2011-1788/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Devoxx 2011 &#8211; Ceylon</title><link>http://blog.infine.com/devoxx-2011-ceylon-1414</link> <comments>http://blog.infine.com/devoxx-2011-ceylon-1414#comments</comments> <pubDate>Wed, 30 Nov 2011 15:00:49 +0000</pubDate> <dc:creator>Florian Boulay</dc:creator> <category><![CDATA[Conférence]]></category> <category><![CDATA[Débutant]]></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">http://blog.infine.com/?p=1414</guid> <description><![CDATA[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 [...]]]></description> <content:encoded><![CDATA[<p><a href="http://blog.infine.com/wp-content/uploads/2011/11/ceylon-logo.png" class="fancyboxgroup" rel="gallery-1414" title="ceylon logo"><img src="http://blog.infine.com/wp-content/uploads/2011/11/ceylon-logo.png" alt="ceylon logo Devoxx 2011   Ceylon" title="ceylon logo" width="325" height="100" class="alignright size-full wp-image-1417" /></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 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> ]]></content:encoded> <wfw:commentRss>http://blog.infine.com/devoxx-2011-ceylon-1414/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx 2011 &#8211; Utilisation du GPU pour les applis Android</title><link>http://blog.infine.com/devoxx-2011-utilisation-du-gpu-pour-les-applis-android-1452</link> <comments>http://blog.infine.com/devoxx-2011-utilisation-du-gpu-pour-les-applis-android-1452#comments</comments> <pubDate>Fri, 25 Nov 2011 09:00:06 +0000</pubDate> <dc:creator>Victor Bonnet</dc:creator> <category><![CDATA[Conférence]]></category> <category><![CDATA[Intermédiaire]]></category> <category><![CDATA[android]]></category> <category><![CDATA[devoxx]]></category><guid isPermaLink="false">http://blog.infine.com/?p=1452</guid> <description><![CDATA[Chet Haase et Romain Guy nous ont présenté pendant Devoxx lors de la conférence Graphics goodies in Android, les nouveautés d’Android pour développer des applications qui tuent. Nous allons voir dans cet article l’utilisation de l&#8217;accélération graphique pour les rendus 2D des applications Android 3.0 et supérieures. L’openGL existe depuis les premières versions d’Android pour [...]]]></description> <content:encoded><![CDATA[<p><a href="http://graphics-geek.blogspot.com/">Chet Haase</a> et <a href="http://www.curious-creature.org/">Romain Guy</a> nous ont présenté pendant Devoxx lors de la conférence <a href="http://www.devoxx.com/display/DV11/Graphics+Goodies+in+Android">Graphics goodies in Android</a>, les nouveautés d’Android pour développer des applications qui tuent. Nous allons voir dans cet article l’utilisation de l&#8217;accélération graphique pour les rendus 2D des applications Android 3.0 et supérieures.</p><p>L’openGL existe depuis les premières versions d’Android pour les jeux et certains autres composants mais l&#8217;interface graphique des applications a toujours été “SOFTWARE”.<br /> Depuis Android 3.0 il est possible d’activer l&#8217;accélération graphique pour chaque application ce qui nous permet d’avoir une meilleur expérience utilisateur, avoir des animations plus fluides et de libérer un peu le CPU.</p><p><span id="more-1452"></span></p><h1 style="margin-top: 30px">Software rendering vs Hardware rendering</h1><p><a href="http://blog.infine.com/wp-content/uploads/2011/11/img3.jpg" class="fancyboxgroup" rel="gallery-1452" title="Devoxx 2011   Utilisation du GPU pour les applis Android"><img class="aligncenter size-full wp-image-1453" src="http://blog.infine.com/wp-content/uploads/2011/11/img3.jpg" alt="img3 Devoxx 2011   Utilisation du GPU pour les applis Android" width="642" height="498" title="Devoxx 2011   Utilisation du GPU pour les applis Android" /></a></p><p>Lorsqu’une application utilise l&#8217;accélération matérielle, l’OpenGL est utilisé lors de l’appel de la fonction Canvas.draw().</p><h1 style="margin-top: 40px">Activation de l&#8217;accélération matérielle</h1><p>Pour activer l’utilisation du GPU sur Android 3.0+, il suffit d’ajouter <span style="color: blue">android:hardwareAccelerated=</span><span style="color: green">&#8220;true&#8221;</span> dans le tag application du fichier AndroidManifest.xml. Ce simple ajout devrait activer l&#8217;accélération matérielle pour toute votre application, cependant certains composant ne peuvent pas (encore) bénéficier de cette fonctionnalité c’est pourquoi nous allons voir par la suite comment la contrôler.<br /> <a href="http://blog.infine.com/wp-content/uploads/2011/11/andro.jpg" class="fancyboxgroup" rel="gallery-1452" title="Devoxx 2011   Utilisation du GPU pour les applis Android"><img class="aligncenter size-full wp-image-1464" style="margin-top: 15px" src="http://blog.infine.com/wp-content/uploads/2011/11/andro.jpg" alt="andro Devoxx 2011   Utilisation du GPU pour les applis Android" width="331" height="232" title="Devoxx 2011   Utilisation du GPU pour les applis Android" /></a></p><h1 style="margin-top: 40px">Contrôle de l&#8217;accélération matérielle</h1><p>Si votre application a des problèmes sur certains éléments  avec l&#8217;accélération matérielle, il est tout à fait possible de définir quels éléments doivent ou non utiliser le GPU.</p><p>On peut donc l’activer ou la désactiver sur ces différents éléments :</p><ul><li>Application</li><li>Activity</li><li>Window</li><li>View</li></ul><p style="margin-top: 30px">Pour utiliser l&#8217;accélération matérielle au niveau Application ou Activity il faut utiliser le fichier AndroidManifest.xml</p><pre class="brush: xml; title: ; notranslate">
&lt;application android:hardwareAccelerated=&quot;true&quot;&gt;
    &lt;activity ... /&gt;
    &lt;activity android:hardwareAccelerated=&quot;false&quot; /&gt;
&lt;/application&gt;
</pre><p style="margin-top: 30px">Voici ci-dessous un exemple de code à utiliser pour l’utiliser au niveau “Window” :</p><pre class="brush: java; title: ; notranslate">
getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
</pre><p style="margin-top: 30px">Pour finir, on peut désactiver l’utilisation du GPU seulement pour un partie de l&#8217;écran (View) :</p><pre class="brush: java; title: ; notranslate">
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
</pre><h3 style="margin-top: 30px">Vérifier si un élément utilise le GPU</h3><p>Il peut être important de savoir si un élément utilise l&#8217;accélération matérielle à un moment donné.<br /> Il existe 2 façons de le vérifier :</p><ul><li><a href="http://developer.android.com/reference/android/view/View.html#isHardwareAccelerated()"><span style="color: blue">View.isHardwareAccelerated()</span></a>, retourne “true” si la View est attachée à une Windows qui utilise le GPU</li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#isHardwareAccelerated()"><span style="color: blue">Canvas.isHardwareAccelerated()</span></a>, retourne “true” si le Canvas est acceleré</li></ul><h1 style="margin-top: 40px">Fonctions supportant l&#8217;accélération matérielle</h1><p>La plupart des fonctions habituelles de la classe Canvas sont supportées, cependant certaines ne le sont pas mais le seront peut-être dans les futures versions d’Android.</p><p>Voici la liste des fonctions <strong>non supportées</strong> :</p><div style="margin-left: 15px;margin-right: 15px;padding: 5px"><div><a href="http://developer.android.com/reference/android/graphics/Canvas.html"><span style="color: blue;font-size: 16px;font-weight: bold">Canvas</span></a></div><ul class="tinylist"><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#clipPath(android.graphics.Path)"><span style="color: green">clipPath()</span></a></li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#clipRegion(android.graphics.Region)"><span style="color: green">clipRegion()</span></a></li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#drawPicture(android.graphics.Picture)"><span style="color: green">drawPicture()</span></a></li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#drawPosText(char[], int, int, float[], android.graphics.Paint)"><span style="color: green">drawPosText()</span></a></li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint)"><span style="color: green">drawTextOnPath()</span></a></li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#drawVertices(android.graphics.Canvas.VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint)"><span style="color: green">drawVertices()</span></a></li></ul><div><a href="http://developer.android.com/reference/android/graphics/Paint.html"><span style="color: blue;font-size: 16px;font-weight: bold">Paint</span></a></div><ul class="tinylist"><li><a href="http://developer.android.com/reference/android/graphics/Paint.html#setLinearText(boolean)"><span style="color: green">setLinearText()</span></a></li><li><a href="http://developer.android.com/reference/android/graphics/Paint.html#setMaskFilter(android.graphics.MaskFilter)"><span style="color: green">setMaskFilter()</span></a></li><li><a href="http://developer.android.com/reference/android/graphics/Paint.html#setRasterizer(android.graphics.Rasterizer)"><span style="color: green">setRasterizer()</span></a></li></ul></div><p>Certaines autres fonctions fonctionnent <strong>différemment</strong> lorsque l’accélératrion matérielle est activée :</p><div style="margin-left: 15px;margin-right: 15px;padding: 5px"><div><a href="http://developer.android.com/reference/android/graphics/Canvas.html"><span style="color: blue;font-size: 16px;font-weight: bold">Canvas</span></a></div><ul class="tinylist"><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#clipRect(android.graphics.Rect)"><span style="color: green">clipRect()</span></a> : XOR, Difference and ReverseDifference clip modes are ignored; 3D transforms do not apply to the clip rectangle</li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint)"><span style="color: green">drawBitmapMesh()</span></a> : colors array is ignored</li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#drawLines(float[], android.graphics.Paint)"><span style="color: green">drawLines()</span></a> : anti-aliasing is not supported</li><li><a href="http://developer.android.com/reference/android/graphics/Canvas.html#setDrawFilter(android.graphics.DrawFilter)"><span style="color: green">setDrawFilter()</span></a> : can be set, but ignored</li></ul><div><a href="http://developer.android.com/reference/android/graphics/Paint.html"><span style="color: blue;font-size: 16px;font-weight: bold">Paint</span></a></p><div><ul class="tinylist"><li><a href="http://developer.android.com/reference/android/graphics/Paint.html#setDither(boolean)"><span style="color: green">setDither()</span></a> : ignored</li><li><a href="http://developer.android.com/reference/android/graphics/Paint.html#setFilterBitmap(boolean)"><span style="color: green">setFilterBitmap()</span></a> : filtering is always on</li><li><a href="http://developer.android.com/reference/android/graphics/Paint.html#setShadowLayer(float, float, float, int)"><span style="color: green">setShadowLayer()</span></a> : works with text only</li></ul><div><a href="http://developer.android.com/reference/android/graphics/ComposeShader.html"><span style="color: blue;font-size: 16px;font-weight: bold">ComposeShader</span></a></div><p><a href="http://developer.android.com/reference/android/graphics/ComposeShader.html"> </a></p><ul class="tinylist"><a href="http://developer.android.com/reference/android/graphics/ComposeShader.html"> </a></p><li><a href="http://developer.android.com/reference/android/graphics/ComposeShader.html"></a><a href="http://developer.android.com/reference/android/graphics/ComposeShader.html"><span style="color: green">ComposeShader</span></a> can only contain shaders of different types (a BitmapShader and a LinearGradientShader for instance, but not two instances of BitmapShader)</li><li><a href="http://developer.android.com/reference/android/graphics/ComposeShader.html"><span style="color: green">ComposeShader</span></a> cannot contain a ComposeShader</li></ul></div><h1 style="margin-top: 40px">Les View Layers</h1><p>Les layers sont présents depuis la première version d’Android. Ils permettent d’avoir plusieurs couches (différentes vues) en cache et d’avoir de meilleures performances pour des animations ou des effets.</p><p>Android 3.0 introduit une nouvelle API appelée <a href="http://developer.android.com/reference/android/view/View.html#setLayerType(int, android.graphics.Paint)">View.setLayerType(int type, Paint p)</a>. Cette fonction prend 2 paramètres, le premier définit le type de layer que l’on souhaite utiliser et le second (facultatif) définit grâce à un <a href="http://developer.android.com/reference/android/graphics/Paint.html">Paint</a> comment la couche doit être composée (<a href="http://developer.android.com/reference/android/graphics/Paint.html#getAlpha()">Translucency (alpha)</a>, <a href="http://developer.android.com/reference/android/graphics/Paint.html#getXfermode()">Blending mode</a>, <a href="http://developer.android.com/reference/android/graphics/Paint.html#getColorFilter()">Color filter</a>).</p><p>Il existe 3 différents types de layer :</p><ul><li><a href="http://developer.android.com/reference/android/view/View.html#LAYER_TYPE_NONE"><span style="color: blue">LAYER_TYPE_NONE</span></a> : Rendu normal sans mémoire tampon.</li><li><a href="http://developer.android.com/reference/android/view/View.html#LAYER_TYPE_HARDWARE"><span style="color: blue">LAYER_TYPE_HARDWARE</span></a> : Rendu utilisant les textures matérielles seulement si l’application utilise l&#8217;accélération matérielle, sinon le layer sera de type LAYER_TYPE_SOFTWARE.</li><li><a href="http://developer.android.com/reference/android/view/View.html#LAYER_TYPE_SOFTWARE"><span style="color: blue">LAYER_TYPE_SOFTWARE</span></a> : Rendu transformé par le software en bitmap.</li></ul><p>Vous pouvez choisir le type de Layer en fonction des objectifs de ceux-ci :</p><ul><li><strong>Performance :</strong> Utilisation du type hardware. Une fois que le rendu est calculé, le code générant le rendu de la View ne sera plus éxecuté tant que la fonction invalidate() de la View ne sera pas appelé. Quelques animations comme celles utilisant la transparence peuvent utiliser directement le layer généré ce qui est très efficace à faire par le GPU.</li><li><strong>Effets Visuel :</strong> Utilisation du hardware ou software layer en appliquant un “Paint”, le second paramètre de la fonction View.setLayerType(int type, Paint p). Par exemple, c’est assez simple d’avoir un rendu noir et blanc sur une image en utilisant “ColorMatrixColorFilter”.</li><li><strong>Compatibilité :</strong> Utilisation du software layer pour forcer le calcul du rendu de la View par le software. Ça permet contourner toutes les restrictions hardware vues précédemment.</li></ul><h1 style="margin-top: 40px">Conclusion</h1><p>Lors de <a href="http://www.devoxx.com/display/DV11/Android+Keynote">l&#8217;Android keynote</a> Devoxx 2011, <a href="http://en.wikipedia.org/wiki/Tim_Bray">Tim Bray</a> a annoncé que l’Android market avait plus de 300 000 applications et que maintenant l’objectif est d’avoir un maximum d’applications “géniales” (make it great&#8230;). Le but de cette conférence était donc non seulement de présenter les nouveautés d’Android mais aussi de motiver les développeurs à créer de super applications (belle, rapide, fluide, &#8230;).<br /> Cet article reprend les explications, présentées lors de la conférence <a href="http://www.devoxx.com/display/DV11/Graphics+Goodies+in+Android">Graphics goodies in Android</a>, pour activer et jouer avec l&#8217;accélération matérielle dans nos applications. Vous pouvez retrouver une documentation plus précise sur le <a href="http://www.google.com/url?q=http%3A%2F%2Fdeveloper.android.com%2Fguide%2Ftopics%2Fgraphics%2Fhardware-accel.html">site Android developers</a>.<br /> J’espère que cet article est assez clair et que les développeurs francophones pourront s&#8217;en inspirer pour améliorer l’expérience utilisateur de leurs applis.</p></div></div> ]]></content:encoded> <wfw:commentRss>http://blog.infine.com/devoxx-2011-utilisation-du-gpu-pour-les-applis-android-1452/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx 2011 &#8211; annonces</title><link>http://blog.infine.com/devoxx-2011-annonces-1397</link> <comments>http://blog.infine.com/devoxx-2011-annonces-1397#comments</comments> <pubDate>Wed, 16 Nov 2011 15:29:36 +0000</pubDate> <dc:creator>Florian Boulay</dc:creator> <category><![CDATA[Conférence]]></category> <category><![CDATA[devoxx]]></category> <category><![CDATA[play framework]]></category><guid isPermaLink="false">http://blog.infine.com/?p=1397</guid> <description><![CDATA[Cette première grosse journée pour Devoxx a été l&#8217;occasion de faire différentes annonces. La première concerne le framework Play et la deuxième concerne le monde Java français. Play La version 2.0 de Play a déjà été annoncée il y a plusieurs semaines. Une pré-version de test avait été mise à disposition. Aujourd&#8217;hui la sortie de [...]]]></description> <content:encoded><![CDATA[<p><a href="http://blog.infine.com/wp-content/uploads/2011/11/devoxx11.png" class="fancyboxgroup" rel="gallery-1397" title="Devoxx 2011"><img src="http://blog.infine.com/wp-content/uploads/2011/11/devoxx11.png" alt="devoxx11 Devoxx 2011   annonces" title="Devoxx 2011" width="218" height="80" class="alignright size-full wp-image-1407" /></a><br /> Cette première grosse journée pour Devoxx a été l&#8217;occasion de faire différentes annonces. La première concerne le framework Play et la deuxième concerne le monde Java français.</p><h1>Play</h1><p>La version 2.0 de Play a déjà été annoncée il y a plusieurs semaines. Une pré-version de test avait été mise à disposition. Aujourd&#8217;hui la sortie de la beta a été annoncée.</p><p><span id="more-1397"></span></p><p>Lors de la présentation faite par Sadek Drobi (<a href="http://twitter.com/Sadache">@Sadache</a>) et Guillaume Bort, les nouveautés ont été détaillées :</p><ul><li>Intégration de Scala directement dans Play : les templates ne se feront plus en Groovy mais en Scala. Les classes pourront être faites en Java ou en Scala. Cela a pour conséquence la mise à disposition de la console Scala qui permettra, par exemple, d&#8217;appeler directement du code applicatif à parti de la ligne de commande.</li><li>Un système de build est désormais intégré, il s&#8217;agit de SBT (Simple Build Tool). Ce choix est certainement la conséquence de l&#8217;intégration de Scala. Cela remplacera l&#8217;ancien système basé sur Ivy.</li><li>Intégration d&#8217;Akka</li><li>Les scripts javascript et les feuilles de styles sont compilés</li></ul><p>Plus d&#8217;infos disponibles sur le site officiel : <a href="http://scala.playframework.org/2.0">http://scala.playframework.org/2.0</a></p><p>L&#8217;autre annonce est que Play intègre désormais la stack Typesafe. Cela signifie que Typesafe fournira du support sur Play. De plus Guillaume Bort va désormais siégé au board of advisor de Typesafe (Je ne sais pas comment le traduire, conseil d&#8217;administration ?) en tant que conseiller sur les choix techniques web d&#8217;après ce que Guillaume a dit durant sa présentation.</p><h1>Devoxx France</h1><p><a href="http://blog.infine.com/wp-content/uploads/2011/11/devoxx_france_300_250.gif" class="fancyboxgroup" rel="gallery-1397" title="devoxx_france"><img src="http://blog.infine.com/wp-content/uploads/2011/11/devoxx_france_300_250.gif" alt="devoxx france 300 250 Devoxx 2011   annonces" title="devoxx_france" width="250" height="200" class="alignleft size-full wp-image-1405" /></a></p><p>Une version française de Devoxx se tiendra du 18 au 20 avril 2012 à Paris ! Elle est inspirée du modèle belge et elle durera 3 jours et sera à 75% en français et 25% en anglais. Elle est organisée par les membres du Paris Jug (Antonio Goncalves, Zouheir Cadi, José Paumard et Nicolas Martignolle). Ce sera la plus grosse conférence Java francophone, venez nombreux !<br /> In Fine sera bien entendu partenaire de cet évènement.<br /> Plus de détails sur le <a href="http://www.touilleur-express.fr/2011/11/16/devoxx-france-2012/">blog de Nicolas Martignolle.</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.infine.com/devoxx-2011-annonces-1397/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching using disk: basic
Object Caching 1106/1300 objects using disk: basic

Served from: blog.infine.com @ 2012-05-21 00:37:05 -->
