<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>The World is mine &#187; .Net</title>
	<atom:link href="http://grozeille.com/tag/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://grozeille.com</link>
	<description>Just another Wordpress.com weblog</description>
	<lastBuildDate>Sat, 07 Jan 2012 12:00:31 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='grozeille.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>The World is mine &#187; .Net</title>
		<link>http://grozeille.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://grozeille.com/osd.xml" title="The World is mine" />
	<atom:link rel='hub' href='http://grozeille.com/?pushpress=hub'/>
		<item>
		<title>Episode 8: Mathias découvre COM</title>
		<link>http://grozeille.com/2011/04/19/episode-8-mathias-decouvre-com/</link>
		<comments>http://grozeille.com/2011/04/19/episode-8-mathias-decouvre-com/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 06:00:18 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[DotNetServer]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[corba]]></category>
		<category><![CDATA[DBus]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://grozeille.com/?p=514</guid>
		<description><![CDATA[Bonjour tout le monde, et merci de votre patience&#8230; Ça fait presque 5 mois que je n&#8217;ai pas blogué, et que j&#8217;ai interrompu ma série &#8220;Mathias découvre&#8230;&#8221; Comme j&#8217;en découvre tous les jours, j&#8217;ajouterai bien d&#8217;autres épisodes avant la conclusion finale, mais j&#8217;ai peur que ça dure une éternité En réalité, je voulais &#8220;jouer la [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=514&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bonjour tout le monde, et merci de votre patience&#8230;<br />
Ça fait presque 5 mois que je n&#8217;ai pas blogué, et que j&#8217;ai interrompu ma série &#8220;Mathias découvre&#8230;&#8221;<br />
Comme j&#8217;en découvre tous les jours, j&#8217;ajouterai bien d&#8217;autres épisodes avant la conclusion finale, mais j&#8217;ai peur que ça dure une éternité <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
En réalité, je voulais &#8220;jouer la montre&#8221; avec ces blogs, afin de stabiliser mon projet et lui trouver un nom sympathique. Mais je n&#8217;ai pas vraiment trouvé le temps d&#8217;y travailler, alors je vais &#8220;pousser l’oisillon hors du nid&#8221;, et j&#8217;ajusterai plus tard s&#8217;il ne vole pas très bien ;D</p>
<p>Je change de sujet par rapport aux précédents postes, et je m&#8217;attaque à un autre sujet épineux: la communication inter-processus.</p>
<p>Au début de ma vie professionnel, je n’ai pas commencé à travailler en .Net, mais en Delphi.</p>
<p>J’avoue que Delphi était séduisant. Avant .Net, c’était la manière la plus efficace de réaliser des applications Windows lourde avec un Designer d’interface unique. Et puis, n’oublions pas que l’inventeur du langage Delphi n’est autre que <a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg">Anders Hejlsberg</a>, qui fut embauché par Microsoft pour inventer C# !</p>
<p>Quand .Net prenait de plus en plus d’ampleur,  j’ai alors réussi à convaincre tout le monde de s&#8217;y mettre.<br />
Mais comme la migration devait se faire petit à petit, il fallait intégrer Delphi avec .Net.</p>
<p>Pour cela, j’ai découvert <a href="http://en.wikipedia.org/wiki/Component_Object_Model">COM</a>.<br />
COM est une technologie 100% Microsoft, mais qui se base sur les mêmes principes que Corba.<br />
COM permet de communiquer entre les applications, peu importe le langage. La communication se faisait en activant des services, à l’aide d’un contrat qui se rédigeait dans un langage indépendant du langage de compilation : IDL (Interface Definition Language).</p>
<p><a href="http://grozeille.files.wordpress.com/2010/11/0764549146fg08_16.jpg"><img class="aligncenter size-medium wp-image-515" title="0764549146fg08_16" src="http://grozeille.files.wordpress.com/2010/11/0764549146fg08_16.jpg?w=300&#038;h=194" alt="" width="300" height="194" /></a></p>
<p>C’était magique : on pouvait inclure un UserControl .Net dans une application Delphi existante ! On pouvait aussi appeler des services .Net depuis Delphi, et vis vers ça !</p>
<p>Les services étaient d’ailleurs enregistrés auprès de Windows, dans la base de registre. Donc, quand un programme Delphi demande un service qui répond à une interface, Windows se charge de le localiser (DLL ou EXE) de l’héberger dans un conteneur (dans le cas de l’EXE, il lance ce dernier, dans le cas de la DLL, il l’host dans DLLHOST.exe) et d’instancier le service pour qu’il puisse être utilisé.</p>
<p>Et ce n’est pas tout ! Il y avait aussi DCOM qui est la version distribué de COM. Cela veut dire que si la DLL n’est pas sur la machine actuelle, Windows se charge d’interroger les autres serveurs DCOM pour qu’ils instancient le service à distance ! Tout cela avec une couche de sécurité ultra complexe !</p>
<p>De plus, le langage IDL supporte les méthodes, les propriétés, les événements, les paramètres de type « out », l’héritage d’interfaces, la gestion des versions, etc.…</p>
<p>Si vous souhaiter exposer des services sous Windows, cette technologie semble la plus appropriée.</p>
<p>Dans le monde des serveurs J2EE, ce fût Corba, concurrent direct à COM, qui remplissait ce rôle.</p>
<p>Mais voila : COM est 100% Windows, 100% Natif (non managé) ce qui rend le pont COM-.Net peu performant.</p>
<p>Concernant CORBA, il existe bien des connecteurs pour .Net, mais pas de serveur CORBA 100% managé.<br />
De plus, CORBA est abandonné dans certains domaines à cause de sa lourdeur : les distributions Linux ont migré de CORBA à DBUS pour avoir aussi leur « équivalent à COM ». A noter que DBus existent en 100% .Net: <a href="http://www.ndesk.org/DBusSharp">http://www.ndesk.org/DBusSharp</a></p>
<p>Microsoft abandonne d’ailleurs COM pour sa technologie de communication phare : WCF.<br />
Avant WCF, Microsoft avait introduit une autre solution 100% .Net: .Net Remoting. Mais ce dernier était trop simple et a fini par être abandonné, même si c&#8217;est toujours la technologie par défaut pour communiquer inter-AppDomain.</p>
<p>Alors, que choisir comme technologie de communication et d’activation de service ? Point à Point ou par un intermédiaire (Bus/Broker)? Quel format de message/marshalling doit-on utiliser?</p>
<p>Pour ma part: COM n&#8217;est pas multi-plateforme, je ne suis pas convaincu par l&#8217;usine à gaz WCF, DBusSharp est trop bugué, .Net remoting est trop simple/limité&#8230; je reste un sur ma fin.</p>
<p>Mais entre temps, j&#8217;ai découvert le &#8220;Messaging&#8221; et la communication asynchrone, qui est parfaite pour un environnement distribué. On ne peut pas remplacer le RPC par le Messaging dans tous les cas, mais il a falloir que j&#8217;exploite cette voie.</p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/com/'>com</a>, <a href='http://grozeille.com/tag/corba/'>corba</a>, <a href='http://grozeille.com/tag/dbus/'>DBus</a>, <a href='http://grozeille.com/tag/wcf/'>WCF</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/514/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/514/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/514/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=514&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2011/04/19/episode-8-mathias-decouvre-com/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/11/0764549146fg08_16.jpg?w=300" medium="image">
			<media:title type="html">0764549146fg08_16</media:title>
		</media:content>
	</item>
		<item>
		<title>Episode 7 : Mathias découvre Unity+WPF+MVVM aux Techdays 2010</title>
		<link>http://grozeille.com/2010/11/25/episode-7-mathias-decouvre-unitywpfmvvm-aux-techdays-2010/</link>
		<comments>http://grozeille.com/2010/11/25/episode-7-mathias-decouvre-unitywpfmvvm-aux-techdays-2010/#comments</comments>
		<pubDate>Thu, 25 Nov 2010 21:07:07 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[DotNetServer]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[IOC]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[mvvm]]></category>
		<category><![CDATA[rcp]]></category>
		<category><![CDATA[unity]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://grozeille.com/?p=511</guid>
		<description><![CDATA[Je vous ai parlé de ma découverte de .Net dans l&#8217;épisode 6. J&#8217;ai constaté un gros contraste avec Java: j&#8217;avais l&#8217;impression que Java était compliqué (EJB et tout ça) et que .Net était simple. Cette simplicité n&#8217;est pas toujours positive, on peut même dire que Microsoft est &#8220;maudit&#8221; par ce fléau: rester attractif pour les développeurs débutants. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=511&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Je vous ai parlé de ma découverte de .Net dans l&#8217;<a href="http://grozeille.com/2010/11/13/episode-6-mathias-decouvre-net/">épisode 6</a>.<br />
J&#8217;ai constaté un gros contraste avec Java: j&#8217;avais l&#8217;impression que Java était compliqué (EJB et tout ça) et que .Net était simple.</p>
<p>Cette simplicité n&#8217;est pas toujours positive, on peut même dire que Microsoft est &#8220;maudit&#8221; par ce fléau: rester attractif pour les développeurs débutants.</p>
<p>En général, cela donne des frameworks &#8220;sales&#8221; avec un fort couplage du code métier avec les interfaces, impossible à tester unitairement bien sûr.</p>
<p>Pour pouvoir découpler tout cela, on distingue 3 couches:</p>
<ul>
<li>L&#8217;interface, appelée &#8220;view&#8221; ou &#8220;presenter&#8221;, c&#8217;est le moyen d&#8217;afficher l&#8217;information</li>
<li>La logique métier, appelée &#8220;model&#8221;, c&#8217;est ce que l&#8217;on va pouvoir tester à l&#8217;aide de tests unitaires</li>
<li>Les actions ou commandes, qui représente une action de l&#8217;interface par l&#8217;utilisateur qui va déclencher un traitement</li>
</ul>
<p>Mais quand on sépare les responsabilités en plusieurs objets, on se retrouve avec un nouveau problème : comment coupler les <span style="text-decoration:underline;">vues</span>, <span style="text-decoration:underline;">contrôleurs</span>, etc. ? Comment &#8220;broker&#8221; les <span style="text-decoration:underline;">actions </span>?</p>
<p>Il y a une solution à cela: l&#8217;<a href="http://en.wikipedia.org/wiki/Inversion_of_control">IOC</a>. On peut dire aussi que le<a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx"> Databinding</a> en est une autre.<br />
Si Microsoft avait un train de retard sur les Framework IOC, ils connaissaient néanmoins déjà le problème depuis un moment, puisqu&#8217;ils l&#8217;avaient en partie résolu dans <a href="http://msdn.microsoft.com/en-us/library/ff648747.aspx">CAB</a>.<br />
C’est donc sans surprise que Microsoft nous livre son framework d’IOC &#8220;officiel&#8221; basé sur l’existant de CAB : <a href="http://unity.codeplex.com/">Unity</a>.</p>
<p>A la sortie d&#8217;Unity, j&#8217;étais déjà tellement convaincu par Spring.net que je n&#8217;ai jamais adopté le framework de Microsoft. De plus, les alternatives OpenSources étaient  bien présentes: <a href="http://www.castleproject.org/container/">Castle Windsor</a>, <a href="http://ninject.org/">Ninject</a>, <a href="http://code.google.com/p/autofac/">Autofac</a>, etc.</p>
<p>A noter que les framework tel que CAB/RCP rendent vos clients lourds &#8220;extensibles&#8221;, ce qui veut dire qu&#8217;un plugin va pouvoir greffer de &#8220;vues&#8221; dans l&#8217;interface, et s&#8217;abonner aux &#8220;commandes&#8221;: chose tout à fait faisable avec de l&#8217;IOC.</p>
<p>Mais les frameworks IOC ne font pas tout, et ne suffisent pas à fournir une véritable architecture MVC pour client lourd, même s&#8217;ils peuvent nous y aider (<a href="http://grozeille.com/2010/11/13/episode-6-mathias-decouvre-net/">voir mon poste précédent</a>).</p>
<p>Pour résoudre le fléau du couplage fort entre l&#8217;interface et le code métier, Microsoft a sortie quelque chose de révolutionnaire: WPF et Silverlight!<br />
Avec la venue de WPF et Silverlight, la communauté .Net OpenSource a commencé à se pencher alors sur le problème du MVC pour les applications lourdes. Divers frameworks apparaissent alors, comme Prism: <a href="http://compositewpf.codeplex.com/">http://compositewpf.codeplex.com/</a></p>
<p style="text-align:center;"><a href="http://grozeille.files.wordpress.com/2010/11/compositewpfapp1.png"><img class="aligncenter" title="CompositeWpfApp1" src="http://grozeille.files.wordpress.com/2010/11/compositewpfapp1.png?w=300&#038;h=221" alt="" width="300" height="221" /></a></p>
<p><a href="http://grozeille.files.wordpress.com/2010/11/compositewpfapp1.png"></a></p>
<p>Mais le MVC, comme on le connait dans le monde Web, ne s&#8217;applique pas bien aux clients lourds, surtout si on veut exploiter le Databinding et les événements.</p>
<p>Très franchement, je ne me suis jamais vraiment passionné pour WPF/Prism/etc. mais je voyais bien que quelque chose de gros était en train de venir&#8230;<br />
J&#8217;ai ensuite assisté aux <a href="http://www.microsoft.com/france/vision/mstechdays10/">Techdays 2010</a> et j&#8217;en ai profité pour me mettre à jours sur le sujet.<br />
Les sessions étaient d’ailleurs très accès sur Silverlight/WPF mais aussi sur le nouveau modèle <a href="http://en.wikipedia.org/wiki/Model_View_ViewModel">MVVM</a> (Model-View-ViewModel), et avec une bonne dose d’Unity bien sûr…<br />
J’ai alors été très agréablement surpris par ces présentations, surtout celle qui montre comment supprimer tout le « code behind » des interfaces XAML avec des ViewModel et des Commands.</p>
<p><strong>Pour mieux comprendre de quoi je parle, aller voir vite le <a href="http://www.microsoft.com/france/vision/mstechdays10/Webcast.aspx?EID=5740b16f-770a-459c-9a93-4a321f4e8059">screencast ici</a>!!!</strong></p>
<p>Bref, je ne sais pas si vous me suivez, mais l’IOC, le RCP, le MVC, la gestion de plugins, tout ça c’est intimement lié !</p>
<p>Petit à petit, .Net rattrape le retard vis-à-vis d’Eclipse RCP !<br />
On peut même dire que .Net a pris de l&#8217;avance avec Silverlight/WPF, puisque la rédaction des interfaces en XML n&#8217;est qu&#8217;au stade de proposition pour Eclipse 4: <a href="http://wiki.eclipse.org/images/a/ab/XWT.pdf">http://wiki.eclipse.org/images/a/ab/XWT.pdf</a></p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/eclipse/'>eclipse</a>, <a href='http://grozeille.com/tag/ioc/'>IOC</a>, <a href='http://grozeille.com/tag/mvc/'>mvc</a>, <a href='http://grozeille.com/tag/mvvm/'>mvvm</a>, <a href='http://grozeille.com/tag/rcp/'>rcp</a>, <a href='http://grozeille.com/tag/unity/'>unity</a>, <a href='http://grozeille.com/tag/wpf/'>WPF</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/511/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=511&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/11/25/episode-7-mathias-decouvre-unitywpfmvvm-aux-techdays-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/11/compositewpfapp1.png?w=300" medium="image">
			<media:title type="html">CompositeWpfApp1</media:title>
		</media:content>
	</item>
		<item>
		<title>Episode 6: Mathias découvre .Net!</title>
		<link>http://grozeille.com/2010/11/13/episode-6-mathias-decouvre-net/</link>
		<comments>http://grozeille.com/2010/11/13/episode-6-mathias-decouvre-net/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 00:25:08 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[DotNetServer]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[rcp]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://grozeille.com/?p=503</guid>
		<description><![CDATA[En fait, je triche, les épisodes ne sont pas dans l’ordre chronologique. Je n’ai pas découvert .Net après Java, mais en même temps. C’était le 6 Janvier 2005, j avais blogué à ce sujet: j’avais découvert qu’avec Mono, il était possible d&#8217;exécuter un même programme EXE sous Windows comme sous Linux ! J&#8217;en avais la larme [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=503&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En fait, je triche, les épisodes ne sont pas dans l’ordre chronologique.<br />
Je n’ai pas découvert .Net après Java, mais en même temps.</p>
<p>C’était le 6 Janvier 2005, <a href="http://grozeille.com/2005/01/06/mono-le-retour/">j avais blogué</a> à ce sujet: j’avais découvert qu’avec Mono, il était possible d&#8217;exécuter un même programme EXE sous Windows comme sous Linux ! J&#8217;en avais la larme à l&#8217;œil&#8230;</p>
<p>Ce qui m&#8217;a le plus impressionné c&#8217;était de voir qu&#8217;il était possible d&#8217;exécuter du Java dans .Net grâce à <a href="http://www.ikvm.net/">IKVM </a>! Cela marchait tellement bien qu’ils ont réussi à exécuter <a href="http://weblog.ikvm.net/PermaLink.aspx?guid=1aecaf4e-24c0-4f96-861b-f3b4473c7525">Eclipse sous .Net</a> ! Mais ce n’était qu’expérimental à l&#8217;époque…</p>
<p>En découvrant .Net, j’ai tout de suite pris conscience du retard par rapport à Java, et j’ai alors voulu m’y atteler.<br />
J’ai alors commencé à réaliser un framework « RCP » comme celui d’Eclipse, mais full .Net. Voici le résultat à l’époque :</p>
<p><a href="http://grozeille.files.wordpress.com/2010/11/oldrcp.png"><img class="aligncenter size-medium wp-image-505" title="OldRCP" src="http://grozeille.files.wordpress.com/2010/11/oldrcp.png?w=300&#038;h=247" alt="" width="300" height="247" /></a></p>
<p>On pouvait réaliser des plugins qui fournissent des vues qui s’encrent dans différents endroits, que ce soit dans la fenêtre principale ou dans un onglet d’édition.<br />
J&#8217;en était plutôt fier, encore aujourd&#8217;hui&#8230; j&#8217;ai bien envie de le porter avec les technos modernes d&#8217;aujourd&#8217;hui&#8230;</p>
<p>C’est aussi à cette époque que j’ai découvert <a href="http://www.springsource.org/about">Spring</a>, et au même titre <a href="http://www.springframework.net/">Spring.Net</a>, que j’ai utilisé dans mon entreprise pour réaliser, avec <a href="http://codingly.com/">Romain</a>, un <span style="text-decoration:underline;">framework MVC Winforms</span>.</p>
<p>J’ai aussi découvert d’autres framework IOC, et par la même occasion CAB de Microsoft (<a href="http://msdn.microsoft.com/en-us/library/ff648747.aspx">Composite Application Bloc</a>), mais sans en être convaincu.</p>
<p><a href="http://grozeille.files.wordpress.com/2010/11/ic15563.gif"><img class="aligncenter size-medium wp-image-506" title="IC15563" src="http://grozeille.files.wordpress.com/2010/11/ic15563.gif?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<p>A l&#8217;époque, on commençait à parler d&#8217;OSGI, mais je n’avais pas assez de connaissance dans le domaine</p>
<p>En conclusion, je restais sur ma fin avec .Net, et j&#8217;en étais même frustré. Mais j&#8217;ai toujours été convaincu que c&#8217;était aussi &#8220;une terre d’opportunités&#8221; et que je pouvais faire quelque chose&#8230;<br />
L&#8217;IOC, le MVC pour client riche, RCP, OSGI&#8230; les idées émergeaient déjà, mais n&#8217;était pas matures.</p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/eclipse/'>eclipse</a>, <a href='http://grozeille.com/tag/mvc/'>mvc</a>, <a href='http://grozeille.com/tag/osgi/'>osgi</a>, <a href='http://grozeille.com/tag/rcp/'>rcp</a>, <a href='http://grozeille.com/tag/spring/'>spring</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/503/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=503&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/11/13/episode-6-mathias-decouvre-net/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/11/oldrcp.png?w=300" medium="image">
			<media:title type="html">OldRCP</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/11/ic15563.gif?w=300" medium="image">
			<media:title type="html">IC15563</media:title>
		</media:content>
	</item>
		<item>
		<title>Sonar pour .Net!</title>
		<link>http://grozeille.com/2010/10/25/sonar-pour-net/</link>
		<comments>http://grozeille.com/2010/10/25/sonar-pour-net/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 22:21:56 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[fxcop]]></category>
		<category><![CDATA[gendarme]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[sonar]]></category>
		<category><![CDATA[stylecop]]></category>

		<guid isPermaLink="false">http://grozeille.com/?p=481</guid>
		<description><![CDATA[Pour fêter la sortie de la version 0.4 du plugin Maven pour .Net avec l&#8217;intégration à Sonar 2.3, je voulais féliciter Alexandre Victoor et Jose CHILLAN: BRAVO! Et comme des images sont souvent plus parlantes que de longs discours, voici un extrait de ce qui est possible de faire: Tagged: .Net, fxcop, gendarme, maven, sonar, stylecop<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=481&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pour fêter la sortie de la<a href="http://docs.codehaus.org/display/SONAR/.Net+plugin"> version 0.4 du plugin Maven pour .Net</a> avec l&#8217;intégration à <a href="http://www.sonarsource.org/">Sonar</a> 2.3, je voulais féliciter <strong>Alexandre Victoor</strong> et <strong>Jose CHILLAN</strong>: <span style="text-decoration:underline;"><strong>BRAVO</strong></span>!</p>
<p>Et comme des images sont souvent plus parlantes que de longs discours, voici un extrait de ce qui est possible de faire:</p>
<p><a href="http://grozeille.files.wordpress.com/2010/10/sonardotnet01.png"><img class="aligncenter size-medium wp-image-482" title="SonarDotNet01" src="http://grozeille.files.wordpress.com/2010/10/sonardotnet01.png?w=300&#038;h=120" alt="" width="300" height="120" /></a></p>
<p><a href="http://grozeille.files.wordpress.com/2010/10/sonardotnet01.png"></a><a href="http://grozeille.files.wordpress.com/2010/10/sonardotnet02.png"><img class="aligncenter size-medium wp-image-483" title="SonarDotNet02" src="http://grozeille.files.wordpress.com/2010/10/sonardotnet02.png?w=300&#038;h=245" alt="" width="300" height="245" /></a></p>
<p><a href="http://grozeille.files.wordpress.com/2010/10/sonardotnet02.png"></a><a href="http://grozeille.files.wordpress.com/2010/10/sonardotnet03.png"><img class="aligncenter size-medium wp-image-484" title="SonarDotNet03" src="http://grozeille.files.wordpress.com/2010/10/sonardotnet03.png?w=300&#038;h=281" alt="" width="300" height="281" /></a></p>
<p><a href="http://grozeille.files.wordpress.com/2010/10/sonardotnet04.png"><img class="aligncenter size-medium wp-image-485" title="SonarDotNet04" src="http://grozeille.files.wordpress.com/2010/10/sonardotnet04.png?w=300&#038;h=212" alt="" width="300" height="212" /></a></p>
<p><a href="http://grozeille.files.wordpress.com/2010/10/sonardotnet05.png"><img class="aligncenter size-medium wp-image-486" title="SonarDotNet05" src="http://grozeille.files.wordpress.com/2010/10/sonardotnet05.png?w=300&#038;h=182" alt="" width="300" height="182" /></a></p>
<p><a href="http://grozeille.files.wordpress.com/2010/10/sonardotnet06.png"><img class="aligncenter size-medium wp-image-487" title="SonarDotNet06" src="http://grozeille.files.wordpress.com/2010/10/sonardotnet06.png?w=300&#038;h=169" alt="" width="300" height="169" /></a></p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/fxcop/'>fxcop</a>, <a href='http://grozeille.com/tag/gendarme/'>gendarme</a>, <a href='http://grozeille.com/tag/maven/'>maven</a>, <a href='http://grozeille.com/tag/sonar/'>sonar</a>, <a href='http://grozeille.com/tag/stylecop/'>stylecop</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/481/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=481&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/10/25/sonar-pour-net/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/sonardotnet01.png?w=300" medium="image">
			<media:title type="html">SonarDotNet01</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/sonardotnet02.png?w=300" medium="image">
			<media:title type="html">SonarDotNet02</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/sonardotnet03.png?w=300" medium="image">
			<media:title type="html">SonarDotNet03</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/sonardotnet04.png?w=300" medium="image">
			<media:title type="html">SonarDotNet04</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/sonardotnet05.png?w=300" medium="image">
			<media:title type="html">SonarDotNet05</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/sonardotnet06.png?w=300" medium="image">
			<media:title type="html">SonarDotNet06</media:title>
		</media:content>
	</item>
		<item>
		<title>100% de couverture de test avec ASP.Net</title>
		<link>http://grozeille.com/2010/10/25/100-de-couverture-de-test-avec-asp-net/</link>
		<comments>http://grozeille.com/2010/10/25/100-de-couverture-de-test-avec-asp-net/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 21:48:02 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[coverage]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SpecFlow]]></category>

		<guid isPermaLink="false">http://grozeille.com/?p=470</guid>
		<description><![CDATA[Dans ma quête de la couverture de test absolue, j&#8217;ai décider de tester mon application ASP.Net avec des tests fonctionnels. Pour cela, j&#8217;utilise le combo: Specflow+Selenium. En terme de rédaction du test, cela donne ça: Grâce à Specflow, je peux donc rédiger mon scénario en anglais, très lisible par l&#8217;utilisateur qui va pouvoir ainsi exprimer [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=470&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dans ma quête de la couverture de test absolue, j&#8217;ai décider de tester mon application ASP.Net avec des tests fonctionnels.<br />
Pour cela, j&#8217;utilise le combo: <a href="http://specflow.org/">Specflow</a>+<a href="http://seleniumhq.org/projects/remote-control/">Selenium</a>.</p>
<p>En terme de rédaction du test, cela donne ça:</p>
<p><pre class="brush: plain;">
﻿Feature: Test with ASP.net
	In order to get test coverage of my ASP.Net Application
	As a developper
	I want to run an embeded ASP.Net server in my NUnit test

@selenium
Scenario: Say Hello to Michel
	Given I'm on the default page
	When I enter the name &quot;Michel&quot;
	And I click the &quot;SayHello&quot; button
	Then the message is &quot;Hello Michel&quot;
</pre></p>
<p>Grâce à Specflow, je peux donc rédiger mon scénario en anglais, très lisible par l&#8217;utilisateur qui va pouvoir ainsi exprimer son besoin.<br />
Ces phrases sont ensuite couplées à des méthodes C# qui effectuent une partie du test. Exemple:</p>
<p><pre class="brush: csharp;">
[When(&quot;I click the \&quot;SayHello\&quot; button&quot;)]
public void IClickTheSayHelloButton()
{
    selenium.Click(&quot;SayHelloButton&quot;);
    selenium.WaitForPageToLoad((1 * 60 * 1000).ToString());
}
</pre></p>
<p>On remarque ici que j&#8217;utilise Selenium pour simuler le scénario et effectuer un click sur un bouton de la page.</p>
<p>Petite astuce: le scénario est &#8220;tagué&#8221; @selenium. Grâce à ce tag, je peux indiquer qu&#8217;il faut initialiser Selenium à chaque début de scénario tagué ainsi.</p>
<p><pre class="brush: csharp;">
[BeforeScenario(&quot;selenium&quot;)]
public void BeforeScenario()
{
    var firefoxPath = Path.GetFullPath(
        Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @&quot;..\..\..\Libs\Firefox\firefox.exe&quot;));
    var selenium = new DefaultSelenium(&quot;localhost&quot;,
                                       4444,
                                       @&quot;*firefox &quot; + firefoxPath,
                                       &quot;http://localhost:8123&quot;);
    ScenarioContext.Current[&quot;selenium&quot;] = selenium;
    selenium.Start();
}
</pre></p>
<p>OK, je suis content avec ça, je peux maintenant rédiger des tests fonctionnels lisibles et les automatiser à l&#8217;aide de Selenium.<br />
Mais cela ne me donne pas la couverture du code de mon application .Net qui se trouve hébergée sur un serveur IIS <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Afin d&#8217;avoir la couverture du code de toute l&#8217;application, j&#8217;ai alors décider d&#8217;exécuter l&#8217;application ASP.Net à l&#8217;intérieur du processus du test unitaire!<br />
Afin d&#8217;héberger l&#8217;application ASP.net, j&#8217;utilise pour cela la librairie de Mono: <a href="http://www.mono-project.com/ASP.NET">XSP</a>.<br />
Pour cela, quelques lignes de codes suffisent:</p>
<p><pre class="brush: csharp;">
[BeforeTestRun]
public static void BeforeTestRun()
{
    const int port = 8123;
    string path = Path.GetFullPath(@&quot;..\..\..\MyApp.Web&quot;);
    const string webServerFileName = &quot;Mono.WebServer2.dll&quot;;

    string sourcePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, webServerFileName);
    string destinationPath = Path.Combine(Path.Combine(path, &quot;bin&quot;), webServerFileName);

    File.Copy(sourcePath, destinationPath, true);

    var websource = new XSPWebSource(IPAddress.Any, port);
    webAppServer = new ApplicationServer(websource);
    webAppServer.AddApplication(&quot;localhost&quot;, port, &quot;/&quot;, path);
    webAppServer.Start(true);
}

[AfterTestRun]
public static void AfterTestRun()
{
    webAppServer.Stop();
}
</pre></p>
<p>Simple non?</p>
<p>Voila alors le résultat:<br />
<a href="http://grozeille.files.wordpress.com/2010/10/coverageaspnet.png"><img class="aligncenter size-medium wp-image-471" title="CoverageASPNet" src="http://grozeille.files.wordpress.com/2010/10/coverageaspnet.png?w=630" alt="" /></a></p>
<p>Afin de pouvoir tester par vous même, vous pouvez télécharger les sources depuis <a href="http://bitbucket.org/grozeille/testwithaspdotnet/src/">http://bitbucket.org/grozeille/testwithaspdotnet/src/</a>, lancer le serveur Selenium à l&#8217;aide de <strong>&#8220;SeleniumServer.bat</strong>&#8220;, lancer les tests avec &#8220;<strong>Test.bat</strong>&#8220;, et voir le rapport de couverture de code avec<strong> Libs\PartCover .NET 2\PartCover.Browser.exe</strong> en ouvrant le fichier <strong>Coverage.Xml</strong>.<br />
Ça, ça rox du poney!<br />
<a href="http://grozeille.files.wordpress.com/2010/10/affiche-mon-petit-poney-le-film-my-little-pony-the-movie-1986-1.jpg"><img class="aligncenter size-medium wp-image-472" title="affiche-Mon-Petit-Poney-le-film-My-Little-Pony-The-Movie-1986-1" src="http://grozeille.files.wordpress.com/2010/10/affiche-mon-petit-poney-le-film-my-little-pony-the-movie-1986-1.jpg?w=233&#038;h=300" alt="" width="233" height="300" /></a></p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/aspnet/'>Asp.net</a>, <a href='http://grozeille.com/tag/coverage/'>coverage</a>, <a href='http://grozeille.com/tag/nunit/'>NUnit</a>, <a href='http://grozeille.com/tag/selenium/'>Selenium</a>, <a href='http://grozeille.com/tag/specflow/'>SpecFlow</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/470/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/470/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/470/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/470/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/470/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/470/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/470/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/470/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/470/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/470/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/470/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/470/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/470/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/470/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=470&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/10/25/100-de-couverture-de-test-avec-asp-net/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/coverageaspnet.png" medium="image">
			<media:title type="html">CoverageASPNet</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/affiche-mon-petit-poney-le-film-my-little-pony-the-movie-1986-1.jpg?w=233" medium="image">
			<media:title type="html">affiche-Mon-Petit-Poney-le-film-My-Little-Pony-The-Movie-1986-1</media:title>
		</media:content>
	</item>
		<item>
		<title>Spring.Net, ASP.Net, Session et multithreadind</title>
		<link>http://grozeille.com/2010/10/24/spring-net-asp-net-session-et-multithreadind/</link>
		<comments>http://grozeille.com/2010/10/24/spring-net-asp-net-session-et-multithreadind/#comments</comments>
		<pubDate>Sun, 24 Oct 2010 19:22:00 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[Spring.net]]></category>

		<guid isPermaLink="false">https://grozeille.wordpress.com/?p=452</guid>
		<description><![CDATA[Pour commencer, je vous préviens, ce billet s’adresse à ceux qui savent développer en ASP.Net. Je ne plaisante pas! J’ai vu un trop grand nombre de gens prétendre savoir faire des applications Web sans savoir m’expliquer le protocole HTTP! Donc voici un petit test d’entré: Comment fonctionne un HttpHandler? Pourquoi ne pas utiliser les UpdatePanels? [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=452&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pour commencer, je vous préviens, ce billet s’adresse à ceux qui savent développer en ASP.Net.<br />
Je ne plaisante pas! J’ai vu un trop grand nombre de gens prétendre savoir faire des applications Web sans savoir m’expliquer le protocole HTTP!<br />
Donc voici un petit test d’entré:</p>
<ul>
<li>Comment fonctionne un HttpHandler?</li>
<li>Pourquoi ne pas utiliser les UpdatePanels?</li>
<li>A quoi sert un MembershipProvider et comment s’en servir?</li>
</ul>
<p>Si ces questions vous paressent obscures et que vous êtes plutôt un développeur “glisser-déposer”, alors je vous propose de vous “glisser-déposer” sur un autre blog <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Pour les autres, j’ai un aveu à vous faire: je viens de découvrir qu’il n’est pas possible d’afficher 2 pages ASP.Net en simultané si elles accèdent à la Session.</p>
<p><span id="more-452"></span></p>
<p>J’ai cru que j’étais sous l’effet d’une drogue… mais non, c’était bien vrai.<br />
J’ai alors voulu en avoir le cœur net, et j’ai fouillé de nombreux forums… c’est la que j’ai découvert que d’autres l’on découvert après 5 ans d’expériences en ASP.Net!!!</p>
<p>Certes, on ouvre rarement 2 pages Web d’un même site, mais il est plus fréquent d’avoir 2 appelles Ajax en simultané.<br />
C’est mon cas, car j’aime Ajax, j’aime le Web, et j’utilise une technique “Comet” appelé “Long Pooling”. Cela consiste à faire un appelle Ajax potentiellement infinie, qui va se terminé seulement si le serveur à quelque chose à nous dire. Cela permet d’avoir un système de notification très simple à implémenter.</p>
<p>Pour vulgariser, au lieu d’avoir ça:</p>
<blockquote><p>Client: “Tu veux me dire quelque chose?”<br />
Server: “Non”<br />
Client: “Tu veux me dire quelque chose?”<br />
Server: “Non”<br />
Client: “Tu veux me dire quelque chose?”<br />
Server: “Mais lâche moi sale client!!!”</p></blockquote>
<p>En long polling ça donne ça:</p>
<blockquote><p>Client: “Bon, tu me préviens si t’as un truc à me dire&#8230;”<br />
Server: “&#8230;”<br />
Server: “&#8230;”<br />
Server: “&#8230;”<br />
Server: “&#8230;”<br />
Server: “&#8230; ouai, j’ai un truc pour toi, un nouveau message”<br />
Client: “OK, je le traite, bon, tu me préviens si t’as un autre truc à me dire&#8230;”</p></blockquote>
<p>Et sinon, en C# ça donne ça:</p>
<p><pre class="brush: csharp;">
public string LongAjaxCall()
{
    string result = null

    while(result == null)
    {
        lock(this.notificationList)
        {
            if(notificationList.Count &gt; 0)
            {
                result = new JavaScriptSerializer().Serialize(this.notificationList.ToArray());
                this.notificationList.Clear();
            }
        }
        if(result == null)
            Thread.Sleep(500);
    }
}
</pre></p>
<p>En général, le serveur n’a pas les mêmes choses à dire aux différents clients, c’est pourquoi on utilise la Session. Mais cette dernière est verrouillée par le long pooling, l’utilisateur ne sera alors pas en mesure d’ouvrir une nouvelle page si l’appelle Ajax ne se termine pas, ce qui est plutôt fâcheux.</p>
<h2>Et Spring.Net dans tout ça?</h2>
<p>J’utilise massivement Spring.net, pas seulement pour l’IOC, mais pour bien d’autres choses que ce merveilleux framework offre.<br />
Dans le cadre d’une application Web, il est possible d’avoir un “scope” pour les instances des objets:</p>
<ul>
<li><strong>application</strong>: un singleton pour toute l’application Web</li>
<li><strong>session</strong>: l’instance n’existe que dans le cadre d’une session ASP.Net</li>
<li><strong>request</strong>: l’instance n’existe pour pour la duré de la requête HTTP</li>
</ul>
<p>J’utilise pas mal le scope “Session”, afin d’instancier des “contrôleurs” différents pour chaque utilisateurs. Je peux ainsi conserver un état à l’aide des membres de mes contrôleurs (ou conserver une connexion SQL, etc.).</p>
<p>Je vous propose alors de jeter un œil à mon exemple afin de comprendre mon problème: <a href="http://bitbucket.org/grozeille/testaspsessionmultithread/src">http://bitbucket.org/grozeille/testaspsessionmultithread/src</a><br />
Cette solution contient un premier exemple “<a href="http://bitbucket.org/grozeille/testaspsessionmultithread/src/tip/TestASPSessionMultithread.Bad/">TestASPSessionMultithread.Bad</a>” qui illustre mon problème.</p>
<p>L’exemple est simple:<br />
Vous avez une première page “<em>Default.aspx</em>” qui permet d’ajouter une “<em>string</em>” à une liste à l’aide du button “<em>add</em>” qui effectuera un appelle Ajax.<br />
Vous pouvez alors ensuite déclencher un “<em>long pooling</em>” à partir du boutton “<em>long polling</em>” qui va demander au serveur de renvoyer les nouveaux items.</p>
<p style="text-align:center;"><a href="http://grozeille.files.wordpress.com/2010/10/image.png"></a><a href="http://grozeille.files.wordpress.com/2010/10/longpooling01.png"><img class="aligncenter size-medium wp-image-462" style="border:1px solid black;" title="LongPooling01" src="http://grozeille.files.wordpress.com/2010/10/longpooling01.png?w=300&#038;h=231" alt="" width="300" height="231" /></a></p>
<p>Dans cet ordre, tout va bien. Par contre, si vous faite un “<em>long pooling</em>” en premier, le boutton “<em>add</em>” restera bloqué et il sera donc impossible d’ajouter un nouvel item.</p>
<p style="text-align:center;"><a href="http://grozeille.files.wordpress.com/2010/10/longpooling02.png"><img class="aligncenter size-medium wp-image-463" style="border:1px solid black;" title="LongPooling02" src="http://grozeille.files.wordpress.com/2010/10/longpooling02.png?w=300&#038;h=260" alt="" width="300" height="260" /></a></p>
<p>De même, vous pouvez tester aussi la page “<em>Other.aspx</em>” qui simule un lourd traitement qui prend 5 secondes. Quand vous essayer d’ouvrir la page “<em>Other</em>” et que vous tentez de recharger la page “<em>Default</em>” en parallèle, cette dernière va attendre la fin du chargement de la page “<em>Other</em>”.</p>
<p style="text-align:center;"><a href="http://grozeille.files.wordpress.com/2010/10/longpooling03.png"><img class="aligncenter size-medium wp-image-464" style="border:1px solid black;" title="LongPooling03" src="http://grozeille.files.wordpress.com/2010/10/longpooling03.png?w=300&#038;h=140" alt="" width="300" height="140" /></a></p>
<p>A noter aussi que j’affiche le <em>“creation time</em>” des différents contrôleurs. Puisque Spring.Net permet d’avoir du <span style="text-decoration:underline;">LazyLoad</span>, on voit que le <em>OtherController </em>est créé après le <em>DefaultController</em>.</p>
<p>Si vous regardez le code en détail, vous pouvez voir que je gère les appelles Ajax à l’aide d’un <em>HttpHandler </em>custom.<br />
Je pense que le code est suffisamment bien commenté pour le comprendre, et pour ceux qui ont la flemme de récupérer le source depuis BitBucket, voici l’extrait:</p>
<p><pre class="brush: csharp;">
public class BadAjaxHttpHandler : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        // get the name of the controller and the action from the URL
        var action = context.Request.Url.Segments[context.Request.Url.Segments.Length - 1];
        var controller = context.Request.Url.Segments[context.Request.Url.Segments.Length - 2]
            .Replace(&quot;.ajax&quot;, string.Empty)
            .Replace(&quot;/&quot;, string.Empty);

        // get the instance of the controller thanks to its name
        var instance = ContextRegistry.GetContext().GetObject(controller);

        // get the method of the controller thanks to reflection
        var method = instance.GetType().GetMethod(action, BindingFlags.Instance | BindingFlags.Public);
        var args = new List();
        foreach (var item in method.GetParameters())
        {
            args.Add(TypeDescriptor.GetConverter(item.ParameterType).ConvertFromString(context.Request.Params[item.Name]));
        }

        // invoke the method of the controller
        var result = method.Invoke(instance, args.ToArray());

        // return the JSON value of the method result
        context.Response.Write(new JavaScriptSerializer().Serialize(result));
        context.Response.StatusCode = 200;
        context.Response.End();
</pre></p>
<p>On remarque que pour accéder à la session nous avons ici besoin d’implémenter l’interface “<em>IRequiresSessionState</em>”, mais la aussi, comme c’est en lecture/écriture, cela verrouille la session le temps de la requête HTTP.</p>
<h2>Comment résoudre le problème?</h2>
<p>La solution est dans le projet “<a href="http://bitbucket.org/grozeille/testaspsessionmultithread/src/tip/TestASPSessionMultithread.Good.Unsecured/">02-TestASPSessionMultithread.Good.Unsecured</a>”.</p>
<p>Pourquoi “Unsecured” ? On verra ça plus tard.</p>
<p>La solution est simple, il suffit d’accéder à la Session en “lecture seule”.<br />
En effet, il peut être problématique d’ajouter une même clé depuis 2 thread concurrents, mais une fois que la clé est créée, c’est à vous de gérer la concurrence de la valeur.</p>
<p>Exemple:</p>
<p><pre class="brush: csharp;">
Session[“list”] = new List(); // problème de concurrence, donc session verrouillée

((List)Session[“list”]).Add(“toto”); // ce cas est une lecture seule de la session, mais à vous de gérer la concurrence pour la collection
</pre></p>
<p>Comme Spring.Net est en quelque sorte une “grosse collection d’instance”, et que Sprint.net utilise une seule clé “spring.object”, cela s’applique aussi <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Par défaut, les pages sont en accès Write à la session. Pour changer cela, il faut ajouter une option dans l’ASPX:</p>
<p><pre class="brush: xml;">
&lt;%@ Page EnableSessionState=&quot;ReadOnly&quot;  %&gt;
</pre></p>
<p>Il a fallut un petit changement dans le HttpHandler Ajax aussi:</p>
<p><pre class="brush: csharp;">
public class AjaxHttpHandler : IHttpHandler, IReadOnlySessionState
</pre></p>
<p>Cette nouvelle interface “<em>IReadOnlySessionState</em>” parle d’elle même <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Et voila! C’est tout! Ca marche, plus de problème de concurrence!<br />
Enfin… non ce n’est pas tout, on a un petit problème, c’est que Sprint.net ne pourra plus jamais initialiser la session sans accès en écriture <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
Il faut donc trouver un “bootstrap” qui accède à la session en écriture juste le temps de créer le contexte Spring.Net.</p>
<p>L’astuce est donc de faire une redirection vers un HttpHandler particulier “<em>SpringSessionHttpHandler</em>” si la session est nouvelle. Il peut alors accèder à la session en écriture grâce à l’interface “IRequiresSessionState” pour initialiser le contexte et rediriger vers la page d’origine.</p>
<p>Ceci est fait lors du “<em>OnLoad</em>” car nos pages héritent de “<em>SessionPage</em>”.</p>
<p><pre class="brush: csharp;">
public class SessionPage : Page
{
    protected override void OnLoad(EventArgs e)
    {
        // build the spring.net session
        if (Session.IsNewSession)
        Response.Redirect(&quot;SpringSessionHttpHandler?ReturnUrl=&quot; + Server.UrlEncode(Request.Url.ToString()), true);

        base.OnLoad(e);
    }
}
</pre></p>
<p>Le code du HttpHandler est très simple: il force la création du contexte Spring dans la session, puis redirige sur la page d’origine qui elle a un accès en lecture seule sur la session.</p>
<p><pre class="brush: csharp;">
public class BadAjaxHttpHandler : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            // get the name of the controller and the action from the URL
            var action = context.Request.Url.Segments[context.Request.Url.Segments.Length - 1];
            var controller = context.Request.Url.Segments[context.Request.Url.Segments.Length - 2]
                .Replace(&quot;.ajax&quot;, string.Empty)
                .Replace(&quot;/&quot;, string.Empty);

            // get the instance of the controller thanks to its name
            var instance = ContextRegistry.GetContext().GetObject(controller);

            // get the method of the controller thanks to reflection
            var method = instance.GetType().GetMethod(action, BindingFlags.Instance | BindingFlags.Public);
            var args = new List&lt;object&gt;();
            foreach (var item in method.GetParameters())
            {
                args.Add(TypeDescriptor.GetConverter(item.ParameterType).ConvertFromString(context.Request.Params[item.Name]));
            }

            // invoke the method of the controller
            var result = method.Invoke(instance, args.ToArray());

            // return the JSON value of the method result
            context.Response.Write(new JavaScriptSerializer().Serialize(result));
            context.Response.StatusCode = 200;
            context.Response.End();
        }
</pre></p>
<h2>Mais quel astuce géniale! &#8230;mais pourquoi “Unsecured” ?</h2>
<p>Vous pouvez remarquer que j’affiche l’ID de la session dans la page.<br />
L’identifiant de session est stocké par défaut dans un cookie. J&#8217;ai tout de même changé le nom de ce dernier, car si je laisse la valeur par défaut, je risque d’avoir un conflit avec une autre application (erreur de débutant)</p>
<p><pre class="brush: xml;">
&lt;sessionState cookieName=&quot;TestSession&quot;/&gt;
</pre></p>
<p>Normalement, le cookie est “sécurisé”, cad qu’il n’est pas accessible depuis du Javascript malicieux.<br />
Mais bon, un cookie ça reste quand même pas super sécurisé.</p>
<p>Si vous voulez tester un vol de session, il vous suffit de copier/coller l’ID de la session dans un cookie d’un autre navigateur.</p>
<p>Comment faire alors pour sécuriser le tout? Vous avez pour cela différentes solutions:</p>
<ul>
<li>implémenter votre propre gestion d’ID de session avec &lt;sessionState customProvider=&#8221;MonType&#8221;&gt;, et vérifier l’identité à l’aide de critère comme l’IP du client</li>
<li>coupler la session avec l’authentification</li>
</ul>
<p>C’est cette dernière solution que je vais vous présenter, car c’est la plus simple.<br />
L’authentification en ASP.Net se fait à l’aide du MembershipProvider, que vous pouvez implémenter vous même. Le framework .Net va alors gérer l’identité à l’aide d’un cookie aussi, mais ce dernier est beaucoup plus sécurisé et vous pouvez y faire confiance.<br />
Je vais alors stocker dans la session la valeur du cookie d’authentification, et vérifier donc l’identité avant d’accéder à la session.</p>
<p>Vous pouvez vérifiez cela par vous même à l’aide du projet <a href="http://bitbucket.org/grozeille/testaspsessionmultithread/src/tip/TestASPSessionMultithread.Good.Secured/">03-TestASPSessionMultithread.Good.Secured</a><br />
Si vous tentez de voler le cookie d’authentification pour l’utiliser sur un autre navigateur, vous serez alors déconnecté. Si vous tentez de voler le cookie de session, vous serez alors aussi déconnecté.</p>
<p>Les pages hérites alors de “<em>SecuredSessionPage</em>”, et vont alors vérifier le cookie de session dans le &#8220;<em>OnLoad</em>&#8220;:</p>
<p><pre class="brush: csharp;">
// if the user tried to steal the session of another user
if (Page.Request.Cookies[FormsAuthentication.FormsCookieName] == null ||
    !Equals(Page.Request.Cookies[FormsAuthentication.FormsCookieName].Value, Session[FormsAuthentication.FormsCookieName]))
{
    this.Logout();
}
</pre></p>
<p>Je vous laisse ensuite découvrir l&#8217;implémentation de l&#8217;authentification, mais ce n&#8217;est pas le sujet de ce billet et il n&#8217;y a rien de plus classique.</p>
<h2>Conclusion</h2>
<p>Si comme moi vous utiliser Spring.net avec ASP.net et que vous avez des problèmes de lenteur, essayer cette astuce <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/aspnet/'>Asp.net</a>, <a href='http://grozeille.com/tag/springnet/'>Spring.net</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/452/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=452&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/10/24/spring-net-asp-net-session-et-multithreadind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/longpooling01.png?w=300" medium="image">
			<media:title type="html">LongPooling01</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/longpooling02.png?w=300" medium="image">
			<media:title type="html">LongPooling02</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/10/longpooling03.png?w=300" medium="image">
			<media:title type="html">LongPooling03</media:title>
		</media:content>
	</item>
		<item>
		<title>As a Geek I want to blog</title>
		<link>http://grozeille.com/2010/08/22/as-a-geek-i-want-to-blog/</link>
		<comments>http://grozeille.com/2010/08/22/as-a-geek-i-want-to-blog/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 15:42:18 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Deleporter]]></category>
		<category><![CDATA[Mocks]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[RhinoMocks]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SpecFlow]]></category>

		<guid isPermaLink="false">https://grozeille.wordpress.com/?p=443</guid>
		<description><![CDATA[S’il y a bien quelque chose qui me fait stresser, c’est de livrer un logiciel sans être sûr qu’il fonctionne. Livrer une version sans la tester, c’est un peu comme jouer à la roulette russe. C’est pourquoi depuis longtemps je pratique les tests unitaires avec NUnit. Mes tests étant de plus en plus complexe, j’ai [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=443&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>S’il y a bien quelque chose qui me fait stresser, c’est de livrer un logiciel sans être sûr qu’il fonctionne.</p>
<p>Livrer une version sans la tester, c’est un peu comme jouer à la roulette russe.<br />
C’est pourquoi depuis longtemps je pratique les tests unitaires avec NUnit.</p>
<p>Mes tests étant de plus en plus complexe, j’ai appris aussi à utiliser RhinoMocks afin de simuler les dépendances de l’objet du test.</p>
<p>J’ai toujours fournis des efforts dans les tests: alors POURQUOI je stress toujours autant avant de livrer une version?</p>
<p>Simple: car malgré les tests et une bonne couverture, je livre toujours des bugs.<br />
Le fait est que, les tests unitaires valident chaque briques de manière indépendante, mais pas toute l’application dans son ensemble.<br />
De plus, faisant beaucoup d’application Web, je me dois de tester l’interface HTML + Javascript, ce que je ne fais pas pour l’instant.</p>
<p>J’ai bien eu des tentatives avec Selenium, mais sans trop de résultat.<br />
J’ai bien envisagé <a href="http://www.jsunit.net/">JSUnit</a>, mais je n’y suis pas encore là.</p>
<p>Mais même si je test tout de manière indépendant, le plus gros des problèmes survient lors de l’intégration de toutes ces briques, avec par exemple des bugs dans les fichiers de configuration Spring.net.</p>
<p>Si Selenium me permet de tester cette intégration, j’ai tout de même un gros problème: je ne peux pas prédire les données de mon test, ce qui fait que parfois il passe, et parfois il ne passe pas.</p>
<p>J’ai aussi rencontré un autre problème avec les tests unitaire: la rédaction de ces derniers.<br />
Quand je souhaite tester 2 scénarios différents, mais similaire à 90%, je me retrouve avec beaucoup de copier/coller.</p>
<p>Je factorise alors, mais mon test devient rapidement difficile à lire, alors que pourtant il peut servir de documentation du fonctionnement du code.</p>
<p>Après quelques recherches, et la lecture de <a href="http://blog.stevensanderson.com/category/bdd/">l’excellent blog de Steve Sanderson</a>, je me suis mis au <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">BDD</a>!</p>
<p>Le principe est de décrire un besoin utilisateur dans sa langue native: non, pas le C#… l’anglais!<br />
Cela donne quelque chose comme:</p>
<p><code>Feature: Test SpecFlow with Selenium and RhinoMocks<br />
        In order to test Specflow<br />
        As a geek<br />
        I want to write stories with Specflow<br />
        And test the application with Selenium<br />
        And mock the backend with RhinoMocks</code></p>
<p>Le truc, c’est que cela va me servir de Spec, ce qui va donc orienter la conception de mon application.</p>
<p>C’est déjà l’objectif du <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>: concevoir une architecture à partir des tests, cela nous permet de réaliser QUE CE QUE L’ON A BESOIN: c’est le principe du <a href="http://en.wikipedia.org/wiki/KISS_principle">KISS</a> ou <a href="http://en.wikipedia.org/wiki/YAGNI">YAGNI</a>.</p>
<p>Mais ces tests peuvent être difficile à concevoir, mais le BDD nous aide à décrire nos tests!<br />
Si quelqu’un débarque sur le projet, et lit un test de 100 lignes de code, il va peut-être pas comprendre du premier coup. Mais s’il lit la version “Anglaise”, à moins qu’il ne sache pas lire, il va alors comprendre le test.</p>
<p>Cette magie se fait à l’aide de <a href="http://specflow.org/">SpecFlow</a>, qui est la version 100% .Net du très à la mode <a href="http://cukes.info/">Cucumber</a> (ou <a href="http://github.com/richardlawrence/Cuke4Nuke">Cuke4Nuke</a>).</p>
<p>Au programme: rédaction des tests “en Anglais”, intégration dans VisualStudio, et génération d’un test unitaire découpé en étapes (une étape par phrase).<br />
Cela rend alors les tests unitaires vraiment TRES TRES lisibles.</p>
<p>Reprenons mon cas, ou je souhaite tester une application Web dans son ensemble.<br />
Afin de tester l’interface Web, je vais implémenter les étapes de mon BDD à l’aide de <a href="http://seleniumhq.org/docs/05_selenium_rc.html#learning-the-api">Selenium</a>.</p>
<p><a href="http://grozeille.files.wordpress.com/2010/08/testspecflow1.png"><img class="aligncenter size-medium wp-image-447" title="TestSpecflow" src="http://grozeille.files.wordpress.com/2010/08/testspecflow1.png?w=300&#038;h=138" alt="" width="300" height="138" /></a></p>
<p>OK, j’ai maintenant un test compréhensible par un utilisateur… J’ai un test NUnit C# correctement découpé et donc plus lisible par les développeurs. Je pars du test pour définir mon UI, qui elle même va orienter le design de mon Controller et ainsi de suite… Je simule les clicks de souris afin de naviguer dans le site, et je détecte les erreurs “d’intégration”…<br />
Mais j’ai toujours un même problème: je ne maitrise pas les données de ma base afin de vérifier le fonctionnement de mon test.</p>
<p>Dans ce cas, il me faut simuler ma couche d’accès aux données à l’aide de mocks RhinoMocks.<br />
Mais si mon test unitaire s’exécute sur un poste client, et que le site Web est hébergé sur un serveur dans un processus différent, comment puis-je faire mes mocks?</p>
<p>Grâce à Steve Sanderson, nous avons la solution, et elle s’appelle <a href="http://blog.stevensanderson.com/2010/03/09/deleporter-cross-process-code-injection-for-aspnet/">DELEPORTER</a>.</p>
<p>Le principe est plutôt simple: un module HTTP agit comme un serveur .Net Remoting.<br />
Le client sérialise un Delegate (anonyme ou pas, ou lamdba) afin de l’envoyer sur le serveur et de l’exécuter dans son processus.</p>
<p>C’est clairement une grosse faille de sécurité, alors pensez à bien ségréguer les configurations de tests et celles de production!</p>
<p>Etant donné que j’utilise Spring.net pour l’injection de dépendance, je peux injecter de Mocks à l’aide d’une petite factory RhinoMock.<br />
Mon test va ensuite définir le comportement de ces derniers pour mon cas de test.</p>
<p>Au final, cela donne:</p>
<p><pre class="brush: csharp;">
// J'utilise Deleporter pour exécuter ce code coté Serveur
Deleporter.Run(() =&gt;
{
        // je demande à Spring.net d'obtenir le MockRepository de RhinoMock
	var mocks = ContextRegistry.GetContext().GetObject(&quot;MockRepository&quot;) as MockRepository;

        // je demande à Spring.net d'obtenir le mock déjà créé et injecté
	var repository = ContextRegistry.GetContext().GetObject(&quot;MyRepository&quot;) as IMyRepository;

        // j'informe RhinoMock que je souhaite recoder le comportement de mon mock
	mocks.BackToRecord(repository);

        // Quand &quot;GetMessage&quot; sera appelé, je souhaite retourner &quot;Welcome Mathias&quot;
	Expect.Call(repository.GetMessage())
                .Repeat.Any()
                .Return(string.Format(&quot;Welcome {0}!&quot;, userName));

        // j'informe à RhinoMock que j'ai terminé de spécifier le comportement du mock
	mocks.Replay(repository);
});
</pre></p>
<p>Il ne reste plus qu’à exécuter le test Selenium, vérifier les données de l&#8217;UI, et la boucle est bouclée!</p>
<p>Les sources de cet exemple sont disponibles sur mon BitBucket: <a href="https://bitbucket.org/grozeille/testspecflow.mvc">https://bitbucket.org/grozeille/testspecflow.mvc</a></p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/bdd/'>BDD</a>, <a href='http://grozeille.com/tag/deleporter/'>Deleporter</a>, <a href='http://grozeille.com/tag/mocks/'>Mocks</a>, <a href='http://grozeille.com/tag/nunit/'>NUnit</a>, <a href='http://grozeille.com/tag/rhinomocks/'>RhinoMocks</a>, <a href='http://grozeille.com/tag/selenium/'>Selenium</a>, <a href='http://grozeille.com/tag/specflow/'>SpecFlow</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/443/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=443&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/08/22/as-a-geek-i-want-to-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/08/testspecflow1.png?w=300" medium="image">
			<media:title type="html">TestSpecflow</media:title>
		</media:content>
	</item>
		<item>
		<title>Episode 5 : Mathias d&#233;couvre Gigaspaces</title>
		<link>http://grozeille.com/2010/08/22/episode-5-mathias-dcouvre-gigaspaces/</link>
		<comments>http://grozeille.com/2010/08/22/episode-5-mathias-dcouvre-gigaspaces/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 14:16:51 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[DotNetServer]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Gigaspaces]]></category>

		<guid isPermaLink="false">https://grozeille.wordpress.com/?p=437</guid>
		<description><![CDATA[Mathias: Re, désolé j’étais AFK… les vacances, tout ça… Donc voila, je suis de retour avec un cerveau presque lavé. Et comme j’ai commencé une série, il fallait bien que le la termine Dans l’épisode 4 je vous ai parlé de Spring Java, le serveur d’application. Je vais maintenant vous parler de Gigaspaces, car j’y [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=437&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<pre><strong>Mathias:</strong> Re, désolé j’étais AFK… les vacances, tout ça…</pre>
<p>Donc voila, je suis de retour avec un cerveau presque lavé.<br />
Et comme j’ai commencé une série, il fallait bien que le la termine <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Dans <a href="http://grozeille.com/2010/07/09/episode-4%c2%a0-mathias-decouvre-spring-et-un-peu-plus-osgi/">l’épisode 4</a> je vous ai parlé de Spring Java, le serveur d’application.<br />
Je vais maintenant vous parler de <a href="http://www.gigaspaces.com/">Gigaspaces</a>, car j’y ai bossé un petit peu, et ça a changé ma façon de penser.</p>
<p>Pour commencer: MAIS C’EST QUOI GIGASPACES?</p>
<p>C’est plusieurs choses à la fois. Ce qui est drôle c’est que le terme à la mode en ce moment est “No-SQL” et Gigaspaces est cité comme faisant partie de la catégorie.</p>
<p>D’autres appellent ça un “<a href="http://en.wikipedia.org/wiki/Tuple_space">Tuple Space</a>” mais on parle plus souvent de “In-Memory Data Grid” ou “Distributed Caching”.</p>
<p>Et comme “distributed” rime souvent aujourd’hui avec “Cloud”, il y a la des mots clés bien commerciaux <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Mais comme je sais que vous, lecteurs, vous n’êtes pas la pour acheter une licence, mais vous êtes plutôt des Geeks du code, je vais expliquer cela de manière plus “pratique”.</p>
<p>Gigaspace est un cache mémoire: c’est un serveur qui fournie comme service de stocker et lire des données de type “clé+valeur” en utilisant la mémoire du serveur.<br />
Un cache est pratique dans diverses situations:</p>
<ul>
<li>Vous stockez en mémoire une donnée lu depuis une base de donnée, afin de la lire plus rapidement les prochaines fois</li>
<li>Vous stockez en mémoire une donnée calculée, qui va être traité par un autre programme</li>
<li>Vous stockez des “messages” afin de communiquer de manière asynchrone avec d’autres programmes</li>
</ul>
<p>En général, quand on souhaite partager des données entre 2 programmes, on utilise une base de donnée. Mais quand cette donnée change souvent, ou vous avez besoin d’une lecture très rapide, il est préférable de la stocker dans une mémoire partagée.</p>
<p>L’inconvénient de la mémoire, c’est qu’elle est plus rare que l’espace disque. Gigaspaces permet d’avoir un “cluster” de serveurs, vous pouvez donc additionner la mémoire d’autant de serveur que vous voulez.</p>
<p>Un autre inconvénient c’est que la mémoire est volatile, et en cas de crash du serveur, cette dernière est perdue.<br />
Gigaspaces permet d’avoir des nœuds “backup” dans le cluster, ce qui veut dire que la mémoire est répliquée sur un serveur de secours au cas ou le premier plante. Bien sûr, vous pouvez avoir autant de backup que vous voulez.</p>
<p>…OUAI, ET ALORS?</p>
<p>Si Gigaspaces fournit un service avec une très faible latence et met l’accent sur les performances, ce qui m’intéresse c’est l’aspect “Cluster”.</p>
<p><a href="http://grozeille.files.wordpress.com/2010/08/app_arch_on_cloud11.jpg"><img class="aligncenter size-full wp-image-438" title="app_arch_on_cloud(1)" src="http://grozeille.files.wordpress.com/2010/08/app_arch_on_cloud11.jpg?w=630" alt=""   /></a></p>
<p>Sur cette architecture, il est possible de déployer un programme de tout type: le déploiement du ZIP se fait en 2 clicks sur tous les nœuds du cluster, avec une gestion d’activation Primary/Backup.</p>
<p>Que ce programme soit un cache ou un serveur Web, je trouve l’idée très séduisante: c’est la dessus que repose le Cloud Computing.</p>
<p>Bien évidement, si l’ont décide d’avoir plusieurs applications “Primaire” pour répartir la charge, ces dernières devront prendre en compte cet aspect dans l’architecture (communication entre nœuds primaires, mémoire partagée).</p>
<p>Il est aussi possible de basculer l’état actif/inactif d’un nœud en fonction d’une mesure de charge: si le serveur 1 manque de mémoire, l’application se désactive pour se re-activer sur le serveur 2.</p>
<p>Je voulais aussi parler d’un dernier truc sympathique concernant Gigaspaces: le point d’entré d’une application déployée n’est pas un EXE ou un JAR, mais un fichier XML Spring! Il n’est donc pas nécessaire de coder un Bootstrap qui va seulement charger ce fichier de configuration…</p>
<p>Vous avez peut-être compris ou je voulais en venir: je souhaite un serveur d&#8217;application .Net sur lequel on peut déployer une application facilement sans ce soucier de l&#8217;infrastructure: que ce soit un serveur Windows ou Linux, qu&#8217;il y ai 3 instances primaires ou 6 instances primaires avec 2 backups, que les services consommés soient locaux ou distant&#8230;</p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/cluster/'>Cluster</a>, <a href='http://grozeille.com/tag/gigaspaces/'>Gigaspaces</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/437/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=437&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/08/22/episode-5-mathias-dcouvre-gigaspaces/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/08/app_arch_on_cloud11.jpg" medium="image">
			<media:title type="html">app_arch_on_cloud(1)</media:title>
		</media:content>
	</item>
		<item>
		<title>Episode 4 : Mathias découvre Spring (et un peu plus OSGI)</title>
		<link>http://grozeille.com/2010/07/09/episode-4%c2%a0-mathias-decouvre-spring-et-un-peu-plus-osgi/</link>
		<comments>http://grozeille.com/2010/07/09/episode-4%c2%a0-mathias-decouvre-spring-et-un-peu-plus-osgi/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 21:32:14 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[DotNetServer]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://grozeille.com/?p=417</guid>
		<description><![CDATA[Dans l&#8217;Episode 2, je vous ai parlé de ma découverte de J2EE. Si j&#8217;ai été émerveillé par la plateforme, j&#8217;avoue qu&#8217;elle était assez complexe. C&#8217;est alors que la lourdeur des framework J2EE a donné naissance à une alternative qui s’est voulu plus simple : Spring. J&#8217;aime bien Spring, je pense que vous le savez déjà C&#8217;est [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=417&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dans l&#8217;<a href="http://grozeille.com/2010/06/29/episode-2-mathias-decouvre-j2ee/">Episode 2</a>, je vous ai parlé de ma découverte de J2EE.<br />
Si j&#8217;ai été émerveillé par la plateforme, j&#8217;avoue qu&#8217;elle était assez complexe.</p>
<p>C&#8217;est alors que la lourdeur des framework J2EE a donné naissance à une alternative qui s’est voulu plus simple : <a href="http://en.wikipedia.org/wiki/Spring_Framework">Spring</a>.</p>
<p>J&#8217;aime bien Spring, je pense que vous le savez déjà <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
C&#8217;est pour moi en quelque sorte l&#8217;équivalent de l&#8217;esprit d&#8217;<a href="http://www.altnetfr.org/">ALT.Net</a>, mais en Java.</p>
<p>Ce fut alors la mode des <a href="http://en.wikipedia.org/wiki/Inversion_of_control">IOC</a>, et de l&#8217;approche orienté POJO. Quand j’ai découvert cela, je me suis rendu compte à quel point le framework d’Eclipse RCP pouvait être compliqué…<br />
La gestion de dépendance et de publication/consommation de service devenaient extrêmement simple.</p>
<p>La ou Spring n’était qu’un framework, « <a href="http://www.springsource.com/products/dmserver">SpringSource DM Server</a> » est, quand à lui, un vrai serveur J2EE mais avec une architecture complètement différente de ses concurrents : il est basé sur le même moteur <a href="http://en.wikipedia.org/wiki/Equinox_(OSGi)">OSGI qu’Eclipse</a> !</p>
<p>L’installation de nouvelles applications vous semble pénible ? SpringSource DM Server offre un « AppStore » pour installer un nouveau service et ses dépendances en 2 cliques!</p>
<p>Pour ceux qui ont lu mon <a href="http://grozeille.com/2010/07/09/episode-bonus-microsoft-ma-entendu-ou-pas/">billet sur WebMatrix</a>, la fonctionnalité n&#8217;est pas tout à fait la même que c&#8217;elle du produit Microsoft.Vous pouvez ici installer bien d&#8217;autres choses que des applications Web: des ESB, des serveurs Web (car oui, en Java, on a le choix entre Tomcat, Jetty et autres), etc.<br />
Vous voulez installer un serveur de Messaging ? Installer <a href="http://activemq.apache.org/">ActiveMQ</a> en quelques cliques : <a href="http://www.springsource.com/repository/app/bundle/version/detail?name=com.springsource.org.apache.activemq&amp;version=5.3.0">http://www.springsource.com/repository/app/bundle/version/detail?name=com.springsource.org.apache.activemq&amp;version=5.3.0</a></p>
<p>Vous trouvez plus d’infos sur <a href="http://www.springsource.com/products/dmserver/repository">http://www.springsource.com/products/dmserver/repository</a></p>
<p><a href="http://grozeille.files.wordpress.com/2010/07/spring-context.png"><img class="aligncenter size-medium wp-image-420" title="spring-context" src="http://grozeille.files.wordpress.com/2010/07/spring-context.png?w=300&#038;h=252" alt="" width="300" height="252" /></a><br />
En plus de tout ces avantages, SpringSource DM Serveur offre un interface d’administration d&#8217;un pure merveille, j’en bave quand je vois que Microsoft reste attaché à sa MMC…<br />
Et comme si ça ne suffisait pas, SpringSource ont racheté <a href="http://www.hyperic.com/">Hyperic</a> qui est une appli Web de Monitoring applicatif, ce qui rend l’administration de votre serveur  encore plus professionnel.</p>
<p>Petite conclusion:</p>
<ul>
<li>l&#8217;IOC c&#8217;est cool, vive l&#8217;approche POJO</li>
<li>OSGI c&#8217;est de la bombe. Cela permet aussi bien de gérer des plugins dans un IDE, que des middleware dans un serveur d&#8217;applications</li>
<li>l&#8217;installation d&#8217;une plateforme applicative doit être simple et facile, autant que de lancer un Setup de EasyPHP ou de cliquer sur un lien d&#8217;un &#8220;AppStore&#8221;</li>
<li>vive les interfaces Web d&#8217;administration, à mort la MMC</li>
</ul>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/java/'>java</a>, <a href='http://grozeille.com/tag/osgi/'>osgi</a>, <a href='http://grozeille.com/tag/spring/'>spring</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/417/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=417&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/07/09/episode-4%c2%a0-mathias-decouvre-spring-et-un-peu-plus-osgi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/07/spring-context.png?w=300" medium="image">
			<media:title type="html">spring-context</media:title>
		</media:content>
	</item>
		<item>
		<title>Episode Bonus: Microsoft m&#8217;a entendu? ou pas.</title>
		<link>http://grozeille.com/2010/07/09/episode-bonus-microsoft-ma-entendu-ou-pas/</link>
		<comments>http://grozeille.com/2010/07/09/episode-bonus-microsoft-ma-entendu-ou-pas/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 20:52:18 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Blabla]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[easyphp]]></category>
		<category><![CDATA[webmatrix]]></category>

		<guid isPermaLink="false">http://grozeille.com/?p=414</guid>
		<description><![CDATA[J&#8217;interromps mes épisodes car la news est quand même de taille: Microsoft lance WebMatrix J&#8217;avais dit qu&#8217;il manquait un équivalent à EasyPhp pour .Net, et on m&#8217;a fait remarqué d&#8217;un &#8220;IIS Express&#8221; pointait le bout de son nez&#8230; WebMatrix est donc un gros Setup qui t&#8217;installe sur ta machine un IIS Express, un base de donnée [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=414&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>J&#8217;interromps mes épisodes car la news est quand même de taille: Microsoft lance <a href="http://www.microsoft.com/web/webmatrix/">WebMatrix</a></p>
<p>J&#8217;avais dit qu&#8217;il manquait un équivalent à EasyPhp pour .Net, et on m&#8217;a fait remarqué d&#8217;un &#8220;IIS Express&#8221; pointait le bout de son nez&#8230;<br />
WebMatrix est donc un gros Setup qui t&#8217;installe sur ta machine un IIS Express, un base de donnée Express, et un IDE Express (et d&#8217;autres trucs Express).</p>
<p>Je n&#8217;ai pas encore eu le temps de tester tout ça, mais on voit déjà la grosse machine commerciale!<br />
Le site Web est très bien fait, avec plein de mots à la mode: <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">D.R.Y</a>, MVC, TDD, une petite screenshot de <a href="http://nerddinner.codeplex.com/">NerdDinner</a>, tout pour plaire <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Il y a un gros effort sur l&#8217;aspect &#8220;Communauté&#8221;, on peut facilement installer une application Web, .Net/PHP/autres, en quelques clicks.<br />
A noter aussi le gros effort sur la documentation, tutoriel et compagnie,  pour que tout le monde puisse &#8220;faire du Microsoft rapidement&#8221;.</p>
<p>J&#8217;ai l&#8217;air de ne pas aimé? Ça se voit?</p>
<p>Bon, premièrement, je suis sous Ubuntu à cet instant précis ou je vous écris.<br />
Ensuite, les vidéos Silverlight ne fonctionnent pas: Moonlight crash sous Google Chrome, et sous Firefox la vidéo ne se lance pas.<br />
Enfin, si vous faite joue joue avec WebMatrix, vous allez vouloir déployer ça quelque part&#8230;<br />
Ça tombe bien, Microsoft recommande pleins de &#8220;Hosting partner&#8221; avec du Windows Server 2008 R2&#8230; et du SQLServer bien sûr.</p>
<p>Revenons à EasyPHP.<br />
Avec EasyPHP, vous avez un vrai Apache (pas une version Express) avec un vrai MySQL (pas une version Express).<br />
Il existe aussi bien sûr des &#8220;EasyPHP like&#8221; avec du PostgreSQL, tout est possible.<br />
Vous pouvez ensuite héberger cela sur du Windows si vous voulez&#8230; ou du Linux.</p>
<p>Bon, c&#8217;est vrai, EasyPHP n&#8217;installe pas un IDE, il va falloir en trouver un gratuit.<br />
Ca doit être plutôt rareun IDE gratuit, d&#8217;après ce que l&#8217;on voit sur le site de WebMatrix:<br />
Je cite: &#8220;Cerise sur le gâteau, c&#8217;est entièrement gratuit.&#8221;</p>
<p>Allez, parce-que je suis gentil, voici 3 IDE PHP gratuit:</p>
<ul>
<li><a href="http://www.phpide.de/">http://www.phpide.de/</a></li>
<li><a href="http://www.php-editors.com/">http://www.php-editors.com/</a></li>
<li><a href="http://www.phpide.de/">http://www.phpide.de/</a></li>
</ul>
<p>Le gros + de WebMatrix, c&#8217;est quand même de pouvoir télécharger n&#8217;importe quel application Web (ASP.Net et PHP) en quelques clicks. La, j&#8217;avoue, rien à dire.</p>
<p>Je vous laisse maintenant apprécier  la grandeur commerciale de Microsoft, je pense qu&#8217;ils vont réussir leur coup avec WebMatrix.</p>
<br /> Tagged: <a href='http://grozeille.com/tag/net/'>.Net</a>, <a href='http://grozeille.com/tag/aspnet/'>Asp.net</a>, <a href='http://grozeille.com/tag/easyphp/'>easyphp</a>, <a href='http://grozeille.com/tag/webmatrix/'>webmatrix</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/414/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=414&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/07/09/episode-bonus-microsoft-ma-entendu-ou-pas/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>
	</item>
	</channel>
</rss>
