<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2frenchfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.olivier-duval.info/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
  <title>Zork[Yy]'s log</title>
  <link>http://blog.olivier-duval.info/?</link>
  
  <description>Olivier DUVAL on the blog : péripéties d'un passionné du web, développement &amp; co</description>
  <language>fr</language>
  <pubDate>Fri, 13 Aug 2010 09:13:52 +0200</pubDate>
  <copyright>L’ensemble des textes et photos présentes sur ce site sont placées sous licence Creative Commons.</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.olivier-duval.info/OlivierDuval" /><feedburner:info uri="olivierduval" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>48.8492</geo:lat><geo:long>2.393</geo:long><feedburner:emailServiceId>OlivierDuval</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.olivier-duval.info%2FOlivierDuval" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.olivier-duval.info/OlivierDuval" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.olivier-duval.info%2FOlivierDuval" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.olivier-duval.info%2FOlivierDuval" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.olivier-duval.info%2FOlivierDuval" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=fr&amp;url=http%3A%2F%2Ffeeds.olivier-duval.info%2FOlivierDuval" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/bn/intatm_fr_1.gif">Subscribe with Mon Yahoo!</feedburner:feedFlare><item>
    <title>"meme" du jour : URL-ABC</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/JuEkA2RFqEo/</link>
    <guid isPermaLink="false">urn:md5:72f396e4fae83f4ae93e6aef0d377c10</guid>
    <pubDate>Wed, 14 Jul 2010 11:48:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Fun</category>
        <category>browser</category><category>fun</category><category>meme</category><category>urlabc</category>    
    <description>&lt;p&gt;Prendre le 1er site que propose le navigateur pour chaque lettre (Chrome chez moi), cela donne ceci&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;a href="http://area51.stackexchange.com" title="http://area51.stackexchange.com"&gt;http://area51.stackexchange.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;B &lt;a href="http://www.bnpparibas.net" title="http://www.bnpparibas.net"&gt;http://www.bnpparibas.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;C &lt;a href="http://www.codethinked.com" title="http://www.codethinked.com"&gt;http://www.codethinked.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;D &lt;a href="http://docs.google.com" title="http://docs.google.com"&gt;http://docs.google.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;E &lt;a href="http://ebay.fr" title="http://ebay.fr"&gt;http://ebay.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;F &lt;a href="http://facebook.com" title="http://facebook.com"&gt;http://facebook.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;G &lt;a href="http://gmail.com" title="http://gmail.com"&gt;http://gmail.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;H &lt;a href="http://hotmail.com" title="http://hotmail.com"&gt;http://hotmail.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I &lt;a href="http://www.imc.fr" title="http://www.imc.fr"&gt;http://www.imc.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;J &lt;a href="http://julienboisard.fr" title="http://julienboisard.fr"&gt;http://julienboisard.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;K &lt;a href="http://www.krakote.com" title="http://www.krakote.com"&gt;http://www.krakote.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;L &lt;a href="http://lutalivre.fr" title="http://lutalivre.fr"&gt;http://lutalivre.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;M &lt;a href="http://meteofrance.com" title="http://meteofrance.com"&gt;http://meteofrance.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;N &lt;a href="http://netvibes.com" title="http://netvibes.com"&gt;http://netvibes.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O &lt;a href="http://www.obturations.com" title="http://www.obturations.com"&gt;http://www.obturations.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;P &lt;a href="http://programme-tv.net" title="http://programme-tv.net"&gt;http://programme-tv.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Q &lt;a href="http://www.quelle.fr" title="http://www.quelle.fr"&gt;http://www.quelle.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;R &lt;a href="http://rtl9.com" title="http://rtl9.com"&gt;http://rtl9.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;S &lt;a href="http://sharpness.me" title="http://sharpness.me"&gt;http://sharpness.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;T &lt;a href="http://twitter.com" title="http://twitter.com"&gt;http://twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;U &lt;a href="http://upload.facebook.com" title="http://upload.facebook.com"&gt;http://upload.facebook.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;V &lt;a href="http://vimeo.com" title="http://vimeo.com"&gt;http://vimeo.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;W &lt;a href="http://www.flickr.com" title="http://www.flickr.com"&gt;http://www.flickr.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;X&lt;/li&gt;
&lt;li&gt;Y &lt;a href="http://www.youtube.com" title="http://www.youtube.com"&gt;http://www.youtube.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Z &lt;a href="http://zorky.darqroom.fr" title="http://zorky.darqroom.fr"&gt;http://zorky.darqroom.fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;petites frayeurs pour le S et le P &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt; si vous avez des sites pour le X, je reste intéressé bien évidemment.&lt;/p&gt;


&lt;p&gt;A qui le tour&amp;nbsp;?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=JuEkA2RFqEo:KSNPCutE6D4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/JuEkA2RFqEo" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/meme-du-jour-URL-ABC#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/meme-du-jour-URL-ABC#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/336</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/meme-du-jour-URL-ABC</feedburner:origLink></item>
    
  <item>
    <title>dokuWiki et intégration : SSO, annuaire, modèles &amp; co</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/d1TwxnG-Fks/</link>
    <guid isPermaLink="false">urn:md5:94be1ac70b5f7dd6c327afebd3f53128</guid>
    <pubDate>Tue, 06 Jul 2010 22:45:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Web[2.0]</category>
        <category>authentication</category><category>authentification</category><category>dokuwiki</category><category>sso</category><category>websso</category>    
    <description>&lt;h4&gt;Préambule&lt;/h4&gt;


&lt;p&gt;Avant de parler plus spécialement de &lt;a href="http://www.dokuwiki.org"&gt;dokuWiki&lt;/a&gt; , un point sur le mot &lt;strong&gt;intégration&lt;/strong&gt; d'applications. Que signifie "intégrer une application ou un progiciel ou un module ou ..." et comment le permet-on&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;On peut avoir plusieurs niveaux d'intégration entre 2 applications (Web j'entends), toutes doivent être, si possible, transparentes pour l'utilisateur&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inclure des données d'une application A dans une application B&amp;nbsp;: l'utilisateur se trouve sur la A, et des informations du site B sont incluses dans le 1er sous diverses formes&amp;nbsp;: &lt;strong&gt;flux RSS&lt;/strong&gt;, &lt;strong&gt;widget&lt;/strong&gt;, &lt;a href="http://code.google.com/intl/fr-FR/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;, à l'aide d'une &lt;strong&gt;API&lt;/strong&gt; (service Web SOAP, REST, XmlRPC, ...) ou non (fichiers, base de données ou LDAP partagés entre 2 ou N applis) de la part du site B (on peut considérer un flux comme une mini API),&lt;/li&gt;
&lt;li&gt;à partir d'une application A, qu'un utilisateur puisse se connecter sur une application B pour y interagir (Google docs, Wiki, enquêtes, etc), avec bien souvent des droits bien particuliers (autorisations),&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2 applications seules dans leur coin fonctionnent en général bien, mise à part tout le process de leur mise en place (développement etc), la difficulté devient exponentielle lorsqu'il s'agit d'intégrer de façon &lt;strong&gt;transparente&lt;/strong&gt; pour l'utilisateur une application dans une autre pour y apporter un service supplémentaire.&lt;/p&gt;


&lt;p&gt;L'intégration d'une application est souvent rendu possible à l'aide d'&lt;strong&gt;API&lt;/strong&gt; sous forme de services Web (données, annuaire, ...) et aussi également par l'ajout d'un &lt;strong&gt;(Web)SSO&lt;/strong&gt; qui permet à l'utilisateur de passer d'une application vers une application avec son même login et mot de passe et ce, sans se reconnecter s'il l'était déjà, s'authentifier qu'une seule fois est très important afin de faciliter l'usage des outils.&lt;/p&gt;    &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4003/4679698377_b2ff5ec9e7_d.jpg" alt="" /&gt;&lt;/p&gt;


&lt;h4&gt;dokuWiki&lt;/h4&gt;


&lt;h3&gt;Wiki&lt;/h3&gt;


&lt;p&gt;Une petite définition d'un Wiki, selon &lt;a href="http://fr.wikipedia.org/wiki/Wiki"&gt;Wikipédia&lt;/a&gt;&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;Un wiki est un site web dont les pages sont modifiables par tout ou partie des visiteurs du site. Il permet ainsi l'écriture et l'illustration collaboratives de documents.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Wikipédia en est son meilleur représentant, une encyclopédie enrichie par une multitudes de contributeurs. Tous les moteurs de Wiki sont basés à peu près sur le même principe, c'est à dire des &lt;strong&gt;balises&lt;/strong&gt; simples pour formater le texte d'une page (gras, liens, titres, ...), l'écriture de ce billet est effectué de cette façon, à l'aide de balises Wiki, d'autres moteur de blog implémentent &lt;a href="http://fr.wikipedia.org/wiki/Markdown"&gt;Markdown&lt;/a&gt; ou &lt;a href="http://textism.com/tools/textile/"&gt;Textile&lt;/a&gt; qui suivent le même principe .&lt;/p&gt;


&lt;p&gt;La &lt;strong&gt;collaboration&lt;/strong&gt; sur un document est effectuée contributeur par contributeur, c'est à dire qu'une page ne peut être éditée à plusieurs (elle sera bloquée si elle est éditée par une personne). Pour ce type de collaboration simultanée, &lt;a href="http://docs.google.com"&gt;Google docs&lt;/a&gt; est plus approprié (que l'on ait un compte google ou non), plus dédié à de court document je pense, à la "Word".&lt;/p&gt;


&lt;p&gt;Exemples d'utilisation d'un Wiki&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;élaboration d'une documentation sur un projet afin de garder un historique&lt;/li&gt;
&lt;li&gt;documentation d'une plateforme&lt;/li&gt;
&lt;li&gt;manuels utilisateur ou tutoriels&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;le choix de dokuWiki&lt;/h3&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/dokuwiki-128.png" alt="dokuwiki" style="float:right; margin: 0 0 1em 1em;" title="dokuwiki, juin 2010" /&gt;&lt;/p&gt;


&lt;p&gt;Pourquoi &lt;strong&gt;dokuWiki&lt;/strong&gt;&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Parmi la pléthore de moteurs qui existent sur le &lt;a href="http://www.wikimatrix.org"&gt;marché OpenSource ou non&lt;/a&gt;, dokuWiki est intéressant par sa simplicité (pas de base de données par exemple) et surtout par son architecture qui le rend extensible et modulaire, que cela soit du point de vue de l'&lt;strong&gt;authentification&lt;/strong&gt;, des &lt;strong&gt;modèles&lt;/strong&gt; (de charte graphique), &lt;strong&gt;API&lt;/strong&gt; (&lt;a href="http://www.dokuwiki.org/devel:xmlrpc"&gt;XmlRPC&lt;/a&gt; et API interne), avec bien entendu bon nombre de plugins proposés (&amp;gt; 600) (cf. les &lt;a href="http://www.dokuwiki.org/features"&gt;fonctionnalités&lt;/a&gt;), sans compter une architecture de développement de plugins bien pensée (&lt;a href="http://www.dokuwiki.org/devel:events"&gt;évènements et hooks&lt;/a&gt; utilisées dans les &lt;a href="http://www.dokuwiki.org/devel:action_plugins"&gt;actions&lt;/a&gt;).&lt;/p&gt;


&lt;p&gt;L'un des points négatifs de mon point de vue étant qu'il soit développé en PHP &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt; mais on s'y remet vite aux $, mais aussi, des releases officielles peu fréquentes, malgré un &lt;a href="http://github.com/splitbrain/dokuwiki"&gt;trunk assez actif&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Principes d'authentification&lt;/h3&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/identite.png" alt="sso-identite" style="float:right; margin: 0 0 1em 1em;" title="sso-identite, juin 2010" /&gt;&lt;/p&gt;


&lt;p&gt;dokuWiki propose un système d'&lt;strong&gt;authentification&lt;/strong&gt; extensible, qui peut être étendu à d'autres protocoles d'&lt;a href="http://www.dokuwiki.org/auth"&gt;authent&lt;/a&gt; (&lt;a href="http://www.dokuwiki.org/auth:ldap"&gt;LDAP&lt;/a&gt;, &lt;a href="http://fr.wikipedia.org/wiki/Central_Authentication_Service"&gt;CAS&lt;/a&gt;, &lt;a href="http://fr.wikipedia.org/wiki/Shibboleth_(fédération_d&amp;#039;identité)"&gt;Shibboleth&lt;/a&gt;, OpenID, NTLM, &lt;a href="http://www.dokuwiki.org/:auth:ad"&gt;AD&lt;/a&gt;, spécifique, etc). Par défaut, dokuWiki gère les logins et mots de passe sous forme de fichier texte (le mode &lt;em&gt;&lt;a href="http://www.dokuwiki.org/auth:plain"&gt;plain&lt;/a&gt;&lt;/em&gt;).&lt;/p&gt;


&lt;p&gt;Il suffit de dériver de la classe &lt;strong&gt;auth_basic&lt;/strong&gt; (l'interface/classe abstraite qui représente le contrat d'authent), d'implémenter les méthodes obligatoires et certaines optionnelles, et ensuite de préciser la stratégie utilisée pour l'authentification (la nouvelle classe dérivée d'auth_basic) dans le fichier de configuration (l'entrée &lt;strong&gt;$conf['authtype'] = 'maclasse'&lt;/strong&gt;)&amp;nbsp;: dokuWiki se chargera d'instancier cette dernière et d'appeler les méthodes voulues qui sont précisées dans la classe dérivée, à l'aide du tableau &lt;strong&gt;cando&lt;/strong&gt; définit dans la classe de base auth_basic.&lt;/p&gt;


&lt;p&gt;Par exemple &lt;strong&gt;addUser&lt;/strong&gt; à &lt;strong&gt;true&lt;/strong&gt; provoquera l'appel de la méthode &lt;strong&gt;createUser($user,$pwd,$name,$mail,$grps=null)&lt;/strong&gt; qui devra être implémentée.&lt;/p&gt;


&lt;p&gt;Souvent, les méthodes utilisées permettent de se brancher sur une base de comptes existantes (bdd, LDAP, ...qu'on appellera référentielle) pour les besoins d'authent et d'annuaire (login mais aussi nom, prénom, email, ...), afin de lire le compte et/ou ses groupes d'accès ou bien de le modifier, la page &lt;a href="http://www.dokuwiki.org/devel:authentication_backends#required_methods"&gt;authentication_backend&lt;/a&gt; précise les méthodes à utiliser le cas échéant.&lt;/p&gt;


&lt;p&gt;Dans ce cas, nous avons bien de la &lt;strong&gt;fédération d'identités&lt;/strong&gt; (en gros 1 login partagé par plusieurs applications, un référentiel hébergé ou réparti sur un ou plusieurs points) mais la bannière de login pourra être dupliquée sur l'application A, dokuWiki, etc, on ne répond pas dans ce cas au besoin de &lt;strong&gt;SSO&lt;/strong&gt;&amp;nbsp;: 1 login et ne pas se réauthentifier sur dokuWiki si on l'était déjà sur l'application A.&lt;/p&gt;


&lt;p&gt;dokuWiki propose la méthode &lt;strong&gt;trustExternal&lt;/strong&gt; qui surpasse toutes les autres (elles seront alors ignorées à quelques exceptions près), elle nous permettra d'implémenter le SSO. Son activation s'effectue via le tableau &lt;strong&gt;cando&lt;/strong&gt; avec la clé &lt;strong&gt;external&lt;/strong&gt; qu'on mettra à true dans le constructeur de la classe dérivée.&lt;/p&gt;

&lt;pre class="php php" style="font-family:monospace;"&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;cando&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'external'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Le &lt;strong&gt;SSO&lt;/strong&gt;, comment&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;On peut voir au moins 2 manières d'implémenter du SSO, ou plus précisemment détecter une authentification existante sur un site tiers&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;par l'usage d'un &lt;strong&gt;cookie de domaine&lt;/strong&gt;, qui contiendra un jeton&amp;nbsp;: nous dira si l'internaute est déjà passé par une application et qu'il s'est donc déjà authentifié&amp;nbsp;: si non, soit une redirection s'effectuera afin de le rediriger vers un point central d'authent, soit sur l'application cliente elle-même. Cette solution est adapté aux applications qui se basent sur un même domaine, évite un aller-retour lors de l'arrivée de l'internaute (s'il était déjà connecté sur une application partenaire), le jeton contenu dans le cookie est bien évidemment à vérifier afin d'éviter toute faille de sécurité. S'il n'existe pas de cookie avec le jeton, il est redirigé vers l'application qui centralise l'authentification, se connecte, le cookie est fixé avec le jeton, puis il est redirigé vers l'application appelante dokuWiki.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cela est schématisé par l'image suivante, si l'internaute était arrivé par l'application A, le cookie de domaine serait déjà garni lors de l'arrivée sur dokuWiki, cela réduit d'un aller-retour systématique, ce qui n'est pas le cas dans la solution par session ci-après&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.doku-cookie_m.jpg" alt="doku-cookie.png" style="display:block; margin:0 auto;" title="doku-cookie.png, juin 2010" /&gt;&lt;/p&gt;


&lt;p&gt;En revanche, une très grosse contrainte technique des navigateurs sur HTTP peut rendre difficile son utilisation, comme le précise le &lt;a href="http://www.ietf.org/rfc/rfc2109.txt"&gt;RFC 2109&lt;/a&gt;, section &lt;em&gt;4.3.2 Rejecting Cookies&lt;/em&gt;&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;A Set-Cookie from request-host y.x.foo.com for Domain=.foo.com would be rejected, because H is y.x and contains a dot&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;autrement dit, cela interdit les sous-domaines qui contiendraient un . (point ou &lt;em&gt;dot&lt;/em&gt;), d'aller plus loin de 2 niveaux que &lt;strong&gt;domain.ntld&lt;/strong&gt;. Par exemple &lt;em&gt;www.info.domain.ntld&lt;/em&gt; et &lt;em&gt;www.finance.domain.ntld&lt;/em&gt; ne pourront pas partager le même cookie de domaine (qui serait fixé sur domain.ntld), alors que pour &lt;em&gt;docs.google.com&lt;/em&gt; et &lt;em&gt;calendar.google.com&lt;/em&gt; cela est rendu possible. Cette contrainte devrait être levée dans les futures versions des navigateurs, en attendant, il faudra trouver une autre solution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;en jouant sur l'&lt;strong&gt;ouverture de session&lt;/strong&gt;, puis ensuite par un jeu de redirection&amp;nbsp;: la 1ère fois que l'internaute arrive sur dokuWiki, à l'ouverture de session, il est instantanément redirigé vers la plateforme/application qui centralise l'authentification (application A), vers une page spéciale qui gèrera ensuite le retour vers dokuWiki&amp;nbsp;: si l'internaute était connecté sur application A alors il est immédiatement redirigé vers dokuWiki, sinon il se connecte puis est redirigé vers dokuWiki. L'URL de retour contient notamment en paramètre un jeton de type &lt;a href="http://fr.wikipedia.org/wiki/Keyed-Hash_Message_Authentication_Code"&gt;HMAC &lt;/a&gt;, avec une clé secrète partagée entre l'application qui gère le login et dokuWiki afin de s'assurer de qui envoie les informations vers le Wiki lors de l'authentification, notamment la clé utilisateur (id, email, ...). Ce type de challenge est assez courant, on retrouve ce principe de redirections sur OpenID ou OAuth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;le principe&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.doku-session_m.jpg" alt="doku-session.png" style="display:block; margin:0 auto;" title="doku-session.png, juin 2010" /&gt;&lt;/p&gt;


&lt;p&gt;Même si elle impose automatiquement une redirection, la 2è solution est moins contraignante, nous choisirons donc cette dernière pour dokuWiki.&lt;/p&gt;


&lt;p&gt;Dans les 2 cas, le principe se base sur de la redirection HTTP qui joue un challenge entre le site client et le site qui permet de s'authentifier. L'URL de retour vers le Wiki contient le jeton HMAC, ainsi qu'une clé identifiant l'utilisateur qui s'est authentifié, clé qui pourra être utilisé dans un service d'annuaire pour en connaitre plus sur lui (nom, prénom, email). On pourra ajouter également la date/heure de connexion de l'utilisateur afin de limiter l'usage du lien / jeton dans le temps.&lt;/p&gt;


&lt;p&gt;Concernant les groupes d'accès, dokuWiki stocke le(s) groupe(s) dans un fichier texte &lt;strong&gt;~dokuwiki/conf/acl.auth.php&lt;/strong&gt;, la clé de configuration ACL doit être activée &lt;strong&gt;$conf['useacl']=1;&lt;/strong&gt; . On pourra s'aider d'un service d'habilitations, inclus ou non dans le service d'annuaire, afin de déterminer à quels groupes appartient l'utilisateur qui arrive sur le Wiki.&lt;/p&gt;


&lt;p&gt;un exemple de groupes d'accès, déclinés selon les &lt;a href="http://www.dokuwiki.org/acl#background_info"&gt;droits dokuWiki&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
*       @ALL    0
*       @rpc    4
*       @geeks  16
*       @geeks%2dro     1
&lt;/pre&gt;


&lt;p&gt;Le groupe &lt;em&gt;geeks&lt;/em&gt; a tous les droits d'édition sur les pages, ainsi que sur les fichiers, pour une population de &lt;strong&gt;contributeurs&lt;/strong&gt;. Le groupe &lt;em&gt;rpc&lt;/em&gt; pourrait être affecté lors de l'accès à l'API (XmlRPC ou la syndication) par un système tiers, avec des droits moins forts (pas de suppression par exemple). Le groupe &lt;em&gt;geeks-ro&lt;/em&gt; (les caractères du type &lt;strong&gt;-&lt;/strong&gt; doivent être fournis en code hexa) pourrait être réservé pour des utilisateurs qui n'ont droit qu'à une &lt;strong&gt;consultation&lt;/strong&gt; seule (et non à l'édition). Tout le reste (@ALL) aucun droit.&lt;/p&gt;


&lt;h3&gt;exemples de code&lt;/h3&gt;


&lt;p&gt;On aura besoin&amp;nbsp;: de la &lt;strong&gt;classe dérivée&lt;/strong&gt;, de son &lt;strong&gt;constructeur&lt;/strong&gt;, et de la méthode &lt;strong&gt;trustExternal&lt;/strong&gt; qui contiendra l'initialisation de l'utilisateur et groupes appartenant à dokuWiki. Hormis l'authentification et l'affectation des groupes, l'authent est souvent couplé à un service d'annuaire, afin de connaitre a minima l'email, le nom, prénom et civilité du connecté. A défaut de service d'annuaire (SOAP, REST), ces derniers pourraient être renvoyés en même temps que l'URL de retour, en tant que paramètres.&lt;/p&gt;


&lt;p&gt;Ce ne sont que des bouts de code pour démontrer le principe en 3 étapes, le principal étant dans &lt;strong&gt;trustExternal&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.principes-provider_m.jpg" alt="principes-provider.png" style="display:block; margin:0 auto;" title="principes-provider.png, juin 2010" /&gt;&lt;/p&gt;


&lt;p&gt;Les parties dont on a besoin&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;la classé dérivée que nous nommerons &lt;strong&gt;auth_provider&lt;/strong&gt;, hérite de &lt;strong&gt;auth_basic&lt;/strong&gt;, dokuWiki sait quel provider instancier par la clé de configuration &lt;strong&gt;$conf['authtype']='provider'&lt;/strong&gt;, la classe sera contenue dans le fichier &lt;strong&gt;~dokuwiki/inc/auth/provider.class.php &lt;/strong&gt;&lt;/p&gt;

&lt;pre class="php php" style="font-family:monospace;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; auth_provider &lt;span style="color: #000000; font-weight: bold;"&gt;extends&lt;/span&gt; auth_basic
&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
  &lt;span style="color: #339933;"&gt;...&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;son constructeur&lt;/p&gt;

&lt;pre class="php php" style="font-family:monospace;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; auth_provider&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
      &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;cando&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'external'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #666666; font-style: italic;"&gt;// on utilise le mode external pour l'authent, seule trustExternal sera appelée de façon implicite&lt;/span&gt;
      &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;cando&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'logoff'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #666666; font-style: italic;"&gt;// pour usage manuel, vidage cookie et session, permet d'ajouter à une page ?do=logout pour un logoff&lt;/span&gt;
&amp;nbsp;
      &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;success&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;et la méthode &lt;strong&gt;trustExternal&lt;/strong&gt; pour l'initialisation de l'utilisateur dokuWiki avec ses groupes si le &lt;em&gt;challenge&lt;/em&gt; SSO a réussi&lt;/p&gt;

&lt;pre class="php php" style="font-family:monospace;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; trustExternal&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$user&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #000088;"&gt;$pass&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #000088;"&gt;$sticky&lt;/span&gt;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
 &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;     
      &lt;span style="color: #666666; font-style: italic;"&gt;// session déjà ouverte ? on initialise l'utilisateur dokuWiki&lt;/span&gt;
      &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #990000;"&gt;isset&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_SESSION&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;DOKU_COOKIE&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'auth'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'buid'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;       
      &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
            &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;_setUser&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_SESSION&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;DOKU_COOKIE&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'auth'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'buid'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color: #666666; font-style: italic;"&gt;// retour de la redirection de l'appli de login ?&lt;/span&gt;
                        &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_GET&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;quot;token&amp;quot;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
              &lt;span style="color: #666666; font-style: italic;"&gt;// vérif signature / clé&lt;/span&gt;
              &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;_verifSignature&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_GET&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;quot;token&amp;quot;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color: #990000;"&gt;isset&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_GET&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'ui'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
              &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;                                       
                  &lt;span style="color: #666666; font-style: italic;"&gt;// appel à un service d'annuaire pour l'obtention des infos utilisateurs&lt;/span&gt;
                  &lt;span style="color: #000088;"&gt;$response&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;annuaireGetUser&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_GET&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'ui'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                  &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$response&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
                   &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
                     &lt;span style="color: #666666; font-style: italic;"&gt;// init utilisateur dokuWiki&lt;/span&gt;
                                       &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;_setUser&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$response&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;user&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                  &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
              &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
                        &lt;span style="color: #666666; font-style: italic;"&gt;// non alors redirection vers l'app login              &lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;                           
                              &lt;span style="color: #990000;"&gt;header&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;quot;Location: http://&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;APPLICATION_A&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;quot;/logon/?return_url=&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #990000;"&gt;rawurlencode&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;quot;http://&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;SERVEUR_WIKI&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_SERVER&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
      &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
      &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;success&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;   
 &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span style="color: #666666; font-style: italic;"&gt;// initialise l'utilisateur dokuWiki&lt;/span&gt;
  &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; _setUser&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$user&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;             
         &lt;span style="color: #990000;"&gt;global&lt;/span&gt; &lt;span style="color: #000088;"&gt;$USERINFO&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #666666; font-style: italic;"&gt;// l'utilisateur dokuWiki&lt;/span&gt;
     &lt;span style="color: #000088;"&gt;$grps&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;   &lt;span style="color: #666666; font-style: italic;"&gt;// groupe(s) de l'utilisateur&lt;/span&gt;
&amp;nbsp;
          &lt;span style="color: #666666; font-style: italic;"&gt;// profil utilisateur dokuWiki         &lt;/span&gt;
     &lt;span style="color: #000088;"&gt;$USERINFO&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'name'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$user&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;Nom&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
     &lt;span style="color: #000088;"&gt;$USERINFO&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'mail'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$user&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;Email&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;     
     &lt;span style="color: #990000;"&gt;array_unshift&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$grps&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #000088;"&gt;$user&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;groupe&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;         
     &lt;span style="color: #000088;"&gt;$USERINFO&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'grps'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$grps&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
          &lt;span style="color: #666666; font-style: italic;"&gt;// obligatoire&lt;/span&gt;
     &lt;span style="color: #000088;"&gt;$_SERVER&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'REMOTE_USER'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$user&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;Email&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
     &lt;span style="color: #666666; font-style: italic;"&gt;// session de cache dokuWiki     &lt;/span&gt;
     &lt;span style="color: #000088;"&gt;$_SESSION&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;DOKU_COOKIE&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'auth'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'user'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$user&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;Nom&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
     &lt;span style="color: #000088;"&gt;$_SESSION&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;DOKU_COOKIE&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'auth'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'info'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$USERINFO&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
     &lt;span style="color: #000088;"&gt;$_SESSION&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;DOKU_COOKIE&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'auth'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'time'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;time&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;et voilà&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Le SSO est une réelle valeur ajoutée pour l'utilisateur, quoi de plus désarmant que de devoir se connecter plusieurs fois, voire, avec un compte différent. Dans un autre contexte, &lt;a href="http://blog.olivier-duval.info/?post/OpenID,-Google,-Yahoo,-Orange,-MyOpenID,-Facebook,-LiveID-and-me-:-l-authentification-à-moindre-frais"&gt;OpenID&lt;/a&gt;, permet également de fédérer son identité / authentification, afin de ne pas recréer pour une ième fois un login et mot de passe.&lt;/p&gt;


&lt;h3&gt;Modèles, plugins&lt;/h3&gt;


&lt;p&gt;dokuWiki, dans sa conception permet d'étendre et de développer son propre modèle de charte. Le mieux étant de partir d'un &lt;a href="http://www.dokuwiki.org/template"&gt;template existant&lt;/a&gt; et de le modifier. Le modèle est stocké sur &lt;strong&gt;~dokuwiki/lib/tpl/&amp;lt;template&amp;gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Egalement, le nombre de &lt;a href="http://www.dokuwiki.org/plugins"&gt;plugins&lt;/a&gt; proposé est assez conséquent, 650&amp;nbsp;! bien entendu, on veillera à ce que le plugin soit maintenu, que ce dernier ait des contributeurs actifs. Les plugins seront à installer dans le répertoire &lt;strong&gt;~dokuwiki/lib/plugins/&amp;lt;plugin&amp;gt;&lt;/strong&gt;. Chaque plugin est désactivable par la simple création d'un fichier vide &lt;em&gt;disabled&lt;/em&gt;. Pour l'authentification, il nous faudra au moins le plugin &lt;a href="http://www.dokuwiki.org/plugin:acl"&gt;acl&lt;/a&gt;. Parmi les intéressants, on notera &lt;a href="http://www.dokuwiki.org/plugin:tag"&gt;tag&lt;/a&gt; qui permet de marquer une page par des tags et de retrouver toutes les pages relatives à un &lt;em&gt;tag&lt;/em&gt;, mais aussi &lt;a href="http://www.dokuwiki.org/plugin:note"&gt;note&lt;/a&gt; ou &lt;a href="http://www.dokuwiki.org/plugin:odt"&gt;odt&lt;/a&gt;, il reste le plugin &lt;a href="http://www.dokuwiki.org/plugins?plugintag=pdf"&gt;PDF&lt;/a&gt; à tester.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=d1TwxnG-Fks:1Vf4HtUjRZM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/d1TwxnG-Fks" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/dokuWiki-et-integration-SSO-annuaire-modeles-co#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/dokuWiki-et-integration-SSO-annuaire-modeles-co#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/335</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/dokuWiki-et-integration-SSO-annuaire-modeles-co</feedburner:origLink></item>
    
  <item>
    <title>ReMIX 2010</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/5X0iVGmYknA/</link>
    <guid isPermaLink="false">urn:md5:07fa9a0e89b2ccfab14f20aa0662adb2</guid>
    <pubDate>Fri, 28 May 2010 13:57:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Web[2.0]</category>
        <category>2010</category><category>ie9</category><category>microsoft</category><category>remix</category><category>silverlight</category>    
    <description>&lt;p&gt;J'ai assisté jeudi à une partie de l'après-midi au ReMIX 2010 dans les locaux de Microsoft à Issy-les-Moulineaux.&lt;/p&gt;


&lt;p&gt;Le &lt;a href="http://www.remix-france.fr"&gt;ReMIX&lt;/a&gt; c'est l'évènement à mi-chemin entre le développement et le design/communication/marketting ou comment concilier les 2 mondes&amp;nbsp;: geek et design/comm, ce type d'évènement s'adresse d'ailleurs un peu plus aux Web Agency, suffit de voir la page d'accueil du &lt;a href="http://www.microsoft.com/france/evenements/remix2010/"&gt;site dédié&lt;/a&gt; ;).&lt;/p&gt;


&lt;p&gt;Après avoir pris mon cube multi-couleurs ReMIX, et m'être assis à côté d'un designer ayant un très beau iPad, la keynote pouvait commencer, quelques notes de l'après-midi.&lt;/p&gt;    &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4033/4645310169_8e8a41c6b6.jpg" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;Keynote présentée par &lt;a href="http://www.microsoft.com/presspass/exec/ericr/"&gt;Eric Rudder&lt;/a&gt;, Américain. Après une introduction en français, le reste était en anglais, &lt;a href="http://blog.pierremorsa.com/2010/05/27/eric-rudder-une-presentation-internationale-reussie/"&gt;très compréhensible et accessible&lt;/a&gt;, il parlait distinctement et "lentement", je le remercie pour ça.&lt;/p&gt;


&lt;p&gt;La &lt;strong&gt;keynote&lt;/strong&gt; était agrémentée de démos sur divers sujets (les intervenants&amp;nbsp;: Guillaume Roques, David Rousset)&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vidéo ou RIA avec Silverlight, en Smooth Streaming, avec &lt;a href="http://roland-garros.sport.francetv.fr/video-direct"&gt;Roland Garros&lt;/a&gt; ou &lt;a href="http://playerhd.france24.com/france24/playerHD/playerHDv2.html"&gt;France 24&lt;/a&gt;, le tout en HD. Ce dernier restranscrit à la volée la parole en écrit avec une indexation en temps réel, assez bluffé par ça. Ce que j'ai toujours aimé c'est la possibilité de retourner en arrière, ou pour le tennis de revoir les vidéos au ralenti. Exemples avec MSN sur l'expo &lt;a href="http://rubrique.ch.msn.com/reportage/kunsthaus.aspx"&gt;Van Gogh et Monet&lt;/a&gt; et les possibilités du DeepZoom, la société Images, ou enfin, Bing et l'intégration SL, direction le &lt;a href="http://www.bing.com/maps/explore/#5003/0.6002=q:seatle+starbuck+cafe:lat:47.603977:long:-122.329453:nosp:0:adj:0:cs:1&amp;amp;1.6002=bid:YN926x15795177:adj:0&amp;amp;2.6002=k:starbucks:lat:47.6086187560794:long:-122.335897407726:nosp:0:adj:0:notr:0:pg:1&amp;amp;o=&amp;amp;a=0:1:2/5872/style=auto&amp;amp;lat=ry18sj&amp;amp;lon=4t4t6y&amp;amp;alt=19.911385&amp;amp;z=17&amp;amp;pid=5874"&gt;1er Starbuck à Seatle&lt;/a&gt;, toujours aussi bon avec le DeepZoom et la superposition des photos (appuyer sur le personnage bleu en bas de page).&lt;/li&gt;
&lt;li&gt;IE9 avec le site dédié &lt;a href="http://ietestdrive.com"&gt;Test drive&lt;/a&gt; qui donne des démos assez intéressantes pour démontrer l'efficacité de la future version d'Internet Explorer 9&amp;nbsp;: utilisation du &lt;strong&gt;GPU&lt;/strong&gt; de la carte graphique et exploitation du multi-coeurs, très en phase avec le matériel actuel, ou encore implémentation de &lt;strong&gt;SVG&lt;/strong&gt; 1.1, &lt;strong&gt;HTML 5 &amp;amp; CSS 3&lt;/strong&gt;, Javascript compilé&lt;/li&gt;
&lt;li&gt;Smart Software avec la plateforme XNA pour les jeux&amp;nbsp;: 1 plateforme pour n devices (Windows Phone, XBox, Windows 7)&lt;/li&gt;
&lt;li&gt;programme MS &lt;a href="http://www.microsoft.com/web/websitespark/default.aspx"&gt;WebsiteSpark&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Les différentes sessions qui ont suivi :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IE9&lt;/strong&gt; avec &lt;a href="http://blogs.msdn.com/b/davrous/"&gt;David Rousset&lt;/a&gt;&amp;nbsp;: avec IE 8 il existait 7 200 tests unitaires pour CSS 2.1/HTML 4.01, ont été fournis au W3C dont MS participe au working group HTML5 (&lt;a href="http://www.w3.org/QA/2010/03/interview_paul_cotton_on_micro.html"&gt;Paul Cotton&lt;/a&gt;), il est prévu plus de 60 000 tests unitaires pour HTML 5 / CSS 3 afin aussi de clarifier les spécifications (afin que tous les navigateurs rendent exactement la même chose). Démos des Border queries, qui permettent d'adapter l'affichage selon le périphérique qui se connecte (PC, Mobile, ...). Un effort a été porté pour améliorer les performances Javascript&amp;nbsp;: ce denier est compilé à la volée en code natif. IE 9 obtient de bons résultats aux tests &lt;a href="http://www2.webkit.org/perf/sunspider-0.9/sunspider.html"&gt;Sun Spider&lt;/a&gt; face aux autres moteurs Javascript.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;plateforme Web MS&lt;/strong&gt; avec &lt;a href="http://blogs.msdn.com/b/pierlag/"&gt;Pierre Lagarde&lt;/a&gt;&amp;nbsp;: démo de &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;WPI&lt;/a&gt; afin d'installer simplement et rapidement des extensions ou frameworks/moteurs (blogs, CMS, ...) supplémentaires sur IIS. Démos Silverlight avec quelques sites (&lt;a href="http://www.dia-7.com"&gt;DIA&lt;/a&gt; rubrique &lt;a href="http://www.dia-7.com/dia7.aspx"&gt;découvrir&lt;/a&gt;. Quelques intervenants de startup sur des projets en collaboration avec Microsoft&amp;nbsp;: &lt;a href="http://www.lachainetechno.com/"&gt;lachainetechno.com&lt;/a&gt;, une WebTV qui a développé (avec la collaboration d'&lt;a href="http://www.agence-web-adenova.com/"&gt;Adenova&lt;/a&gt;) une extension (SVP) Wordpress afin d'inclure des vidéos Silverlight sur un blog / CMS. Ce qui est fort, c'est la démonstration de la lecture d'une vidéo Smooth Streaming sous..iPhone ou iPad...la vidéo est retranscrit (par IIS &lt;a href="http://www.iis.net/media"&gt;MediaServer&lt;/a&gt;) en temps réel pour le format des &lt;em&gt;devices&lt;/em&gt; (certainement Quicktime, en version Beta), un beau pied de nez aux vidéos Flash &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure&lt;/strong&gt;&amp;nbsp;: NB&amp;nbsp;: l'offre MSDN Premium offre quelques heures Azure, c'est toujours bon à prendre. Invité&amp;nbsp;: &lt;a href="http://wwwen.kobojo.com/"&gt;Kobojo&lt;/a&gt; qui ont développé une application Facebook (&lt;a href="http://blog.olivier-duval.info/?post/apps.facebook.com/robotzarena"&gt;RobotzArena&lt;/a&gt;), un remake de baston entre 2 personnages que l'on peut s'amuser à améliorer (costumes, armures, ...). Une partie (frontaux + cache) est hébergée sur Azure, en revanche la partie Data (SQL Server) à l'extérieur&amp;nbsp;: intéressant, une application Azure peut se connecter sur un SGBD non azure. Présentation également d'une version &lt;a href="http://memcached.org"&gt;Memcached&lt;/a&gt; pour Azure avec un dashboard, téléchargeable sur &lt;a href="http://cloudcache.codeplex.com/"&gt;CodePlex Cloudcache&lt;/a&gt;. Pour rappel, Memcached est un cache partagé.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WCF&lt;/strong&gt; avec le projet &lt;a href="http://www.sokoz.fr"&gt;SOKOZ&lt;/a&gt;, site de ventes événementielles. Ils ont utilisé Azure Service Bus avec Azure Ready  afin de répondre beaucoup plus rapidement aux requêtes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assez content de l'après-midi, malgré parfois des tendances marketting un peu trop poussées, je suis reparti avec mon cube qui fera plaisir à ma fille, et mon tshirt.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=5X0iVGmYknA:e_uJWgxsMUY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/5X0iVGmYknA" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/ReMIX-2010#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/ReMIX-2010#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/334</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/ReMIX-2010</feedburner:origLink></item>
    
  <item>
    <title>Nouveau blog et les actions à entreprendre pour sa mise en ligne</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/4dVgSx1Eld8/</link>
    <guid isPermaLink="false">urn:md5:cef3f438d1959167ffb97f5a9fab4bc2</guid>
    <pubDate>Tue, 25 May 2010 21:40:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Blog (attitude)</category>
        <category>actions</category><category>blog</category><category>list</category><category>sharpness</category><category>todo</category>    
    <description>&lt;p&gt;J'ai ouvert un nouveau blog pour toucher au thème de la photo. Je pratique depuis quelques temps déjà, et je pense qu'un espace dédié était le bienvenu. Quelques points à aborder avant l'ouverture d'un nouveau blog,&lt;/p&gt;    &lt;p&gt;La fameuse liste&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;choisir un moteur de blog&amp;nbsp;: j'ai choisi de m'orienter vers le fameux Wordpress, j'aurais ainsi testé au moins 3 moteurs&amp;nbsp;: &lt;a href="http://typosphere.org"&gt;typosphere&lt;/a&gt;, &lt;a href="http://fr.dotclear.org"&gt;dotclear&lt;/a&gt; (pour ce présent blog, dotclear semble stagner depuis pas mal de temps), &lt;a href="http://wordpress.org"&gt;wordpress&lt;/a&gt; &lt;em&gt;parce que je n'ai aucune personnalité et veux faire comme tout le monde&lt;/em&gt;. Wordpress a une bonne réputation alors pourquoi pas,&lt;/li&gt;
&lt;li&gt;où vais-je l'héberger&amp;nbsp;? sur mon &lt;a href="http://blog.olivier-duval.info/?tag/synology"&gt;NAS Synology&lt;/a&gt; bien sûr&amp;nbsp;!&lt;/li&gt;
&lt;li&gt;se prendre un thème&amp;nbsp;: &lt;a href="http://wordpress.org/extend/themes/mystique"&gt;Mystique&lt;/a&gt; de &lt;a href="http://digitalnature.ro"&gt;Digital Nature&lt;/a&gt; m'a bien emballé et semble être maintenu - ce côté blanc sur fond noir, un juste équilibre. Après avoir recherché par l'interface Wordpress, l'installation s'effectue toute seule, une pure merveille. Le thème a son interface d'administration spécifique pour son paramétrage (détail de design, flux &lt;a href="http://feeds.feedburner.com/Sharpness"&gt;Feedburner&lt;/a&gt;, &lt;a href="http://twitter.com/oduval"&gt;twitter&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;le domaine Internet&amp;nbsp;? &lt;em&gt;sharpness&lt;/em&gt; me semblait approprié pour le sujet abordé&amp;nbsp;: la netteté ou le "piqué" est un point important et récurrent en photographie. Dans le choix d'un objectif, le piqué apparait dans les 1er critères, piqué qui se paye cher souvent,&lt;/li&gt;
&lt;li&gt;quelques widgets&amp;nbsp;: un blog qui parle photo doit avoir quelques composants pour afficher des photos&amp;nbsp;: de Flickr, sur les billets. Egalement, un blogroll sur le thème me parait primordial, ou sur mon écosystème (Twitter, Flickr, ...). La recherche et l'installation par le backoffice Wordpress est vraiment une réussite, on recherche, on sélectionne, on installe,&lt;/li&gt;
&lt;li&gt;ajout d'outils de statistiques&amp;nbsp;: rajout du blog dans &lt;a href="http://www.google.com/analytics/"&gt;Google analytics&lt;/a&gt; et activation de l'&lt;a href="http://yoast.com/wordpress/google-analytics/"&gt;extension&lt;/a&gt; ad-hoc ainsi que pour &lt;a href="http://piwik.org"&gt;Piwik&lt;/a&gt; qui gère le multi-sites. Pour ce dernier, bien qu'il y ait une &lt;a href="http://forwardslash.nl/piwik-analytics/"&gt;extension Piwik&lt;/a&gt;, il y a conflit entre les deux. J'ai dû mettre à jour le pied de page (&lt;em&gt;Apparence / Editeur / Pied de page&lt;/em&gt; (footer.php)) pour rajouter le code Javascript Piwik juste avant la balide &amp;lt;body&amp;gt;,&lt;/li&gt;
&lt;li&gt;pour le format des URLs des billets, j'ai choisi de ne pas mettre la date mais uniquement le titre, parait que c'est mieux,&lt;/li&gt;
&lt;li&gt;ajout dans &lt;a href="http://www.google.com/webmasters/tools/?hl=fr"&gt;Google webmaster tools&lt;/a&gt; du nouveau blog et génération du sitemap grâce à l'&lt;a href="http://www.arnebrachhold.de/projects/wordpress-plugins/google-xml-sitemaps-generator/"&gt;extension prévue pour ça&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;un &lt;a href="http://akismet.com/"&gt;antispam&lt;/a&gt; peut être utile,&lt;/li&gt;
&lt;li&gt;écrire un &lt;em&gt;A propos&lt;/em&gt;, un 1er billet, secouer et livrer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://sharpness.me" hreflang="fr"&gt;Sharpness&lt;/a&gt; est né.&lt;/p&gt;


&lt;p&gt;On verra dans 6 mois pour ajouter quelques widgets du type&amp;nbsp;: nuage de tags, archives, ...&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=4dVgSx1Eld8:y0-V3gGWzL0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/4dVgSx1Eld8" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Nouveau-blog-et-les-actions-a-entreprendre-pour-sa-mise-en-ligne#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Nouveau-blog-et-les-actions-a-entreprendre-pour-sa-mise-en-ligne#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/333</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Nouveau-blog-et-les-actions-a-entreprendre-pour-sa-mise-en-ligne</feedburner:origLink></item>
    
  <item>
    <title>NHibernate et les propriétés magiques</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/dTCb7x6_mKU/</link>
    <guid isPermaLink="false">urn:md5:afce67822b7c8bf0520ab7ae6c3dc2e4</guid>
    <pubDate>Sun, 14 Mar 2010 13:05:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>.NET</category>
        <category>bag</category><category>formula</category><category>nhibernate</category><category>noop</category><category>one-to-many</category><category>property</category>    
    <description>&lt;h3&gt;Préambule&lt;/h3&gt;


&lt;p&gt;La différence entre la théorie et la pratique&amp;nbsp;? en théorie, il n'y en a pas, en pratique, si.&lt;/p&gt;


&lt;p&gt;Le monde du développement est loin d'être un monde idéal, dans la réalité, nous rencontrons souvent des situations particulières auxquelles il faut faire face. Un framework, en plus de répondre aux besoins les plus généraux, se doit également de fournir des solutions de contournements, des "astuces de programmation" diront certains.&lt;/p&gt;


&lt;p&gt;Dans ce court billet, nous allons parler de 2 fonctionnalités de NHibernate sur les propriétés lorsque notre modèle ou le contexte ne répond pas exactement à l'idéal que l'on devrait avoir en termes d'architecture.&lt;/p&gt;    &lt;p&gt;Imaginons que l'on ait une entité Individu, que l'on affichera sur une page, sous forme d'une liste d'individus. Dans notre modèle nous avons la relation simple suivante entre un individu et son appartenance à un établissement&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://yuml.me/diagram/scruffy/class/[Individu]*-1[Etablissement]" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;La liste &lt;strong&gt;paginée&lt;/strong&gt; est &lt;strong&gt;triable&lt;/strong&gt; (cf. ce &lt;a href="http://blog.olivier-duval.info/?post/NHibernate-pagination-paging-tri-et-accessoirement-Future"&gt;billet&lt;/a&gt; pour la pagination et le tri en NHibernate) par le nom, prénom, le nom de l'établissement. On pourrait facilement créer des entités Individu et Etablissement avec cette relation, mais l'on ne souhaite pas le faire, car nous avons uniquement besoin du nom de l'établissement pour le tri, sans vouloir représenter tout le modèle derrière Etablissement. Le tri et la pagination ne peuvent s'effectuer que par l'intermédiaire de NHibernate, nous avons donc besoin d'une proprété mappée dans une classe pour que l'ORM puisse l'atteindre et actionner le tri.&lt;/p&gt;


&lt;h3&gt;Formula&lt;/h3&gt;


&lt;p&gt;les &lt;strong&gt;formula&lt;/strong&gt; permettent ce genre d'astuces de programmation&amp;nbsp;: avoir une propriété EtabNom qui pointe vers une table externe (et non vers une classe comme on le ferait habituellement avec du &lt;strong&gt;many-to-one&lt;/strong&gt;) mais sous forme d'une requête &lt;strong&gt;SQL&lt;/strong&gt;, la propriété se tranforme alors en&amp;nbsp;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;/span&gt;
&lt;span style="color: #009900;"&gt;  &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;EtabNom&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;  &lt;span style="color: #000066;"&gt;formula&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;(select etab.NOMALPHA from ETABLISSEMENT etab where etab.ID=ETAB_ID)&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/property&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;ce qui donne pour l'entité Individu, où ETAB_ID est un champ de la table INDIVIDU mappée&amp;nbsp;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;?xml&lt;/span&gt; &lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;encoding&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;hibernate-mapping&lt;/span&gt; &lt;span style="color: #000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;auto-import&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;class&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;MyNamespace.Individu, MyAssembly&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;table&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;INDIVIDU&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;id&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;column&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;System.Int32&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;access&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;property&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;generator&lt;/span&gt; &lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;identity&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/generator&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Nom&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;column&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;nom&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;not-null&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;System.String&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;access&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;property&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Prenom&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;column&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;prenom&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;not-null&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;System.String&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;access&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;property&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Email&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;column&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;email&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;not-null&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;System.String&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;access&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;property&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;EtabNom&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;              &lt;span style="color: #000066;"&gt;formula&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;(select etab.NOMALPHA from ETABLISSEMENT etab where etab.ID=ETAB_ID)&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/property&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/class&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/hibernate-mapping&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;on pourra alors trier sur la propriété &lt;strong&gt;individu.EtabNom&lt;/strong&gt; sans utiliser d'entité Etablissement. Une requête Linq NHibernate du type&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;lasession.&lt;span style="color: #0000FF;"&gt;Linq&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;Individu&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;OrderBy&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;ind &lt;span style="color: #008000;"&gt;=&amp;gt;&lt;/span&gt; ind.&lt;span style="color: #0000FF;"&gt;EtabNom&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Take&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;20&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;se traduira en SQL de la façon suivante, on retrouve le morceau SQL de l'attribut &lt;strong&gt;formula&lt;/strong&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre class="sql sql" style="font-family:monospace;"&gt;&lt;span style="color: #993333; font-weight: bold;"&gt;SELECT&lt;/span&gt;   top &lt;span style="color: #cc66cc;"&gt;20&lt;/span&gt; individu2_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ID            &lt;span style="color: #993333; font-weight: bold;"&gt;AS&lt;/span&gt; IND1_3_0_&lt;span style="color: #66cc66;"&gt;,&lt;/span&gt;
                individu2_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;nom           &lt;span style="color: #993333; font-weight: bold;"&gt;AS&lt;/span&gt; ind4_3_0_&lt;span style="color: #66cc66;"&gt;,&lt;/span&gt;
                individu2_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;prenom        &lt;span style="color: #993333; font-weight: bold;"&gt;AS&lt;/span&gt; ind5_3_0_&lt;span style="color: #66cc66;"&gt;,&lt;/span&gt;
                individu2_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;email         &lt;span style="color: #993333; font-weight: bold;"&gt;AS&lt;/span&gt; ind7_3_0_&lt;span style="color: #66cc66;"&gt;,&lt;/span&gt;
                individu2_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;etab_id       &lt;span style="color: #993333; font-weight: bold;"&gt;AS&lt;/span&gt; etab12_3_0_&lt;span style="color: #66cc66;"&gt;,&lt;/span&gt;
                &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #993333; font-weight: bold;"&gt;SELECT&lt;/span&gt; etab&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;NOMALPHA
                 &lt;span style="color: #993333; font-weight: bold;"&gt;FROM&lt;/span&gt;   ETABLISSEMENT etab
                 &lt;span style="color: #993333; font-weight: bold;"&gt;WHERE&lt;/span&gt;  etab&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ID &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; individu2_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ETAB_ID&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #993333; font-weight: bold;"&gt;AS&lt;/span&gt; formula0_0_
&lt;span style="color: #993333; font-weight: bold;"&gt;FROM&lt;/span&gt;    INDIVIDU individu2_
&lt;span style="color: #993333; font-weight: bold;"&gt;ORDER&lt;/span&gt; &lt;span style="color: #993333; font-weight: bold;"&gt;BY&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #993333; font-weight: bold;"&gt;SELECT&lt;/span&gt; etab&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;NOMALPHA
          &lt;span style="color: #993333; font-weight: bold;"&gt;FROM&lt;/span&gt;   ETABLISSEMENT etab
          &lt;span style="color: #993333; font-weight: bold;"&gt;WHERE&lt;/span&gt;  etab&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ID &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; individu2_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ETAB_ID&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #993333; font-weight: bold;"&gt;ASC&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;ce type de propriété peut être également  utile en tant que champ calculé, un count sur un champ d'une table externe sans pour autant avoir une collection mappée. Bien entendu, les formula sont à utiliser avec parcimonie, étant donné que c'est du pur SQL, à utiliser sur des tables de références.&lt;/p&gt;


&lt;h3&gt;Noop&lt;/h3&gt;


&lt;p&gt;A l'inverse, on pourrait avoir une classe &lt;strong&gt;Etablissement&lt;/strong&gt; qui ne contiendrait pas de propriété Individus (dans le sens POCO donc non mappée) mais qui serait utile d'avoir pour effectuer des sélections&amp;nbsp;: donne-moi les établissements qui ont plus de 200 individus intérimaires. Au niveau de la collection, cela rejoint &lt;a href="http://blog.olivier-duval.info/?post/2008/06/16/ORM-NHibernate:-mapper-des-sous-collections-ou-pas"&gt;ce billet&lt;/a&gt; qui parlait de ce type de set.&lt;/p&gt;


&lt;p&gt;Le type d'accès &lt;strong&gt;noop&lt;/strong&gt; (ou &lt;strong&gt;none&lt;/strong&gt;) sur une propriété permet cela&amp;nbsp;: pouvoir effectuer une requête sur une propriété non mappé dans une classe.&lt;/p&gt;


&lt;p&gt;Par exemple, dans le .hbm, on pourrait avoir une collection &lt;strong&gt;one-to-many&lt;/strong&gt; qui nous donne les intérimaires d'un établissement, les individus intérimaires seraient de type 3, une collection qui se traduit par&amp;nbsp;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;bag&lt;/span&gt;  &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Interim&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;access&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;noop&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;           &lt;span style="color: #000066;"&gt;where&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;(typind = 3)&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;key&lt;/span&gt; column =&lt;span style="color: #ff0000;"&gt;&amp;quot;ETAB_ID&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;one-to-many&lt;/span&gt; &lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;MyNamespace.Individu, MyAssembly&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
 &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/bag&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;dans la classe &lt;strong&gt;Etablissement&lt;/strong&gt;, &lt;strong&gt;la propriété &lt;em&gt;Interim&lt;/em&gt; n'existe pas&lt;/strong&gt;.&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;?xml&lt;/span&gt; &lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;encoding&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;hibernate-mapping&lt;/span&gt; &lt;span style="color: #000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;auto-import&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;class&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;MyNamespace.Etablissement, MyAssembly&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;table&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ETABLISSEMENT&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;id&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;column&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;System.Int32&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;access&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;property&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;generator&lt;/span&gt; &lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;identity&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/generator&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;EtabNom&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;column&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;NOMALPHA&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;not-null&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;System.String&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;access&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;property&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;bag&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Interim&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;         &lt;span style="color: #000066;"&gt;where&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;(typind = 3)&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;         &lt;span style="color: #000066;"&gt;access&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;noop&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;key&lt;/span&gt; column =&lt;span style="color: #ff0000;"&gt;&amp;quot;ETAB_ID&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;one-to-many&lt;/span&gt; &lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;MyNamespace.Individu, MyAssembly&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/bag&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/class&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/hibernate-mapping&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;cela permet ensuite d'effectuer des requêtes HQL, les établissements ayant plus de 200 intérimaires&amp;nbsp;:&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;var etabs &lt;span style="color: #008000;"&gt;=&lt;/span&gt; session.&lt;span style="color: #0000FF;"&gt;CreateQuery&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;
  from Etablissement etab  
  where size(etab.Interim) &amp;gt; 200&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;List&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;Etablissement&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;qui se traduit en la requête SQL&amp;nbsp;:&lt;/p&gt;

&lt;pre class="sql sql" style="font-family:monospace;"&gt;&lt;span style="color: #993333; font-weight: bold;"&gt;SELECT&lt;/span&gt; etablissem0_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ID       &lt;span style="color: #993333; font-weight: bold;"&gt;AS&lt;/span&gt; ETABCONS1_4_&lt;span style="color: #66cc66;"&gt;,&lt;/span&gt;
          etablissem0_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;NOMALPHA &lt;span style="color: #993333; font-weight: bold;"&gt;AS&lt;/span&gt; ETABCONS2_4_
   &lt;span style="color: #993333; font-weight: bold;"&gt;FROM&lt;/span&gt;   ETABLISSEMENT etablissem0_
   &lt;span style="color: #993333; font-weight: bold;"&gt;WHERE&lt;/span&gt;  &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #993333; font-weight: bold;"&gt;SELECT&lt;/span&gt; count&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;interim1_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ETAB_ID&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;
           &lt;span style="color: #993333; font-weight: bold;"&gt;FROM&lt;/span&gt; INDIVIDU interim1_
           &lt;span style="color: #993333; font-weight: bold;"&gt;WHERE&lt;/span&gt; etablissem0_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ID &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; interim1_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;ETAB_ID
           &lt;span style="color: #993333; font-weight: bold;"&gt;AND&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;interim1_&lt;span style="color: #66cc66;"&gt;.&lt;/span&gt;typind &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;3&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;200&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;de façon identique, à utiliser avec prudence, sous peine de rompre l'abstraction que nous avons avec le SQL.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=dTCb7x6_mKU:lSLmSxb8BQY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/dTCb7x6_mKU" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/NHibernate-et-les-propri%C3%A9t%C3%A9s-magiques#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/NHibernate-et-les-propri%C3%A9t%C3%A9s-magiques#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/332</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/NHibernate-et-les-propri%C3%A9t%C3%A9s-magiques</feedburner:origLink></item>
    
  <item>
    <title>WCF, REST, XML, JSON-P et accessoirement jQuery</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/wolAMHWM31Q/</link>
    <guid isPermaLink="false">urn:md5:71b2d80336d028e442739c8989ecd7f6</guid>
    <pubDate>Wed, 10 Mar 2010 23:35:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Web[2.0]</category>
        <category>.net</category><category>jquery</category><category>json</category><category>jsonp</category><category>rest</category><category>wcf</category><category>xml</category>    
    <description>&lt;h3&gt;Préambule&lt;/h3&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Imaginons que l'on veuille développer un service web d'interrogation basé sur &lt;a href="http://fr.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt;, c'est à dire qui s'appuie sur HTTP uniquement pour les requêtes et les (codes&amp;nbsp;: 200, 400, 404, 403, ...) réponses. Les réponses peuvent être au format Xml ou JSON. Ce service reste simple&amp;nbsp;: une entrée du type int, et un retour d'un type primitif&amp;nbsp;: string, ou un tableau de string&amp;nbsp;: pour un n° de responsable, avoir les n° associations qu'il gère.&lt;/p&gt;    &lt;h3&gt;côté client&amp;nbsp;: JSON et JSON-P&lt;/h3&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Le retour au format JSON est souvent pris pour un usage côté client / navigateur, par exemple à des fins de création de widgets à l'aide d'APIs, plus particuliérement pour un traitement javascript (facilité par ce format natif javascript) dans un mode Ajax. Comme chacun le sait ou a été déjà confronté, les appels Ajax ne peuvent être cross-domain, c'est à dire qu'un appel d'un script hébergé et à partir du domaine dummy.com vers domain.ntld est interdit par le navigateur (par l'objet XMLHttpRequest).&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Les méthodes les plus connues pour palier à cette restriction sont&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;soit développer un proxy côté serveur dummy.com qui effectura ensuite la requête vers le domaine distant domain.ntld pour renvoyer ensuite le résultat au script appelant,&lt;/li&gt;
&lt;li&gt;soit se baser sur une fonction de callback JSON-P (JSON with Padding), technique qu'offre bon nombre d'APIs de nos réseaux sociaux préférés (&lt;a href="http://api.flickr.com/services/feeds/photos_public.gne?tags=amélia&amp;amp;id=55936300@N00&amp;amp;tagmode=any&amp;amp;format=json&amp;amp;jsoncallback=foo"&gt;Flickr&lt;/a&gt;, &lt;a href="http://feeds.delicious.com/v2/json/popular?callback=foo"&gt;Delicious&lt;/a&gt;, ...)&amp;nbsp;: il s'agit de mettre en place une URL dans une balise &lt;strong&gt;&amp;lt;script&amp;gt;&lt;/strong&gt; créée dynamiquement, où le contenu de retour au format JSON sera encapsulé dans une fonction javascript (le callback), exécutée lors du retour de l'appel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;le résultat ressemblera à quelque chose du type&amp;nbsp;:&lt;/p&gt;

&lt;pre class="javascript javascript" style="font-family:monospace;"&gt;&lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt;script type&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; script&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;http://domain.ntld/api/resp/2?callback=myfct&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;&amp;gt;&lt;/span&gt;
  myfct&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;dataJSON&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #339933;"&gt;&amp;lt;/&lt;/span&gt;script&lt;span style="color: #339933;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;par exemple, pour un appel Flickr, sur un bouton, la balise &lt;strong&gt;&amp;lt;script&amp;gt;&lt;/strong&gt; avec l'URL d'interrogation sera créée dynamiquement, la fonction &lt;strong&gt;callbackFctFlickr&lt;/strong&gt; avec les données au format JSON sera appelée au retour de l'appel&amp;nbsp;:&lt;/p&gt;

&lt;pre class="javascript javascript" style="font-family:monospace;"&gt;$j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#btnSearch'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;click&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
            createScriptJSONP&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
        &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; createScriptJSONP&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
        $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#results'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;empty&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; urljsonp &lt;span style="color: #339933;"&gt;=&lt;/span&gt; $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#sApi :selected'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;val&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; api &lt;span style="color: #339933;"&gt;=&lt;/span&gt; $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#sApi :selected'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;text&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
        &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; s &lt;span style="color: #339933;"&gt;=&lt;/span&gt; document.&lt;span style="color: #660066;"&gt;createElement&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'script'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;api &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;&amp;quot;Delicious&amp;quot;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
            s.&lt;span style="color: #660066;"&gt;src&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; urljsonp &lt;span style="color: #339933;"&gt;+&lt;/span&gt; $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#txtSearch'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;val&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'?callback=callbackFctDelicious'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
            s.&lt;span style="color: #660066;"&gt;src&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; urljsonp &lt;span style="color: #339933;"&gt;+&lt;/span&gt; $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#txtSearch'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;val&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
        s.&lt;span style="color: #660066;"&gt;type&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'text/javascript'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        document.&lt;span style="color: #660066;"&gt;body&lt;/span&gt;.&lt;span style="color: #660066;"&gt;appendChild&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;s&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;// création manuelle du script pour l'appel API&lt;/span&gt;
&amp;nbsp;
    &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; callbackFctFlickr&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;data&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;                
        $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#results'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;append&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'&amp;lt;ul&amp;gt;'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;data.&lt;span style="color: #660066;"&gt;items&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;each&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;i&lt;span style="color: #339933;"&gt;,&lt;/span&gt; v&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;            
            $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#results'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;append&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;&amp;lt;li id=&amp;quot;&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; i &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;&amp;quot;&amp;gt;&amp;lt;a href='&amp;quot;&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; v.&lt;span style="color: #660066;"&gt;link&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;&amp;quot;'&amp;gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; v.&lt;span style="color: #660066;"&gt;title&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;&amp;lt;img/&amp;gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;attr&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;src&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; v.&lt;span style="color: #660066;"&gt;media&lt;/span&gt;.&lt;span style="color: #660066;"&gt;m&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;appendTo&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; i&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;            
        &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#results'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;append&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'&amp;lt;/ul&amp;gt;'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Amusons-nous avec 3 APIs :&lt;/strong&gt; Flickr, Yahoo, Delicious , à tester sur la &lt;a href="http://olivier-duval.info/essais/jsonp-testing-jq.html"&gt;page démo&lt;/a&gt; en sélectionnant l'API souhaitée (essayer &lt;em&gt;amélia&lt;/em&gt; (c'est ma fille) ou &lt;em&gt;architecture&lt;/em&gt; pour Flickr, &lt;em&gt;photography&lt;/em&gt; pour Delicious, les deux pointent vers mes comptes),&lt;/p&gt;


&lt;p&gt;Une alternative avec jQuery, où la création dynamique du code &lt;strong&gt;&amp;lt;script&amp;gt;&lt;/strong&gt; s'effectue automatiquement, ainsi que l'ajout de la fonction callback, grâce à la fonction &lt;strong&gt;getJSON()&lt;/strong&gt; ou &lt;strong&gt;ajax()&lt;/strong&gt;, cette dernière offre plus d'options, et donc, de souplesse.&lt;/p&gt;

&lt;pre class="javascript javascript" style="font-family:monospace;"&gt;$j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#btnSearch'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;click&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
            createScriptJSONP&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
   &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; createScriptJSONP&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
        $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#results'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;empty&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; urljsonp &lt;span style="color: #339933;"&gt;=&lt;/span&gt; $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#sApi :selected'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;val&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; api &lt;span style="color: #339933;"&gt;=&lt;/span&gt; $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#sApi :selected'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;text&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; url &lt;span style="color: #339933;"&gt;=&lt;/span&gt; urljsonp &lt;span style="color: #339933;"&gt;+&lt;/span&gt; $j&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#txtSearch'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #660066;"&gt;val&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
        $j.&lt;span style="color: #660066;"&gt;ajax&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
            url&lt;span style="color: #339933;"&gt;:&lt;/span&gt; url&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
            dataType&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'jsonp'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
            jsonp&lt;span style="color: #339933;"&gt;:&lt;/span&gt; api&lt;span style="color: #339933;"&gt;==&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'Flickr'&lt;/span&gt;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'jscallback'&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'callback'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
            success&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;data&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;switch&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;api&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
                    &lt;span style="color: #000066; font-weight: bold;"&gt;case&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'Flickr'&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;
                        callbackFctFlickr&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;data&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;break&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                    &lt;span style="color: #000066; font-weight: bold;"&gt;case&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'Yahoo'&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;
                        callbackFctYahoo&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;data&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;break&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                    &lt;span style="color: #000066; font-weight: bold;"&gt;case&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'Delicious'&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;
                        callbackFctDelicious&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;data&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;break&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;exemples d'appels générés sur Flickr, Yahoo ou Delicious avec jQuery, la fonction précisée en paramètre à &lt;strong&gt;jsoncallback&lt;/strong&gt; ou &lt;strong&gt;callback&lt;/strong&gt; est ajoutée par jQuery&lt;/p&gt;

&lt;pre&gt;
http://api.flickr.com/services/feeds/photos_public.gne?id=55936300@N00&amp;amp;tagmode=any&amp;amp;format=json&amp;amp;tags=am%C3%A9lia&amp;amp;jsoncallback=jsonp1268130184172&amp;amp;_=1268130185391

http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&amp;amp;output=json&amp;amp;query=am%C3%A9lia&amp;amp;callback=jsonp1268130547073&amp;amp;_=1268130655088

http://feeds.delicious.com/v2/json/zorky/photography?callback=jsonp1268130547074&amp;amp;_=1268130676051
&lt;/pre&gt;


&lt;p&gt;Bien entendu, cette technique fonctionne si le serveur distant encapsulte le JSON (qui doit être bien formé) dans une fonction javascript, à la JSON-P.&lt;/p&gt;


&lt;h3&gt;côté serveur&lt;/h3&gt;


&lt;p&gt;En .NET, WCF permet nativement de renvoyer au choix, des données au format XML (POX, Plain Old XML, par défaut) ou au format JSON, voire en binaire, pour des images par exemple, mais point d'encapsulation JSON-P (qu'on se rassure, cela arrive avec la version WCF de .NET 4.0, avec le binding &lt;strong&gt;webHttpBindingWithJsonP&lt;/strong&gt;).&lt;/p&gt;


&lt;p&gt;En attendant, en cherchant sur Goooooogle, on tombe facilement sur &lt;a href="http://msdn.microsoft.com/en-us/library/cc716898.aspx"&gt;JSON with Padding (AJAX)&lt;/a&gt; qui permet d'étendre WCF pour ajouter une fonction callback à un appel JSON qui le demande.&lt;/p&gt;


&lt;p&gt;Au lieu de recevoir les données au format JSON, par exemple&lt;/p&gt;

&lt;pre class="javascript javascript" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;mylistJSONResult&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56056&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56080&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56129&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56134&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56227&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56257&amp;quot;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;on aura les données JSON encapsulées dans une fonction, avec un appel du type &lt;strong&gt;?callback=myfct&lt;/strong&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre class="javascript javascript" style="font-family:monospace;"&gt;myfct&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;mylistJSONResult&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56056&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56080&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56129&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56134&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56227&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;56257&amp;quot;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;afin d'utiliser ce hook, dans le contrat WCF, on aura un attribut &lt;strong&gt;JSONPBehaviour&lt;/strong&gt; qui nous permettra de préciser la fonction de callback&amp;nbsp;:&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;OperationContract&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;WebCache&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;CacheProfileName &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;&amp;quot;cachingrest&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;WebGet&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;UriTemplate &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;&amp;quot;assoc/resp/{respid}.json&amp;quot;&lt;/span&gt;,
            ResponseFormat &lt;span style="color: #008000;"&gt;=&lt;/span&gt; WebMessageFormat.&lt;span style="color: #0000FF;"&gt;Json&lt;/span&gt;,
            BodyStyle &lt;span style="color: #008000;"&gt;=&lt;/span&gt; WebMessageBodyStyle.&lt;span style="color: #0000FF;"&gt;Wrapped&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;JSONPBehavior&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;callback &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;&amp;quot;callback&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;string&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; mylistJSON&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;string&lt;/span&gt; respid&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;l'attribut &lt;strong&gt;[WebCache]&lt;/strong&gt; est tiré du &lt;a href="http://aspnet.codeplex.com/releases/view/24644"&gt;WCF Rest Starter Kit&lt;/a&gt; qui permet de &lt;em&gt;cacher&lt;/em&gt; (entêtes &lt;strong&gt;cache-control / expires&lt;/strong&gt;) les requêtes GET de ce type. Rappelons que c'est l'un des grands avantages des requêtes GET par rapport aux POST&amp;nbsp;: la capacité  d'utiliser le cache navigateur.&lt;/p&gt;


&lt;p&gt;l'attribut &lt;strong&gt;[WebGet]&lt;/strong&gt; précise le motif de la requête REST, en GET, ainsi que le format de données retourné, ici JSON en mode wrappé (c'est à dire de la forme &lt;strong&gt;"mylistJSONResult"&amp;nbsp;: [data]&lt;/strong&gt;): on aura une URI du type &lt;strong&gt;http://domain.tld/mysvc.svc/json/assoc/resp/45.json?callback=myfct&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Malheureusement, le code &lt;strong&gt;JSONPBehavior&lt;/strong&gt; fonctionnera sur tout le service, que cela soit pour du JSON ou du ...XML.&lt;/p&gt;


&lt;p&gt;Comme on veut servir du JSON-P ET du XML, on devra avoir 2 méthodes dans le contrat (et dans son implémentation donc), et un discriminant dans la configuration &lt;strong&gt;Web.config&lt;/strong&gt;, pour déclencher le hook sur l'appel opportun. Pour bien faire, il s'agirait de modifier le module afin qu'il ne traite pas (ie&amp;nbsp;: ajout de l'encapsulation JSON dans une fonction) les données lorsqu'il s'agit d'un format XML, je n'ai pas emprunté ce chemin.&lt;/p&gt;


&lt;p&gt;le contrat de nos 2 méthodes, 1 pour le XML, 1 pour le JSON-P, qui répondent selon le motif URL&amp;nbsp;:&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;&lt;span style="color: #008080; font-style: italic;"&gt;/// retour XML&lt;/span&gt;
        &lt;span style="color: #008080; font-style: italic;"&gt;/// URL au format http://localhost/mysvc.svc/xml/assoc/resp/{id}&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;OperationContract&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;WebCache&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;CacheProfileName &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;&amp;quot;cachingrest&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;WebGet&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;UriTemplate &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;&amp;quot;assoc/resp/{respid}&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;string&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; mylist&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;string&lt;/span&gt; respid&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
        &lt;span style="color: #008080; font-style: italic;"&gt;/// retour JSON encapsulé&lt;/span&gt;
        &lt;span style="color: #008080; font-style: italic;"&gt;/// URL au format JSON pur http://localhost/mysvc.svc/json/assoc/resp/{id}.json&lt;/span&gt;
        &lt;span style="color: #008080; font-style: italic;"&gt;/// ou JSON-P http://localhost/mysvc.svc/json/assoc/resp/{id}.json?callback=myfct&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;OperationContract&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;WebCache&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;CacheProfileName &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;&amp;quot;cachingrest&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;WebGet&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;UriTemplate &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;&amp;quot;assoc/resp/{respid}.json&amp;quot;&lt;/span&gt;,
            ResponseFormat &lt;span style="color: #008000;"&gt;=&lt;/span&gt; WebMessageFormat.&lt;span style="color: #0000FF;"&gt;Json&lt;/span&gt;,
            BodyStyle &lt;span style="color: #008000;"&gt;=&lt;/span&gt; WebMessageBodyStyle.&lt;span style="color: #0000FF;"&gt;Wrapped&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;JSONPBehavior&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;callback &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;&amp;quot;callback&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;
        List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;string&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; mylistJSON&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;string&lt;/span&gt; respid&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;et le web.config, où le descrimant s'effectue grace à l'attribut &lt;strong&gt;address&lt;/strong&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;system.serviceModel&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;serviceHostingEnvironment&lt;/span&gt; &lt;span style="color: #000066;"&gt;aspNetCompatibilityEnabled&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;    
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;services&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;service&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ws.rest.Assoc&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #808080; font-style: italic;"&gt;&amp;lt;!-- cas JSON : extension JSONP --&amp;gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;endpoint&lt;/span&gt; &lt;span style="color: #000066;"&gt;address&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;          &lt;span style="color: #000066;"&gt;behaviorConfiguration&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ws.rest.AssocRest&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;          &lt;span style="color: #000066;"&gt;binding&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;customBinding&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;          &lt;span style="color: #000066;"&gt;bindingConfiguration&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;jsonpBinding&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;          &lt;span style="color: #000066;"&gt;contract&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ws.rest.IAssoc&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #808080; font-style: italic;"&gt;&amp;lt;!-- cas XML --&amp;gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;endpoint&lt;/span&gt; &lt;span style="color: #000066;"&gt;address&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;xml&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;          &lt;span style="color: #000066;"&gt;behaviorConfiguration&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ws.rest.AssocRest&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;          &lt;span style="color: #000066;"&gt;binding&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;webHttpBinding&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;          &lt;span style="color: #000066;"&gt;contract&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ws.rest.IAssoc&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/service&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/services&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;    
   &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;behaviors&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;   
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;endpointBehaviors&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;behavior&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ws.rest.AssocRest&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
             &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;webHttp&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/behavior&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/endpointBehaviors&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/behaviors&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;bindings&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;      
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;customBinding&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;        
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;binding&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;jsonpBinding&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;jsonpMessageEncoding&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;httpTransport&lt;/span&gt; &lt;span style="color: #000066;"&gt;manualAddressing&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/binding&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/customBinding&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/bindings&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;extensions&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;bindingElementExtensions&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;add&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;jsonpMessageEncoding&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;          &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ws.rest.JsonpBindingExtension, ws&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/bindingElementExtensions&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/extensions&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/system.serviceModel&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;pas forcément la solution la plus élégante, nous sommes bien d'accord, .NET 4 apportera très certainement une réponse plus propre à ce type de problématique.&lt;/p&gt;


&lt;p&gt;La prochaine fois, nous verrons la truite saumonée en papillote.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=wolAMHWM31Q:WYYYpGzRvwU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/wolAMHWM31Q" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/WCF-REST-XML-JSON-P-et-accessoirement-jQuery#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/WCF-REST-XML-JSON-P-et-accessoirement-jQuery#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/331</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/WCF-REST-XML-JSON-P-et-accessoirement-jQuery</feedburner:origLink></item>
    
  <item>
    <title>Techdays 2010, jour 3</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/vPPDBUTraco/</link>
    <guid isPermaLink="false">urn:md5:5fc42324d08b6bd62d1641b43c934077</guid>
    <pubDate>Thu, 11 Feb 2010 10:07:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>.NET</category>
        <category>design</category><category>ergonomie</category><category>techdays</category><category>techdays 2010</category><category>web</category>    
    <description>&lt;p&gt;&lt;ins&gt;&lt;/ins&gt;Ce 3è jour sera beaucoup consacré à l'ergonomie et au design. Ce n'est pas ma compétence première, cela sera donc très difficile pour moi de résumer correctement les 3 sessions auxquelles j'ai assisté - malgré leur richesse - autrement que par des mots clés et de façon très lapidaire.&lt;/p&gt;    &lt;h3&gt;Ergonomie Web&lt;/h3&gt;


&lt;p&gt;La session la plus intéressante de la journée, présentée par une experte en la matière&amp;nbsp;: &lt;a href="http://www.ergolab.net"&gt;Amélie BOUCHER&lt;/a&gt;. Cela donne envie de lire &lt;a href="http://www.ergonomie-sites-web.com"&gt;son ouvrage sur le sujet&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;L'ergonomie Web se résume en 2 notions, ou 2 mots ayant des objectifs bien différents&amp;nbsp;: &lt;strong&gt;utilité&lt;/strong&gt; et &lt;strong&gt;utilisabilité&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Utilité = répondre à besoin (fonctionnel) tandis que&lt;/p&gt;


&lt;p&gt;Utilisabilité (usability en anglais) = répondre à une simplicité d'utilisation, elle est définie par la norme &lt;a href="http://en.wikipedia.org/wiki/ISO_9241"&gt;ISO 9241&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;il faut chercher un équilibre entre ces 2 notions.&lt;/p&gt;


&lt;h4&gt;Utilité&lt;/h4&gt;


&lt;p&gt;Travailler sur ce point permet de bien choisir les fonctions d'un système, ni trop peu, ni trop, cela dépend du contexte d'utilisation, et du type d'applications (métier, web, ...). Dans tous les cas, pour cela, il est nécessaire de connaitre les besoins des utilisateurs, et son contexte, aussi, il ne faut&amp;nbsp;: ni les surestimer, ni les sousestimer, mais les estimer au mieux. (cf. &lt;a href="http://fr.wikipedia.org/wiki/Persona_(marketing)"&gt;méthode des personas&lt;/a&gt; + scénarios utilisateurs).&lt;/p&gt;


&lt;h4&gt;Utilisabilité&lt;/h4&gt;


&lt;p&gt;Techniques&amp;nbsp;: SUPPRIMER la fonction (fonction réelle identifiée ou latente ?), HIEARCHISER&amp;nbsp;: lesquelles (fonctions) sont primordiales, secondaires&amp;nbsp;: fréquence, efficacité, efficience ("j'attends mon but au moindre coût"), satisfaction&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Réalité d'une interface "ergonomique"&amp;nbsp;: elle doit être invisible&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;


&lt;h4&gt;Tests utilisateurs&lt;/h4&gt;


&lt;p&gt;Suivent quelques exemples avec Google, Live search, Amazon, où il est démontré qu'un temps de chargement plus élevé de la page (de 0,4 s à 0,9 s par ex) fait perdre des ventes ou des clics publicitaires (de l'ordre de -2 à 20 % selon). Une démo sur un webmail où il est demandé au panel utilisateurs d'envoyer un message&amp;nbsp;: la plupart ne voient pas le gros bouton "Envoyer un message" (matériel&amp;nbsp;: Tobii T120 eye-tracking).&lt;/p&gt;


&lt;p&gt;Un autre moyen de tester&amp;nbsp;: tests comportementaux, sur un site, une partie des internautes est redirigée vers d'autres versions d'une page, ceci afin d'observer le comportement et s'il se traduit par un gain (de ventes, ...).&lt;/p&gt;


&lt;h4&gt;Conclusion&lt;/h4&gt;


&lt;p&gt;Très bonne session sur un sujet très délicat et récurrent à résoudre&amp;nbsp;: l'ergonomie au sens large d'une application Web.&lt;/p&gt;


&lt;h3&gt;Eléments de design visuel&amp;nbsp;: formes, couleurs et typos&lt;/h3&gt;


&lt;p&gt;Globalement intéressante pour sa culture générale, courte session (35 mn hors questions) présentée par &lt;a href="http://i-breed.typepad.com"&gt;Marc-André FRANCART&lt;/a&gt; (ou http://www.r-u-experienced.net). Pas de résumé pour celle-ci, juste 2-3 phrases.&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Une citation&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;"Ce qui est inutile est laid, ce qui est laid est repoussant, ce qui est repoussant vend mal" (Raymon Loewy)&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Le design pour l'expérience utilisateur (UX) se décline selon un triangle en 3 parties&amp;nbsp;: techno (base), fonctionnalités (milieu), UX (haut.&lt;/p&gt;


&lt;h4&gt;Conclusion&amp;nbsp;: 35 % des utilisateurs achétent uniquement sur le visuel.&lt;/h4&gt;


&lt;h3&gt;Objets intelligents, objets vivants&lt;/h3&gt;


&lt;p&gt;Dernière session sur le sujet du Design, présentée par Dominique SCIAMMA du &lt;a href="http://www.stratecollege.fr/index2.html"&gt;Strate Collège Designers&lt;/a&gt;, école réputée en design. Session intéressante et bien amenée par l'orateur mais difficilement résumable.&lt;/p&gt;


&lt;p&gt;On parlera de RFID, Nanotechnologies, IPv6 (!), du retour de l'IA, et des défis qu'induisent certains projets design dans la vie courante, au niveau éthique, politique et philosophique.&lt;/p&gt;


&lt;p&gt;Le strate Collège a un &lt;a href="http://www.youtube.com/user/stratecollege"&gt;canal sur Youtube&lt;/a&gt; où ils présentent leurs intéressants projets en design, à voir.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=vPPDBUTraco:QXk5XXMioQU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/vPPDBUTraco" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Techdays-2010-jour-3#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Techdays-2010-jour-3#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/330</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Techdays-2010-jour-3</feedburner:origLink></item>
    
  <item>
    <title>Techdays 2010, jour 2</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/tWsS0trb_ag/</link>
    <guid isPermaLink="false">urn:md5:00f939fb06fb9b4f86eba7917bd019e9</guid>
    <pubDate>Wed, 10 Feb 2010 17:33:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>.NET</category>
        <category>asp.net webforms 4.0</category><category>axum</category><category>techdays</category><category>techdays 2010</category>    
    <description>&lt;p&gt;2è jour des techdays. J'assisterai à la plénière à distance, du bureau, grâce à la &lt;a href="http://live.mstechdays.fr"&gt;rediffusion en direct&lt;/a&gt;, pour rejoindre ensuite le palais des congrès pour quelques sessions, en voici quelques notes.&lt;/p&gt;    &lt;h3&gt;Langage Axum&lt;/h3&gt;


&lt;p&gt;Session présentée par &lt;a href="http://blog.polom.com"&gt;Yann SCHWARZ&lt;/a&gt; (membre ALT.NET) et &lt;a href="http://msmvps.com/blogs/brunoboucard"&gt;Bruno Boucard&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Ce fût une très bonne présentation en binôme sur le sujet de la programmation parallèle (sujet qui m'intéresse car me rappelle un peu &lt;a href="http://www.laurent-bloch.org/Livre-Systeme/livre013.html#toc217"&gt;ma jeunesse&lt;/a&gt; pendant mes études) et particulièrement sur Axum, un DSL dédié à ce délicat domaine.&lt;/p&gt;


&lt;h4&gt;Etat des lieux&lt;/h4&gt;


&lt;p&gt;Chez MS, Windows server supporte jusqu'à 256 coeurs, la fréquence en "herz" n'est donc plus le seul critère pour les performances d'applications.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;On pose les difficultés actuelles pour le traitement // :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Exemple par un calcul matriciel en //, présentation d'un code C++&amp;nbsp;: insatisfaisant car compliqué, bien souvent source d'erreurs dans l'algo, paramètre statique pour le nombre de coeurs à utiliser, inmaintenable (et rend donc non sereine toute modification).&lt;/p&gt;


&lt;p&gt;La programmation //&amp;nbsp;: il est difficile d'assurer la fiabilité et l'exactitude d'un système qui utilise des locks&amp;nbsp;: peut rendre plus lent l'exécution du code, un constat&amp;nbsp;: le &lt;strong&gt;lock&lt;/strong&gt; coûte cher.&lt;/p&gt;


&lt;p&gt;Vient ensuite un exemple sur l'&lt;strong&gt;asynchronisme :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exemple trivial, pattern sur les threads&amp;nbsp;: BeginInvoke + callback (EndInvoke)&amp;nbsp;: problème&amp;nbsp;: pas lisibilité ds le code (qui appelle qui, qui appelle quoi)&lt;/li&gt;
&lt;li&gt;utilisation de InterLocked Increment/Decrement + BeginInvoke / EndInvoke&amp;nbsp;: un peu plus lisible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;pourquoi est-ce si compliqué&amp;nbsp;? les langages impératifs ont été faits pour des appels synchrones, seul hic&amp;nbsp;: en asynchrone, on perd l'intention du code (lisibilité, quel portion de code fait quoi ?)&lt;/p&gt;


&lt;h4&gt;Nouvelles approches&lt;/h4&gt;


&lt;p&gt;Une liste de quelques nouvelles approches sur la programmation //&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET 4&amp;nbsp;: &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163340.aspx"&gt;Task Parallel Library&lt;/a&gt; (TPL)&amp;nbsp;: abstraction du découpage en threads&lt;/li&gt;
&lt;li&gt;Atomicité&amp;nbsp;: casse-tête&amp;nbsp;: on s'inspire des bdd transactionnelles pour avoir de la mémoire transactionnelle&amp;nbsp;: &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee334183.aspx"&gt;STM.NET&lt;/a&gt; (en incubation chez MS), &lt;a href="http://www.haskell.org"&gt;Haskell&lt;/a&gt;, &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt;&amp;nbsp;: bien mais trop complexes&lt;/li&gt;
&lt;li&gt;approche données, on ne touche plus à rien&amp;nbsp;: tout est immuable, fonctionnel pur&amp;nbsp;: &lt;a href="http://ftp.sunet.se/pub/lang/erlang/"&gt;Erlang&lt;/a&gt;, Haskell&lt;/li&gt;
&lt;li&gt;le modèle "acteurs"&amp;nbsp;: communication uniquement par messages entre acteurs&amp;nbsp;: pas de données partagées, messages asynchrones, traitements distincts et isolés&amp;nbsp;: Erlang (langage dans le &lt;em&gt;Mainstream&lt;/em&gt;, utilisé dans les commutateurs téléphoniques) et &lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd795202.aspx"&gt;Axum&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comme souvent, à chaque besoin son modèle de programmation&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;données&amp;nbsp;: TPL, &lt;a href="http://msdn.microsoft.com/fr-fr/magazine/cc163329.aspx"&gt;PLINQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;tâches&amp;nbsp;: TPL&lt;/li&gt;
&lt;li&gt;flux données&amp;nbsp;: Axum (approche workflow)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Principes Axum&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;un DSL au parfum C#&lt;/li&gt;
&lt;li&gt;repose sur la BCL (Base Class Libraries)&lt;/li&gt;
&lt;li&gt;au stade expérimental&amp;nbsp;: &lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd795202.aspx"&gt;en incubation chez MS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;les concepts :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;domaine&lt;/strong&gt;&amp;nbsp;: périmètre des données partagées entre agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;agent&lt;/strong&gt; (ou acteur)&amp;nbsp;: unité de traitement qui communique via messages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;channel&lt;/strong&gt;&amp;nbsp;: modalité de conversation entre agents (contenus dans un domaine)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;schéma&lt;/strong&gt;&amp;nbsp;: format des messages échangés (doit être sérialisable, et donc immuable)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;structure d'un système Axum&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Les &lt;em&gt;domaines&lt;/em&gt; contiennent des &lt;em&gt;agents&lt;/em&gt;, les domaines communiquent entre eux par &lt;em&gt;channel&lt;/em&gt;, on privilégie la composabilité. Une application est découpée en domaines, les états du domaine sont accessibles par les agents via des channels asynchrones.&lt;/p&gt;


&lt;p&gt;Après les bases posées, arrive une démo, un ping pong entre agents, cela permet de découvrir le DSL, et les mots clés de ce dernier pour décrire les traitements.&lt;/p&gt;


&lt;p&gt;Un programme axum a une extension &lt;strong&gt;.ax&lt;/strong&gt; (utilisation de l'assembly Microsoft.Axum)&lt;/p&gt;


&lt;p&gt;Quelques mots clés du DSL: &lt;strong&gt;domain&lt;/strong&gt;, &lt;strong&gt;agent&lt;/strong&gt;, &lt;strong&gt;channel&lt;/strong&gt;, &lt;strong&gt;receive&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Un extrait d'un code Axum&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; MainAgent&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
   var pp &lt;span style="color: #008000;"&gt;=&lt;/span&gt; PingPong.&lt;span style="color: #0000FF;"&gt;CreateInNewDomain&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
   &lt;span style="color: #0600FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;int&lt;/span&gt; i&lt;span style="color: #008000;"&gt;=&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;0&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt; i&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;10&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;i&lt;span style="color: #008000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
        pp&lt;span style="color: #008000;"&gt;::&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Pong&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;lt;--&lt;/span&gt; true&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        receive&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;pp&lt;span style="color: #008000;"&gt;:&lt;/span&gt;Ping&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
   pp&lt;span style="color: #008000;"&gt;::&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Ping&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;lt;--&lt;/span&gt; false&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; channel Pingpong &lt;span style="color: #008080; font-style: italic;"&gt;// ~interface ServiceContract en WCF&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
   input &lt;span style="color: #FF0000;"&gt;bool&lt;/span&gt; Pong&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
   output Signal Ping&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #008080; font-style: italic;"&gt;// Signal = void  &lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; agent PingAgent &lt;span style="color: #008000;"&gt;:&lt;/span&gt; channel PingPong
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
  &lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; PingAgent&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #008080; font-style: italic;"&gt;// boucle principale de l'agent, on met souvent tout le code de l'agent dedans&lt;/span&gt;
  &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
      &lt;span style="color: #0600FF;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt; receive&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Pong&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #008080; font-style: italic;"&gt;// receive bloquant&lt;/span&gt;
     &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
            Ping &lt;span style="color: #008000;"&gt;&amp;lt;--&lt;/span&gt; Signal&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #008080; font-style: italic;"&gt;//&lt;/span&gt;
      &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
      Ping &lt;span style="color: #008000;"&gt;&amp;lt;--&lt;/span&gt; Signal&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
  &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Axum permet aussi de chercher un agent hébergé sur une autre machine (provider Connect&amp;lt;PingPong&amp;gt; "http://server")&lt;/p&gt;


&lt;p&gt;Partage de données&amp;nbsp;: par défaut aucune donnée n'est partagée, un agent doit se déclarer pour consommer la donnée, avec des rôles&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writer&amp;nbsp;: peut modifier l'état du domaine,&lt;/li&gt;
&lt;li&gt;Reader&amp;nbsp;: peut lire l'état partagé.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une fois les rôles définis, Axum décide du mode d'exécution&amp;nbsp;: &lt;strong&gt;parallèle&lt;/strong&gt;, &lt;strong&gt;r/w lock&lt;/strong&gt;, &lt;strong&gt;séquentiel&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Axum en action (Dataflow Networks)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exprimer explicitement la séquence de traitement dans le code&lt;/li&gt;
&lt;li&gt;Opérateurs pour les patterns de communication&amp;nbsp;: forward, forward-once, multiplex, join, broadcast, alternate  sous forme d'opérandes qui ressemblent fort à des smileys :&lt;strong&gt;--&amp;gt;&lt;/strong&gt;, &lt;strong&gt;==&amp;gt;&lt;/strong&gt;, &lt;strong&gt;-&amp;lt;&amp;lt;&lt;/strong&gt; (Broadcast) , &lt;strong&gt;&amp;amp;&amp;gt;-&lt;/strong&gt;, &lt;strong&gt;&amp;gt;&amp;gt;-&lt;/strong&gt; (Multiplex), -&lt;strong&gt;&amp;lt;:&lt;/strong&gt; (Alternate)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemples d'application&amp;nbsp;: traitements de N images, de chat (chat de facebook développé en Erlang car des millions en //), jeu de la vie&lt;/p&gt;


&lt;h4&gt;Interopérabilité&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;utilisation de la BCL uniquement si c'est garanti par contrats (safe ou non-safe)&amp;nbsp;: si des effets de bord sont détectés par le compilateur Axum, ce dernier n'acceptera pas le code&lt;/li&gt;
&lt;li&gt;consommé du .NET classique et vice versa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Principe d'Axum&amp;nbsp;: &lt;em&gt;what you see is what you get&lt;/em&gt; (principe de moindre surprise)&lt;/p&gt;


&lt;h3&gt;ASP.NET 4.0 Webforms&lt;/h3&gt;


&lt;p&gt;Session présentée par Aurélien VERLA (Wygmam)&lt;/p&gt;


&lt;h4&gt;Intro&lt;/h4&gt;


&lt;p&gt;les briquent qui se reposent sur ASP.NET Core&amp;nbsp;: &lt;strong&gt;Webforms&lt;/strong&gt;, &lt;strong&gt;MVC&lt;/strong&gt;, &lt;strong&gt;Ajax&lt;/strong&gt;, &lt;strong&gt;Dynamic Data&lt;/strong&gt;, la session abordera uniquement la partie WebForms 4.0&lt;/p&gt;


&lt;p&gt;Simplification du web.config et quelques améliorations&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;beaucoup de paramètres du web.config sont déportés dans le machine.config&lt;/li&gt;
&lt;li&gt;décliné en Debug ou Release&amp;nbsp;: Web.Debug.config, Web.Release.config&amp;nbsp;: pour avoir des paramètres différents selon la plateforme (via tranformation XSLT) (section &lt;strong&gt;&amp;lt;compilation xdt:Transform="RemoveAttributes(debug)"/&amp;gt;&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code snippet pour accélérer l'écriture des controls&amp;nbsp;: exemple sur &lt;strong&gt;asp.Label&lt;/strong&gt;&amp;nbsp;: pré-remplira le attributs (runat, Text, ...) et se positionnera sur l'attribut à remplir&amp;nbsp;: Ctrl+X+K (ou Ctrl+K+X)&lt;/p&gt;


&lt;h4&gt;Gain bande passante&lt;/h4&gt;


&lt;p&gt;Quelques améliorations ont été apportées pour réduire la quantité de données qui transite entre le navigateur et le serveur.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rendering de certains contrôles&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;       &lt;strong&gt;asp:Menu&lt;/strong&gt; : RenderingMode : pour modifier le rendu : table à ul li en mode list
       &lt;strong&gt;asp:ListView&lt;/strong&gt; : LayoutTemplate rendu optionnel
       &lt;strong&gt;asp:RadioButtonList&lt;/strong&gt; ou CheckBoxList : span par défaut, rendu par liste possible (ul li)
       &lt;strong&gt;asp:FormView&lt;/strong&gt; : RenderOuterTable&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ViewState&amp;nbsp;: nouvelle approche sur l'activation ou la désactivation&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;       &lt;strong&gt;page EnableViewState&lt;/strong&gt;="true|false"
       control &lt;strong&gt;ViewStateMode="Enabled|Disabled|Inherit"&lt;/strong&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ClientID&amp;nbsp;: &lt;strong&gt;ClientIDMode="AutoID|Inherit|Static|Predictable"&lt;/strong&gt;&amp;nbsp;: AutoID&amp;nbsp;: val par défaut, Static&amp;nbsp;: ID contrôle = ID serveur (pas de concaténation avec les noms des contrôles pères), Predictable&amp;nbsp;: pouvoir prédire un identifiant, cas d'une grille (ex ListView) avec N elts (ClientIDRowSuffix&amp;nbsp;: id du groupe)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Autres nouveautés&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;ASP.NET Chart Control&amp;nbsp;: contrôle de &lt;strong&gt;charting&lt;/strong&gt; (démo System.Web.DataVisualization) - possibilité de le binder à une source - 35 styles différents&lt;/li&gt;
&lt;li&gt;Query Extender&amp;nbsp;: &lt;strong&gt;asp:LinqDataSource&lt;/strong&gt; comme datasource&amp;nbsp;: &lt;strong&gt;asp:QueryExtender&lt;/strong&gt; qui pointe sur le linqdatasource&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;asp&lt;span style="color: #008000;"&gt;:&lt;/span&gt;QueryExtender&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;
               &lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;asp&lt;span style="color: #008000;"&gt;:&lt;/span&gt;SearchExpression DataFields&lt;span style="color: #008000;"&gt;=&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;field&amp;quot;&lt;/span&gt; SearchType&lt;span style="color: #008000;"&gt;=&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;
                      &lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;asp&lt;span style="color: #008000;"&gt;:&lt;/span&gt;ControlParameter ControlID&lt;span style="color: #008000;"&gt;=&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;TextBox1&amp;quot;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span style="color: #008000;"&gt;&amp;lt;/&lt;/span&gt;asp&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;
               &lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;asp&lt;span style="color: #008000;"&gt;:&lt;/span&gt;PropertyExpression&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;
                   &lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;asp&lt;span style="color: #008000;"&gt;:&lt;/span&gt;ControlParameter GroupID&lt;span style="color: #008000;"&gt;=&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;controlgroupid&amp;quot;&lt;/span&gt; &lt;span style="color: #008000;"&gt;/&amp;gt;&lt;/span&gt;
               &lt;span style="color: #008000;"&gt;&amp;lt;/&lt;/span&gt;asp&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;
           &lt;span style="color: #008000;"&gt;&amp;lt;/&lt;/span&gt;asp&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;autres filtres possibles&amp;nbsp;: &lt;strong&gt;RangeExpression&lt;/strong&gt;, &lt;strong&gt;orderByExpression&lt;/strong&gt;, &lt;strong&gt;ThenByExpression&lt;/strong&gt;, &lt;strong&gt;CustomExpression&lt;/strong&gt;&lt;/p&gt;


&lt;h4&gt;Tips&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;GridView :&lt;strong&gt; EnablePersistedSelection&lt;/strong&gt;&amp;nbsp;: fait persister la ligne sélectionnée lors d'une pagination&lt;/li&gt;
&lt;li&gt;&amp;lt;%: &amp;lt;script&amp;gt;Alert('toto') &amp;lt;/script&amp;gt; %&amp;gt;&amp;nbsp;: raccourci &lt;strong&gt;:&lt;/strong&gt; (2 points)&amp;nbsp;: équivalent à Server.HtmlEncode&lt;/li&gt;
&lt;li&gt;classe CSS aspNetHidden générée pour les div générées qui englobent&lt;/li&gt;
&lt;li&gt;classe CSS aspNetDisabled&amp;nbsp;: pour les controles en mode disabled&lt;/li&gt;
&lt;li&gt;classe utilitaire déportée HttpUtility&amp;nbsp;: HtmlEncode, HtmlDecode, UrlEncode, UrlDecode, plus besoin d'appeller HttpContext...&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;SEO&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Routing&amp;nbsp;: apport des friendly urls&amp;nbsp;: System.Web.Routing&amp;nbsp;: MapPageRoute("nom","chemin/{id}","~/verspage/mapage.aspx")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;fonctionnalités&amp;nbsp;: RouteValue::id, RouteUrl::id=32, RouteData.Values, RedirectoToPermanent("lab",new {id=1})&amp;nbsp;: pour générer des HTTP code 301,     Page.MetaKeywords, Page.MetaDescription&lt;/p&gt;


&lt;h3&gt;Détecter et éviter les fuites mémoires en .NET&lt;/h3&gt;


&lt;p&gt;Présentée par &lt;a href="http://blog.polom.com"&gt;Yann SCHWARTZ&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/fmarguerie"&gt;Fabrice MARGUERIE&lt;/a&gt; (de &lt;a href="http://metasapiens.com"&gt;metaSapiens&lt;/a&gt;). Session très didactique qui m'a plu car ce type d'erreurs sont souvent communes (pour l'avoir expérimenté). La session est basée sur un &lt;a href="http://www.dotnetguru.org/articles/leak/Leaks.fr.html"&gt;article&lt;/a&gt; écrit par FM sur DNG.&lt;/p&gt;


&lt;h4&gt;Les principes&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;la mémoire du processus&amp;nbsp;: la pile, le tas&lt;/li&gt;
&lt;li&gt;le Garbage Collector&amp;nbsp;: fonctionne lorsque l'objet n'est plus référencé nul part  - ce qui retient les instances (causes)&amp;nbsp;: références statiques, GCHandles (pont entre le managé et le non ménégé), Références des piles (une pile par thread), Finalization queue&lt;/li&gt;
&lt;li&gt;fuite de mémoire&amp;nbsp;: type particulier de consommation de mémoire &lt;strong&gt;non intentionnelle&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Rappel&amp;nbsp;: en .NET&amp;nbsp;: des objets accessibles par au moins une référence ne seront pas relachés par le GC&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;une goutte d'eau n'est pas un problème, mais le goutte par goutte peut amener une grosse fuite&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;


&lt;h4&gt;Les détecter&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;se concentrer sur nos classes à nous et non celles du framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Démo application PhotoLight en winforms&amp;nbsp;: ouvertures de fenêtres qui augmentent la mémoire, qui ne redescend jamais, même en forcant le GC&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;outils pour pouvoir qualifier avec des niveaux de diagnostic différents&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;  - analyseur de perfs Windows (PerfMon) : Processus, Octets privés pour l'application PhotoLight
  - vue haut niveau, audit général : &lt;a href="http://www.jetbrains.com/profiler/index.html"&gt;dotTrace&lt;/a&gt;
  - + en détail : &lt;a href="http://memprofiler.com"&gt;.NET Memory profiler&lt;/a&gt;
  - pour les explorateurs : &lt;a href="http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx"&gt;WinDbg&lt;/a&gt;&lt;/pre&gt;


&lt;p&gt;- &lt;ins&gt;&lt;strong&gt;dotTrace&lt;/strong&gt; :&lt;/ins&gt; profiling de perf ou de mémoire. Dump memory pour une photo de la mémoire par type d'objets, shortest root paths (qui tient une référence d'un objet ?).&lt;/p&gt;


&lt;p&gt;2 approches&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Approche par Namespace (Dump) pour voir nos objets applicatifs (et non ceux des assembly MS) - Merged Shortest pour remonter vers les objets qui maintiennent une référence&lt;/li&gt;
&lt;li&gt;Approche différentielle entre 2 photos mémoire (Mark)&amp;nbsp;: voir les objets qui persistent alors qu'il n'y a plus besoin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;ins&gt;&lt;strong&gt;cause dans la démo&lt;/strong&gt;&lt;/ins&gt; (ouverture d'une image, OptionsForm): abonnement à un &lt;strong&gt;évènement statique&lt;/strong&gt; InstalledFontsChanged dans la fenêtre OptionsForm de l'appli sans jamais se désabonner&amp;nbsp;: la fenêtre dans laquelle on s'est abonné à l'évènement n'est donc jamais désallouée (OptionsForm) -
&lt;strong&gt;solution&lt;/strong&gt;&amp;nbsp;: se désabonner ds le dispose&amp;nbsp;: Disposed+=InstalledFontsChanger-=method&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;- &lt;ins&gt;&lt;strong&gt;.NET Memory Profiler&lt;/strong&gt; :&lt;/ins&gt; permet d'avoir une liste de conseils, plus puissant que dotTrace mais moins &lt;em&gt;user friendly&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Profil application pour s'attacher à l'exécutable&lt;/p&gt;


&lt;p&gt;&lt;ins&gt;&lt;strong&gt;cause dans la démo&lt;/strong&gt;&lt;/ins&gt; (ouverture options de l'appli, DetailsForm)&amp;nbsp;: analyse le code et alerte - Shortest root path (chemin des références des objets) - abonnement à un évènement (non statique) de la fenêtre mère (qui vit tout le tps donc)  sans désabonnement -
&lt;strong&gt;solution&lt;/strong&gt;&amp;nbsp;: se désabonner dans la fenêtre fille à cet évènement qui pointe vers la fenêtre mère (MainForm) (Disposed-=evt)&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Cas récurrents de causes de fuites mémoire :&lt;/strong&gt; évènements et problème de fuites invisibles (ou moins détectables) car dépendances inversées&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;- &lt;ins&gt;&lt;strong&gt;WinDbg&lt;/strong&gt; :&lt;/ins&gt; installation minimale, permet d'explorer un dump mémoire&lt;/p&gt;


&lt;p&gt;Extensions&amp;nbsp;: Sos.dll&amp;nbsp;: permet d'examiner la mémoire managée, s'attacher à un process puis en ligne de commandes.&lt;/p&gt;
&lt;pre&gt;
       .cmdtree d:\cmdtree.txt
       .loadby sos mscorwks;
       .load sosex
&lt;/pre&gt;


&lt;p&gt;Exemples de commandes à connaitre&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;!DumpHeap&amp;nbsp;: liste des instances du tas&lt;/li&gt;
&lt;li&gt;!DumpObject&lt;/li&gt;
&lt;li&gt;!GCRoot&amp;nbsp;: trouve l'instance racine d'une instance (réf)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;!DumpHeap -stat (pour ordonner)&lt;/li&gt;
&lt;li&gt;!DumpHeat -stat -type PhotoLight (filtrer par type)&lt;/li&gt;
&lt;li&gt;!DumpHeat -mt idclr (colonne MT)&lt;/li&gt;
&lt;li&gt;!do idclr (do watch)&lt;/li&gt;
&lt;li&gt;!GCRoot idclr (qui maintient cette réf)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;ins&gt;&lt;strong&gt;cause dans la démo&lt;/strong&gt; :&lt;/ins&gt; menu = new ContextMenuStrip() qui crée un abonnement évènement&amp;nbsp;: dépendance cachée - &lt;strong&gt;solution&lt;/strong&gt;&amp;nbsp;: appeler menu.Dispose() explicitement ou ContextMenuStrip(this.components)&lt;/p&gt;


&lt;p&gt;- &lt;ins&gt;&lt;strong&gt;Process Explorer&lt;/strong&gt; :&lt;/ins&gt;  affiche les process .NET en jaune, puis compteur de perf de l'appli&amp;nbsp;: .NET CLR loading pour voir les objets chargés&lt;/p&gt;


&lt;p&gt;bug ds. new XmlSerializer avec le 2è para new XmlRootAttributes("settings")&amp;nbsp;: n'est plus en cache&lt;/p&gt;


&lt;h4&gt;Causes possibles des fuites mémoire&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;attention aux réf. statiques - évènements statiques&lt;/li&gt;
&lt;li&gt;évènements sans désabonnement&lt;/li&gt;
&lt;li&gt;&lt;em&gt; Dispose&lt;/em&gt; non appelé&lt;/li&gt;
&lt;li&gt;code compilé à la volée (XSLT pré-compilé) avec System.Reflection.Emit ou CodeDom&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;/pre&gt;

&lt;h4&gt;Prévenir&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;analyse statique (NDepend)&lt;/li&gt;
&lt;li&gt;chaque += est un ennemi =&amp;gt; utiliser les -=, using et Dispose, WeakEvents (réf faibles), EventBroker&lt;/li&gt;
&lt;li&gt;ou relancer l'appli par le recyclage de pool ds IIS par ex (approche pragmatique) (NB&amp;nbsp;: très utile, je peux vous le dire)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Slides et sources&lt;/h4&gt;


&lt;p&gt;Déjà &lt;a href="http://weblogs.asp.net/fmarguerie/archive/2010/02/09/techdays-2010-session-slides-and-source-code.aspx"&gt;disponibles&lt;/a&gt;, merci guys&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=tWsS0trb_ag:4dfckAZFEAk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/tWsS0trb_ag" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Techdays-2010-jour-2#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Techdays-2010-jour-2#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/329</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Techdays-2010-jour-2</feedburner:origLink></item>
    
  <item>
    <title>Techdays 2010, jour 1</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/GioSiDjKL48/</link>
    <guid isPermaLink="false">urn:md5:0a54cc12f1dec057a4d232658b2c2cff</guid>
    <pubDate>Tue, 09 Feb 2010 22:54:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>.NET</category>
        <category>techdays</category><category>techdays 2010</category>    
    <description>&lt;p&gt;Les techdays, dont c'est la 4è édition, c'est 17 000 inscrits sur les 3 jours, l'évènement technique Microsoft de l'annèe, la plus grosse en France voire en Europe.&lt;/p&gt;


&lt;p&gt;Les techdays c'est un moyen de se tenir à jour des nouveautés ou dernières tendances de Microsoft, sur la plateforme .NET ou le développement me concernant. C'est également un moment privilégié, pour nous gens du métier, ingénieurs, développeurs / codeurs, de se retrouver entre nous, sur des sujets qui nous passionnent, et peut-être également sortir d'un cadre où nous sommes &lt;a href="http://codingly.com/2008/12/29/degage-sale-programmeur/"&gt;pas toujours bien reconnus&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Quelques notes prises durant ce premier jour.&lt;/p&gt;


&lt;p&gt;Si vous avez un peu de temps, vous pourrez visionner les webcasts des techdays 2009 à &lt;a href="http://www.microsoft.com/france/vision/mstechdays09/"&gt;cette adresse&lt;/a&gt;, en attendant ceux de 2010.&lt;/p&gt;    &lt;h3&gt;Silverlight 4&amp;nbsp;: cas pratique du mode déconnecté&lt;/h3&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Présentée par Winwise (par &lt;a href="http://zied.fr"&gt;Zied&lt;/a&gt; et &lt;a href="http://blogs.developpeur.org/thadeus"&gt;Arnaud Auroux&lt;/a&gt;)&amp;nbsp;: la plus intéressante de la matinée de mon point de vue. Au delà de Silverlight et du mode déconnecté, une approche &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control"&gt;IoC&lt;/a&gt; fût abordée, via &lt;a href="http://www.codeplex.com/unity/"&gt;Unity&lt;/a&gt;, afin de changer le provider utilisé pour le CRUD selon le contexte d'utilisation (connecté / déconnecté).&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Cette approche, par interfaces, permet notamment d'éviter pas mal de mauvaises pratiques (et d'améliorer &lt;em&gt;in fine&lt;/em&gt; le développement logiciel)&amp;nbsp;: ne plus rendre monolithique un projet, améliorer sa maintenance, réutiliser certaines couches et enfin, rendre testable le projet.&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Quelques mots clés&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;IoC via Unity (qu'il faudra que je teste, versus &lt;a href="http://www.castleproject.org/container"&gt;Castle Windsor&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;mode connecté / déconnecté&amp;nbsp;: Isolated Storage, permet un stockage dans Silverlight (1 Mo ou 25 Mo en mode Out-of-Browser),&lt;/li&gt;
&lt;li&gt;pattern &lt;a href="http://en.wikipedia.org/wiki/Model_View_ViewModel"&gt;MVVM&lt;/a&gt; qui est le modèle de développement en couches d'application WPF ou Silverlight, similaire à du MVC&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/fr-fr/library/bb902854.aspx"&gt;Sync Framework&lt;/a&gt; pour synchroniser les données entre les 2 modes&amp;nbsp;: fournit des providers mais aussi la possibilité d'en implémenter un (&lt;a href="http://msdn.microsoft.com/en-us/library/dd937537(SQL.105).aspx"&gt;FullEnumerationSimpleSyncProvider&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;/pre&gt;

&lt;h3&gt;Les nouveautés de C#4&lt;/h3&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Salle pleine pour Mitsu. Pour ma part, du déjà vu aux &lt;a href="http://bit.ly/caMFCk"&gt;Microsoft days 2009&lt;/a&gt;, mais cela ne retire en rien au talent du speaker et passionné de notre langage préféré.
On trouvera les avancées suivantes&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dynamic&amp;nbsp;: avec ce nouveau type, C# fait une entrée dans les langages dynamiques. Une classe abstraite est disponible pour développer un binder&amp;nbsp;: DynamicObject&lt;/li&gt;
&lt;li&gt;paramètres optionnels et nommés&lt;/li&gt;
&lt;li&gt;co / contra-variance&amp;nbsp;: sur les interfaces, 2 nouveaux mots-clés&amp;nbsp;: out et in permet du transtypage (classe mère / fille) qui n'était possible pas avant selon le sens&lt;/li&gt;
&lt;li&gt;Expressions&amp;nbsp;: utilisation des Action rendu possible&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Entity Framework 4&lt;/h3&gt;


&lt;p&gt;Session présentée par &lt;a href="http://blogs.access-it.net" title="http://blogs.access-it.net"&gt;http://blogs.access-it.net&lt;/a&gt; et &lt;a href="http://blogs.codes-sources.com/matthieu"&gt;Matthieu MEZIL&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Evolution d'EF&amp;nbsp;: EF1&amp;nbsp;: approche bottom-up (bdd -&amp;gt; objet), EF4&amp;nbsp;: possibilité top - down (objet -&amp;gt; bdd)&lt;/p&gt;


&lt;p&gt;Quelques nouveautés EF4&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prise en compte des FK&lt;/li&gt;
&lt;li&gt;Lazy loading&lt;/li&gt;
&lt;li&gt;utilisation de POCO possible (Plain Old Clr Object)&lt;/li&gt;
&lt;li&gt;entités self-trackés (état de l'entité embarquée dans cette dernière, cas d'utilisation en WCF pour des scénarios n-tiers)&lt;/li&gt;
&lt;li&gt;CSDL (fonctions SQL)&lt;/li&gt;
&lt;li&gt;ajout de règles de validation lors d'enregistrement&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.fr/search?q=entity+framework+model+first"&gt;Model first&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Templates T4&amp;nbsp;: existe depuis Visual Studio 2005 et n'est pas propre à EF&amp;nbsp;: permet d'écrire des modèles pour générer du code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je n'ai pas été fonciérement convaincu par la future version d'Entity Framework, elle arrive péniblement au niveau de &lt;a href="http://nhforge.org"&gt;NHibernate 2.1.2&lt;/a&gt; et encore, je reste à convaincre.&lt;/p&gt;


&lt;p&gt;Le principal avantage d'EF sur NHibernate reste l'apport d'un designer pour construire son modèle, et générer ainsi les classes de mapping, ainsi qu'un provider Linq plus abouti mais la version 3.0 de NHibernate devrait combler ce "retard" (car il existe bien un provider Linq to NHibernate mais le développement n'est pas dans le &lt;em&gt;Core&lt;/em&gt; du framework, il peut souffrir de défauts).&lt;/p&gt;


&lt;h3&gt;Bing Maps&lt;/h3&gt;


&lt;p&gt;Session en anglais par &lt;a href="http://www.bing.com/community/blogs/maps/default.aspx"&gt;Chris Pendleton&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Assez bonne session avec une démo de bing maps en Silverlight où je reste toujours impressionné par le Deep Zoom, efficace et d'une mise au point terrible. L'API Bing maps est utilisable sur les différentes technos&amp;nbsp;: Silverlight control, Ajax control, services Web et MapPoint Websvc.&lt;/p&gt;


&lt;p&gt;Un site, qui apporte une réelle valeur ajoutée au développeur, permet d'avoir rapidement des exemples de codes, prêts à l'emploi,  une aide précieuse pour commencer quelques dévs.&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://microsoft.com/maps/isdk/ajax"&gt;Maps interactive SDK Ajax&lt;/a&gt; ou&lt;/li&gt;
&lt;li&gt;&lt;a href="http://microsoft.com/maps/isdk/silverlight"&gt;Maps interactive SDK Silverlight&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un site &lt;a href="http://vf4demo.idvsolutions.com"&gt;démo&lt;/a&gt; pour un affichage de statistiques sous forme de graphiques.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=GioSiDjKL48:D48zyFzIJiw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/GioSiDjKL48" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Techdays-2010-jour-1#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Techdays-2010-jour-1#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/328</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Techdays-2010-jour-1</feedburner:origLink></item>
    
  <item>
    <title>OpenID, Google, Yahoo, Orange, MyOpenID, Facebook, LiveID and me : l'authentification à moindre frais</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/rCM64KJxw2I/</link>
    <guid isPermaLink="false">urn:md5:fba11fd296e78acd79d3e78570bc64fd</guid>
    <pubDate>Thu, 28 Jan 2010 20:15:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Web[2.0]</category>
        <category>authentication</category><category>authentification</category><category>facebook</category><category>google</category><category>identification</category><category>identité</category><category>liveid</category><category>myopenid</category><category>openid</category><category>orange</category><category>yahoo</category>    
    <description>&lt;h3&gt;Préambule&lt;/h3&gt;


&lt;p&gt;J'admets&amp;nbsp;: j'ai un penchant, non pas pour la bière (quoique) mais pour les standards, protocoles et autres APIs, ouverts dans la mesure du possible.&lt;/p&gt;


&lt;p&gt;Il reste toujours préférable de respecter les standards qui sont établis par des instances du type &lt;a href="http://www.w3.org"&gt;W3C&lt;/a&gt; pour ce qui concerne le Web, &lt;a href="http://www.ietf.org"&gt;IETF&lt;/a&gt; pour tout protocole lié à Internet (TCP/IP, SMTP, ...) sous forme de RFC, ou encore les standards de fait&amp;nbsp;: développé par une société qui l'a libéré afin qu'il soit adopté par la suite par le plus grand nombre, souvent sous forme d'une fondation (qui regroupe un consortium de sociétés / d'organismes).&lt;/p&gt;    &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4063/4236969597_52de51f73e.jpg" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;Je me suis intéressé dernièrement à &lt;strong&gt;OpenID&lt;/strong&gt;, standard ouvert d'authentification, &lt;a href="http://fr.wikipedia.org/wiki/OpenID"&gt;Wikipédia&lt;/a&gt; définit très bien ce protocole et standard ouvert&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt; OpenID est un système d’authentification décentralisé qui permet l’authentification unique, ainsi que le partage d’attributs. Il permet à un utilisateur de s’authentifier auprès de plusieurs sites (devant prendre en charge cette technologie) sans avoir à retenir un identifiant pour chacun d’eux mais en utilisant à chaque fois un unique identifiant OpenID&lt;/pre&gt;


&lt;p&gt;La fondation &lt;a href="http://openid.net"&gt;OpenID&lt;/a&gt; regroupe les grands acteurs du Web (Google, MS, FB, ...une &lt;a href="http://openid.net/foundation/sponsoring-members/"&gt;belle liste&lt;/a&gt;), avec l'objectif que ce standard soit utilisé et déployé vers le plus grand nombre de sites.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;OpenID&lt;/strong&gt; prend également part à OpenStack, pile de standards pour le Web (&lt;a href="http://openid.net"&gt;OpenID&lt;/a&gt;, &lt;a href="http://oauth.net"&gt;OAuth&lt;/a&gt;, &lt;a href="http://www.opensocial.org/"&gt;OpenSocial&lt;/a&gt; ou sur &lt;a href="http://code.google.com/intl/fr-FR/apis/opensocial/"&gt;Google code OpenSocial&lt;/a&gt;, &lt;a href="http://xrds-simple.net"&gt;XRDS-Simple&lt;/a&gt;&amp;nbsp;: utilisé par OpenID ou OAuth, pour la découverte dynamique de services, PortableContacts), qui se schématise par l'image suivante&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3075/2869986857_3a22ababf7.jpg" alt="" /&gt;&lt;/p&gt;


&lt;h3&gt;La base d'OpenID&amp;nbsp;: l'URL&lt;/h3&gt;


&lt;h2&gt;l'adresse Web du fournisseur OpenID&amp;nbsp;: sa carte de visite&lt;/h2&gt;


&lt;p&gt;Dans sa version 1.x, le protocole est basé sur une URL qui représente l'identité de l'utilisateur. Parmi les fournisseurs OpenID, nous trouvons parmi le plus connu &lt;a href="http://www.myopenid.com"&gt;MyOpenID&lt;/a&gt;, mais on pourrait citer également &lt;a href="http://claimid.com"&gt;ClaimID&lt;/a&gt;, &lt;a href="http://myid.is/"&gt;MyID.is&lt;/a&gt;, &lt;a href="http://www.ziki.com"&gt;Ziki&lt;/a&gt;, &lt;a href="https://pip.verisignlabs.com/"&gt;Verisign&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;On voit souvent le champ suivant avec le logo représentatif d'OpenID qui spécifie que le site prend en charge ce standard&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.Screenshot_-_26_01_2010___22_36_40_m.jpg" alt="openid-field" style="display:block; margin:0 auto;" title="openid-field, janv. 2010" /&gt;&lt;/p&gt;


&lt;p&gt;L'avantage d'une URL est qu'elle peut être utilisée aussi comme une carte d'identité&amp;nbsp;: les URL suivantes représentent mon identité ou du moins ma carte de visite, voire ma carte sociale (au sens réseau)&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://zorky.myopenid.com"&gt;http://zorky.myopenid.com&lt;/a&gt;&amp;nbsp;: en plus d'informations telles qu'email, localisation, MyOpenID fournit également une &lt;strong&gt;&lt;a href="http://fr.wikipedia.org/wiki/VCard"&gt;vCard&lt;/a&gt;&lt;/strong&gt; pour importer directement ses informations sous Outlook par exemple,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/profiles/zorky00"&gt;http://www.google.com/profiles/zorky00&lt;/a&gt; Google profiles, sous sa forme URL&amp;nbsp;:  permet une personnalisation de ses différents réseaux sociaux ou sites/blogs, ainsi que sa localisation,  photos Flickr, mini-CV,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ziki.com/zorky"&gt;http://www.ziki.com/zorky&lt;/a&gt;&amp;nbsp;: le plus abouti avec Google mais ne semble pas fonctionner sur tous les sites,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zorky.pip.verisignlabs.com"&gt;http://zorky.pip.verisignlabs.com&lt;/a&gt;&amp;nbsp;: Verisign offre une grande marge de personnalisation de sa carte de visite OpenID, et de télécharger sa &lt;a href="http://fr.wikipedia.org/wiki/Windows_CardSpace"&gt;CardSpace&lt;/a&gt; (uniquement sous Windows). Verisign fournit une extension Firefox pour remplir et s'authentifier automatiquement par son URL,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://myid.is/olivier.duval.id"&gt;http://myid.is/olivier.duval.id&lt;/a&gt;&amp;nbsp;: simple, certifie vos sites/blogs,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://claimid.com/zorky"&gt;http://claimid.com/zorky&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;la délégation d'URL&lt;/h2&gt;


&lt;p&gt;Lorsque l'on a un domaine Internet et un ou plusieurs sites, ces derniers servent aussi de carte de visite. OpenID autorise la délégation d'authentification à l'aide d'un jeu de balises &lt;strong&gt;link&lt;/strong&gt; dans une page HTML.&lt;/p&gt;


&lt;p&gt;Par exemple mon site portail &lt;strong&gt;&lt;a href="http://olivier-duval.info"&gt;http://olivier-duval.info&lt;/a&gt;&lt;/strong&gt; contient les balises suivantes qui font référence à mon compte MyOpenID (&lt;strong&gt;zorky.myopenid.com&lt;/strong&gt;)&amp;nbsp;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;openid.server&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;https://www.myopenid.com/server &amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;openid.delegate&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://zorky.myopenid.com &amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;openid2.provider&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://www.myopenid.com/server &amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;openid2.local_id&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://zorky.myopenid.com &amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;ces balises dans la section &lt;strong&gt;head&lt;/strong&gt; de la page d'accueil auront pour effet que je puisse utiliser &lt;strong&gt;olivier-duval.info&lt;/strong&gt; comme adresse / identifiant OpenID sur les sites qui proposent l'authentification OpenID (principale ou en alternative), pratique&amp;nbsp;: j'expose ma carte de visite en même temps que la possibilité de m'authentifier.&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/openiduri.jpg" alt="OpenID-URI" style="display:block; margin:0 auto;" title="OpenID-URI, janv. 2010" /&gt;&lt;/p&gt;


&lt;h3&gt;le challenge&amp;nbsp;: améliorer l'expérience utilisateur OpenID (OpenID UX)&lt;/h3&gt;


&lt;h2&gt;OpenID 2.0 et la fonctionnalité Directed identity&lt;/h2&gt;


&lt;p&gt;OpenID 2.0 a apporté notamment les nouveautés suivantes (on pourra lire &lt;a href="http://blogs.gnome.org/jamesh/2007/10/23/openid-20/"&gt;cet article&lt;/a&gt; sur la v2.0)&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;directed identity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;attribute exchange extension (AX)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La 1ère était pour &lt;strong&gt;Google&lt;/strong&gt; et &lt;strong&gt;Yahoo&lt;/strong&gt;, la condition au passage à OpenID, la &lt;em&gt;killer-feature&lt;/em&gt; et cela en est bien une.&lt;/p&gt;


&lt;p&gt;Avec &lt;strong&gt;OpenID 1.1&lt;/strong&gt;, l'utilisateur s'identifie grâce à une URL, où l'identifiant utilisateur est embarqué dans cette dernière, comme nous l'avons vu précédemment (dans mon cas&amp;nbsp;: http://olivier-duval.info ou http://&lt;strong&gt;zorky&lt;/strong&gt;.myopenid.com). Pour le commun des mortels, cette approche peut paraitre perturbante&amp;nbsp;: saisie d'une URL puis une authentification par login et mot de passe.&lt;/p&gt;


&lt;p&gt;Avec &lt;strong&gt;OpenID 2.0&lt;/strong&gt;, on ne précise plus l'URL utilisateur, seule l'adresse du provider suffit (en langage technique l'OpenID &lt;em&gt;end-point&lt;/em&gt;)&amp;nbsp;: l'application fournit l'URL du provider (le paramètre
&lt;strong&gt;openid.claimed_id&lt;/strong&gt; envoyé au fournisseur contiendra alors la valeur &lt;strong&gt;http://specs.openid.net/auth/2.0/identifier_select&lt;/strong&gt; au lieu de l'URL OpenID utilisateur) qui se chargera d'authentifier l'utilisateur (par login/mot de passe), le provider répondra à l'application cliente en lui fournissant l'URL OpenID de l'utilisateur.&lt;/p&gt;


&lt;p&gt;Concrétement, cela permet le développement de &lt;strong&gt;widgets&lt;/strong&gt; contenant des icônes cliquables (&lt;a href="http://blog.olivier-duval.info/?post/RPXnow-OpenID-ou-la-federation-des-protocoles-d-authentifications"&gt;RPX&lt;/a&gt; l'a compris depuis longtemps), que nous voyons de plus en plus sur les sites&amp;nbsp;: cela améliore l'expérience utilisateur (OpenID UX), par une approche plus simple sous forme d'un clic sur une image plutôt qu'une saisie d'URL.&lt;/p&gt;


&lt;p&gt;On pourra alors trouver ce type de bannières où d'un clic l'utilisateur est redirigé vers le fournisseur de son choix&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/banniere-openid-1.png" alt="banniere-openid-1.png" style="display:block; margin:0 auto;" title="banniere-openid-1.png, janv. 2010" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/banniere-openid-2.png" alt="banniere-openid-2.png" style="display:block; margin:0 auto;" title="banniere-openid-2.png, janv. 2010" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.banniere-openid-3_m.jpg" alt="banniere-openid-3.png" style="display:block; margin:0 auto;" title="banniere-openid-3.png, janv. 2010" /&gt;&lt;/p&gt;


&lt;p&gt;des librairies jQuery commencent à naitre&amp;nbsp;: sur &lt;a href="http://jvance.com/pages/JQueryOpenIDPlugin.xhtml"&gt;jVance.com&lt;/a&gt;, &lt;a href="http://code.google.com/p/openid-selector/"&gt;OpenID-selector&lt;/a&gt;, ou en développer une spécifique pour intégrer &lt;strong&gt;Orange&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;Quels fournisseurs&amp;nbsp;?&lt;/h2&gt;


&lt;p&gt;Tous les fournisseurs OpenID n'implémentent pas tous OpenID 2.0 et la fonction directed identity. Parmi les fournisseurs qui ont adopté la spécification OpenID 2.0 (avec le directed identity) et leur &lt;em&gt;end-point&lt;/em&gt; (URL) d'accès, sont nominés (tous ont été testés)&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google&lt;/strong&gt;&amp;nbsp;: &lt;strong&gt;https://www.google.com/accounts/o8/id&lt;/strong&gt; (par l'utilisation d'une requête XRDS pour l'obtention du end-point réel pour la redirection OpenID, cf. l'&lt;a href="http://code.google.com/intl/fr/apis/accounts/docs/OpenID.html#endpoint"&gt;API Google OpenID&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yahoo&lt;/strong&gt;&amp;nbsp;: &lt;strong&gt;http://me.yahoo.com&lt;/strong&gt; - option&amp;nbsp;: peut nécessiter la mise en place d'un fichier XRDS pour retirer le message d'avertissement sur le site demandeur  (non "vérifié" par défaut, cf. cette &lt;a href="http://stackoverflow.com/questions/781102/open-id-xrds-discovery"&gt;intéressante question&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flickr&lt;/strong&gt; (appartient à Yahoo)&amp;nbsp;: &lt;strong&gt;http://www.flickr.com&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orange&lt;/strong&gt;&amp;nbsp;: &lt;strong&gt;http://openid.orange.fr&lt;/strong&gt; (http://orange.fr devrait également fonctionner),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MyOpenID&lt;/strong&gt;&amp;nbsp;: &lt;strong&gt;http://www.myopenid.com&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verisign&lt;/strong&gt;&amp;nbsp;: &lt;strong&gt;https://pip.verisignlabs.com&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySpace&lt;/strong&gt;&amp;nbsp;: &lt;strong&gt;http://www.myspace.com&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sur le blog de JanRain (RPX), il est intéressant de constater que sur 173 000 sites qui utilisent leur widget, 37,4 % des utilisateurs préférent Google (&lt;a href="http://blog.janrain.com/2010/01/social-media-industry-trends.html"&gt;source&lt;/a&gt;)&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/provider-pie_chart.JPG" alt="openid-rpx-pie-chart" style="display:block; margin:0 auto;" title="openid-rpx-pie-chart, janv. 2010" /&gt;&lt;/p&gt;


&lt;h2&gt;Avantage et intérêt&amp;nbsp;?&lt;/h2&gt;


&lt;p&gt;Personnellement je suis constamment connecté sur mon compte &lt;strong&gt;Google&lt;/strong&gt;, pour lire mes mails, mes flux, mon calendrier, voire éditer des fichiers. Lorsque je vais sur un site qui accepte Google comme authentification OpenID, il suffit d'un clic pour y accéder car je suis déjà connecté sur Google, doublement pratique&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;je ne retiens et ne conserve qu'un login (mon email) / mot de passe, ma connexion est facilitée et rapide car j'ai un usage important des services Google (cela pourrait en être autant avec Yahoo, MySpace ou Orange).&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Concernant Google, une partie de l'URL renvoyée à l'application cliente (&lt;strong&gt;RP&amp;nbsp;: Relying Party&lt;/strong&gt;) est hashée sur le domaine appelant et diffère donc selon l'application qui effectue la demande d'authentification.&lt;/p&gt;


&lt;p&gt;Par exemple, si je teste mon authentification Google sur mon &lt;a href="http://olivier-duval.info/essais/rpxnow.php"&gt;essai RPX&lt;/a&gt;, j'obtiens comme identifiant OpenID w&lt;strong&gt;ww.google.com/accounts/o8/id?id=XXXXwkvXsnU5vv4V7ECA7MVcqx4cz1GdQJ-yUA&lt;/strong&gt; , par Stackoverflow, un autre identifiant &lt;strong&gt;www.google.com/accounts/o8/id?id=XXXXkyhuj2bdptserwktuerhwtotmxwtztguo&lt;/strong&gt;, différent donc. Cela peut être gênant d'unifier le "login" utilisateur Google pour plusieurs applications Web (ie&amp;nbsp;: sur des domaines différents). Google calcule le hash contenu dans l'URL retournée selon le paramètre &lt;strong&gt;openid.realm&lt;/strong&gt; (qui contient le domaine / hôte RP qui effectue la requête OpenID), c'est très bien expliqué à la section &lt;a href="http://code.google.com/intl/fr/apis/accounts/docs/OpenID.html#Response"&gt;Request authentication response&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Internautes&amp;nbsp;: quelle utilisation&amp;nbsp;? Directed Identity ou par URL&amp;nbsp;?&lt;/h3&gt;


&lt;p&gt;Lorsque le site ne propose pas une authentification Google, j'utilise mon adresse &lt;strong&gt;http://olivier-duval.info&lt;/strong&gt;, mais de plus en plus de sites proposent Google ou Yahoo comme authentification principale. On pourra citer &lt;a href="http://stackoverflow.com"&gt;StackOverflow&lt;/a&gt; (et ses avatars&amp;nbsp;: http://serverfault.com http://superuser.com , ça manque de SSO dans ce cas d'ailleurs), &lt;a href="http://www.diigo.com"&gt;Diigo&lt;/a&gt;, &lt;a href="https://uservoice.com/"&gt;UserVoices&lt;/a&gt;,  &lt;a href="http://www.plaxo.com"&gt;Plaxo&lt;/a&gt;, &lt;a href="http://www.friendfeed.com"&gt;FriendFeed&lt;/a&gt; - soit ils proposent 1 seule identité, soit N identités alternatives (1 compte local + n comptes OpenID du type Google, Yahoo, ...)&amp;nbsp;: on nous donne la liberté de choix, et j'aime cette démarche.&lt;/p&gt;


&lt;p&gt;Convenons que pour l'utilisateur lambda, il est plus simple d'utiliser des icônes qu'une URL, moins long aussi à saisir.&lt;/p&gt;


&lt;h3&gt;Sites qui gèrent des comptes: compte local ou alternatives avec OpenID&amp;nbsp;?&lt;/h3&gt;


&lt;p&gt;Des sites ont choisi de n'avoir que des comptes externes (par exemple &lt;a href="http://stackoverflow.com"&gt;Stackoverflow&lt;/a&gt;), tout en proposant un 2è compte OpenID pour se connecter (si le 1er fournisseur venait à tomber par exemple).&lt;/p&gt;


&lt;p&gt;D'autres, &lt;a href="http://diigo.com"&gt;Diigo&lt;/a&gt; (possibilité d'autant de comptes supplémentaires que l'on souhaite), &lt;a href="http://basecamphq.com"&gt;BaseCamp&lt;/a&gt; (1 seul OpenID), &lt;a href="http://www.plaxo.com"&gt;Plaxo&lt;/a&gt;, &lt;a href="http://facebook.com"&gt;Facebook&lt;/a&gt; (autant que l'on souhaite), ...ont choisi OpenID comme compte alternatif au compte local créé lors de son inscription.&lt;/p&gt;


&lt;p&gt;Le 1er est le plus risqué, il faut au moins proposer la possibilité d'enregistrer un 2è compte OpenID, car nous restons tributaires du fournisseur OpenID (Google, Yahoo, ...), le compte local, lui, fonctionnera (presque) toujours.&lt;/p&gt;


&lt;h3&gt;aide à la pré-inscription&lt;/h3&gt;


&lt;p&gt;Un autre usage d'OpenID peut concerner la pré-inscription. Lors de la connexion avec son compte Google, le site RP / demandeur peut solliciter des champs de retour, du type l'email, le nom, etc. Cet échange est décrit dans la spécification &lt;a href="http://openid.net/specs/openid-simple-registration-extension-1_0.html"&gt;OpenID SREG&lt;/a&gt; qui inclut une liste finie de champs. Dans ce cas là, on pourrait pré-remplir quelques informations sur le futur abonné au site. Un &lt;a href="http://www.mediassociaux.com/2010/01/26/astuce-utiliser-facebook-connect-pour-de-la-pre-inscription/"&gt;billet sur le sujet&lt;/a&gt; (par FB Connect ou Twitter mais l'idée reste la même).&lt;/p&gt;


&lt;p&gt;A titre d'information, on pourrait aller bien plus loin dans l'échange d'attributs entre un site client et un provider, en se basant sur OpenID 2.0 et la spécification &lt;a href="http://openid.net/specs/openid-attribute-exchange-1_0-08.html"&gt;OpenID Attribute Exchange&lt;/a&gt; (cf. &lt;a href="http://blogs.gnome.org/jamesh/2007/11/26/openid-ax/"&gt;ce billet&lt;/a&gt; sur le sujet).&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/fb-liveid-openid.png" alt="fb-liveid-openid.png" style="display:block; margin:0 auto;" title="fb-liveid-openid.png, janv. 2010" /&gt;&lt;/p&gt;


&lt;h3&gt;et les autres fournisseurs&amp;nbsp;: Facebook, Microsoft (LiveID)&amp;nbsp;?&lt;/h3&gt;


&lt;h2&gt;Facebook&lt;/h2&gt;


&lt;p&gt;Facebook a pris la voie d'un protocole propriétaire pour l'authentification&amp;nbsp;: &lt;a href="http://developers.facebook.com/connect.php"&gt;Facebook Connect&lt;/a&gt;. Malheureusement je dirais, car cela ne couterait pas très cher de passer à OpenID en tant que fournisseur (OpenID Provider / OP), et tellement appréciable. J'espère que Facebook deviendra un jour OP avec la fonctionnalité &lt;strong&gt;directed identity&lt;/strong&gt;, cela éviterait d'implémenter un protocole supplémentaire.&lt;/p&gt;


&lt;p&gt;En revanche, FB (ayant rejoint la fondation OpenID) autorise le RP (Relying Party) en ... mode automatique&amp;nbsp;: il suffit de lier son compte Facebook avec ses différents fournisseurs OpenID, et dès que vous accéderez à la page d'accueil &lt;a href="http://www.facebook.com"&gt;http://www.facebook.com&lt;/a&gt; , si vous êtes déjà connectés (sur Google par exemple) vous serez automatiquement authentifier à Facebook, pas mal pour le coup, riche idée j'ai trouvé. FB stocke tout ce p'tit monde dans un cookie (&lt;strong&gt;openid_p&lt;/strong&gt;), cela n'est valable donc uniquement sur le poste courant, à moins de s'être au moins connecté 1 fois sur FB sur le poste afin qu'il puisse positionner le cookie.&lt;/p&gt;


&lt;p&gt;Pour cela, il suffit d'aller dans &lt;strong&gt;Paramètres &amp;gt; Compte &amp;gt; Comptes liés&lt;/strong&gt;. L'idée est séduisante, sans compter l'ergonomie de sélection du fournisseur que je trouve particulièrement réussie (pour la reprendre à mon compte d'ailleurs)&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.facebook-rp-openid_m.jpg" alt="facebook-rp-openid.png" style="display:block; margin:0 auto;" title="facebook-rp-openid.png, janv. 2010" /&gt;&lt;/p&gt;



&lt;h2&gt;Microsoft / LiveID&lt;/h2&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Microsoft qui a adhéré à la fondation, a entrepris (en Community Tech Preview) le passage des comptes LiveID en OpenID. Aux dernières nouvelles, ce n'était pas actif sur les vrais comptes LiveID, mais toujours en test (cf. le &lt;a href="https://login.live-int.com/beta/ManageOpenID.srf) , nouvelle qui date d&amp;#039;[août 2009"&gt;site de test&lt;/a&gt;, pas de nouvelle, bonne nouvelle&amp;nbsp;? 500 millions de comptes sont concernés, il serait dommage de ne pas en profiter un jour).&lt;/p&gt;


&lt;p&gt;Mais selon la newsletter de la fondation, il y a un bon espoir&amp;nbsp;: cf. la partie &lt;a href="http://openid.net/2009/12/16/openid-2009-year-in-review/"&gt;OP Progress&lt;/a&gt;&amp;nbsp;: "Microsoft committed to becoming an OpenID Provider in 2010"&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;h3&gt;librairies&lt;/h3&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Quelques librairies pour nous codeurs&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java&amp;nbsp;: &lt;a href="http://code.google.com/p/openid4java/"&gt;open4java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://openidenabled.com/php-openid/"&gt;PHP&lt;/a&gt; , &lt;a href="http://openidenabled.com/ruby-openid/"&gt;Ruby&lt;/a&gt; ou &lt;a href="http://openidenabled.com/python-openid/"&gt;Python&lt;/a&gt; édités par RPX&lt;/li&gt;
&lt;li&gt;plus &lt;a href="http://wiki.openid.net//Libraries"&gt;ici&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;et je finirais par &lt;strong&gt;.NET&lt;/strong&gt;&amp;nbsp;: l'excellente librairie &lt;strong&gt;DNOA&lt;/strong&gt; (il y a également ExtremeSwank mais déconseillée car la version RP est compromise et n'est plus maintenue) qui implémente totalement les spécifications d'OpenID v2.0, contrairement à ces concurrents&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;le &lt;a href="http://dotnetopenauth.net/"&gt;site officiel DotNetOpenAuth&lt;/a&gt;&amp;nbsp;: OpenID 1x et 2.0, RP et provider, &lt;a href="http://www.axschema.org"&gt;AX&lt;/a&gt;, implémente la fonctionnalité directed identity&lt;/li&gt;
&lt;li&gt;les &lt;a href="http://code.google.com/p/dotnetopenid/"&gt;sources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;le &lt;a href="http://groups.google.com/group/dotnetopenid"&gt;groupe&lt;/a&gt;&amp;nbsp;: pour avoir posé quelques questions, le &lt;a href="http://blog.nerdbank.net"&gt;principal contributeur&lt;/a&gt; (travaille chez MS du côté de la XBox ;)) répond assez rapidement&lt;/li&gt;
&lt;li&gt;de nombreux projets exemples, soit en ASP.NET MVC, soit en ASP.NET WebForms&lt;/li&gt;
&lt;li&gt;DNOA de son petit nom,  implémente également le protocole &lt;a href="http://oauth.net"&gt;OAuth&lt;/a&gt;, API standard d'autorisations, très utilisée sous Twitter (permet d'utiliser une API par le biais de son compte mais sans laisser ses logins / mot de passe au site tiers utilisateur de l'API), et prend en compte InfoCard&lt;/li&gt;
&lt;li&gt;expérience utilisateur avec jQuery&amp;nbsp;: &lt;a href="http://openidux.dotnetopenauth.net"&gt;http://openidux.dotnetopenauth.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;N'hésitez pas pour voter des évolutions sur l'&lt;a href="http://dotnetopenauth.uservoice.com"&gt;UserVoice du projet&lt;/a&gt; (les implémentations de FB Connect ou de MS LiveID seraient un très bon début).&lt;/p&gt;


&lt;h3&gt;OpenID&amp;nbsp;: la solution miracle à l'authentification&amp;nbsp;?&lt;/h3&gt;


&lt;p&gt;Bien entendu que non. A défaut d'être parfait, cela a le mérite d'essayer de sortir un standard qui tente de répondre à un besoin classique et récurrent sur Internet&amp;nbsp;: l'inscription et l'utilisation de logins et mot de passe sur des applications ou services. Personnellement, je dois être inscrit à environ 300 sites, avec pour chacun des règles différents pour le choix du login (email, login, déjà pris, ...), mot de passe (trop court, pas assez compliqué, ...) et j'en passe.&lt;/p&gt;


&lt;p&gt;L'essayer, c'est l'adopter, d'autant plus qu'avec la fonctionnalité &lt;strong&gt;directed identity&lt;/strong&gt;, soutenue par Google, Yahoo, Orange &amp;amp; co (et bientôt AOL en 2010), l'expérience utilisateur devient bien plus simple.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=rCM64KJxw2I:_YQ4dMeRQCY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/rCM64KJxw2I" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/OpenID%2C-Google%2C-Yahoo%2C-Orange%2C-MyOpenID%2C-Facebook%2C-LiveID-and-me-%3A-l-authentification-%C3%A0-moindre-frais#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/OpenID%2C-Google%2C-Yahoo%2C-Orange%2C-MyOpenID%2C-Facebook%2C-LiveID-and-me-%3A-l-authentification-%C3%A0-moindre-frais#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/326</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/OpenID%2C-Google%2C-Yahoo%2C-Orange%2C-MyOpenID%2C-Facebook%2C-LiveID-and-me-%3A-l-authentification-%C3%A0-moindre-frais</feedburner:origLink></item>
    
  <item>
    <title>Quelques sorties 2010 : Castle Windsor, Dokuwiki, Sympa, jQuery</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/XEzp3XFnWOI/</link>
    <guid isPermaLink="false">urn:md5:58190a45a67d7e9107371f61dc554d5f</guid>
    <pubDate>Sun, 24 Jan 2010 11:33:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Opensource</category>
        <category>castle windsor</category><category>dokuwiki</category><category>ioc</category><category>jquery</category><category>sympa</category>    
    <description>&lt;p&gt;Quelques mises à jour à effectuer pour 2010&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IoC&amp;nbsp;: Castle Windsor &lt;a href="http://devlicio.us/blogs/krzysztof_kozmic/archive/2010/01/12/castle-windsor-2-1-dynamic-proxy-2-2-and-more-released.aspx"&gt;2.1.1&lt;/a&gt;&amp;nbsp;: ajout du support Silverlight, performances, ...vous avez des besoins&amp;nbsp;? n'hésitez pas à les exprimer sur &lt;a href="http://castle.uservoice.com"&gt;UserVoices&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Wiki&amp;nbsp;: bon, pas vraiment 2010 mais presque&amp;nbsp;: dokuwiki &lt;a href="http://www.splitbrain.org/projects/dokuwiki"&gt;Lemming du 2009-12-25 patch c&lt;/a&gt;&amp;nbsp;: moteur wiki que j'affectionne car il reste simple (sans base de données) et offre une extensibilité appréciable (même s'il est développé en PHP), voir les &lt;a href="http://www.dokuwiki.org/changes"&gt;changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Listes de diffusion&amp;nbsp;: Sympa &lt;a href="https://www.sympa.org/#sympa_60"&gt;version 6.x&lt;/a&gt;&amp;nbsp;: SYMPA est un serveur de listes de diffusion, doté d'un API SOAP, et d'innombrables &lt;a href="https://www.sympa.org/manual_6.0/index"&gt;fonctionnalités&lt;/a&gt;&amp;nbsp;: authent/ SSO (CAS), moteur de modèles, antispam, hautes-performances / réparti, listes dynamiques, sources de données diverses et variées (LDAP, SQL Server/..., fichiers locaux ou distants, ...) Il est maintenu (développement en Perl) par des français et utilisé de plus en plus aux US.&lt;/li&gt;
&lt;li&gt;javascript&amp;nbsp;: à moins d'avoir eu une grosse coupure Internet, si vous n'êtes pas au courant&amp;nbsp;: &lt;a href="http://www.alsacreations.com/actu/lire/939-jquery-librairie-javascript-14.html"&gt;jQuery 1.4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=XEzp3XFnWOI:76TrZgOie7Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/XEzp3XFnWOI" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Quelques-sorties-2010-Castle-Windsor-Dokuwiki-Sympa-jQuery#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Quelques-sorties-2010-Castle-Windsor-Dokuwiki-Sympa-jQuery#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/325</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Quelques-sorties-2010-Castle-Windsor-Dokuwiki-Sympa-jQuery</feedburner:origLink></item>
    
  <item>
    <title>Les 10 125 extensions Chrome à installer d'urgence</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/GD8ce-2Yj4c/</link>
    <guid isPermaLink="false">urn:md5:a9efe563bfd38c63058c9810f1598bbb</guid>
    <pubDate>Fri, 22 Jan 2010 12:30:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Web[2.0]</category>
        <category>apps</category><category>chrome</category><category>extensions</category><category>google</category>    
    <description>&lt;p&gt;La pub subliminale de Google dans les transports, journaux, arrêts de bus, ..., concernant Chrome a eu raison de mon libre arbitre, je commence à installer bon nombre d'extensions Chrome, pas 10 125, mais seulement 11 pour l'instant.&lt;/p&gt;


&lt;p&gt;Gros consommateur de services Google (aux dépends de ma liberté donc), du type GMail, Google Calendar, documents, apps, etc, Chrome reste une bonne alternative à Firefox lorsqu'on n'a pas besoin d'extensions pour du développement Web (Firebug, Firecookies, YSlow, etc), il devient alors plus léger que son concurrent.&lt;/p&gt;


&lt;p&gt;Les extensions Chrome que j'ai installées récemment, en rapport aux services Google ou non&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/mihcahmgecmbnbcchbopgniflfhgnkff"&gt;Goole Mail checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/jnmalhpnifcgaicdjnacljombhmgagin"&gt;Google reader checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/emambmpgicpidmncfacjkeicobamadod"&gt;Google Calendar Popout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd"&gt;RSS Subscription Extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/oojbgadfejifecebmdnhhkbhdjaphole"&gt;Diigo Bookmarks&lt;/a&gt;&amp;nbsp;: Diigo m'enregistre automatiquement mes favoris dans delicious, donc pas besoin d'extension pour ce dernier&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/ndhinffkekpekljifjkkkkkhopnjodja"&gt;Feedly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/iabeihobmhlgpkcgjiloemdbofjbdcic"&gt;Bit.ly&lt;/a&gt;&amp;nbsp;: le site par excellence qui vous raccourcit vos URL&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/iblijlcdoidgdpfknkckljiocdbnlagk"&gt;Goo.gl&lt;/a&gt;&amp;nbsp;: le service d'URL raccourcis de Google&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kutano.com/chrome.aspx"&gt;Kutano&lt;/a&gt;&amp;nbsp;: client Twitter&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/fhaledancjhefginmkkondfjpnkhdglh"&gt;Fittr&lt;/a&gt;&amp;nbsp;: très pratique pour Flickr&amp;nbsp;: accès facilité aux EXIF, modale pour un affichage plus grand de la photo, raccourcis http://flic.kr, vue sur fond noir&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/jnkbgncajjgjdceoajcpkndleapafeco"&gt;Tumblr&lt;/a&gt; pour les utilisateurs de Tumblr, permet de lire les blogs que l'on suit, et également de publier&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/pioclpoplcdbaefihamjohnefbikjilc"&gt;Evernote&lt;/a&gt; pour les inconditionnels comme moi de la note partout sur tout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ce qui est pas mal sous Chrome, contrairement à Firefox, c'est qu'il n'y a pas besoin de relancer le navigateur.&lt;/p&gt;


&lt;p&gt;En revanche, l'Extension Firefox, avec un grand E, qui manque à Chrome reste &lt;a href="http://ubiquity.mozilla.com/"&gt;Ubiquity&lt;/a&gt;, dur de s'en passer quand on y a goûtée.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=GD8ce-2Yj4c:9x-NkeTWq7E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/GD8ce-2Yj4c" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Les-10-125-extensions-Chrome-a-installer-d-urgence#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Les-10-125-extensions-Chrome-a-installer-d-urgence#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/324</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Les-10-125-extensions-Chrome-a-installer-d-urgence</feedburner:origLink></item>
    
  <item>
    <title>Rétrospective 2009</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/Q-EMiN1l4mo/</link>
    <guid isPermaLink="false">urn:md5:ec8a5ba497a5811da9bca3a5182f1d6b</guid>
    <pubDate>Fri, 01 Jan 2010 09:25:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Blog (attitude)</category>
        <category>2009</category><category>rétrospective</category>    
    <description>&lt;p&gt;Bonne et heureuse année 2010&amp;nbsp;! encore plus de web, de développement et de réseaux sociaux&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Cette année 2009, avec l'arrivée de ma petite &lt;a href="http://blog.olivier-duval.info/?post/Hi%2C-I-m-a..."&gt;Amélia&lt;/a&gt;, le blog fût moins riche en billets car très occupé, j'essaierai de corriger ça pour 2010, cela fera au moins une bonne résolution. Seulement 62 billets contre 130 pour l'année précédente. Comme l'&lt;a href="http://blog.olivier-duval.info/?post/Rétrospective-2008"&gt;année dernière&lt;/a&gt;, un résumé par thématiques des billets.&lt;/p&gt;    &lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2767/4216761972_ec5c60fe3a.jpg" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;du .NET&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/Linq-to-Xml-%28XLinq%29-vs.-XPath"&gt;XLinq vs. Xpath&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/find-my-dynamic-ou-l-innovation-de-C-4"&gt;méthodes find et le dynamic de C#4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/NHibernate-pagination-paging-tri-et-accessoirement-Future"&gt;NHibernate&amp;nbsp;: paginaton et tri&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/NHModeler-DSL-de-generation-de-code-a-base-d-Oslo-langage-M"&gt;NHModeler&lt;/a&gt;&amp;nbsp;: modéliser ses modèles pour générer les fichiers ad-hoc NHibernate&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/Repository-g%C3%A9n%C3%A9rique-et-IoC-avec-Castle-Windsor"&gt;IoC Castle Windsor et repository generic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/Links-13-Linq-inside"&gt;Linq inside&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;plein de liens sur &lt;a href="http://blog.olivier-duval.info/?post/Links-15-%3A-NHibernate"&gt;NHibernate&lt;/a&gt; et &lt;a href="http://blog.olivier-duval.info/?post/Links-16-%3A-NHibernate-II"&gt;ici aussi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/WCF%2C-premiers-pas"&gt;WCF, 1ers pas&lt;/a&gt; et des  &lt;a href="http://blog.olivier-duval.info/?post/Links-17-%3A-REST%2C-WCF%2C-API-GData"&gt;liens&lt;/a&gt; sur WCF / REST et GData&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JQuery, Piwik, Google, API&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jQuery et l'&lt;a href="http://blog.olivier-duval.info/?post/jQuery-autocomplete-JSON"&gt;autocompletion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google migre les comptes Feedburner, suite à son rachat, &lt;a href="http://blog.olivier-duval.info/?post/Google-et-Feedburner"&gt;essentiel pour son blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/Links-12"&gt;APIs, Mashup &amp;amp; co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;exploiter l'&lt;a href="http://blog.olivier-duval.info/?post/Piwik-et-Google-docs"&gt;API de Piwik&lt;/a&gt; avec Google docs&lt;/li&gt;
&lt;li&gt;comment être sûr et certain de &lt;a href="http://blog.olivier-duval.info/?post/Comment-%C3%AAtre-s%C3%BBr-et-certain-%28vraiment-certain%29-de-ne-plus-%C3%AAtre-index%C3%A9-%28dans-Google%29"&gt;ne plus être indexé par Google&lt;/a&gt; (et comment le faire)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/jTemplates-jQuery-et-Piwik"&gt;Piwik et jTemplates / jQuery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;du Web, limite 2.0, du système&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/Facebook-Twitter"&gt;Facebook, Twitter et moi et moi...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;avec &lt;a href="http://blog.olivier-duval.info/?post/RPXnow-OpenID-ou-la-federation-des-protocoles-d-authentifications"&gt;OpenID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;du &lt;a href="http://blog.olivier-duval.info/?post/Amazon-S3%2C-EC2"&gt;SaaS&lt;/a&gt; avec EC2&lt;/li&gt;
&lt;li&gt;des astuces pour augmenter les &lt;a href="http://blog.olivier-duval.info/?post/Optimisations-Apache-sur-un-NAS-Synology-209II-deflate-cache-expires-et-APC"&gt;performances&lt;/a&gt; de ses pages avec Apache&lt;/li&gt;
&lt;li&gt;revue du &lt;a href="http://blog.olivier-duval.info/?post/NAS-Synology-209-II"&gt;Synology 209+ II&lt;/a&gt; sur lequel le blog tourne dorénavant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;du débat&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/Forum-2.0"&gt;Forum 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.olivier-duval.info/?post/Opensource-%3A-marketing...et-argument-de-vente"&gt;XWiki&lt;/a&gt; Marketing et Opensource&amp;nbsp;: même si on est en droit de se poser des questions sur un potentiel conflit d'intérêts entre les modèles Entreprise / Communautaire de pas mal de solutions&amp;nbsp;: JBoss (RedHat), &lt;a href="http://www.helpmysql.org/fr/theissue/customerspaythebill"&gt;MySQL&lt;/a&gt; (bientôt Oracle), ...personnellement, tant qu'à utiliser de l'Opensource, je préfère que le projet soit géré par une fondation (Apache par exemple) ou qu'il n'y ait aucune société derrière, dans le cas contraire la neutralité n'y ait pas, il reste une ambiguïté. Je préfère par exemple le modèle d'&lt;a href="http://www.atlassian.com"&gt;Atlassian&lt;/a&gt; sur leurs produits, même si ce n'est pas Opensource et que l'on peut tout de même obtenir les sources, on sait à quoi on s'attend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;un &lt;a href="http://blog.olivier-duval.info/?post/sondage-codeur"&gt;sondage&lt;/a&gt; pour toi, codeur de l'extrême&amp;nbsp;: sur 142 votes, 44 % pensent qu'il faut 5 ans pour être un bon codeur, 25 % la vie n'y suffirait pas, 16 % au moins 10 ans.&lt;/p&gt;


&lt;p&gt;de la lecture avec &lt;a href="http://blog.olivier-duval.info/?post/Livre-Les-design-patterns-en-Ruby"&gt;Ruby&lt;/a&gt;, ou encore, tentons d'éviter les &lt;a href="http://blog.olivier-duval.info/?post/Livres-blancs-en-français-les-25-erreurs-de-programmation-les-plus-dangereuses-et-la-plateforme-Azure"&gt;25 erreurs de programmation les plus dangereuses&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;à la &lt;a href="http://blog.olivier-duval.info/?post/Cherche-portable...de-gamer"&gt;recherche d'un nouveau portable&lt;/a&gt;, j'ai pu investir dans un &lt;a href="http://blog.olivier-duval.info/?post/clevo-d900f-portable-gamer-i7"&gt;p'tit monstre de puissance&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Pour 2010, du Web, Web 2.0, .NET (&lt;a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;Visual Studio 2010&lt;/a&gt; / C#4, Silverlight 4), j'essaierai de participer plus aux rencontres Alt.NET ou autres petits déjeuners sur les thèmes de l'agilité, et pour le blog, je m'orienterai bien vers un thème ultra-léger, y'a plus qu'à.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=Q-EMiN1l4mo:aPtRDbyU5RI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/Q-EMiN1l4mo" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/R%C3%A9trospective-2009#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/R%C3%A9trospective-2009#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/322</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/R%C3%A9trospective-2009</feedburner:origLink></item>
    
  <item>
    <title>Optimisations Apache sur un NAS Synology 209+II : deflate, cache expires et APC</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/ictXovVTOx0/</link>
    <guid isPermaLink="false">urn:md5:514d39bb9db510ac65f067a6a19ac43a</guid>
    <pubDate>Sun, 20 Dec 2009 15:43:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Web[2.0]</category>
        <category>apache</category><category>apc</category><category>deflate</category><category>expires</category><category>synology</category>    
    <description>&lt;h3&gt;Préambule&lt;/h3&gt;


&lt;p&gt;Avec l'arrivée de mon nouveau &lt;a href="http://blog.olivier-duval.info/?post/NAS-Synology-209-II"&gt;NAS 209+II&lt;/a&gt;, bien qu'il soit plus véloce en termes de CPU et de mémoire, il fallait tout de même optimiser les flux, étant hébergé chez soi , la bande passante n'équivaut pas à un hébergement chez un fournisseur. Aussi, j'ai dû optimiser un minimum le serveur Apache afin d'héberger le blog, pour réduire la quantité de données entre le navigateur des visiteurs et le serveur, cela se révèle important malgré tout&amp;nbsp;: au bout de 4 secondes, un visiteur s'en ira.&lt;/p&gt;    &lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/209.jpg" alt="syno-209" style="display:block; margin:0 auto;" title="syno-209, janv. 2010" /&gt;&lt;/p&gt;


&lt;p&gt;Des plugins Firefox permettent d'analyser une page afin d'avoir des conseils et des actions à entreprendre&amp;nbsp;: je suis parti sur &lt;a href="http://code.google.com/intl/fr/speed/page-speed/"&gt;PageSpeed&lt;/a&gt;, qui offre, en plus du diagnostic habituel et des conseils, des solutions concrètes, applicables immédiatement&amp;nbsp;: les CSS, JS, et images réduites / compressés, que l'on pourra prendre directement afin de les placer sur le serveur.&lt;/p&gt;


&lt;h3&gt;Apache sur un NAS 209+II&lt;/h3&gt;


&lt;p&gt;Un mot très important lorsqu'on développe une application Web&amp;nbsp;: le &lt;strong&gt;cache&lt;/strong&gt;, sans cache, vous courrez à la catastrophe. Le moteur Dotclear intègre en natif un cache applicatif mais cela ne suffit pas, Apache offre quelques modules qui permettent d'aller plus loin.&lt;/p&gt;


&lt;h4&gt;APC&lt;/h4&gt;


&lt;p&gt;Sur le Synology, il intègre la possibilité d'activer &lt;a href="http://php.net/manual/fr/book.apc.php"&gt;APC&lt;/a&gt;, qui est un cache PHP qui permet de précompiler le code, pour gagner quelques &lt;em&gt;ms&lt;/em&gt;, à activer bien entendu.&lt;/p&gt;


&lt;h4&gt;deflate&lt;/h4&gt;


&lt;p&gt;Le module &lt;strong&gt;mod_deflate&lt;/strong&gt; sert à compresser le flux entre le serveur et le navigateur, cela fera donc travailler un peu plus le poste client. A l'approche des fêtes, comme on va tous en changer, pour avoir des machines de guerres, je ne suis pas trop inquiet &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt; La configuration ci-après est transposable vers n'importe quel Apache d'autres distribution (Debian, etc...).&lt;/p&gt;


&lt;p&gt;Sur le Synology, la configuration Apache utilisateur (il y a aussi une configuration propre à la partie administration, sur le port 5000 du DSM) se trouve dans le fichier &lt;strong&gt;/usr/syno/apache/conf/httpd.conf-user&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Exemple de configuration pour activer le module deflate, sur le HTML, XML, JS, CSS ou le TEXTE, il suffira de relancer Apache (&lt;strong&gt;/usr/syno/etc/rc.d/S97apache-user.sh restart&lt;/strong&gt;) pour voir le résultat&amp;nbsp;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;LoadModule deflate_module modules/mod_deflate.so
&amp;nbsp;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;IfModule&lt;/span&gt; mod_deflate.c&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        DeflateCompressionLevel 2
&amp;nbsp;
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css application/javascript
        SetOutputFilter DEFLATE
        Header append Vary User-Agent env=!dont-vary
&amp;nbsp;
        AddOutputFilter DEFLATE js css
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.[0678] no-gzip
        BrowserMatch \bMSIE\s7  !no-gzip !gzip-only-text/html
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/IfModule&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;afin de s'assurer que cela fonctionne (c'est mieux), on pourra tracer la compression qu'effectue deflate en ajoutant dans le IfModule cette partie&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
DeflateFilterNote Input input_info
        DeflateFilterNote Output output_info
        DeflateFilterNote Ratio ratio_info
        LogFormat '&amp;quot;%r&amp;quot; %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
        CustomLog /var/log/apache_deflate_log deflate
&lt;/pre&gt;


&lt;p&gt;On aura alors accès à la trace du fichier &lt;strong&gt;/var/log/apache_deflate_log deflate&lt;/strong&gt; . Un extrait des résultats sur le billet qui concerne &lt;a href="http://blog.olivier-duval.info/?post/clevo-d900f-portable-gamer-i7"&gt;Thor&lt;/a&gt; (mon petit portable), les chiffres de la fin X/Y (Z%) signifient&amp;nbsp;: X&amp;nbsp;: quantité après compression, Y&amp;nbsp;: quantité avant, Z&amp;nbsp;: taux de compression&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
&amp;quot;GET /?post/clevo-d900f-portable-gamer-i7 HTTP/1.1&amp;quot; 10601/31625 (33%)
&amp;quot;GET /themes/graylvetica/style.css HTTP/1.1&amp;quot; 3130/10115 (30%)
&amp;quot;GET /themes/default/print.css HTTP/1.1&amp;quot; 532/993 (53%)
&amp;quot;GET /themes/default/js/jquery.js HTTP/1.1&amp;quot; 24420/73690 (33%)
&amp;quot;GET /themes/default/js/jquery.cookie.js HTTP/1.1&amp;quot; 458/994 (46%)
&amp;quot;GET /themes/default/js/post.js HTTP/1.1&amp;quot; 450/1133 (39%)
&amp;quot;GET /?pf=dclightbox/style/css/dclightbox.css HTTP/1.1&amp;quot; 812/1996 (40%)
&amp;quot;GET /?pf=dclightbox/style/js/prototype.js HTTP/1.1&amp;quot; 12559/47603 (26%)
&amp;quot;GET /?pf=dclightbox/style/js/scriptaculous.js&amp;amp;load=effects HTTP/1.1&amp;quot; 1182/2152 (54%)
&amp;quot;GET /?pf=dclightbox/style/js/effects.js HTTP/1.1&amp;quot; 8051/31969 (25%)
&amp;quot;GET /?pf=dclightbox/style/js/lightbox.js HTTP/1.1&amp;quot; 5792/20044 (28%)
&amp;quot;GET /?pf=lightbox/css/modal.css HTTP/1.1&amp;quot; 304/753 (40%)
&amp;quot;GET /public/d900f/IMG_9694_DxO_raw_copy-th.jpg HTTP/1.1&amp;quot; 10943/11147 (98%)
&amp;quot;GET /public/d900f/IMG_9699_DxO_raw_copy-th.jpg HTTP/1.1&amp;quot; 11183/11368 (98%)
&lt;/pre&gt;


&lt;p&gt;sympa, non&amp;nbsp;? on pourra jouer sur l'option &lt;strong&gt;DeflateCompressionLevel&lt;/strong&gt; pour varier le taux de compression (1&amp;nbsp;: basse, 9&amp;nbsp;: la plus haute), le niveau le plus haut demandera plus de travail de la part du CPU côté poste client.&lt;/p&gt;


&lt;h4&gt;expires&lt;/h4&gt;


&lt;p&gt;Le module expires agira sur les entêtes HTTP en indiquant une date d'expiration (que le navigateur interprétera) sur l'élément à transférer, que la navigateur gardera ou non dans son cache.&lt;/p&gt;


&lt;p&gt;Tout comme le deflate, se configure dans le &lt;em&gt;httpd.conf-user&lt;/em&gt;, exemple de configuration (voir la &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html"&gt;page d'Apache 2&lt;/a&gt; pour les précisions):&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;LoadModule expires_module modules/mod_expires.so
&amp;nbsp;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;IfModule&lt;/span&gt; mod_expires.c&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
ExpiresActive on
ExpiresDefault &amp;quot;access plus 2 minutes&amp;quot;
ExpiresByType text/html &amp;quot;access plus 120 seconds&amp;quot;
ExpiresByType text/css &amp;quot;access plus 1 month&amp;quot;
ExpiresByType text/javascript &amp;quot;access plus 1 month&amp;quot;
ExpiresByType application/x-javascript &amp;quot;access plus 1 month&amp;quot;
ExpiresByType application/javascript &amp;quot;access plus 1 month&amp;quot;
ExpiresByType image/gif &amp;quot;access plus 1 months&amp;quot;
ExpiresByType image/jpeg &amp;quot;access plus 1 months&amp;quot;
ExpiresByType image/png &amp;quot;access plus 1 months&amp;quot;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/IfModule&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Testons si cela est bien pris en compte, sur l'accès à une image&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;sans mod_expires&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ wget -S http://blog.olivier-duval.info/public/model-nhmodeler.png

  HTTP/1.1 200 OK
  Date: Sat, 19 Dec 2009 14:26:02 GMT
  Server: Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8k PHP/5.2.10
  Last-Modified: Wed, 07 Oct 2009 20:40:14 GMT
  ETag: &amp;quot;319008f-3e3a-4755e5a960780&amp;quot;
  Accept-Ranges: bytes
  Content-Length: 15930
  Vary: Accept-Encoding,User-Agent
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: image/png
Length: 15930 (16K) [image/png]

&lt;/pre&gt;


&lt;p&gt;avec, on aura 2 entêtes supplémenaires&amp;nbsp;: &lt;strong&gt;Cache-Control:&lt;/strong&gt; et &lt;strong&gt;Expires:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
$ wget -S http://blog.olivier-duval.info/public/model-nhmodeler.png

  HTTP/1.1 200 OK
  Date: Sat, 19 Dec 2009 14:24:14 GMT
  Server: Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8k PHP/5.2.10
  Last-Modified: Wed, 07 Oct 2009 20:40:14 GMT
  ETag: &amp;quot;319008f-3e3a-4755e5a960780&amp;quot;
  Accept-Ranges: bytes
  Content-Length: 15930
  Cache-Control: max-age=2592000
  Expires: Mon, 18 Jan 2010 14:24:14 GMT
  Vary: Accept-Encoding,User-Agent
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: image/png
Length: 15930 (16K) [image/png]

&lt;/pre&gt;


&lt;p&gt;bien entendu cette technique est valable si le visiteur revient sur la page, cela reste utile pour les éléments partagés.&lt;/p&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;


&lt;p&gt;Avec quelques modules, on pourra optimiser un petit serveur afin qu'il réponde au mieux aux requêtes, afin de contrebalancer des ressources légères, même s'il reste encore un peu de travail à faire, en enlevant tout élément inutile.&lt;/p&gt;


&lt;p&gt;Une analyse avec &lt;a href="http://developer.yahoo.com/yslow"&gt;YSlow&lt;/a&gt; m'annonce un passage d'une note F à D, objectif, atteindre au moins un C.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=ictXovVTOx0:31tElnShgdc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/ictXovVTOx0" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Optimisations-Apache-sur-un-NAS-Synology-209II-deflate-cache-expires-et-APC#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Optimisations-Apache-sur-un-NAS-Synology-209II-deflate-cache-expires-et-APC#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/321</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Optimisations-Apache-sur-un-NAS-Synology-209II-deflate-cache-expires-et-APC</feedburner:origLink></item>
    
  <item>
    <title>NAS Synology 209+ II</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/d3Ucdl2LexE/</link>
    <guid isPermaLink="false">urn:md5:9f888b7b84b9c612d5682eca953d37a7</guid>
    <pubDate>Sun, 20 Dec 2009 12:52:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Blog (attitude)</category>
        <category>209</category><category>209II</category><category>dotclear</category><category>nas</category><category>synology</category>    
    <description>&lt;p&gt;Après 1 an 1/2 de bons et loyaux services de mon &lt;a href="http://blog.olivier-duval.info/?post/2008/04/22/NAS-%3A-Synology-207"&gt;NAS 207+&lt;/a&gt; (qui est à &lt;a href="http://cgi.ebay.fr/ws/eBayISAPI.dll?ViewItem&amp;amp;item=180446289890&amp;amp;ssPageName=STRK:MESELX:IT"&gt;vendre sur la baie&lt;/a&gt;), passage à la version supérieure&amp;nbsp;: l'excellent &lt;a href="http://www.synology.com/fre/products/DS209+II"&gt;209+ II&lt;/a&gt; avec comme objectif de migrer mon blog hébergé sur &lt;a href="http://www.kimsufi.com"&gt;kimsufi&lt;/a&gt; vers le NAS.&lt;/p&gt;    &lt;p&gt;Pourquoi changer&amp;nbsp;? la volonté d'arrêter mon hébergement Kimsufi (très bien mais malgré tout payant et mon blog est au ralenti). En temps normal, un passage sur le 207+ aurait pu être suffisant et être utilisé encore longtemps, mais pour l'hébergement de mon blog et du site index, le tout sous Dotclear, cela demandait des ressources supplémentaires.&lt;/p&gt;


&lt;p&gt;J'avais testé le &lt;a href="http://blog.olivier-duval.info/?post/2008/06/04/Synology-207-et-hebergement-de-dotclear-2-RC1"&gt;207+ avec dotclear&lt;/a&gt; mais cela ne convenait pas. En revanche, le 207+ avec d'autres moteurs (ou le moteur interne de Blog de Synology) semble être suffisant, voir la liste des &lt;a href="http://www.synology.com/fre/products/features/valueapps.php"&gt;logiciels testés&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Spécifications du 209+II&lt;/h3&gt;


&lt;p&gt;Au niveau des spécifications du 209+II, il est plus véloce, tout en retrouvant toutes les fonctionnalités livrées avec le &lt;a href="http://www.synology.com/fre/products/features"&gt;DSM 2.2&lt;/a&gt;, avec ipkg en complément (cf. &lt;a href="http://fredo.servehttp.com//html/Astu-02.htm"&gt;ce billet pour l'e500 et les sources&lt;/a&gt; qui vont avec), le tout sur un RAID-1 de 1 To, un CPU PowerPC 1.06 GHz et 500 Mo RAM&lt;/p&gt;

&lt;pre&gt;
$ cat /proc/cpuinfo
processor       : 0
cpu             : e500v2
clock           : 1066.560000MHz
revision        : 2.2 (pvr 8021 0022)
bogomips        : 133.12
timebase        : 66660000
platform        : MPC8544 DS
Vendor          : Freescale Semiconductor
PVR             : 0x80210022
SVR             : 0x80340011
PLL setting     : 0x4
Memory          : 512 MB
&lt;/pre&gt;


&lt;h3&gt;Méthode de migration entre les 2 NAS&lt;/h3&gt;


&lt;p&gt;Pour le passage du 207+ au 209+II, j'ai opté également pour un changement de disques&amp;nbsp;: de 500 Go à 1 To, compte tenu de mes énormes besoins de stockage. La migration s'est bien déroulée, après bien entendu avoir effectué une sauvegarde totale des données sur mon portable, au cas où.&lt;/p&gt;


&lt;p&gt;Méthode que j'ai utilisée pour le passage au nouveau NAS&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installation du firmware avec le logiciel d'installation du 209, avec UN seul disque 500 Go,&lt;/li&gt;
&lt;li&gt;mise en place du 2è, il synchronise le RAID-1,&lt;/li&gt;
&lt;li&gt;remplacement d'un 500 Go par 1 To&amp;nbsp;: il l'initialise puis synchronise le RAID-1,&lt;/li&gt;
&lt;li&gt;remplacement du dernier 500 Go par le 1 To&amp;nbsp;: il synchronise le RAID-1, la capacité reste à 500 Go,&lt;/li&gt;
&lt;li&gt;sur l'interface DSM (&lt;strong&gt;Stockage / Volume&lt;/strong&gt;), cliquer sur &lt;strong&gt;Augmenter&lt;/strong&gt;&amp;nbsp;: il étend le volume à 1 To&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;et voilà, je me retrouve avec toutes mes données sur un volume RAID-1 de 1 To.&lt;/p&gt;


&lt;h3&gt;Performances&lt;/h3&gt;


&lt;p&gt;Tests rapides de transferts&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;en copie ou en écriture d'un gros fichier (400 Mo), en filaire&amp;nbsp;: 11-13 Mo/s&lt;/li&gt;
&lt;li&gt;en copie de fichiers de 20 Mo&amp;nbsp;: 10-11 Mo/s&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;la charge du serveur ne sourcille pas d'un poil&amp;nbsp;:  load average: 0.14, 0.04, 0.00&lt;/p&gt;


&lt;p&gt;Les serveurs qui sont lancés&amp;nbsp;: apache, lighttpd, mysql, postgresql, DLNA (serveur multimédia), serveurs de fichiers. Sous htop, on peut voir que le système est réglé aux p'tits oignons et ne consomme...rien&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.209-htop_m.jpg" alt="209-htop.png" style="display:block; margin:0 auto;" title="209-htop.png, déc. 2009" /&gt;&lt;/p&gt;


&lt;h4&gt;Blog &amp;amp; co&lt;/h4&gt;


&lt;p&gt;Pour le passage du blog et du &lt;a href="http://olivier-duval.info"&gt;site racine&lt;/a&gt;, pas de souci particulier&amp;nbsp;: copie des répertoires, dump SQL. Jusqu'à le DSM 2.2, &lt;a href="http://piwik.org"&gt;Piwik&lt;/a&gt; ne pouvait fonctionner dessus, car ce dernier utilise &lt;a href="http://php.net/manual/fr/book.pdo.php"&gt;PDO&lt;/a&gt;, mais à partir du DSM 2.3, Piwik peut tourner dessus, la preuve avec le &lt;a href="http://olivier-duval.info/essais/livepiwik.html"&gt;live visits&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Le DSM offre la possibilité de créer des serveurs Web virtuels via l'interface (&lt;strong&gt;Services réseaux / Services Web&lt;/strong&gt;), ils seront stockés dans &lt;strong&gt;/volume1/web&lt;/strong&gt;, j'en ai créé 2&amp;nbsp;: blog.olivier-duval.info, et olivier-duval.info.&lt;/p&gt;


&lt;p&gt;Bien entendu je n'atteindrai pas les performances d'un Kimsufi, sans compter les coupures possibles d'Internet, mais cela sera grandement suffisant pour l'instant pour mes besoins.&lt;/p&gt;


&lt;p&gt;Le NAS Synology, mangez-en, un petit serveur à la maison pour sauvegarder vos données, héberger vos sites, et avec toutes les fonctionnalités qu'il offre (serveur multimédia, téléchargements, photos, iTunes, ...), je pense que je continuerai dans les prochaines séries.&lt;/p&gt;


&lt;h4&gt;Optimisations&lt;/h4&gt;


&lt;p&gt;J'ai écris un &lt;a href="http://blog.olivier-duval.info/?post/Optimisations-Apache-sur-un-NAS-Synology-209II-deflate-cache-expires-et-APC"&gt;billet sur les optimisations&lt;/a&gt; qui ont été appliquées pour le passage au NAS du blog.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=d3Ucdl2LexE:sTlZTD4e2A4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/d3Ucdl2LexE" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/NAS-Synology-209-II#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/NAS-Synology-209-II#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/320</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/NAS-Synology-209-II</feedburner:origLink></item>
    
  <item>
    <title>Agenda de décembre 2009</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/GsZWuPtRM0s/</link>
    <guid isPermaLink="false">urn:md5:7c32dab0d1503839042f8da1c2155fc7</guid>
    <pubDate>Tue, 01 Dec 2009 08:15:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Divers</category>
        <category>ALT.NET</category><category>cloud</category><category>evenements</category><category>octo</category><category>valtech</category>    
    <description>&lt;p&gt;Les rendez-vous repérés de décembre&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.facebook.com/event.php?eid=177964054732&amp;amp;ref=mf"&gt;Afterworks des communautés MS&lt;/a&gt; le 2 décembre au Charlie Birdy dans le 15è,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.octo.com/Les-enjeux-du-Cloud-Computing.22/Evenements"&gt;petit-déjeuner Octo&lt;/a&gt; le 10 décembre sur le thème de cloud computing à l'Atelier BNP Parisbas (lieu très sympa),&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.facebook.com/event.php?eid=350205870642"&gt;Facebook Developer Garage Paris - Le Web Edition&lt;/a&gt; le 10 décembre,&lt;/li&gt;
&lt;li&gt;soirée Alt.NET Openspace le 15 décembre chez &lt;a href="http://maps.google.com/maps?ie=UTF8&amp;amp;q=valtech+paris&amp;amp;fb=1&amp;amp;hq=valtech&amp;amp;hnear=paris&amp;amp;cid=0,0,2954391737071798281&amp;amp;ei=rOoTS9eKO4vNjAf9--TcAw&amp;amp;ved=0CAgQnwIwAA&amp;amp;z=16&amp;amp;iwloc=A"&gt;Valtech&lt;/a&gt;, inscription via &lt;a href="http://www.doodle.com/n5wuzhfk3zxg9p9d"&gt;Doodle&lt;/a&gt;, voir l'annonce de &lt;a href="http://groups.google.fr/group/parisaltnet/browse_thread/thread/cb228dc72a3254e9?hl=fr"&gt;Robert&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=GsZWuPtRM0s:3PHbMtZx-c0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/GsZWuPtRM0s" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Agenda-de-decembre-2009#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Agenda-de-decembre-2009#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/319</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Agenda-de-decembre-2009</feedburner:origLink></item>
    
  <item>
    <title>Agenda de novembre 2009</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/TY-tIWNKGd8/</link>
    <guid isPermaLink="false">urn:md5:b9eb7fe48e70925f310757d5fd2b3353</guid>
    <pubDate>Tue, 10 Nov 2009 08:10:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Divers</category>
        <category>agile</category><category>evenements</category><category>octo</category><category>valtech</category>    
    <description>&lt;p&gt;Quelques rendez-vous qui me semblent intéressants&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.octo.com/com/com_petitdej_agile-oct2009.html"&gt;petit déjeuner d'Octo&lt;/a&gt; (gratuit) le 12 novembre sur le thème de l'agilité&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.valtech.fr/fr/index/valtech_days.html/"&gt;Valtech days 2009&lt;/a&gt; le 17 novembre (payant), cette fois-ci, je n'y serai pas&amp;nbsp;: 1 jour de moins pour plus cher (300 € HT), dommage car le &lt;a href="http://www.valtech.fr/fr/index/valtech_days/Horaires.html"&gt;programme&lt;/a&gt; me semblait intéressant.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.altnetfr.org/2009/10/21/alt-net-paris-19-command-query-separation-avec-udi-dahan/"&gt;Alt.NET Command Query Separation avec Udi Dahan&lt;/a&gt; le lundi 16 novembre, en anglais&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Conférence sur les &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032430827&amp;amp;culture=fr-FR"&gt;Techniques et Stratégies Web, et Ateliers pratiques&lt;/a&gt; sur les RIA le 17 novembre de 14h30 à 18h30 au centre de conf. MS à Issy-les-Moulineaux&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=TY-tIWNKGd8:7Xe_dXbiY6w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/TY-tIWNKGd8" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Agenda-de-novembre-2009#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Agenda-de-novembre-2009#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/318</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Agenda-de-novembre-2009</feedburner:origLink></item>
    
  <item>
    <title>Bienvenue à Thor, reçu le 29 octobre, il pèse 5,4 kgs</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/5oy6JLBcoNw/</link>
    <guid isPermaLink="false">urn:md5:44bfd89a67943e3c86a3751023dfacac</guid>
    <pubDate>Sat, 31 Oct 2009 22:14:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Blog (attitude)</category>
        <category>clevo</category><category>d900f</category><category>gamer</category><category>invasion labs</category><category>laptop</category><category>portable</category>    
    <description>&lt;p&gt;Après 15 jours d'attente, il est enfin arrivé. Thor de son petit nom, pèse 5,4 kgs, un bien beau bébé. Il va remplacer Victor (Sony VAIO, Centrino Core 2 Duo T2300 1,66 Ghz, 2 Go RAM, 100 Go DD, 15"4), devenu trop lent après 3,5 ans de bons et loyaux services.&lt;/p&gt;
&lt;p&gt;Merci aux commentateurs du billet sur ma &lt;a href="http://blog.olivier-duval.info/?post/Cherche-portable...de-gamer"&gt;recherche de portable&lt;/a&gt;, notamment &lt;a href="http://codingly.com"&gt;Romain&lt;/a&gt; et David (fondateur du site &lt;a href="http://portables4gamers.com"&gt;portables4gamers&lt;/a&gt;, un précieux site !) , j'ai au moins écouté les conseils concernant le SSD.&lt;/p&gt;    &lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2553/4060633907_123fe8ec3c.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Commençons par quelques photos du petit qui en impose&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.olivier-duval.info/public/d900f/IMG_9685_copy.jpg" hreflang="" rel="lightbox[d900f]" title="d900f"&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/IMG_9685_copy-th.jpg" alt="d900f" /&gt;&lt;/a&gt;
&lt;a href="http://blog.olivier-duval.info/public/d900f/IMG_9721_DxO_raw_copy.jpg" hreflang="" rel="lightbox[d900f]" title="d900f"&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/IMG_9721_DxO_raw_copy-th.jpg" alt="d900f" /&gt;&lt;/a&gt;
&lt;a href="http://blog.olivier-duval.info/public/d900f/IMG_9694_DxO_raw_copy.jpg" hreflang="" rel="lightbox[d900f]" title="d900f"&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/IMG_9694_DxO_raw_copy-th.jpg" alt="d900f" /&gt;&lt;/a&gt;
&lt;a href="http://blog.olivier-duval.info/public/d900f/IMG_9699_DxO_raw_copy.jpg" hreflang="" rel="lightbox[d900f]" title="d900f"&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/IMG_9699_DxO_raw_copy-th.jpg" alt="d900f" /&gt;&lt;/a&gt;
&lt;a href="http://blog.olivier-duval.info/public/d900f/IMG_9698_DxO_raw_copy.jpg" hreflang="" rel="lightbox[d900f]" title="d900f"&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/IMG_9698_DxO_raw_copy-th.jpg" alt="d900f" /&gt;&lt;/a&gt;
&lt;a href="http://blog.olivier-duval.info/public/d900f/IMG_9701_DxO_raw_copy.jpg" hreflang="" rel="lightbox[d900f]" title="d900f"&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/IMG_9701_DxO_raw_copy-th.jpg" alt="d900f" /&gt;&lt;/a&gt;
&lt;a href="http://blog.olivier-duval.info/public/d900f/IMG_9704_DxO_raw_copy.jpg" hreflang="" rel="lightbox[d900f]" title="d900f"&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/IMG_9704_DxO_raw_copy-th.jpg" alt="d900f" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Quelques retours rapides&lt;/h2&gt;
&lt;p&gt;Après avoir pas mal regardé, les configurations haut de gamme en portable, il y en a finalement peu sur le marché&amp;nbsp;: &lt;a href="http://www1.euro.dell.com/content/products/productdetails.aspx/laptop-alienware-m17x?c=fr&amp;amp;cs=frdhs1&amp;amp;l=fr&amp;amp;s=dhs"&gt;Alienware M17x&lt;/a&gt;, &lt;a href="http://www1.euro.dell.com/fr/fr/domicile/Portables/xpsnb_m1730/pd.aspx?refid=xpsnb_m1730&amp;amp;cs=frdhs1&amp;amp;s=dhs"&gt;Dell XPS m1730&lt;/a&gt;, barebone &lt;a href="http://www.clevo.com.tw"&gt;Clevo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ensuite, c'est une question de besoins et surtout de...budget. Le français moyen met rarement les moyens dans ce qu'il souhaite entreprendre, ce côté "petit joueur" assez agaçant chez nous ou comment escalader une montagne avec des tongs souvent. Personnellement, je considère qu'il vaut mieux attendre pour avoir les moyens pour entamer quelque chose, et là, il fallait attendre pour le budget&amp;nbsp;: le confort n'a pas de prix.&lt;/p&gt;
&lt;p&gt;Mes besoins, pour rappel&amp;nbsp;: beaucoup de traitement de photos (ou bientôt de la vidéo ?), consommateurs en CPU et mémoire (CS3, &lt;a href="http://www.dxo.com/fr/photo"&gt;DxO Optics Pro&lt;/a&gt;, Lightroom, ...), développement (Visual Studio, SQL Server, virtualisation,...), tout cela demande du multi-coeurs avant tout, bien plus que pour les jeux ou des Core 2 Duo suffisent.&lt;/p&gt;
&lt;p&gt;Passons maintenant aux spécifications de la machine, attention, ça pique les yeux&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;barebone &lt;strong&gt;Clevo D900F&lt;/strong&gt; wUXGA &lt;strong&gt;17" 1920x1200&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Intel&lt;a href="http://www.intel.com/cd/products/services/emea/fra/processors/corei7/406046.htm"&gt; i7 920&lt;/a&gt; (quad coeurs hyperthreadés, 2,66 GHz cache 8Mo, 4,8 GT/s)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nvidia.fr/object/product_geforce_gtx_280m_fr.html"&gt;NVidia GTX 280M&lt;/a&gt; 1Go,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6 Go&lt;/strong&gt; RAM&amp;nbsp;: 3x2Go DDR3 (1066 / 1366 MHz),&lt;/li&gt;
&lt;li&gt;1 DD système &lt;strong&gt;80Go SSD&lt;/strong&gt; &lt;a href="http://www.hardware.fr/articles/765-1/intel-x25-m-v2-postville.html"&gt; Intel X25-M Postville&lt;/a&gt; (G2),&lt;/li&gt;
&lt;li&gt;1 DD 500 Go &lt;strong&gt;7200 trs/mn&lt;/strong&gt;, (reste de la place pour 1 troisième),&lt;/li&gt;
&lt;li&gt;graveur DVD, lecteur &lt;strong&gt;Bluray&lt;/strong&gt;,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...toutes les spécifications détaillées chez &lt;a href="http://v2.invasion-shop.fr/d900f.html"&gt;IL&lt;/a&gt; (ou chez le &lt;a href="http://www.clevo.com.tw/en/products/prodinfo.asp?productid=19"&gt;constructeur&lt;/a&gt;), le tout sous Windows 7 Ultimate 64bits. L'intégrateur Français &lt;a href="http://invasion-shop.fr"&gt;Invasion Labs&lt;/a&gt; est basé dans le sud de la France, je vous le recommande chaudement, pour son professionnalisme et sa réactivité.&lt;/p&gt;
&lt;h2&gt;Indicateurs de performance&lt;/h2&gt;
&lt;p&gt;Quelques chiffres, sur le Clevo (Thor), ou en comparaison avec l'ancien portable (Victor).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Indice Windows 7 :&lt;/strong&gt; &lt;em&gt;6,8&lt;/em&gt; (étonnant, c'est la carte graphique qui pêche)&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/.indice-win7-th_m.jpg" alt="indice-win7-th.png" style="margin: 0 auto; display: block;" title=".indice-win7-th.png, oct. 2009" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Score 3D Mark 06 :&lt;/strong&gt; &lt;em&gt;12 719&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/3dmark06-2.png" alt="3dmark06-2.png" style="margin: 0 auto; display: block;" title="3dmark06-2.png, oct. 2009" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P4G&lt;/strong&gt; (que l'on trouvera sur le site &lt;a href="http://portables4gamers.com/forum/viewforum.php?id=45"&gt;p4g&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/p4g-iteratif.png" alt="p4g-iteratif.png" style="margin: 0 auto; display: block;" title="p4g-iteratif.png, oct. 2009" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/p4g-multithreade.png" alt="p4g-multithreade.png" style="margin: 0 auto; display: block;" title="p4g-multithreade.png, oct. 2009" /&gt;&lt;/p&gt;
&lt;p&gt;Les disques, le SSD X25-M et le HDD 7200 rpm (en lecture seule, pas de licence HD Tune)&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/read-rate-ssd.png" alt="read-rate-ssd.png" style="margin: 0 auto; display: block;" title="read-rate-ssd.png, oct. 2009" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/read-rate-hdd.png" alt="read-rate-hdd.png" style="margin: 0 auto; display: block;" title="read-rate-hdd.png, oct. 2009" /&gt;&lt;/p&gt;
&lt;p&gt;un ensemble de tests :
&lt;/p&gt;
&lt;p&gt;Le i7 hyperthreadé est assez marrant à regarder&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.olivier-duval.info/public/d900f/gestionnaire-taches.png" hreflang="" rel="lightbox[d900f]" title="d900f"&gt;&lt;img src="http://blog.olivier-duval.info/public/d900f/gestionnaire-taches-th.png" alt="d900f" style="margin: 0 auto; display: block;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Le D900F est une station de travail qui répond aux utilisations les plus exigeantes, mes 1ères impressions sont excellentes, la puissance à l'état pur, il est bien un "desktop replacement" pour ceux qui ne souhaitent pas de PC de bureau, il rendra heureux un geek en chasse de monstre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;les plus de ce portable :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la puissance, ça répond dans la seconde, je peux faire tourner des logiciels gourmands en ressources en même temps,&lt;/li&gt;
&lt;li&gt;évolutif&amp;nbsp;: il reste un emplacement pour 1 disque, et chaque composant est remplaçable, 3 barettes DDR3, vu le prix de la barrette de 4Go, c'est important,&lt;/li&gt;
&lt;li&gt;l'écran, le 17", c'est agréable, en 1920x1200, il faut tout de même ajuster l'affichage pour grossir les icônes ou la police,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;les moins :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le clavier aurait pu être plus grand et un peu plus bas, vu la place qu'il y a pour poser ses mains, et c'est un clavier...Belge donc certaines touches différent (\, [, ], ...),&lt;/li&gt;
&lt;li&gt;dit puissance dit consommation, il faudra penser à la mise en veille, d'autant plus sous Windows 7 où la reprise est ultra rapide&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai installé VMWare server, avec une VM Windows Server 2008 R2 64 bits + Visual Studio 2010 B2, rapide, très rapide, important pour la veille.&lt;/p&gt;
&lt;p&gt;...faut que je me retrouve les jeux maintenant.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=5oy6JLBcoNw:lt9M1s4O5-I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/5oy6JLBcoNw" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/clevo-d900f-portable-gamer-i7#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/clevo-d900f-portable-gamer-i7#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/316</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/clevo-d900f-portable-gamer-i7</feedburner:origLink></item>
    
  <item>
    <title>NHModeler : DSL de génération de code à base d'Oslo / langage M, rien ne se perd, rien ne se crée, tout se transforme en info</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/Tn1g1RTNvmw/</link>
    <guid isPermaLink="false">urn:md5:dae3af66d4635b479023168817dd75b4</guid>
    <pubDate>Wed, 07 Oct 2009 22:15:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>.NET</category>
        <category>DSL</category><category>nhibernate</category><category>nhmodeler</category>    
    <description>&lt;h2&gt;Flex et Bison&lt;/h2&gt;
&lt;p&gt;Je me souviens dans ma jeunesse (il y a très peu de temps donc), dans la boite où j'ai commencé mon activité pro, on développait des services &lt;del&gt;de messageries roses&lt;/del&gt; télématiques à 1,23 Frs /mn (voire le double en trichant un peu). Vous savez l'Internet français, qu'on appelait &lt;a href="http://www.minitel.fr"&gt;Minitel&lt;/a&gt; sur le réseau X25 de Transpac (CA du minitel en 2007 : &lt;a href="http://fr.wikipedia.org/wiki/Minitel"&gt;100 millions €&lt;/a&gt;, à peine imaginable)&lt;/p&gt;
&lt;p&gt;Le moteur Opsion que nous utilisions générait du C, et il fallait donc écrire du C pour nos services. A l'époque, point de bases de données, mais des fichiers indexés au format &lt;a href="http://en.wikipedia.org/wiki/IBM_Informix_C-ISAM"&gt;C-ISAM&lt;/a&gt;. A chaque entité, il fallait écrire la génération de l'index, tout un tas de petites choses et surtout des fonctions de &lt;q&gt;recherche&lt;/q&gt; sur la structure de données (à l'octet près...) (par catégorie, par nom, ...) en utilisant l'API C-ISAM, ce qui était assez fastidieux, et surtout courageux. &lt;/p&gt;
&lt;br /&gt;    &lt;p&gt;Comme on était de vrais geeks devant un écran noir à fonte verte, avec du &lt;a href="http://fr.wikipedia.org/wiki/Vi"&gt;vi&lt;/a&gt;,
il nous fallait trouver un moyen pour automatiser toute cette phase de
code plus ou moins toujours la même. J'avais alors créé une petite
grammaire (qu'on appellerait DSL maintenant) à base de &lt;strong&gt;create table&lt;/strong&gt;,
afin de générer les fichiers C ad-hoc pour chaque table contenant les
champs et index souhaités. Pour développer ce genre de programme, un
compilateur en gros, nous utilisions le couple &lt;a href="http://fr.wikipedia.org/wiki/Lex_et_yacc"&gt;Lex &amp;amp; Yacc&lt;/a&gt;
pour interpréter notre pseudo-langage (les create table avec les champs
typés, et les index) afin de générer le code C pour utiliser l'API
C-ISAM.&lt;/p&gt;
&lt;p&gt;Mais pourquoi tu nous racontes ta p'tite vie de geek Olive&amp;nbsp;? tout simplement que lorsque vous utilisez &lt;a href="http://sourceforge.net/projects/nhibernate/files/"&gt;NHibernate&lt;/a&gt;, la phase mapping, création des classes peut être très rapidement rébarbative. &lt;strong&gt;NHModeler&lt;/strong&gt;
se propose de résoudre tout ça, pour nous, informaticiens feignants&amp;nbsp;: à
partir d'une grammaire à base d'entités (le modèle), de générer une
multitudes de fichiers&amp;nbsp;: le modèle (les class C# de nos entités), les
.hbm (le mapping), le fichier SQL de création des tables, fichiers
qu'on aura plus qu'à intégrer à notre projet. Cette génération
s'apparente à du MDA (&lt;a href="http://fr.wikipedia.org/wiki/Model_driven_architecture"&gt;Model Driven Architecture&lt;/a&gt;), avec ses inconvénients et ses avantages.&lt;/p&gt;
&lt;h2&gt;NHModeler&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://nhmodeller.selfip.com"&gt;NHModeler&lt;/a&gt; a besoin du &lt;a href="http://msdn.microsoft.com/en-us/oslo/default.aspx"&gt;SDK Oslo&lt;/a&gt;. Également, afin de lancer la compilation de votre DSL, il manque 2 assembly dans les binaires fournis&amp;nbsp;: &lt;strong&gt;log4net&lt;/strong&gt; et les &lt;strong&gt;Iesi.Collections&lt;/strong&gt;, les 2 pourront être pris de vos binaires NHibernate.&lt;/p&gt;
&lt;p&gt;Comme toujours, on souhaite représenter la relation suivante&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yuml.me/diagram/class/%5BResponsable%7Bbg:orange%7D%5D*-*g%C3%A8re%3E%5BAssoc%7Bbg:yellow%7D%5D" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;une relation &lt;a href="http://www.nhforge.org/doc/nh/en/index.html#collections-ofvalues"&gt;many-to-many&lt;/a&gt; dans le langage NHibernate.&lt;/p&gt;
&lt;p&gt;On déclare cette relation dans le langage NHModeler, contenu d'un fichier nommé respassoc.nhm&amp;nbsp;:&lt;/p&gt;
&lt;pre class="sql sql" style="font-family: monospace;"&gt;NHModel &lt;br /&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br /&gt;   Entity Responsable &lt;br /&gt;   &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br /&gt;    Nom: string&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 102, 204);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;    Prenom: string&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 102, 204);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;    Assocs&lt;span style="color: rgb(102, 204, 102);"&gt;-&amp;gt;&lt;/span&gt;Responsables: Assoc &lt;span style="color: rgb(102, 204, 102);"&gt;*&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;IN&lt;/span&gt; Responsables&lt;br /&gt;&amp;nbsp;&lt;br /&gt;   Entity Assoc&lt;br /&gt;   &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br /&gt;    Libelle: string&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 102, 204);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;    &lt;br /&gt;    Description: string&lt;br /&gt;    Responsables&lt;span style="color: rgb(102, 204, 102);"&gt;&amp;lt;-&lt;/span&gt;Assocs: Responsable &lt;span style="color: rgb(102, 204, 102);"&gt;*&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;IN&lt;/span&gt; Assocs&lt;br /&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;note :&lt;/strong&gt;  si l'on ne souhaite pas de modifications en cascade entre les 2 entités, il suffit d'ajouter le mot clé &lt;strong&gt;weak&lt;/strong&gt; derrière les relations&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;Assocs-&amp;gt;Responsables: Assoc * weak&lt;br /&gt;Responsables&amp;lt;-Assocs: Responsable * weak&lt;/pre&gt;
&lt;p&gt;il reste à exécuter la génération de code, de notre fichier respassoc.nhm qui contient notre description précédente, pour le dialect SQL Server 2005&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;NHModeller.Console -a:Model  -d:MsSql2005 -ddl:dbscript.sql -out:"c:\temp\mymodel" respassoc.nhm&lt;/pre&gt;
&lt;p&gt;on obtient l'ensemble utile à NHibernate, les &lt;strong&gt;classes&lt;/strong&gt;, &lt;strong&gt;hbm&lt;/strong&gt; et le script &lt;strong&gt;SQL&lt;/strong&gt; de création de tables&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/model-nhmodeler.png" alt="NHModeler" style="margin: 0 auto; display: block;" title="NHModeler, oct. 2009" /&gt;&lt;/p&gt;
&lt;p&gt;dans le script de création nous avons bien entendu les 3 tables qui représentent notre relation&amp;nbsp;: Responsables, Assocs et la table de jointure Assoc_Responsable&lt;/p&gt;
&lt;pre class="sql sql" style="font-family: monospace;"&gt;&lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;CREATE&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;TABLE&lt;/span&gt; Responsables &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;br /&gt;   Id INT IDENTITY &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NOT&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;   Nom NVARCHAR&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 102, 204);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NOT&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;   Prenom NVARCHAR&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 102, 204);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NOT&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;KEY&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;Id&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;CREATE&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;TABLE&lt;/span&gt; Assoc_Responsable &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;br /&gt;   Responsable_Id INT &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NOT&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;   Assoc_Id INT &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NOT&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;KEY&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;Assoc_Id&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt; Responsable_Id&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;CREATE&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;TABLE&lt;/span&gt; Assocs &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;br /&gt;   Id INT IDENTITY &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NOT&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;   Libelle NVARCHAR&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 102, 204);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NOT&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;   Description NVARCHAR&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 102, 204);"&gt;255&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NOT&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;KEY&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;Id&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;ALTER&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;TABLE&lt;/span&gt; Assoc_Responsable &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;ADD&lt;/span&gt; constraint FKFF76651DD5384AF6 &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;FOREIGN&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;KEY&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;Assoc_Id&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;REFERENCES&lt;/span&gt; Assocs;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;ALTER&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;TABLE&lt;/span&gt; Assoc_Responsable &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;ADD&lt;/span&gt; constraint FKFF76651D9647BEE3 &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;FOREIGN&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;KEY&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;Responsable_Id&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(153, 51, 51); font-weight: bold;"&gt;REFERENCES&lt;/span&gt; Responsables;&lt;/pre&gt;
&lt;p&gt;et les *.hbm.xml&amp;nbsp;:&lt;/p&gt;
&lt;pre class="xml xml" style="font-family: monospace;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;?xml&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;version&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;'1.0'&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;hibernate-mapping&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;xmlns&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"urn:nhibernate-mapping-2.2"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;assembly&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Model"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;namespace&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Model"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Responsable"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;table&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Responsables"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;id&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Id"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Id"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;access&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"field.camelcase-underscore"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;			&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;generator&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;class&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"native"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Nom"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Nom"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;type&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"String"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;not-null&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"true"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;length&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"30"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Prenom"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Prenom"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;type&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"String"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;not-null&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"true"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;length&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"30"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;set&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;table&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Assoc_Responsable"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;access&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"field.camelcase-underscore"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Assocs"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;cascade&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"none"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;			&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;key&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Responsable_Id"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;			&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;many-to-many&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;class&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Assoc"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;outer-join&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"true"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Assoc_Id"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;/set&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;/class&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;/hibernate-mapping&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;?xml&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;version&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;'1.0'&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;hibernate-mapping&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;xmlns&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"urn:nhibernate-mapping-2.2"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;assembly&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Model"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;namespace&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Model"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Assoc"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;table&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Assocs"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;id&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Id"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Id"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;access&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"field.camelcase-underscore"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;			&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;generator&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;class&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"native"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Libelle"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Libelle"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;type&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"String"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;not-null&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"true"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;length&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"30"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Description"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Description"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;type&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"String"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;not-null&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"true"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;set&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;table&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Assoc_Responsable"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;access&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"field.camelcase-underscore"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;name&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Responsables"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;cascade&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"none"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;			&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;key&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Assoc_Id"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;			&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;many-to-many&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;class&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Responsable"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;outer-join&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"true"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;column&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Responsable_Id"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;/set&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;/class&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;lt;/hibernate-mapping&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href="http://nhmodeller.selfip.com/Docs.aspx"&gt;documentation&lt;/a&gt; est riche avec des exemples, le langage est assez complet et semble répondre aux principales fonctionnalités de NHibernate, ce projet vaut la peine de s'y arrêter, au moins pour se rappeller de bons souvenirs &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt;&lt;/p&gt;
&lt;p&gt;Petit défaut&amp;nbsp;: pas de sources disponibles.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=Tn1g1RTNvmw:1O7zODwjdsQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/Tn1g1RTNvmw" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/NHModeler-DSL-de-generation-de-code-a-base-d-Oslo-langage-M#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/NHModeler-DSL-de-generation-de-code-a-base-d-Oslo-langage-M#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/315</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/NHModeler-DSL-de-generation-de-code-a-base-d-Oslo-langage-M</feedburner:origLink></item>
    
  <item>
    <title>Repository générique et IoC avec Castle Windsor</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/ECNk9_jVDYM/</link>
    <guid isPermaLink="false">urn:md5:a6dab35e5f09e237db03d3d71f0faeaf</guid>
    <pubDate>Mon, 05 Oct 2009 22:33:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>.NET</category>
        <category>castle windsor</category><category>generics</category><category>ioc</category>    
    <description>&lt;h2&gt;Repository générique&lt;/h2&gt;


&lt;p&gt;Lorsque l'on a à interroger plus d'une entité, il convient de factoriser son code afin d'en réduire le nombre de lignes (maintenance, évolution, ...).&lt;/p&gt;


&lt;p&gt;Pour cela, on peut utiliser un repository générique qui consiste à factoriser les fonctions les plus communes, à savoir&amp;nbsp;: &lt;strong&gt;Get&lt;/strong&gt;, &lt;strong&gt;Delete&lt;/strong&gt;, &lt;strong&gt;Save&lt;/strong&gt;, &lt;strong&gt;GetAll&lt;/strong&gt;, voire &lt;strong&gt;Find&lt;/strong&gt; en utilisant une expression (lire ce &lt;a href="http://blog.olivier-duval.info/?post/find-my-dynamic-ou-l-innovation-de-C-4"&gt;billet&lt;/a&gt; sur les find). On peut alors représenter cela au travers d'une interface générique, socle qui sera à compléter pour des besoins plus spécifiques.&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;interface&lt;/span&gt; IRepository&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
        T GetById&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;int&lt;/span&gt; id&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Save&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;T entite&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Delete&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;T entite&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; GetAll&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; Find&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Func&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T, &lt;span style="color: #FF0000;"&gt;bool&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; expression&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;ou mieux, si l'on souhaite un type generic pour l'ID de nos entités&amp;nbsp;:&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;interface&lt;/span&gt; IRepository&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T,TId&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
        T GetById&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TId id&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Save&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;T entite&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Delete&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;T entite&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; GetAll&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
        List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; Find&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Func&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T, &lt;span style="color: #FF0000;"&gt;bool&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; expression&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;    &lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2659/3889070559_da44ab667e.jpg" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;[&lt;a href="http://www.flickr.com/photos/zorky/3889070559/in/set-72157622224103040/"&gt;photo&lt;/a&gt;]&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;GetById&lt;/strong&gt; est optionnel, le Find avec l'expression pourrait suffire pour retrouver une entité par son id&amp;nbsp;: &lt;strong&gt;Find(x=&amp;gt;x.Id==4)&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;On a l'implémentation suivante, on utilise NHibernate comme ORM, cela reste valable avec d'autres&amp;nbsp;:&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;class&lt;/span&gt; Repository&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T,TId&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #008000;"&gt;:&lt;/span&gt; IRepository&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T,TId&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
   &lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; T GetById&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TId id&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;  &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; session.&lt;span style="color: #0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;id&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;   
&amp;nbsp;
   &lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Save&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;T entite&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
      &lt;span style="color: #0600FF;"&gt;try&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;           
          session.&lt;span style="color: #0000FF;"&gt;BeginTransaction&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
       session.&lt;span style="color: #0000FF;"&gt;SaveOrUpdate&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;entite&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
       session.&lt;span style="color: #0000FF;"&gt;Transaction&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Commit&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Exception e&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;                    
           &lt;span style="color: #0600FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;session.&lt;span style="color: #0000FF;"&gt;Transaction&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;IsActive&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
         session.&lt;span style="color: #0000FF;"&gt;Transaction&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Rollback&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
   &lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Delete&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;T entite&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
            &lt;span style="color: #0600FF;"&gt;try&lt;/span&gt;
            &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
                session.&lt;span style="color: #0000FF;"&gt;BeginTransaction&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
                session.&lt;span style="color: #0000FF;"&gt;Delete&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;entite&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
                session.&lt;span style="color: #0000FF;"&gt;Transaction&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Commit&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;     
            &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
            &lt;span style="color: #0600FF;"&gt;catch&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Exception e&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
            &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
                &lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;session.&lt;span style="color: #0000FF;"&gt;Transaction&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;IsActive&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
                    session.&lt;span style="color: #0000FF;"&gt;Transaction&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Rollback&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
            &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
        &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
   &lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; GetAll&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;      
         &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; session.&lt;span style="color: #0000FF;"&gt;Linq&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;ToList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
   &lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; Find&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Func&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T, &lt;span style="color: #FF0000;"&gt;bool&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; expression&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
     &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; session.&lt;span style="color: #0000FF;"&gt;Linq&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Where&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;expression&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;ToList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
   &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;h2&gt;IoC&lt;/h2&gt;


&lt;p&gt;Pour chaque type d'entité, on peut alors se créer un repository en lui indiquant son type.&lt;/p&gt;


&lt;p&gt;Pour cela, nous allons utiliser &lt;a href="http://www.castleproject.org/container"&gt;Castle Windsor&lt;/a&gt;, un framework IoC qui permet également d'instancier les types génériques. Mais au fait, &lt;a href="http://www.castleproject.org/container"&gt;Castle Windsor&lt;/a&gt;, ça sert à quoi en 2 mots exactement&amp;nbsp;? Ce framework nous permettra, au même titre qu'une &lt;a href="http://www.dofactory.com/Patterns/PatternFactory.aspx"&gt;factory&lt;/a&gt;, d'instancier un objet de type A qui implémente une interface, et ce, lorsque l'on lui demandera. Il permet également et surtout d'instancier des objets qui seront injectés (sous forme d'une propriété ou dans le constructeur) dans notre objet de type A&amp;nbsp;: un objet DAL, de mails, de logging, ...et uniquement à base d'interface afin de découpler les objets entre eux. En gros, le conteneur IoC s'intercale entre la couche présentation (Web par exemple) et nos implémentations (services implémentant des interfaces).&lt;/p&gt;


&lt;p&gt;Imaginons la relation suivante&amp;nbsp;: &lt;strong&gt;des associations et des responsables&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src="http://yuml.me/diagram/class/%5BResponsable%7Bbg:orange%7D%5D*-*g%C3%A8re%3E%5BAssoc%7Bbg:yellow%7D%5D" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;Pour avoir 2 repository, 1 pour chaque entité, dont Assoc qui aura une clé de type string, avec quelques opérations&amp;nbsp;:&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;IRepository&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;Assoc, &lt;span style="color: #FF0000;"&gt;string&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; repoAssoc &lt;span style="color: #008000;"&gt;=&lt;/span&gt; IoC.&lt;span style="color: #0000FF;"&gt;Resolve&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;IRepository&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;Assoc, &lt;span style="color: #FF0000;"&gt;string&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
IRepository&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;Responsable, &lt;span style="color: #FF0000;"&gt;int&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; repoResponsable &lt;span style="color: #008000;"&gt;=&lt;/span&gt; IoC.&lt;span style="color: #0000FF;"&gt;Resolve&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;IRepository&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;Responsable, &lt;span style="color: #FF0000;"&gt;int&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
var myrepo &lt;span style="color: #008000;"&gt;=&lt;/span&gt; repoAssoc.&lt;span style="color: #0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;myassoc1&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
var mylistrespons &lt;span style="color: #008000;"&gt;=&lt;/span&gt; repoResponsable.&lt;span style="color: #0000FF;"&gt;Find&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;a&lt;span style="color: #008000;"&gt;=&amp;gt;&lt;/span&gt;a.&lt;span style="color: #0000FF;"&gt;Prenom&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;StartsWith&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;oli&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
var resp &lt;span style="color: #008000;"&gt;=&lt;/span&gt; repoResponsable.&lt;span style="color: #0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;37&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
resp.&lt;span style="color: #0000FF;"&gt;Nom&lt;/span&gt;&lt;span style="color: #008000;"&gt;=&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;dudu&amp;quot;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
repoResponsable.&lt;span style="color: #0000FF;"&gt;Save&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;resp&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;IoC est une classe utilitaire qui encapsule l'appel Windsor (voir aussi &lt;a href="http://blog.olivier-duval.info/?post/2008/08/02/NHibernate-%3A-IoC-Castle-Windsor-multi-bases-et-relation-one-to-one-composition"&gt;ce billet&lt;/a&gt; sur le sujet)&amp;nbsp;:&lt;/p&gt;

&lt;pre class="csharp csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;static&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;class&lt;/span&gt; IoC
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;           
      &lt;span style="color: #0600FF;"&gt;private&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;static&lt;/span&gt; IWindsorContainer _container &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;new&lt;/span&gt; WindsorContainer&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #008000;"&gt;new&lt;/span&gt; XmlInterpreter&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
      &lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;static&lt;/span&gt; T Resolve&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; _container.&lt;span style="color: #0000FF;"&gt;Resolve&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;h2&gt;Configuration Castle Windsor&lt;/h2&gt;


&lt;p&gt;Au niveau configuration de Castle Windsor pour représenter les instanciations et les injections, le framework permet de déclarer le type des générics à l'aide du format suivant que cela soit pour le service (le contrat) et le type (l'implémentation)&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
mynamespace.IInterface`N[[type1], [type2]{, [typeN]}]], assembly
&lt;/pre&gt;


&lt;p&gt;ou N est le nombre de paramètres de notre générique ici &lt;strong&gt;T&lt;/strong&gt; et &lt;strong&gt;TId&lt;/strong&gt;, donc 2 (s'il il y avait eu que T on aurait 1, trop fort), &lt;strong&gt;type&lt;/strong&gt;, le type à instancier pour les génériques, ici, nos entités Assoc et Responsable.&lt;/p&gt;


&lt;p&gt;Pour Assoc, on aurait le repository Repository&amp;lt;Assoc,int&amp;gt;, l'implémentation de IRepository&amp;lt;T,TId&amp;gt; pour l'entité Assoc, qui sera représenté dans la configuration Windsor par (nos POCO / entités et interfaces sont dans l'assembly &lt;strong&gt;Connector&lt;/strong&gt;, et les implémentations, dans l'assembly &lt;strong&gt;Impl&lt;/strong&gt;)&amp;nbsp;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;service=&amp;quot;IRepository`2[[Connector.Assoc, Connector],[System.String]], Connector&amp;quot;, type=&amp;quot;Repository`2[[Connector.Assoc, Connector],[System.Int32]], Impl&amp;quot;&lt;/pre&gt;


&lt;p&gt;signifie&amp;nbsp;: instancie moi &lt;strong&gt;Repository&amp;lt;Assoc, int&amp;gt;&lt;/strong&gt; de l'assembly &lt;strong&gt;Impl&lt;/strong&gt;, qui implémente &lt;strong&gt;IRepository&amp;lt;Assoc, int&amp;gt;&lt;/strong&gt;,  de l'assembly &lt;strong&gt;Connector&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Dans l'exemple, on injecte dans les composants RepositoryAssoc et RepositoryResponsable, un objet DALContainer, notre ORM. Le paramètre &lt;strong&gt;lifefestyle="transient"&lt;/strong&gt; demande à Castle Windsor d'instancier à chaque fois nos objets, a contrario d'un singleton du comportement par défaut.&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;?xml&lt;/span&gt; &lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;configuration&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;components&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #808080; font-style: italic;"&gt;&amp;lt;!-- container ORM --&amp;gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;component&lt;/span&gt; &lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;DALContainer&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;                   &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Impl.DALContainer, Impl&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;                   &lt;span style="color: #000066;"&gt;service&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Connector.IDALContainer, Connector&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;        
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/component&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
      &lt;span style="color: #808080; font-style: italic;"&gt;&amp;lt;!-- Repository Assoc --&amp;gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;component&lt;/span&gt; &lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;RepositoryAssoc&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;               &lt;span style="color: #000066;"&gt;service&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Connector.IRepository`2[[Connector.Assoc, Connector],[System.String]], Connector&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;               &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Impl.Repository`2[[Connector.Assoc, Connector],[System.String]], Impl&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;               &lt;span style="color: #000066;"&gt;lifestyle&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;transient&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;parameters&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;container&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;${DALContainer}&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/container&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/parameters&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/component&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
      &lt;span style="color: #808080; font-style: italic;"&gt;&amp;lt;!-- Repository Responsable --&amp;gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;component&lt;/span&gt; &lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;RepositoryResponsable&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;               &lt;span style="color: #000066;"&gt;service&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Connector.IRepository`2[[Connector.Responsable, Connector],[System.Int32]], Connector&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;               &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Impl.Repository`2[[Connector.Responsable, Connector],[System.Int32]], Impl&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;               &lt;span style="color: #000066;"&gt;lifestyle&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;transient&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;parameters&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;container&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;${DALContainer}&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/container&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/parameters&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/component&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/components&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/configuration&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;A base d'une configuration simple et d'un usage accessible, on aura le contrôle de nos repository pour interroger nos entités, Castle Windsor, mangez-en&amp;nbsp;!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=ECNk9_jVDYM:XsYlnR71oOQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/ECNk9_jVDYM" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Repository-g%C3%A9n%C3%A9rique-et-IoC-avec-Castle-Windsor#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Repository-g%C3%A9n%C3%A9rique-et-IoC-avec-Castle-Windsor#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/314</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Repository-g%C3%A9n%C3%A9rique-et-IoC-avec-Castle-Windsor</feedburner:origLink></item>
    
</channel>
</rss>
