<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Codingly</title>
	<atom:link href="http://codingly.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://codingly.com</link>
	<description>Par Romain Verdier</description>
	<pubDate>Tue, 05 Aug 2008 10:41:44 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>fr</language>
			<item>
		<title>(InvokeRequired + Invoke) &#60; SynchronizationContext</title>
		<link>http://codingly.com/2008/08/04/invokerequired-invoke-synchronizationcontext/</link>
		<comments>http://codingly.com/2008/08/04/invokerequired-invoke-synchronizationcontext/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 21:06:10 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Tip]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=207</guid>
		<description><![CDATA[Tous les développeurs savent qu&#8217;il faut être prudent lorsqu&#8217;on est en Corée du Nord ou lorsqu&#8217;on s&#8217;amuse avec les Winforms dans un contexte multi-threads. On ne doit pas, plus précisément, accéder à un contrôle graphique à partir d&#8217;un thread différent de celui dans lequel il a été créé. Ceux qui ont essayé (tous, je crois) [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Tous les développeurs savent qu&#8217;il faut être prudent lorsqu&#8217;on est en Corée du Nord ou lorsqu&#8217;on s&#8217;amuse avec les Winforms dans un contexte multi-threads. On ne doit pas, plus précisément, accéder à un contrôle graphique à partir d&#8217;un thread différent de celui dans lequel il a été créé. Ceux qui ont essayé (tous, je crois) ont découvert qu&#8217;une <code>InvalidOperationException</code> était levée :<br />
<span id="more-207"></span></p>
<blockquote><p>Opération inter-threads non valide : le contrôle &#8216;MyControl&#8217; a fait l&#8217;objet d&#8217;un accès à partir d&#8217;un thread autre que celui sur lequel il a été créé.</p></blockquote>
<p>Enfin, à partir de VS2005 et en debug mode uniquement. Par exemple, dans une <code>Form</code> le code suivant affecté à l&#8217;évènement <code>Click</code> d&#8217;un bouton suffit à provoquer une telle exception :</p>
<pre name="code" class="csharp">

private void myButton_Click(object sender, EventArgs e)
{
    var thread = new Thread((ThreadStart) delegate { this.Text = &quot;Yeah&quot;; });
    thread.Start();
}
</pre>
<p>L&#8217;accès à la propriété <code>Text</code> de la fenêtre (qui est un contrôle) s&#8217;effectue dans un thread différent du thread d&#8217;affichage principal.</p>
<p>Si je vous demande comment arranger ça, vous allez me répondre naturellement qu&#8217;il faut écrire quelque chose comme :</p>
<pre name="code" class="csharp">

private void myButton_Click(object sender, EventArgs e)
{
    var thread = new Thread(ChangeFormCaption);
    thread.Start();
}

private void ChangeFormCaption()
{
    if (this.InvokeRequired)
    {
        this.Invoke((MethodInvoker) ChangeFormCaption);
    }
    else
    {
        this.Text = &quot;Yeah&quot;;
    }
}
</pre>
<p>On teste via la propriété <code>InvokeRequired</code> si on est dans le thread ayant créé la fenêtre. Si ce n&#8217;est pas le cas, alors on utilise la méthode <code><a href="http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx">Invoke</a></code> pour exécuter le délégué passé en paramètre (<code>ChangeFormCaption</code>) dans le bon thread : celui à partir duquel la fenêtre a été créée.</p>
<p>Ca fonctionne, hourra.</p>
<p>Maintenant, un autre exemple :</p>
<pre name="code" class="csharp">

public partial class MyForm : Form
{
    public MyForm()
    {
        this.InitializeComponent();

        // New background thread started from the form constructor
        var thread = new Thread(DoSomething);
        thread.Start();

        Thread.Sleep(100);
    }

    public void DoSomething()
    {
        if (this.InvokeRequired)
        {
            this.Invoke((ThreadStart) this.DoSomething);
        }
        else
        {
            Thread.Sleep(100);

            // Access to the control (the form itself, actually)
            // from the background thread
            this.Text = &quot;Yeah&quot;;
        }
    }
}
</pre>
<p>A priori, ça fonctionne, puisqu&#8217;on prend bien garde d&#8217;utiliser la méthode <code>Invoke</code> lorsque nécessaire. Mais en fait - et c&#8217;est bien là tout l&#8217;intérêt de ce billet si tant est qu&#8217;il y en ait un - <strong>ça ne fonctionne pas toujours</strong>. On continue d&#8217;obtenir plus ou moins aléatoirement l&#8217;<code>InvalidOperationException</code> liée à l&#8217;interaction cross-thread condamnée plus tôt.</p>
<p><strong>Mais pourquoi ? </strong></p>
<p>Un nord-coréen répondrait sans doute &#8220;parce que&#8221;, mais je ne suis pas nord-coréen. La <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx">MSDN</a> non plus, faut croire, puisqu&#8217;après avoir halluciné quelque temps j&#8217;y ai trouvé une ligne spécifiant le comportement de la propriété <code>InvokeRequired</code> lorsque le handle du contrôle sur lequel elle est appelée n&#8217;est pas encore créé : elle retourne <code>false</code>.</p>
<p>C&#8217;est fâcheux, et c&#8217;est aussi ce qu&#8217;illustre l&#8217;exemple précédent. Dans certains cas, en lançant le background thread durant la construction de la fenêtre, le handle de cette dernière peut ne pas avoir été créé lors de l&#8217;accès à la propriété <code>InvokeRequired</code>. Cela entraine logiquement la modification de la fenêtre directement à partir du background thread, et l&#8217;exception est levée. Notez qu&#8217;effectuer la modification en appelant systématiquement la méthode <code>Invoke</code> n&#8217;arrange rien : cette dernière nécessite également que le handle du contrôle soit créé, et lèvera une autre <code>InvalidOperationException</code> si ce n&#8217;est pas le cas.</p>
<p>Le <code>SynchronizationContext</code> permet de régler ça. En fait, c&#8217;est une solution disponible à partir du framework 2.0 qui peut complètement remplacer le pattern <code>if(InvokeRequired) Invoke(...)</code>, et qui gère les handles correctement. C&#8217;est ce qu&#8217;utilise le <code>BackgroundWorker</code>, pour info. Voilà ce que ça donne à l&#8217;utilisation :</p>
<pre name="code" class="csharp">

public partial class MyForm : Form
{
    private readonly SynchronizationContext syncContext;

    public MyForm()
    {
        this.InitializeComponent();

        // Getting the synchronization context from the
        // form constructor
        this.syncContext = SynchronizationContext.Current;

        // New background thread started from the form constructor
        var thread = new Thread(this.DoSomething);
        thread.Start();

        Thread.Sleep(100);
    }

    public void DoSomething()
    {
        this.syncContext.Post(delegate
                              {
                                  Thread.Sleep(100);

                                  // Access to the control from the
                                  // synchronization context
                                  this.Text = &quot;Yeah&quot;;

                              }, null);
    }
}
</pre>
<p>Lors de la construction de la fenêtre, avant tout, on récupère le contexte de synchronisation correspondant au thread courant, et on conserve sa référence. Dans le background thread (méthode <code>DoSomething</code>) on accède à la fenêtre via la méthode <code>Post</code> du <code>SynchronizationContext</code>. Et voilà.</p>
<p>Je vous laisse lire la <a href="http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx">documentation</a> pour en apprendre plus, car il y a plus à apprendre. Je voulais surtout mettre en avant aujourd&#8217;hui le comportement éventuellement troublant de la propriété <code>InvokeRequired</code>, qui peut facilement faire perdre du temps dans ce scénario bien particulier.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/207/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/207/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/207/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=207&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/08/04/invokerequired-invoke-synchronizationcontext/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>
	</item>
		<item>
		<title>La propriété svn:externals et les révisions</title>
		<link>http://codingly.com/2008/07/19/la-propriete-svnexternals-et-les-revisions/</link>
		<comments>http://codingly.com/2008/07/19/la-propriete-svnexternals-et-les-revisions/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 13:10:16 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[Methodes]]></category>

		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=143</guid>
		<description><![CDATA[Vous devez être nombreux à utiliser Subversion comme outil de contrôle de code source. Même si on entend parler de plus en plus des VCS distribués comme Git, Bazaar ou Mercurial, Subversion reste une excellente solution. C&#8217;est en tout cas celle que j&#8217;utilise quotidiennement depuis un moment. Si vous avez l&#8217;habitude d&#8217;intervenir au niveau de [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Vous devez être nombreux à utiliser <a href="http://subversion.tigris.org/">Subversion</a> comme outil de contrôle de code source. Même si on entend parler de plus en plus des VCS distribués comme <a href="http://git.or.cz/">Git</a>, <a href="http://bazaar-vcs.org/">Bazaar</a> ou <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a>, Subversion reste une excellente solution. C&#8217;est en tout cas celle que j&#8217;utilise quotidiennement depuis un moment. Si vous avez l&#8217;habitude d&#8217;intervenir au niveau de la gestion de configuration de vos projets, vous vous êtes probablement déjà posés tout un tas de questions relatives aux &#8220;bonnes pratiques svn&#8221;.</p>
<p>J&#8217;ai envie aujourd&#8217;hui de vous parler de l&#8217;une d&#8217;elles, concernant la propriété <code>svn:externals</code>, qui permet de créer des dépendances entre projets versionnés.<br />
<span id="more-143"></span><br />
Au niveau de l&#8217;utilisation, c&#8217;est très simple. Je ne vais d&#8217;ailleurs pas m&#8217;étaler sur le sujet - ce n&#8217;est pas le but - mais je vous invite tout de même à jeter un coup d&#8217;oeil aux <a href="http://svnbook.red-bean.com/nightly/en/svn.advanced.externals.html">nouvelles fonctionnalités</a> supportées par la version 1.5 de Subversion quant aux <em>externals</em>. Non, la question qui m&#8217;intéresse est précise :</p>
<p><strong>Faut-il ou non spécifier systématiquement la révision vers laquelle pointe la référence externe ?</strong></p>
<p>Mais ouais ! </p>
<p>Si vous pensez le contraire, vous avez sans doute d&#8217;excellentes raisons (n&#8217;hésitez alors pas à m&#8217;en faire part), mais peut-être aussi avez-vous été abusés (comme moi) par les deux mythes suivants :</p>
<ul>
<li><em>Ne pas spécifier la révision d&#8217;une dépendance externe et toujours pointer sur la dernière, c&#8217;est plus <strong>pratique</strong>.</em></li>
<li><em>Editer les externals pour mettre à jour les révisions tout le temps, c&#8217;est <strong>chiant</strong>.</em></li>
</ul>
<p>Je pense que ce n&#8217;est pas exact.</p>
<p>Lorsque vous travaillez sur un projet et que vous utilisez la propriété <code>svn:externals</code>, vous matérialisez une dépendance de ce dernier vers un ou plusieurs autres projets <strong>tiers</strong>. Il se peut que vous soyez en charge de leur développement - c&#8217;est d&#8217;ailleurs fréquemment le cas - mais ils restent <strong>indépendants</strong> de votre projet. Cela signifie qu&#8217;ils sont susceptibles d&#8217;évoluer de leur côté ou bien d&#8217;être référencés et utilisés par d&#8217;autres projets dépendants. Si ce n&#8217;est pas le cas, remettez en cause leur existence.</p>
<p>Vous pouvez référencer les sources d&#8217;un projet indépendant via la propriété <code>svn:external</code> pour plusieurs raisons. Par exemple, pour débugger plus facilement, pour mieux comprendre comment la dépendance fonctionne, ou tout simplement parce que vous contribuez également sur le projet dont vous dépendez. Quoi qu&#8217;il en soit, à partir du moment où vous référencez un projet <strong>externe</strong>, gardez bien en tête que n&#8217;importe qui est susceptible de le faire évoluer <em>sans même savoir qu&#8217;il est référencé par votre projet</em>. Vous me répondrez qu&#8217;il est très improbable que cela arrive : vous savez précisément qui fait quoi dans votre équipe. OK, admettons ; après tout il s&#8217;agit d&#8217;une objection valide. Je doute cependant que le projet externe soit uniquement référencé par <strong>un seul</strong> projet. Si c&#8217;est le cas, il ne peut s&#8217;agir que d&#8217;une mauvaise idée ou d&#8217;une solution temporaire : vous anticipez des dépendances futures. Et s&#8217;il y a plusieurs projets qui affichent une dépendance vers un même projet externe, alors chaque évolution de ce dernier concerne <strong>tous</strong> les projets dépendants.</p>
<p>Surtout si vos projets dépendants référencent en permanence la <strong>dernière révision</strong> du projet dont ils dépendent.</p>
<p>C&#8217;est le comportement par défaut de la propriété <code>svn:externals</code> lorsque vous n&#8217;utilisez pas l&#8217;option <code>-r</code> pour spécifier vers quelle révision donnée pointe votre référence externe.</p>
<p>Pour revenir au premier mythe, celui de la facilité, il est vrai qu&#8217;avoir toutes les évolutions du projet externe <strong>poussées</strong> vers tous les projets dépendants (à chaque <em>update</em> de ces derniers) peut sembler pratique. &#8220;Au moins, on est sûr de profiter des dernières évolutions&#8221;. C&#8217;est déjà plus discutable lorsque les évolutions du projet externe impactent sa surface publique et nécessitent que certains projets dépendants soient adaptés, modifiés, corrigés.</p>
<p><img src="http://romainverdier.files.wordpress.com/2008/07/svnexternals.png" class="alignleft image-border" />Imaginons 4 projets : <em>Project1</em>, <em>Project2</em>, <em>Project3</em>, et <em>Hourra</em>. Imaginons que ces 4 projets dépendent d&#8217;un 5ème projet externe : <em>SharedProject</em>. Imaginons enfin que pour répondre à un besoin du projet <em>Hourra</em>, on fasse évoluer <em>SharedProject</em> en introduisant au passage un <em>breaking change</em>. La conséquence est aussi évidente que l&#8217;exemple est trivial : </p>
<p>Henri, qui doit faire un <em>commit</em> sur le <em>Project2</em> (Henri ne travaille que sur ce projet, et ça lui convient bien) se fait avertir par Tortoise qu&#8217;il n&#8217;est pas à jour, et qu&#8217;il doit faire un <em>update</em> avant de publier ses modifications. Henri grogne un peu, son méchant manager (Brigitte) lui met la pression pour que le QA puisse récupérer via TeamCity une build de <em>Project2</em> incluant son travail récent (la fenêtre About). Il met donc à jour sa copie locale, puis fait son <em>commit</em>. 2 minutes plus tard TeamCity notifie tout le monde d&#8217;une erreur de compilation sur la build de <em>Project2</em>. Le pauvre Henri vient de se manger le <em>breaking change</em> de <em>SharedProject</em>, et quoi qu&#8217;il fasse, il perdra du temps.</p>
<p>Je pourrais vous raconter l&#8217;histoire de Gustave sur <em>Project1</em> et de Catherine sur <em>Project3</em>, mais je ne pense pas que cela soit nécessaire.</p>
<p>Pour s&#8217;éviter la peine de réfléchir, et de maintenir les références externes, on perturbe tout le processus de développement. L&#8217;exemple est grossier, mais je pense qu&#8217;il a le mérite de bien faire comprendre que la seule chose qui devient plus facile lorsqu&#8217;on référence la <em>head revision</em> d&#8217;un <em>external</em>, c&#8217;est de <strong>fragiliser</strong> le cycle de construction du projet. Cela peut ne pas arriver souvent, mais à chaque fois que cela arrive, le temps perdu et l&#8217;approximation des méthodes de résolution font regretter de ne pas avoir pris la peine de gérer finement la configuration.</p>
<p>Que nécessite le fait de spécifier la révision du projet externe dont on dépend ?</p>
<ul>
<li>Un peu de concentration : on doit savoir qu&#8217;on dépend d&#8217;une révision spécifique d&#8217;un projet.</li>
<li>Un peu de discernement : on <strong>décide</strong> de faire dépendre son projet de la nouvelle version du projet externe.</li>
<li><strike>Un peu de talent</strike> Une minute pour éditer la propriété <code>svn:external</code> et mettre à jour la révision.</li>
</ul>
<p>Il ne faut pas toujours penser que l&#8217;on peut tout simplifier. La gestion de configuration est une discipline délicate, caractérisée notamment par l&#8217;évolution exponentielle de sa complexité lorsque le nombre de projets augmente. Je parle dans mon exemple de 5 projets, mais on peut en imaginer plus, avec différents niveaux de dépendances, plusieurs branches, des versions déployées, taguées, etc.</p>
<p>Toute complexité n&#8217;est pas forcément compressible, et constater qu&#8217;on dispose d&#8217;une solution simple à un problème compliqué peut aussi bien faire penser que ladite solution est géniale ou carrément douteuse.</p>
<p>Quant à la pénibilité de la tâche consistant à <em>mettre à jour une propriété svn</em>, et bien, je ne sais pas trop quoi dire. Il me semble qu&#8217;il s&#8217;agit d&#8217;une chose évidente, et terriblement <strong>simple</strong>. Je veux dire : si vous êtes capable d&#8217;avoir un avis au sujet de la bonne utilisation de votre VCS, vous êtes évidemment en mesure de mettre à jour un argument d&#8217;une propriété svn sans <em>souffrir</em>.</p>
<p>A la rigueur, si vous devez gérer un certain nombre de projets ayant de multiples références externes, ou si vous désirez convaincre les différentes membres de votre équipe, vous pouvez passer quelques heures à réaliser un petit outil rendant le monitoring et la mise à jour des <em>externals</em> ridiculement simples.</p>
<p>Après tout, vous êtes des geeks, non ?</p>
<p><img src="http://romainverdier.files.wordpress.com/2008/07/svnexternalsmonitor.png" class="alignnone" /></p>
<p>Evidemment, il est possible de ne jamais spécifier de révision dans la propriété <code>svn:externals</code> sans pour autant être un crétin ; ce n&#8217;est certainement pas ce que je dis. J&#8217;ai pendant très longtemps négligé l&#8217;option <code>-r</code>, et mes projets n&#8217;ont pas été compromis outre mesure <em>à cause</em> de ça. Je cherche juste à attirer l&#8217;attention sur le fait que cette pratique me semble être conceptuellement plus juste, plus sûre, et qu&#8217;elle n&#8217;est pas si <strong>contraignante</strong> qu&#8217;on le pense souvent au premier abord. Un soupçon de rigueur à ce niveau, même sur de petits projets, peut donner à votre gestion de configuration une stabilité et une solidité rassurantes.</p>
<p>Lorsque toutes les références externes d&#8217;un projet pointent sur les <em>head revisions</em> de chaque dépendance et qu&#8217;il est temps de tagger une version, ne trouvez-vous pas la tâche à la fois pénible et risquée ? Vous aurez d&#8217;un coup à <strong>fixer</strong> chaque dépendance externe vers une révision spécifique, ce qui est laborieux dès lors qu&#8217;il y a plusieurs niveaux de dépendances. Prendre l&#8217;habitude de fixer les révisions en permanence est selon moi une bonne chose, une sorte d&#8217;investissement rapidement rentable et encore une fois, pas vraiment coûteux.</p>
<p>J&#8217;ajouterai juste une remarque suite à un commentaire pertinent de Julien sur le <a href="http://groups.google.com/group/parisaltnet/msg/2af23a44b568f33c">groupe de discussion ALT.NET</a> :</p>
<blockquote><p>Par exemple, en mode agile avec de petites équipes et de l&#8217;intégration continu en place, ca passe très bien. Apres tout, le but de l&#8217;intégration continue est justement d&#8217;intégrer les dernières modifications et de detecter les breaking changes.</p></blockquote>
<p>Effectivement, l&#8217;intégration continue permet de détecter les problèmes de ce genre, mais selon moi ce n&#8217;est pas suffisant. L&#8217;intégration continue ne permet pas d&#8217;<strong>éviter</strong> ce genre de problème. Dans mon histoire, Henri aurait préféré <em>décider</em> du moment où il allait devoir intégrer les <em>breaking changes</em>. C&#8217;est un peu comme lorsqu&#8217;on décide de migrer de <a href="http://www.ayende.com/wiki/Rhino+Mocks+Change+Log.ashx">Rhino.Mocks 2.x à Rhino.Mocks 3.x</a> :  il s&#8217;agit d&#8217;une tâche que l&#8217;on veut <strong>planifier</strong>, sur laquelle on veut avoir le contrôle. On <strong>choisit</strong> d&#8217;utiliser une version plus récente d&#8217;une dépendance externe, on évite de <strong>subir</strong> la mise à jour en la découvrant parfois au mauvais moment.</p>
<p>Lorsque je travaille sur un projet, et que je décide d&#8217;utiliser la dernière version d&#8217;une dépendance externe :</p>
<ol>
<li>Je mets à jour la propriété <code>svn:externals</code> de ma copie de travail locale (avec mon super outil) pour qu&#8217;elle pointe vers la dernière révision de la dépendance.</li>
<li>Je fais un <em>update</em> pour récupérer les sources correspondant à cette dernière révision.</li>
<li>Je fais la migration (si besoin), toujours dans ma copie locale. Je m&#8217;assure que tout fonctionne avec la dernière révision de la dépendance externe.</li>
<li>Je fais un <em>commit</em> pour publier à la fois la propriété <code>svn:externals</code> mise à jour, et les éventuelles modifications nécessaires à l&#8217;intégration de la nouvelle version de la dépendance.</li>
<li>Si je suis responsable d&#8217;autres projets dépendants, je recommence le même processus.</li>
</ol>
<p>Ainsi, tous les projets restent sains, et les équipes gardent une bonne maitrise de la gestion de configuration. Je n&#8217;arrive pas à voir quel pourrait être le réel avantage à fonctionner différemment.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/143/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/143/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/143/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=143&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/07/19/la-propriete-svnexternals-et-les-revisions/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/07/svnexternals.png" medium="image" />

		<media:content url="http://romainverdier.files.wordpress.com/2008/07/svnexternalsmonitor.png" medium="image" />
	</item>
		<item>
		<title>CIL Programming, presque under the hood of .NET</title>
		<link>http://codingly.com/2008/07/10/cil-programming-presque-under-the-hood-of-net/</link>
		<comments>http://codingly.com/2008/07/10/cil-programming-presque-under-the-hood-of-net/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 19:40:29 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Book]]></category>

		<category><![CDATA[CIL]]></category>

		<category><![CDATA[Review]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=115</guid>
		<description><![CDATA[J&#8217;ai terminé il y a quelques semaines la lecture d&#8217;un des seuls livres publiés au sujet du langage intermédiaire de la plateforme .NET. J&#8217;ai nommé CIL Programming, Under the hood of .NET de Jason Bock. 
Je me suis appliqué, un parfait cover to cover, mais je le regrette un peu. Il ne doit pas être [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>J&#8217;ai terminé il y a quelques semaines la lecture d&#8217;un des seuls livres publiés au sujet du langage intermédiaire de la plateforme .NET. J&#8217;ai nommé <a href="http://www.amazon.fr/CIL-Programming-Under-Hood-NET/dp/1590590414"><strong>CIL Programming, Under the hood of .NET</strong></a> de <a href="http://www.jasonbock.net">Jason Bock</a>. </p>
<p>Je me suis appliqué, un parfait <em>cover to cover</em>, mais je le regrette un peu. Il ne doit pas être évident d&#8217;écrire un livre sur un sujet aussi <strike>chiant</strike> particulier, donc je ne peux raisonnablement pas être aussi acerbe que déçu. Car j&#8217;ai été assez déçu.<br />
<span id="more-115"></span></p>
<p><img src="http://romainverdier.files.wordpress.com/2008/07/cilprogramming.png" class="alignright image-border" />Si on ne s&#8217;attend pas à mourir de rire à chaque page lorsqu&#8217;on entame la lecture d&#8217;un livre du genre (avez-vous déjà essayé de faire une blague sur le <a href="http://en.wikipedia.org/wiki/MSIL">CIL</a> ?), on espère au moins en tirer quelque chose, ou plus exactement, quelque chose que l&#8217;on n&#8217;aurait pas pu - ou pas mieux pu - apprendre ailleurs. <em>CIL Programming</em> m&#8217;a donné l&#8217;impression d&#8217;être trop souvent approximatif à plusieurs niveaux : structure, rédaction, exemples, blagues (oui, Jason a essayé), références, etc. Pour être honnête, j&#8217;ai abordé cette lecture avec pour objectif d&#8217;acquérir une meilleure compréhension du langage intermédiaire de la plateforme .NET et plus particulièrement des possibilités offertes aux langages de plus haut niveau quant à sa génération/manipulation ; mais j&#8217;avais déjà une compréhension globale du langage ainsi qu&#8217;une expérience assez modeste de l&#8217;API <code>System.Reflection.Emit</code>.</p>
<p>C&#8217;est peut-être pour cette raison que j&#8217;ai été déçu. Quoi qu&#8217;il en soit, il serait dommage qu&#8217;en ayant une connaissance superficielle du sujet on en sache déjà trop pour trouver la lecture profitable. On parle bien d&#8217;un <strong>livre</strong>, hein, pas d&#8217;un article de blog ou d&#8217;un post dans le forum de <a href="http://www.codes-sources.com/">codes-sources.com</a>.</p>
<p>Le livre progresse doucement, trop doucement ; il frôle parfois le formalisme soporifique d&#8217;une spécification de langage sans pour autant parvenir au même niveau de complétude et de concision. Beaucoup de questions sont laissées en suspens malgré l&#8217;abus de références croisées (assez fatigantes), et cela conduit inévitablement le lecteur à se demander s&#8217;il n&#8217;a pas été trompé lorsqu&#8217;il arrive aux annexes.</p>
<p>Outre les chapitres qui listent les différents codes d&#8217;opérations du langage, vous pourriez éventuellement trouver un intérêt à lire en diagonale au moins les chapitres 5, 6 et 7 (cf. liste ci-dessous). Le chapitre 8, qui aurait pu être le plus intéressant pour les développeurs voulant générer dynamiquement du CIL est finalement compromis par la qualité de l&#8217;exemple lui-même (pourtant pertinent).</p>
<p>Pour le contenu, voici la liste des chapitres :</p>
<ul>
<li>Chapter 1: Language Interoperability</li>
<li>Chapter 2: ILASM Directives and Attributes</li>
<li>Chapter 3: CIL Opcodes</li>
<li>Chapter 4: ILASM and CIL in Practice</li>
<li>Chapter 5: Debugging CIL</li>
<li>Chapter 6: .NET Languages and CIL</li>
<li>Chapter 7: Emitting Types</li>
<li>Chapter 8: Dynamic Proxies in .NET</li>
<li>Chapter 9: CIL Tips</li>
<li>Appendix A The Future of CIL</li>
<li>Appendix B .NET</li>
</ul>
<p>Au risque donc de paraitre déraisonnable, je vous déconseille assez franchement ce livre.</p>
<div class="bookreview">
<div class="booktitle">CIL Programming, Under the hood of .NET</strong></div>
<div class="bookauthor">Jason Bock</div>
<div class="bookscore">8/20</div>
</div>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/115/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/115/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/115/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=115&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/07/10/cil-programming-presque-under-the-hood-of-net/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/07/cilprogramming.png" medium="image" />
	</item>
		<item>
		<title>ALT.NET en France : Rencontre Parisienne #3</title>
		<link>http://codingly.com/2008/07/04/altnet-en-france-rencontre-parisienne-3/</link>
		<comments>http://codingly.com/2008/07/04/altnet-en-france-rencontre-parisienne-3/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 06:34:47 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[ALT.NET]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=100</guid>
		<description><![CDATA[Je vous en avais parlé : la troisième rencontre ALT.NET Parisienne elle a eu lieu mercredi dernier, en (très) petit comité. Nous étions seulement trois : Robert Pickering, Mathias Kluba, et moi-même. La faute à l&#8217;été et aux congés ; il n&#8217;y avait pas de foot ce soir là.

Pas facile de dresser un bilan significatif [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Je vous en <a href="http://codingly.com/2008/06/18/etes-vous-altnet/">avais parlé</a> : la troisième rencontre ALT.NET Parisienne elle a eu lieu mercredi dernier, en (très) petit comité. Nous étions seulement trois : <a href="http://www.strangelights.com/blog/">Robert Pickering</a>, <a href="http://www.grozeille.com/">Mathias Kluba</a>, et moi-même. La faute à l&#8217;été et aux congés ; il n&#8217;y avait pas de foot ce soir là.<br />
<span id="more-100"></span><br />
<img src="http://romainverdier.files.wordpress.com/2008/07/foule.jpg" class="alignright image-border" />Pas facile de dresser un bilan significatif dans ces conditions. Si je devais tenter je dirais que la soirée a été intéressante, et qu&#8217;elle nous a permis d&#8217;avoir une conversation diversifiée : choix des langages, Resharper, les différents frameworks ORM, les suites de composants Winforms, Spring.NET, OCaml, intéropérabilité, C# 3.0, l&#8217;inférence de type, F#, SharpDevelop, WPF, ALT.NET (oui oui), Entity Framework, Java, TFS, les missions de consulting, Emacs, Subversion, la politique d&#8217;ouverture de Microsoft, héritage vs composition, Codeplex, et j&#8217;en oublie pas mal.</p>
<p>Si on peut considérer qu&#8217;il s&#8217;agit d&#8217;un début modeste, c&#8217;est plus à cause du nombre restreint de participants que du manque de sujets. Du coup, j&#8217;ai assez hâte de voir ce que peuvent donner les rencontres de ce type lorsqu&#8217;elles regroupent plus de <strike>monde</strike> passionnés. Je suis heureux d&#8217;avoir fait la connaissance de Rob, et impatient de pouvoir rencontrer d&#8217;autres personnes aussi intéressantes avec qui échanger et de qui apprendre.</p>
<p>Je vous renouvelle donc mon invitation : n&#8217;hésitez pas à venir faire un tour à la prochaine rencontre, et n&#8217;hésitez pas non plus à faire passer le mot autour de vous. Il existe également un <a href="http://groups.google.com/group/parisaltnet">groupe de discussion</a> auquel vous pouvez participer, et où vous trouverez en temps et en heure toutes les infos relatives à l&#8217;organisation des rencontres ALT.NET Parisiennes.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/100/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/100/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/100/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=100&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/07/04/altnet-en-france-rencontre-parisienne-3/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/07/foule.jpg" medium="image" />
	</item>
		<item>
		<title>Codingly Visual Studio Theme Beta 1</title>
		<link>http://codingly.com/2008/06/25/codingly-visual-studio-theme-beta-1/</link>
		<comments>http://codingly.com/2008/06/25/codingly-visual-studio-theme-beta-1/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 21:29:54 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=83</guid>
		<description><![CDATA[Les développeurs passent souvent du temps à configurer et personnaliser leur environnement de travail (système, outils, etc.). On peut même croire parfois qu&#8217;ils en font trop.
J&#8217;en fais sans doute trop, mais peu me chaut. Après tout c&#8217;est mon environnement de travail.
Aujourd&#8217;hui je vous donne un aperçu du thème que j&#8217;utilise dans Visual Studio. En fait [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Les développeurs passent souvent du temps à configurer et personnaliser leur environnement de travail (système, outils, etc.). On peut même croire parfois qu&#8217;ils en font trop.</p>
<p>J&#8217;en fais sans doute trop, mais peu me chaut. Après tout c&#8217;est <strong>mon</strong> environnement de travail.</p>
<p>Aujourd&#8217;hui je vous donne un aperçu du thème que j&#8217;utilise dans Visual Studio. En fait je le rends même disponible en téléchargement, bien que je ne sache pas vraiment s&#8217;il s&#8217;agit d&#8217;un cadeau. Il est basé sur l&#8217;excellente font de Damien Guard : <a href="http://damieng.com/blog/2008/05/26/envy-code-r-preview-7-coding-font-released">Envy Code R</a> et c&#8217;est un <em>grey background theme</em>. Pour ceux qui codent en plein écran, c&#8217;est assez reposant.<br />
<span id="more-83"></span></p>
<h3>Aperçu C#</h3>
<p><img src="http://romainverdier.files.wordpress.com/2008/06/codinglytheme1.png" alt="Codingly Theme C#" /></p>
<h3>Aperçu XML</h3>
<p><img src="http://romainverdier.files.wordpress.com/2008/06/codinglytheme2.png" alt="Codingly Theme XML" /></p>
<h3>Aperçu ASP.NET</h3>
<p><img src="http://romainverdier.files.wordpress.com/2008/06/codinglytheme3.png" alt="Codingly Theme ASP.NET" /></p>
<h3>Aperçu CSS</h3>
<p><img src="http://romainverdier.files.wordpress.com/2008/06/codinglytheme5.png" alt="Codingly Theme CSS" /></p>
<h3>Aperçu SQL</h3>
<p><img src="http://romainverdier.files.wordpress.com/2008/06/codinglytheme4.png" alt="Codingly Theme SQL" /></p>
<p>Les screenshots ne rendent pas vraiment hommage au thème, je conseille donc aux plus courageux de l&#8217;essayer directement. C&#8217;est une tentative modeste conçue pour fonctionner avec Resharper sur des projets C#. Pas mal de petits trucs <strong>moches</strong> peuvent apparaitre si vous essayez autre chose.</p>
<p>Notez au passage que la font utilisée (<em>Envy Code R VS.ttf</em>) permet d&#8217;avoir de l&#8217;italique dans Visual Studio, ce qui est impossible par défaut. En effet, lors du paramétrage des polices et couleurs, Visual Studio permet uniquement l&#8217;utilisation du gras. La version d&#8217;Envy Code R sus-citée trompe Visual Studio en dessinant ses caractères en italique lorsqu&#8217;on les lui demande en gras. Il suffit donc de cocher la case <em>bold</em> dans Visual Studio pour utiliser l&#8217;italique, hourra.</p>
<p><strong>Téléchargements :</strong></p>
<ol>
<li><a href="http://damieng.com/blog/2008/05/26/envy-code-r-preview-7-coding-font-released">Envy Code R (preview 7)</a> de Damien Guard</li>
<li><a href="http://sd-1.archive-host.com/membres/up/673422638344066/Codingly/VisualStudioThemes/codinglybeta1.zip">Codingly Visual Studio Theme Beta 1</a></li>
</ol>
<p>Commentaires, remarques et suggestions sont bienvenus.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/83/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/83/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=83&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/06/25/codingly-visual-studio-theme-beta-1/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/codinglytheme1.png" medium="image">
			<media:title type="html">Codingly Theme C#</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/codinglytheme2.png" medium="image">
			<media:title type="html">Codingly Theme XML</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/codinglytheme3.png" medium="image">
			<media:title type="html">Codingly Theme ASP.NET</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/codinglytheme5.png" medium="image">
			<media:title type="html">Codingly Theme CSS</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/codinglytheme4.png" medium="image">
			<media:title type="html">Codingly Theme SQL</media:title>
		</media:content>
	</item>
		<item>
		<title>Lettre ouverte à Microsoft à propos d&#8217;Entity Framework</title>
		<link>http://codingly.com/2008/06/23/lettre-ouverte-a-microsoft-a-propos-dentity-framework/</link>
		<comments>http://codingly.com/2008/06/23/lettre-ouverte-a-microsoft-a-propos-dentity-framework/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 13:33:33 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[ALT.NET]]></category>

		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=77</guid>
		<description><![CDATA[David Laribee a laissé un message sur le groupe de discussion ALT.NET, indiquant que plusieurs personnes avaient travaillé à la rédaction d&#8217;une lettre ouverte à Microsoft, au sujet de sa solution ORM en devenir : Entity Framework.
Cette lettre, qui prend forme d&#8217;une pétition, a pour but d&#8217;attirer l&#8217;attention sur les principales faiblesses du framework. Il [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://codebetter.com/blogs/david_laribee/">David Laribee</a> a laissé un message sur le <a href="http://tech.groups.yahoo.com/group/altdotnet/">groupe de discussion ALT.NET</a>, indiquant que plusieurs personnes avaient travaillé à la rédaction d&#8217;une lettre ouverte à Microsoft, au sujet de sa solution ORM en devenir : <a href="http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx">Entity Framework</a>.</p>
<p>Cette lettre, qui prend forme d&#8217;une pétition, a pour but d&#8217;attirer l&#8217;attention sur les principales faiblesses du framework. Il ne s&#8217;agit pas d&#8217;une condamnation, mais plutôt d&#8217;une synthèse argumentée qui tente de regrouper les critiques ayant mobilisé le plus de voix au cours des derniers mois.<br />
<span id="more-77"></span><br />
Si vous pensez que les remarques sont pertinentes, et gagneraient à être considérées par le géant, alors vous pouvez laisser votre signature :</p>
<p><a href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/">ADO.NET Entity Framework vote of no confidence</a></p>
<blockquote>
<ul>
<li>Inordinate focus the data aspect of entities leads to degraded entity architectures</li>
<li>Excess code needed to deal with lack of lazy loading</li>
<li>Shared, canonical model contradicts software best practices</li>
<li>Lack of persistence ignorance causes business logic to be harder to read, write, and modify, causing development and maintenance costs to increase at an exaggerated rate</li>
<li>Excessive merge conflicts with source control in team environments</li>
</ul>
</blockquote>
<p>Toutefois, sachez que Microsoft est déjà à l&#8217;écoute, comme en atteste <a href="http://blogs.msdn.com/dsimmons/archive/2008/06/03/dp-advisory-council.aspx">un post de Danny Simmons</a> (de l&#8217;équipe ADO.NET). On y apprend qu&#8217;un <em>concile consultatif</em> aura lieu en Juillet pour faire le point sur les récentes productions de l&#8217;équipe <em>Data Programmability</em> chez Microsoft : Entity Framework, LINQ to SQL, ADO.NET Data Services, etc. Plusieurs personnalités de la communauté seront invitées (et consultées, donc), parmi lesquelles Martin Fowler, Eric Evans ou encore Jimmy Nilsson.</p>
<p>On peut donc douter de l&#8217;impact d&#8217;une telle pétition dans un ce contexte. Je trouve pour ma part qu&#8217;il s&#8217;agit d&#8217;un bon résumé, dont la lecture ne peut qu&#8217;être instructive.</p>
<div class="post-edited-notification">
<strong>Edit : </strong><br />
Une nouvelle annonce : Hier a commencé le développement de la version 2.0 de l&#8217;Entity Framework. Tim Mallalieu, Program Manager, indique sur <a href="http://blogs.msdn.com/efdesign/archive/2008/06/23/transparency-in-the-design-process.aspx">un nouveau blog</a> que le design de cette nouvelle version sera <em>transparent</em>. Reste à voir ce que ça va donner, mais c&#8217;est toujours bon signe.
</div>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/77/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/77/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=77&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/06/23/lettre-ouverte-a-microsoft-a-propos-dentity-framework/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>
	</item>
		<item>
		<title>Etes-vous ALT.NET ?</title>
		<link>http://codingly.com/2008/06/18/etes-vous-altnet/</link>
		<comments>http://codingly.com/2008/06/18/etes-vous-altnet/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 22:15:55 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Annonce]]></category>

		<category><![CDATA[ALT.NET]]></category>

		<guid isPermaLink="false">http://codingly.com/?p=74</guid>
		<description><![CDATA[Si vous avez l&#8217;habitude de lire les blogs nord-américains de la communauté .NET, vous avez très certainement déjà rencontré un post traitant du sujet, ou au moins y faisant allusion. Il est même probable que vous sachiez parfaitement en quoi consiste le mouvement ALT.NET. Si vous n&#8217;avez pas l&#8217;habitude de trainer sur ces blogs et [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><img src="http://romainverdier.files.wordpress.com/2008/06/altdotnet.png?w=125&h=159" alt="" width="125" height="159" class="alignright" />Si vous avez l&#8217;habitude de lire les blogs nord-américains de la communauté .NET, vous avez très certainement déjà rencontré un post traitant du sujet, ou au moins y faisant allusion. Il est même probable que vous sachiez parfaitement en quoi consiste le mouvement <strong>ALT.NET</strong>. Si vous n&#8217;avez pas l&#8217;habitude de trainer sur ces blogs et que vous avez tout de même entendu parler de la communauté ALT.NET, c&#8217;est bon signe.</p>
<p>Malheureusement, cela fait de vous une exception. En France, ALT.NET reste globalement très méconnu.<br />
<span id="more-74"></span></p>
<h3>Que signifie être ALT.NET ?</h3>
<p>Il existe déjà de bons posts qui décrivent le mouvement, je pense donc pouvoir me contenter ici de paraphraser approximativement <strong>David Laribee</strong> qui est en quelque sorte l&#8217;initiateur du mouvement :</p>
<blockquote><p>
Que signifie être ALT.NET ? En quelques mots :</p>
<ol>
<li>Vous êtes un développeur .NET qui a l&#8217;habitude d&#8217;utiliser ce qui fonctionne, mais qui garde un œil ouvert en permanence pour découvrir des moyens de faire mieux.</li>
<li>Vous êtes capable de regarder au delà des dogmes Microsoft pour vous inspirer du meilleur de chaque communauté : Open Source, Agile, Java, Ruby, etc.</li>
<li>Vous vous satisfaites rarement du statu quo. Les choses peuvent toujours être mieux exprimées, plus élégantes et simples, plus évolutives, de meilleure qualité, etc.</li>
<li>Vous reconnaissez les avantages et l&#8217;utilité des outils, mais vous savez que ce qui compte vraiment réside dans les principes et la connaissance. Les meilleurs outils sont ceux qui tirent partie de ce savoir, et qui encouragent la mise en œuvre des principes.</li>
</ol>
</blockquote>
<p>Je vous invite également à consulter les liens suivants, qui devraient vous permettre d&#8217;avoir une bonne idée de ce qu&#8217;est ce mouvement, et peut-être même de répondre à la question initiale :</p>
<ul>
<li><a href="http://laribee.com/blog/2007/04/10/altnet/">Post original</a> de David Laribee</li>
<li><a href="http://altdotnet.org/">Le site</a> ALT.NET</li>
<li><a href="http://altnetpedia.com/">AltNetPedia</a>, le wiki ALT.NET</li>
<li><a href="http://msdn.microsoft.com/en-us/magazine/cc337902.aspx">Présentation d&#8217;ALT.NET</a> par Jeremy D.Miller sur MSDN Magazine</li>
<li><a href="http://martinfowler.com/bliki/AltNetConf.html">Article</a> de Martin Fowler au sujet de la première conférence ALT.NET</li>
<li><a href="http://www.insideit.fr/post/2008/06/12/Microsoft-et-AltNet">Article</a> de Laurent Capin</li>
</ul>
<h3>ALT.NET en pratique</h3>
<p>Il faut bien comprendre qu&#8217;ALT.NET n&#8217;a pas pour but de créer des développeurs .NET d&#8217;un nouveau type.</p>
<p>Il s&#8217;agit simplement d&#8217;un tag qui permet de désigner l&#8217;ensemble des développeurs .NET qui n&#8217;embrassent pas sans discernement les outils, les préceptes et les modèles de développement provenant de Microsoft. Etre ALT.NET ne signifie pas être anti-Microsoft, mais plutôt être capable de prendre du recul et d&#8217;exploiter pleinement la plateforme .NET en ayant un regard critique et objectif sur les différentes solutions et méthodes qui proviennent ou non de Microsoft, qui proviennent ou non du monde .NET.</p>
<p>Un développeur ALT.NET est capable de choisir une solution alternative, si cette dernière est meilleure que la solution <em>officielle</em>. Et c&#8217;est justement parce qu&#8217;il est assez terrible de parler de solution <em>officielle</em> que la communauté ALT.NET cherche à se faire entendre, et à promouvoir par la même occasion un certain nombre de bonnes pratiques, de modèles et d&#8217;outils qui ne font pas forcément partie du courant Microsoft.</p>
<p>Un développeur revendiquant l&#8217;appartenance à la communauté ALT.NET est souvent un développeur :</p>
<ul>
<li>Qui ne se limite pas au Data Driven Design, et qui est familier avec l&#8217;OOP, les patterns, le Domain Driven Design, l&#8217;IoC, la SoC, etc.</li>
<li>Qui a eu l&#8217;occasion de profiter de la puissance de certains outils et frameworks tiers comme Castle, NHibernate, Spring.NET, StructureMap, NUnit, RhinoMocks, Selenium, NDepend, Resharper, etc.</li>
<li>Qui est habitué aux <a href="http://en.wikipedia.org/wiki/Version_control_system">VCS</a> et qui ne pourrait plus travailler sur un projet sans solution d&#8217;intégration continue.</li>
<li>Qui est séduit par les méthodes agiles, qui comprend l&#8217;intérêt du TDD et du refactoring.</li>
<li>Qui aime bien .NET</li>
</ul>
<p>Ce ne sont que des exemples, évidemment, et la-liste-n&#8217;est-pas-exhaustive. En résumé, il s&#8217;agit d&#8217;un développeur ouvert, pragmatique et curieux, soucieux de développer des solutions de qualité le plus facilement possible. Vous pouvez correspondre à l&#8217;esprit ALT.NET sans même savoir qu&#8217;ALT.NET existe. D&#8217;ailleurs, bien avant que le mouvement ait un nom, de nombreuses communautés étaient déjà fidèles aux mêmes principes. Je pense notamment à celle de <a href="http://www.dotnetguru.org/">dotnetguru.org</a>, littéralement tractée par plusieurs personnes de talent dont le discours et les initiatives ont toujours été très similaires à ceux des figures éminentes de la communauté ALT.NET actuelle.</p>
<h3>Et le mouvement s&#8217;organise à Paris !</h3>
<p>Suite à une initiative de <a href="http://www.strangelights.com/blog/archive/2008/04/26/1612.aspx">Robert Pickering</a>, déjà deux rencontres ALT.NET françaises ont eu lieu à Paris. La prochaine est déjà prévue :</p>
<p><em><strong>Mercredi 2 Juillet, 20H00</strong><br />
Le Manoir<br />
34, Boulevard Haussmann<br />
75009 PARIS</em></p>
<p>J&#8217;essaierai d&#8217;y être, et je vous invite vraiment à en faire de même, ne serait-ce que par curiosité. Si vous ne pouvez vous déplacer, que vous êtes indisponible ce jour là ou que vous êtes encore un peu trop timide, il y a toujours le groupe de discussion <a href="http://groups.google.com/group/parisaltnet">Paris ALT.NET</a> sur Google Groups qui vous permettra de rester informé et éventuellement d&#8217;échanger autour du sujet. N&#8217;hésitez pas non plus à suivre le blog de <a href="http://www.thedotnetfrog.fr/2008/04/30/altnet-premiere-rencontre-francaise/">Julien</a> qui soutient activement l&#8217;initiative.</p>
<p>Même si beaucoup ne jurent encore que par les datasets, sachez que la communauté .NET est en train d&#8217;évoluer, et que les valeurs portées par le mouvement ALT.NET commencent même à être reconnues par Microsoft. Tout le monde a quelque chose à y gagner&#8230;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/74/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/74/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/74/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=74&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/06/18/etes-vous-altnet/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/altdotnet.png?w=125" medium="image" />
	</item>
		<item>
		<title>Une astuce volée à Jon Skeet</title>
		<link>http://codingly.com/2008/06/18/une-astuce-volee-a-jon-skeet/</link>
		<comments>http://codingly.com/2008/06/18/une-astuce-volee-a-jon-skeet/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 10:46:28 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=75</guid>
		<description><![CDATA[Si certains d&#8217;entre vous trouvent pénible le fait de devoir s&#8217;assurer qu&#8217;un évènement est non null avant de le lancer, voici une idée :
Profitez de la contravariance sur les delegates et initialisez votre event de la sorte :



public event MyEventHandler MyEvent = delegate{};

Ca vous permettra d&#8217;être sûr qu&#8217;il y a au moins un handler lorsque [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Si certains d&#8217;entre vous trouvent pénible le fait de devoir s&#8217;assurer qu&#8217;un évènement est non null avant de le lancer, voici une idée :</p>
<p>Profitez de la <a href="http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)">contravariance</a> sur les delegates et initialisez votre event de la sorte :</p>
<p><span id="more-75"></span></p>
<pre name="code" class="csharp">

public event MyEventHandler MyEvent = delegate{};
</pre>
<p>Ca vous permettra d&#8217;être sûr qu&#8217;il y a au moins un handler lorsque vous voudrez déclencher <code>MyEvent</code>, et vous n&#8217;aurez donc plus besoin d&#8217;écrire par exemple :</p>
<pre name="code" class="csharp">

if(MyEvent != null)
{
    MyEvent(this, new MyEventHandler(someParam));
}
</pre>
<p>Vous pourrez directement lancer l&#8217;événement sans tester :</p>
<pre name="code" class="csharp">

MyEvent(this, new MyEventHandler(someParam));
</pre>
<p>Notez que le handler (inutile) ajouté via le variable initializer à l&#8217;event ne pourra plus être retiré, ce qui peut ici être vu comme une sécurité. Cependant, l&#8217;avantage de cette astuce est à relativiser :</p>
<ul>
<li>Il y a un coût (négligeable la plupart du temps) au niveau des performances.</li>
<li>Il est parfois plus judicieux d&#8217;écrire une méthode chargée d&#8217;encapsuler le test de non nullité, et qui pourra souvent être invoquée plus simplement que l&#8217;événement lui-même.</li>
</ul>
<p>Par exemple :</p>
<pre name="code" class="csharp">

private void FirePropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
</pre>
<p>A l&#8217;appel, on se retrouve avec :</p>
<pre name="code" class="csharp">

FirePropertyChanged(&quot;Firstname&quot;);
</pre>
<p>Contre :</p>
<pre name="code" class="csharp">

PropertyChanged(this, new PropertyChangedEventArgs(&quot;Firstname&quot;));
</pre>
<p><strong>Source </strong>: <a href="http://www.amazon.fr/C-Depth-What-need-master/dp/1933988363">C# in Depth: What you need to master C# 2 and 3</a>, de Jon Skeet.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/75/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/75/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/75/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=75&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/06/18/une-astuce-volee-a-jon-skeet/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>
	</item>
		<item>
		<title>Ordinateur, je t&#8217;aime à nouveau</title>
		<link>http://codingly.com/2008/06/16/ordinateur-je-taime-a-nouveau/</link>
		<comments>http://codingly.com/2008/06/16/ordinateur-je-taime-a-nouveau/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 22:06:13 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[Annonce]]></category>

		<category><![CDATA[Hardware]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=69</guid>
		<description><![CDATA[UPS est passé vendredi matin pour livrer deux gros cartons chez moi. L&#8217;un contenant mon nouveau PC monté, l&#8217;autre avec toutes les boites des composants ainsi que les pièces et accessoires non utilisés. Pour info, j&#8217;avais passé commande online samedi matin. Cela signifie qu&#8217;en moins de 5 jours, ma commande a été préparée, montée, et [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>UPS est passé vendredi matin pour livrer deux gros cartons chez moi. L&#8217;un contenant <a href="http://codingly.com/2008/06/08/dell-xps-vs-ultimate-developer-rig/">mon nouveau PC monté</a>, l&#8217;autre avec toutes les boites des composants ainsi que les pièces et accessoires non utilisés. Pour info, j&#8217;avais passé commande online samedi matin. Cela signifie qu&#8217;en moins de 5 jours, ma commande a été préparée, montée, et livrée. Je pense que la performance est saluable : merci <a href="http://www.materiel.net/home.html">materiel.net</a>.</p>
<p>Je vais essayer de vous livrer mes premières impressions, à tiède.</p>
<p><span id="more-69"></span></p>
<h3>Les petits gars de materiel.net</h3>
<p>Non, mon fils ne travaille pas chez materiel.net, et non, je n&#8217;ai pas d&#8217;actions dans la boite. J&#8217;ai juste envie de partager ma satisfaction. Car non seulement les petits gars de materiel.net vont vite, mais ils font également du bon travail. Je vous avais parlé de l&#8217;<a href="http://www.materiel.net/ctl/Accessoires_PC/989-Montage.html">option montage</a>. Au final :</p>
<ul>
<li>Un message collé sur le boitier indique qu&#8217;en raison de sa taille et de ses 770 gr, le <a href="http://www.materiel.net/ctl/Radiateurs_processeurs/34669-NH_U12P.html">ventirad CPU</a> a été retiré pour le transport, et qu&#8217;il faut donc le remettre en place avant de démarrer la machine. De toute façon, et c&#8217;est précisé aussi, le boitier est bourré de papier à bulles. Notez bien que le support du ventirad est déjà en place, il ne reste donc plus qu&#8217;à ajouter une pointe de pâte thermique, et fixer le radiateur à l&#8217;aide de deux vis.</li>
<li>Les différents câbles sont tous regroupés et fixés, ils passent tous au bon endroit. L&#8217;intérieur du boitier est plus clean que ce que j&#8217;imaginais possible. L&#8217;alimentation modulaire y est sans doute pour quelque chose.</li>
<li>Comme je l&#8217;avais demandé, le ventirad original de la carte graphique a été remplacé par le <a href="http://www.materiel.net/ctl/Radiateurs_cartes_graphiques/32375-VF1000_LED.html">Zalman VF 1000LED</a>. Là encore, c&#8217;est niquel, le <a href="http://www.materiel.net/ctl/Divers3/2013-Fan_Mate_2.html">fan mate</a> a été ajouté et intelligemment fixé au boitier de façon à être directement accessible.</li>
<p>	<img src="http://romainverdier.files.wordpress.com/2008/06/mess.jpg" class="alignright image-border" />
<li>Les disques durs sont bien rangés dans leur compartiment, et encore une fois les cables SATA et d&#8217;alimentation se font oublier.</li>
<li>Le bios de la carte mère a été mis à jour.</li>
<li>Les deux disques de 250 Go ont bien été configurés en RAID 0.</li>
<li>Durant le montage du PC, on m&#8217;a averti que les barrettes de mémoire choisies étaient défectueuses, et qu&#8217;il s&#8217;agissait des dernières disponibles. En 3 mails échangés et 20 min, le problème a été réglé : j&#8217;ai choisi un <a href="http://www.materiel.net/ctl/PC_de_bureau2/32388-Kit_Extreme3_2_x_1_Go_PC12800_HZ.html">autre kit G.Skill</a>, un avoir correspondant au prix de l&#8217;ancien a été généré puis directement utilisé pour financer le nouveau. J&#8217;ai pu suivre tout ça en direct depuis mon compte utilisateur.</li>
<li>Absolument toutes les boites, tous les CD, toutes les pièces, tous les accessoires non utilisés sont envoyés. Ca parait normal, mais il est tout de même bon de le signaler.</li>
</ul>
<p>Bref, pour 30 euros :</p>
<ul>
<li>J&#8217;ai gagné une demie-journée de bricolage.</li>
<li>J&#8217;ai évité un aller-retour SAV pour mes barrettes mémoire.</li>
<li>Ma configuration a été mieux monté que si je m&#8217;en été occupé moi même, aussi perfectionniste et méticuleux que je puisse être.</li>
<li>La configuration a été réellement testée, et pré-configurée.</li>
</ul>
<p>Je vous conseille donc la prestation.</p>
<p>Il y a juste un truc chiant (et facultatif) : le décollage de l&#8217;autocollant &#8220;materiel.net&#8221; sur la façade du P182. C&#8217;est ce qui m&#8217;a pris le plus de temps.</p>
<h3>Le silence</h3>
<p>Peut-être vous en souvenez-vous, je cherchais à avoir une configuration silencieuse. D&#8217;où l&#8217;alimentation de luxe, le boitier Antec, et les deux ventirads d&#8217;overclocker. Ca pèse sur le budget, donc il est assez légitime d&#8217;avoir une certaine appréhension lorsqu&#8217;on fait booter la machine pour la première fois.</p>
<p>Personne ne veut d&#8217;un aspirateur à 1500 €. (<a href="http://www.laredoute.fr/vente-aspirateur-baby-dyson-dc22-motorhead.aspx?productid=324148518&amp;documentid=201208&amp;categoryid=0&amp;single=true&amp;hasnext=0&amp;hasprev=1&amp;direct=false&amp;pagesize=12&amp;prodcolor=1">Ni même à 500€</a>)</p>
<p><a href="http://romainverdier.files.wordpress.com/2008/06/pcbig.jpg"><img src="http://romainverdier.files.wordpress.com/2008/06/pcbig.jpg?w=300" alt="" width="300" height="287" class="alignleft size-medium wp-image-72" /></a></p>
<p>Lorsqu&#8217;on cherche à construire une configuration silencieuse, il faut commencer par choisir un boitier digne de ce nom, et non pas une pauvre boite en tôle mal isolée. Ensuite, il faut trouver une alimentation discrète, qui ne se prendra pas pour un réacteur dès qu&#8217;on lui demandera de sortir plus de 200 Watts. Quant au reste, tout est lié aux ventilateurs. Les systèmes de refroidissement fanless pour les cartes graphiques et les processeurs sont souvent peu efficaces, et parfois inexistants.</p>
<p>J&#8217;ai donc choisi un gros ventirad pour remplacer celui fourni par Intel avec le CPU, et un autre gros ventirad pour remplacer celui de la GeForce. L&#8217;idée était de pouvoir profiter du meilleur pouvoir dissipateur de ces radiateurs pour réduire sans risque la vitesse de rotations de leurs ventilateurs.</p>
<p>Et ça fonctionne plutôt bien.</p>
<p>Je n&#8217;ai pas eu besoin de réguler la vitesse du Noctua, il est quasiment inaudible à 1300 tr/min. J&#8217;ai configuré le ventilateur de la carte graphique pour qu&#8217;il tourne au minimum, ce qui est largement suffisant. Et on obtient un PC silencieux. Certes, il n&#8217;est pas <strong>complètement</strong> silencieux (ce n&#8217;est pas un iMac), mais il se fait oublier sans problème même lorsque l&#8217;environnement est calme. Notez que les ventilateurs 120 mm fournis avec le P182 (il y en a 3) sont assez bruyants, et qu&#8217;en attendant de les remplacer, je les fais tourner au minimum.</p>
<p>Avec ces réglages, les températures sont les suivantes, en moyenne :</p>
<ul>
<li>CPU (Idle) = 41°C</li>
<li>CPU (100%) = 55°C</li>
<li>GPU (Idle) = 42°C</li>
<li>GPU (100%) = 60°C</li>
<li>Carte mère = 36°C</li>
</ul>
<h3>Les performances</h3>
<p>Peut-être vous en souvenez-vous, je cherchais à avoir une configuration performante. D&#8217;où le Q9300, la DDR3 1600Mhz, la 8800 GT et les Barracuda ES.2 en RAID 0. Là, j&#8217;avais déjà moins d&#8217;appréhension. Généralement, on peut assez facilement deviner quelle sera la puissance d&#8217;un PC en fonction des quatre composants suivants :</p>
<ul>
<li>Processeur</li>
<li>Mémoire</li>
<li>Carte Graphique</li>
<li>Disque dur</li>
</ul>
<p><img src="http://romainverdier.files.wordpress.com/2008/06/cinqneuf.png" class="alignnone" /></p>
<p>On est souvent tenté de faire des compromis quelque part. Jusqu&#8217;à présent, j&#8217;avoue que je faisais surtout attention au processeur et à la carte graphique en privilégiant pour le reste la quantité à la qualité. Hop, 2 barrettes Samsung pas trop chères, et un bon gros disque 7200 tr/min milieu de gamme.</p>
<p>C&#8217;est mal. Les performances d&#8217;un disque dur, qu&#8217;elles soient bonnes ou médiocres, vont vraiment influencer celles de la configuration complète. Vous vous en rendrez surtout compte si vous êtes un développeur. De même, choisir 2Go de mémoire de marque, c&#8217;est très souvent bien mieux que d&#8217;acheter 4 Go de <a href="http://www.materiel.net/ctl/PC_de_bureau2/38347-DDRII_2_Go_PC6400.html">noname</a>. </p>
<p>Enfin&#8230; Je ne vais pas m&#8217;improviser Guru Hardware. Je laisse quelques indicateurs conclure le post :</p>
<ul>
<li>Vista note donc ma configuration 5.9</li>
<li>Il me faut 19 secondes pour faire un rebuild all sur la solution contenant les 60 (soixante) projets de <a href="http://sharpdevelop.net/OpenSource/SD/Download/">SharpDevelop</a>.</li>
<li>19 secondes, c&#8217;est également le temps qu&#8217;il me faut pour extraire d&#8217;une archive rar un fichier unique d&#8217;1.4 Go</li>
<li>Unreal Tournament 3, en 1280*1024, détails au maximum : +60 fps garanties.</li>
<li>Crysis, même résolution, very high = 20/25 fps, high = 40/45 fps.</li>
<li>La première ouverture de Visual Studio 2005 ou 2008 prend une ou deux secondes. Les ouvertures suivantes sont quasi-instantanées.</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/69/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/69/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=69&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/06/16/ordinateur-je-taime-a-nouveau/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/mess.jpg" medium="image" />

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/pcbig.jpg?w=300" medium="image" />

		<media:content url="http://romainverdier.files.wordpress.com/2008/06/cinqneuf.png" medium="image" />
	</item>
		<item>
		<title>Dell XPS vs Ultimate Developer Rig</title>
		<link>http://codingly.com/2008/06/08/dell-xps-vs-ultimate-developer-rig/</link>
		<comments>http://codingly.com/2008/06/08/dell-xps-vs-ultimate-developer-rig/#comments</comments>
		<pubDate>Sun, 08 Jun 2008 22:10:44 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
		
		<category><![CDATA[Posts]]></category>

		<category><![CDATA[Annonce]]></category>

		<category><![CDATA[Hardware]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=64</guid>
		<description><![CDATA[Dernièrement, je vous expliquais que je devais absolument changer mon PC, et que j&#8217;avais sérieusement envisagé de commander un Dell XPS. Ca me semblait être une idée honnête puisqu&#8217;à l&#8217;époque je voulais éviter de perdre du temps à choisir mes pièces et à monter un DIY PC.
Mais j&#8217;ai été piégé. Heureusement.
Je pensais ne plus être [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Dernièrement, je vous expliquais que je devais <a href="http://codingly.com/2008/05/28/je-ne-taime-plus-ordinateur/">absolument changer mon PC</a>, et que j&#8217;avais sérieusement envisagé de commander un Dell XPS. Ca me semblait être une idée honnête puisqu&#8217;à l&#8217;époque je voulais éviter de perdre du temps à choisir mes pièces et à monter un <a href="http://fr.wikipedia.org/wiki/Do_it_yourself">DIY</a> PC.</p>
<p>Mais j&#8217;ai été piégé. Heureusement.</p>
<p>Je pensais ne plus être l&#8217;étudiant geek qui bricole son PC. J&#8217;avais raison. Je pensais que je pouvais faire confiance à un constructeur et sélectionner une configuration toute faite sans me prendre la tête. J&#8217;avais tort.<br />
<span id="more-64"></span><br />
Il faut dire que chez Dell - ce n&#8217;est pas le cas de tous les constructeurs - on peut déjà pseudo-configurer la machine qui nous intéresse avant de la commander. Du coup, on se prend un peu au jeu. On commence à comparer le prix des pièces, à étudier les différentes configurations RAID, à regarder les reviews sur le net pour savoir ce que vaut la GeForce FX 9900 GTS Utra 2 SilentMax de Teksys, et on finit par penser que les options du configurateur qui nous donnaient une bonne impression de maitrise constituent en fait une sacrée limitation. Le composant qu&#8217;il vous faut, <strong>le</strong> composant, Dell ne le propose pas. Pire, pour certaines pièces maitresses de la configuration, non seulement vous n&#8217;avez aucun contrôle, mais en plus la visibilité dont vous disposez et relativement restreinte :</p>
<blockquote><p><strong>Alimentation</strong><br />
375 W (standard), 425 W (avec carte graphique nVidia GeForce 8800GTX)</p></blockquote>
<p>Ce que vous saviez avant, vous vous en souvenez d&#8217;un coup : pour un budget de 55000 roubles, le meilleur PC que vous puissiez avoir est celui que vous concevez pièce par pièce. Et vous oubliez le Dell XPS et sa DDR2 à 600 Mhz.</p>
<p>J&#8217;ai donc passé commande sur <a href="http://www.materiel.net/home.html">materiel.net</a> de toutes les pièces nécessaires à la construction de mon <a href="http://www.hanselman.com/blog/TheCodingHorrorUltimateDeveloperRigThrowdownPart1.aspx">Ultimate Developer Rig</a>. Puisque je ne suis plus l&#8217;étudiant geek qui bricole son PC j&#8217;ai aussi choisi l&#8217;option <a href="http://www.materiel.net/ctl/Accessoires_PC/989-Montage.html">montage</a> : si quelqu&#8217;un détruit ma 8800 GT en y fixant un nouveau ventirad, autant que ce ne soit pas moi.</p>
<p>Je détaillerai mes choix dans un prochain post, et si UPS est passé d&#8217;ici là, j&#8217;en profiterai pour faire un petit point au niveau des performances, du silence, etc.</p>
<p>En attendant, voici les caractéristiques de la machine :</p>
<table>
<tr>
<td>
<img src="http://www.materiel.net/live/28080.100.100.jpg" alt="Boitier" />
</td>
<td>
<strong>Boitier :</strong><br />
<a href="http://www.materiel.net/ctl/Boitiers/29064-P182_noir_.html">Antec P182 Noir</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/25017.100.100.jpg" alt="Alimentation" />
</td>
<td>
<strong>Alimentation :</strong><br />
<a href="http://www.materiel.net/ctl/Alimentations/26734-HX_620W.html">Corsair HX 620 W</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/36007.100.100.jpg" alt="Carte Mère" />
</td>
<td>
<strong>Carte mère :</strong><br />
<a href="http://www.materiel.net/ctl/Socket_775/33706-P5E3_Deluxe_WiFi_AP_n.html">Asus P5E3 Deluxe/WiFi-AP@n</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/36056.100.100.jpg" alt="Processeur" />
</td>
<td>
<strong>Processeur :</strong><br />
<a href="http://www.materiel.net/ctl/Processeurs_socket_775/34782-Core_2_Quad_Q9300.html">Intel Core 2 Quad Q9300</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/36304.100.100.jpg" alt="Ventirad CPU" />
</td>
<td>
<strong>Radiateur CPU :</strong><br />
<a href="http://www.materiel.net/ctl/Radiateurs_processeurs/34669-NH_U12P.html">Noctua  NH-U12P</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/41160.100.100.jpg" alt="Mémoire" />
</td>
<td>
<strong>Mémoire :</strong><br />
<a href="http://www.materiel.net/ctl/PC_de_bureau2/38277-DDR3_2_x_1_Go_PC12800_PI_Series.html">G.Skill  DDR3 2 x 1 Go PC12800 (1600Mhz)</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/41353.100.100.jpg" alt="Carte Graphique" />
</td>
<td>
<strong>Carte graphique :</strong><br />
<a href="http://www.materiel.net/ctl/Cartes_graphiques/38438-GV_NX88T512HP.html">GeForce 8800 GT Gigabyte GV-NX88T512HP</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/33046.100.100.jpg" alt="Ventirad Carte Graphique" />
</td>
<td>
<strong>Ventirad GPU :</strong><br />
<a href="http://www.materiel.net/ctl/Radiateurs_cartes_graphiques/32375-VF1000_LED.html">Zalman VF1000-LED</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/34998.100.100.jpg" alt="Disque" />
</td>
<td>
<strong>Disques système :</strong><br />
<a href="http://www.materiel.net/ctl/Disques_durs_internes_SATA/34024-Barracuda_ES_2_S_ATA_250_Go_32_Mo.html">2x Seagate Barracuda ES.2 S-ATA - 250 Go - 32 Mo  ( en RAID 0)</a>
</td>
<tr>
<tr>
<td>
<img src="http://www.materiel.net/live/34998.100.100.jpg" alt="Disque" />
</td>
<td>
<strong>Disque données :</strong><br />
<a href="http://www.materiel.net/ctl/Disques_durs_internes_SATA/31702-Barracuda_7200_11_S_ATA_500_Go_32_Mo.html">Seagate Barracuda 7200.11 S-ATA - 500 Go - 32 Mo</a>
</td>
<tr>
</table>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/64/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/64/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&blog=3510695&post=64&subd=romainverdier&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/06/08/dell-xps-vs-ultimate-developer-rig/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/rverdier-128.jpg" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/28080.100.100.jpg" medium="image">
			<media:title type="html">Boitier</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/25017.100.100.jpg" medium="image">
			<media:title type="html">Alimentation</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/36007.100.100.jpg" medium="image">
			<media:title type="html">Carte Mère</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/36056.100.100.jpg" medium="image">
			<media:title type="html">Processeur</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/36304.100.100.jpg" medium="image">
			<media:title type="html">Ventirad CPU</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/41160.100.100.jpg" medium="image">
			<media:title type="html">Mémoire</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/41353.100.100.jpg" medium="image">
			<media:title type="html">Carte Graphique</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/33046.100.100.jpg" medium="image">
			<media:title type="html">Ventirad Carte Graphique</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/34998.100.100.jpg" medium="image">
			<media:title type="html">Disque</media:title>
		</media:content>

		<media:content url="http://www.materiel.net/live/34998.100.100.jpg" medium="image">
			<media:title type="html">Disque</media:title>
		</media:content>
	</item>
	</channel>
</rss>