<?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; .NET</title>
	<atom:link href="http://blog.octo.com/tag/net/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>Intégrer l&#8217;outil de supervision Sonar à Team Foundation Server 2010</title>
		<link>http://blog.octo.com/integrer-loutil-de-supervision-sonar-a-team-foundation-server-2010/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=integrer-loutil-de-supervision-sonar-a-team-foundation-server-2010</link>
		<comments>http://blog.octo.com/integrer-loutil-de-supervision-sonar-a-team-foundation-server-2010/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 15:58:50 +0000</pubDate>
		<dc:creator>Maxime ARNSTAMM</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[sonar]]></category>
		<category><![CDATA[Usine de développement]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=27574</guid>
		<description><![CDATA[Comme on l&#8217;a montré dans l&#8217;article précédent, Sonar est l’outil indispensable pour évaluer la qualité des projets d’une DSI au fil de l’eau. Dans cet article nous aimerions présenter l&#8217;installation de différents composants de l&#8217;analyse Sonar et comment l&#8217;intégrer à votre usine de build TFS. L&#8217;installation de Sonar Sonar est composé de deux éléments : un [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/sonar-loutil-qui-manquait-a-lusine-de-developpement-net/' rel='bookmark' title='Sonar, l&#8217;outil qui manquait à l&#8217;usine de développement .NET'>Sonar, l&#8217;outil qui manquait à l&#8217;usine de développement .NET</a></li>
<li><a href='http://blog.octo.com/en-direct-des-teched-team-system-test-unitaire-software-factory/' rel='bookmark' title='En direct des TechEd : Team System, Tests Unitaires et Software Factory'>En direct des TechEd : Team System, Tests Unitaires et Software Factory</a></li>
<li><a href='http://blog.octo.com/compte-rendu-du-seminaire-springsource-tc-server-du-28-juillet-a-octo/' rel='bookmark' title='Compte rendu du séminaire SpringSource tc Server du 28 Juillet à OCTO'>Compte rendu du séminaire SpringSource tc Server du 28 Juillet à OCTO</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%252Fintegrer-loutil-de-supervision-sonar-a-team-foundation-server-2010%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FvaUKdZ%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Int%C3%A9grer%20l%27outil%20de%20supervision%20Sonar%20%C3%A0%20Team%20Foundation%20Server%202010%22%20%7D);"></div>
<p>Comme on l&#8217;a montré dans l&#8217;article précédent, <a href="http://blog.octo.com/sonar-loutil-qui-manquait-a-lusine-de-developpement-net/">Sonar est l’outil indispensable pour évaluer la qualité des projets d’une DSI au fil de l’eau</a>.</p>
<p>Dans cet article nous aimerions présenter l&#8217;installation de différents composants de l&#8217;analyse Sonar et comment l&#8217;intégrer à votre usine de build TFS.<br />
<span id="more-27574"></span></p>
<h2>L&#8217;installation de Sonar</h2>
<p>Sonar est composé de deux éléments : un serveur (base de données + interface web) et un moteur d&#8217;analyses, qui va envoyer les résultats en base.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/11/sonar-general.jpg"><img class="alignnone size-full wp-image-27607" title="sonar-general" src="http://blog.octo.com/wp-content/uploads/2011/11/sonar-general.jpg" alt="Schéma infra sonar" width="482" height="325" /></a></p>
<h3>Le serveur de Sonar</h3>
<p>La partie serveur de Sonar est très flexible : elle comprend un serveur web minimaliste et une base de données embarquée par défaut, mais peut être branchée sur un moteur de servlet (Tomcat, Jetty) et sur une base de données classique (MySQL, Oracle, SQL Server).</p>
<p>En termes de ressources consommées, il faut compter 500mo de ram et 350ko / 1000 LOC analysées en base de données. A titre d&#8217;exemple, la base de la <a href="http://nemo.sonarsource.org/" target="_blank">démo de Sonar</a> fait 2Go pour 6 millions de LOC et 2 ans d&#8217;historique. Il n&#8217;y a donc pas de contre-indication à faire cohabiter Sonar et TFS sur une même machine et une même base.</p>
<p>Le <a href="http://docs.codehaus.org/display/SONAR/Install+Sonar#InstallSonar-Installationin4steps" target="_blank">wiki de SonarSource</a>, la société éditrice de Sonar, comporte des instructions détaillées pour mettre en place le serveur.</p>
<h3>Les runners de Sonar</h3>
<p>Sonar nous propose deux outils pour lancer les analyses de qualité sur nos projets : le &laquo;&nbsp;simple java runner&nbsp;&raquo; et le plugin sonar pour Maven.</p>
<p>Ces deux runners nécessitent Java 5+ pour fonctionner, sont aussi simples à configurer et s&#8217;intègrent facilement dans vos usines de développement. Mais alors que le simple java runner se contente d&#8217;effectuer l&#8217;analyse Sonar une fois le code compilé, Maven permet aussi d&#8217;ordonnancer le build et le déploiement. Ces fonctionnalités supplémentaires ont de l&#8217;intérêt lorsque vous utilisez une usine de build multi-langages (Jenkins par exemple).</p>
<p>Que vous choisissiez l&#8217;un ou l&#8217;autre, la configuration pour Sonar et vos projets C# sera la même, dans un fichier .properties pour l&#8217;un et .xml pour l&#8217;autre.</p>
<p>Ce fichier de configuration doit se trouver à la racine de votre solution, au même niveau que votre fichier .sln. C&#8217;est dans ce fichier que vous renseignerez le nom du programme, la version, les répertoires de sources et de tests et enfin la location du serveur Sonar et de sa base de données s&#8217;ils sont sur une machine différente.</p>
<p>Exemple de fichier de configuration basique pour Maven :</p>
<pre class="brush:xml">
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
	http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<!-- identifiants du projet  -->
	<groupId>com.octo</groupId> <artifactId>projetCSharp</artifactId>
	<version>1.0</version>
	<name>Projet C#</name>
<packaging>sln</packaging>
<properties>
		<!-- Nom du .sln -->
		<visual.studio.solution>ProjectCSharp.sln</visual.studio.solution>

		<!-- projets de tests -->
		<visual.test.project.pattern>*.UnitTests</visual.test.project.pattern>

		<sonar.language>cs</sonar.language>
	</properties>

	<build>
<plugins>
<plugin>
				<groupId>org.codehaus.sonar-plugins.dotnet</groupId>
				<artifactId>maven-dotnet-plugin</artifactId>
				<extensions>true</extensions>
			</plugin>
<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>sonar-maven-plugin</artifactId>
				<configuration>
					<language>cs</language>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
</pre>
<p>Exemple du même fichier de configuration pour Simple Java Runner :</p>
<pre class="brush:ps">
# identifiants du projet
sonar.projectKey=com.octo.projetCSharp
sonar.projectName=Projet CSharp
sonar.projectVersion=1.0

# fichier .sln
sonar.dotnet.visualstudio.solution.file=ProjectCSharp.sln

# répertoires de sources
sources=srcDir1,srcDir2

# répertoires de tests
tests=testDir1,testDir2

# langage
sonar.language=cs
</pre>
<p>Là aussi, la <a href="http://docs.codehaus.org/display/SONAR/1.+Install" target="_blank">procédure d&#8217;installation du plugin .NET pour sonar</a> est très bien décrite dans le wiki de sonar.</p>
<h2>L&#8217;intégration à Team Foundation Server 2010</h2>
<p>Team Foundation Server (TFS) est l&#8217;usine de développement logicielle proposée par Microsoft. Elle est utilisée dans la plupart des grandes DSI adeptes du .NET.</p>
<p>Comme on l&#8217;a vu dans l&#8217;article précédent, TFS ne permet pas de faire un reporting de qualimétrie aussi poussé que celui de Sonar. Mais par contre, il est relativement aisé d&#8217;ajouter l&#8217;analyse Sonar au processus de build de TFS à l&#8217;aide d&#8217;un buildTemplate.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/11/tfs.jpg"><img class="alignleft size-full wp-image-27629" title="tfs" src="http://blog.octo.com/wp-content/uploads/2011/11/tfs.jpg" alt="build template tfs" width="206" height="361" /></a></p>
<p>Si on utilise TFS pour builder nos projets, on préférera le Simple Java Runner à Maven. Le runner a besoin des sources compilées, on basera donc notre template sur l&#8217;un de ceux disponibles par défault (DefaultTemplate ou UpgradeTemplate) qui s’occupera de compiler le projet.</p>
<p>Enfin, il suffira d&#8217;ajouter les activités &laquo;&nbsp;Delete/Create/Copy Directory&nbsp;&raquo; pour copier les sources dans un répertoire indépendant et &laquo;&nbsp;Invoke Process&nbsp;&raquo; pour lancer le runner, qui s&#8217;occupera d&#8217;envoyer les résultats au serveur Sonar.</p>
<p>Les premières versions du plugin Sonar pour .NET prenaient énormément de temps pour faire l&#8217;analyse (jusqu&#8217;à 1h pour 80kLOC en version 0.2). Mais depuis un gros effort a été fourni par l&#8217;équipe responsable de ce plugin et maintenant l&#8217;analyse est suffisamment rapide (2-3 minutes) pour être intégrée directement au <a href="http://msdn.microsoft.com/en-us/library/dd787631.aspx" target="_blank">build Gated Check-In</a> (qui se lance à chaque commit) pour des métriques en temps réel.</p>
<p>Si vous choisissez de faire l&#8217;analyse durant un build de nuit, pensez à désactiver le jeu des tests lancés par TFS pour gagner un peu de temps, le simple runner va les jouer lui même.</p>
<h2>Pour finir</h2>
<p>Les indicateurs de qualité de code fournis par Sonar vous permettront de prendre conscience en temps réel de l&#8217;évolution de la dette technique de votre projet.</p>
<p>Attention toutefois, ces indicateurs doivent être compris, notamment les règles de qualité de code, pour pouvoir être paramétrés selon vos besoins. Portez une attention particulière aux règles FXCop et Gendarme : activez les au cas par cas.</p>
<p>Enfin, nous souhaiterions remercier à nouveau <a href="http://docs.codehaus.org/display/SONAR/C-Sharp+Plugins+Ecosystem" target="_blank">l&#8217;équipe de développement du plugin .NET pour Sonar</a>, pour la qualité de leur travail.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=27574" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/sonar-loutil-qui-manquait-a-lusine-de-developpement-net/' rel='bookmark' title='Sonar, l&#8217;outil qui manquait à l&#8217;usine de développement .NET'>Sonar, l&#8217;outil qui manquait à l&#8217;usine de développement .NET</a></li>
<li><a href='http://blog.octo.com/en-direct-des-teched-team-system-test-unitaire-software-factory/' rel='bookmark' title='En direct des TechEd : Team System, Tests Unitaires et Software Factory'>En direct des TechEd : Team System, Tests Unitaires et Software Factory</a></li>
<li><a href='http://blog.octo.com/compte-rendu-du-seminaire-springsource-tc-server-du-28-juillet-a-octo/' rel='bookmark' title='Compte rendu du séminaire SpringSource tc Server du 28 Juillet à OCTO'>Compte rendu du séminaire SpringSource tc Server du 28 Juillet à OCTO</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/integrer-loutil-de-supervision-sonar-a-team-foundation-server-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduction à la reconnaissance faciale</title>
		<link>http://blog.octo.com/introduction-a-la-reconnaissance-faciale/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduction-a-la-reconnaissance-faciale</link>
		<comments>http://blog.octo.com/introduction-a-la-reconnaissance-faciale/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 14:00:41 +0000</pubDate>
		<dc:creator>Jan Fajfr</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[face recognition]]></category>
		<category><![CDATA[reconnaissance faciale]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=27009</guid>
		<description><![CDATA[La reconnaissance faciale est un des problèmes les plus étudiés de l&#8217;apprentissage automatique. Grâce à sa popularité ce problème a été bien exploré pendant les 50 dernières années. Récemment la reconnaissance faciale attire de plus en plus d’attention. La sécurité reste le domaine d’application principal. Dans ce domaine la reconnaissance de visage est responsable de [...]
Suggestion d'articles :<ol>
<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/introduction-a-la-programmation-orientee-acteurs/' rel='bookmark' title='Introduction à la Programmation Orientée Acteurs'>Introduction à la Programmation Orientée Acteurs</a></li>
<li><a href='http://blog.octo.com/introduction-au-calcul-en-grille-pour-levaluation-de-la-value-at-risk/' rel='bookmark' title='Introduction au calcul en grille pour l&#8217;évaluation de la Value At Risk'>Introduction au calcul en grille pour l&#8217;évaluation de la Value At Risk</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-reconnaissance-faciale%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Introduction%20%C3%A0%20la%20reconnaissance%20faciale%22%20%7D);"></div>
<p>La reconnaissance faciale est un des problèmes les plus étudiés de l&#8217;apprentissage automatique. Grâce à sa popularité ce problème a été bien exploré pendant les 50 dernières années.</p>
<p>Récemment la reconnaissance faciale attire de plus en plus d’attention. </p>
<p>La sécurité reste le domaine d’application principal. Dans ce domaine la reconnaissance de visage est responsable de l’identification et de l’authentification. Un bon exemple de cet usage est <a href="http://www.3dface.org/files/slides/080221/7-willich-fraport.pdf">l’aéroport du Francfort</a> qui utilise la reconnaissance pour automatiser le contrôle des passagers.</p>
<p>Un autre exemple peut être <a href="http://www.ccsr.cse.dmu.ac.uk/resources/general/ethicol/Ecv12no1.html">l’analyse des vidéos capturées par les systèmes de caméras externes</a> gérés par les grandes villes.  Les suspects peuvent être identifiés après l&#8217;analyse de la vidéo acquise.</p>
<p>La reconnaissance faciale peut aussi être utilisée juste pour accélérer le processus d’identification.  On peut imaginer un système qui va identifier un client quand il entre dans l’agence de la banque.  Le conseiller peut ensuite le recevoir en ayant préparé son dossier et le saluer par son nom.</p>
<p>Les agences de publicité sont en train de développer des <a href="http://articles.latimes.com/2011/aug/21/business/la-fi-facial-recognition-20110821">panneaux d’affichage intelligents</a>, qui grâce à la reconnaissance du visage de la personne qui passe adaptent le contenu affiché.</p>
<p>Google et Facebook ont implémenté des algorithmes pour identifier les personnes dans leurs bases de données de photos. D&#8217;autres applications, telles que <a href="http://face.com/">Face.com</a> proposent la recherche dans la base de données de Facebook. On peut facilement chercher toutes les photos où figurent ensemble nos deux meilleurs amies.</p>
<p>La nouveauté dans la reconnaissance faciale arrive grâce au développement des nouvelles caméras de type 3D. Ces caméras obtiennent de meilleurs résultats que les caméras classiques, parce qu&#8217;elles acquièrent une image tridimensionnelle de chaque visage. Elles sont ensuite capables de résoudre des problèmes spécifiques à ce domaine (l’illumination et la séparation du visage et du fond). Vous pouvez regarder <a href="http://www.wired.com/gadgetlab/2010/11/how-facial-recognition-works-in-xbox-kinect/">l’exemple de Kinect</a>, qui reconnaît la bonne personne dès qu&#8217;elle passe devant la caméra.</p>
<p>Si vous êtes intéressé, vous pouvez consulter <a href="http://blog.octo.com/en/basics-face-recognition/">la suite de cet article</a> rédigée en anglais.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=27009" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<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/introduction-a-la-programmation-orientee-acteurs/' rel='bookmark' title='Introduction à la Programmation Orientée Acteurs'>Introduction à la Programmation Orientée Acteurs</a></li>
<li><a href='http://blog.octo.com/introduction-au-calcul-en-grille-pour-levaluation-de-la-value-at-risk/' rel='bookmark' title='Introduction au calcul en grille pour l&#8217;évaluation de la Value At Risk'>Introduction au calcul en grille pour l&#8217;évaluation de la Value At Risk</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/introduction-a-la-reconnaissance-faciale/feed/</wfw:commentRss>
		<slash:comments>0</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>Déployer les applications .NET sur cloud</title>
		<link>http://blog.octo.com/deployer-net-sur-cloud/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deployer-net-sur-cloud</link>
		<comments>http://blog.octo.com/deployer-net-sur-cloud/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 13:15:35 +0000</pubDate>
		<dc:creator>Jan Fajfr</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Microsoft Azure]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=24382</guid>
		<description><![CDATA[Un de nos derniers projet de recherche et développement a été le développement d&#8217;une application de banque en ligne, qui nous a permis d&#8217;expérimenter les dernières tendances de développement sur la plateforme .NET. Quand est venu le moment de déployer l&#8217;application, nous n&#8217;avions pas de machine disponible. Mais attendez, de nos jours, lorsque l&#8217;on a [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/panorama-des-differentes-offres-de-cloud-computing-microsoft-azure/' rel='bookmark' title='Panorama des différentes offres de cloud computing : Microsoft Azure'>Panorama des différentes offres de cloud computing : Microsoft Azure</a></li>
<li><a href='http://blog.octo.com/panorama-des-differentes-offres-de-cloud-computing-comparaison-des-tarifs/' rel='bookmark' title='Panorama des différentes offres de cloud computing : comparaison des tarifs'>Panorama des différentes offres de cloud computing : comparaison des tarifs</a></li>
<li><a href='http://blog.octo.com/et-si-nous-definissions-simplement-le-cloud-computing/' rel='bookmark' title='Et si nous définissions simplement le Cloud Computing !'>Et si nous définissions simplement le Cloud Computing !</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%252Fdeployer-net-sur-cloud%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22D%C3%A9ployer%20les%20applications%20.NET%20sur%20cloud%22%20%7D);"></div>
<p>Un de nos derniers projet de recherche et développement a été le développement d&#8217;une application de banque en ligne, qui nous a permis d&#8217;expérimenter les dernières tendances de développement sur la plateforme .NET.</p>
<p>Quand est venu le moment de déployer l&#8217;application, nous n&#8217;avions pas de machine disponible. Mais attendez, de nos jours, lorsque l&#8217;on a besoin de déployer une application, on peux simplement la publier sur le cloud le plus proche !</p>
<p>Evidemment, nous avons choisi la plateforme Azure. La question était juste de savoir si un tel déploiement allait poser problème ? Va t-il falloir adapter notre application ? Combien de temps cela va t-il prendre ?</p>
<p>Finalement le processus de modification a été beaucoup moins lourd que nous l&#8217;avions imaginé : en 30 minute, nous avons été capable de préparer les changements nécessaires et publier l&#8217;application sur le cloud.</p>
<p>Mais Azure est beaucoup plus qu&#8217;une simple plateforme pour les applications web. Il offre aussi plusieurs types de stockage. l&#8217;un d&#8217;entre eux étant Azure Blob Storage. Après le déploiement, nous avons décidé d&#8217;utiliser Azure Blob Storage pour le développement d&#8217;une nouvelle fonctionnalité présente dans notre to-do list.</p>
<p>Cet article est un retour d&#8217;expérience sur la plateforme Azure. Il est divisé en deux parties.</p>
<p>La première partie décrit comment porter une application .NET sur la plateforme Azure.<br />
La deuxième partie va montrer comment utiliser Azure Blob Storage pour développer un simple coffre fort électronique.</p>
<p>La suite de l&#8217;article a été rédigé en anglais, vous pouvez <a href="http://blog.octo.com/taking-net-to-the-cloud/">consulter  la première partie ici</a> et <a href="http://blog.octo.com/en/azure-blob-storage/">la deuxième ici.</a></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=24382" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/panorama-des-differentes-offres-de-cloud-computing-microsoft-azure/' rel='bookmark' title='Panorama des différentes offres de cloud computing : Microsoft Azure'>Panorama des différentes offres de cloud computing : Microsoft Azure</a></li>
<li><a href='http://blog.octo.com/panorama-des-differentes-offres-de-cloud-computing-comparaison-des-tarifs/' rel='bookmark' title='Panorama des différentes offres de cloud computing : comparaison des tarifs'>Panorama des différentes offres de cloud computing : comparaison des tarifs</a></li>
<li><a href='http://blog.octo.com/et-si-nous-definissions-simplement-le-cloud-computing/' rel='bookmark' title='Et si nous définissions simplement le Cloud Computing !'>Et si nous définissions simplement le Cloud Computing !</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/deployer-net-sur-cloud/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sonar, l&#8217;outil qui manquait à l&#8217;usine de développement .NET</title>
		<link>http://blog.octo.com/sonar-loutil-qui-manquait-a-lusine-de-developpement-net/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sonar-loutil-qui-manquait-a-lusine-de-developpement-net</link>
		<comments>http://blog.octo.com/sonar-loutil-qui-manquait-a-lusine-de-developpement-net/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 15:04:30 +0000</pubDate>
		<dc:creator>Maxime ARNSTAMM</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[qualité du code]]></category>
		<category><![CDATA[sonar]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=23528</guid>
		<description><![CDATA[Sonar (www.sonarsource.org) est un outil de reporting sur la qualité des projets informatique. Bien qu&#8217;à l&#8217;origine fait pour le Java, la communauté Open Source a permis l&#8217;intégration de Sonar avec d&#8217;autre langages : cobol, flex, php, c++ et maintenant .NET. L&#8217;objet de cet article est de vous montrer ce que peut apporter Sonar pour un [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/integrer-loutil-de-supervision-sonar-a-team-foundation-server-2010/' rel='bookmark' title='Intégrer l&#8217;outil de supervision Sonar à Team Foundation Server 2010'>Intégrer l&#8217;outil de supervision Sonar à Team Foundation Server 2010</a></li>
<li><a href='http://blog.octo.com/analyse-code-groovy-grails/' rel='bookmark' title='Analyser la qualité de votre code Groovy / Grails'>Analyser la qualité de votre code Groovy / Grails</a></li>
<li><a href='http://blog.octo.com/developpement-parallele-pour-des-machines-multi-coeurs-en-net-4-0/' rel='bookmark' title='Développement parallèle pour des machines multi-coeur en .NET 4.0'>Développement parallèle pour des machines multi-coeur en .NET 4.0</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%252Fsonar-loutil-qui-manquait-a-lusine-de-developpement-net%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Sonar%2C%20l%27outil%20qui%20manquait%20%C3%A0%20l%27usine%20de%20d%C3%A9veloppement%20.NET%22%20%7D);"></div>
<p>Sonar (<a href="http://www.sonarsource.org" target="_blank">www.sonarsource.org</a>) est un outil de reporting sur la qualité des projets informatique. Bien qu&#8217;à l&#8217;origine fait pour le Java, la communauté Open Source a permis l&#8217;intégration de Sonar avec d&#8217;autre langages : cobol, flex, php, c++ et maintenant .NET.</p>
<p>L&#8217;objet de cet article est de vous montrer ce que peut apporter Sonar pour un projet informatique et montrer quelle est sa place dans l&#8217;univers .NET.<span id="more-23528"></span></p>
<h2>Sonar : des indicateurs de qualité du code</h2>
<p>Sonar centralise les rapports d&#8217;outils d&#8217;analyse de code pour afficher des informations comme la <a href="http://blog.octo.com/de-l-insuffisance-de-la-couverture-de-tests/" target="_blank">couverture de test</a>, le respect des normes de développements, la <a href="http://fr.wikipedia.org/wiki/Nombre_cyclomatique" target="_blank">complexité</a>, la <a href="http://fr.wikipedia.org/wiki/Duplication_de_code" target="_blank">duplication</a>&#8230;</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/06/dashboard-projet.png"><img class="alignnone size-full wp-image-23576" title="Exemple de tableau de bord Sonar pour un projet .NET" src="http://blog.octo.com/wp-content/uploads/2011/06/dashboard-projet.png" alt="Exemple de tableau de bord Sonar pour un projet .NET" width="100%" /></a></p>
<p>Il est important de prendre ces indicateurs pour ce qu&#8217;ils sont : des indices permettant de déceler de la dette technique. Il serait dangereux d&#8217;utiliser ces métriques dans l&#8217;absolu pour contractualiser la qualité attendue d&#8217;un projet.</p>
<p>Nous allons voir d&#8217;un peu plus près les métriques les plus significatives.</p>
<h3>Tests unitaires et couverture</h3>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/06/coverage.png"><img class="alignleft size-full wp-image-23580" title="Tests et couverture" src="http://blog.octo.com/wp-content/uploads/2011/06/coverage.png" alt="Tests et couverture Sonar .NET" width="293" height="106" /></a></p>
<p>La seule façon de prouver qu&#8217;un code fonctionne, c&#8217;est de le tester.</p>
<p>Sonar permet de connaitre le nombre de tests unitaires joués, le taux de succès et la couverture de ces tests.</p>
<p>La couverture de tests correspond au pourcentage de lignes de code du projet qui est appelé pendant la phase de test. Attention : ce n&#8217;est pas parce qu&#8217;une ligne est appelée qu&#8217;elle est testée.</p>
<p>Une couverture élevée n&#8217;est donc pas une fin en soi. Par contre, une couverture basse est l&#8217;indice d&#8217;une carence dans les tests, ce qui est un risque pour le projet.</p>
<p>Une couverture élevée alors qu&#8217;il y a peu de tests implique que les tests ne sont pas unitaires, ce qui veut dire que le code couvert n&#8217;est probablement pas totalement testé.</p>
<p>Enfin, un taux de succès des tests qui n&#8217;est pas à 100% sous entend que les développeurs ne font pas attention lors du checkin/commit.</p>
<h3>Complexité et cohérence</h3>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/06/complexity.png"><img class="alignleft size-full wp-image-23583" title="Complexité et cohérence" src="http://blog.octo.com/wp-content/uploads/2011/06/complexity.png" alt="Complexité et cohérence Sonar .NET" width="305" height="112" /></a></p>
<p>La complexité d&#8217;une méthode et la cohérence d&#8217;une classe sont des métriques qui permettent de mettre en évidence des problèmes de maintenabilité et de testabilité.</p>
<p>La complexité d&#8217;une méthode correspond plus ou moins au nombre de tests qu&#8217;il faudra faire pour couvrir tous les cas. Donc plus la méthode est complexe, plus elle sera difficile à maintenir et à tester.</p>
<p>La cohérence d&#8217;une classe (ici LCOM4) est un indicateur intéressant qui permet de trouver les classes qui pourraient facilement être découpées. La valeur LCOM4 correspond au nombre de classes qui pourraient résulter de ce découpage.</p>
<h3>Règles de qualité du code</h3>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/06/rules.png"><img class="alignleft size-full wp-image-23584" title="Règles de qualité de code" src="http://blog.octo.com/wp-content/uploads/2011/06/rules.png" alt="Règles de qualité de code Sonar .NET" width="263" height="109" /></a></p>
<p>Il existe des outils d&#8217;analyse statique du code (exemples : Findbugs, Pmd en Java, FxCop, Gendarme en .NET) qui permettent de soulever des bugs potentiels ou des problèmes de maintenabilité.</p>
<p>Dans nos projets nous suivons la procédure suivante :</p>
<ul>
<li>Blocker : c&#8217;est un bug, on arrête tout et on corrige.</li>
<li>Critical : il y a de fortes chances que ce soit un bug : on essaye de corriger rapidement.</li>
<li>Major : ça ne sent pas bon, il vaudrait mieux regarder. On essaye de corriger avant la livraison.</li>
<li>Minor et info : pensez à regarder si vous êtes curieux. En général, personne n&#8217;agit dessus, alors autant les désactiver.</li>
</ul>
<h2>La qualimétrie dans l&#8217;univers .NET</h2>
<p>Dans l&#8217;univers .NET il existe des équivalents des outils permettant d&#8217;obtenir les métriques évoquées avant, mais il n&#8217;existe pas de solution de reporting  de celles-ci intégrée à l&#8217;usine de développement Team Foundation Server.</p>
<h3>Team Foundation Server (TFS)</h3>
<p>Le reporting TFS repose sur un cube OLAP contenant les données de build, de test et les work items. Il est donc possible de faire des extractions SQL à destination d&#8217;Excel, SharePoint ou Crystal Reports.</p>
<p>Néanmoins, ces rapports ne contiennent que des indicateurs de couverture de test, complexité cyclomatique ou de productivité (nombre de ligne produite, de bug résolu …). Les résultats des analyses de règles de qualité de code (FxCop, StyleCop, Gendarme, NDepend) ou de duplication de code (SourceMonitor) ne sont pas injectés dans le cube.</p>
<p>Ainsi, TFS ne permet pas de créer des rapports d&#8217;indicateurs qualimétriques provenant d&#8217;outils externes sans développement spécifique, d&#8217;où l&#8217;intérêt de Sonar.</p>
<h3>Sonar pour les projet .NET</h3>
<p>Le plugin .NET pour Sonar est né dans une DSI où il y avait autant de projets Java que de projets .NET. Il y avait une volonté de centraliser les informations pour avoir une vue globale des niveaux de qualité  des projets de la DSI.</p>
<p>Sonar propose un dashboard global qui répond à ce besoin :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/06/dashboard-global.png"><img class="alignnone size-full wp-image-23588" title="Tableau de bord multi projets" src="http://blog.octo.com/wp-content/uploads/2011/06/dashboard-global.png" alt="Tableau de bord multi projets - Sonar .NET" width="100%" /></a></p>
<p>Sonar est conçu pour s&#8217;intégrer dans une usine de développement logicielle (Hudson/Jenkins ou bien justement TFS). Cette intégration permet une mise à jour des métriques à chaque build !</p>
<p>Chaque mise à jour est sauvegardée et Sonar propose des graphiques montrant l&#8217;évolution des métriques dans le temps :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/06/Sonar-graphe-rules-compliance.png"><img class="alignnone size-full wp-image-23589" title="Evolution des métriques dans le temps" src="http://blog.octo.com/wp-content/uploads/2011/06/Sonar-graphe-rules-compliance.png" alt="Evolution des métriques dans le temps - Sonar .NET" width="100%" /></a></p>
<h3>Pour finir</h3>
<p>Sonar est l&#8217;outil indispensable pour évaluer la qualité des projets d&#8217;une DSI au fil de l&#8217;eau.</p>
<p>Dans notre prochain article, nous vous montrerons comment mettre en place Sonar pour un projet .NET et comment l&#8217;intégrer à un build TFS 2010.</p>
<p>Nous remercions l&#8217;équipe de développement du module .NET pour le travail impressionnant qu&#8217;ils ont accompli.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=23528" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/integrer-loutil-de-supervision-sonar-a-team-foundation-server-2010/' rel='bookmark' title='Intégrer l&#8217;outil de supervision Sonar à Team Foundation Server 2010'>Intégrer l&#8217;outil de supervision Sonar à Team Foundation Server 2010</a></li>
<li><a href='http://blog.octo.com/analyse-code-groovy-grails/' rel='bookmark' title='Analyser la qualité de votre code Groovy / Grails'>Analyser la qualité de votre code Groovy / Grails</a></li>
<li><a href='http://blog.octo.com/developpement-parallele-pour-des-machines-multi-coeurs-en-net-4-0/' rel='bookmark' title='Développement parallèle pour des machines multi-coeur en .NET 4.0'>Développement parallèle pour des machines multi-coeur en .NET 4.0</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/sonar-loutil-qui-manquait-a-lusine-de-developpement-net/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Du TDD pour Silverlight aussi !</title>
		<link>http://blog.octo.com/du-tdd-pour-silverlight-aussi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=du-tdd-pour-silverlight-aussi</link>
		<comments>http://blog.octo.com/du-tdd-pour-silverlight-aussi/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 20:40:09 +0000</pubDate>
		<dc:creator>Nicolas Raynaud</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[silverlight]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=23432</guid>
		<description><![CDATA[A moins de s&#8217;être limité à dessiner des ronds et des carrés avec Silverlight, vous avez sans doute déjà tenté d&#8217;utiliser un des templates de projets du Silverlight Toolkit permettant de faire des tests unitaires pour vos applications RIA! Plein de bonne volonté, vous vous êtes heurtés aux multiples inconvénients de cette solution : Framework [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/flex-vs-silverlight/' rel='bookmark' title='Flex vs Silverlight'>Flex vs Silverlight</a></li>
<li><a href='http://blog.octo.com/formation-silverlight-tour-a-paris-les-1920-et-21-janvier/' rel='bookmark' title='Formation Silverlight Tour à Paris les 19,20 et 21 janvier'>Formation Silverlight Tour à Paris les 19,20 et 21 janvier</a></li>
<li><a href='http://blog.octo.com/formation-silverlight-tour-a-paris-%e2%80%93-28-29-30-avril/' rel='bookmark' title='Formation Silverlight Tour à Paris – 28, 29, 30 Avril'>Formation Silverlight Tour à Paris – 28, 29, 30 Avril</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%252Fdu-tdd-pour-silverlight-aussi%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Du%20TDD%20pour%20Silverlight%20aussi%20%21%22%20%7D);"></div>
<p>A moins de s&#8217;être limité à dessiner des ronds et des carrés avec Silverlight, vous avez sans doute déjà tenté d&#8217;utiliser un des templates de projets du <a href="http://silverlight.codeplex.com/">Silverlight Toolkit</a> permettant de faire des tests unitaires pour vos applications RIA! Plein de bonne volonté, vous vous êtes heurtés aux multiples inconvénients de cette solution :</p>
<ul>
<li>Framework de tests spécifique à Silverlight</li>
<li>Obligation de lancer une application &laquo;&nbsp;conteneur&nbsp;&raquo; pour lancer vos tests</li>
<li>Usabilité plus que discutable de cette même application</li>
<li>Impossibilité d&#8217;utiliser une métrique comme la couverture de code</li>
<li>et j&#8217;en passe&#8230;</li>
</ul>
<p>N&#8217;abandonnez pas encore ! Je vous proposer ici une solution pour venir à bout de ces limitations&#8230; plus d&#8217; excuses, vous pourrez tout tester &#8230;</p>
<p style="text-align: center;"><a href="http://blog.octo.com/en/design-your-silverlight-application-for-tdd/">la suite par ici en anglais</a>&#8230;</p>
<p>&nbsp;</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=23432" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/flex-vs-silverlight/' rel='bookmark' title='Flex vs Silverlight'>Flex vs Silverlight</a></li>
<li><a href='http://blog.octo.com/formation-silverlight-tour-a-paris-les-1920-et-21-janvier/' rel='bookmark' title='Formation Silverlight Tour à Paris les 19,20 et 21 janvier'>Formation Silverlight Tour à Paris les 19,20 et 21 janvier</a></li>
<li><a href='http://blog.octo.com/formation-silverlight-tour-a-paris-%e2%80%93-28-29-30-avril/' rel='bookmark' title='Formation Silverlight Tour à Paris – 28, 29, 30 Avril'>Formation Silverlight Tour à Paris – 28, 29, 30 Avril</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/du-tdd-pour-silverlight-aussi/feed/</wfw:commentRss>
		<slash:comments>0</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>&#171;&#160;Behavior Driven Development&#160;&#187; grâce au pattern MVVM et GreenPepper</title>
		<link>http://blog.octo.com/behavior-driven-development-grace-au-pattern-mvvm-et-greenpepper/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=behavior-driven-development-grace-au-pattern-mvvm-et-greenpepper</link>
		<comments>http://blog.octo.com/behavior-driven-development-grace-au-pattern-mvvm-et-greenpepper/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 15:50:29 +0000</pubDate>
		<dc:creator>Mathieu DESPRIEE</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agilité]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[greenpepper]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=19034</guid>
		<description><![CDATA[L&#8217;approche &#171;&#160;Behavior Driven Development&#160;&#187;, ou l&#8217;art d&#8217;écrire des tests qui décrivent le comportement attendu du système et que tout le monde comprend. Dans cet article (en anglais), je présente l&#8217;architecture mise en place pour suivre cette démarche, dans un projet de développement d&#8217;un client lourd sous .NET/WPF, et comment l&#8217;utilisation du design-pattern MVVM nous a [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/le-test-driven-development-au-secours-de-javascript/' rel='bookmark' title='Le Test Driven Development au secours de Javascript !'>Le Test Driven Development au secours de Javascript !</a></li>
<li><a href='http://blog.octo.com/architecture-dintegration-basee-sur-un-pattern-mediateur/' rel='bookmark' title='Architecture d’intégration basée sur un pattern Médiateur'>Architecture d’intégration basée sur un pattern Médiateur</a></li>
<li><a href='http://blog.octo.com/tdi-ou-test-driven-infrastructure/' rel='bookmark' title='TDI ou Test Driven Infrastructure'>TDI ou Test Driven Infrastructure</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%252Fbehavior-driven-development-grace-au-pattern-mvvm-et-greenpepper%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22%5C%22Behavior%20Driven%20Development%5C%22%20gr%C3%A2ce%20au%20pattern%20MVVM%20et%20GreenPepper%22%20%7D);"></div>
<p>L&#8217;approche &laquo;&nbsp;Behavior Driven Development&nbsp;&raquo;, ou l&#8217;art d&#8217;écrire des tests qui décrivent le comportement attendu du système et que tout le monde comprend.</p>
<p>Dans cet article (en anglais), je présente l&#8217;architecture mise en place pour suivre cette démarche, dans un projet de développement d&#8217;un client lourd sous .NET/WPF, et comment l&#8217;utilisation du design-pattern MVVM nous a aidé à atteindre notre objectif.</p>
<p>La suite <a href="http://blog.octo.com/en/behavior-driven-development-using-mvvm-pattern-and-greenpepper-tests/">ici</a>.</p>
<p><span id="more-19034"></span></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=19034" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/le-test-driven-development-au-secours-de-javascript/' rel='bookmark' title='Le Test Driven Development au secours de Javascript !'>Le Test Driven Development au secours de Javascript !</a></li>
<li><a href='http://blog.octo.com/architecture-dintegration-basee-sur-un-pattern-mediateur/' rel='bookmark' title='Architecture d’intégration basée sur un pattern Médiateur'>Architecture d’intégration basée sur un pattern Médiateur</a></li>
<li><a href='http://blog.octo.com/tdi-ou-test-driven-infrastructure/' rel='bookmark' title='TDI ou Test Driven Infrastructure'>TDI ou Test Driven Infrastructure</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/behavior-driven-development-grace-au-pattern-mvvm-et-greenpepper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La stratégie Windows Phone 7</title>
		<link>http://blog.octo.com/la-strategie-windows-phone-7/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=la-strategie-windows-phone-7</link>
		<comments>http://blog.octo.com/la-strategie-windows-phone-7/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 08:42:56 +0000</pubDate>
		<dc:creator>Vincent GUIGUI</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[silverlight]]></category>
		<category><![CDATA[windows phone 7]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=14775</guid>
		<description><![CDATA[Depuis la convergence entre les téléphones mobiles et les assistants personnels, le secteur de la mobilité n&#8217;a cessé d&#8217;être en effervescence. Chaque constructeur se complait à proposer régulièrement une nouvelle plateforme dite &#171;&#160;révolutionnaire&#160;&#187; à grand renfort de communication marketing et presque toujours soutenu par des forfaits dédiés des opérateurs. L&#8217;année 2010 a vu un certain [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/n%e2%80%99oublions-pas-windows-mobile/' rel='bookmark' title='N’oublions pas Windows Mobile'>N’oublions pas Windows Mobile</a></li>
<li><a href='http://blog.octo.com/et-si-microsoft-abandonnait-la-marque-windows/' rel='bookmark' title='Et si Microsoft abandonnait la marque Windows ?'>Et si Microsoft abandonnait la marque Windows ?</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>
</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%252Fla-strategie-windows-phone-7%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22La%20strat%C3%A9gie%20Windows%20Phone%207%22%20%7D);"></div>
<div>
<p>Depuis la convergence entre les téléphones mobiles et les assistants personnels, le secteur de la mobilité n&#8217;a cessé d&#8217;être en effervescence. Chaque constructeur se complait à proposer régulièrement une nouvelle plateforme dite &laquo;&nbsp;révolutionnaire&nbsp;&raquo; à grand renfort de communication marketing et presque toujours soutenu par des forfaits dédiés des opérateurs.</p>
<p>L&#8217;année 2010 a vu un certain nombre d&#8217;annonces importantes venant de Microsoft (<a href="http://www.windowsphone7.com/" target="_blank">Windows Phone 7</a>), Apple (iPad, iPhone 4 et OS 4) et Google (<a href="http://www.silicon.fr/fr/news/2010/08/12/android__le_troisieme_os_mobile_le_plus_populaire_au_monde" target="_blank" class="broken_link">croissance très forte des ventes de téléphones Android</a>). Ces derniers mois, il a donc été de plus en plus difficile de se faire une idée claire du marché (distinction entre l&#8217;offre et la demande réelle des consommateurs individuels ou professionnels, manque de clarté sur les roadmaps constructeurs) afin de pouvoir proposer à nos clients des solutions pérennes (dépassant l&#8217;engouement initial des nouvelles plateformes).</p>
<p>Faisant suite à notre article précédent sur l&#8217;<a href="http://blog.octo.com/n’oublions-pas-windows-mobile" target="_blank">état des lieux de la plateforme Windows Mobile</a>, voici un zoom sur la stratégie Windows Phone 7 et son impact pour les fournisseurs de services mobiles.</p>
<p><span id="more-14775"></span></p>
<p><img title="Lire la suite…" src="http://blog.octo.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<h1>Il y a comme un OS dans la stratégie</h1>
<p>La société Microsoft essaye de revenir en force sur le marché de la mobilité en proposant une plateforme (au sens logiciel et matériel) totalement nouvelle et diamétralement opposée à ce qu&#8217;elle avait l&#8217;habitude de proposer. Tabula rasa comme disent les jeunes.</p>
<p>L&#8217;austère et vieillissant Windows Mobile était une plateforme souple permettant un grand nombre de libertés pour les fabriquants, les revendeurs/opérateurs et les éditeurs logiciels. Les utilisateurs s&#8217;en tiraient avec des applications au spectre fonctionnel très large mais souffrant de lenteurs et d&#8217;une ergonomie très/trop PC.</p>
<p>Avec Windows Phone 7. Microsoft souhaite se refaire une identité et fournir une plateforme mobile attractive pour les fournisseurs de services mobiles (constructeurs, opérateurs, éditeurs) et les consommateurs. Pour cela, Microsoft reprend une partie de la recette des concurrents:</p>
<p>En B2C:</p>
<ul>
<li>Mettre des services estampillés Microsoft au centre des activités du consommateur (Marketplace, MyPhone, Zune, XboxLive, Bing)</li>
<li>Permettre l&#8217;accès transparent et sécurisé aux informations du téléphone (contacts, agenda, photos&#8230;) via le Cloud (<a href="http://myphone.microsoft.com/" target="_blank">MyPhone</a> est un équivalent de MobileMe d&#8217;Apple)</li>
<li>Fournir une plateforme centrée autour du consommateur en tant que personne (interaction avec les réseaux sociaux et les plateformes de partage de contenu)</li>
<li>Améliorer la communication avec l&#8217;entreprise pour les consommateurs professionnels (Exchange, Sharepoint, sécurisation des données&#8230;)</li>
<li>Proposer une expérience utilisateur unique et reconnaissable quelque soit le marque du téléphone  (limitation de la personnalisation opérateur/constructeur, <a href="http://www.macgeneration.com/unes/voir/127641/windows-phone-7-un-metro-nomme-desir" target="_blank">nouvelle interface unifiée Metro</a> et la notion de hub)</li>
</ul>
<p>En B2B:</p>
<ul>
<li>Homogénéiser les spécifications matérielles afin de faciliter le développement et de garantir une diffusion maximum des applications en réduisant les risques d&#8217;incompatibilité et la fragmentation du parc</li>
<li>Fournir une plateforme de diffusion des applications tierces (Marketplace) s&#8217;adaptant aux différents besoins business (<a href="http://feedproxy.google.com/~r/istartedsomething/~3/ow6UuOhMqeU/" target="_blank">trial</a>, in-app purchase&#8230;)</li>
</ul>
<h1>Qu&#8217;est ce qu&#8217;un Windows Phone 7 ?</h1>
<h3><strong>Le fond:</strong></h3>
<ul>
<li>Un processeur ARMv7 : Cortex, Scorpion, ou mieux</li>
<li>256Mo de RAM et 8 Go de ROM ou plus</li>
<li>Un GPU qui supporte au moins DirectX9</li>
<li>Des spécifications multimédia communes incluant une accélération matérielle des codecs</li>
</ul>
<h3><strong>La forme:</strong></h3>
<ul>
<li>Un appareil photo 5MP avec flash et un bouton hardware pour prendre la photo</li>
<li>Des capteurs : A-GPS, Boussole, Luminosité et proximité</li>
<li>3 boutons hardware : Précédent, Windows (Accueil) et Recherche (Bing)</li>
<li>2 résolutions : WVGA (800&#215;480) et HVGA (480&#215;320)</li>
<li>Un écran capacitif supportant au moins 4 points de contacts</li>
</ul>
</div>
<p>&laquo;&nbsp;Rien de très original&nbsp;&raquo; me direz vous. Venant d&#8217;Apple ou Google ce serait vrai, mais pour Microsoft c&#8217;est un énorme pas en avant. Espérons tout de même que ces choix permettent à Microsoft de prendre assez d&#8217;avance pour rester concurrentiel sur un marché où les concurrents sortent de nouveaux téléphones (avec un nouveau hardware) tous les 6 mois.</p>
<h3>La couleur:</h3>
<p>Quelques lignes plus haut, je faisais allusion à l&#8217;interface Metro. Microsoft a appris de ses erreurs et change radicalement le paradigme d’interaction avec l&#8217;utilisateur. Fini les scrollbars trop petites et les contrôles inspirés du PC. Le design Metro est épuré et centré sur le contenu plutôt que les effets graphiques (&laquo;&nbsp;Content, not Chrome&nbsp;&raquo;).  Voir une démonstration video de l&#8217;<a href="http://www.youtube.com/watch?v=qSLfaJ6KS4E" target="_blank">interface Windows Phone 7</a>.</p>
<p>Voici les <a href="http://msdn.microsoft.com/en-us/library/ff637515(VS.92).aspx">documents officiels de Microsoft</a> expliquant les concepts d&#8217;intéraction et de design des Windows Phone (à noter la mise à disposition de modèles Photoshop permettant de créer ses propres contrôles respectant le look-n-feel de la plateforme).</p>
<div>
<h1>Késacode Windows Phone ?</h1>
<p>Tout cela ne pouvait être possible sans rompre avec l&#8217;architecture actuelle des Windows Mobile (&lt;6.5), Microsoft a donc pris la décision de revoir entièrement sa copie. Ainsi &laquo;&nbsp;exit&nbsp;&raquo; les applications dites natives C++, adieu nos habituelles Windows Forms. Pour développer sur Windows Phone 7, il faudra faire du Silverlight ou du XNA (orienté jeux et 3D).</p>
<blockquote><p>Cela veut donc dire que Microsoft accepte de faire le deuil de la fameuse rétro-compatibilité qui lui été si chère: aucune application Windows Mobile ne sera fonctionnera sur Windows Phone. C&#8217;est un choix ambitieux mais qui pourrait choquer certains développeurs.</p></blockquote>
<p>Voici un schéma des différentes composants logiciels et API disponibles sur Windows Phone.</p>
<div id="attachment_14778" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.octo.com/wp-content/uploads/2010/09/WP7-XNA-SL4-NETCF.jpg"><img class="size-medium wp-image-14778" title="Silverlight, XNA et .Net CF" src="http://blog.octo.com/wp-content/uploads/2010/09/WP7-XNA-SL4-NETCF-300x180.jpg" alt="Silverlight, XNA et .Net CF" width="300" height="180" /></a><p class="wp-caption-text">Silverlight, XNA et .Net CF</p></div>
<p>Une version plus technique du schéma d&#8217;architecture Windows Phone 7 est disponible <a href="http://blogs.msdn.com/b/abhinaba/archive/2010/03/18/what-is-netcf.aspx" target="_blank">ici</a>.</p>
<p>Les compétences C# .Net seront partiellement réutilisables pour les couches métiers mais l&#8217;apprentissage restera important au niveau IHM, accès aux données (<a href="http://msdn.microsoft.com/en-us/library/ff402541(VS.92).aspx" target="_blank">Isolated Storage</a>) et couches de communication pour les nombreux éditeurs qui n&#8217;ont pas encore fait le pas du .Net 3.5 et WPF.</p>
<p>Les développeurs profiteront d&#8217;un environnement de développement complet et facile à utiliser (Visual Studio, éditeur Wysiwyg, émulateur, &#8230;). Le support de Microsoft  est lui aussi largement suffisant pour prendre en main rapidement les API de la plateforme (documentation assez importante et exhaustive).</p>
<h2>Ok, je viens de coder ma boîte à meuh, que me reste-t&#8217;il à faire ?</h2>
<p>Le cycle de vie (from development to cash) d&#8217;une application Windows Phone est le suivant:</p>
<div id="attachment_14781" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.octo.com/wp-content/uploads/2010/09/Cycle-de-vie-WP7.jpg"><img class="size-medium wp-image-14781" title="Cycle de vie des applications Windows Phone" src="http://blog.octo.com/wp-content/uploads/2010/09/Cycle-de-vie-WP7-300x204.jpg" alt="Cycle de vie des applications Windows Phone" width="300" height="204" /></a><p class="wp-caption-text">Cycle de vie des applications Windows Phone</p></div>
<p>Une fois que votre application a été développée et testée par vos soins via l&#8217;émulateur très complet, il faut maintenant la publier sur le <a href="https://developer.windowsphone.com/" target="_blank">Marketplace</a>.</p>
<blockquote><p>Vous pensez être prêt pour la commercialisation, et si vous faisiez une version d&#8217;essai de votre application pour convertir plus facilement vos prospects !<br />
L&#8217;API Windows Phone permet de faire du Try &amp; Buy sans avoir à maintenir 2 applications distinctes. La même application (au niveau binaire) puisse servir à la fois de version d&#8217;essai et de version complète (via la vérification d&#8217;un booléen <a href="http://msdn.microsoft.com/en-us/library/ff462086(VS.92).aspx" target="_blank">LicenseInformation.IsTrial</a>), le MarketPlace s&#8217;occupera de vérifier la validité de licence et d&#8217;autoriser la version complète suite à l&#8217;achat.</p></blockquote>
<p>La publication d&#8217;applications nécessite un compte payant ($100/an) qui vous permettra de publier autant d&#8217;applications payantes que vous le souhaitez et 5 applications gratuites. Au-delà de 5 , il faudra dépenser $20 pour chaque nouvelle application gratuite. Cela peut paraître bizarre de devoir payer pour publier une application gratuite, mais l&#8217;enjeu est simple: dissuader les éditeurs de publier des applications &laquo;&nbsp;spam&nbsp;&raquo; qui pollueraient les catalogues d&#8217;applications (détecteur de mensonges, boîte à prout, lampe torche&#8230;)</p>
<p>Vous pourrez ensuite choisir le prix de vente de l&#8217;application (par pays) et alimenter le catalogue Marketplace avec une description, des mot-clefs et des captures d&#8217;écran de votre application. Une fois en vente, Microsoft ponctionnera 30% des montants générés par la vente de l&#8217;application. Des frais tout à fait raisonnable et ne nécessitant pas une refonte du business plan de l&#8217;entrepreneur.</p>
<p>Le processus de validation/publication est assez strict et votre application devra répondre à un certain nombre de critères de qualité, de législation et de performance (tous justifiés et atteignables). Voir les <a href="http://go.microsoft.com/?linkid=9730558" target="_blank">Windows Phone 7 Application Certification Requirements</a> pour plus d&#8217;informations.</p>
<blockquote><p>A noter que pour les applications Windows Mobile 6.5, les équipes de certification Marketplace (dont <a href="http://www.intertek.com/systems-certification/" target="_blank">Intertek Systems Certification</a>) lançaient entre autre un générateur de clics aléatoires (<a href="http://msdn.microsoft.com/en-us/library/bb158517.aspx" target="_blank">Hopper Test Tool</a>) qui permettait d&#8217;effectuer un stress-test de votre application pendant plusieurs heures.</p></blockquote>
<div>
<dl> </dl>
</div>
<h1>Le Windows Phone 7, c&#8217;est aussi pour moi ?</h1>
<p>Malgré toutes les promesses de Windows Phone 7, l&#8217;un des points noirs de cette plateforme pour les entreprises du secteur de l&#8217;industrie est qu&#8217;elle ne sortira pas sur du matériel à &laquo;&nbsp;coque renforcée&nbsp;&raquo; ou &laquo;&nbsp;sur mesure&nbsp;&raquo; (lecteur de code à barres intégré, RFID, connectique série&#8230;).</p>
<div>L&#8217;utilisateur type d&#8217;un Windows Phone est un consommateur lambda (cela inclut les professionnels) mais les techniciens, les spécialistes et les opérateurs ne font pas forcement partie de la cible.</div>
<div>Microsoft et les différents fabriquants (Motorola/Symbol, DataLogic&#8230;) continueront donc maintenir les gammes Windows Mobile 6.5, Windows CE, Windows Embedded. Cela passera par une autre modification/homogénéisation du nom de ces gammes mais les développements resteront les mêmes : .Net, C++&#8230;</div>
<div>Voir la <a href="http://www.microsoft.com/presspass/features/2010/jun10/06-17EnterpriseHandheld.mspx" target="_blank">Communication officielle de Steve Ballmer sur la road map Windows Phone et Windows Embedded</a>.</div>
<h1>Pour conclure</h1>
<p>Si je n&#8217;avais qu&#8217;un conseil à donner aux développeurs Windows Mobile, ce serait de regarder dès maintenant la plateforme Windows Phone qui vient de passer en RTM (Release-to-Manufacturing) et dont les premiers téléphones seront disponibles pour le grand public entre octobre et novembre en Europe.</p>
<p>Les outils de développement Windows Phone Developer Tools (actuellement en Beta) sont disponibles gratuitement sur le <a href="http://msdn.microsoft.com/fr-fr/windowsphone/ff720090.aspx" target="_blank">portail Windows Phone</a> et Microsoft fait beaucoup d&#8217;effort pour aider les développeurs à faire  le pas (certains développeurs ont pu recevoir gratuitement un téléphone de test Windows Phone 7). Les Windows Phone Developer Tools contiennent:</p>
<ul>
<li>Visual Studio 2010 Express</li>
<li>Expression Blend pour Windows Phone</li>
<li>XNA Game Studio</li>
<li>Emulateur Windows Phone</li>
</ul>
<p>L&#8217;évènement <a href="http://msdn.microsoft.com/fr-fr/microsoft-days.aspx" target="_blank">Microsoft Days</a> (du 30 septembre au 3 novembre suivant les villes) sera le lieu idéal pour Microsoft pour présenter sa plateforme à la communauté française des développeurs.</p>
<p>Si l&#8217;on regarde le système et la plateforme applicative dans son intégralité, les motivations principales de son architecture sont (<em>texte extrait du blog de </em><em><a href="http://msdn.microsoft.com/fr-fr/windowsphone/msdn.wp7.plateforme.aspx" target="_blank" class="broken_link">Pierre Cauchois</a>, évangéliste Microsoft Mobilité et Embarqué</em>):</p>
<ul>
<li>Pour l’utilisateur: une homogénéité, et une intégration efficace des applications dans les différents usages qu’il a de son téléphone. C’est avant tout l’utilisateur qui est au centre de toutes les attentions, qu’elles soient de la part de Microsoft, des opérateurs, des fabricants de téléphones ou des développeurs d’applications tierces.</li>
<li>Pour le développeur: simplicité et rapidité de développement. Les API sont intuitives et abstraient volontairement la complexité de certains traitements (comme la géolocalisation par exemple) et garantissent que quel que soit l’état du téléphone il se comportera correctement, c’est-à-dire de façon fiable et prévisible afin de garantir la meilleure expérience pour l’utilisateur.</li>
</ul>
<p>Windows Phone 7 n&#8217;en est pour l&#8217;instant qu&#8217;à sa première version et rien n&#8217;est gravé dans le marbre. Il n&#8217;est pas impensable que Microsoft accepte de faire évoluer cette plateforme très prometteuse qu&#8217;est Windows Phone afin de répondre aux besoins spécifiques du marché grand public et professionnel.</p>
<hr />Voici quelques liens complémentaires sur les différents sujets de cet article :</p>
<ul>
<li>Article intéressant sur l&#8217;<a title="Ecosystème de développement des applications mobiles" href="http://feedproxy.google.com/~r/francaistechcrunch/~3/Pnqgf6na6L4/">Ecosystème de développement des applications mobiles</a> sur les différentes plateformes.</li>
<li>Vue d&#8217;ensemble de <a href="http://msdn.microsoft.com/en-us/library/ff402531(VS.92).aspx" target="_blank">la plateforme Windows Phone 7</a> (en anglais)</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ff402528(VS.92).aspx" target="_blank">Choisir entre Silverlight et XNA</a> (en anglais)</li>
<li><a href="http://msdn.microsoft.com/fr-fr/windowsphone/msdn.wp7.plateforme.aspx" target="_blank" class="broken_link">Comprendre la plateforme Windows Phone 7</a></li>
<li><a href="http://blogs.msdn.com/b/pierreca" target="_blank">Le blog de Pierre Cauchois</a> : évangéliste Microsoft Mobilité et Embarqué</li>
<li><a href="http://blogs.msdn.com/b/pierreca/archive/2010/07/06/windows-phone-7-adopter-ou-ne-pas-adopter-metro.aspx" target="_blank">L&#8217;interface Metro</a> vue par un développeur</li>
<li>L&#8217;ensemble des <a href="http://live.visitmix.com/Videos" target="_blank" class="broken_link">sessions du MIX2010</a> sont disponibles gratuitement | <a href="http://itunes.apple.com/fr/podcast/sessions-microsoft-mix10/id362365921" target="_blank">Version iTunes</a> (en anglais)</li>
<li><a href="http://live.visitmix.com/MIX10/Sessions/CL14">Webcast [MIX 2010] Windows Phone 7 UI and Design Language</a> | <a href="http://itunes.apple.com/fr/podcast/windows-phone-ui-design-language/id362365921?i=81636435" target="_blank">Version iTunes</a> (en anglais)</li>
<li><a href="http://windowsteamblog.com/windows_phone/b/windowsphone/archive/2010/06/07/windows-phone-7-means-business.aspx" target="_blank">Windows Phone pour les professionnels</a></li>
</ul>
</div>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=14775" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/n%e2%80%99oublions-pas-windows-mobile/' rel='bookmark' title='N’oublions pas Windows Mobile'>N’oublions pas Windows Mobile</a></li>
<li><a href='http://blog.octo.com/et-si-microsoft-abandonnait-la-marque-windows/' rel='bookmark' title='Et si Microsoft abandonnait la marque Windows ?'>Et si Microsoft abandonnait la marque Windows ?</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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/la-strategie-windows-phone-7/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Problèmes courants: Imprécision des calculs mathématiques (2e partie)</title>
		<link>http://blog.octo.com/problemes-courants-imprecision-des-calculs-mathematiques-2e-partie/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=problemes-courants-imprecision-des-calculs-mathematiques-2e-partie</link>
		<comments>http://blog.octo.com/problemes-courants-imprecision-des-calculs-mathematiques-2e-partie/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 13:00:09 +0000</pubDate>
		<dc:creator>Henri Tremblay</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Brèves de consultants]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=12830</guid>
		<description><![CDATA[Nous avons déterminé dans la première partie que les nombres à virgule flottante sont à proscrire. Nos armes seront donc le BigDecimal en Java, le type decimal en .Net. Malheureusement, d&#8217;autres pièges pavent notre chemin. Notes: Sous Oracle, le type NUMBER(p,s) peut être soit décimal si p (et optionnellement s) est spécifié et sera à [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/problemes-courants-imprecision-des-calculs-mathematiques-1ere-partie/' rel='bookmark' title='Problèmes courants: Imprécision des calculs mathématiques (1ère partie)'>Problèmes courants: Imprécision des calculs mathématiques (1ère partie)</a></li>
<li><a href='http://blog.octo.com/livrer-plus-vite-des-pistes-issues-des-mathematiques/' rel='bookmark' title='Livrer plus vite. Des pistes issues des mathématiques.'>Livrer plus vite. Des pistes issues des mathématiques.</a></li>
<li><a href='http://blog.octo.com/refactoring-net-avec-uml-1ere-partie/' rel='bookmark' title='Refactoring .NET avec UML, 1ère partie'>Refactoring .NET avec UML, 1ère partie</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%252Fproblemes-courants-imprecision-des-calculs-mathematiques-2e-partie%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Probl%C3%A8mes%20courants%3A%20Impr%C3%A9cision%20des%20calculs%20math%C3%A9matiques%20%282e%20partie%29%22%20%7D);"></div>
<p>Nous avons déterminé dans la première partie que les nombres à virgule flottante sont à proscrire.</p>
<p>Nos armes seront donc le <em>BigDecimal</em> en Java, le type <em>decimal</em> en .Net. Malheureusement, d&#8217;autres pièges pavent notre chemin.</p>
<p><strong>Notes</strong>:</p>
<ul>
<li>Sous Oracle, le type NUMBER(p,s) peut être soit décimal si p (et optionnellement s) est spécifié et sera à virgule flottante sinon. Conclusion, toujours spécifier p (et s pour avoir des décimales).</li>
<li>Pour un Web Service, la valeur d&#8217;un type <code>xs:decimal</code> sera sous forme texte (ie. &laquo;&nbsp;123.456&#8243;) et sera donc précis et mappé sans problème vers un <code>BigDecimal</code> (Java) ou  <code>decimal</code> (.Net).</li>
</ul>
<p><span id="more-12830"></span></p>
<h1>Utilisation des décimaux</h1>
<h2>Littéraux</h2>
<p>J&#8217;ai souvent le commentaire suivant: &laquo;&nbsp;J&#8217;aime pas les BigDecimal, on ne  peut pas utiliser les opérateurs du langage avec&nbsp;&raquo;. C&#8217;est vrai, mais en attendant que Java supporte la surcharge d&#8217;opérateur (et c&#8217;est pas demain la veille), vous n&#8217;avez pas le choix, il faut utiliser les méthodes de la classe BigDecimal.</p>
<p>Le respect de la première règle ci-haut <strong>proscrit </strong>les choses suivantes:</p>
<pre class="brush:java">BigDecimal d = new BigDecimal(1.0); // initialisation par un double
BigDecimal d = BigDecimal.valueOf(1.0); // aussi une initialisation par un double
boolean b = (d.doubleValue() == 0.0); // comparaison avec un double
BigDecimal d = BigDecimal.valueOf(d1.doubleValue() * d2.doubleValue()); // passage par un double pour calcul mathématique</pre>
<p>remplacer tout cela par</p>
<pre class="brush:java">BigDecimal d = new BigDecimal("1.0"); // crée très précisément un BigDecimal de mantisse 10 et d'échelle 1
BigDecimal d = BigDecimal.valueOf(10, 1); // Même résultat que la ligne précédente
boolean b = (d.signum() == 0); // signum compare avec zéro et retourne -1, 0 ou 1. Pour une valeur différente de zéro, faire un compareTo
BigDecimal d = d1.multiply(d2); // tout le calcul se fait en type décimal</pre>
<h2>Échelle</h2>
<p>L&#8217;échelle (scale) indique le nombre de chiffres à droite de la virgule. Il faut bien comprendre que deux chiffres apparemment identiques peuvent être en fait différents de par leur échelle. C&#8217;est pour cette raison qu&#8217;en Java, dans l&#8217;exemple ci-dessous, <em>b</em> sera faux</p>
<pre class="brush:java">BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("1.00");
boolean b = d1.equals(d2); // false</pre>
<p>L&#8217;échelle a aussi un impact lors d&#8217;opérations mathématiques.</p>
<p><strong>Note:</strong> L&#8217;affichage d&#8217;un BigDecimal (<code>d.toString()</code>) affichera toujours l&#8217;échelle en entier et non uniquement les zéros significatifs.</p>
<h2>Additions et soustractions</h2>
<p>L&#8217;échelle du résultat d&#8217;une addition ou soustraction sera la plus <strong>grosse </strong>échelle des deux opérandes.</p>
<pre class="brush:java">BigDecimal d1 = new BigDecimal("1.0"); // échelle de 1
BigDecimal d2 = new BigDecimal("2.00"); // échelle de 2
BigDecimal r = d1.add(d2); // résultat d'échelle 2
System.out.println(r); // affiche 3.00</pre>
<h2>Multiplications</h2>
<p>L&#8217;échelle du résultat d&#8217;une multiplication sera la <strong>somme </strong>des échelles des opérandes (car mathématiquement, le résultat ne sera jamais sur plus).</p>
<pre class="brush:java">BigDecimal d1 = new BigDecimal("1.0"); // échelle de 1
BigDecimal d2 = new BigDecimal("2.00"); // échelle de 2
BigDecimal r = d1.multiply(d2); // résultat d'échelle 3
System.out.println(r); // affiche 2.000</pre>
<h2>Divisions</h2>
<p>Tout se complique pour les divisions. En effet, l&#8217;échelle théorique du résultat d&#8217;une division est potentiellement infinie (si le résultat de la division est un nombre périodique par exemple). C&#8217;est très différent de l&#8217;arithmétique en virgules flottantes qui stockera, dans sa taille finie, la valeur la plus proche du résultat réel. Vous aurez donc les résultats suivants:</p>
<pre class="brush:java">BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("3.0");
System.out.println(d1.divide(d2, RoundingMode.HALF_UP)); // affiche 0.3
System.out.println(d1.divide(d2, 4, RoundingMode.HALF_UP)); // affiche 0.3333
System.out.println(d1.divide(d2)); // ArithmeticException</pre>
<p>Si la règle d&#8217;arrondi n&#8217;est pas spécifié, comme le BigDecimal ne peut décider comment arrondir par lui-même, il retourne une exception *et c&#8217;est une bonne chose*. En effet, il ne faut jamais arrondir au hasard. Si vous ne savez pas comment arrondir, demandez à votre MOA. L&#8217;arrondi est systématiquement lié à une règle métier (ex.: arrondir à la précision de la monnaie). Je vous recommande d&#8217;ailleurs de mettre dans vos tests unitaires des chiffres testant l&#8217;arrondi pour prévenir les problèmes.</p>
<h2>Comparaison</h2>
<p>C&#8217;est l&#8217;un des comportements laissant le plus perplexes les développeurs. Nous en avons parlé plus haut, le <code>equals</code><br />
du BigDecimal compare aussi l&#8217;échelle. Il ne faut donc jamais l&#8217;utiliser si l&#8217;on souhaite comparer la valeur du BigDecimal. C&#8217;est là où <code>compareTo</code> vient à notre secours. Il se comporte comme nous le voudrions intuitivement.</p>
<pre class="brush:java">BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("1.00");
int i = d1.compareTo(d2); // 0, ce qui veut dire de même valeur selon le contrat de compareTo</pre>
<p><strong>À noter:</strong> Comparativement à la comparaison entre nombres à virgule flottante, il n&#8217;est pas nécessaire d&#8217;ajouter un delta lors des comparaisons. Le décimal étant toujours précis, la comparaison sans delta le sera donc aussi.</p>
<h2>Conversion</h2>
<p>Il faut prendre quelques précautions lors de la conversion d&#8217;une BigDecimal vers une valeur entière. En effet, celui-ci arrondira à l&#8217;unité. Il est souvent plus sécuritaire de vérifier s&#8217;il y a des décimales lors de la conversion. Les méthodes <code>xxxValueExact()</code> ont donc été mise à disposition pour faire très exactement ceci. Une<code> ArithmeticException</code> sera lancée si une conversion sans arrondi est impossible.</p>
<pre class="brush:java">BigDecimal d1 = new BigDecimal("1.1");
System.out.println("i: " + d1.intValue()); // affiche 1
System.out.println(d1.intValueExact()); // lance une ArithmeticException</pre>
<h1>.NET</h1>
<p>L&#8217;article s&#8217;est pour l&#8217;instant beaucoup penché sur Java. L&#8217;équivalent .Net du BigDecimal est le <code>decimal</code>. De même qu&#8217;en Java, il doit être utilisé en tout temps au lieu du float et double.</p>
<h2>Littéraux</h2>
<p>Le type <code>decimal</code> étant un type primitif de .Net, C# fournit une syntaxe littérale pour ce dernier (suffixe m). Les zéros non significatifs sont utiles pour déterminer l&#8217;échelle.</p>
<pre class="brush:java">decimal d = 99.9m; // le m indiquant qu'il s'agit d'un décimal
decimal b = 9.00m; // decimal d'échelle 2
</pre>
<p>Il est d&#8217;ailleurs judicieusement nécessaire de convertir explicitement  d&#8217;une virgule flottante à un décimal.</p>
<pre>decimal a = (decimal) 9.0; // conversion explicite nécessaire et perte de précision potentielle. À ne pas faire!
</pre>
<h2>Calculs mathématiques</h2>
<p>Être un type primitif a d&#8217;autres avantages, les calculs mathématiques sont plus élégants qu&#8217;en Java.</p>
<pre class="brush:java">decimal d = 1.0m * 2.0m; // +, -, /, * et % sont utilisables
decimal b = decimal.Multiply(1.0m, 2.0m); // l'équivalent en méthode statique est aussi disponible</pre>
<p>La division n&#8217;a pas besoin et ne peut avoir de règle d&#8217;arrondi. Elle fera au mieux dans les 96 bits d&#8217;espace. Il ne faut toutefois pas oublier qu&#8217;un arrondi sera éventuellement nécessaire et sera comme toujours guidé par une règle métier.</p>
<h2>Comparaison</h2>
<p>Comparativement à Java, le compare et le equals donne le même résultat peut importe l&#8217;échelle. C&#8217;est beaucoup plus intuitif, mais implique qu&#8217;il est impossible de comparer en voulant considérer l&#8217;échelle.</p>
<pre class="brush:java">Console.WriteLine(decimal.Compare(1.00m, 1.0m)); // affiche 0, donc égal
Console.WriteLine(1.0m.CompareTo(1.00m)); // autre façon de comparer, retourne aussi 0
Console.WriteLine(1.0m.Equals(1.00m)); // affiche true</pre>
<p>Il est d&#8217;ailleurs impossible de connaître l&#8217;échelle d&#8217;un décimal  facilement en .Net. Pour avoir l&#8217;échelle, il faut faire ceci:</p>
<pre class="brush:java">int scale = (System.Decimal.GetBits(monDecimal)[3] &gt;&gt; 16) &amp; 31; // oui oui, ça s'invente pas</pre>
<p>ou passer par un <code>ToString</code>, trouver le séparateur décimal (en fonction de la culture) et compter le nombre de chiffres à sa droite.</p>
<h2>Conversion</h2>
<p>Au niveau conversion, il existe des méthodes ToXXX permettant la conversion vers un autre type. Le concept de ToXXXExact n&#8217;existe pas. Il faut donc s&#8217;assurer au préalable qu&#8217;il n&#8217;y aura pas de perte de précision. Une solution possible est ceci:</p>
<pre class="brush:java">decimal toInt = 1.1m;
int i = decimal.ToInt32(toInt);
Console.WriteLine(toInt.Equals(new decimal(i))); // n'est pas égal, car nous avons perdu les décimales</pre>
<h1>Conclusion</h1>
<p>Le but n&#8217;est pas de comparer, mais vous l&#8217;aurez compris</p>
<ul>
<li>La version Java demande de bien comprendre son implémentation, mais sévi en cas de mauvaise utilisation</li>
<li>La version .Net se veut plus conviviale, mais est donc plus permissive et rend plus compliqués certaines opérations.</li>
</ul>
<p>Mais peu importe le langage, les choses importantes à retenir se résument à</p>
<ul>
<li>Ne pas utiliser de types à virgule flottante pour représenter des décimaux</li>
<li>Avoir en tête qu&#8217;en informatique de gestion tous les nombres ou presque sont des décimaux</li>
<li>Penser aux arrondis et les faire suivant une règle métier</li>
<li>Bien avoir en tête les spécificités du langage avant utilisation</li>
</ul>
<p>Une seule nuance à ces règles. Il est possible que pour des raisons de performance vous deviez utiliser des nombres à virgule flottante. Par exemple, dans le cadre du simulation de Monte-Carlo. Je ne peux dans ce cas que vous recommander de bien vous documenter sur la manipulation des nombres à virgule flottante. Il existe de nombreuses méthodes pour minimiser les problèmes mais le tout reste relativement complexe et sors du cadre de cet article.  Ne les utilisez donc qu&#8217;en dernier recours.</p>
<p>En conclusion, appliquez ces règles religieusement et vous devriez être parés pour éviter les soucis de calcul de vos futures applications d&#8217;entreprise. Je vous souhaite de précis calculs et vous dis à la prochaine.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=12830" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/problemes-courants-imprecision-des-calculs-mathematiques-1ere-partie/' rel='bookmark' title='Problèmes courants: Imprécision des calculs mathématiques (1ère partie)'>Problèmes courants: Imprécision des calculs mathématiques (1ère partie)</a></li>
<li><a href='http://blog.octo.com/livrer-plus-vite-des-pistes-issues-des-mathematiques/' rel='bookmark' title='Livrer plus vite. Des pistes issues des mathématiques.'>Livrer plus vite. Des pistes issues des mathématiques.</a></li>
<li><a href='http://blog.octo.com/refactoring-net-avec-uml-1ere-partie/' rel='bookmark' title='Refactoring .NET avec UML, 1ère partie'>Refactoring .NET avec UML, 1ère partie</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/problemes-courants-imprecision-des-calculs-mathematiques-2e-partie/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

