<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">

<channel>
	<title>The World is mine</title>
	
	<link>http://grozeille.com</link>
	<description>Just another Wordpress.com weblog</description>
	<pubDate>Sun, 22 Jun 2008 14:22:30 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>fr</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Grozeille" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">1949300</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://www.feedburner.com</feedburner:feedburnerHostname><item>
		<title>Impossible de démarrer IIS</title>
		<link>http://grozeille.com/2008/06/22/impossible-de-demarrer-iis/</link>
		<comments>http://grozeille.com/2008/06/22/impossible-de-demarrer-iis/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 14:22:13 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[iss]]></category>

		<category><![CDATA[tips]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=65</guid>
		<description><![CDATA[Il y a des astuces que j&#8217;estime devoir propager sur Internet, car ça peut éviter quelques arrachages de cheveux.
Symptôme: quand on souhaite démarrer IIS (6), ce dernier plante avec l&#8217;erreur &#8220;Une erreur 0&#215;8ffe2740 inattendue s&#8217;est produite&#8220;.


Le nom de l&#8217;erreur n&#8217;est pas très clair, et je me suis dit que le numéro hexa serait différent pour [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Il y a des astuces que j&#8217;estime devoir propager sur Internet, car ça peut éviter quelques arrachages de cheveux.</p>
<p>Symptôme: quand on souhaite démarrer IIS (6), ce dernier plante avec l&#8217;erreur &#8220;<strong>Une erreur 0&#215;8ffe2740 inattendue s&#8217;est produite</strong>&#8220;.</p>
<p><a href="http://grozeille.files.wordpress.com/2008/06/cannotstartiis2.jpg"><img class="alignnone size-full wp-image-70" src="http://grozeille.files.wordpress.com/2008/06/cannotstartiis2.jpg?w=534&h=261" alt="" width="534" height="261" /></a></p>
<p><span id="more-65"></span></p>
<p>Le nom de l&#8217;erreur n&#8217;est pas très clair, et je me suis dit que le numéro hexa serait différent pour chaque PC. Mais j&#8217;ai finis par chercher ce numéro sur Google et je suis tombé sur l&#8217;explication: <a href="http://support.microsoft.com/kb/816944/fr">http://support.microsoft.com/kb/816944/fr</a></p>
<p>Pour résumer, le port utiliser par IIS (80 par défaut) est déjà utilisé.<br />
Le port 80?? Mais qu&#8217;est-ce qui peut bien utiliser le port 80 sur mon PC fraichement installé???!!</p>
<p>Le site de Microsoft conseille d&#8217;utiliser 2 outils pour trouver le fautif: TCPView qui est une application &#8220;graphique&#8221;, et FPort qui est en ligne de commande. Bien sûr, je choisi la version &#8220;graphique&#8221;, sympa d&#8217;ailleurs mais qui ne trouve pas le fautif!!<br />
Heureuse FPort, quand à lui, a bien trouver l&#8217;application qui utilise le port 80:</p>
<p><a href="http://grozeille.files.wordpress.com/2008/06/skypeport801.jpg"><img class="alignnone size-full wp-image-71" src="http://grozeille.files.wordpress.com/2008/06/skypeport801.jpg?w=667&h=287" alt="" width="667" height="287" /></a></p>
<p>Et oui, le fautif c&#8217;est Skype! Très étonnant&#8230; info trouvé sur <a href="http://forum.skype.com/index.php?showtopic=42531">http://forum.skype.com/index.php?showtopic=42531</a></p>
<p>Donc voila ce qu&#8217;il faut décocher pour corriger le problème:</p>
<p><a href="http://grozeille.files.wordpress.com/2008/06/skypeport80config2.jpg"><img class="alignnone size-full wp-image-73" src="http://grozeille.files.wordpress.com/2008/06/skypeport80config2.jpg?w=506&h=406" alt="" width="506" height="406" /></a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/65/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/65/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=65&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/06/22/impossible-de-demarrer-iis/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2008/06/cannotstartiis2.jpg" medium="image" />

		<media:content url="http://grozeille.files.wordpress.com/2008/06/skypeport801.jpg" medium="image" />

		<media:content url="http://grozeille.files.wordpress.com/2008/06/skypeport80config2.jpg" medium="image" />
	</item>
		<item>
		<title>Les Settings en .Net</title>
		<link>http://grozeille.com/2008/06/08/les-settings-en-net/</link>
		<comments>http://grozeille.com/2008/06/08/les-settings-en-net/#comments</comments>
		<pubDate>Sun, 08 Jun 2008 17:33:32 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[Spring.net]]></category>

		<category><![CDATA[.Net]]></category>

		<category><![CDATA[settings]]></category>

		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=60</guid>
		<description><![CDATA[La plateforme .Net fournit un mécanisme pour gérer les paramétrages. Il en existe 2 types : ceux de l&#8217;application et ceux de l&#8217;utilisateur. Au début de l&#8217;existance, il y avait la bonne vielle méthode du fichier *.ini, mais aujourd&#8217;hui le XML et devenu LE standard pour écrire des données dans un fichier &#8220;lisible&#8221; et structuré.
Il [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>La plateforme .Net fournit un mécanisme pour gérer les paramétrages. Il en existe 2 types : ceux de l&#8217;application et ceux de l&#8217;utilisateur. Au début de l&#8217;existance, il y avait la bonne vielle méthode du fichier *.ini, mais aujourd&#8217;hui le XML et devenu LE standard pour écrire des données dans un fichier &#8220;lisible&#8221; et structuré.</p>
<p>Il existe un autre standard : les applications .Net possède un fichier &#8220;mon_application.exe.config&#8221; qui n&#8217;est autre qu&#8217;un XML contenant le paramétrage de l&#8217;appliation. Ce fichier est structuré en 2 grosses parties: l&#8217;entête avec la section &#8220;configSections&#8221; qui décrit les sections du XML et les &#8220;parser&#8221; qui vont lire ces dernières. Puis il y a les sections proprement dites.<br />
<span id="more-60"></span></p>
<p>Quand on veut utiliser des settings de l&#8217;application de type &#8220;clef=valeur&#8221;, on peut les renseigner dans la section &#8220;applicationSettings&#8221;. On peut ainsi facilement créer un paramétrage de l&#8217;application mais aussi pour chaque utilisateur à l&#8217;aide de la section &#8220;userSettings&#8221;.<br />
Voici un exemple de paramétrage:</p>
<pre name="code" class="xml">

&lt;userSettings&gt;
	&lt;MonApp.Settings&gt;
		&lt;setting name=&quot;PreferredLanguage&quot; serializeAs=&quot;String&quot;&gt;
			&lt;value&gt;fr-FR&lt;/value&gt;
		&lt;/setting&gt;
	&lt;/MonApp.Settings&gt;
&lt;/userSettings&gt;
&lt;applicationSettings&gt;
	&lt;MonApp.Settings&gt;
		&lt;setting name=&quot;TimeShowMsg&quot; serializeAs=&quot;String&quot;&gt;
			&lt;value&gt;5&lt;/value&gt;
		&lt;/setting&gt;
		&lt;setting name=&quot;NotepadPath&quot; serializeAs=&quot;String&quot;&gt;
			&lt;value&gt;c:\windows\notepad.exe&lt;/value&gt;
		&lt;/setting&gt;
	&lt;/MonApp.Settings&gt;
&lt;/applicationSettings&gt;
</pre>
<p>VisualStudio propose une technique simple pour manipuler ces paramétrage. Il permet de créer un fichier &#8220;.settings&#8221; qui va tout simplement générer une classe pour accéder à tout ça, et qui va aussi permettre de sauvegarder les settings de l&#8217;utilisateur courant (dans un .config séparé dans C:\Documents and Settings\UserName\Local Settings\AppName\).</p>
<pre name="code" class="csharp">

// on récupère la valeur d&#039;une clef très simplement
String value = Settings.Default.MyKey;
// si elle a comme scope &quot;user&quot;, on peut la modifier et la sauvegarder
Settings.Default.MyKey= value;
Settings.Default.Save();
</pre>
<p>Pour ma part, j&#8217;utilise massivement Spring.net et ses XML. Mes objets possèdent souvent des attributs qui ressemble à des paramètres (j&#8217;externalise au maximum). De plus, Spring.net propose de référencer d&#8217;autre XML, ce qui me permet de découper mon paramétrage en plusieurs fichiers pour différent domaine (Logging, Base de données, etc).</p>
<pre name="code" class="xml">

&lt;!-- dans le App.config --&gt;
&lt;objects xmlns=&quot;http://www.springframework.net&quot;&gt;
  &lt;import resource=&quot;logging.xml&quot;/&gt;
  &lt;import resource=&quot;database.xml&quot;/&gt;;
  &lt;import resource=&quot;general.xml&quot;/&gt;
&lt;/objects&gt;
</pre>
<pre name="code" class="xml">

&lt;!-- dans general.xml --&gt;
&lt;objects xmlns=&quot;http://www.springframework.net&quot;&gt;
  &lt;object id=&quot;Setting&quot; type=&quot;MonApp.Setting, MonApp&quot;&gt;
    &lt;property name=&quot;Timeout&quot; value=&quot;100&quot;/&gt;
  &lt;/object&gt;
&lt;/objects&gt;
</pre>
<p>Mais il est vrai qu&#8217;un XML de Spring n&#8217;est pas facile à lire, car il ressemble à un code C# avec une suite de construction de classes. Il peut devenir vite complexe s&#8217;il y a beaucoup de classes de relations entre eux, ou si on utilise des concepts avancés de Spring.net (ObjectFactory par exemple).</p>
<p>Une des solutions les plus élégante pour un public informaticien, est de créer ses propres balises XML Spring.net, comme celles déjà existantes (Exemple: <a href="http://www.springframework.net/doc-latest/reference/html/dbprovider.html#d0e11738">paramétrage de base de données</a>.) On masque ainsi la complexité de la construction du programme en laissant une grande souplesse. Mais cette solution demande un certain effort dans la réalisation du parser XML.</p>
<pre name="code" class="xml">

&lt;objects xmlns=&#039;http://www.springframework.net&#039;
             xmlns:custom=&quot;http://www.grozeillle.com/custom&quot;&gt;
  &lt;custom:Setting timeout=&quot;100&quot;&gt;
    &lt;custom:EmbededSetting name=&quot;Default&quot;&gt;
      &lt;!-- autres settings --&gt;
    &lt;/custom:EmbededSetting/&gt;
  &lt;/custom:Setting&gt;
&lt;/objects&gt;
</pre>
<p>Mais ces fichiers de paramétrages restent difficiles à lire pour une personne non-informaticienne, qui n&#8217;a pas besoin de savoir comment le programme est construit. Dans ce cas, on externalise des valeurs dans des fichiers &#8220;.properties&#8221; très lisible puisque c&#8217;est une simple fichier texte avec une liste de couples &#8220;clef=valeur&#8221;. On peut aussi externaliser ces couples dans une XML mais on perd l&#8217;intérêt d&#8217;avoir quelque chose de très facile à lire.</p>
<pre name="code" class="xml">

&lt;objects xmlns=&#039;http://www.springframework.net&#039;&gt;
&lt;!-- Cet objet contient une liste de &quot;fournisseur&quot; de paramétres--&gt;
  &lt;object type=&quot;Spring.Objects.Factory.Config.VariablePlaceholderConfigurer, Spring.Core&quot;&gt;
	&lt;property name=&quot;VariableSources&quot;&gt;
	  &lt;list&gt;
		&lt;!-- Nous n&#039;avons ici qu&#039;un seul fournisseur,
			qui va chercher les paramétrages dans un fichier .properties --&gt;
		&lt;object type=&quot;Spring.Objects.Factory.Config.PropertyFileVariableSource, Spring.Core&quot;&gt;
		  &lt;!- la liste de nos fichiers .properties --&gt;
		  &lt;property name=&quot;Locations&quot;&gt;
			&lt;list&gt;
			  &lt;value&gt;config.properties&lt;/value&gt;
			&lt;/list&gt;
		  &lt;/property&gt;
		&lt;/object&gt;
	  &lt;/list&gt;
	&lt;/property&gt;
  &lt;/object&gt;
&lt;/objects&gt;
</pre>
<p>On peut ainsi utiliser des variables comme ceci:</p>
<pre name="code" class="xml">

&lt;objects xmlns=&#039;http://www.springframework.net&#039;&gt;
	&lt;!-- mon object de type &quot;MyTutoClass&quot; a besoin du chemin de Notepad.exe --&gt;
	&lt;object type=&quot;MyApp.MyTutoClass, MyApp&quot;&gt;
		&lt;property name=&quot;NotepadPath&quot; value=&quot;${notepad.path}&quot;&gt;
	&lt;/object&gt;
&lt;/objects&gt;
</pre>
<p>Mon fichier .properties ressemble simplement à ça:</p>
<pre name="code" class="vb">

;ceci est un commentaire
notepad.path=c:\windows\notepad.exe
</pre>
<p>Spring.net propose plusieurs méthodes de recherche de ces clef+valeur. On peut avoir comme source des fichiers &#8220;.properties&#8221;, mais aussi la section &#8220;settings&#8221; dans l&#8217;App.config (comme vu plus haut), la base de Registre, etc. Voici la liste dans la <a href="http://www.springframework.net/doc-latest/reference/html/objects.html#objects-variablesource">documentation officiel</a>. Si elle ne vous suffit pas, vous pouvez toujours créer votre &#8220;provider&#8221; vous même.</p>
<p>Enfin, pour les plus &#8220;hardcore&#8221; d&#8217;entre-vous (ceux qui aime recoder l&#8217;univers), vous pouvez aussi créer votre propre XML avec votre propre format. Il est vrai qu&#8217;on souhaite parfois faire sa propre classe &#8220;Setting&#8221; car on veut hiérarchiser les différents paramètres. Admettons que l&#8217;on veuille vraiment avoir son propre format de fichier XML, ceci reste très simple en .Net:</p>
<pre name="code" class="csharp">

// créer un &quot;serializer&quot; de Setting
XmlSerializer serializer = new XmlSerializer(typeof(Setting));
// création d&#039;un flux sur mon fichier XML
TextWriter writer = new StreamWriter(&quot;Settings.xml&quot;);
// création de ma classe de Setting
Setting setting = new Setting();
// setting.Timeout = 5; etc, etc..
// enfin, sauvegarde de mon objet sous format XML dans le flux de mon fichier &quot;Settings.xml&quot;
serializer.Serialize(writer, setting);
</pre>
<p>On ne peut pas faire plus simple, non? Et vous savez quoi? Par défaut, ça marche sans rien faire d&#8217;autre. Mais si vous voulez customizer le format du XML, il suffira de décorer notre classe Setting à l&#8217;aide de quelques attributs [XmlAttribute]. Si vous voulez générer un schéma XSD de ce format XML, c&#8217;est à l&#8217;aide de <code>c:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\xsd.exe</code>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/60/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/60/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=60&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/06/08/les-settings-en-net/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>
	</item>
		<item>
		<title>un iMac illumine mon salon</title>
		<link>http://grozeille.com/2008/05/25/un-imac-illumine-mon-salon/</link>
		<comments>http://grozeille.com/2008/05/25/un-imac-illumine-mon-salon/#comments</comments>
		<pubDate>Sun, 25 May 2008 13:12:33 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Blabla]]></category>

		<category><![CDATA[macos]]></category>

		<category><![CDATA[iMac]]></category>

		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=58</guid>
		<description><![CDATA[Enfin, après une longue attente, de nombreuses hésitations, l&#8217;iMac illumine mon salon!
A chaud voici mes premières impressions:

C&#8217;est beau, la dessus on est tous 	d&#8217;accord. Le packaging est de qualité, l&#8217;objet en lui même est 	magnifique, et MacOSX est sublime. Même des applications 	&#8220;classiques&#8221; comme Firefox sont beaucoup plus 	belles/ergonomiques. On voit que tous les développeur [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Enfin, après une longue attente, de nombreuses hésitations, <a href="http://picasaweb.google.com/mathias.kluba/IMac/photo#5204268163813992866">l&#8217;iMac illumine mon salon</a>!</p>
<p>A chaud voici mes premières impressions:<span id="more-58"></span></p>
<ul>
<li>C&#8217;est beau, la dessus on est tous 	d&#8217;accord. Le packaging est de qualité, l&#8217;objet en lui même est 	magnifique, et MacOSX est sublime. Même des applications 	&#8220;classiques&#8221; comme Firefox <a href="http://picasaweb.google.com/mathias.kluba/IMac/photo#5204300088305904242">sont beaucoup plus 	belles/ergonomiques</a>. On voit que tous les développeur Mac font un 	effort particulier dans le domaine.</li>
</ul>
<ul>
<li>
<p style="margin-bottom:0;">MacOSX c&#8217;est pratique. Je n&#8217;ai 	aucun problème à trouver quoique ce soit. Tout est à porté de 	click, c&#8217;est vraiment l&#8217;informatique à porté de tous, et c&#8217;est 	très agréable, voir reposant. Vous ne le savez peut-être pas, 	mais les applications ne s&#8217;installent pas avec un Setup comme sous 	Windows. Chaque application est un dossier avec son icon perso. Ce 	dossier contient tous les fichiers de l&#8217;application, et un 	double-click sur le dossier lance l&#8217;application. Quand on télécharge 	une application, on récupère un .dmg (une image ISO) qu&#8217;on &#8220;monte&#8221; 	(avec un simple double-click). <a href="http://picasaweb.google.com/mathias.kluba/IMac/photo#5204268417217063394">Cette dernière possède souvent une 	apparence de dossier personnalisée</a> et l&#8217;installation du logiciel se 	fait à l&#8217;aide d&#8217;un simple &#8220;glisser/déposer&#8221; de l&#8217;icon de 	l&#8217;application dans le dossier &#8220;Application&#8221;. Voici 	plusieurs exemples.</p>
</li>
<li>
<p style="margin-bottom:0;">C&#8217;est fluide. MacOS avec ses 	effets de fondu donne une impression encore plus grande de fluidité. 	Les jeux sont fluide aussi: j&#8217;ai testé WOW sous Mac, la démo de 	Quake4 toujours  sous Mac, mais aussi <a href="http://picasaweb.google.com/mathias.kluba/IMac/photo#5204268700684904994">Unreal</a> <a href="http://picasaweb.google.com/mathias.kluba/IMac/photo#5204268739339610674">Tournament</a> <a href="http://picasaweb.google.com/mathias.kluba/IMac/photo#5204268773699349058">3 sous 	Windows</a>: En 1900&#215;1200 j&#8217;ai de très bonnes perfs (entre 60fps et 	38fps, et en activant la synchro verticale je fait en moyenne du 	50fps).</p>
</li>
<li>
<p style="margin-bottom:0;"><a href="http://picasaweb.google.com/mathias.kluba/IMac/photo#5204268258303273410">C&#8217;est grand</a>. L&#8217;écran est 	tellement grand (1900&#215;1200) que je me suis rendu compte que j&#8217;étais 	assis à gauche de mon bureau est que je ne regarde qu&#8217;un morceau de 	l&#8217;écran. Je dois tourner la tête pour voir l&#8217;autre coté, ou 	prendre du recule! En tout cas, avec la télécommande de FrontRow 	et le cul posé dans le canapé, c&#8217;est un vrai bonheur.</p>
</li>
<li>
<p style="margin-bottom:0;">Le clavier plat &#8220;à la 	portable&#8221; est très agréable et silencieux. La souris sans fil 	est légère et précise.</p>
</li>
</ul>
<p>Tout n&#8217;est pas rose non plus, voici mes premières impressions négatives:</p>
<ul>
<li>
<p style="margin-bottom:0;">Les touches du clavier ne sont pas 	&#8220;standard&#8221;. C&#8217;est très troublant d&#8217;avoir le &#8216;!&#8217; avec 	&#8217;shift+8&#8242; ou ce genre de changement&#8230; je ne sais toujours pas ou 	trouver l&#8217;anti-slash.</p>
</li>
<li>
<p style="margin-bottom:0;">Les raccourcies sont très 	différents sous MacOS. J&#8217;ai buté pour trouver comment supprimer 	des fichiers (cmd+backspace) et je me fait piégé souvent avec le 	&#8216;ctrl+flèche&#8217; qui me change de bureau (sous windows/linux je m&#8217;en 	sert pour déplacer le cursor de mot-en-mot). La touche &#8216;fin&#8217; va à 	la fin du document et je n&#8217;ai pas encore trouvé comment aller à la 	fin de la ligne. Ceci dit, je m&#8217;habitue vite (comme pour le &#8216;cmd+c&#8217; 	pour copier et non &#8216;ctrl+c&#8217;)</p>
</li>
<li>
<p style="margin-bottom:0;">La mightymouse: petite, jolie, 	agréable, mais elle n&#8217;est pas parfaite. Les clicks &#8216;latéraux&#8217; sont 	très très dure (je vais me muscler les doigts). Elle supporte le 	click-droit (qui est désactiver par défaut -_-&#8217;) mais étant 	&#8220;tactile&#8221; il détecte parfois un click-gauche. Pour être 	sûr de faire un click-droit, il faut lever le doigt du click-gauche 	ou utiliser le raccourcie &#8216;ctrl+click&#8217;.</p>
</li>
<li>Au début j&#8217;ai trouvé que le son était pas mal. Mais au 	bout d&#8217;un moment, j&#8217;avais une sensation d&#8217;être dans une grande 	salle qui résonne ou à un concert. J&#8217;ai vite remis mes enceintes.</li>
</ul>
<p>Je ne peux pas dire que c&#8217;est un vrai point négatif, mais j&#8217;ai passé beaucoup de temps à installer Windows XP. Bootcamp est très facile à utiliser, il partitionne très bien et très vite (et propose une taille correcte par défaut). Mais mon XP est vieux, et n&#8217;inclue pas le SP2 de base. Un XP sans SP2 ce n&#8217;est pas supporté officiellement. A cause de ça, le setup des drivers du CD de Bootcamp ne voulais pas s&#8217;installer. J&#8217;ai alors installé de nombreux drivers à la main, mais sans le SP2 certains ne fonctionnaient pas.</p>
<p>Installer le SP2 sur un XP installé avec Bootcamp, c&#8217;est l&#8217;horreur. En effet, ce dernier ne voulais pas s&#8217;installer car il me disait que je n&#8217;avais pas assez de place sur mon disk: il me demandait toujours 4mo supplémentaire. Il n&#8217;y a pas beaucoup d&#8217;aide sur les forums à ce sujet, mais j&#8217;y finis pas trouver la solution en googlant: il fallait créer une clefs de registre à la main car l&#8217;installation ne l&#8217;a pas faite  (<a href="http://www.mac-forums.com/forums/showthread.php?p=659709">info trouvé ici</a>). Cette infos sera utile pour ceux qui veulent installer le SP3.</p>
<p>En conclusion:</p>
<p>En tant que développeur, certains raccourcies clavier me gênent. J&#8217;ai donc quelque problème d&#8217;adaptation mais ça ira avec le temps. Sous Windows, les raccourcies me sont connus mais les touches &#8220;non standard&#8221; demeurent.<br />
J&#8217;ai du mal à m&#8217;habituer au fameux click-droit de la souris, mais après avoir testé la démo de Unreal Tournament 3, je me suis rendu compte que mon ancienne souris n&#8217;est pas mieux. En passant à l&#8217;ancien clavier et l&#8217;ancienne souris, je perds en précision, les touches du clavier sont dure et j&#8217;ai du mal à me déplacer, etc. Donc finalement, ce n&#8217;est pas si mal, j&#8217;ai juste besoin d&#8217;un temps d&#8217;adaptation.</p>
<p>Windows avec Bootcamp fonctionne bien (après quelque galère à l&#8217;installation car je n&#8217;avais pas un SP2&#8230;). J&#8217;ai hâte d&#8217;installer Linux et voir ce que ça donne avec Compiz.</p>
<p>Au final, j&#8217;en suis très content. J&#8217;ai un PC rapide et complètement silencieux (beau et compact). L&#8217;utiliser devient agréable et reposant, et je sens que je vais être plus productif/créatif avec <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Voici <a href="http://picasaweb.google.com/mathias.kluba/IMac">quelques images</a> sur le sujet.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/58/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/58/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/58/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=58&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/05/25/un-imac-illumine-mon-salon/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>
	</item>
		<item>
		<title>Intelligence Artificiel</title>
		<link>http://grozeille.com/2008/05/25/intelligence-artificiel/</link>
		<comments>http://grozeille.com/2008/05/25/intelligence-artificiel/#comments</comments>
		<pubDate>Sun, 25 May 2008 08:46:18 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Blabla]]></category>

		<category><![CDATA[Geek]]></category>

		<category><![CDATA[IA]]></category>

		<category><![CDATA[robotique]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=61</guid>
		<description><![CDATA[Étant un véritable Geek fanatique de science, je m&#8217;intéresse bien sûr à l&#8217;Intelligence Artificielle. L&#8217;idée de programmer mon &#8220;animal de compagnie virtuel&#8221; me trotte dans la tête depuis un moment. Le plus simple étant de faire un &#8220;bot&#8221; qui essaye de répondre &#8220;intelligemment&#8221; à ce que je lui demande; avec une approche &#8220;déterministe&#8221;.
L&#8217;étape supérieur serait [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Étant un véritable Geek fanatique de science, je m&#8217;intéresse bien sûr à l&#8217;<a href="http://fr.wikipedia.org/wiki/Intelligence_artificielle">Intelligence Artificielle</a>. L&#8217;idée de programmer mon &#8220;animal de compagnie virtuel&#8221; me trotte dans la tête depuis un moment. Le plus simple étant de faire un &#8220;bot&#8221; qui essaye de répondre &#8220;intelligemment&#8221; à ce que je lui demande; avec une approche &#8220;déterministe&#8221;.</p>
<p style="margin-bottom:0;">L&#8217;étape supérieur serait qu&#8217;il puisse me répondre avec une approche &#8220;euristique&#8221; à l&#8217;aide d&#8217;une éducation. Cette étape nécessite donc de maitriser les <a href="http://fr.wikipedia.org/wiki/Neuronal_network">Réseaux de neurones</a>.</p>
<p style="margin-bottom:0;"><span id="more-61"></span>Pour vulgariser le concept: on considère que le « cerveaux » est une boite noire, qui prend en entré des informations (un ordre exprimé dans l&#8217;interface de chat par exemple) et qui réalise, ou pas, quelque chose en sortie (ouvrir une application par exemple). Il faut donc éduquer longuement la boite noir pour lui dire quand est-ce qu&#8217;il faut qu&#8217;elle fasse cette chose et dans quel cas elle ne doit pas la faire.<br />
Un peu comme un gamin qui se fait engueulé par sa mère et qui comprend quand est-ce qu&#8217;il peut jouer et quand il doit faire ses devoirs.</p>
<p style="margin-bottom:0;">Cette étape peut s&#8217;avérer très longue, et on peut imaginer des solutions complexe pour accélérer le processus. On peut considérer que chaque réseau de neurones soient inter-connectés et agissent comme un réseau de niveau supérieur, un « méta-réseau » ou en somme un « cerveau virtuel ».</p>
<p style="margin-bottom:0;">On peut alors y introduire les <a href="http://fr.wikipedia.org/wiki/Algorithme_g%C3%A9n%C3%A9tique">algorithmes génétiques</a>: on considère que chaque cerveaux soient  des individus distincts. Une action sera alors effectuer seulement si la majorité de la population prend cette décision.<br />
Pour vulgariser le concept des algorithmes génétiques: le principe est de simuler la théorie de Darwin, c&#8217;est à dire que les individus les moins adapté aux règles de la vie, meurent, et on effectue des croisements génétiques entre les survivants pour obtenir des individus encore plus adaptés.<br />
Ici seul les cerveaux qui prendrons la bonne décision (à savoir celle qui me plait le plus) survivront.<br />
Cela permettra donc d&#8217;éduquer l&#8217;ensemble beaucoup plus vite puisque c&#8217;est comme si plusieurs individus réfléchissent de manière différente et qu&#8217;à un moment donnée on croise leur façon de penser pour en avoir une plus optimale.</p>
<p style="margin-bottom:0;">On peut aussi appliquer l&#8217;algorithme génétique lors de simulations avant de donner une réponse définitive. Le cerveau virtuel pourra simuler plusieurs décisions de plusieurs réseaux, et voir laquelle est la meilleur (« meilleur » étant toujours celle qui me plait le plus).</p>
<p style="margin-bottom:0;">La consécration de tout ça serai de ne plus avoir un « bot » virtuel, mais un <a href="http://mindstorms.lego.com/eng/Overview/default.aspx">robot qui grouille dans mon appartement</a>. Certain me diront « va t&#8217;acheter un chat », mais c&#8217;est plus fun de le concevoir soit même <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="margin-bottom:0;">Mais on peut aller encore plus loin, à l&#8217;aide de la pensé collective. Pour l&#8217;instant, j&#8217;ai une population de cerveaux qui réfléchissent indépendamment les un des autres, et je réalise des croisements entre eux pour avoir un résultat optimal. Mais on peut imaginer qu&#8217;ils communiquent entre eux, qu&#8217;ils s&#8217;éduquent entre eux, et qu&#8217;ils n&#8217;attendent donc pas l&#8217;étape de croisement pour changer leur façon de penser. Une vrai société en somme!</p>
<p style="margin-bottom:0;">Je m&#8217;emballe car tout ceci est bien sûr très complexe, mais les progrès dans ce domaine se font de plus en plus vite. J&#8217;avais envie de vous parler de tout ça après avoir vu <a href="http://www.vieartificielle.com/article/index.php?id=01565">cette vidéo qui montre des méduses robotiques</a> qui communiquent par signaux lumineux et agissent comme un groupe.</p>
<p style="margin-bottom:0;">Rien à voir avoir l&#8217;IA, mais ce que j&#8217;ai trouvai de plus fun dans ces vidéos c&#8217;est la méduse « flottante » dans les airs. Peut être que nos rues en seront infesté un jour?</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/61/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/61/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=61&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/05/25/intelligence-artificiel/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>
	</item>
		<item>
		<title>Winforms sous Linux</title>
		<link>http://grozeille.com/2008/05/14/winforms-sous-linux/</link>
		<comments>http://grozeille.com/2008/05/14/winforms-sous-linux/#comments</comments>
		<pubDate>Wed, 14 May 2008 21:50:20 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Blabla]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[.Net]]></category>

		<category><![CDATA[GTK]]></category>

		<category><![CDATA[mono]]></category>

		<category><![CDATA[UI]]></category>

		<category><![CDATA[web]]></category>

		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=57</guid>
		<description><![CDATA[Après 4 ans de développement, la communauté Mono est enfin parvenu à l&#8217;implémentation complète des Winforms : http://tirania.org/blog/archive/2008/May-13.html
On peux se demander &#8220;oui, mais pourquoi faire?&#8221; et je ne trouve pas de réponse à la question. En effet, il arrive souvent qu&#8217;une application .Net possède du Legacy et donc des dépendances COM ou P/Invoke. Dans ce [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Après 4 ans de développement, la communauté Mono est enfin parvenu à l&#8217;implémentation complète des Winforms : <a href="http://tirania.org/blog/archive/2008/May-13.html">http://tirania.org/blog/archive/2008/May-13.html</a></p>
<p>On peux se demander &#8220;oui, mais pourquoi faire?&#8221; et je ne trouve pas de réponse à la question. En effet, il arrive souvent qu&#8217;une application .Net possède du Legacy et donc des dépendances COM ou P/Invoke. Dans ce cas, on ne peut pas la migrer (pour tester si une migration est possible: <a href="http://www.mono-project.com/Moma">http://www.mono-project.com/Moma</a>)</p>
<p>Mais comme je suis exigent en terme d&#8217;interface, je n&#8217;aime pas avoir une application &#8220;alien&#8221; qui ne ressemble pas à mon environnement Linux (GTK/QT). Certes, il est prévu d&#8217;avoir un meilleur support du moteur de thème lors du prochain <a href="http://en.wikipedia.org/wiki/Google_Summer_of_Code">GSoC</a>, donc <em>wait and see</em>.</p>
<p>Rappelons que les Winforms sont une sur-couche .Net de l&#8217;API WIN32. Cette dernière n&#8217;existant pas sous Linux et MacOS, j&#8217;en profite alors pour féliciter les équipes de Mono pour leur implémentation &#8220;from scratch&#8221;.</p>
<p>D&#8217;un autre coté, l&#8217;implémentation WPF chez Mono avance plutôt vite. D&#8217;ailleurs, la première release de <a href="http://tirania.org/blog/archive/2008/May-13-1.html">Moonlight vient de sortir</a>. Il n&#8217;y a pas de dépendance WIN32 dans ce cas, et je vois plus l&#8217;avenir des applications .Net dans ce sens. Mais l&#8217;approche WPF est d&#8217;avoir un thème propre à l&#8217;application, comme c&#8217;est le cas pour les sites Web, on obtient la même interface sous Linux et Windows (et MacOS). Mais finalement je trouve que ces interfaces ne s&#8217;intègrent à aucun des 3 environnements.</p>
<p><span id="more-57"></span>J&#8217;avais déjà rédigé un billet sur la guerre entre les technologies de &#8220;présentation&#8221; dans le domaine du Web (Ajax/Flash/etc.). Je ne vous l&#8217;apprend pas, le monde &#8220;Desktop&#8221; et &#8220;Web&#8221; convergent. L&#8217;idée est plutôt simple: aujourd&#8217;hui on doit exécuter un OS qui héberge des applications &#8220;Desktop&#8221;, et on doit exécuter un navigateur pour les applications Web. On obtient une certaines confusion entre la barre des tâches pour les application et les onglets pour les sites Web. Tout ceci est beaucoup mieux expliqué <a href="http://labs.mozilla.com/2007/10/prism/">sur ce blog</a>.</p>
<p>Mais de plus en plus, le navigateur ne sert qu&#8217;à exécuter un plugin (Silverlight/Flash/Java) qui lui charge l&#8217;application.<br />
L&#8217;objectif est de lancer une application Web comme une application &#8220;Dekstop&#8221;, en exécutant le dis plugin en <em>standalone</em>, ou de passer par un &#8220;mini navigateur&#8221; (qui ne sert que pour le rendu HTML+Ajax, sans navigation etc). C&#8217;est en tout cas ce que propose <a href="http://www.adobe.com/products/air/">Adobe Air</a> ou <a href="http://wiki.mozilla.org/Prism">Mozilla Prism</a>.</p>
<p>Il va donc être difficile de distinguer une application &#8220;Desktop&#8221; ou &#8220;Web&#8221;. Ceci me fait un peu penser aux Widgets du <a href="http://upload.wikimedia.org/wikipedia/en/7/72/Leopard_Dashboard_BIG.png">Dashboard</a> sous MacOS (ou autre plagia).</p>
<p>Au même titre que le Web se rapproche du Bureau, les applications &#8220;lourdes&#8221; copient les techniques du Web question apparence. Il y a des tentatives d&#8217;utilisation de <a href="http://blog.developpez.com/index.php?blog=119&amp;title=moteur_css_pour_swing_et_swt_1">CSS en Swing/SWT</a>, mais l&#8217;exemple le plus flagrant est la description de l&#8217;interface à l&#8217;aide de XML comme dans <a href="http://en.wikipedia.org/wiki/XAML">XAML</a>.</p>
<p>On obtient ainsi des applications &#8220;Desktop&#8221; ne copiant pas du tout le style standard de l&#8217;OS, mais <a href="http://music.aol.com/help/syndication/desktop-widgets?promoid=BTLNP">ayant son propre thème</a> telle un site Web.</p>
<p>Le résultat peut s&#8217;avérer très jolie, très ergonomique, mais très &#8220;inconsistant&#8221; avec les autres applications. Pourquoi devrais-je apprendre une nouvelle interface? Pourquoi ne pas utilise un standard? Pourquoi ne pas me laisser choisir mon thème dans l&#8217;OS plutôt que de me l&#8217;imposer pour une application donnée?</p>
<p>Personnellement, je ne suis pas fan de toutes ces interfaces différentes, <a href="http://arstechnica.com/articles/culture/microsoft-learn-from-apple-II.ars/4">et je ne suis pas le seul</a>.<br />
Pour revenir sur l&#8217;OS Linux, un grand effort est fourni pour rendre les interfaces homogènes. On peut par exemple citer le <a href="http://en.wikipedia.org/wiki/Portland_Project">projet Portland</a> allant dans cette direction. Je peux alors apprécier ces efforts puisqu&#8217;il m&#8217;est devenu difficile de distinguer une application QT dans mon environnement GTK (essayez <a href="http://www.skype.com/download/skype/linux/">Skype sous Linux </a>pour vous en convaincre).</p>
<p>Je voulais aussi citer Redhat comme, à mon humble avis, les pionniers en matières d&#8217;homogénéisation avec leur thème <a href="http://en.wikipedia.org/wiki/Bluecurve">Bluecurve</a> identique sous KDE est Gnome. D&#8217;autre projets ont suivis dans le même genre comme <a href="http://tango.freedesktop.org/Tango_Desktop_Project">Tango</a>.</p>
<p>Enfin, les interfaces graphiques sont en pleines évolutions ces derniers temps, avec l&#8217;exploitation des cartes graphiques récentes, offrant des &#8220;<a href="http://compiz.org/Home/Screenshots">eye candy</a>&#8221; très alléchants. Le monde GTK est en <a href="http://arstechnica.com/articles/culture/reinventing-gtk.ars">pleine réflexion</a> pour les futures versions, et les thèmes <a href="http://www.cimitan.com/blog/2007/12/12/gtk-rgba-transparent-widgets-with-the-murrine-engine/">supportent de plus en plus d&#8217;effet</a>.<br />
Je préfère de loin cette approche ou l&#8217;OS propose un système de thème avancé (avec des techniques <a href="http://ubuntuforums.org/showthread.php?t=377397">proches du CSS</a>) et l&#8217;applique à toutes les applications, rendant le tout homogène. Néanmoins, je distinguerai toujours les applications type &#8220;Widget&#8221; qui ressemblent plus à de &#8220;mini-site&#8221; ou &#8220;application Web&#8221; qui elle ont une apparence propre à elles.</p>
<p>Comment seront les interfaces des OS du futures? Va-t-on vers un gros bordel graphique, ou une homogénéisation? WPF va-t-il percer sous Linux? Quels vont être les applications Winforms qui vont être migré sous Linux?</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/57/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/57/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=57&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/05/14/winforms-sous-linux/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>
	</item>
		<item>
		<title>Appeler du Java depuis .Net</title>
		<link>http://grozeille.com/2008/05/08/appeler-du-java-depuis-net/</link>
		<comments>http://grozeille.com/2008/05/08/appeler-du-java-depuis-net/#comments</comments>
		<pubDate>Thu, 08 May 2008 18:34:15 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[.Net]]></category>

		<category><![CDATA[c++]]></category>

		<category><![CDATA[interop]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[jni]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=53</guid>
		<description><![CDATA[Deux mondes s&#8217;affrontent: Java et .Net. Chacun choisi son camp, ou choisi les deux&#8230; moi j&#8217;ai la double nationalité  Mais quand les deux mondes doivent alors communiquer? Je fais l&#8217;interprète. Voila le topo:
J&#8217;ai une application .Net qui a besoin de manipuler des classes Java, et pour se faire je passe par C++/CLI: comment avoir [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Deux mondes s&#8217;affrontent: Java et .Net. Chacun choisi son camp, ou choisi les deux&#8230; moi j&#8217;ai la double nationalité <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Mais quand les deux mondes doivent alors communiquer? Je fais l&#8217;interprète. Voila le topo:<br />
J&#8217;ai une application .Net qui a besoin de manipuler des classes Java, et pour se faire je passe par <a href="http://en.wikipedia.org/wiki/C%2B%2B/CLI">C++/CLI</a>: comment avoir un pied dans du .Net et un autre dans du natif C++.<br />
<span id="more-53"></span><br />
L&#8217;avantage de C++/CLI (<a href="http://en.wikipedia.org/wiki/Common_Language_Infrastructure">Common Language Infrastructure</a>) c&#8217;est qu&#8217;on peut mixer du code managé et non-managé. Je peux donc compiler un assembly .Net en C++, qui lui fait appelle à du pure code C++ natif. Ici en l&#8217;occurrence j&#8217;utilise <code>"jni.h"</code> pour communiquer avec la JVM à l&#8217;aide de <code>jvm.dll</code>.</p>
<p>Rentrons dans le vif du sujet: qu&#8217;est-ce que ça donne du coté de mon application C#:</p>
<pre name="code" class="csharp">

// on démarre la JVM avec mes bons arguments
MathiasJniCpp.JVMWrapper.InitJvm(new String[] { &quot;-Djava.class.path=Mathias.Jni.Java.jar&quot; });

// on créer un objet .Net qui wrappe l&#039;objet Java
// en C++/CLI, le destructeur des classes CLI sert de méthode &quot;Dispose&quot;
using (MathiasJniCpp.MyJavaWrapper javaObject = new MathiasJniCpp.MyJavaWrapper())
{
// faire mumuse avec...
javaObject.People = &quot;Mathias&quot;;
Console.WriteLine(javaObject.SayHello());
}

// on libère la JVM
JVMWrapper.ReleaseJvm();
</pre>
<p><code>MathiasJniCpp</code> c&#8217;est le namespace de mon assembly c++/cli, j&#8217;en reparlerai plus tard.<br />
On voit que je manipule une classe JVMWrapper qui me permet de charger une JVM (et de la libérer). J&#8217;utilise aussi une classe .Net codé en C++/CLI. En fait, je l&#8217;utilise comme un classe C#, ou VB.net etc. C&#8217;est une classe &#8220;classique&#8221; .Net avec des méthodes et des propriétés.</p>
<p>Point intéressant à souligner: pourquoi utiliser <code>using</code>?<br />
Pour rappelle, il y a des mots-clefs en C# très lié au Framework (comme <code>foreach</code>) et <code>using</code> en fait partie. Il prend les objets qui implémente <code>IDisposable</code> et fait appelle à la méthode <code>Dispose()</code> à la fin du bloque. Comme ça, je suis sûr de libérer la classe du coté JVM quand j&#8217;en ai plus besoin.</p>
<p>Je ne vais pas montrer tout le code, car trop long et <a href="http://www.box.net/shared/ropzl4u80o">disponible ici</a>.<br />
Mais voici un aperçu de la classe C++:</p>
<pre name="code" class="cpp">

#include &quot;jni.h&quot;
public ref class MyJavaWrapper
{
private:
  static jmethodID initMethodId;
  static jclass clazz;
  jobject obj;
public:
  /* initialisation des métadata Java/JNI, à voir plus tard */
  static void initJavaMetadata()
  { ... }

  /* une méthode de notre classe Java que l&#039;on wrappe, expliqué aussi plus tard */
  String^ SayHello(String^ people)
  { ... }

  /* constructeur */
  MyJavaWrapper(void)
  {
    // histoire de récupérer toutes les métadatas nécessaires du coté Java
    MyJavaWrapper::initJavaMetadata();

    // construction d&#039;une instance avec le constructeur par défaut
    this-&gt;obj = JVMWrapper::env-&gt;NewObject(MyJavaWrapper::clazz, MyJavaWrapper::initMethodId);
  }

  /* &quot;destructeur&quot; */
  virtual ~MyJavaWrapper(void)
  {
    JVMWrapper::env-&gt;DeleteLocalRef(this-&gt;obj);
  }
};
</pre>
<p><code>ref class</code> veut dire &#8220;c&#8217;est une classe .Net&#8221;. Mais&#8230; ma classe n&#8217;implémente pas <code>IDisposable</code>!! Et c&#8217;est quoi ce destructeur??<br />
Et oui: le destructeur C++ pour un objet .Net est transformé en la méthode <code>Dispose()</code> et la classe devient alors forcement <code>IDisposable</code>. Pour gérer le <code>finalize</code> <a href="http://dotnet.developpez.com/faq/cppcli/?page=syntaxe#finalizer_vs_destructor">allez voir ici</a>.</p>
<p>Je manipule le membre <code>this-&gt;obj</code> qui est tout simplement un &#8220;pointeur&#8221; sur notre objet java. En fait, c&#8217;est un <code>jobject</code> qui est un type définie dans <code>"jni.h"</code>.<br />
J&#8217;utilise la classe JVMWrapper qui me permet de communiquer avec la JVM, et je lui demande de créer un nouvel objet d&#8217;une certaine classe <code>jclass</code> avec un certain constructeur <code>jmethodID</code> et j&#8217;obtiens ainsi mon <code>jobject</code>.<br />
<em>Étant donnée que la classe et la méthode ne change pas, j&#8217;ai rendu ces données <code>static</code>.</em></p>
<p>Voyons maintenant ce que fait <code>MyJavaWrapper::initJavaMetadata();</code>:</p>
<pre name="code" class="cpp">

/* initialise les metadata du coté Java */
static void initJavaMetadata()
{
  // si les métadata ne sont pas déjà récupérées...
  if(MyJavaWrapper::clazz == NULL)
  {
    MyJavaWrapper::clazz = JVMWrapper::env-&gt;FindClass(&quot;mathias/jni/java/MyJavaClass&quot;);
    MyJavaWrapper::initMethodId = JVMWrapper::env-&gt;GetMethodID(MyJavaWrapper::clazz, &quot;&lt;init&gt;&quot;, &quot;()V&quot;);
  }
}
</pre>
<p>C&#8217;est la dedans que j&#8217;obtiens une fois pour toute la représentation de la classe Java <code>mathias.jni.java.MyJavaClass</code> et la représentation de la méthode <code>&lt;init&gt;</code> avec en paramètre <code>()V</code>.<br />
Pour comprend le lien avec la classe, il n&#8217;y a pas trop de problème: c&#8217;est le <a href="http://en.wikipedia.org/wiki/Fully_qualified_name">fully qualified name</a> avec des &#8216;/&#8217; au lieu des &#8216;.&#8217;.<br />
Mais en ce qui concerne la recherche d&#8217;une méthode, ça devient du charabia!!<br />
En fait, <code>&lt;init&gt;</code> est une méthode un peu spéciale: c&#8217;est un constructeur.<br />
Ensuite, on spécifie les arguments du constructeur que l&#8217;on cherche, et la on tombe sur une syntaxe barbare. Dans notre cas, on cherche le constructeur par défaut c&#8217;est à dire qui ne prend pas d&#8217;argument.<br />
Mais pour mieux comprendre la syntaxe barbare, voyons d&#8217;autres exemples de méthodes:</p>
<pre name="code" class="cpp">

JVMWrapper::env-&gt;GetMethodID(MyJavaWrapper::clazz, &quot;setPeople&quot;, &quot;(Ljava/lang/String;)V&quot;);
</pre>
<p>Traduction: je cherche la méthode <code>setPeople</code> qui prend un argument de type <code>java.lang.String</code> et qui retourne <code>void</code>.<br />
Un autre exemple:</p>
<pre name="code" class="cpp">

JVMWrapper::env-&gt;GetMethodID(MyJavaWrapper::clazz, &quot;sayHello&quot;, &quot;([Ljava/lang/String;Z;)I&quot;);
</pre>
<p>Traduction: je cherche la méthode <code>sayHello</code> qui prend un argument de type <code>java.lang.String[]</code> et un autre de type <code>boolean</code> et qui retourne un type <code>int</code>.</p>
<p>On retrouve cette syntaxe à beaucoup d'endroits, comme sous <a href="http://grozeille.files.wordpress.com/2008/05/eclipsejni.png">Eclipse</a> par exemple. Pour plus d'explication voir la <a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/types.html">documentation officielle</a>.</p>
<p>Si l'on veut maintenant appeler une méthode Java, on récupère sa représentation tout comme on le fait avec le constructeur, puis on l'invoque sur notre instance:</p>
<pre name="code" class="csharp">

public ref class MyJavaWrapper
{
private:
  static jmethodID initMethodId;
  static jclass clazz;

  // notre représentation JNI de la méthode &quot;sayHello&quot;
  static jmethodID sayHelloMethodId;

  jobject obj;
public:
  /* initialisation des métadata Java/JNI */
  static void initJavaMetadata()
  {
    /* initialisation de la classe et du constructeur, comme vu précédemment
    [...]  */

    // on récupère la représentation de &quot;sayHello&quot;
    JVMWrapper::env-&gt;GetMethodID(MyJavaWrapper::clazz, &quot;sayHello&quot;, &quot;(Ljava/lang/String;)Ljava/lang/String&quot;);
  }

  /* sur l&#039;appelle de cette méthode .Net, on fait appelle à la méthode Java */
  String^ SayHello(String^ people)
  {
    // j&#039;utilise une classe spéciale pour convertir ma String^ .net en natif ou Java
    StringConverter peopleStringConverter(people);
    jstring jPeople = peopleStringConvert.toJava();

    // appelle de la méthode Java, j&#039;ai le droit de caster en jstring car c&#039;est un sous-type de jobject
    jstring jResult = (jstring)JVMWrapper::env-&gt;CallObjectMethod(this-&gt;obj, sayHelloMethodId, jPeople);

    // conversion du type Java en .Net
    StringConverter resultStringConvert(jResult);
    return resultStringConvert.toDotnet();
  }
};
</pre>
<p>Voila, maintenant vous savez:</p>
<ul>
<li>obtenir la représentation d&#8217;une classe Java</li>
<li>obtenir la représentation d&#8217;une méthode d&#8217;une classe</li>
<li>créer une instance d&#8217;une classe Java</li>
<li>invoker des méthodes sur une instance</li>
</ul>
<p>En conclusion:<br />
l&#8217;API JNI c&#8217;est un peux comme utiliser la réflection. Ça a donc des conséquences en termes de performance. Pour information, créer 10000 objet en java prend <em>625ms</em>, en pure .net ça donne <em>46ms</em> et en .Net-&gt;JNI-&gt;Java ça donne <em>2.687s</em>.<br />
L&#8217;API JNI peut sembler barbare au début, mais on s&#8217;y fait <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> et puis il y a <a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/functions.html#wp20949">la doc</a>, alors <a href="http://en.wikipedia.org/wiki/RTFM">RTFM</a> ;).</p>
<p>C++/CLI c&#8217;est de la bombe en termes d&#8217;interop. C&#8217;est le pont parfait entre le monde .Net et le natif.<br />
L&#8217;inconvénient c&#8217;est que la syntaxe C++ est lourde. Et elle l&#8217;est d&#8217;autant plus en C++/CLI car il faut y ajouter les spécificités .Net, et il faut aussi distinguer une instance managée et non-managée, et tout ça passe par de nouveau symboles/mots-clefs.<br />
Les conversions de types entre les deux mondes ne sont pas faites implicitement, et il faut souvent jongler pour avoir le bon type. J&#8217;ai par exemple eu des problèmes lors des conversions de String avec JNI: il faut convertir la <code>String^</code> .net en <code>char*</code> natif pour enfin construire une <code>jstring</code>. Les conversions ont été le plus pénible dans l&#8217;histoire.</p>
<p>Enfin, voici le projet complet: <a href="http://www.box.net/shared/ropzl4u80o">Mathias.Jni.CSharp.zip</a><br />
Un petit rappel des liens utiles:</p>
<ul>
<li><a href="http://dotnet.developpez.com/faq/cppcli/">http://dotnet.developpez.com/faq/cppcli/</a></li>
<li><a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/jniTOC.html">http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/jniTOC.html</a></li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/53/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/53/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=53&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/05/08/appeler-du-java-depuis-net/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>
	</item>
		<item>
		<title>Un iMac en vue?</title>
		<link>http://grozeille.com/2008/05/04/un-imac-en-vue/</link>
		<comments>http://grozeille.com/2008/05/04/un-imac-en-vue/#comments</comments>
		<pubDate>Sun, 04 May 2008 12:38:42 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Blabla]]></category>

		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Geek]]></category>

		<category><![CDATA[iMac]]></category>

		<category><![CDATA[MacOSX]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=52</guid>
		<description><![CDATA[Hier j&#8217;ai eu un petit coup de stress: je suis allé à tout hasard sur le site d&#8217;Apple et &#8220;oh joie&#8221; l&#8217;iMac a bénéficié d&#8217;une mise-à-jour&#8230; mais ce qui m&#8217;a le plus emballé c&#8217;est l&#8217;adoption d&#8217;un Nvidia 8800GS! Oui, ce n&#8217;est plus un ATI spécialisé dans le multimédia, mais bien une Geforce!

Certes, la version &#8220;GS&#8221; [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Hier j&#8217;ai eu un petit coup de stress: je suis allé à tout hasard sur le site d&#8217;<a href="http://www.apple.fr">Apple</a> et &#8220;oh joie&#8221; l&#8217;iMac a bénéficié d&#8217;une <a href="http://www.apple.com/fr/imac/">mise-à-jour</a>&#8230; mais ce qui m&#8217;a le plus emballé c&#8217;est l&#8217;adoption d&#8217;un Nvidia 8800GS! Oui, ce n&#8217;est plus un ATI spécialisé dans le multimédia, mais bien une Geforce!<br />
<span id="more-52"></span><br />
Certes, la version &#8220;GS&#8221; est très loin de la &#8220;GTX&#8221;&#8230; n&#8217;oublions pas qu&#8217;un iMac c&#8217;est comme un gros portable: compact, sans bruit et consommant peu. Sur ce dernier point j&#8217;ai lu des critiques qui souligne que l&#8217;Upgrade n&#8217;est pas sans conséquence sur la puissance consommée.</p>
<p>Pour vous dire toute la vérité, ça fait des années que je bave sur les Mac pour leur design, leur discrétion et leur OS. De plus, depuis les processeurs Intel et <a href="http://www.apple.com/fr/macosx/features/bootcamp.html">BootCamp</a>, je rêve du triple-boot MacOSX-Windows-Linux:</p>
<ul>
<li>MacOSX: car c&#8217;est un superbe OS, et j&#8217;ai hâte de tester <a href="http://revver.com/video/230333/simple-cocoaobjective-c-xcode-tutorial/">Cocoa</a></li>
<li>Windows: car certains softs n&#8217;existent que sous Windows (certains jeux, Visual studio, etc.)</li>
<li>Linux: car j&#8217;adore le libre, j&#8217;adore Linux et j&#8217;adore le libre (déjà dit?)</li>
</ul>
<p>Je me suis souvent retenu d&#8217;en acheter un pour diverses raisons. La dernière étant &#8220;mais bordel, pourquoi ils n&#8217;ont pas mis une Geforce 8800???&#8221;. D&#8217;une part parce que leurs ATIs sont plus spécialisées multimédia que jeux, et je voulais me tester aux jeux &#8220;plus ou moins&#8221; récents en bootant sous Windows (car mon Athlon XP2000+ avec une GeForce6000GT commencent à faire vieux).<br />
D&#8217;autre pars, car j&#8217;ai de mauvaises expériences avec ATI sous Linux (oui je l&#8217;avoue, c&#8217;est <a href="http://youtube.com/watch?v=E4Fbk52Mk1w">Compiz</a> qui m&#8217;a fait acheter ma première NVidia&#8230; oui je suis trop geek&#8230;).</p>
<p>Mais maintenant je n&#8217;ai plus aucune excuse! Je me suis donc précipité à la Fnac hier dans l&#8217;après-midi.<br />
Pas de chance: le nouvel iMac 3.06Ghz est trop récent, et ils ne l&#8217;auront que la semaine prochaine. Par contre, j&#8217;ai une infos qui peut vous intéresser: la Fnac propose d&#8217;échelonner ses paiements, et exceptionnellement au mois de Mai c&#8217;est sans frais (jusqu&#8217;à 15 mensualités).</p>
<p>Rendez-vous la semaine prochaine <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/52/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/52/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=52&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/05/04/un-imac-en-vue/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>
	</item>
		<item>
		<title>A la conquête du Web 3.0</title>
		<link>http://grozeille.com/2008/05/02/a-la-conquete-du-web-30/</link>
		<comments>http://grozeille.com/2008/05/02/a-la-conquete-du-web-30/#comments</comments>
		<pubDate>Fri, 02 May 2008 22:15:09 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[.Net]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Flex]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[JavaFX]]></category>

		<category><![CDATA[mono]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=51</guid>
		<description><![CDATA[J&#8217;ai eu une discutions intéressante ce midi au sujet du buzz en ce moment: Adobe open-source Flash! Je vois ça comme un premier pas vers la conquête du Web 3.0. Une guerre déjà entamé entre Adobe, Microsoft et le monde libre.

Haha, je sais que le terme Web 2.0 fait couler beaucoup d&#8217;encre (ou abîme les [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>J&#8217;ai eu une discutions intéressante ce midi au sujet du buzz en ce moment: <a href="http://www.adobe.com/openscreenproject/">Adobe open-source Flash</a>! Je vois ça comme un premier pas vers la conquête du Web 3.0. Une guerre déjà entamé entre Adobe, Microsoft et le monde libre.<br />
<span id="more-51"></span><br />
Haha, je sais que le terme <em><a href="http://fr.wikipedia.org/wiki/Web_2.0">Web 2.0</a></em> fait couler beaucoup d&#8217;encre (ou abîme les claviers) mais moi je le prend du point de vue du développeur:</p>
<p>Au début, il y avait le néant&#8230; puis l&#8217;informaticien inventa la page HTML! Dans sa foulé il inventa le Javascript&#8230; puis les applets Java&#8230; pas de chance, l&#8217;informaticien était en avance sur son temps&#8230;</p>
<p>Puis le Web s&#8217;est vu enrichir de nouveau média (Youtube, Deezer, etc.) Toute cette magie est possible grâce aux génies de <a href="http://fr.wikipedia.org/wiki/Macromedia">Macromédia</a> inventeurs du Flash! (racheté par la suite par Adobe)<br />
Le web est devenu plus beau, plus fun&#8230; et plus lourd tout de même.<br />
Flash est aujourd&#8217;hui la techno incontesté pour les médias riches. Elle était aussi en avance sur son temps: les sites entièrement Flash était encore trop lourd pour les débits de l&#8217;époque. Ce n&#8217;est aujourd&#8217;hui plus un problème, mais si tous les sites ne sont pas en Flash, je l&#8217;explique pour plusieurs raisons:<br />
Premièrement, cette technologie était boudé par le monde Linux qui se retrouvé avec un produit propriétaire, des versions en retard par rapport à celles sur Windows, et même souvent bugguées.<br />
Les adeptes des standards W3C ne voient pas non plus Flash d&#8217;un très bon œil et préfère se concentrer sur la norme HTML+<a href="http://fr.wikipedia.org/wiki/ECMAScript">ECMASCRIPT</a> (autrement dit: Javascript).</p>
<p>C&#8217;est la que le Web 2.0 atteint son paroxysme: les sites Web d&#8217;aujourd&#8217;hui exploitent à fond le Javascript (<a href="http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML">Ajax</a>, <a href="http://code.google.com/webtoolkit/">GWT</a>, <a href="http://script.aculo.us/">Scriptaculous</a>, etc.). Cela donne des pages Web plus riches, plus interactives, plus animées, et plus légères!<br />
Car oui, le bon vieux HTML avec un peu de Javascript c&#8217;est plus léger que du Flash. Certains dénonceront simplement les mauvais codeurs ActionScript qui sont souvent des graphistes reconvertis et qui font des choses non-optimisés&#8230;<br />
Ceci dit, cette performance n&#8217;est possible que grâce aux <a href="http://www.apple.com/safari/">effort fournis par les navigateurs Web</a> qui supportent <a href="http://www.korben.info/un-coup-de-boost-pour-firefox-3.html">de mieux en mieux</a> le Javascript.<br />
Mais voila, les vidéos ou encore d&#8217;autres choses ne sont pas possibles en HTML+Javascript aujourd&#8217;hui, et c&#8217;est pourquoi que Flash est encore très utilisé (surtout concernant la vidéo).</p>
<p>C&#8217;est la que Microsoft riposte avec <a href="http://silverlight.net/">Silverlight</a> et ça va faire mal.<br />
Imaginez: un plugin similaire à Flash, mais plus performant (<a href="http://fr.wikipedia.org/wiki/Windows_Presentation_Foundation">WPF</a> utilisant gracieusement DirectX) avec des langages plus faciles à coder (C#, XAML, etc.) et des outils de développement/design très soignés (la série des <a href="http://www.microsoft.com/expression/products/overview.aspx?key=blend">Expression</a>).</p>
<p>Mais la communauté pro-libre/pro-standard n&#8217;en reste pas la: <a href="http://en.wikipedia.org/wiki/HTML_5">HTML5</a> est censé combler les lacunes vis-à-vis de Flash ou Silverlight.</p>
<p>Sun veut aussi être de la partie, après l&#8217;échec des applets, il tente nous proposer <a href="https://openjfx.dev.java.net/downloads.html">JavaFX</a>.<br />
Les principales raisons de l&#8217;échec des applets sont:<br />
- Java c&#8217;est gros et lourd à télécharger&#8230; imaginez un JRE de 30mo à l&#8217;époque des 56k!<br />
- Ce <del datetime="00">n&#8217;est</del> n&#8217;était pas non plus très performant, surtout en matière d&#8217;affichage.<br />
- Il n&#8217;existe aucun outil pour graphiste pour faire des applets! C&#8217;est la que Macromédia avec Flash avait marqué un point.<br />
- Ce <del datetime="00">n&#8217;est</del> n&#8217;était pas libre&#8230; donc difficile à faire adopter par la communauté des développeurs.</p>
<p>Mais Sun propose des solutions:</p>
<ul>
<li><a href="http://weblogs.java.net/blog/enicholas/archive/2006/09/java_browser_ed.html">Java Kernel</a>: le principe est simple, il faut que le téléchargement d&#8217;une JRE soit négligeable (tout comme Flash). Pour ce faire, l&#8217;utilisateur télécharge une version &#8220;minimale&#8221; de la JRE, qui téléchargera des paquets supplémentaires seulement s&#8217;il y en a besoin.</li>
<li>Java2D/Swing <a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/#Java_2D">plus performant</a>, ainsi que l&#8217;accélération avec DirectX (elle existait depuis peux de temps, mais désactivé par défaut car trop buggué). Cela permet aussi des effets comme la transparence etc.</li>
<li><a href="http://www.cnettv.com/9742-1_53-27434.html">JavaFX</a>: ou comment créer un langage de description d&#8217;interface, pour créer plus simplement des animations etc.</li>
<li>Java est <a href="http://openjdk.java.net/">open-source</a>: à quand Java installé par défaut sous Linux? (Même si c&#8217;est maintenant un <a href="http://openjdk.java.net/install/#ubuntu">paquet officiel d&#8217;Ubuntu</a>)</li>
</ul>
<p>Le seul hick qui va faire très très mal: toujours pas d&#8217;outil puissant pour les graphistes.<br />
On peut aussi se demander pourquoi avoir inventer un n-ième langage de script, là où tout le monde optent pour le XML comme descripteur d&#8217;interface.</p>
<p>On remarque que &#8220;Open-source&#8221; est maintenant synonyme de &#8220;standard&#8221;, et ça Adobe l&#8217;a compris. Fort se sa popularité, l&#8217;ouverture forcement va booster son engouement.<br />
Microsoft n&#8217;est pas en reste dans ce domaine: depuis son alliance avec <a href="http://www.novell.com/home/index.html">Novell</a>, ils travaillent tous deux pour promouvoir <a href="http://www.mono-project.com/Main_Page">.Net sous Linux</a> même si l&#8217;équivalent à Silverlight en libre, <a href="http://www.mono-project.com/Moonlight">Moonlight</a>, est encore loin de <a href="http://www.youtube.com/watch?v=qRSO7p0HAIw&amp;feature=related">voir le jour</a>&#8230;<br />
On pouvait pointer du doigt le manque de <em>sérieux</em> en matière de développement avec ActionScript, mais avec <a href="http://www.adobe.com/products/flex/media/flexapp/">Flex</a> ce n&#8217;est plus vrai.</p>
<p>Avec toutes ces technos, on se demande si le navigateur ne servira plus qu&#8217;a charger un plugin Flash/Java/Silverlight, et déléguera le travail de rendu à ceux la. <a href="http://osnews.com/story/19699/Mozilla-Warns-of-Flash-Silverlight-Agenda">Mozilla sonne l&#8217;alarme</a> et explique l&#8217;importance de HTML5.</p>
<p>Les paries sont lancés:<br />
Les prochains sites-web, en Flash? HTML5+Javascript? Silverlight/Moonlight? JavaFX?</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/51/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/51/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=51&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/05/02/a-la-conquete-du-web-30/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>
	</item>
		<item>
		<title>Timeout WCF au bout d’un certain nombre d’appels</title>
		<link>http://grozeille.com/2008/04/30/timeout-wcf-au-bout-dun-certain-nombre-dappels/</link>
		<comments>http://grozeille.com/2008/04/30/timeout-wcf-au-bout-dun-certain-nombre-dappels/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 23:20:52 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[Spring.net]]></category>

		<category><![CDATA[.Net]]></category>

		<category><![CDATA[WCF]]></category>

		<category><![CDATA[tips]]></category>

		<category><![CDATA[Asp.net]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=50</guid>
		<description><![CDATA[Rien de plus stressant que de passer une journée entière sur un bug. Surtout si on n&#8217;a aucune idée du problème (pas d&#8217;exceptions, ni d&#8217;erreurs dans les logs) et que les recherches sur Internet sont infructueuses.
Contexte : une application Web Asp.Net communique avec un service WCF.
Problème : au bout d’un certain nombre d’appels (invariant) l’application [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Rien de plus stressant que de passer une journée entière sur un bug. Surtout si on n&#8217;a aucune idée du problème (pas d&#8217;exceptions, ni d&#8217;erreurs dans les logs) et que les recherches sur Internet sont infructueuses.<br />
<strong>Contexte</strong> : une application Web Asp.Net communique avec un service WCF.<br />
<strong>Problème</strong> : au bout d’un certain nombre d’appels (invariant) l’application Web n’arrive plus à joindre le serveur (Timeout).</p>
<p><span id="more-50"></span>Pour conserver une trace de mon incompétence, voici donc la <strong>solution</strong>:<br />
Pour qu&#8217;on puisse dialoguer avec un service WCF dans une page Asp.net, je leur injecte un proxy à l’aide de Spring (voir <a href="http://www.springframework.net/doc-latest/reference/html/web.html#web-di">Spring.net pour le web</a>). Pour cela, j’utilise une &#8220;factory de proxy&#8221; à l’aide de l’interface <a href="http://www.springframework.net/doc-latest/reference/html/objects.html#d0e4032">IFactoryObject</a>.<br />
Crédule que j’étais, j’imaginais que le fait de retourner <code>true</code> pour la propriété <code>IsSingleton</code> allait faire en sorte que Spring.net ne fasse appel qu’une seule fois à la méthode <code>GetObject()</code>.<br />
Et bien non ! C&#8217;est à vous d’être cohérent: même si <code>IsSingleton</code> retourne <code>true</code>,  rien ne vous empêche de toujours retourner une instance différente dans la méthode <code>GetObject()</code>.</p>
<p>Pour en revenir à mon problème, vous l’aurez compris : ma méthode <code>GetObject()</code> retournait à chaque fois un nouveau proxy vers le service WCF.<br />
<strong>Résulat</strong> : à chaque fois que Spring avait besoin d’injecter mon proxy à une page (postback par exemple), je créai une nouvelle connexion au serveur WCF. J&#8217;ai fini par atteindre le nombre de connexion max, et le serveur ne répondait plus.</p>
<p>Il est tout de même dommage que les <a href="http://msdn.microsoft.com/en-us/library/ms732023.aspx">traces WCF</a> ne m&#8217;ont pas révélé d&#8217;exception expliquant cette limite max de connexion <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Pour approfondir le sujet sur les <code>IFactoryObject</code> :<br />
Un objet qui implémente <code>IFactoryObject</code> doit toujours être un singleton, si ce n’est pas le cas on obtient une exception:</p>
<pre name="code" class="xml">

&lt;object id=&quot;maFactory&quot; type=&quot;MonAssembly.MaFactory, MonAssembly&quot; singleton=&quot;false&quot;/&gt;
</pre>
<p><code><br />
=&gt; IFactoryObject must be defined as a singleton - IFactoryObjects themselves are not allowed to be prototypes.<br />
</code></p>
<p>La propriété <code>IsSingleton</code> de la factory indique seulement ce qu’elle est censée faire&#8230; mais sans aucune obligation/vérification du comportement. Dans mon cas, je retournais <code>true</code> mais rien ne m&#8217;a empêché de créer une nouvelle instance à chaque appel&#8230;</p>
<p>Dans le cas particulier d&#8217;une application Asp.net, on peut avoir des &#8220;presque singleton&#8221; en changeant le <code>scope</code>:</p>
<pre name="code" class="xml">

&lt;object id=&quot;maFactory&quot; type=&quot;MonAssembly.MaFactory, MonAssembly&quot; scope=&quot;application&quot;/&gt;
</pre>
<ul>
<li>scope=&#8221;application&#8221; : c&#8217;est un singleton de toute l&#8217;application web. Firefox et Safari m&#8217;affiche toujours 1.</li>
<li>scope=&#8221;session&#8221; : c&#8217;est un singleton pour chaque session cliente. Firefox et Safari m&#8217;affiche toujours 2 (1 instance pour Firefox +  1 instance pour Safari).</li>
<li>scope=&#8221;request&#8221; : c&#8217;est un singleton dans le cadre de la requête. Firefox et Safari vois le compteur s&#8217;incrémenter à chaque rafraichissement de la page.</li>
</ul>
<p>Pour <a href="http://www.springframework.net/doc-latest/reference/html/objects.html#d0e2577">plus d&#8217;infos sur les scopes</a>.</p>
<p><strong>Conclusion(s)</strong> :</p>
<ol>
<li>Ce n&#8217;est pas la propriété <code>IsSingleton</code> qui détermine si Spring va faire appelle une ou plusieurs fois à votre Factory. C&#8217;est à elle de fournir le comportement adéquat.</li>
<li>Un singleton n&#8217;en est pas toujours un&#8230; ça dépend du contexte. Dans tous les cas, pour éviter les erreurs comme la mienne, n&#8217;oublier pas d&#8217;utiliser la <code>destroyMethod</code> pour libérer les ressources. (l&#8217;interface <code>ILifeCycle</code> de Java <a href="http://jira.springframework.org/browse/SPRNET-753">n&#8217;existe pas encore</a> dans Spring.net  mais la <a href="http://www.springframework.net/roadmap.html">1.2 sort en RC1 début mai</a>&#8230;).</li>
<li>Un &#8220;Timeout&#8221; peut vouloir dire &#8220;trop de connexion au serveur&#8221; <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Cette fameuse Factory de proxy WCF sera fournie dans Spring.net 1.2. j&#8217;aurais perdu moins de temps en <a href="http://forum.springframework.net/showthread.php?t=2936">prenant les sources des nightbuilds</a>&#8230; vive l&#8217;OpenSource!</li>
</ol>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/50/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/50/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=50&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/04/30/timeout-wcf-au-bout-dun-certain-nombre-dappels/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>
	</item>
		<item>
		<title>Utiliser des *.resx externes (avec Spring.net)</title>
		<link>http://grozeille.com/2008/04/27/utiliser-des-resx-externes-avec-springnet/</link>
		<comments>http://grozeille.com/2008/04/27/utiliser-des-resx-externes-avec-springnet/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 19:19:38 +0000</pubDate>
		<dc:creator>grozeille</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[Spring.net]]></category>

		<category><![CDATA[.Net]]></category>

		<category><![CDATA[I18N]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=32</guid>
		<description><![CDATA[On a parfois besoin de livrer une application .Net avec les fichiers de ressources, afin qu&#8217;un traducteur, voir même un intégrateur, puisse faire les traductions au dernier moment.
Si cette personne doit recompiler l&#8217;application pour voir le fruit de son travail, ce n&#8217;est pas très pratique voir impossible: allez lui expliquer que VisualStudio n&#8217;est pas nécessaire [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>On a parfois besoin de livrer une application .Net avec les fichiers de ressources, afin qu&#8217;un traducteur, voir même un intégrateur, puisse faire les traductions au dernier moment.</p>
<p>Si cette personne doit recompiler l&#8217;application pour voir le fruit de son travail, ce n&#8217;est pas très pratique voir impossible: allez lui expliquer que VisualStudio n&#8217;est pas nécessaire et qu&#8217;il est possible de créer des ressources avec <a href="http://msdn2.microsoft.com/fr-fr/library/ccec7sz1(VS.80).aspx">ResGen.exe</a> (et <a href="http://msdn2.microsoft.com/fr-fr/library/c405shex(VS.80).aspx">al.exe</a> pour faire des <a href="http://msdn2.microsoft.com/fr-fr/library/sb6a8618(VS.80).aspx">assembly satellites</a>). Très franchement, les traducteurs ne veulent pas de quelque chose d&#8217;aussi et vont vous fuir comme la peste si vous leur demander d&#8217;être des développeurs.</p>
<p><span id="more-32"></span>La solution est donc d&#8217;utiliser simplement des fichier *.resx sans les compiler, et elle a plusieurs avantages:</p>
<ul>
<li>le traducteur n&#8217;a pas à savoir comment compiler des ressources (ce n&#8217;est pas un développeur)</li>
<li>les fichiers *.resx sont sous la forme XML, et donc (très?) lisible (la structure propose même un champ &#8220;commentaire&#8221;)</li>
<li>il existe bien sûr des éditeurs de fichiers *.resx pour ceux qui ne veulent même pas savoir ce que XML veut dire: <a href="http://www.aisto.com/roeder/dotnet/">Resourcer for .net</a></li>
</ul>
<p>Vous pouvez retrouver ces explication sur <a href="http://blechie.com/WPierce/archive/2007/08/01/Using-Resx-Files-with-a-ResourceManager.aspx">le blog suivant</a>. <a href="http://blechie.com/WPierce/archive/2007/08/01/Using-Resx-Files-with-a-ResourceManager.aspx"><br />
</a>Et Oh joie! Ce blog explique comment réaliser un <code>ResourceManager</code> personnalisé capable de charger des fichiers .resx! C&#8217;est donc tous ce qu&#8217;il nous faut, nul besoin de réinventer un autre mécanisme de traduction maison.</p>
<p>Pour pousser la réflexion plus loin, je voulais utiliser Spring.net pour obtenir la traduction. Cette solution à pour avantage de ne passer que par le contexte pour obtenir cette dernière, peut importe dans quel fichier elle se trouve. Il suffit alors de paramétrer dans le fichier <code>App.Config</code> le chemin de chaque fichier *.resx.</p>
<p>Pour ce faire, rien de plus facile: Spring.net fournit une classe qui recense un certain nombre de <code>ResourceManager</code>. En référençant donc notre <code>ResxResourceManager</code> qui pointe sur notre fichier *.resx, le contexte Spring sera alors capable de fournir les bonnes traductions si on l&#8217;interroge. Pour obtenir une traduction dans la culture courante, il suffira alors d&#8217;écrire ceci:</p>
<pre name="code" class="csharp">

ContextRegistry.GetContext().GetMessage(&quot;MaClef&quot;);
</pre>
<p>Le XML de configuration ressemble à ça:</p>
<pre name="code" class="xml">

&lt;object name=&quot;messageSource&quot; type=&quot;Spring.Context.Support.ResourceSetMessageSource, Spring.Core&quot;&gt;
  &lt;property name=&quot;ResourceManagers&quot;&gt;
    &lt;list&gt;
      &lt;!-- ResourceManager qui pointe sur notre fichier Resx\MyResource.resx --&gt;
      &lt;object id=&quot;MyResource&quot; type=&quot;TestWinformsRessources.ResxResourceManager&quot;&gt;
        &lt;constructor-arg name=&quot;baseName&quot; value=&quot;MyResource&quot;/&gt;
        &lt;constructor-arg name=&quot;resourceDir&quot; value=&quot;Resx&quot;/&gt;
      &lt;/object&gt;
    &lt;/list&gt;
  &lt;/property&gt;
&lt;/object&gt;
</pre>
<p>Vous pouvez voire concrètement ce que ça donne avec <a href="http://www.box.net/shared/al00ws8w0s">un petit exemple</a>.</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fgrozeille.wordpress.com%2f2008%2f04%2f27%2futiliser-des-resx-externes-avec-springnet%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fgrozeille.wordpress.com%2f2008%2f04%2f27%2futiliser-des-resx-externes-avec-springnet%2f&amp;border=6699cc&amp;bgcolor=99cc66&amp;cbgcolor=f3f6ec" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/32/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/32/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/32/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&blog=173450&post=32&subd=grozeille&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/04/27/utiliser-des-resx-externes-avec-springnet/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/grozeille-128.jpg" medium="image">
			<media:title type="html">GroZeiLLe</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fgrozeille.wordpress.com%2f2008%2f04%2f27%2futiliser-des-resx-externes-avec-springnet%2f&amp;border=6699cc&amp;bgcolor=99cc66&amp;cbgcolor=f3f6ec" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>
	</item>
	</channel>
</rss>
