<?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>OCTO talks ! &#187; développements</title>
	<atom:link href="http://blog.octo.com/tag/developpements/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Fri, 03 Feb 2012 13:46:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Introduction à la Programmation Orientée Acteurs</title>
		<link>http://blog.octo.com/introduction-a-la-programmation-orientee-acteurs/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduction-a-la-programmation-orientee-acteurs</link>
		<comments>http://blog.octo.com/introduction-a-la-programmation-orientee-acteurs/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 20:48:44 +0000</pubDate>
		<dc:creator>Simon Lehericey</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[parallélisation]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=27677</guid>
		<description><![CDATA[Depuis le milieu des années 2000, l’augmentation de la puissance de calcul de nos ordinateurs ne passe plus par l’élévation de la fréquence des processeurs mais par la multiplication des cœurs de processeur au sein de nos machines. Pour tirer parti de cette multiplication, un algorithme doit être parallèlisé, c’est à dire qu’il doit pouvoir [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/la-programmation-haute-performance-nest-elle-reservee-qua-une-elite-de-developpeurs-c/' rel='bookmark' title='La programmation haute performance n&#8217;est-elle réservée qu&#8217;à une élite de développeurs C++ ?'>La programmation haute performance n&#8217;est-elle réservée qu&#8217;à une élite de développeurs C++ ?</a></li>
<li><a href='http://blog.octo.com/introduction-a-la-gestion-de-version-distribuee/' rel='bookmark' title='Introduction à la gestion de version distribuée'>Introduction à la gestion de version distribuée</a></li>
<li><a href='http://blog.octo.com/datacenter-as-a-computer-une-plongee-dans-les-datacenters-des-acteurs-du-cloud/' rel='bookmark' title='Datacenter as a Computer : une plongée dans les datacenters des acteurs du cloud'>Datacenter as a Computer : une plongée dans les datacenters des acteurs du cloud</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fintroduction-a-la-programmation-orientee-acteurs%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Introduction%20%C3%A0%20la%20Programmation%20Orient%C3%A9e%20Acteurs%22%20%7D);"></div>
<p>Depuis le milieu des années 2000, l’augmentation de la puissance de calcul de nos ordinateurs ne passe plus par l’élévation de la fréquence des processeurs mais par la multiplication des cœurs de processeur au sein de nos machines.</p>
<p>Pour tirer parti de cette multiplication, un algorithme doit être parallèlisé, c’est à dire qu’il doit pouvoir diviser ses instructions et les répartir sur différents cœurs pour une exécution simultanée.<br />
De nombreux outils permettent d’implémenter un algorithme parallèle sur une machine, par exemple la librairie Task Parallelism Library (TPL) en .Net, abordé par <a href="http://blog.octo.com/parallel-computing-sur-la-plateforme-net/">Olivier Roux</a> et <a href="http://blog.octo.com/developpement-parallele-pour-des-machines-multi-coeurs-en-net-4-0/">Alexis Flaurimont</a> ou encore le <a href="../article-parallelisation-distribution-partie-3-comment-tirer-parti-des-processeurs-multi-coeurs-a-travers-l-api-de-concurrence-de-java-7/">fork/join</a> en Java étudié par Marc Bojoly et David Rousselie.</p>
<p>D’autres outils, implémentant par exemple le pattern Map/Reduce, permettent de distribuer le calcul vers des cœurs situés sur différentes machines.</p>
<p>Cet article présentera une introduction à la programmation orientée acteurs et les réponses qu’elle apporte à ces différents problèmes.<span id="more-27677"></span></p>
<p>Cette programmation est issue d’un article paru en 1973, <em>A Universal Modular Actor Formalism for Artificial Intelligence Carl Hewitt; Peter Bishop and Richard Steiger</em>. Ericson, au milieu des années 80, implémente ce modèle en utilisant le langage <a href="http://www.erlang.org/">Erlang</a> pour la conception de systèmes téléphoniques robustes et distribués. Ce modèle est à présent repris, par <a href="http://akka.io/">Akka</a> notamment, dont on utilisera la librairie version 1.2 en Java.</p>
<p>Cette implémentation donne à un acteur trois caractéristiques principales :</p>
<ul>
<li>Il possède un état interne.</li>
<li>Il traite séquentiellement des messages stockés dans une queue.</li>
<li>Il peut émettre des messages asynchrones à d’autres entités.</li>
</ul>
<p>Dans cet article, l’implémentation d’un exemple simple permettra de mettre en avant certaines possibilités de cette solution.</p>
<p>Dans une première partie, on présentera le problème à traiter, puis on le modélisera selon la programmation orientée acteurs. Dans une deuxième partie, nous réaliserons une implémentation parallèle sur une unique machine puis, dans une troisième partie, nous distribuerons les calculs sur plusieurs nœuds.</p>
<h2>1. Modélisation du problème</h2>
<h3>Exemple à implémenter</h3>
<p>Réalisons un programme qui renvoie des images selon des dimensions demandées. Il reçoit la demande d’une image selon certaines dimensions (hauteur, largeur), charge l’image originale depuis le disque, réalise son redimensionnement et la transmet.</p>
<pre class="brush:java">public byte[] Process(int imageNumber, int width, int height) {
  byte[] imageBytes = loadImage(imageNumber) ;
  byte[] resizedImage = createResizedImage(imageBytes, width, height);
  return resizedImage ;
}</pre>
<p>Le processus est déclenché de manière évènementielle, i.e. les demandes sont traitées au fur et à mesure et non accumulées pour être traitées par lot.</p>
<p>Cette contrainte rend difficile l’utilisation d’outils de parallélisation de boucle de type paralleleFor de la librairie TPL car on ne connaît pas initialement le nombre d’itérations à effectuer. Une implémentation du pattern Master/Worker ou le master empile des tâches dans une file d’attente consommée par les workers serait plus adaptée. C’est sur la base de ce pattern que nous allons modéliser ce problème en acteurs.</p>
<h3>Modélisation du problème</h3>
<p>Une modélisation possible en acteurs de notre exemple comporte quatre types d’acteurs : un « Producer » émettant les demandes, un « Reader » récupérant l’image depuis le disque dur, un « Resizer » redimensionnant l’image, et un acteur « Exit » réceptionnant l’image redimensionnée.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2011/11/implem1.png"><img class="size-large wp-image-27693  aligncenter" title="Première modélisation" src="http://blog.octo.com/wp-content/uploads/2011/11/implem1-1024x211.png" alt="Première modélisation" width="922" height="190" /></a></p>
<p>&nbsp;</p>
<p>Le message partagé entre les acteurs contient ici le numéro de l’image à charger, les dimensions voulues, et l’image.<br />
On a volontairement pris soin de séparer les accès IO et les calculs de redimensionnement afin de bénéficier d’une plus grande souplesse lorsque l’on parallélisera l’implémentation.<br />
Pour reprendre l’analogie avec le pattern Master/Worker, on peut ici considérer que chaque acteur est le master de l’acteur qu’il précède.</p>
<h2>2. Implémentation parallèle sur une machine</h2>
<h3>Implémentation naïve</h3>
<p>Le message échangé est implémenté par une simple classe immuable sérialisable appelée ImageMessage.</p>
<p>Les différentes classes acteurs étendent l’interface UntypedActor et implémentent la méthode onReceive qui permet de traiter le message.<br />
Commençons avec le « Producer » qui recevra un startMessage pour démarrer l’envoi de dix demandes d’image.</p>
<p>public class Producer extends UntypedActor {</p>
<pre class="brush:java">public void onReceive(Object message) throws Exception {
  if (message instanceof StartMessage) {
    //obtient une référence vers un acteur de type Reader.
    ActorRef reader = registry().actorsFor(Reader.class)[0];

    for (int i = 0; i &lt; 10; i++) {
      ImageMessage imageMessage = buildImageMessage();
      //transmet le message
      reader.tell(imageMessage);
    }
  }
}</pre>
<p>La méthode registry().actorFor permet d’obtenir tous les acteurs démarrés d’un certain type sur cette JVM. L’envoi asynchrone d’un message s’effectue par la méthode actorRef.tell(Object message). Notons qu’une méthode d’envoi synchrone existe.</p>
<p>Selon le même principe, la logique du « Reader » est la suivante :</p>
<pre class="brush:java">byte[] imageBytes = loadImage(imageMessage.getImageNumber());
registry().actorsFor(Resizer.class)[0].tell(new ImageMessage(imageBytes, imageMessage));</pre>
<p>Celle du « Resizer » :</p>
<pre class="brush:java">byte[] resizedImage = createResizedImage(imageMessage);
registry().actorsFor(Exit.class)[0].tell(new ImageMessage(resizedImage,imageMessage));</pre>
<p>L’ « Exit » reçoit simplement les images traitées.</p>
<p>Il ne reste plus qu’à instancier tous ces acteurs par la méthode Actors.actorOf, à les démarrer grâce à la méthode start(), et à envoyer un startMessage au « producer ».</p>
<pre class="brush:java">public static void main(String[] args) {
  init();
  registry().actorsFor(Producer.class)[0].tell(new StartMessage());
}

private static void init() {
  Actors.actorOf(Producer.class).start();
  Actors.actorOf(Reader.class).start();
  Actors.actorOf(Resizer.class).start();
  Actors.actorOf(Exit.class).start();
}</pre>
<p>Premier constat : une implémentation asynchrone est plus complexe qu’une implémentation synchrone classique. En effet, en programmation synchrone, le résultat d’une méthode appelée est systématiquement renvoyé à la méthode appelante. Ici, il appartient  au développeur de préciser à qui sera transmis le résultat de la méthode asynchrone.</p>
<p>On voit également que cette implémentation est relativement lourde à mettre en place par rapport à un paralleleFor, ou l’utilisation de Task de TPL.</p>
<h3>Deuxième implémentation : multi-cœurs</h3>
<p>Revenons à notre problème initial qui consiste à répartir les traitements sur les différents cœurs disponibles.</p>
<p>L’augmentation du nombre de « Reader » ne sert ici à rien car le goulet d’étranglement se situe au niveau du débit du disque dur.</p>
<p>L’opération de réduction du « Resizer » prend quatre fois plus de temps que la lecture du fichier faite par le « Reader ». Pour augmenter la performance, on va travailler sur deux dimensions : le nombre de « Resizer » et le nombre de cœurs utilisés.<br />
Augmentons le nombre de « Resizers » et utilisons un acteur de type « LoadBalancer » pour repartir les messages selon le schéma suivant :</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2011/11/implem2.png"><img class="aligncenter size-large wp-image-27699" title="Deuxième implémentation" src="http://blog.octo.com/wp-content/uploads/2011/11/implem2-1024x327.png" alt="Deuxième implémentation" width="819" height="262" /></a></p>
<p>&nbsp;</p>
<p>Voici le code du « Balancer » qui étend UntypedLoadBalancer et implémente seq(), méthode qui précise comment doivent être répartis les messages.</p>
<pre class="brush:java">public class Balancer extends UntypedLoadBalancer {

  private InfiniteIterator&lt;ActorRef&gt; infiniteIterator;

  public InfiniteIterator&lt;ActorRef&gt; seq() {
    if (infiniteIterator == null) {
      //CyclicIterator permet au Balancer d'envoyer des messages
      //équitablement répartis entre les resizers.
      infiniteIterator = new CyclicIterator&lt;ActorRef&gt;(Arrays.asList(registry().actorsFor(Resizer.class)));
    }
    return infiniteIterator;
  }
}</pre>
<p>La multiplication des « Resizers » n’a pas d’intérêt s’ils se partagent le même cœur.<br />
Le paramétrage des cœurs, des threads et la liaison de ceux-ci aux acteurs s’effectue à l’aide des objets dispatcher fournit par Akka.</p>
<p>Ils se séparent en deux catégories principales:</p>
<ul>
<li>L’EventBasedDispatcher qui est basé sur un <a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html">ThreadPoolExecutor </a>. Il répartit les acteurs sur un pool de threads qui est construit automatiquement à partir du nombre de cœurs disponibles, du nombre maximal de threads autorisés, et de la configuration de la queue utilisée pour stocker les acteurs en attente.<br />
Ce dispatcher est plus adapté lorsque les acteurs ont des traitements courts à réaliser. En effet, un traitement long, ou un blocage IO, peut accaparer un thread et bloquer l’activation d’autres acteurs en attente.</li>
<li>Le ThreadBasedDispatcher qui octroie un thread système par acteur. Le blocage d’un acteur ne retarde donc pas l’activation des autres acteurs.</li>
</ul>
<p>Allouons un ThreadBasedDispatcher pour le Reader, afin que ses interruptions IO n’affectent pas les autres acteurs.</p>
<pre class="brush:java">ActorRef reader = Actors.actorOf(Reader.class);
Dispatchers.newThreadBasedDispatcher(reader);
reader.start();</pre>
<p>On notera ici que l’encapsulation de la lecture synchrone du « reader » par un objet acteur disposant de son propre thread, au sens où il n’est pas partagé avec d’autres acteurs et donc ne les bloque pas directement, la rend asynchrone pour les autres acteurs.</p>
<p>Finalement, allouons un EventBasedDispatcher pour les autres acteurs de la manière suivante :</p>
<pre class="brush:java">MessageDispatcher messageDispatcher = configureDispatcher();
actorRef.setDispatcher(messageDispatcher);
actorRef.start();</pre>
<p>La configuration de ce dernier permettra d’utiliser les quatre cœurs de la machine et de limiter le nombre maximum de threads à quatre. La taille de la file d’attente est choisie arbitrairement longue pour éviter les cas aux limites.</p>
<pre class="brush:java">private static MessageDispatcher configureDispatcher() {
  return Dispatchers.newExecutorBasedEventDrivenDispatcher("the_dispatcher")
    .withNewThreadPoolWithLinkedBlockingQueueWithCapacity(1000)
    .setCorePoolSize(4)
    .setMaxPoolSize(4)
    .build();
}</pre>
<p>On voit ici que l’API propose un réglage fin permettant d’adapter la configuration au matériel et au problème posé. Notons également que la configuration par défaut place tous les acteurs sur un EventBasedDispatcher configuré pour utiliser tous les cœurs de la machine. Notre première implémentation était donc déjà multi-cœurs.</p>
<p>On comprend alors que les acteurs fournissent un cadre qui simplifie les problèmes de concurrence à traiter par le développeur. Ces problèmes qui deviennent rapidement complexes, voir l’article de <a href="../la-programmation-haute-performance-nest-elle-reservee-qua-une-elite-de-developpeurs-c/">Sofian Djamaa</a>, sont ici en parti contournés par l’utilisation de messages immuables et par le non partage d’état entre les acteurs (les états des acteurs seront présentés ultérieurement).</p>
<h3>« Let It Crash »</h3>
<p>Un des points importants de la programmation orientée acteurs introduit par Ericson est sa tolérance à l’erreur. Cette faculté est assurée par un acteur particulier de type Superviseur. Celui-ci surveille le bon fonctionnement d’autres acteurs. En Java, il attrape les exceptions levées par les acteurs surveillés et peut les redémarrer suivant une des stratégies suivantes :</p>
<p><em>one for one</em> : seul l’acteur levant une exception est redémarré.<br />
<em>one for all</em> : tous les acteurs supervisés sont redémarrés, cette stratégie est utilisée dans le cas de dépendance entre acteurs.</p>
<p>Par exemple, redémarrons notre  « reader » lorsque celui-ci lève une exception IO :</p>
<pre class="brush:java">public static Supervisor buildSupervisor() {
  OneForOneStrategy oneForOneStrategy = new OneForOneStrategy(
    //type d'exception prises en charge
    new Class[]{IOException.class},
    //nombre maximum de d'essai de redemarrage
    100,
    // temps maximum pour le redemarrage
    5000
  );

  //creation de la strategie de supervision,
  //aucun acteur à superviser initialement
  SupervisorConfig supervisorConfig = new SupervisorConfig(oneForOneStrategy, new Supervise[0]);
  Supervisor supervisor = Supervisor.apply(supervisorConfig);
  return supervisor;
}
…

  Supervisor supervisor = buildSupervisor();
  //on applique le superviseur au reader
  supervisor.link(reader);</pre>
<p>L’utilisation des superviseurs peut aller beaucoup plus loin. Ainsi les superviseurs peuvent surveiller d’autres superviseurs ou démarrer eux-mêmes les acteurs qu’ils supervisent. On peut alors aboutir à un arbre de supervision qui permet de gérer l’application selon différents blocs fonctionnels comme le montre le schéma suivant :</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2011/11/Arbre-de-supervision.png"><img class="aligncenter size-full wp-image-27700" title="Arbre de supervision" src="http://blog.octo.com/wp-content/uploads/2011/11/Arbre-de-supervision.png" alt="Arbre de supervision" width="385" height="258" /></a></p>
<p>&nbsp;</p>
<h2>3. Implémentation multi-machines</h2>
<h3>Troisième implémentation : multi-noeuds.</h3>
<p>Maintenant que le programme occupe tous les cœurs de la machine, distribuons le sur plusieurs machines. Le « producer » et « l’exit » seront placés sur une machine maitre, tandis que chaque machine esclave contiendra un « reader »  et des « resizers ».</p>
<p>Schématiquement :</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2011/11/multi-node.png"><img class="aligncenter size-large wp-image-27701" title="multi node" src="http://blog.octo.com/wp-content/uploads/2011/11/multi-node-1024x418.png" alt="multi node" width="645" height="264" /></a></p>
<p>&nbsp;</p>
<p>Techniquement, la sérialisation des messages est réalisée par Google Protocol Buffer et la partie réseau est assurée par JBoss Netty.</p>
<p>Du point de vue du développeur, la différence entre adresser des messages sur une même machine, et adresser des messages sur une machine distante réside dans la façon d’obtenir la référence vers l’acteur auquel on souhaite envoyer le message (Akka version 1.2).</p>
<p>Celui-ci doit être déclaré accessible depuis l’extérieur :</p>
<pre class="brush:java">remote().start("localhost", 2552).register("reader-service", reader);</pre>
<p>La référence est ensuite disponible sur les autres machines par la méthode remote().actorFor :</p>
<pre class="brush:java">remote().actorFor("reader-service", "192.168.1.5", 2552);</pre>
<p>On voit dans le cadre de cet exemple qu’une fois la complexité absorbée pour une utilisation mono machine, la distribution des calculs sur différents nœuds est relativement simple.</p>
<h3>Dernière implémentation : utilisation de l’état interne d’un acteur.</h3>
<p>Finalement, utilisons l’état interne d’un acteur pour gérer l’absence de fichier dans un nœud. Si un « reader » ne trouve pas l’image i, il le signale au « balancer ». Le « balancer »  mémorise cette information et renvoie la demande de l’image i aux nœuds qui, a priori, ont l’image.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2011/11/image-absente.png"><img class="aligncenter size-large wp-image-27702" title="image absente" src="http://blog.octo.com/wp-content/uploads/2011/11/image-absente-1024x430.png" alt="image absente" width="645" height="271" /></a></p>
<p>&nbsp;</p>
<p>Ce cas d’utilisation met en avant le fait que la communication entre acteurs n’est pas unidirectionnelle. On voit également que l’utilisation d’états internes est utile pour changer dynamiquement le comportement de l’application. Attention néanmoins à l’augmentation de la complexité induite par ce changement.</p>
<h2>Conclusion</h2>
<p>La programmation orientée acteurs apporte des réponses aux problématiques de parallélisation et de distribution de calculs. Par le biais des superviseurs, elle propose un moyen de gérer les incidents. Les états internes permettent de « dynamiser » l’application au sens où le comportement peut changer au cours du temps (exemple de l’image absente d’un nœud). Et finalement, le système de dispatcher permet une gestion fine des ressources (cœur/ thread) utilisées.</p>
<p>Néanmoins le choix de ce paradigme s’avère plus lourd à mettre en place que la librairie TPL dans le cadre d&#8217;une implémentation mono-machine par exemple, et s’accompagne d’une augmentation de la complexité : coder en asynchrone n’est pas standard et l’utilisation d’états internes amène des difficultés supplémentaires.</p>
<p>Bruno Boucard au <a href="http://msmvps.com/blogs/brunoboucard/archive/2010/03/13/les-mod-232-les-de-d-233-veloppement-parall-232-le-pour-d-233-velopper-efficacement.aspx">TechDays</a> compare la programmation orientée acteurs avec d’autres solutions de parallélisation et de distribution en fonction du type d’algorithmes à implémenter. Il montre que les programmes composés de plusieurs étapes chainées et parallélisables (ici l’implémentation sans images manquantes), ou des programmes dont le traitement est irrégulié (ici l’exemple de l’image manquante) bénéficient le plus de ce type de programmation.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=27677" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/la-programmation-haute-performance-nest-elle-reservee-qua-une-elite-de-developpeurs-c/' rel='bookmark' title='La programmation haute performance n&#8217;est-elle réservée qu&#8217;à une élite de développeurs C++ ?'>La programmation haute performance n&#8217;est-elle réservée qu&#8217;à une élite de développeurs C++ ?</a></li>
<li><a href='http://blog.octo.com/introduction-a-la-gestion-de-version-distribuee/' rel='bookmark' title='Introduction à la gestion de version distribuée'>Introduction à la gestion de version distribuée</a></li>
<li><a href='http://blog.octo.com/datacenter-as-a-computer-une-plongee-dans-les-datacenters-des-acteurs-du-cloud/' rel='bookmark' title='Datacenter as a Computer : une plongée dans les datacenters des acteurs du cloud'>Datacenter as a Computer : une plongée dans les datacenters des acteurs du cloud</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/introduction-a-la-programmation-orientee-acteurs/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Applications mobiles multi-plateformes: les approches PhoneGap et Titanium Mobile</title>
		<link>http://blog.octo.com/applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile</link>
		<comments>http://blog.octo.com/applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 05:10:28 +0000</pubDate>
		<dc:creator>François Petitit</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Mobilité]]></category>
		<category><![CDATA[productivité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=26304</guid>
		<description><![CDATA[Introduction Le développement d&#8217;applications pour terminaux mobiles (iPhone, iPad, Android, Blackberry, Windows Phone, Nokia Symbian, Samsung Bada&#8230;) se heurte à la fragmentation des technologies de développements: environnement iOS/Objective-C pour l&#8217;iPhone et l&#8217;iPad, SDK Java spécifique pour Android, J2ME pour Symbian, etc. Deux approches possibles lorsque l&#8217;on débute un projet d&#8217;application ciblant plusieurs de ces plateformes [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/' rel='bookmark' title='Applications natives ou web HTML5 pour mon mobile ?'>Applications natives ou web HTML5 pour mon mobile ?</a></li>
<li><a href='http://blog.octo.com/ce-que-jquery-mobile-nous-apprend-sur-le-web-mobile/' rel='bookmark' title='Ce que jQuery Mobile nous apprend sur le Web Mobile'>Ce que jQuery Mobile nous apprend sur le Web Mobile</a></li>
<li><a href='http://blog.octo.com/le-terminal-mobile-et-usabilite-ou-comment-reveiller-le-canal-web-et-les-applications-desktop/' rel='bookmark' title='Le terminal mobile et usabilité ou comment réveiller le canal web et les applications desktop'>Le terminal mobile et usabilité ou comment réveiller le canal web et les applications desktop</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fapplications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fpp1xHQ%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Applications%20mobiles%20multi-plateformes%3A%20les%20approches%20PhoneGap%20et%20Titanium%20Mobile%22%20%7D);"></div>
<h2>Introduction</h2>
<p>Le développement d&#8217;applications pour terminaux mobiles (iPhone, iPad, Android, Blackberry, Windows Phone, Nokia Symbian, Samsung Bada&#8230;) se heurte à la fragmentation des technologies de développements: environnement iOS/Objective-C pour l&#8217;iPhone et l&#8217;iPad, SDK Java spécifique pour Android, J2ME pour Symbian, etc.</p>
<p>Deux approches possibles lorsque l&#8217;on débute un projet d&#8217;application ciblant plusieurs de ces plateformes sont de développer une application pour chacune d&#8217;elle, ou de développer un site Web compatible.</p>
<p>Dans le premier cas, l&#8217;inconvénient concerne bien évidemment le coût des développements. Dans le deuxième, on sera limité en richesse de l&#8217;application par les possibilités du Web.</p>
<p>Ce fut l&#8217;objet d&#8217;un précédent article sur notre blog: <a title="http://blog.octo.com/debat-web-apps-vs-natif/" href="http://blog.octo.com/debat-web-apps-vs-natif/" target="_blank">http://blog.octo.com/debat-web-apps-vs-natif/</a>.</p>
<p>Entre ces deux approches se situe une offre assez fournie de solutions de développement multi-plateforme, proposées par des éditeurs proposant leurs propres plateformes d&#8217;exécution et leurs outils de développement.</p>
<p>Parmi celles-ci, nous nous sommes concentrés dans cet article sur PhoneGap et Titanium Mobile, qui sont aujourd&#8217;hui parmi les plus abouties et sont représentatives des deux principales approches de développement multi-plateforme: l&#8217;utilisation des moteurs de rendus Web pour PhoneGap, et la translation de code source vers la plateforme cible pour Titanium.<br />
<span id="more-26304"></span></p>
<h2>Présentation des solutions</h2>
<h3><a href="http://www.phonegap.com/">PhoneGap</a></h3>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/10/PhoneGap.gif"><img src="http://blog.octo.com/wp-content/uploads/2011/10/PhoneGap.gif" alt="logo PhoneGap" title="PhoneGap" width="192" height="72" class="alignleft size-full wp-image-26313" /></a>Nitobi, l&#8217;éditeur de PhoneGap, a annoncé <a href="http://www.phonegap.com/2011/10/03/nitobi-enters-into-acquisition-agreement-with-adobe-2/">son rachat par Adobe</a> le 3 octobre 2011. Cela confirme l&#8217;intérêt que l&#8217;on peut avoir envers cette solution, même si ce rachat surprise apporte une certaine incertitude sur l&#8217;avenir de PhoneGap.<br />
PhoneGap est un outil open-source, et devrait d&#8217;ailleurs rejoindre la fondation Apache.<br />
Le principe de PhoneGap est de <strong>fournir des API JavaScript aux navigateurs Web standards, permettant d&#8217;appeler des fonctionnalités natives non disponibles autrement</strong>: accéder à l&#8217;appareil photo, à l&#8217;accéléromètre, au système de fichiers&#8230;<br />
Cela <strong>nécessite d&#8217;embarquer le code source HTML/CSS/JS dans une application native</strong>, grâce au composant permettant d&#8217;inclure une vue Web dans une application, disponible dans chaque SDK.</p>
<h3><a href="http://www.appcelerator.com/products/titanium-mobile-application-development/">Titanium</a></h3>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/10/APPC_logo.png"><img class="alignleft size-full wp-image-26315" title="APPC_logo" src="http://blog.octo.com/wp-content/uploads/2011/10/APPC_logo.png" alt="logo Appcelerator" width="177" height="40" /></a>Développé par Appcelerator qui vend du support et des formations sur Titanium, c&#8217;est également une solution libre.</p>
<p>Le principe de Titanium est de <strong>fournir une machine virtuelle JavaScript permettant d&#8217;accéder au système natif</strong>, et ainsi de développer des applications natives mais en JavaScript. C&#8217;est la promesse d&#8217;applications plus réactives et à l&#8217;expérience utilisateur plus proche du natif que celles basées sur des pages Web, comme PhoneGap.</p>
<h2>Points communs</h2>
<p>L&#8217;intérêt principal de l&#8217;utilisation d&#8217;une plateforme de développement multi-plateforme comme PhoneGap et Titanium Mobile réside en 2 points:</p>
<ul>
<li><strong>pouvoir déployer l&#8217;application sur les magasins (AppStore, Android Market&#8230;)</strong> afin de bénéficier de ce canal de distribution et de communication. Cela est réellement assuré par ces deux outils;</li>
<li><strong>réduire les coûts de développements en mutualisant du code</strong>. Cela est assuré par ces deux outils à condition de bien les utiliser et de limiter la part des développements spécifiques à chaque plateforme et donc de se limiter aux fonctionnalités supportées &laquo;&nbsp;out of the box&nbsp;&raquo;. On rogne donc sur l&#8217;expérience utilisateur et la richesse fonctionnelle.</li>
</ul>
<h2>Comparaison</h2>
<h3>Plateformes supportées</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px; vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>iOS, Android, BlackBerry, Bada, WindowsPhone, WebOS, Symbian</td>
<td>iOS, Android et depuis très récemment BlackBerry</td>
</tr>
</tbody>
</table>
<h4>Notre avis: </h4>
<p><strong>En pratique, les développements PhoneGap nécessitent des adaptations pour chaque plateforme</strong>, dont les capacités et l&#8217;expérience utilisateurs diffèrent fortement. Etant donné l&#8217;état du marché (avec l&#8217;écrasante domination de l&#8217;<strong>iPhone</strong>, d&#8217;<strong>Android</strong> et de <strong>Blackberry</strong>), <strong>on ciblera généralement ces 3 plateformes uniquement</strong>. C&#8217;est ce que l&#8217;on a pu constater dans la plupart des cas où une entreprise ciblait initialement toutes les plateformes: l&#8217;augmentation du coût pour les supporter au fur et à mesure rendait cela impossible et finalement, au maximum, seules les 3 ou 4 principales étaient vraiment adressées.<br />
Concernant Titanium, le support de Blackberry est encore récent et disponible uniquement sous Windows, alors que la plupart des développeurs mobiles sont sous Mac (pour l&#8217;iPhone). Cela est dommage mais on espère que ce sera bientôt résolu.<br />
Pour cibler tous les terminaux mobiles à moindre coût, le meilleur moyen reste de réaliser un site Web simple, qui permet de diffuser de l&#8217;information mais ne permet ni de fournir des fonctionnalités avancées (appareil photo, etc.), ni de proposer une expérience utilisateur riche, ni d&#8217;être visible sur l&#8217;AppStore.</p>
<h3>Richesse de la plateforme</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px; vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>Possibilités des navigateurs Web + API PhoneGap (principalement appareil photo, système de fichier, accéléromètre, liste des contacts, géolocalisation)
</td>
<td>Accès aux composants d&#8217;IHM natifs + API Titanium (base de données, géolocalisation, gestion des contacts, intégration Facebook, appareil photo, lecture et enregistrement audio/vidéo&#8230;)
</td>
</tr>
</tbody>
</table>
<h4>Notre avis: </h4>
<p><strong>Titanium est indéniablement plus riche fonctionnellement</strong> et fournira une apparence <strong>plus proche du natif</strong>, ce qui est en général l&#8217;objectif des concepteurs d&#8217;applications.<br />
PhoneGap est dans l&#8217;absolu plus limité en terme de fonctionnalités, et on doit concevoir les écrans comme des pages Web et non des écrans natifs. C&#8217;est d&#8217;ailleurs une erreur que l&#8217;on retrouve souvent sur les projets mobiles utilisant des technologies Web:<strong> il ne faut surtout pas tenter de reproduire des comportements natifs, mais plutôt viser des comportements Web performants</strong>.<br />
<strong>Les deux plateformes sont extensibles</strong>, Titanium plus facilement que PhoneGap, mais <strong>nous déconseillons globalement</strong> d&#8217;aller dans cette direction car cela devient très coûteux à maintenir (on estime en général à 20% la part maximale de code spécifique tolérable), et nécessite en outre encore plus de compétences que de faire des applications natives spécifiques à chaque plateforme.</p>
<h3>Plateforme de développement</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px;vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>HTML/CSS/JavaScript standard. On développe comme si c&#8217;était une application Web normale. Les API PhoneGap sont bien documentées, par-contre on devra chercher sur le Web la documentation pour les technologies HTML/CSS/JS et les éventuelles librairies JavaScript utilisées.</td>
<td>JavaScript en utilisant des API spécifiques à Titanium, que ce soit pour créer les IHM ou pour écrire des appels au système. Le site d&#8217;Appcelerator propose la documentation des API ainsi qu&#8217;une application démo (<a href="http://developer.appcelerator.com/doc/kitchensink">KitchenSink</a>) et des vidéos.</td>
</tr>
</tbody>
</table>
<h4>Notre avis:</h4>
<p>On remarque l&#8217;<strong>utilisation de plus en plus large de JavaScript</strong>, un langage décrié par ses côtés peu structuré et trop tolérant. Il est nécessaire, pour développer ce type d&#8217;applications, de <strong>se former profondément à JavaScript</strong> et de <strong>connaître les design patterns de structuration/modularisation</strong> du code dans ce langage, qui existent mais sont souvent mal connus des développeurs.<br />
C&#8217;est d&#8217;ailleurs le principal objet de la formation à Titanium donnée par leur expert <a href="http://www.appcelerant.com/appcelerator-community-member-spotlight-qa-with-kevin-whinnery.html" class="broken_link">Kevin Whinnery</a>, que nous avons eu la chance de suivre à l&#8217;<a href="http://updateconf.com/">UpdateConf 2011</a>.<br />
De manière globale, <strong>l&#8217;environnement de développement de Titanium est mieux intégré et plus documenté</strong>.</p>
<h3>Productivité des développement</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px;vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>PhoneGap nécessite de développer pour chaque plateforme ciblée dans l&#8217;IDE correspondant, et ne fournit pas d&#8217;outils supplémentaires.</td>
<td>Titanium fourni un IDE dédié, basé sur Aptana, un des meilleurs IDE Web reposant lui-même sur Eclipse (acheté récemment par Appcelerator)
</td>
</tr>
</tbody>
</table>
<h4>Notre avis:</h4>
<p>Titanium fournit un environnement de développement &laquo;&nbsp;clé en main&nbsp;&raquo; et performant, là où PhoneGap nécessite d&#8217;installer et configurer soi-même plusieurs environnements.<br />
<strong>La productivité est clairement côté Titanium</strong> aujourd&#8217;hui.</p>
<h3>Gestion des déploiements</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px;vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>PhoneGap propose depuis peu un outil de build sur le cloud: <a href="https://build.phonegap.com/" title="PhoneGap Build">PhoneGap Build</a>, qui compile un projet PhoneGap vers les différentes plateformes cibles, que vous pourrez ensuite publier sur l&#8217;AppStore, l&#8217;Android Market, etc.</td>
<td>Titanium ne fournit pas d&#8217;outil de packaging multi-plateforme. Vous devrez donc créer manuellement les packages applicatifs.</td>
</tr>
</tbody>
</table>
<h4>Notre avis:</h4>
<p><strong>L&#8217;automatisation du packaging et de la livraison des applications</strong> sur les différentes plateformes (magasins publics type AppStore ou comptes privés &laquo;&nbsp;in house&nbsp;&raquo;) <strong>est un véritable enjeu</strong> concernant la productivité des développements et le coût global d&#8217;un projet. C&#8217;est d&#8217;ailleurs pour cela qu&#8217;<strong>OCTO propose <a href="http://www.appaloosa-store.com/" title="Appaloosa">Appaloosa</a></strong>, qui facilite la distribution en entreprise d&#8217;applications mobiles dans des <em>stores</em> privés.<br />
L&#8217;outil PhoneGap Build (compatible uniquement avec les applications PhoneGap), qui vient d&#8217;être ouvert en version finale, était une véritable nécessité.</p>
<h2>Synthèse</h2>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">Fonctionnalité</th>
<th style="width:50%">Synthèse</th>
</tr>
<tr>
<td>Plateformes supportées</td>
<td>Avantage PhoneGap</td>
</tr>
<tr>
<td>Richesse (fonctionnalités + IHM)</td>
<td>Avantage Titanium</td>
</tr>
<tr>
<td>Langage de développement</td>
<td>Egalité</td>
</tr>
<tr>
<td>Productivité des développements</td>
<td>Avantage Titanium</td>
</tr>
<tr>
<td>Gestion des déploiements</td>
<td>Avantage PhoneGap</td>
</tr>
</tbody>
</table>
<p>Les points forts de PhoneGap sont donc aujourd&#8217;hui son support de plus de 6 plateformes, et le fait qu&#8217;il utilise au maximum les technologies standards du Web.<br />
Ses points faibles concernent ses limitations fonctionnelles et sa moindre richesse d&#8217;IHM du fait qu&#8217;il n&#8217;utilise pas les composants natifs, ainsi que son manque d&#8217;outillage de développement.</p>
<p>Les points forts de Titanium sont sa richesse fonctionnelle et graphique, ainsi que la productivité de son environnement de développement.<br />
Son point faible concerne le peu de plateformes supportées.</p>
<h2>Conclusion</h2>
<p>En conclusion, on a pu voir que <strong>Titanium est globalement plus productif et fournit plus de fonctionnalités que PhoneGap</strong> dans le but de développer des applications mobiles multi-plateformes. On le préfèrera en général, si l&#8217;on ne doit pas supporter plus que iOS + Android + BlackBerry.<br />
Au-delà du choix de l&#8217;outil, notre conseil majeur restera d&#8217;<strong>utiliser les outils pour ce qu&#8217;ils savent faire</strong>, et<strong> éviter de &laquo;&nbsp;tordre&nbsp;&raquo; leur usage</strong> pour leur faire faire autre chose ou de manière différente. Cela s&#8217;approche des problématiques bien connues d&#8217;utilisation trop personnalisée de progiciels, qui rend rapidement très coûteuse la moindre évolution.</p>
<p>Et d&#8217;ors et déjà, le choix de la technologie de développement multi-plateformes doit aussi se faire par-rapport aux applications Web HTML5 qui apportent de plus en plus de fonctionnalités et viennent sérieusement concurrencer les approches natives et hybrides, et les solutions Web existantes comme les moteurs de rendus (<a href="http://www.backelite.com/bkrender.php">BkRender</a>, <a href="http://www.wokup.com/">Wokup</a>) et les nombreux frameworks Web pour mobiles (par exemple <a href="http://www.sencha.com/products/touch/">Sencha Touch</a>.</p>
<p>La problématique du développement mobile multi-plateforme est loin d&#8217;être encore résolue, et nul doute que nous reviendrons encore dessus rapidement car c&#8217;est un enjeu fort pour les entreprises aujourd&#8217;hui.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=26304" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/' rel='bookmark' title='Applications natives ou web HTML5 pour mon mobile ?'>Applications natives ou web HTML5 pour mon mobile ?</a></li>
<li><a href='http://blog.octo.com/ce-que-jquery-mobile-nous-apprend-sur-le-web-mobile/' rel='bookmark' title='Ce que jQuery Mobile nous apprend sur le Web Mobile'>Ce que jQuery Mobile nous apprend sur le Web Mobile</a></li>
<li><a href='http://blog.octo.com/le-terminal-mobile-et-usabilite-ou-comment-reveiller-le-canal-web-et-les-applications-desktop/' rel='bookmark' title='Le terminal mobile et usabilité ou comment réveiller le canal web et les applications desktop'>Le terminal mobile et usabilité ou comment réveiller le canal web et les applications desktop</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Développement parallèle pour des machines multi-coeur en .NET 4.0</title>
		<link>http://blog.octo.com/developpement-parallele-pour-des-machines-multi-coeurs-en-net-4-0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=developpement-parallele-pour-des-machines-multi-coeurs-en-net-4-0</link>
		<comments>http://blog.octo.com/developpement-parallele-pour-des-machines-multi-coeurs-en-net-4-0/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 13:51:01 +0000</pubDate>
		<dc:creator>Alexis Flaurimont</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[.NET 4.0]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[multi-cores]]></category>
		<category><![CDATA[Parallel]]></category>
		<category><![CDATA[TPL]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=25419</guid>
		<description><![CDATA[Avec l’arrivée massive des processeurs multi-cœur, le parallélisme peut devenir une nécessité pour une application afin exploiter toute la puissance disponible d&#8217;une machine proposant ce type d&#8217;architecture. En effet, la loi de Moore, vérifiée depuis 1973, se heurte à une autre loi, celle des rendements décroissants.  Le nombre de transistors à ajouter pour obtenir un [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/article-parallelisation-distribution-partie-3-comment-tirer-parti-des-processeurs-multi-coeurs-a-travers-l-api-de-concurrence-de-java-7/' rel='bookmark' title='Parallélisation, distribution partie 3 : comment tirer parti des processeurs multi-coeurs à travers l&#8217;API de concurrence de Java 7 ?'>Parallélisation, distribution partie 3 : comment tirer parti des processeurs multi-coeurs à travers l&#8217;API de concurrence de Java 7 ?</a></li>
<li><a href='http://blog.octo.com/environnement-de-developpement-maveneclipse-pour-gwt-17/' rel='bookmark' title='Environnement de développement Maven/Eclipse pour GWT 1.7'>Environnement de développement Maven/Eclipse pour GWT 1.7</a></li>
<li><a href='http://blog.octo.com/devons-nous-changer-de-paradigme-pour-le-developpement-d%e2%80%99applications-informatiques/' rel='bookmark' title='Devons-nous changer de paradigme pour le développement d’applications informatiques?'>Devons-nous changer de paradigme pour le développement d’applications informatiques?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fdeveloppement-parallele-pour-des-machines-multi-coeurs-en-net-4-0%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22D%C3%A9veloppement%20parall%C3%A8le%20pour%20des%20machines%20multi-coeur%20en%20.NET%204.0%22%20%7D);"></div>
<p>Avec l’arrivée massive des processeurs multi-cœur, le parallélisme peut devenir une nécessité pour une application afin exploiter toute la puissance disponible d&#8217;une machine proposant ce type d&#8217;architecture. En effet, la <a href="http://fr.wikipedia.org/wiki/Loi_de_Moore">loi de Moore</a>, vérifiée depuis 1973, se heurte à une autre loi, celle des rendements décroissants.  Le nombre de transistors à ajouter pour obtenir un gain de performance donné devient de plus en plus important, empêchant les fondeurs de continuer à augmenter la fréquence d’horloge des processeurs. Pour contourner ce problème, ils favorisent les architectures multi-cœurs. Le parallélisme peut être très impactant dans le développement d&#8217;une application, celle-ci devant être écrite et adaptée pour tirer parti du hardware.</p>
<p>Qu’est-ce que le<strong> parallélisme </strong>sur une architecture multi-cœur? C&#8217;est l&#8217;emploi des capacités de calculs en simultané dans un cadre déterministe. Cela consiste à prendre une tâche, la diviser en un ensemble de sous-tâches indépendantes à exécuter simultanément, le travail étant réparti sur plusieurs cœurs (la notion de <strong>concurrence</strong>, quant à elle traite de l&#8217;allocation d&#8217;une même ressource CPU pour plusieurs processus, chacun disposant à son tour d&#8217;un quantum de temps de calcul).</p>
<p>Dans cet article, je vais examiner comment il peut être relativement facile d’implémenter la programmation parallèle dans une application, en utilisant le <strong>Framework  .NET 4.0</strong> et sa librairie TPL (<strong>Task Programming Library</strong>).</p>
<p><span id="more-25419"></span></p>
<p>Rappelons que l’idée principale est d’utiliser la puissance des machines multi-cœurs. Le challenge est donc de savoir comment diviser un fragment de programme en multiple unités et ce, de façon simultanée.</p>
<p>Je vous renvoie à un <a href="http://blog.octo.com/parallel-computing-sur-la-plateforme-net/">article</a> rédigé par Olivier Roux en 2009, traitant du même sujet mais basé sur les <em>Parallel Exentions</em>. Le but de ce nouvel article est de faire un point sur le développement parallèle, deux ans après. Certains éléments sont rebalayés ici, d&#8217;autres clarifiés, de nouveaux sujets sont abordés ainsi que des tests de performance.</p>
<p>La solution existante depuis le Framework .NET 2.0 est l’utilisation d’un pool de threads. Il est composé d’un scheduler et d’une file d’attente de threads. Quand un thread a fini son travail, il est mis dans la file et est de nouveau disponible pour être capté par une opération à exécuter.</p>
<p>Quels sont les avantages et nouveautés de la programmation parallèle dans le Framework .NET 4.0 ? Comme premier élément de réponse, je poserai la question suivante :</p>
<ul>
<li>Combien de développeurs sont capables de développer une application multi-threads sans difficultés ?</li>
</ul>
<p>Il est impossible de prédire le comportement d’un thread après sa création, d&#8217;où la complexité de ce type de développement, plutôt réservé aux développeurs chevronnés, spécialisés dans ce domaine. Les difficultés liées à la programmation parallèle sont évoquées dans un <a href="http://blog.octo.com/la-programmation-haute-performance-nest-elle-reservee-qua-une-elite-de-developpeurs-c/">article</a> de Sofian Djamaa.</p>
<p><strong>Comment utiliser les tâches ?</strong></p>
<p>Dans les version précédentes de .NET, il était complexe d&#8217;obtenir des informations sur ce qui se passait exactement après avoir mis un élément en attente dans le pool, c&#8217;était du &laquo;&nbsp;fire and forget&nbsp;&raquo;.</p>
<p>En .NET 4.0, la librairie TPL est un moyen &laquo;&nbsp;simplifié&nbsp;&raquo; d&#8217;utiliser le pool de threads. Une tâche (Task) représente une opération asynchrone, et à certains égards, ressemble à la création d&#8217;un nouveau thread ou à un élément de travail du pool de threads (work item), mais à un niveau supérieur d&#8217;abstraction. Les tâches ont deux avantages principaux:</p>
<ul>
<li><strong>Une utilisation plus efficace des ressources système:</strong><br />
Il n&#8217;y a pas de relation 1-1 entre une tâche et un thread. Les tâches sont mises en attente dans le thread pool. Celui-ci a été amélioré à l&#8217;aide d&#8217;algorithmes (comme <a href="http://en.wikipedia.org/wiki/Hill_climbing">Hill-climbing</a>) pour déterminer et ajuster le nombre de threads afin de maximiser le trafic. De plus, des algorithmes de type <a href="http://www.cs.cmu.edu/~acw/15740/proposal.html">Work-stealing</a> sont utilisés pour répartir la charge en fonction du nombre de processeurs (ou cœurs) disponibles. Le CLR 4.0 s&#8217;occupe donc de gérer le niveau de concurrence entre les threads.</li>
<li><strong>Un meilleur contrôle programmatique qu&#8217;avec les threads ou work items:</strong><br />
La librairie TPL fournit un ensemble de fonctions de contrôle : mise en attente, annulation, gestion des exceptions et plus encore.</li>
</ul>
<p>Exemple 1 : Création de tâches</p>
<pre class="brush:java">	static void Main(string[] args)
	        {
	            //Création et lancement de la première tâche
	            var t1=Task.Factory.StartNew(() =&gt; ProcessNumbers(10, 20));
	            //Création et lancement de la deuxième tâche
	            var t2=Task.Factory.StartNew(() =&gt; ProcessNumbers(20, 30));
	            //Création et lancement de la troisième tâche
	            var t3=Task.Factory.StartNew(() =&gt; ProcessNumbers(30, 40));
	            Console.ReadLine();
	        }  

	        static void ProcessNumbers(int start, int stop)
	        {
	            for (int i = start; i &lt; stop; i++)
	                Console.Write(" " + i);
	        }</pre>
<p>Ci-dessus, je créé 3 tâches, exécutées en parallèle. Remarquons que la tâche t3 commence avant que la tâche t2 soit terminée, car l&#8217;exécution des tâches est asynchrone.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/09/exemple1.jpg"><img class="alignnone size-full wp-image-25446" title="exemple1" src="http://blog.octo.com/wp-content/uploads/2011/09/exemple1.jpg" alt="" width="604" height="34" /></a></p>
<p>&nbsp;</p>
<p>Exemple 2 : Attendre l’exécution de tâches</p>
<pre class="brush:java">	//Création et lancement de la première tâche
	 var t1=Task.Factory.StartNew(() =&gt; ProcessNumbers(10, 20));
	 //Création et lancement de la deuxième tâche
	 var t2=Task.Factory.StartNew(() =&gt; ProcessNumbers(20, 30));  

	 //Attendons que t1 et t2 soient finies pour commencer t3
	 t1.Wait();
	 t2.Wait();  

	 //Création et lancement de la troisième tâche
	 var t3=Task.Factory.StartNew(() =&gt; ProcessNumbers(30, 40));
	 Console.ReadLine(); 

	        }</pre>
<p>Le code ci-dessus permet à la tâche t3 de commencer après que les tâches t1 et t2 soient finies. Ces deux tâches sont mises en attente dans le thread pool, l&#8217;appel à la fonction Wait() bloque les autres tâches jusqu&#8217;à ce que l&#8217;exécution de t1 et t2 soit terminée. J&#8217;aurais pu utiliser la méthode WaitAll() : Task.WaitAll(t1, t2), cela revient au même.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/09/exemple2.jpg"><img class="alignnone size-full wp-image-25462" title="exemple2" src="http://blog.octo.com/wp-content/uploads/2011/09/exemple2.jpg" alt="" width="604" height="28" /></a></p>
<p>&nbsp;</p>
<p>Exemple 3 : Tâche retournant un résultat</p>
<pre class="brush:java">// La method MyMethod() retourne une chaîne de caractères
Task aTask = new Task(MyMethod);
aTask.Start();

Task.WaitAll();

string result = aTask.Result;</pre>
<p>Pour que la tâche retourne une valeur, il faut utiliser la version générique Task&lt;T&gt;. Le paramètre T désigne le type de retour. Le type Task a une propriété &laquo;&nbsp;Result&nbsp;&raquo; qui bloque l&#8217;exécution en y accédant, je m&#8217;explique :</p>
<pre class="brush:java">var task = Task.Factory.StartNew(() =&gt;
{
    Thread.Sleep(3000);
    return "dummy value";
});
Console.WriteLine(task.Result);</pre>
<p>La tâche s&#8217;exécute dans un thread séparé et prendra 3 secondes. Lorsque j&#8217;appelle &laquo;&nbsp;Console.WriteLine&nbsp;&raquo;, une exception n&#8217;est pas levée même si le résultat n&#8217;est pas encore disponible. L&#8217;exécution est bloquée 3 secondes avant de continuer. Cela peut être nécessaire lorsqu&#8217;utilisé avec des tâches longues, sachant qu&#8217;elles utiliseront cette faculté de bloquer en attendant qu&#8217;elles soient terminées.</p>
<p>Remarque : la méthode WaitAny(t1, t2, t3&#8230;) permet d’attendre l&#8217;exécution de l&#8217;une des tâches sans se soucier laquelle.</p>
<p>Il est également possible d’utiliser la méthode ContinueWith(Action&lt;Task&gt;) pour réaliser la même chose, à savoir attendre la fin d’une tâche pour en débuter une autre. La méthode ContinueWhenAll(Task[], Action&lt;Task[]&gt;), quant à elle permet de spécifier quelle(s) tâche(s) attendre avant d’en commencer une autre.<br />
Plus généralement, TaskFactory contient un nombre intéressant de méthodes qui pourront vous aider dans de nombreuses occasions.</p>
<p><strong>Comment paralléliser les boucles ?</strong></p>
<p>L&#8217;idée est de traiter chaque itération indépendante de la boucle simultanément.</p>
<p>Exemple 4 : Parallel.For</p>
<p>Considérons une boucle <em>for</em> basique :</p>
<pre class="brush:java">for (int i = 0; i &lt; 200; i++)
{
    if (i % 2 == 1)
        Console.WriteLine(i + " ");
}</pre>
<p>Remarquons que pour paralléliser cette boucle, la syntaxe change peu:</p>
<pre class="brush:java">Parallel.For(0, 200, (i) =&gt;
{
    if (i % 2 == 1)
        Console.WriteLine(i + " ");
});</pre>
<p>Exemple 5 : Parallel.ForEach</p>
<p>Voici un exemple plus concret, il provient du projet <a href="http://msdn.microsoft.com/en-us/library/ff963552.aspx">CreditReview</a> que fournit Microsoft.  L’idée est d’identifier les comptes à risque s’ils ont excédé leur limite de crédit les mois précédents. Le statut de crédit de chaque client ne dépend pas du statut d’un autre.</p>
<p>Boucle séquentielle :</p>
<pre class="brush:java">static void UpdatePredictionsSequential(AccountRepository accounts)
        {
            foreach (Account account in accounts.AllAccounts)
            {
                Trend trend = SampleUtilities.Fit(account.Balance);
                double prediction = trend.Predict(
                                 account.Balance.Length + NumberOfMonths);
                account.SeqPrediction = prediction;
                account.SeqWarning = prediction &lt; account.Overdraft;
            }
        }</pre>
<p>Boucle parallèle :</p>
<pre class="brush:java">static void UpdatePredictionsParallel(AccountRepository accounts)
        {
            Parallel.ForEach(accounts.AllAccounts, account =&gt;
            {
                Trend trend = SampleUtilities.Fit(account.Balance);
                double prediction = trend.Predict(
                                   account.Balance.Length + NumberOfMonths);
                account.ParPrediction = prediction;
                account.ParWarning = prediction &lt; account.Overdraft;
            });
        }</pre>
<p>&nbsp;</p>
<p>Une telle construction gère de façon dynamique l’augmentation et la réduction du nombre de threads, suivant la charge disponible sur chaque cœur, impliqués dans les opérations de façon à déterminer le nombre de threads optimal pour une charge de travail donnée.</p>
<p>L’avantage par rapport à la gestion classique de threads pour le développeur est de lui épargner de coder des solutions de partitionnement des charges de travail, celui-ci pouvant se concentrer sur la logique métier.</p>
<p><strong>Optimisation des boucles</strong></p>
<p>Dans la pratique, quand plusieurs boucles sont imbriquées, il n’est pas nécessaire de paralléliser boucles externe et boucles internes, <strong>la boucle externe suffit</strong>. En effet, celle-ci offre de plus grandes unités de travail à paralléliser, diluant la surcharge due au mécanisme de synchronisation des threads.</p>
<p>Une autre optimisation est l’emploi d’une valeur locale. Le problème est le suivant : supposons que nous voulions additionner la racine carré d’un nombre dix millions de fois. Le calcul est parallélisable sans problème, mais additionner les valeurs devient gênant car nous devons verrouiller la mise à jour du total :</p>
<p>Exemple  6 : Lock, optimisation avec une valeur locale</p>
<pre class="brush:java">object locker = new object();
double total = 0;
Parallel.For (1, 10000000,
              i =&gt; { lock (locker) total += Math.Sqrt (i); });</pre>
<p>Dans le code ci-dessus, le gain du à la paralléisation est contrebalancé par le coût de 10 millions de locks, dont nous n’avons pas besoin.</p>
<pre class="brush:java">object locker = new object();
double grandTotal = 0;

Parallel.For (1, 10000000,

  () =&gt; 0.0,                     // Initialisation de la valeur locale.

  (i, state, localTotal) =&gt;      // Le délégué invoqué pour chaque itération
     localTotal + Math.Sqrt (i),    // Il retourne la nouvelle valeur locale.

  localTotal =&gt;                                // Ajout de la variable locale
    { lock (locker) grandTotal += localTotal; }    // à la valeur globale.</pre>
<p>Certes, il y a toujours des locks mais seulement pour la somme grandTotal += localTotal, ce qui est beaucoup plus efficace que la version précédente.</p>
<p>Exemple 7 : Degré de parallélisme</p>
<p>Il s&#8217;agit de limiter le nombre de cœurs à utiliser dans une exécution.</p>
<pre class="brush:java">var options = new ParallelOptions();
options.MaxDegreeOfParallelism = Math.Max(Environment.ProcessorCount / 2, 1);

Parallel.For(0, pixelData.GetUpperBound(0), options, row =&gt;
{
    for (int col=0; col &lt; pixelData.GetUpperBound(1); ++col)
    {
        pixelData[row, col] = AdjustContrast(pixelData[row, col], minPixel, maxPixel);
    }
});</pre>
<p>Bien souvent, la configuration par défaut convient, mais dans certains cas il peut être utile d’utiliser un sous-ensemble des cœurs disponibles. En pratique, cela limite le nombre d’opérations simultanées, qui peut être intéressant si nous exécutons un processus long, nous ne voulons pas multiplier les requêtes sur le serveur en même temps. Le serveur lui-même peut ne pas être en mesure de toutes les traiter et étonnamment se retrouver surchargé (le principe d’une attaque DOS).</p>
<p><strong>PLINQ</strong></p>
<p>L’une des autres avancées du Framework .NET 4.0 en matière de parallélisme est le Parallel LINQ (PLINQ). Son utilisation est identique à LINQ-to-Objects et LINQ-to-XML. Tous les opérateurs de requêtes du C# 3.5 sont disponibles. Les requêtes LINQ-to-SQL et LINQ-to-Entities sont toujours exécutées par les bases de données, donc non parallélisable par PLINQ.</p>
<p>PLINQ s’avère utile pour les requêtes nécessitant une grande quantité de calcul. Il est aussi possible d’interroger simultanément plusieurs sources de données (bases de données, fichier XML…) après avoir été chargées en mémoire.</p>
<p>Exemple 8 : de LINQ à PLINQ</p>
<p>Une requête simple LINQ</p>
<pre class="brush:java">IEnumerable data = ...;
var q = data.Where(x =&gt; p(x)).Orderby(x =&gt; k(x)).Select(x =&gt; f(x));
foreach (var e in q) a(e);</pre>
<p>En PLINQ</p>
<pre class="brush:java">IEnumerable data = ...;
var q = data.AsParallel().Where(x =&gt; p(x)).Orderby(x =&gt; k(x)).Select(x =&gt; f(x));
foreach (var e in q) a(e);</pre>
<p>PLINQ exécute les clauses Where, OrderBy et Select de manière transparente sur tous les coeurs disponibles. La technologie Parallel Linq, qui est un sujet à part entière, ne sera pas plus détaillée volontairement.</p>
<p><strong>Comment débugger?</strong></p>
<p>Pour parcourir unitairement en mode pas-à-pas chaque thread, Visual Studio 2010 possède une fenêtre dédiée : Debug -&gt; Windows -&gt; Parallel Tasks. Il est possible de freezer les tâches, de switcher entre-elles. Visual Studio identifiera les deadlocks et vous dira quelles sont les deux threads mis en cause et quel objet elles attendent.</p>
<p>Nous pouvons aussi afficher une représentation graphique des threads exécutés : Debug -&gt; Windows -&gt; Parallel Stacks.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/09/debug.jpg"><img class="alignnone size-full wp-image-25659" title="debug" src="http://blog.octo.com/wp-content/uploads/2011/09/debug.jpg" alt="" width="1009" height="663" /></a></p>
<p><strong>Gestion des exceptions</strong></p>
<p>Il est possible de gérer les exceptions, en effet, celles-ci sont stockées dans une tâche et sont levées lorsque toutes les tâches sont terminées. Les exceptions ne sont jamais perdues et correctement propagées. Pour les propager au thread appelant, elles sont encapsulées dans une instance AggregateException. Elle peut énumérer, examiner toutes les exceptions qui ont été levées individuellement.</p>
<p>Exemple 9 : AggreagateException</p>
<pre class="brush:java">var task1 = Task.Factory.StartNew(() =&gt;
            {
                throw new MyCustomException("mon exception");
            });

            try
            {
                task1.Wait();
            }
            catch (AggregateException ae)
            {
                foreach (var e in ae.InnerExceptions)
                {
                    if (e is MyCustomException)
                    {
                        Console.WriteLine(e.Message);
                    }
                    else
                    {
                        throw;
                    }
                }
            }</pre>
<p>&nbsp;</p>
<p><strong>Et les performances ?</strong></p>
<p>La première démo illustrant le gain de performances de la programmation multi-cœurs en .NET 4.0 est une multiplication de deux matrices de même dimension et le calcul du résultat dans une troisième. Cet exemple est un bon candidat pour le parallélisme car nécessitant beaucoup de calculs.</p>
<p>Je fais cette opération tout d’abord en mode séquentiel, puis en mode parallèle et je compare le temps d’exécution de chacun des deux modes.</p>
<p>Exemple 10 : multiplication de matrices</p>
<p>Ci-dessous le code d’initialisation des matrices :</p>
<pre class="brush:java">static double[,] InitializeMatrix(int rows, int cols)
        {
            double[,] matrix = new double[rows, cols];

            Random r = new Random();
            for (int i = 0; i &lt; rows; i++)
            {
                for (int j = 0; j &lt; cols; j++)
                {
                    matrix[i, j] = r.Next(100);
                }
            }
            return matrix;
        }</pre>
<p>La boucle séquentielle:</p>
<pre class="brush:java">static void MultiplyMatricesSequential(double[,] matA, double[,] matB,
                                                double[,] result)
        {
            int matACols = matA.GetLength(0);
            int matBCols = matB.GetLength(0);
            int matARows = matA.GetLength(0);

            for (int i = 0; i &lt; matARows; i++)
            {
                for (int j = 0; j &lt; matBCols; j++)
                {
                    double temp = 0;
                    for (int k = 0; k &lt; matACols; k++)
                    {
                        temp += matA[i, k] * matB[k, j];
                    }
                    result[i, j] = temp;
                }
            }
        }</pre>
<p>Et la boucle parallélisée:</p>
<pre class="brush:java">static void MultiplyMatricesParallel(double[,] matA, double[,] matB, double[,] result)
        {
            int matACols = matA.GetLength(1);
            int matBCols = matB.GetLength(1);
            int matARows = matA.GetLength(0);

            // Multiplication des matrices
            // Parallélisation de la boucle externe pour partitionner
            //la matrice source par ligne.
            Parallel.For(0, matARows, i =&gt;
            {
                for (int j = 0; j &lt; matBCols; j++)
                {
                    double temp = 0;
                    for (int k = 0; k &lt; matACols; k++)
                    {
                        temp += matA[i, k] * matB[k, j];
                    }
                    result[i, j] = temp;
                }
            });
        }</pre>
<p>&nbsp;</p>
<p>La machine sur laquelle les tests sont effectués embarque un processeur Intel Core i7 Quad-Core HT.</p>
<p>Les résultats sont logiquement ceux espérés.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/09/matrix.jpg"><img class="alignnone size-full wp-image-25803" title="matrix" src="http://blog.octo.com/wp-content/uploads/2011/09/matrix.jpg" alt="" width="544" height="326" /></a></p>
<p>J&#8217;ai fait varier la taille des matrices [n,n], n prenant respectivement les valeurs 500, 1000, 1500, 2000, et 2500.</p>
<p>Dans les tests en mode parallèle, le pourcentage d’utilisation du CPU est toujours monté à 100% :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/09/cpu.jpg"><img class="alignnone size-full wp-image-25665" style="border-width: 1px; border-color: black; border-style: solid;" title="cpu" src="http://blog.octo.com/wp-content/uploads/2011/09/cpu.jpg" alt="" width="244" height="419" /></a></p>
<p>Il est resté bloqué à 12% en mode séquentiel. Cela s’explique par la nature du processeur, Quad-Core en effet, mais 8 threads (avec le support de l&#8217;HyperThreading).</p>
<p>En tirant parti de la librairie TPL du Framework .NET 4.0, le temps d’exécution peut même être divisé par un facteur supérieur à 4, en mode parallèle. Ce résultat peut sembler étonnant, nous devrions avoir un gain de performances théoriques inférieures à 4 (car quatre cœurs). En effet, dans l’OS, d’autres applications tournent en arrière-plan. Le mécanisme de synchronisation des threads doit aussi prendre un peu de puissance de calcul. Ceci reflète sans doute l’amélioration des performances due au mode HyperThreading du processeur.</p>
<p>Exemple 11 : BabyNames</p>
<p>La deuxième démo utilise PLINQ cette fois. C&#8217;est la démo <em>BabyNames</em> du <a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=23507">training kit Visual Studio 2010</a>. Les coordonnées d&#8217;individus d&#8217;une population sont chargées en mémoire (250 Mo), une requête LINQ ou PLINQ est exécutée suivant le mode désiré. Elle recense le nombre de naissances par année, pour un nom/prénom choisi.</p>
<p>J&#8217;obtiens les résultats suivants, en faisant varier le nombre de cœurs :</p>
<p>&nbsp;</p>
<table style="text-align: center;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="250"><strong><span style="color: #000080;">Nombre de cœurs</span></strong></td>
<td valign="top" width="200"><strong><span style="color: #000080;">LINQ (temps en secondes)</span></strong></td>
<td valign="top" width="200"><strong><span style="color: #000080;">PLINQ (temps en secondes)</span></strong></td>
<td valign="top" width="150"><strong><span style="color: #000080;">Amélioration</span></strong></td>
</tr>
<tr>
<td valign="top" width="250"><strong>0,5 (1 thread)</strong></td>
<td valign="top" width="200">12,55</td>
<td valign="top" width="200">13,71</td>
<td valign="top" width="150">x 0,92</td>
</tr>
<tr>
<td valign="top" width="250"><strong>1</strong></td>
<td valign="top" width="200">12,55</td>
<td valign="top" width="200">7,38</td>
<td valign="top" width="150">x 1,70</td>
</tr>
<tr>
<td valign="top" width="250"><strong>2</strong></td>
<td valign="top" width="200">12,55</td>
<td valign="top" width="200">4,27</td>
<td valign="top" width="150">x 2,94</td>
</tr>
<tr>
<td valign="top" width="250"><strong>3</strong></td>
<td valign="top" width="200">12,55</td>
<td valign="top" width="200">3,53</td>
<td valign="top" width="150">x 3,56</td>
</tr>
<tr>
<td valign="top" width="250"><strong>4</strong></td>
<td valign="top" width="200">12,55</td>
<td valign="top" width="200">2,91</td>
<td valign="top" width="150">x 4,31</td>
</tr>
</tbody>
</table>
<p>Les résultats sont à peu près du même ordre que dans l’exemple précédent. Il est intéressant de noter que notre processeur étant HT, le programme détecte 8 cœurs. Nous pouvons donc sélectionner très finement le degré de parallélisme voulu. Nous observons que la requête PLINQ exécuté sur un seul thread d’un unique cœur est presque aussi rapide que la même requête LINQ.</p>
<p>&nbsp;</p>
<p>La programmation parallèle est longtemps restée le domaine de développeurs spécialisés. Il semblerait que cela soit en train de changer dans le monde .NET, et c’est plutôt une bonne nouvelle. En effet, le gain de performances que la librairie TPL peut apporter est à prendre en compte dans le développement d’une application ou d’un composant de celle-ci.</p>
<p>Le parallélisme à la sauce Microsoft inclus dans le Framework .NET 4éme mouture est certes une surcouche encapsulant elle-même les mécanismes plus bas niveau du parallélisme, j’entends déjà les puristes de la manipulation du thread crier au scandale. Néanmoins, le développement d&#8217;une application multi-threadée est grandement simplifié et peut demander peu d’efforts à condition que les algorithmes soient facilement parallélisable, y compris pour adapter un code déjà existant.</p>
<p>Notons que le C# 5 Async doit apporter un lot de nouveautés, qui, combinées avec la librairie TPL, devraient être intéressantes pour les opérations asynchrones.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=25419" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/article-parallelisation-distribution-partie-3-comment-tirer-parti-des-processeurs-multi-coeurs-a-travers-l-api-de-concurrence-de-java-7/' rel='bookmark' title='Parallélisation, distribution partie 3 : comment tirer parti des processeurs multi-coeurs à travers l&#8217;API de concurrence de Java 7 ?'>Parallélisation, distribution partie 3 : comment tirer parti des processeurs multi-coeurs à travers l&#8217;API de concurrence de Java 7 ?</a></li>
<li><a href='http://blog.octo.com/environnement-de-developpement-maveneclipse-pour-gwt-17/' rel='bookmark' title='Environnement de développement Maven/Eclipse pour GWT 1.7'>Environnement de développement Maven/Eclipse pour GWT 1.7</a></li>
<li><a href='http://blog.octo.com/devons-nous-changer-de-paradigme-pour-le-developpement-d%e2%80%99applications-informatiques/' rel='bookmark' title='Devons-nous changer de paradigme pour le développement d’applications informatiques?'>Devons-nous changer de paradigme pour le développement d’applications informatiques?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/developpement-parallele-pour-des-machines-multi-coeurs-en-net-4-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le point sur Node</title>
		<link>http://blog.octo.com/le-point-sur-node/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=le-point-sur-node</link>
		<comments>http://blog.octo.com/le-point-sur-node/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 14:11:16 +0000</pubDate>
		<dc:creator>Vincent Grastic</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=24038</guid>
		<description><![CDATA[Dans cet article, nous allons faire le point sur Node, une technologie serveur dont tout le monde parle et qui est devenue, en 2 ans seulement, le 3ème projet le plus suivi sur GitHub derrière Rails et jQuery. Node en quelques mots Node est une technologie créée en 2009 par Ryan Dahl et soutenue par Joyent [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fle-point-sur-node%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Le%20point%20sur%20Node%22%20%7D);"></div>
<p>Dans cet article, nous allons faire le point sur Node, une technologie serveur dont tout le monde parle et qui est devenue, en 2 ans seulement, le 3ème projet le plus suivi sur GitHub derrière Rails et jQuery.</p>
<p><span id="more-24038"></span></p>
<h3>Node en quelques mots</h3>
<p><a href="http://nodejs.org/">Node</a> est une technologie créée en 2009 par Ryan Dahl et soutenue par <a href="http://www.joyent.com/">Joyent</a> qui permet de réaliser simplement des applications réseau asynchrones, performantes et scalables en JavaScript.</p>
<p><strong>Pourquoi JavaScript ?<br />
</strong>Aujourd’hui, pour traiter un grand nombre de requêtes, la stratégie des serveurs haute performance, comme <a href="http://nginx.net/">nginx</a> par exemple, est d’utiliser un thread et une approche événementielle.</p>
<p>Node reprend ce principe et va plus loin en utilisant JavaScript: un langage conçu pour tourner au sein du navigateur dans un thread et une boucle événementielle asynchrone.</p>
<p>C’est également un choix qui simplifie les développements web puisque le langage côté navigateur et serveur est le même. Par la même occasion, cela ouvre de nombreuses perspectives en terme de partage de code entre ces deux mondes.</p>
<p>Exemple de code asynchrone affichant &laquo;&nbsp;hello world&nbsp;&raquo; en JS:</p>
<pre class="brush:javascript">setTimeout(function () { console.log('world') }, 2000);
console.log('hello');</pre>
<p><strong>Comment ?<br />
</strong>Pour exécuter du code JS côté serveur, Node utilise le moteur <a href="http://code.google.com/intl/fr-FR/apis/v8/intro.html">V8</a> de Google.</p>
<p>C’est l’un des moteurs JS les plus performants grâce à de nombreuses optimisations (compilation du code JS en code machine, garbage collector, &#8230;) dont on trouvera le détail <a href="http://code.google.com/intl/fr-FR/apis/v8/design.html">ici</a>.</p>
<p>Pour les aspects non pris en charge par JS et V8, Node implémente ses propres librairies non bloquantes (HTTP, TCP, FileSystem, etc&#8230;).</p>
<p><strong>Rapide et léger<br />
</strong>Ces choix techniques font que les applications basées sur Node sont très performantes et capables de traiter efficacement un grand nombre de requêtes concurrentes tout en gardant une empreinte mémoire faible.</p>
<p><strong>En pratique?<br />
</strong>Voici un serveur développé en JS et utilisant le module HTTP de Node. Les requêtes sont traitées de façon asynchrone dans un callback.</p>
<pre class="brush:javascript">var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337');</pre>
<p>&nbsp;</p>
<h3>Node et Rails une histoire comparable ?</h3>
<p>Pour bien comprendre le phénomène Node, il est intéressant de le mettre en perspective avec Rails à ses débuts.</p>
<p><strong>Une adoption d’abord chez les développeurs<br />
</strong>A l’inverse de technologies poussées par des poids lourds, Rails est une technologie qui a d’abord été adoptée et popularisée par les développeurs.</p>
<p>De la même façon, Node est un projet open source qui a démarré sur la plateforme de social coding <a href="https://github.com/">GitHub</a> essentiellement fréquentée par des développeurs web.</p>
<p>Aujourd’hui, Node est le 3ème projet le plus suivi sur cette plateforme.</p>
<p><strong>Les deux technologies répondent à une problématique de leurs temps<br />
</strong>Rails permettait de faire, beaucoup plus simplement que les autres, des applications web CRUD avec base de données. Ce type d&#8217;application était la tendance il y a quelques années.</p>
<p>Aujourd’hui, la tendance est au web temps réel et Node permet de le faire de façon performante mais surtout plus simplement que les autres.</p>
<p>Exemple: avec Node et le module <a href="http://nowjs.com/">NowJS</a>, il est possible de faire un chat web en 12 lignes.</p>
<p><strong>Il y a un module pour ça<br />
</strong>La force de Rails, hormis la qualité du framework, est l’éco-système de gems développées par la communauté. Sans celui-ci l’intérêt de Rails serait beaucoup plus limité.</p>
<p>On retrouve cela avec Node et de nombreux modules tiers sont disponibles. Il existe d&#8217;ailleurs un gestionnaire de paquet, <a href="http://npmjs.org/">Node Package Manager</a>, similaire à RubyGems.</p>
<p>C’est cette capacité à être étendu et la communauté autour qui fait tout l’intérêt et le potentiel de Node.</p>
<p><em>Une précision toutefois, même si Node et Rails ont un début de parcours semblable, les deux technologies sont fondamentalement différentes techniquement et dans la réponse qu’elles apportent. Rails est un framework MVC, Node est une base sur laquelle d&#8217;autres modules sont développées, dont des frameworks web.</em></p>
<p><em><br />
</em></p>
<h3>Où en est Node aujourd&#8217;hui ?</h3>
<p>Node et son éco-système évoluent très rapidement, néanmoins voici plus ou moins l’état actuel.</p>
<p><strong>Node<br />
</strong>Node est activement développé. C’est une technologie “from scratch” qui change encore beaucoup mais qui est utilisable et performante.</p>
<p>Node tourne sous MacOS, Linux et depuis peu Windows.<br />
Fait assez significatif, Microsoft a participé à ce portage.</p>
<p><strong>Modules<br />
</strong>Les modules disponibles évoluent eux aussi rapidement.</p>
<p>Il y a eu un gros effort de développement fait par la communauté et on trouve maintenant des modules pour la plupart des besoins habituels (web temps réel, frameworks, persistance, templates, tests, DSL, …).</p>
<p>A titre d&#8217;exemples, on pourra aller voir: <a href="http://expressjs.com/">Express</a>, <a href="http://socket.io/">Socket.IO</a>, <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a>, <a href="https://github.com/LearnBoost/mongoose">Mongoose</a>, <a href="http://zombie.labnotes.org/">Zombie.js</a>, <a href="http://vowsjs.org/">Vows</a>,  &#8230;</p>
<p>Globalement, c’est un éco-système qui se cherche encore mais qui évolue vite.</p>
<p>Il y aura, comme ce fut le cas avec la vague Rails et ses plugins, une &laquo;&nbsp;sélection naturelle&nbsp;&raquo; des modules.</p>
<p><strong>Les applications qui utilisent Node<br />
</strong>Comme avec Rails au début, ce sont surtout des applications de développeurs ou des startups. On trouve également quelques sociétés comme <a href="https://www.yammer.com/">Yammer</a>, HP (<a href="https://developer.palm.com/">webOS</a>), 37signals (<a href="http://pow.cx/">Pow</a>).</p>
<p>Les cas d&#8217;utilisation sont assez variés: API, web temps réel, serveurs, etc&#8230;</p>
<p>Node est principalement utilisé sur les aspects nécessitant de traiter un grand nombre de requêtes avec des temps de réponse faible.</p>
<p>Aujourd&#8217;hui, ce qu’il manque surtout à Node pour passer sur le devant de la scène est une killer app grand public.</p>
<p>&nbsp;</p>
<h3>A retenir</h3>
<p>Node est une nouvelle technologie qui suscite, à juste titre, beaucoup d’intérêt par ses performances et sa simplicité.</p>
<p>Mais Node s&#8217;inscrit aussi dans une tendance générale du web.</p>
<p>Depuis plusieurs années, on constate une montée en puissances de JS, notamment côté navigateur avec:</p>
<ul>
<li>des moteurs de plus en plus rapides</li>
<li>des applications et des frameworks pour les développer de plus en plus évolués (<a href="http://documentcloud.github.com/backbone/">BackBone</a>, <a href="http://sammyjs.org/">Sammy.js</a>, &#8230;)</li>
</ul>
<p>Node en permettant d&#8217;utiliser le même langage côté serveur ouvre de nombreuses possibilités. Il n&#8217;est pas rare de voir des modules pouvant être exécuté côté navigateur ou serveur avec la même base de code.</p>
<p>Aujourd&#8217;hui, tous les éléments sont réunis pour voir émerger de nouveaux frameworks web basés sur Node permettant de faire simplement du JS de bout en bout:</p>
<p><strong>Technique<br />
</strong>JS est présent à tous les niveaux, les briques de base côté Node sont développées (modules web temps réel, persistance, templates, …) et les performances sont suffisantes pour supporter les nouveaux usages web.</p>
<p><strong>Communauté<br />
</strong>Grâce au choix du langage et à son faible coût d’entrée, Node bénéficie d’une communauté active, très importante et fortement orientée web.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=24038" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/le-point-sur-node/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mes bonnes pratiques en PowerShell v2</title>
		<link>http://blog.octo.com/mes-bonnes-pratiques-en-powershell/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mes-bonnes-pratiques-en-powershell</link>
		<comments>http://blog.octo.com/mes-bonnes-pratiques-en-powershell/#comments</comments>
		<pubDate>Thu, 12 May 2011 13:51:51 +0000</pubDate>
		<dc:creator>Julien Jakubowski</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[tips&tricks]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=22530</guid>
		<description><![CDATA[Voici plus d&#8217;un an maintenant que je réalise régulièrement des scripts PowerShell en tout genre. Dernièrement j&#8217;ai pu remarquer que j&#8217;utilisais et améliorais continuellement certaines pratiques qui me facilitaient aussi bien le développement de scripts PowerShell que leur correction ou évolution. Dans cet article (en anglais), je vous présente ainsi ces &#171;&#160;bonnes pratiques&#160;&#187; que j&#8217;ai [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/octo-partage-ses-bonnes-pratiques-dans-le-livre-partageons-ce-qui-nous-departage/' rel='bookmark' title='OCTO partage ses bonnes pratiques dans le livre Partageons ce qui nous départage'>OCTO partage ses bonnes pratiques dans le livre Partageons ce qui nous départage</a></li>
<li><a href='http://blog.octo.com/powershell-le-couteau-suisse-des-administrateurs-windows/' rel='bookmark' title='PowerShell : le couteau suisse des administrateurs Windows ?'>PowerShell : le couteau suisse des administrateurs Windows ?</a></li>
<li><a href='http://blog.octo.com/beckett-la-guitare-de-jimi-hendrix-et-les-pratiques-agiles/' rel='bookmark' title='Beckett, la guitare de Jimi Hendrix et les pratiques agiles'>Beckett, la guitare de Jimi Hendrix et les pratiques agiles</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fmes-bonnes-pratiques-en-powershell%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Mes%20bonnes%20pratiques%20en%20PowerShell%20v2%22%20%7D);"></div>
<p>Voici plus d&#8217;un an maintenant que je réalise régulièrement des scripts PowerShell en tout genre.<br />
Dernièrement j&#8217;ai pu remarquer que j&#8217;utilisais et améliorais continuellement certaines pratiques qui me facilitaient aussi bien le développement de scripts PowerShell que leur correction ou évolution.</p>
<p>Dans cet article (en anglais), je vous présente ainsi ces &laquo;&nbsp;bonnes pratiques&nbsp;&raquo; que j&#8217;ai pu identifier avec le temps.<br />
La suite <a href="http://blog.octo.com/en/powershell-v2-my-best-practices/">ici</a>.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=22530" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/octo-partage-ses-bonnes-pratiques-dans-le-livre-partageons-ce-qui-nous-departage/' rel='bookmark' title='OCTO partage ses bonnes pratiques dans le livre Partageons ce qui nous départage'>OCTO partage ses bonnes pratiques dans le livre Partageons ce qui nous départage</a></li>
<li><a href='http://blog.octo.com/powershell-le-couteau-suisse-des-administrateurs-windows/' rel='bookmark' title='PowerShell : le couteau suisse des administrateurs Windows ?'>PowerShell : le couteau suisse des administrateurs Windows ?</a></li>
<li><a href='http://blog.octo.com/beckett-la-guitare-de-jimi-hendrix-et-les-pratiques-agiles/' rel='bookmark' title='Beckett, la guitare de Jimi Hendrix et les pratiques agiles'>Beckett, la guitare de Jimi Hendrix et les pratiques agiles</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/mes-bonnes-pratiques-en-powershell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Travaillons ensemble à votre contractualisation Agile</title>
		<link>http://blog.octo.com/travaillons-ensemble-a-votre-contractualisation-agile/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=travaillons-ensemble-a-votre-contractualisation-agile</link>
		<comments>http://blog.octo.com/travaillons-ensemble-a-votre-contractualisation-agile/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 14:33:12 +0000</pubDate>
		<dc:creator>Yannick Martel</dc:creator>
				<category><![CDATA[Accompagnement de projets]]></category>
		<category><![CDATA[Management de SI]]></category>
		<category><![CDATA[Méthodologie et conduite du changement]]></category>
		<category><![CDATA[Agilité]]></category>
		<category><![CDATA[contractualisation]]></category>
		<category><![CDATA[Contrat]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[Management du SI]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=20810</guid>
		<description><![CDATA[L&#8217;Agile est aujourd&#8217;hui un outil puissant d&#8217;amélioration de la qualité des produits et de la satisfaction des acteurs, utilisateurs comme artisans du système d&#8217;information. Si la méthode commence à être connue, sa mise en œuvre peut néanmoins se heurter à des difficultés, notamment sur le volet contractuel. Ainsi, dans les organisations où les pratiques d’achats [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/contractualisation_agile/' rel='bookmark' title='Contractualisation Agile'>Contractualisation Agile</a></li>
<li><a href='http://blog.octo.com/priorisation-des-projets-agiles/' rel='bookmark' title='Comment mieux prioriser en projet agile'>Comment mieux prioriser en projet agile</a></li>
<li><a href='http://blog.octo.com/quels-sont-les-types-de-tests-que-l%e2%80%99on-utilise-sur-un-projet-agile/' rel='bookmark' title='Quels sont les types de tests que l’on utilise sur un projet agile ?'>Quels sont les types de tests que l’on utilise sur un projet agile ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Ftravaillons-ensemble-a-votre-contractualisation-agile%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Travaillons%20ensemble%20%C3%A0%20votre%20contractualisation%20Agile%22%20%7D);"></div>
<p>L&#8217;Agile est aujourd&#8217;hui un outil puissant d&#8217;amélioration de la qualité des produits et de la satisfaction des acteurs, utilisateurs comme artisans du système d&#8217;information.</p>
<p>Si la méthode commence à être connue, sa mise en œuvre peut néanmoins se heurter à des difficultés, notamment sur le volet contractuel.</p>
<p>Ainsi, dans les organisations où les pratiques d’achats reposent sur une définition exhaustive des besoins (i.e. cahier des charges) et une obligation de résultat portant sur un périmètre figé et qui ne peut évoluer qu’à l’aide d’avenants, il est souvent difficile voire impossible de concilier ces pratiques avec les principes fondamentaux de l’Agile à savoir : autoriser le changement, affiner et spécifier les fonctionnalités au fil de l’avancement du projet pour répondre mieux aux besoins des utilisateurs.</p>
<p>Alors que faire ? Comment concilier des principes d’achats bien rodés mais a priori antagonistes avec les principes de projet Agile ? Peut-on faire évoluer ces principes ? Chez OCTO, nous avons la conviction qu’il existe des moyens d’y parvenir en respectant les contraintes et les enjeux de votre entreprise.</p>
<p>Nous vous proposons d&#8217;échanger avec vous sur ce thème et pourquoi pas vous accompagner dans un travail en profondeur sur vos pratiques d&#8217;achats et de contractualisation.</p>
<p>Pour commencer nos échanges, nous offrons 2 séances de travail de 2h gratuites au 3 premières entreprises qui nous contacteront.</p>
<p>Contactez-moi pour cela sur ymartel@octo.com et travaillons ensemble à améliorer un peu plus votre ingénierie informatique!</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=20810" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/contractualisation_agile/' rel='bookmark' title='Contractualisation Agile'>Contractualisation Agile</a></li>
<li><a href='http://blog.octo.com/priorisation-des-projets-agiles/' rel='bookmark' title='Comment mieux prioriser en projet agile'>Comment mieux prioriser en projet agile</a></li>
<li><a href='http://blog.octo.com/quels-sont-les-types-de-tests-que-l%e2%80%99on-utilise-sur-un-projet-agile/' rel='bookmark' title='Quels sont les types de tests que l’on utilise sur un projet agile ?'>Quels sont les types de tests que l’on utilise sur un projet agile ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/travaillons-ensemble-a-votre-contractualisation-agile/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5, offline et sécurité</title>
		<link>http://blog.octo.com/html5-offline-et-securite/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=html5-offline-et-securite</link>
		<comments>http://blog.octo.com/html5-offline-et-securite/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 14:40:44 +0000</pubDate>
		<dc:creator>François Petitit</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[Gears]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=13220</guid>
		<description><![CDATA[Un article récent publié sur InfoQ abordait la sécurité de HTML5 dans sa globalité, et notamment sur des attaques concernant les nouvelles fonctionnalités de navigation hors-ligne de HTML5. Quelles sont donc ces fonctionnalités et qu&#8217;en est-il vraiment des risques associés? Rappel historique La seule possibilité pour une application web HTML/JavaScript de stocker des données dans [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/html5-la-promesse-dun-browser-qui-devient-vm/' rel='bookmark' title='HTML5 : la promesse d&#8217;un browser qui devient VM'>HTML5 : la promesse d&#8217;un browser qui devient VM</a></li>
<li><a href='http://blog.octo.com/tous-les-navigateurs-acceptent-html5-et-css3/' rel='bookmark' title='Tous les navigateurs acceptent HTML5 et CSS3'>Tous les navigateurs acceptent HTML5 et CSS3</a></li>
<li><a href='http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/' rel='bookmark' title='Applications natives ou web HTML5 pour mon mobile ?'>Applications natives ou web HTML5 pour mon mobile ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fhtml5-offline-et-securite%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22HTML5%2C%20offline%20et%20s%C3%A9curit%C3%A9%22%20%7D);"></div>
<p>Un <a href="http://www.infoq.com/news/2010/08/html5-secure-enough">article récent publié sur InfoQ</a> abordait la sécurité de <a href="http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/">HTML5</a> dans sa globalité, et notamment sur des attaques concernant les nouvelles <a href="http://dev.w3.org/html5/spec/offline.html#appcache">fonctionnalités de navigation hors-ligne de HTML5</a>.
<p />
Quelles sont donc ces fonctionnalités et qu&#8217;en est-il vraiment des risques associés?
<p />
<span id="more-13220"></span></p>
<h3><strong>Rappel historique</strong></h3>
<p>La seule possibilité pour une application web HTML/JavaScript de stocker des données dans un navigateur était jusqu&#8217;à récemment de les stocker dans un <a href="http://fr.wikipedia.org/wiki/Cookie_%28informatique%29">cookie</a>. Limités en taille (la <a href="http://tools.ietf.org/html/rfc2965">spécification</a> exige seulement des navigateurs qu&#8217;ils puissent gérer 4096 octets par cookie!), parfois refusés par les navigateurs et nettoyés régulièrement, et assimilés à des logiciels espions par les antivirus, leur fiabilité restait très limitée.<br />
D&#8217;autres technologies à base de plugins, comme Adobe Flash, utilisaient des procédés propriétaires ne répondant pas aux normes du W3C (les &laquo;&nbsp;<a href="http://en.wikipedia.org/wiki/HTTP_cookie#Adobe_Flash_Local_Shared_Objects">super cookies</a>&laquo;&nbsp;) et très critiquées pour leur opacité (manque de contrôle pour l&#8217;utilisateur pour savoir quelles informations sont stockées ou les supprimer). En 2007, Google a sorti <strong><a href="http://gears.google.com/">Google Gears</a></strong> qui a permis de stocker des données dans le navigateur sous la forme d&#8217;une base de  données relationnelle et de disposer en local d&#8217;un cache de ressources (cf. les <a href="http://blog.octo.com/et-si-vous-rendiez-vos-applications-web-offline-part-1/">articles publiés par Olivier Mallassi</a> sur le blog OCTO).</p>
<p>Cette nouveauté a permis le développement de véritables <strong>applications web</strong> stockant un nombre conséquent de données en local, permettant un <strong>fonctionnement déconnecté</strong> de l&#8217;application et une <strong>meilleure réactivité</strong> en évitant d&#8217;inutiles aller-retours avec le serveur. L&#8217;exemple le plus marquant étant naturellement le client mail de Google, Gmail, qui innovait en plus avec le &laquo;&nbsp;flaky mode&nbsp;&raquo; où l&#8217;utilisateur naviguait en permance en local, utilisant les ressources stockées dans son navigateur, et où l&#8217;application mettait à jour ces données quand une connexion à Internet était disponible. Cependant, Google Gears restait un produit de Google, et son implémentation sur les navigateurs n&#8217;était pas garantie.</p>
<p>Le groupe de travail sur HTML5, auquel contribue fortement Google, a alors déclaré vouloir<strong> inclure dans la spécification HTML5 des normes de stockage local</strong> s&#8217;inspirant de Google Gears. En parallèle, début 2009, Google a d&#8217;ailleurs arrêté le développement de Google Gears, au profit de l&#8217;implémentation de la norme HTML5.</p>
<p>Cette normalisation contraint déjà les navigateurs web à implémenter ces mécanismes, entraînant à coup sûr une <strong>démocratisation</strong> de leur utilisation par les applications web.
<p />
<h3>Quels sont les risques liés au stockage local?</h3>
<p>Parmi les sites précurseurs dans l&#8217;utilisation de stockage local se trouvent les <strong>webmails</strong>. Les données stockées  dans  le navigateur sont donc les courriers électroniques de l&#8217;utilisateur, qui sont des données très critiques par-rapport au respect de la vie privée, sans parler des cas où certains mails contiendraient des données plus sensibles, comme un numéro de compte bancaire&#8230;<br />
Il convient donc impérativement de <strong>s&#8217;assurer qu&#8217;aucun tiers ne puisse accéder à ces données</strong>.
<p />
<h3><strong>Quels sont les mécanismes de stockage local?</strong></h3>
<p>HTML5 prévoit deux systèmes de <strong>stockage de données</strong> en local : </p>
<ul>
<li>le <strong>Web Storage</strong>, comprenant <em>local storage</em>, toujours accessible à l&#8217;application et permettant par exemple à des onglets différents de partager des données, et le <em>session storage</em>, accessible uniquement à une fenêtre donnée. Les données sont stockées sous la forme de clés/valeurs,</li>
<li>la <strong>Web SQL Database</strong> fournissant cette fois une base de données relationnelle, implémentée par les navigateurs avec SQLite. Signalons au passage que le choix de SQLite a été fait par les éditeurs de navigateurs au détriment de la proposition initiale de &laquo;&nbsp;Indexed DB&nbsp;&raquo; proposée par le W3C. </li>
</ul>
<p>Un autre système de stockage local est fourni sous la forme de <strong><a href="http://dev.w3.org/html5/spec/offline.html#appcache">caches</a></strong> permettant cette fois-ci de <strong>stocker des ressources</strong> (images, fichiers JavaScript, etc.) et non plus des données.</p>
<p>Dans leurs spécifications respectives, le W3C aborde la sécurité, et décrit les mêmes problématiques pour les deux.
<p />
<h3>Quels risques et quelles protections?</h3>
<p />
<strong>La seule protection spécifiée par le W3C concerne l&#8217;origine des sites</strong> : des données stockées par un site A ne doivent pas être visibles pour un site B, en se basant sur  l&#8217;hôte du site et le port. Cela empêche par exemple une iframe inclus dans un site, typiquement un encart publicitaire, d&#8217;avoir accès aux données stockées localement par ce site.</p>
<p>Ce systèmes ne protège pas de certaines attaques, d&#8217;ailleurs décrites dans la spécification :</p>
<p>- les <strong>attaques par  <a href="http://fr.wikipedia.org/wiki/Usurpation_d%27adresse_IP">usurpation de DNS</a></strong>, qui consistent à usurper une adresse IP d&#8217;un serveur pour envoyer des paquets à sa place. Ce risque sera toutefois mitigé en utilisant SSL, et concerne le web dans sa globalité.</p>
<p>- le <strong>partage de nom d&#8217;hôte</strong> entre plusieurs sites : si le site d&#8217;adresse <em>http://www.mon-site.com/site1</em> stocke des données, un autre site d&#8217;adresse <em>http://www.mon-site.com/site2</em> y aura accès sans resctriction. Le risque étant faible de se faire attaquer par ce biais, car on a déjà fait confiance au premier site.</p>
<p>On remarquera que les <strong>attaques par <em>XSS</em> (<a href="http://fr.wikipedia.org/wiki/Cross-site_scripting">cross site scripting</a>)</strong> ne sont pas mentionnées et constituent pourtant un risque important, bien mis en valeur par l&#8217;<a href="http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29">OWASP</a>. On pourra le mitiger avec notamment un <a href="http://www.owasp.org/index.php/Reviewing_Code_for_Cross-site_scripting">contrôle du code</a> côté serveur et une validation des données passées dans les formulaires.</p>
<p>La spécification ne prévoit pas d&#8217;autre mécanisme de sécurité.</p>
<p>Un point très important n&#8217;est pas abordé dans la spécification et pourrait pourtant s&#8217;avérer crucial : <strong>la spécification ne prévoit que les données stockées en base locale soient cryptées, elles sont toujours stockées en clair</strong>.<br />
Ce point a été soulevé par <a href="http://www.nczonline.net/about/">Nicholas C. Zakas</a> (un des référents mondiaux sur le langage JavaScript notamment, qui contribue à HTML5). Il a même proposé une proposition très détaillée d&#8217;évolution de la spécification vers un <strong>cryptage des données</strong>, décrite dans ce <a href="http://www.nczonline.net/blog/2010/04/13/towards-more-secure-client-side-data-storage/">billet.</a><br />
Dans ce système, un serveur d&#8217;application web aurait la responsabilité de chiffrer les données sur le client, avec une clé de cryptage gérée par l&#8217;application. Concrètement, une application web devrait exécuter la méthode Javascript suivante pour ouvrir la connexion en base de données :<br />
<code lang="javascript"><br />
window.openSecureStorage("mystorage", window.AES_128, key, function(storage){<br />
   //use storage object<br />
});<br />
</code><br />
L&#8217;application web choisirait donc l&#8217;algorithme de cryptage et la clef. Ainsi, <strong>même si un attaquant parvenait à récupérer des données, il ne pourrait les exploiter</strong>. On remarquera d&#8217;ailleurs que sans cryptage, toute personne ayant acccès physiquement au poste client pourra lire toutes ces données&#8230;
<p />
Bien que sa proposition soit assez complète et détaillée, il n&#8217;y a pas encore eu de suite à ma connaissance de la part d&#8217;autres acteurs du web.
<p />
<p>On peut tout de même se rassurer concernant les postes publiques (cyber cafés, etc.). En effet, les données sont stockées dans le navigateur dans un profil créé pour l&#8217;utilisateur, qui est normalement effacé lorsqu&#8217;il quitte le poste et que le compte est ré-initialisé, ce qui doit être l&#8217;usage pour ce type de poste. L&#8217;utilisateur devant tout de même s&#8217;en assurer, ce qui est loin d&#8217;être évident pour un utilisateur non initié. Il est ici plus question d&#8217;<strong>éducation des utilisateurs</strong> que de technologie.</p>
<p>Enfin, les caches peuvent quant à eux être attaqués par <strong><a href="http://www.owasp.org/index.php/Cache_Poisoning">&laquo;&nbsp;Cache poisoning&nbsp;&raquo;</a></strong>. L&#8217;objectif de l&#8217;attaquant est alors d&#8217;injecter dans le cache du navigateur un fichier JavaScript en remplacement d&#8217;un fichier fourni par le serveur &laquo;&nbsp;sain&nbsp;&raquo;, et dont le script malicieux serait exécuté par le client. Ce risque est à prendre en compte particulièrement dans les réseaux wifi ouverts comme on en trouve par exemple dans des restaurants, mais si ces attaques sont difficiles à détecter et à contrer, le risque s&#8217;avère relativement faible d&#8217;après les conditions requises pour permettre l&#8217;attaque, <a href="http://www.owasp.org/index.php/Cache_Poisoning">citées par l&#8217;OWASP</a>.</p>
<h2>Conclusion</h2>
<p />
<p>Malgré cette énumération de risques, qui plus est incomplète, il convient d&#8217;insister sur le fait qu&#8217;ils ne sont pas spécifiques à HTML5 mais au contraire inhérents au web depuis ses débuts.<br />
La nouveauté avec HTML5 est qu&#8217;il offre la possibilité de faire des application plus riches, stockant plus de données localement.<br />
Cela doit simplement inciter les concepteurs et développeurs d&#8217;applications web à une certaine vigilance concernant la sécurité des données locales, mais ne vous y méprenez pas, HTML5 constitue bien dès aujourd&#8217;hui une formidable opportunité pour vos applications web!</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=13220" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/html5-la-promesse-dun-browser-qui-devient-vm/' rel='bookmark' title='HTML5 : la promesse d&#8217;un browser qui devient VM'>HTML5 : la promesse d&#8217;un browser qui devient VM</a></li>
<li><a href='http://blog.octo.com/tous-les-navigateurs-acceptent-html5-et-css3/' rel='bookmark' title='Tous les navigateurs acceptent HTML5 et CSS3'>Tous les navigateurs acceptent HTML5 et CSS3</a></li>
<li><a href='http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/' rel='bookmark' title='Applications natives ou web HTML5 pour mon mobile ?'>Applications natives ou web HTML5 pour mon mobile ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/html5-offline-et-securite/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Microsoft Techdays 2010 (3/3)</title>
		<link>http://blog.octo.com/microsoft-techdays-code/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=microsoft-techdays-code</link>
		<comments>http://blog.octo.com/microsoft-techdays-code/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 10:00:17 +0000</pubDate>
		<dc:creator>Olivier Roux</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[développements]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=9708</guid>
		<description><![CDATA[Les Techdays sont l’occasion pour Microsoft de présenter chaque année à ses utilisateurs, du plus geek au plus boss, sa gamme de produits, d’outils sous forme de présentations, d’ateliers ou de retour d’expérience. Difficile de couvrir complètement cet événement tant l’offre de sessions est pléthorique, nous vous proposons donc, à travers une série de posts [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/' rel='bookmark' title='Microsoft Techdays 2010 (1/3)'>Microsoft Techdays 2010 (1/3)</a></li>
<li><a href='http://blog.octo.com/microsoft-techdays-azure-cloud/' rel='bookmark' title='Microsoft Techdays 2010 (2/3)'>Microsoft Techdays 2010 (2/3)</a></li>
<li><a href='http://blog.octo.com/le-cloud-selon-microsoft-retour-de-teched-2010/' rel='bookmark' title='Le Cloud selon Microsoft, retour de TechEd 2010'>Le Cloud selon Microsoft, retour de TechEd 2010</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fmicrosoft-techdays-code%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Microsoft%20Techdays%202010%20%283%2F3%29%22%20%7D);"></div>
<p>Les Techdays sont l’occasion pour Microsoft de présenter chaque année à ses utilisateurs, du plus geek au plus boss, sa gamme de produits, d’outils sous forme de présentations, d’ateliers ou de retour d’expérience. Difficile de couvrir complètement cet événement tant l’offre de sessions est pléthorique, nous vous proposons donc, à travers une série de posts (voir<a href="http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/"> le premier</a> ou <a href="http://blog.octo.com/microsoft-techdays-azure-cloud/">le second</a>), sur les sessions que nous avions choisi et de partager avec vous notre ressenti.</p>
<p>Fin de la série avec des sessions plus orientés geek.</p>
<p><span id="more-9708"></span></p>
<h2>Coding4Fun</h2>
<p>Une belle démonstration de ce que les dernières API du framework proposent.</p>
<ul>
<li>Simulation du multitouch avec plusieurs souris : idéal pour tester une application multitouch sur un écran traditionnel, même si l&#8217;usabilité paraît chaotique et le framework requérant à l&#8217;application d&#8217;être lancée en plein écran.</li>
<li>Utilisation de silverlight out of browser (pour accéder au filesystem de manière limitée, aux contrôleurs type webcam) et WCF pour piloter un robot à distance !</li>
</ul>
<p>Pas vraiment de valeur à tous ces développements mais des idées et surtout la démonstration que le framework est complet et facile d&#8217;utilisation (comment ca c&#8217;est orienté?)</p>
<h2>Session : C# et Linq avancé</h2>
<p>Une session qui repose sur des manipulation de lamba Expression et la génération dynamique de code. Séduisant pour l&#8217;esprit (encore faut-il rester concentré) mais on ne fait pas un compilateur tous les matins. C&#8217;est surtout l&#8217;occasion de réfléchir à nos petites habitudes de développements et d&#8217;y repenser sous un nouvel angle après avoir encore une fois constaté la flexibilité que linq permet.</p>
<p>J’aurais bien aimé voir d’avantage d’astuces liés aux nouveautés de C#4.</p>
<h2>Session : AOP et .net</h2>
<p>Dommage à mon goût que l’on ait passé un peu trop de temps sur l’explication de l’AOP plutôt que d’entrer directement dans le vif du sujet  &#8211; reste qu&#8217;ils ont présenté PostSharp (en autres mais je ne vais pas m&#8217;attarder sur spring.net). Si vous ne le connaissez pas, il s’agit d’un outil permettant d’injecter du code lors de la compilation.</p>
<p>Imaginons que je veuille être sur que toutes les propriétés de mes POCO commencent par vérifier que l&#8217;objet est à jour avant de retourner leur valeur mais je veuille garder la description la plus simple possible de mes objets. Alors il me suffit d’écrire le script PostSharp qui déclare le code à ajouter sur la propriété. A la compilation, l&#8217;IL normalement produite est modifiée et le code supplémentaire injecté.</p>
<p>Gain de temps considérable pour le développeur et surtout garantie qu&#8217;aucun n&#8217;oubliera de le faire. Le debugger reste utilisable sur le code ajouté.</p>
<p>Bémol : le binaire produit peut être beaucoup plus volumineux, code moins factorisé.</p>
<h2>Session : détecter et éviter les fuites mémoire en .Net</h2>
<p>Session technique encore, qui explique comment et pourquoi il est possible d&#8217;avoir des fuites mémoires en .Net. Trois outils sont présentés pour les détecter (dotTrate, .Net Memory Profiler et WinDbg), le tout illustré sur une application faite sur mesure (comprendre : qui fuit plus que les baignoires utilisés à l&#8217;école primaire en cours de mathématiques).</p>
<p>Une session qui, pour moi, a trouvé une application immédiate, puisque mise en œuvre dès la fin des techdays sur une mission. Bien qu&#8217;utilisant trois outils spécifiques, les principes présentés restent génériques et peuvent être appliqués avec d&#8217;autres outils (Ants, par exemple).</p>
<h2>Session : Développement parallèle avancé</h2>
<p>Animé par Bruno Boucard qui a co-animé <a href="http://usi2009.universite-du-si.com/webcast-5-18-La.loi.de.Moore.est.de.retour.mais.a.quel.prix.html" class="broken_link">une session USI</a> l&#8217;année dernière avec Arnaud Mazin. Une session orientée &laquo;&nbsp;Pattern de modélisation&nbsp;&raquo; pour le développement parallèle. Très Intéressant sur le principe mais elle s&#8217;est arrêtée au moment ou cela commençait à être intéressant. C&#8217;est à dire au moment de faire le lien entre le choix de la démarche (orienté données vs orienté tâche) et de l&#8217;algo avec l&#8217;implémentation : les API du marché.</p>
<h2>Session : Le langage Axum</h2>
<p>Une autre session sur le parallélisme (co-animé également par Boucard). Cette fois-ci s&#8217;est beaucoup plus intéressant (pour moi) car beaucoup plus concret. Axum est une sorte de DSL de la plateforme .net &#8211; paradigme de programmation orienté Agent et message.</p>
<p>La grosse difficulté des algorithmes parallèle repose sur la complexité à estimer les effets de bords et de concurrence d&#8217;accès à certaines données. L&#8217;idée est donc de proposer la notion d&#8217;agent dont le contenu de l&#8217;implémentation est invisible et immuable depuis l&#8217;extérieur. Il répond à des messages reçus via un channel sur l&#8217;un des ports qu&#8217;il expose. La notion de message facilite le découpage de l&#8217;algorithme et celle d&#8217;agent limite les risques d&#8217;effets de bords.</p>
<p>On retrouve certains principes des langages fonctionnelles (immuable) mais on reste proche d&#8217;une syntaxe objet. Ce langage n&#8217;a clairement pas la prétention de réaliser à lui seul le développement de l&#8217;application mais plutôt de simplifier le développement de tâches critiques.</p>
<p>On retrouve les promesses de la plateforme .net : choisis le langage qui t&#8217;arrange, le compilateur produira in fine de l&#8217;IL.</p>
<p>Bémol : il s&#8217;agit d&#8217;un projet de recherche qui est (très) loin d&#8217;être utilisable en production.</p>
<h2>Session : Pex et Moles appliqués pour tester Sharepoint</h2>
<p>Il s&#8217;agit à nouveau d&#8217;outils fournis par le labo de Research de MS mais à un stade beaucoup plus abouti (ils font partie de la release de VS 2010).</p>
<p>Moles permet de remplacer n&#8217;importe quelle méthode du framework de base par un délégué et donc de coder la fonction de votre choix (le remplacement est fait à la compilation en modifiant l&#8217;IL générée). Pex permet de générer intelligement des tests unitaires par introspection des branchements de votre code.</p>
<p>A quoi ca sert tout ça ?</p>
<p>Imaginez que vous vouliez tester un code du genre : Si la date du jour est supérieure à 01/01/2011 alors Exception &#8216;offre terminée&#8217; . Et bien avec Mole, vous remplacez le DateTime.Now par une fonction qui prend en paramètre la date de votre choix. Puis Pex, vous génère les tests unitaires correspondants aux cas aux limites : ici 01/01/2011.</p>
<p>Attention, cela ne vous dispense pas d&#8217;écrire des TU puisque sans TU, PEX ne saura pas ce qui doit être testé. Il vous évite juste décrire tous les cas aux limites et vous garantit surtout que vous n&#8217;avez rien oublié.</p>
<p>Imaginons maintenant un cas plus complexe, vous voulez tester un système mastodonte qui plus est distant &#8211; au hasard Sharepoint.  L&#8217;équipe Moles a fourni une sorte de mock qui récrit simplement tous les points d&#8217;accroches de l&#8217;API Sharepoint. Vous pouvez ainsi tester facilement et de manière indépendante sans même l&#8217;avoir sur votre poste, votre développement. Ils sont engagés à fournir la même chose pour tout leur genre d&#8217;outils ex : ActiveDirectory.</p>
<p>Je trouve que cela offre des possibilités intéressantes pour tester des systèmes critiques qui nécessitent une couverture très fine du code, ou des legacy non designés pour les tests.</p>
<p>Mick Philippon, Nicolas Raynaud, Olivier Roux</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=9708" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/' rel='bookmark' title='Microsoft Techdays 2010 (1/3)'>Microsoft Techdays 2010 (1/3)</a></li>
<li><a href='http://blog.octo.com/microsoft-techdays-azure-cloud/' rel='bookmark' title='Microsoft Techdays 2010 (2/3)'>Microsoft Techdays 2010 (2/3)</a></li>
<li><a href='http://blog.octo.com/le-cloud-selon-microsoft-retour-de-teched-2010/' rel='bookmark' title='Le Cloud selon Microsoft, retour de TechEd 2010'>Le Cloud selon Microsoft, retour de TechEd 2010</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/microsoft-techdays-code/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Microsoft Techdays 2010 (2/3)</title>
		<link>http://blog.octo.com/microsoft-techdays-azure-cloud/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=microsoft-techdays-azure-cloud</link>
		<comments>http://blog.octo.com/microsoft-techdays-azure-cloud/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 10:00:52 +0000</pubDate>
		<dc:creator>Olivier Roux</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[développements]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=9699</guid>
		<description><![CDATA[Les Techdays sont l’occasion pour Microsoft de présenter chaque année à ses utilisateurs, du plus geek au plus boss, sa gamme de produits, d’outils sous forme de présentations, d’ateliers ou de retour d’expérience. Difficile de couvrir complètement cet événement tant l’offre de sessions est pléthorique, nous vous proposons donc, à travers une série de posts [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/' rel='bookmark' title='Microsoft Techdays 2010 (1/3)'>Microsoft Techdays 2010 (1/3)</a></li>
<li><a href='http://blog.octo.com/microsoft-techdays-code/' rel='bookmark' title='Microsoft Techdays 2010 (3/3)'>Microsoft Techdays 2010 (3/3)</a></li>
<li><a href='http://blog.octo.com/le-cloud-selon-microsoft-retour-de-teched-2010/' rel='bookmark' title='Le Cloud selon Microsoft, retour de TechEd 2010'>Le Cloud selon Microsoft, retour de TechEd 2010</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fmicrosoft-techdays-azure-cloud%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Microsoft%20Techdays%202010%20%282%2F3%29%22%20%7D);"></div>
<p>Les Techdays sont l’occasion pour Microsoft de présenter chaque année à ses utilisateurs, du plus geek au plus boss, sa gamme de produits, d’outils sous forme de présentations, d’ateliers ou de retour d’expérience. Difficile de couvrir complètement cet événement tant l’offre de sessions est pléthorique, nous vous proposons donc, à travers une série de posts (<a href="http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/">voir le premier</a>), sur les sessions que nous avions choisi et de partager avec vous notre ressenti.</p>
<p>Ce deuxième post est orienté nouveautés serveurs, cloud … et un petit bonus.</p>
<p><span id="more-9699"></span></p>
<h2>Session : SQL Server 2008 R2 pour les développeurs</h2>
<p>Une session très technique qui présente les nouveautés du T-SQL dans 2008 R2 notamment les nouveaux types de données (Hierarchy, Date, Time, DateTime2) et leur utilisation. Une partie de la session servit à présenter l&#8217;utilisation de méthode .Net dans les procédures stockées. Il faut savoir que c&#8217;est possible, mais je ne vois pas grand intérêt à le faire. Des illustrations autours de ces points furent faites en T-SQL, mais également en .Net.</p>
<h2>Sessions : Découvrir Windows Server 2008 R2 en 1h chrono et Les services de fichier et le stockage sous Windows Server 2008 R2</h2>
<p>Première remarque : Windows Server 2008 R2, c&#8217;est long à dire. On ne se compare pas encore à du Capcom (Super Street Fighter 4 Alpha remix extra plus), mais on s&#8217;en rapproche. Vivement Windows Server 2008 R2 SP1 ! Bref, la R2 (pour faire court) reste une évolution mineure, mais qui apporte néanmoins son lot de nouveautés. Sans les citer toutes, voilà celles qui me semblent les plus intéressantes:</p>
<ul>
<li>Hyper-V permet maintenant de faire de la migration de VM à chaud, sans les arrêter. Les VHD (virtual hard drive) sont extensibles à chaud également. Un petit utilitaire, Wim2VHD permet de déployer un WIM sans avoir à démarrer la VM.</li>
<li>L&#8217;apparition de BranchCache, qui automatise la stratégie de cache des fichiers entre sites distants.</li>
<li>La gestion de 256 cœurs et jusqu&#8217;à 300 VM par serveur. Regrouper les machines, c&#8217;est bien, parce qu&#8217;on a le « core parking » qui permet d&#8217;affecter toute la charge sur une partie des cœurs, économisant ainsi l&#8217;énergie, et surtout chauffant moins.</li>
</ul>
<p>Pour le reste, il s&#8217;agit plus d&#8217;évolutions de 2008 que de réelles nouveautés.</p>
<h2>Session : Temps réel dur avec Windows CE</h2>
<p>Windows CE n&#8217;est à priori pas un OS dédié au temps réel. La session présente les manières de créer des applications temps réel en utilisant Windows CE (6.5). Un regret : plus de la moitié de la session servit à expliquer ce qu&#8217;est le temps réel. Du coup, la partie réservée à la mise en œuvre fut tronquée pour cause de temps, me laissant ainsi sur ma faim. Bref, en conclusion : il est possible de faire du temps réel sous Windows CE, même si, honnêtement, un OS dédié reste plus facile à appréhender et à utiliser.</p>
<h2>Windows Azure AppFabric</h2>
<p>Présentation des fonctionnalités de la plateforme et de ses différentes briques:</p>
<ul>
<li>Windows Azure: l&#8217;environnement d&#8217;exécution d&#8217;applications web (Web Role) et services (Worker Role) sur le cloud, d&#8217;APIs de stockage de fichiers sous forme de blob, de donnée en tables dénormalisées ou queues (FIFO).</li>
<li>SQL Azure : environnement de stockage relationnel des données. Certaines fonctionnalités de SQL server sont ici désactivées (<a href="http://msdn.microsoft.com/en-us/library/ee336250.aspx)" class="broken_link">plus de détails</a>) et notamment tous les services de reporting et décisionnel que l&#8217;on peut brancher sur un SQL Server classique.</li>
<li>Windows Azure Platform permet d&#8217;échanger à l&#8217;intérieur du cloud et vers l&#8217;extérieur via
<ul>
<li>ServiceBus
<ul>
<li>Relaie les appels de service vers les providers du service (s&#8217;étant initialement enregistrés auprès du ServiceBus). Gestion du Multicast</li>
<li>Négocie les connexions à travers firewall, NAT, DMZ puisque le provider du service n&#8217;effectue que des connexions sortantes vers le ServiceBus qui le redirige vers un client lors d&#8217;un appel. Permet même de négocier des connexions directes entre client et provider de service lorsque la sécurité le permet.</li>
<li>Est multi plateforme, peut exposer les services en SOAP ou en REST</li>
</ul>
</li>
</ul>
</li>
<li>AccessControl :
<ul>
<li> Sécurise les services, scénarios simple de user/password ou intégration avec ADFS v2</li>
<li>Fédération d&#8217;authentification entre plusieurs fournisseurs d&#8217;identité,</li>
<li>Support de Web Resource Authorization Protocol (WRAP) et Simple Web Token (SWT)</li>
</ul>
</li>
</ul>
<p>Une plateforme qui parait complète et qui privilégie la cohabitation avec des systèmes existants. La volonté apparait de ne pas se couper des standards et de s&#8217;intégrer dans des architectures hybrides.</p>
<h2>Workshop: Développer pour Windows Azure (PaaS)</h2>
<p>Le but de ce workshop était de montrer les différentes étapes pour créer une application hébergée sur le Cloud de Microsoft. Le cas d&#8217;étude portait sur une application ASP.NET classique. Le résultat est sans appel, rendre &laquo;&nbsp;Azure compliant&nbsp;&raquo; un site web est on ne peut plus facile :</p>
<ul>
<li>Déploiement, le simple ajout d&#8217;un projet dans votre solution VS2010 et il suffit alors d&#8217;un click droit pour packager l&#8217;application sous la forme d&#8217;un zip et d&#8217;un fichier de conf pour ensuite le déployer sur votre environnement Azure (AppFabric).</li>
<li>Développement,  les services azures sont accessibles sous forme de surcouche de WCF, rien de nouveau à maîtriser.</li>
<li>Stockage (non relationnel),lLa encore c&#8217;est simple, il suffit de connaitre la connection string donnée par AppFabric et d&#8217;utiliser une API fournie par le framework pour être capable en quelques lignes de gérer ses fichiers sur le cloud.</li>
<li>Testabilité, le framework de développement met à disposition un outil « Development Fabric » permettant de reproduire en local le comportement du serveur AppFabric pour la gestion des applications, du load balancing, et du stockage. On peut donc debugger tranquillement son application en local avant de déployer.</li>
</ul>
<h2>Architectures hybrides Azure/Entreprise</h2>
<p>Cette session dessinait brièvement différentes topologies de systèmes et de besoins et listait pour chacune d&#8217;elles les avantages et inconvénients à migrer sur le cloud Saas, PaaS ou IaaS (volontairement bref) :</p>
<ul>
<li>Sites web marketing: demande sporadique, pics d&#8217;affluence, besoin de sécurité réduite</li>
</ul>
<p>=&gt; migration du site sur le cloud, meilleure gestion des pics d&#8217;affluence, économies en maintenance et gain en disponibilité.</p>
<ul>
<li> Logiciel de CRM, utilisateurs nomades, besoin de disponibilité</li>
</ul>
<p>=&gt; passage à une offre de CRM SaaS (l&#8217;exemple classique de Salesforce), gain en maintenance, disponibilité, accessibilité depuis différents endroits et terminaux.</p>
<ul>
<li>Référentiel métier legacy, besoin d&#8217;accessibilité depuis l&#8217;extérieur: restrictions juridiques (zone de stockage), accès depuis multiples plateformes, besoin de sécurit</li>
</ul>
<p>=&gt; on garde son référentiel localement et on expose des services un outil de Bridge dialoguant avec Azure ServiceBus et permettant d&#8217;exposer son service au public contrôlé par AccessControl.</p>
<p>Session intéressante car elle adresse des problématiques plus réelles et ne présente pas le cloud comme la solution idéale, mais plutot comme un moyen d&#8217;amélioration, d&#8217;optimisation et d&#8217;économie.</p>
<h2>Session : objets vivants, objets intelligents</h2>
<p>Une session sur le design, qui partait à priori d&#8217;une très bonne initiative : explorer les comportement émergents et les interactions entre objets dès lors qu&#8217;ils sont rendus &#8216;intelligents&#8217; par la technologie. Malheureusement, les projets présentés ne sont que des illustrations de concepts qui existent dans la littérature SF depuis un demi-siècle (utérus artificiel, table-écran,&#8230;). Il manquait vraiment un coté concret, sur les possibilités offertes par la technologie d&#8217;aujourd&#8217;hui (par opposition à celle du futur à base de nanomachines et autres) dans la création d&#8217;objets &#8216;awares&#8217;.</p>
<p>A suivre &#8230;</p>
<p>Mick Philippon, Nicolas Raynaud, Olivier Roux</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=9699" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/' rel='bookmark' title='Microsoft Techdays 2010 (1/3)'>Microsoft Techdays 2010 (1/3)</a></li>
<li><a href='http://blog.octo.com/microsoft-techdays-code/' rel='bookmark' title='Microsoft Techdays 2010 (3/3)'>Microsoft Techdays 2010 (3/3)</a></li>
<li><a href='http://blog.octo.com/le-cloud-selon-microsoft-retour-de-teched-2010/' rel='bookmark' title='Le Cloud selon Microsoft, retour de TechEd 2010'>Le Cloud selon Microsoft, retour de TechEd 2010</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/microsoft-techdays-azure-cloud/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Microsoft Techdays 2010 (1/3)</title>
		<link>http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=microsoft-techdays-entity-framework-xaml-wpf</link>
		<comments>http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 10:00:23 +0000</pubDate>
		<dc:creator>Olivier Roux</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[développements]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=9691</guid>
		<description><![CDATA[Les Techdays sont l’occasion pour Microsoft de présenter chaque année à ses utilisateurs, du plus geek au plus boss, sa gamme de produits, d’outils sous forme de présentations, d’ateliers ou de retour d’expérience. Difficile de couvrir complètement cet événement tant l’offre de sessions est pléthorique, nous vous proposons donc, à travers une série de posts, sur [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/microsoft-techdays-code/' rel='bookmark' title='Microsoft Techdays 2010 (3/3)'>Microsoft Techdays 2010 (3/3)</a></li>
<li><a href='http://blog.octo.com/microsoft-techdays-azure-cloud/' rel='bookmark' title='Microsoft Techdays 2010 (2/3)'>Microsoft Techdays 2010 (2/3)</a></li>
<li><a href='http://blog.octo.com/le-cloud-selon-microsoft-retour-de-teched-2010/' rel='bookmark' title='Le Cloud selon Microsoft, retour de TechEd 2010'>Le Cloud selon Microsoft, retour de TechEd 2010</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fmicrosoft-techdays-entity-framework-xaml-wpf%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Microsoft%20Techdays%202010%20%281%2F3%29%22%20%7D);"></div>
<p>Les <a href="http://www.microsoft.com/france/mstechDays/">Techdays </a>sont l’occasion pour Microsoft de présenter chaque année à ses utilisateurs, du plus geek au plus boss, sa gamme de produits, d’outils sous forme de présentations, d’ateliers ou de retour d’expérience. Difficile de couvrir complètement cet événement tant l’offre de sessions est pléthorique, nous vous proposons donc, à travers une série de posts, sur les sessions que nous avions choisi et de partager avec vous notre ressenti.</p>
<p>Ce premier post revient plus particulièrement sur le lancement des nouveaux frameworks.</p>
<p><span id="more-9691"></span></p>
<h2>Les plénières</h2>
<p>Avec la sortie de Windows 7 en fin d&#8217;année dernière et de celles d&#8217;Office, Visual Studio, du CLR 4, EntityFramework 4, d&#8217;ASP.net 4 et de Silverlight 4 en 2010, le programme des plénières se devait d&#8217;être copieux &#8211; sans parler la partie administration et déploiement de l&#8217;OS, les serveurs (SQLServer 2008 R2 &#8230;), Sharepoint et Azure. Le moins que l&#8217;on puisse dire, c&#8217;est que cela a surtout été brouillon notamment pour la première : une course effrénée pour en montrer le plus possible. Si je dois résumer en deux faits marquants, ce sera surtout sur &#8230; Office :)</p>
<h3>Outlook conforte son rôle d&#8217;outil central dans la sphère Office.</h3>
<p>Après les mails, les calendriers, les contacts, les aperçus des docs Office, il intègre dorénavant le &laquo;&nbsp;chat&nbsp;&raquo; + la présence de l&#8217;utilisateur et un micro-twitter (équivalent statut dans gtalk). Exchange dématérialise les messages vocaux pour les faire apparaître comme un mail dans la messagerie &#8211; idéal quand le collaborateur se déplace souvent car il a un seul point d&#8217;entrée pour gérer ses communications.  Et surtout Outlook implémente la notion de conversation &#8230; c&#8217;est vrai qu&#8217;il fallait l&#8217;inventer. Finalement, au collaboratif près, il ressemble un peu aux ambitions de Wave sauf qu&#8217;au moins je sais à quoi il sert.</p>
<h3>Des outils plus collaboratifs</h3>
<p>Puisqu&#8217;on parle de collaboratif, j&#8217;arrive au seul truc qui m&#8217;a donné envie d&#8217;acheter (tout de suite) Office, c&#8217;est la possibilité de travailler simultanément sur le même document !! Fini les merges de présentation. L&#8217;ensemble des produits Office sont disponible en version WebAccess (contre seulement Outlook aujourd&#8217;hui).</p>
<p>L’objectif est clair : concurrencer google apps pour les pro.</p>
<h2>Session : Entity Framework 4</h2>
<p>Si on regarde la session naïvement, on a l&#8217;impression de voir un outil formidable et innovant avec un grand nombre d&#8217;améliorations (lazy loading, approche code-first en plus de base first &#8230;). Sauf que NHibernate fait déjà tout ça. Cela laisse une impression plus que mitigée ; on va dire que le produit commence à être compétitif. Le designer saura peut-être s&#8217;attacher les faveurs des décideurs.</p>
<p>Sinon, on a abordé au cours de la session T4 qui est un outil présent depuis un moment dans VisualStudio mais qui en 2010 à l&#8217;avantage d&#8217;être plus facile d&#8217;accès. Il s&#8217;agit d&#8217;un outil permettant de créer des templates et donc de générer du code facilement (idéal pour certaines portions fastidieuses et sans valeur ajoutée). Reste à ne pas tomber dans l&#8217;excès du tout généré ; d&#8217;autant que comme il a été sorti des couches de présentation, il peut être appelé de manière totalement indépendante.</p>
<h2>Session : ASP.net 4</h2>
<p>Bon, au temps le dire tout de suite, ASP.net 4, seul, n&#8217;est pas une révolution.</p>
<p>Il n&#8217;en reste pas moins qu&#8217;il apporte un certains nombre d&#8217;améliorations sur la gestion des identifiants et du viewstate, les url friendly ou encore l&#8217;embarquement natif de bibliothèques de graphes assez sexy et paramétrables (génération dynamique d&#8217;images donc compatible tout navigateur).</p>
<h3>Un effort fourni pour développer des applications aux standards du Web</h3>
<p>Le développeur peut également choisir à partir de cette version le mode de rendu de son composant graphique. C&#8217;est à dire les balises HTML réellement générées ce qui simplifie la gestion des styles.</p>
<p>Il est à noter que, comme pour de nombreuses autres séances, les démos ont été faites sur Firefox, histoire de montrer la compatibilité des développements MS aux standards du web (et autres produits que IE).</p>
<p>ASP.net 4 couplé par exemple ASP.net MVC 2 (ou spring.net par exemple) fournit une solution assez élégante et rapide pour développer des applications Web.</p>
<h2>Session : Nouveautés de WPF 4</h2>
<p>La session a débuté très doucement en présentant des nouveautés qui relèvent plus de la correction de bug (i.e. Lisibilité des petites polices) et de la mise à niveau de WPF par rapport à Silverlight plus abouti dans certains domaines. En vrac, possibilité de Bitmap caching d&#8217;animations pour améliorer les performances d&#8217;un écran chargé, animations facilitées avec le EasingAnimations (les rendant plus &laquo;&nbsp;naturelles&nbsp;&raquo;) ou encore l&#8217;arrivée du VisualStateManager présent depuis longtemps dans SilverLight.</p>
<h3>Les vraies nouveautés viennent en deuxième partie !</h3>
<p>WPF4 s&#8217;intègre à Windows 7: des contrôles et fonctionalités font leur apparition pour améliorer l&#8217;usabilité en tirant partie des possibilités de l&#8217;OS (personnalisation des menus contextuels de la taskbar), support du multitouch (évènements et processors du framework Surface). Amélioration du binding qui supporte maintenant les DynamicObjects, et l&#8217;intellisense fait enfin son apparition dans le xaml pour les propriétés de binding !</p>
<h2>Session : Sur le futur de XAML</h2>
<p>XAML est le XML décrivant les composants graphiques de Silverlight et WPF. Dorénavant toute la mécanique a été extraite de ces deux produits pour en faire une DLL à part : objectif convergence. Objectif particulièrement important car elle est aussi utilisée avec Workflow Foundation (support pour l&#8217;instant des anciens workflow) et avec le XPS &#8211; le PDF like de Microsoft.</p>
<h3>XAML, représentation XML unique d’un arbre d’objets</h3>
<p>En fait, il faut voir XAML comme une représentation XML de n&#8217;importe quel arbre d&#8217;objets. On peut de manière extrêmement simple sérialisé/désérialisé des objets en XAML et bénéficier de tous les optimisations faites sur la composition des balises. Enfin, l&#8217;apparition intéressante de XAMLDom, parser interrogeable via du Linq, permet de faire du code concis et lisible et pour du XML c&#8217;est pas négligeable !</p>
<h2>Session : Ergonomie des applications multi-touch</h2>
<p>Avec la sortie de Windows 7 et de ses API multi-touch, cette session qui revient sur l&#8217;histoire du multi-touch (avec des réalisations datant des année 80), sur les possibilités offertes par cette forme d&#8217;interaction et surtout sur ses limites. La session allait au delà du multi-touch, avec l&#8217;évocation du projet Natal et des contrôles cérébraux. Très critique sur ces nouvelles formes d&#8217;interaction, qui sont, contrairement à ce qu&#8217;on pourrait penser en voyant l&#8217;engouement qu&#8217;elles suscitent, limitées, la session s&#8217;est attardée sur les limites de chacune.</p>
<p>Quelques illustrations, sur, par exemple, la précision impossible en multi-touch (essayez de faire du photoshop précis au pixel près avec vos gros doigts, pour voir), la fatigue inhérente à l&#8217;utilisation du projet natal (Minority report c&#8217;est bien, mais après huit heures, tu as des bras d&#8217;haltérophile), etc. ont permis de carder les limites de ces nouvelles formes d&#8217;interactions et, finalement, de se demander si le vieux couple clavier souris n&#8217;a pas encore de beaux jours devant lui.</p>
<h2>Session : Sharepoint 2010 et Visual Studio 2010</h2>
<p>Enfin ! C&#8217;est le sentiment principal. Avec les versions 2010, le développement Sharepoint est enfin intégré nativement à Visual Studio. Plus besoin de télécharger des add-ins et autres SDK dédiés, tout est dans la boite.</p>
<p>On trouve donc des modèles de projets dédiés Sharepoint dans Visual Studio 2010, des assistants pour faciliter les tâches courantes &#8230;</p>
<h2>Session : Développement, suivi et tableaux de bord</h2>
<p>Cette session présente EPM (Entreprise Project Manager), qui regroupe Microsoft Projet et le serveur associé. Conclusion principale : Project, c&#8217;est très bien pour faire du financier et des rapports pour les chefs, mais pour le développeur au quotidien, ça ne sert à rien.</p>
<p>L&#8217;intérêt principal de la session était dans l&#8217;exposé des passerelles possibles entre Team Fondation Server (et son utilisation dans le cadre d&#8217;une méthodologie Agile) et EPM. Une telle passerelle permettrait au développeur de travailler avec TFS et aux chefs d&#8217;avoir les données financières associées.</p>
<p>L&#8217;interopérabilité entre EPM et Excel 2010 a également été mise en avant, partant du constat qu&#8217;Excel est aujourd&#8217;hui l&#8217;outil majoritaire pour la gestion de projet.</p>
<p>A suivre &#8230;</p>
<p>Mick Philippon, Nicolas Raynaud, Olivier Roux.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=9691" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/microsoft-techdays-code/' rel='bookmark' title='Microsoft Techdays 2010 (3/3)'>Microsoft Techdays 2010 (3/3)</a></li>
<li><a href='http://blog.octo.com/microsoft-techdays-azure-cloud/' rel='bookmark' title='Microsoft Techdays 2010 (2/3)'>Microsoft Techdays 2010 (2/3)</a></li>
<li><a href='http://blog.octo.com/le-cloud-selon-microsoft-retour-de-teched-2010/' rel='bookmark' title='Le Cloud selon Microsoft, retour de TechEd 2010'>Le Cloud selon Microsoft, retour de TechEd 2010</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/microsoft-techdays-entity-framework-xaml-wpf/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

