<?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>Conférence - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/category/conference-2/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Tue, 15 Jan 2013 11:09:43 +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>Conférence - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 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 fetchpriority="high" 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>L&#8217;application Devoxx France d&#8217;In Fine est disponible sur le Google Play Store</title>
		<link>https://blog.infine.com/lapplication-devoxx-france-din-fine-est-disponible-sur-le-google-play-store-1954?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lapplication-devoxx-france-din-fine-est-disponible-sur-le-google-play-store</link>
					<comments>https://blog.infine.com/lapplication-devoxx-france-din-fine-est-disponible-sur-le-google-play-store-1954#comments</comments>
		
		<dc:creator><![CDATA[Florian Boulay]]></dc:creator>
		<pubDate>Fri, 30 Mar 2012 11:21:45 +0000</pubDate>
				<category><![CDATA[Conférence]]></category>
		<category><![CDATA[Mobile (Android/iOS)]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[play framework]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1954</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> 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 &#8230;</p>
<p>The post <a href="https://blog.infine.com/lapplication-devoxx-france-din-fine-est-disponible-sur-le-google-play-store-1954">L’application Devoxx France d’In Fine est disponible sur le Google Play Store</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><a href="https://blog.infine.com/wp-content/uploads/2012/03/logo_devoxx_fr_negate.jpg" class="fancyboxgroup" rel="gallery-1954" title="Logo Devoxx France"><img 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="alignright 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>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>
<figure id="attachment_1964" aria-describedby="caption-attachment-1964" style="width: 300px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2012/03/archi_appli_android_devoxx1.png" class="fancyboxgroup" rel="gallery-1954"><img loading="lazy" decoding="async" class="size-medium wp-image-1964" src="https://blog.infine.com/wp-content/uploads/2012/03/archi_appli_android_devoxx1-300x164.png" alt="Architecture applicative de l'application Devoxx France In Fine" width="300" height="164" srcset="https://blog.infine.com/wp-content/uploads/2012/03/archi_appli_android_devoxx1-300x164.png 300w, https://blog.infine.com/wp-content/uploads/2012/03/archi_appli_android_devoxx1.png 660w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-1964" class="wp-caption-text"><em>Architecture applicative de l&#039;application Devoxx France In Fine</em></figcaption></figure>
<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><p>The post <a href="https://blog.infine.com/lapplication-devoxx-france-din-fine-est-disponible-sur-le-google-play-store-1954">L’application Devoxx France d’In Fine est disponible sur le Google Play Store</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://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>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>
		<item>
		<title>Devoxx 2011 &#8211; Utilisation du GPU pour les applis Android</title>
		<link>https://blog.infine.com/devoxx-2011-utilisation-du-gpu-pour-les-applis-android-1452?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=devoxx-2011-utilisation-du-gpu-pour-les-applis-android</link>
					<comments>https://blog.infine.com/devoxx-2011-utilisation-du-gpu-pour-les-applis-android-1452#respond</comments>
		
		<dc:creator><![CDATA[Victor Bonnet]]></dc:creator>
		<pubDate>Fri, 25 Nov 2011 09:00:06 +0000</pubDate>
				<category><![CDATA[Conférence]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[devoxx]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1452</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> 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 &#8230;</p>
<p>The post <a href="https://blog.infine.com/devoxx-2011-utilisation-du-gpu-pour-les-applis-android-1452">Devoxx 2011 – Utilisation du GPU pour les applis Android</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="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="https://blog.infine.com/wp-content/uploads/2011/11/img3.jpg" class="fancyboxgroup" rel="gallery-1452"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1453" src="https://blog.infine.com/wp-content/uploads/2011/11/img3.jpg" alt="Software vs Hardware" width="642" height="498" srcset="https://blog.infine.com/wp-content/uploads/2011/11/img3.jpg 642w, https://blog.infine.com/wp-content/uploads/2011/11/img3-300x232.jpg 300w" sizes="(max-width: 642px) 100vw, 642px" /></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="https://blog.infine.com/wp-content/uploads/2011/11/andro.jpg" class="fancyboxgroup" rel="gallery-1452"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1464" style="margin-top: 15px" src="https://blog.infine.com/wp-content/uploads/2011/11/andro.jpg" alt="" width="331" height="232" srcset="https://blog.infine.com/wp-content/uploads/2011/11/andro.jpg 331w, https://blog.infine.com/wp-content/uploads/2011/11/andro-300x210.jpg 300w" sizes="(max-width: 331px) 100vw, 331px" /></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><p>The post <a href="https://blog.infine.com/devoxx-2011-utilisation-du-gpu-pour-les-applis-android-1452">Devoxx 2011 – Utilisation du GPU pour les applis Android</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-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>https://blog.infine.com/devoxx-2011-annonces-1397?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=devoxx-2011-annonces</link>
					<comments>https://blog.infine.com/devoxx-2011-annonces-1397#respond</comments>
		
		<dc:creator><![CDATA[Florian Boulay]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 15:29:36 +0000</pubDate>
				<category><![CDATA[Conférence]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[play framework]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1397</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> 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 &#8230;</p>
<p>The post <a href="https://blog.infine.com/devoxx-2011-annonces-1397">Devoxx 2011 – annonces</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><a href="https://blog.infine.com/wp-content/uploads/2011/11/devoxx11.png" class="fancyboxgroup" rel="gallery-1397" title="Devoxx 2011"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/11/devoxx11.png" alt="Logo Devoxx 2011" 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="https://blog.infine.com/wp-content/uploads/2011/11/devoxx_france_300_250.gif" class="fancyboxgroup" rel="gallery-1397" title="devoxx_france"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/11/devoxx_france_300_250.gif" alt="Bannière Devoxx France" 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><p>The post <a href="https://blog.infine.com/devoxx-2011-annonces-1397">Devoxx 2011 – annonces</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-annonces-1397/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>In Fine Academy : Grid Computing avec Symphony</title>
		<link>https://blog.infine.com/in-fine-academy-grid-computing-avec-symphony-1044?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=in-fine-academy-grid-computing-avec-symphony</link>
					<comments>https://blog.infine.com/in-fine-academy-grid-computing-avec-symphony-1044#respond</comments>
		
		<dc:creator><![CDATA[Veary NGY]]></dc:creator>
		<pubDate>Mon, 04 Jul 2011 09:42:22 +0000</pubDate>
				<category><![CDATA[Conférence]]></category>
		<category><![CDATA[calcul distribué]]></category>
		<category><![CDATA[Grid computing]]></category>
		<category><![CDATA[Symphony]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1044</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> Jeudi 30 juin, dans le cadre d&#8217;In Fine Academy, Christophe Havet, consultant In Fine nous a donné une présentation sur Grid Computing avec Symphony. En voici le support : Application, bénéfices, limites et contraintes du grid computing à travers l’exemple de l’outil Symphony de Platform.</p>
<p>The post <a href="https://blog.infine.com/in-fine-academy-grid-computing-avec-symphony-1044">In Fine Academy : Grid Computing avec Symphony</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>Jeudi 30 juin, dans le cadre d&#8217;In Fine Academy, Christophe Havet, consultant In Fine nous a donné une présentation sur Grid Computing avec Symphony. En voici le support :</p>
<p><em>Application, bénéfices, limites et contraintes du grid computing à travers l’exemple de l’outil Symphony de Platform.</em></p>
<p><em><br />
</em></p>
<iframe loading="lazy" src="https://www.slideshare.net/slideshow/embed_code/8477523" width="600" height="489" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><p>The post <a href="https://blog.infine.com/in-fine-academy-grid-computing-avec-symphony-1044">In Fine Academy : Grid Computing avec Symphony</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/in-fine-academy-grid-computing-avec-symphony-1044/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>In Fine Academy : Programmation parallèle avec GPU sur CUDA</title>
		<link>https://blog.infine.com/in-fine-academy-programmation-parallele-avec-gpu-sur-cuda-867?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=in-fine-academy-programmation-parallele-avec-gpu-sur-cuda</link>
					<comments>https://blog.infine.com/in-fine-academy-programmation-parallele-avec-gpu-sur-cuda-867#respond</comments>
		
		<dc:creator><![CDATA[Veary NGY]]></dc:creator>
		<pubDate>Wed, 27 Apr 2011 11:32:17 +0000</pubDate>
				<category><![CDATA[Conférence]]></category>
		<category><![CDATA[cuda]]></category>
		<category><![CDATA[gpu]]></category>
		<category><![CDATA[nvidia]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=867</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> Hier, s&#8217;est tenue au siège la deuxième présentation d&#8217;In Fine Academy portant sur la programmation parallèle avec GPU sur CUDA par Maxime Fromentin, consultant In Fine. En attendant l&#8217;article de Maxime, plusieurs personnes nous ont réclamé son support de présentation, alors le voici : Depuis quelques années, les processeurs graphiques (GPU) ont vu leur capacité &#8230;</p>
<p>The post <a href="https://blog.infine.com/in-fine-academy-programmation-parallele-avec-gpu-sur-cuda-867">In Fine Academy : Programmation parallèle avec GPU sur CUDA</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>Hier, s&#8217;est tenue au siège la deuxième présentation d&#8217;In Fine Academy portant sur la programmation parallèle avec GPU sur CUDA par Maxime Fromentin, consultant In Fine.</p>
<div>En attendant l&#8217;article de Maxime, plusieurs personnes nous ont réclamé son support de présentation, alors le voici :</div>
<p></p>
<div>Depuis quelques années, les processeurs graphiques (GPU) ont vu leur capacité considérablement augmenter. En plus du rendu graphique, ceux-ci sont  désormais capables d&#8217;effectuer des opérations complexes avec notamment  l&#8217;apparition de CUDA développé par Nvidia. Basée sur le  parallélisme de masse, la technologie GPU voit son champ d&#8217;application s&#8217;étendre du domaine scientifique à la finance et ceci avec des performances très intéressantes comparées aux processeurs traditionnels.</div>
<iframe loading="lazy" src="https://www.slideshare.net/slideshow/embed_code/7749246" width="600" height="489" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/>
<div style="width:425px" id="__ss_7749246"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/infine/programmation-sur-gpu-avec-cuda" title="Programmation sur GPU avec CUDA">Programmation sur GPU avec CUDA sur Slideshare</a></strong> </div><p>The post <a href="https://blog.infine.com/in-fine-academy-programmation-parallele-avec-gpu-sur-cuda-867">In Fine Academy : Programmation parallèle avec GPU sur CUDA</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/in-fine-academy-programmation-parallele-avec-gpu-sur-cuda-867/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Paris JUG : Improve your sex life with Git</title>
		<link>https://blog.infine.com/paris-jug-improve-your-sex-life-with-git-835?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=paris-jug-improve-your-sex-life-with-git</link>
					<comments>https://blog.infine.com/paris-jug-improve-your-sex-life-with-git-835#comments</comments>
		
		<dc:creator><![CDATA[Florian Boulay]]></dc:creator>
		<pubDate>Thu, 14 Apr 2011 15:31:50 +0000</pubDate>
				<category><![CDATA[Conférence]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[jug]]></category>
		<category><![CDATA[parisjug]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=835</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">7</span> <span class="rt-label rt-postfix">min.</span></span> Mardi soir se tenait une session consacrée entièrement à Git au Paris JUG qui a été sponsorisée par In Fine. Elle a rencontré un énorme succès, les places ont été prises d’assaut en moins de 4h. Néanmoins beaucoup de gens se sont fait recaler à l’entrée. La polémique des inscriptions Certains ont accusé JUG Events &#8230;</p>
<p>The post <a href="https://blog.infine.com/paris-jug-improve-your-sex-life-with-git-835">Paris JUG : Improve your sex life with Git</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">7</span> <span class="rt-label rt-postfix">min.</span></span><p><a href="https://blog.infine.com/wp-content/uploads/2011/04/parisJug1.jpg" class="fancyboxgroup" rel="gallery-835" title="Paris JUG logo"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/04/parisJug1.jpg" alt="Paris JUG logo" title="Paris JUG logo" width="300" height="129" class="alignleft size-full wp-image-842" /></a><br />
Mardi soir se tenait une session consacrée entièrement à Git au <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20110412">Paris JUG</a> qui a été sponsorisée par In Fine. Elle a rencontré un énorme succès, les places ont été prises d’assaut en moins de 4h. Néanmoins beaucoup de gens se sont fait recaler à l’entrée.</p>
<h3>La polémique des inscriptions</h3>
<p>Certains ont accusé <a href="http://www.jugevents.org/jugevents/">JUG Events</a> pour ce désastre au niveau des inscriptions. Quoi qu’il en soit, ce site semble de plus en plus inadapté au succès que rencontre le Paris JUG. Il y a quelques mois Nicolas Martignole avait indiqué que JUG Events était open source, et que toute contribution était la bienvenue pour améliorer le site (<a href="http://code.google.com/p/jugevents/">Google Code de JUG Events</a>). Si vous avez quelques heures pour le faire, n’hésitez pas, toute la communauté des JUG vous en saura gré.</p>
<h3>Quiz et Mac Book</h3>
<p>In Fine, sponsor du JUG a voulu pour cette soirée créer une animation différente : des boîtiers ont été distribués à chaque participant afin de participer à un quiz portant sur Git et Java principalement, présenté par Antoine Ramponi. Le gagnant du quiz s’est vu remettre un Mac Book Air ! Il s’agit de Guillaume Darmont (<a href="http://twitter.com/gdarmont">@gdarmont</a>) qui a fait un sans faute en répondant correctement aux 18 questions. Bravo à lui ! Les photos sont à la fin de l’article.</p>
<h1>Sébastien Douche, l’unique speaker</h1>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/04/SebastienDouche1.jpg" class="fancyboxgroup" rel="gallery-835" title="Sebastien Douche"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/04/SebastienDouche1.jpg" alt="Sebastien Douche" title="Sebastien Douche" width="80" height="114" class="alignright size-full wp-image-843" /></a></p>
<p>Sébastien Douche, en habitué, est venu présenté Git en 2 parties : la première théorique est la deuxième avec des cas plus pratiques. Contrairement à sa présentation de l’année dernière sur les DVCS en général, cette soirée est entièrement dédiée à Git.</p>
<p>Mais avant d’attaquer le vif du sujet, rappelons qui est Sébastien Douche. Il se présente comme une personne multi-casquettes. Il est directeur technique, responsable R&#038;D, coach et release manager. Cette dernière a fait qu’il s’est intéressé aux DVCS en général, puisqu’il a également pratiqué Mercurial pendant 2 ans avant de passer à Git. Il a créé un <a href="http://blog.gitfr.net/">blog</a> sur Git (appelé gitfr) qui lui sert surtout de support pour ses présentations. On y trouvera également de nombreux articles intéressants, ainsi gitfr est devenue une ressource francophone de qualité sur Git.<br />
Son espoir : que le gens travaillent ensemble de manière efficace.<br />
Par ailleurs, il fait de l’agilité, du python, aime la bière.<br />
A suivre sur twitter <a href="http://twitter.com/#!/sdouche">@sdouche</a></p>
<p><span id="more-835"></span></p>
<h1>1<sup>ère</sup> partie : le backend de Git</h1>
<p>A première vue, Git peut sembler complexe, pourtant il est fait de concepts simples. Mis ensemble, ils font la puissance de Git. En passant à Git, Sébastien suggère de tout oublier (en visant SVN notamment). Les habitudes que nous av(i)ons avec Subversion ne sont pas transposables avec Git.<br />
Git est très apprécié par ceux qui l’utilisent. Par exemple dans le Git Survey 2010, 95% des utilisateurs sont heureux ou en extase avec Git. Pas sûr que le résultat soit le même avec un outil comme Subversion.<br />
Sébastien résume Git en 3 points :</p>
<ul>
<li>Gestionnaire de contenu </li>
<li>Stocké sous la forme d’un graphe acyclique d’objets </li>
<li>Accessible avec des références </li>
</ul>
<p>Git peut être vu de 2 points de vue : backend et frontend. Le backend est composé de commandes dites “plumbing” et le frontend de commandes dites “porcelain”. Le frontend correspond aux commandes utilisées quotidiennement. Ces commandes font appel aux commandes bas niveau (plumbing) du backend.<br />
Sébastien est convaincu qu’il vaut mieux connaître les concepts clés du backend sur lesquels s’appuie Git afin de mieux l’utiliser et de mieux le maîtriser.</p>
<h2>Concept 1 : Git est un gestionnaire de contenu</h2>
<p>Git est orienté contenu (contrairement à SVN qui est orienté fichier), cela signifie qu’il stocke les fichiers en entier pour chaque commit, alors qu’un gestionnaire orienté fichier stocke seulement les deltas entre 2 commits.</p>
<figure id="attachment_847" aria-describedby="caption-attachment-847" style="width: 300px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2011/04/git-delta-snapshot1.png" class="fancyboxgroup" rel="gallery-835" title="Delta vs Snapshot Git"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/04/git-delta-snapshot1-300x225.png" alt="Delta vs Snapshot Git" title="Delta vs Snapshot Git" width="300" height="225" class="size-medium wp-image-847" srcset="https://blog.infine.com/wp-content/uploads/2011/04/git-delta-snapshot1-300x225.png 300w, https://blog.infine.com/wp-content/uploads/2011/04/git-delta-snapshot1.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-847" class="wp-caption-text">Delta vs Snapshot Git (<em>Cliquer pour agrandir</em>)</figcaption></figure>
<p>Les objets sont stockés dans une base de données de type clé/valeur. Les clés sont de type SHA-1. Ce qui assure leur unicité dans le monde entier. Tout objet dans Git peut être identifié à l’aide de son SHA-1.</p>
<blockquote><p><strong>Exemple de SHA-1 :</strong> <code>da39a3ee5e6b4b0d3255bfef95601890afd80709</code> qui peut être raccourci en <code>da39a3</code></p></blockquote>
<p>Git possède 3 types d’objets principaux :</p>
<ul>
<li>Blob : contenu des fichiers </li>
<li>Tree : correspondance entre Blog et nom de fichier </li>
<li>Commit : ensemble de Tree regroupés lors d’un commit </li>
</ul>
<h2>Concept 2 : La relation entre commits est un graphe acyclique (DAG)</h2>
<p>Un graphe acyclique est un graphe sans boucle.<br />
Dans Git, chaque commit connait son ou ses parents, c’est-à-dire quels sont les précédents commits sur le fichier.<br />
<figure id="attachment_848" aria-describedby="caption-attachment-848" style="width: 300px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2011/04/git-dag1.png" class="fancyboxgroup" rel="gallery-835" title="Git DAG"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/04/git-dag1-300x68.png" alt="Git DAG" title="Git DAG" width="300" height="68" class="size-medium wp-image-848" srcset="https://blog.infine.com/wp-content/uploads/2011/04/git-dag1-300x68.png 300w, https://blog.infine.com/wp-content/uploads/2011/04/git-dag1.png 972w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-848" class="wp-caption-text"><em>Cliquer pour agrandir</em></figcaption></figure></p>
<p>Git contient 6 opérations qui permettent d’ajouter du contenu dans le graphe (donc dans la base de données) :</p>
<ul>
<li>commit : ajout de contenu dans le graphe </li>
<li>merge : fusion de 2 branches </li>
<li>rebase : simplification du graphe en transformant 2 branches en une seule </li>
<li>squash : nettoyage du graphe </li>
<li>cherry : copie sans conservation de l’historique </li>
<li>revert : annulation de l’ajout d’un contenu </li>
</ul>
<p>Sébastien insiste pour nous dire que sur Git, seule la vision topologique a un sens, contrairement à la vision chronologique d’autres VCS (i.e. SVN). Ainsi Git offre plusieurs commandes permettant d’avoir cette vision en réarrangeant l’historique.<br />
Dans Git, les objets sont immuables. De plus un historique de toutes les actions est conservé, nommé le <em>reflog</em>. Il permet de défaire toute opération qui aurait mal tourné, tel qu’un rebase qui aurait complètement pourri le projet par exemple.</p>
<h2>Concept 3 : Les objets sont accessibles sous forme de référence</h2>
<p>Deux types de référence existent dans Git :</p>
<ul>
<li>Déplacées par Git : par exemple master qui est l’équivalent de head pour Subversion </li>
<li>Déplacées par l’utilisateur : par exemple un tag léger posé par l’utilisateur </li>
</ul>
<p>Une branche n’est qu’une référence vers un noeud du graphe déplacée par Git. C’est pourquoi une branche est si rapide à créer. Concrètement, une référence n’est qu’un fichier de 40 octets.</p>
<h2>Résumé des concepts</h2>
<p>Git peut être vu comme un empilement de couches (de bas en haut) :</p>
<ul>
<li>Base de données (objets de type blob) </li>
<li>Mini système de fichiers (objets de type tree)  </li>
<li>Relation entre objets (objets de type commit)  </li>
<li>Objets facilement mémorisables (références)  </li>
</ul>
<p>La première partie termine comme elle a commencé, en rappelant que Git n’est pas si compliqué. Git n’est pas magique, il est basé sur des concepts simples et bien implémentés. Git est au niveau de ce qu’on attend d’un VCS aujourd’hui, alors que SVN est basé sur CVS qui date des années 80.</p>
<h1>2<sup>ème</sup> partie : Git en pratique</h1>
<h2>Bien commencer</h2>
<p>Dans cette partie, Sébastien a voulu démontrer la puissance de Git en présentant des bonnes pratiques et des fonctionnalités qui lui sont liées.<br />
Il commence avec de quelques conseils pour démarrer avec Git :</p>
<ul>
<li>Tout d’abord configurer son identité dans Git : mettre son nom et son adresse mail qui apparaîtront dans les commits </li>
<pre class="brush: bash; title: ; notranslate">
git config --global user.name &quot;Florian Boulay&quot;
git config --global user.email &quot;florian.b@mail.com&quot;
</pre>
<li>Utiliser le projet <a href="https://github.com/github/gitignore">gitignore</a> afin de configurer les fichiers ignorés par Git </li>
<li>Utiliser des alias sur les commandes usuelles ou longues. </li>
<pre class="brush: bash; title: ; notranslate">
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
</pre>
<li>Utiliser git prompt afin d’avoir un shell donnant beaucoup d’informations utiles. Plus d’infos sur gitfr </li>
<li>Utiliser la complétion automatique des commandes</li>
</ul>
<p>La complexité de Git n’est qu’apparente. Git possède 145 commandes, dont 37 porcelain. Au quotidien, Sébastien en utilise 18. Cela réduit considérablement l’image de la difficulté supposée de Git.</p>
<p>Git est en moyenne plus rapide que Subversion, et ce même sur des commandes distantes. Par exemple un <em>git clone</em> est en moyenne plus rapide qu’un <em>svn checkout</em>.</p>
<p>En parlant de la commande <em>checkout</em>, elle permet pour Git de se déplacer sur le graphe. On peut donc potentiellement faire un commit sur n’importe quelle version d’un fichier. Cependant Git va considérer qu’un commit qui n’est pas fait sur une référence de type branche sera perdu. Cela signifie que le gc pourra supprimer ces références. Cela s’appelle un <em>detached head</em>.</p>
<h2>L’index</h2>
<p>Git fournit un espace dans lequel l’utilisateur peut mettre les fichiers qu’il souhaite ajouter au commit qui interviendra plus tard. Cet espace se nomme l’index (ou staging area). Ce concept paraît inutile au premier abord, mais Sébastien nous certifie qu’une fois que nous avons pris l’habitude d’utiliser l’index, il est presque impossible de réutiliser un VCS n’en possédant pas. L’index permet de préparer le commit que nous souhaitons faire en y ajoutant les fichiers progressivement une fois le travail effectué sur chacun.</p>
<h2>git stash</h2>
<p>Si un utilisateur doit interrompre son travail de manière inopinée, plutôt que de devoir faire un commit d’un travail à moitié fini, Git met à disposition une commande permettant de mettre le travail en cours de côté afin de pouvoir le reprendre plus tard : il s’agit de la commande <em>git stash<em>.<br />
Les <em>git stash</em> sont empilables. De plus, on peut reprendre le travail en le mettant sur une nouvelle branche en faisant <em>git stash branch nouvelleBranche</em>.</p>
<h2>Récupération des boulettes</h2>
<p><em>git commit –amend</em> permet de modifier le dernier commit effectué.<br />
<em>git reflog</em> permet de revenir en arrière suite à une grosse bêtise tel qu’un rebase ou squash qui n’aurait pas réussi.<br />
<em>git reset</em> permet de revenir en arrière dans le graphe.</p>
<h2>Utilisation avancée de certains concepts</h2>
<h3>tags</h3>
<p>Git possède plusieurs types de tags. Sébastien nous conseille d’utiliser à chaque fois le tag annoté au lieu du tag léger, car il permet d’ajouter un message pour lui donner un sens.</p>
<h3>rebase</h3>
<p>La commande git rebase possède de nombreuses fonctionnalités très puissantes. La documentation à ce sujet est très complète. Quelques unes des puissantes options de rebase sont :</p>
<ul>
<li>–onto : permet de faire un rebase d’une branche 3 vers une branche 1 sans tenir compte des modifications de la branche 2 </li>
<figure id="attachment_836" aria-describedby="caption-attachment-836" style="width: 300px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2011/04/git-rebase-onto1.png" class="fancyboxgroup" rel="gallery-835" title="git rebase onto"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/04/git-rebase-onto1-300x99.png" alt="git rebase onto" title="git rebase onto" width="300" height="99" class="size-medium wp-image-836" srcset="https://blog.infine.com/wp-content/uploads/2011/04/git-rebase-onto1-300x99.png 300w, https://blog.infine.com/wp-content/uploads/2011/04/git-rebase-onto1.png 560w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-836" class="wp-caption-text"><em>Cliquer pour agrandir</em></figcaption></figure>
<li>-i : permet de faire un rebase interactif. Cela donne accès aux options suivantes : édition d’un commit, squash d’un commit, changement de l’ordre des commits </li>
</ul>
<h3>filter-branch</h3>
<p>Cette commande possède plusieurs fonctionnalités et notamment celle de modifier l’historique d’une partie du graphe. Par exemple, si des fichiers binaires ont été mis en contrôle de source, <em>git filter-branch</em> permet d’effacer ces fichiers binaires sur un ensemble de commits.</p>
<h3>Github</h3>
<p>Github est le sourceforge des années 2010. En plus de gérer des repository Git, il permet de mettre en avant le développeur au lieu du projet. Cette dimension sociale se retrouve partout dans l’interface de Git. Plus d’informations sur gitfr.<br />
On finit par…<br />
« Git a-t-il amélioré la vie sexuelle de ses utilisateurs ? », certainement oui.<br />
Git redonne le sourire aux développeurs après tant d’années à batailler avec des VCS non adaptés à leur besoin. Git propose de nombreuses autres fonctionnalités à découvrir : le manuel est complet et intelligible, les ressources sont abondantes sur le net, il ne reste plus aux sceptiques qu’à essayer. </p>
<h1>Photos</h1>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="flashvars" value="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2F61727838%40N06%2Fsets%2F72157626366071083%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2F61727838%40N06%2Fsets%2F72157626366071083%2F&amp;set_id=72157626366071083&amp;jump_to=" /><param name="allowFullScreen" value="true" /><param name="src" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="600" height="400" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" allowfullscreen="true" flashvars="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2F61727838%40N06%2Fsets%2F72157626366071083%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2F61727838%40N06%2Fsets%2F72157626366071083%2F&amp;set_id=72157626366071083&amp;jump_to="></embed></object></p><p>The post <a href="https://blog.infine.com/paris-jug-improve-your-sex-life-with-git-835">Paris JUG : Improve your sex life with Git</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/paris-jug-improve-your-sex-life-with-git-835/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>WPF &#038; Silverlight : L’état de l’art au Microsoft TechDays 2011 (partie 2)</title>
		<link>https://blog.infine.com/wpf-silverlight-l%e2%80%99etat-de-l%e2%80%99art-au-microsoft-techdays-2011-partie-2-663?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wpf-silverlight-l%25e2%2580%2599etat-de-l%25e2%2580%2599art-au-microsoft-techdays-2011-partie-2</link>
					<comments>https://blog.infine.com/wpf-silverlight-l%e2%80%99etat-de-l%e2%80%99art-au-microsoft-techdays-2011-partie-2-663#respond</comments>
		
		<dc:creator><![CDATA[David Taing]]></dc:creator>
		<pubDate>Tue, 05 Apr 2011 15:00:56 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Conférence]]></category>
		<category><![CDATA[Blend SDK]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[Microsoft Techdays 2011]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[WPF]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=663</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> Accéder à la partie 1 Après une première partie qui s&#8217;est concentrée sur l&#8217;organisation d&#8217;un projet WPF/Silverlight, attaquons-nous à quelque chose de plus compliqué avec les techniques avancées&#8230; Silverlight et WPF en entreprise : retours d&#8217;expérience, bonnes pratiques et techniques avancées par Luc Vo Van (Microsoft Services) et Thomas Lebrun (Access-IT) Architecture type WPF et &#8230;</p>
<p>The post <a href="https://blog.infine.com/wpf-silverlight-l%e2%80%99etat-de-l%e2%80%99art-au-microsoft-techdays-2011-partie-2-663">WPF & Silverlight : L’état de l’art au Microsoft TechDays 2011 (partie 2)</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/wpf-silverlight-letat-de-lart-au-microsoft-techdays-2011-partie-1-595">Accéder à la partie 1</a></p>
<p><em>Après une première partie qui s&#8217;est concentrée sur l&#8217;organisation d&#8217;un projet WPF/Silverlight, attaquons-nous à quelque chose de plus compliqué avec les techniques avancées&#8230;</em></p>
<h2>Silverlight et WPF en entreprise : retours d&#8217;expérience, bonnes pratiques et techniques avancées par Luc Vo Van (Microsoft Services) et Thomas Lebrun (Access-IT)</h2>
<h3><span style="text-decoration: underline">Architecture type</span></h3>
<p>WPF et Silverlight nous offrent la possibilité de développer des applications composites. Le pattern Models-Views-ViewModels <em>dit MVVM</em> est favorisé.<br />
<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-685" src="https://blog.infine.com/wp-content/uploads/2011/03/archi.jpg" alt="" width="720" height="428" srcset="https://blog.infine.com/wp-content/uploads/2011/03/archi.jpg 720w, https://blog.infine.com/wp-content/uploads/2011/03/archi-300x178.jpg 300w" sizes="(max-width: 720px) 100vw, 720px" /></p>
<p><span id="more-663"></span></p>
<h3><span style="text-decoration: underline">Principes fondamentaux</span></h3>
<h4>Composition</h4>
<p>Développer une application par composition c’est créer une coquille vide à laquelle vient se greffer différents modules applicatifs  indépendants qui interagissent ensemble pour les besoins de notre application. Le principal intérêt de ce type d’application est qu’il est possible de paralléliser les développements. En effet, puisque chaque module est indépendant, il est simple de regrouper les équipes en unités fonctionnelles. Ces unités fournissent alors aux autres équipes l’interface de leur implémentation ce qui permet d’exécuter toute l’application même si le développement d’un module n’est pas totalement finalisé.</p>
<p>Avec ce mécanisme, il est alors très aisé d’activer ou de désactiver une fonctionnalité. La maintenabilité de l’application est également largement revue à la hausse grâce au découpage par modules. Chaque module étant cloisonné et hiérarchisé, l’évolution d’un module ne sera visible de l’extérieur qu’à travers son interface. L’impact sur les autres modules est donc fortement limité.</p>
<p>Généralement, on observe deux approches d’architecture de développement par composition</p>
<ul>
<li>Régions + Services, c’est le cas avec le <a href="http://compositewpf.codeplex.com/" target="_blank">Framework Prism</a></li>
<li>Services</li>
</ul>
<h4>Inversion of control</h4>
<p>Plus communément appelé Ioc, l’Inversion of Control est un pattern utilisé pour l’injection de dépendance. On l’appelle  également parfois <em>injection de code</em> car en favorisant un découplage fort entre l’interface (UI) et l’implémentation (UI logic), il facilite la substitution des composants par des mocks lorsqu&#8217;un module n&#8217;est pas encore disponible.</p>
<p>Diverses implémentations sont possibles via <a href="http://unity.codeplex.com/">Unity</a>, <a href="http://www.springframework.net/">Spring .NET</a>, <a href="http://ninject.org/">Ninject</a>…</p>
<h4>Commanding</h4>
<p>Le système de commande est un mécanisme qui permet l’exécution d’actions déclenchées par des contrôles de l’IHM. Par exemple, sur un contrôle de type Button, habituellement, les actions qui suivent le clic sur celui-ci sont codés dans l’événement Click du code behind. Avec le système de commande, on écrit les actions dans la commande et il suffit alors de préciser au bouton le nom de cette commande à exécuter.</p>
<p>Ce mécanisme permet donc de découpler la source de l’action car les actions ne dépendent plus de l’événement Click. Il y a donc peu d’adhérence à l’interface graphique. Autre point fort, une commande peut également être affectée à plusieurs contrôles à la fois.</p>
<p>L’objectif du système de commande est de découpler l’interface graphique du code appelé lors de l’exécution d’une action. Un événement <em>CanExecute</em> intervient dans la définition d’une règle d’activation de la commande. Cette règle, lorsqu’elle est satisfaite active alors les contrôles de l’IHM affectés par cette commande.</p>
<p>Exemple :</p>
<p>//Création de la commande MyCommand<br />
public static RoutedUICommand MyCommand { get; set; }</p>
<p>//Execute : Actions de la commande<br />
private void ShowMessage_Executed(object sender, ExecutedRoutedEventArgs e)<br />
{<br />
MessageBox.Show(&#8220;Hello world&#8221;);<br />
}</p>
<p>//CanExecute : Condition d&#8217;activation de la commande<br />
private void ShowMessage_CanExecute(object sender, CanExecuteRoutedEventArgs e)<br />
{<br />
if(condition)<br />
e.CanExecute = true;<br />
}</p>
<p>//Dans le construteur, on enregistre les événements Executed et CanExecute<br />
CommandBinding myBinding = new CommandBinding(MyCommand);<br />
myBinding.CanExecute += ShowMessage_CanExecute;<br />
myBinding.Executed += ShowMessage_Executed;<br />
CommandBindings.Add(myBinding);</p>
<p>MVVM :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- Après avoir inscrit la commande MyCommand au ViewModel et enregistré dans le ViewModel dans le DataContext de la View, on affecte la commande par Binding--&gt;
&lt;Button x:Name=&quot;MyButton&quot; Command=&quot;{Binding MyCommand}&quot; /&gt;
</pre>
<p>Non MVVM :</p>
<p>//Dans le constructeur, on affecte au bouton MyButton la commande MyCommand<br />
myButton.Command = MyCommand;</p>
<h4>Messaging</h4>
<p>Par messaging, on entend l&#8217;implémentation d&#8217;un mécanisme permettant le dialogue entre les modules. Ce mécanisme, appelé Messenger, doit permettre aux modules de publier un événement et de notifier le ou les modules qui y sont abonnés. On parle alors de communication inter-ViewModels. Il est également possible de notifier un service du Shell par cette méthode pour par exemple faire appel au log, etc…</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/03/messaging.jpg" class="fancyboxgroup" rel="gallery-663"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-822" src="https://blog.infine.com/wp-content/uploads/2011/03/messaging.jpg" alt="" width="725" height="339" srcset="https://blog.infine.com/wp-content/uploads/2011/03/messaging.jpg 725w, https://blog.infine.com/wp-content/uploads/2011/03/messaging-300x140.jpg 300w" sizes="(max-width: 725px) 100vw, 725px" /></a></p>
<p>On distingue généralement les différents types d’implémentations suivantes :</p>
<ul>
<li>Event agregattor (<a href="http://compositewpf.codeplex.com/" target="_blank">Framework Prism</a>)</li>
<li>Messenger</li>
<li>Queue</li>
</ul>
<h4>Services du Shell</h4>
<p>Les services du Shell regroupent tous les composants qui permettent aux Views, Viewmodels et Controls de communiquer avec l’hôte. Ce sont les services transverses  tels que les Popups Messages, Ribbon Menu, Logging, Workspaces, etc …, et qui peuvent être utilisés à tout instant.</p>
<h3><span style="text-decoration: underline">Approches par patterns:</span></h3>
<p>Avec le pattern MVVM, nous avons vu qu’il existe une séparation forte entre le View et le ViewModel. Cette séparation permet 2 approches :</p>
<ul>
<li><strong>ViewModelFirst</strong> : Dans cette configuration, le ViewModel s’occupe de créer les différents Views et de définir les bindings associés.</li>
<li><strong>ViewFirst</strong> : Dans cette configuration, la View utilise le ViewModel comme ressource. Le binding est alors défini dans la vue. Ce pattern est celui qui est utilisé par le <a href="http://compositewpf.codeplex.com/" target="_blank">Framework Prism</a>.</li>
</ul>
<p>Pour des applications implémentant des formulaires, l’utilisation du <em>ViewState</em> permet de définir l’état d’un formulaire avec des changements d’états plus simples et plus légers. En effet, il suffit de ne créer qu’une seule View qui contient alors les différents états du formulaire. Introduit par Silverlight et désormais présent dans WPF 4.0, le ViewState ajoute également des animations de transitions issues du <a href="http://www.microsoft.com/downloads/fr-fr/details.aspx?displaylang=fr&amp;FamilyID=75e13d71-7c53-4382-9592-6c07c6a00207">Blend SDK</a> à travers l’utilisation de <em>behaviours</em>.</p>
<p>Parfois, il arrive qu’on ait besoin de créer une fonctionnalité supplémentaire pour un contrôle existant. Dans ce cas de figure, nous utilisons alors les <em>Attached Property</em> qui permettent d’étendre un contrôle existant avec notre fonctionnalité, sans avoir à procéder à un héritage.</p>
<h3><span style="text-decoration: underline">Blend SDK:</span></h3>
<p>Ce SDK fournit entre autre des <em>behaviours </em>qui permettent de greffer des  fonctionnalités sur des contrôles pour avoir des comportements supplémentaires.</p>
<ul>
<li><strong>InvokeCommandAction</strong> : Permet de lier un événement à une commande sans envoyer de paramètre.</li>
<li><strong>DataStateBehaviour</strong> : Sélectionne un VisualState en fonction d’une propriété</li>
<li><strong>CallMethodAction</strong> : Permet à un événement d’exécuter une méthode.</li>
</ul>
<p>Pour utiliser ces behaviours, il faut au préalable charger l’assembly System.Window.Interactivity (2 dlls). Il est également possible d’écrire ses propres extensions.</p>
<h3><span style="text-decoration: underline">Testing</span></h3>
<p>Le pattern MVVM d’une manière générale est le pattern de prédilection pour mettre en place des tests unitaires automatisés pour les applications WPF et Silverlight. Nous avons vu auparavant que la mise en place d’un pattern d’IoC facilitait l’écriture de Mocks. Et bien, c’est avec cette même facilité qu’on pourra également mettre en place une série de tests automatisés car l’UI et l’UI logic sont complètement décorrélés dans cette architecture.</p>
<p>Pour réaliser vos tests selon le type d&#8217;application :</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="text-align: center" width="318" valign="top">
<h4>WPF</h4>
</td>
<td style="text-align: center" width="318" valign="top">
<h4>Silverlight</h4>
</td>
</tr>
<tr>
<td width="318" valign="top">Les principaux outils de testing sont déjà intégrés à Visual StudioLe ViewModel est testable avec UnitTesting</p>
<p>La View est testable avec UI Automation</td>
<td width="318" valign="top">Contrairement à WPF, Silverlight ne dispose pas d’outil de test intégré à Visual Studio &#8211; peut-être dans une future version ? -, cependant, les tests unitaires sont réalisables à l’aide de <a href="http://silverlight.codeplex.com/">Silverlight Unit Test Framework</a>.Le ViewModel est testable avec Statlight, Odin, …</td>
</tr>
</tbody>
</table>
<h4><span><span style="text-decoration: underline">Liens externes</span></span></h4>
<p>MVVM : <a href="http://compositewpf.codeplex.com/" target="_blank">Framework Prism</a>, <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=bcb166f7-dd16-448b-a152-9845760d9b4c&amp;displaylang=en">Microsoft Enterprise Library</a></p>
<p>Inversion of Control : <a href="http://unity.codeplex.com/">Unity</a>, <a href="http://www.springframework.net/">Framework Spring .NET</a>, <a href="http://ninject.org/">Ninject</a></p>
<p>Behaviour : <a href="http://www.microsoft.com/downloads/fr-fr/details.aspx?displaylang=fr&amp;FamilyID=75e13d71-7c53-4382-9592-6c07c6a00207">Blend SDK</a></p>
<p>Testing : <a href="http://silverlight.codeplex.com/">Silverlight Toolkit (Silverlight Unit Test Framework)</a></p><p>The post <a href="https://blog.infine.com/wpf-silverlight-l%e2%80%99etat-de-l%e2%80%99art-au-microsoft-techdays-2011-partie-2-663">WPF & Silverlight : L’état de l’art au Microsoft TechDays 2011 (partie 2)</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/wpf-silverlight-l%e2%80%99etat-de-l%e2%80%99art-au-microsoft-techdays-2011-partie-2-663/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WPF &#038; Silverlight : L&#8217;état de l&#8217;art au Microsoft TechDays 2011 (partie 1)</title>
		<link>https://blog.infine.com/wpf-silverlight-letat-de-lart-au-microsoft-techdays-2011-partie-1-595?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wpf-silverlight-letat-de-lart-au-microsoft-techdays-2011-partie-1</link>
					<comments>https://blog.infine.com/wpf-silverlight-letat-de-lart-au-microsoft-techdays-2011-partie-1-595#comments</comments>
		
		<dc:creator><![CDATA[David Taing]]></dc:creator>
		<pubDate>Fri, 11 Mar 2011 10:00:07 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Conférence]]></category>
		<category><![CDATA[Ergonomie]]></category>
		<category><![CDATA[Intégration graphique]]></category>
		<category><![CDATA[Microsoft Techdays 2011]]></category>
		<category><![CDATA[WPF]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=595</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> A chaque événement TechDays, c&#8217;est l&#8217;effervescence au sein de la communauté Microsoft. Pour commencer cette nouvelle année, c&#8217;est le Cloud qui était à l&#8217;honneur. Mais nous allons ici évoquer un sujet un peu moins brumeux et qui, nous, les développeurs .NET, nous concerne plus particulièrement : WPF &#38; Silverlight. A travers une série d&#8217;articles, nous ferons &#8230;</p>
<p>The post <a href="https://blog.infine.com/wpf-silverlight-letat-de-lart-au-microsoft-techdays-2011-partie-1-595">WPF & Silverlight : L’état de l’art au Microsoft TechDays 2011 (partie 1)</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><em>A chaque événement TechDays, c&#8217;est l&#8217;effervescence au sein de la communauté Microsoft. Pour commencer cette nouvelle année, c&#8217;est le Cloud qui était à l&#8217;honneur. Mais nous allons ici évoquer un sujet un peu moins brumeux et qui, nous, les développeurs .NET, nous concerne plus particulièrement : <strong>WPF &amp; Silverlight</strong>. </em></p>
<p><em>A travers une série d&#8217;articles, nous ferons le point sur les principales conférences autour de WPF &amp; Silverlight&#8230;</em></p>
<p><em> </em></p>
<h2>Changer la vie de vos utilisateurs en intégrant du design et de l&#8217;ergonomie par Olivier Courtois (Bewise)</h2>
<p>De nos jours, nous avons affaire à des &#8220;superutilisateurs&#8221; qui ont des attentes surdéveloppées. Bien plus que par le passé, les applications doivent se soucier davantage du confort d&#8217;utilisation : on parle alors d’ergonomie. Pour pallier à des surcoûts postproduction, cette réflexion doit être posée en amont.</p>
<p>Le travail général de l&#8217;ergonomie s&#8217;effectue dans le cadre d&#8217;une réflexion centrée autour de l&#8217;utilisateur. Cette réflexion, auprès d&#8217;utilisateurs réels -dans le meilleur des cas- ou auprès d&#8217;utilisateurs fictifs, donne naissance aux exigences ergonomiques.</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/02/schema12.png" class="fancyboxgroup" rel="gallery-595"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-627" src="https://blog.infine.com/wp-content/uploads/2011/02/schema12.png" alt="" width="614" height="100" srcset="https://blog.infine.com/wp-content/uploads/2011/02/schema12.png 614w, https://blog.infine.com/wp-content/uploads/2011/02/schema12-300x48.png 300w" sizes="(max-width: 614px) 100vw, 614px" /></a><br />
<span id="more-595"></span><br />
Avec la technologie SilverLight/WPF, la chaîne de travail est occupée autour de 4 postes d&#8217;exécutions clés :</p>
<ul>
<li>Ergonomie</li>
<li>Graphisme</li>
<li>Intégration graphique</li>
<li>Développement</li>
</ul>
<p>Nous allons ici nous intéresser plus particulièrement aux 3 premières étapes de cette chaîne.</p>
<ol>
<h3><span style="text-decoration: underline">Ergonomie</span></h3>
</ol>
<p>L&#8217;ergonomie c&#8217;est l&#8217;art de faire s&#8217;adapter l&#8217;outil à l&#8217;homme à travers une interface. Le rôle de cette étape est de constituer le document de spécification ergonomique.</p>
<p>Le travail sur l’ergonomie est constitué des phases d’exécutions suivantes :</p>
<p>1)      Recueil du besoin : on itère auprès des utilisateurs pour déterminer le fonctionnement général de l’application</p>
<p>2)      Etude de l&#8217;existant (s’il existe !)</p>
<p>3)      Création de croquis</p>
<ul>
<li>Croquis papier : permet d’être plus créatif</li>
<li>Application d’UI Design Pattern</li>
</ul>
<p>4)      Proposition statique</p>
<ul>
<li>Croquis numérique : toujours à l’état de croquis, cette étape permet d’être clair lors de la confrontation avec les utilisateurs.</li>
</ul>
<p>5)      Proposition dynamique</p>
<ul>
<li>Maquette dynamique : avec la mise en place d’interactions dans les croquis numériques, les utilisateurs perçoivent de manière plus évidente le fonctionnement que pourrait donner l’ergonomie de l’application.</li>
<li>Permet de tester auprès des utilisateurs</li>
<li>Permet de valider l&#8217;ergonomie</li>
</ul>
<p>6)      Spécification ergonomique</p>
<ul>
<li>Recommandations ergonomiques</li>
<li>Typologie des utilisateurs</li>
<li>Croquis des principaux écrans</li>
<li>Rationalisation des choix</li>
</ul>
<p>Le travail sur l’ergonomie produit le document de spécification ergonomique, document qui sera par la suite réutilisé au cours de l’intégration graphique.</p>
<ol>
<h3><span style="text-decoration: underline">Graphisme</span></h3>
</ol>
<p>Le graphisme -ou design d’application- doit à travers son esthétisme communiquer visuellement la même information à tous les utilisateurs tout en prolongeant la marque du client. Au final, le design sublime l’ergonomie. Cette étape doit permettre la production de la charte graphique de l’application.</p>
<p>C’est ici qu’intervient un designer dont la tâche est de construire la charte graphique selon les étapes suivantes :</p>
<p>1)      Recueil du besoin</p>
<p>2)      Maquettage</p>
<p>3)      Définition de la charte graphique de l&#8217;application</p>
<ol>
<h3><span style="text-decoration: underline">Intégration graphique</span></h3>
</ol>
<p>L’intégration graphique consiste à créer les écrans de l’application tout en respectant son ergonomie. Cette étape permet notamment de préparer le travail du développeur. Pour ce faire, l’intégrateur graphique doit avoir à sa disposition à la fois le document de spécification ergonomique qui identifie les contrôles visuels et la charte graphique qui définit le style visuel appliqué aux contrôles.</p>
<p>1)      Recueil du besoin</p>
<p>2)      Création des squelettes d&#8217;écrans</p>
<p>3)      Intégration graphique</p>
<p>A l’issu de ce travail, l’intégrateur graphique met à la disposition des développeurs une bibliothèque de composants stylisés qui doit couvrir tous les besoins de l’application.</p>
<ol>
<h3><span style="text-decoration: underline">Gains Utilisateurs</span></h3>
</ol>
<p>La prise en compte de l’ergonomie au sein des applications SL/WPF offre bien des apports sur plusieurs aspects. Tout d’abord au niveau de la conduite de projet, on observe une amélioration de la productivité grâce au séquençage des tâches. Avec une meilleure ergonomie, l’application est beaucoup plus intuitive d’un point de vue utilisateur et donc les besoins en formations sont diminués et une meilleure satisfaction d’utilisation de l’application et l’adhérence des utilisateurs. Et d’une manière générale, on observe une diminution du nombre d’erreurs.</p>
<h3><span style="text-decoration: underline">Conseil aux développeurs qui veulent se lancer dans l&#8217;ergonomie:</span></h3>
<ul>
<li>Faire attention au vocabulaire employé</li>
<li>Ne pas placer ses contrôles n&#8217;importe où</li>
</ul><p>The post <a href="https://blog.infine.com/wpf-silverlight-letat-de-lart-au-microsoft-techdays-2011-partie-1-595">WPF & Silverlight : L’état de l’art au Microsoft TechDays 2011 (partie 1)</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/wpf-silverlight-letat-de-lart-au-microsoft-techdays-2011-partie-1-595/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
