<?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>Wed, 18 Jan 2012 18:24:34 +0100</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>Quelques applications Android</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/whMqcgOzimU/</link>
    <guid isPermaLink="false">urn:md5:51e461b47d49eea2957a05890eb4ecfb</guid>
    <pubDate>Sat, 23 Apr 2011 14:40:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Blog (attitude)</category>
        <category>android</category><category>applications</category><category>apps</category>    
    <description>&lt;p&gt;Je suis devenu un fan inconditionnel du Smartphone, et particulièrement du Galaxy S, doté d'Android (2.2.1).&lt;/p&gt;


&lt;p&gt;Ci-après quelques applications que j'utilise couramment dans les transports ou de chez moi.&lt;/p&gt;    &lt;h4&gt;Applications utilisées&lt;/h4&gt;


&lt;p&gt;Réseaux sociaux&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://seesmic.com/products/android"&gt;Seesmic&lt;/a&gt;&amp;nbsp;: l'Application ultime pour suivre vos tweets ou autres statuts Facebook,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.viadeo.android"&gt;Viadeo&lt;/a&gt;&amp;nbsp;: messages, activités de vos contacts,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.facebook.katana"&gt;Facebook&lt;/a&gt;&amp;nbsp;: pour les inconditionnels de FB, très bien faite,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.google.android.apps.reader"&gt;Google Reader&lt;/a&gt;&amp;nbsp;: vos flux RSS,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.electronchaos.AddLink"&gt;Trunk&lt;/a&gt; du site &lt;a href="http://trunk.ly"&gt;trunk.ly&lt;/a&gt; qui agrège vos liens Twitter et Facebook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;QRCode&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.google.zxing.client.android"&gt;Barcode scanner&lt;/a&gt;&amp;nbsp;: mais nécessite une connexion réseau,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=la.droid.qr"&gt;QR Droid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3G &amp;amp; utilitaires Smartphone&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.rechild.advancedtaskkiller"&gt;Open Advanced Task Kill&lt;/a&gt;&amp;nbsp;: permet de tuer d'une pression de bouton tout un ensemble d'applictions ouvertes,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=net.rgruet.android.g3watchdog"&gt;3G Watchdog&lt;/a&gt;&amp;nbsp;: statistiques très précises sur votre consommation Data 3G&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Utiles dans la vie (ou pas)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.lachainemeteo.androidapp"&gt;La chaîne météo&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.fabernovel.ratp"&gt;RATP Premium&lt;/a&gt;&amp;nbsp;: la seule application achetée mais rend de fiers services,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.google.android.apps.translate"&gt;Google Translate&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=net.bnpparibas.mescomptes"&gt;BNP Mes comptes&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=fr.snapp.fidme"&gt;FidMe&lt;/a&gt;&amp;nbsp;: enregistrer ses cartes de fidélités sous forme électronique,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.apksoftware.compass"&gt;Boussole&lt;/a&gt; si vous êtes perdus &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=net.androgames.level"&gt;Niveau&lt;/a&gt;&amp;nbsp;: un niveau à bulle,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=dgirard.radar"&gt;ABonEntendeur&lt;/a&gt;&amp;nbsp;: un avertisseur de radars&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.booking"&gt;Booking.com&lt;/a&gt;&amp;nbsp;: le site de réservations d'hôtels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Journaux&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.lemonde.androidapp"&gt;Le Monde&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.smartnsoft.metro"&gt;Metro France&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.backelite.vingtminutes"&gt;20 minutes&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.tf1.lci"&gt;TF1 News&lt;/a&gt;&amp;nbsp;: TF1 News de LCI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Photo / Vidéo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=ymst.android.fxcamera"&gt;FxCamera&lt;/a&gt;&amp;nbsp;: utilisez l'appareil photo du mobile et appliquez des effets,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.pixvision.studiobuddy"&gt;Studio Buddy Lite&lt;/a&gt;&amp;nbsp;: pour dessiner vos scènes "studio", mais j'attends avec impatience la version Android de &lt;a href="http://www.sylights.com/"&gt;Sylights&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.synology.dsphoto"&gt;DS Photo+&lt;/a&gt;&amp;nbsp;: pour les détenteurs d'un NAS Synology, visionne les photos stockées,&lt;/li&gt;
&lt;li&gt;Flickr&amp;nbsp;: bien qu'il existe &lt;a href="https://market.android.com/details?id=com.zmosoft.flickrcompanionfree"&gt;FlickrCompagnion&lt;/a&gt; je préfère le site &lt;a href="http://m.flickr.com"&gt;Flickr au format mobile&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.makotosan.vimeodroid"&gt;VimeoDroid Alpha&lt;/a&gt;&amp;nbsp;: version non officielle de la plateforme de partage &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Musique&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.synology.DSaudio"&gt;DS Audio&lt;/a&gt;&amp;nbsp;: écouter les morceaux de musique stockés sur votre NAS Synology&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IT&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=org.droidstack"&gt;DroidStack&lt;/a&gt;&amp;nbsp;: accéder aux sites de &lt;a href="http://stackexchange.com/sites"&gt;StackExchange&lt;/a&gt;, et aux questions / réponses,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.acrea.doodle.android"&gt;Doodle&lt;/a&gt;&amp;nbsp;: l'application du fameux site de prise de décisions &lt;a href="http://www.doodle.com"&gt;doodle&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;pour les stats. de mes blogs, l'application &lt;a href="https://market.android.com/details?id=org.piwik.mobile"&gt;Piwik&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://market.android.com/details?id=com.paypal.android.p2pmobile"&gt;PayPal&lt;/a&gt; et &lt;a href="https://market.android.com/details?id=com.ebay.mobile"&gt;eBay&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si vous en avez d'autres, n'hésitez pas à les partager en commentaire&amp;nbsp;!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=whMqcgOzimU:bAXconc5ig4: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/whMqcgOzimU" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Quelques-applications-Android#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Quelques-applications-Android#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/345</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Quelques-applications-Android</feedburner:origLink></item>
    
  <item>
    <title>Flickr, Galleriffic et jQuery</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/L1YUyG_vLZM/</link>
    <guid isPermaLink="false">urn:md5:7c709c42ebf082e18cd08a680a146238</guid>
    <pubDate>Mon, 11 Apr 2011 10:30:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Web[2.0]</category>
        <category>flickr</category><category>Galleriffic</category><category>jquery</category><category>json</category><category>jsonp</category><category>Yahoo pipes</category>    
    <description>&lt;p&gt;J'aime plusieurs choses dans la vie, et notamment Flickr, jQuery et un plugin bien sympa&amp;nbsp;:&amp;nbsp;&lt;a target="_blank" href="http://www.twospy.com/galleriffic/"&gt;Galleriffic&lt;/a&gt;. Ce dernier permet de concevoir des galeries photos assez facilement, à l'aide de balises&amp;nbsp;&lt;strong&gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&lt;/strong&gt;&amp;nbsp;qui contiennent des liens vers des images (miniatures et "grand format"). Amusons-nous à créer une&amp;nbsp;&lt;strong&gt;galerie Flickr&lt;/strong&gt;&amp;nbsp;avec recherche.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Flickr&lt;/strong&gt; propose dans son API, via un appel public (ie&amp;nbsp;: sans clé), d'explorer les dernières photos publiées pour un compte sous forme d'un &lt;a target="_blank" href="http://www.flickr.com/services/feeds/"&gt;flux&lt;/a&gt;, avec différents formats de retour&amp;nbsp;: RSS, Atom, Yaml, CSV, PHP ou &lt;strong&gt;JSON&lt;/strong&gt;. Le flux qui nous intéresse concerne les &lt;a target="_blank" href="http://www.flickr.com/services/feeds/docs/photos_public/"&gt;photos publiques pour un utilisateur&lt;/a&gt;, et optionnellement avec un filtre sur des &lt;strong&gt;tags&lt;/strong&gt; précis. Comme tout est dans la &lt;strong&gt;page HTML&lt;/strong&gt;, le retour souhaité sera du &lt;strong&gt;JSON &lt;/strong&gt;pour faciliter le traitement, tout ceci permettra&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;d'effectuer un &lt;strong&gt;appel Ajax&lt;/strong&gt; (JSON-P) vers &lt;strong&gt;Flickr&lt;/strong&gt; sur un &lt;em&gt;user id&lt;/em&gt; en filtrant si on le souhaite sur des &lt;em&gt;tags&lt;/em&gt; (séparés par des virgules),&lt;/li&gt;
&lt;li&gt;d'effectuer un &lt;strong&gt;appel Ajax&lt;/strong&gt; (JSON-P) vers &lt;strong&gt;Yahoo pipes&lt;/strong&gt; pour obtenir l&lt;em&gt;'userid&lt;/em&gt; de l&lt;em&gt;'username&lt;/em&gt; à rechercher (cf. ci-après),&lt;/li&gt;
&lt;li&gt;d'avoir en &lt;strong&gt;retour&lt;/strong&gt; la liste des photos au format &lt;strong&gt;JSON&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;de construire cette liste sous forme&lt;strong&gt; &amp;lt;li&amp;gt;image&amp;lt;/li&amp;gt;&lt;/strong&gt; afin de l'injecter dans Galleriffic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un exemple d'une URL du flux, pour l'utilisateur &lt;strong&gt;zorky&lt;/strong&gt; (mon compte flickr) et les tags &lt;strong&gt;paysages,sunset&lt;/strong&gt;&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;http://api.flickr.com/services/feeds/photos_public.gne?tagmode=any&amp;amp;format=json&amp;amp;tags=paysages,sunset&amp;amp;id=55936300@N00
&lt;/pre&gt;
&lt;p&gt;Malheureusement, Flickr demande l'&lt;strong&gt;userid&lt;/strong&gt;&amp;nbsp;(la chose barbare&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: 14px; white-space: pre; "&gt;&lt;em&gt;55936300@N00&lt;/em&gt;&lt;/span&gt;) du compte Flickr et il n'est pas possible de préciser directement son &lt;strong&gt;username&lt;/strong&gt;&amp;nbsp;(par exemple &lt;em&gt;zorky&lt;/em&gt;) dans l'API (qu'on utilise pour accéder à notre compte Flickr&amp;nbsp;: http://www.flickr.com/photos/&lt;em&gt;zorky&lt;/em&gt;), plus facile à retenir pour effectuer des requêtes vers Flickr.&lt;/p&gt;
&lt;p&gt;Heureusement, &lt;strong&gt;Yahoo pipes&lt;/strong&gt; est là, et j'ai pu trouver une &lt;em&gt;pipe&lt;/em&gt; très bien réalisée pour obtenir l'&lt;strong&gt;username&lt;/strong&gt; à partir d'un &lt;strong&gt;userid&lt;/strong&gt;&amp;nbsp;: j'ai honteusement fait une copie sur mon compte que &lt;a target="_blank" href="http://pipes.yahoo.com/pipes/pipe.info?_id=808f21fc64038d41cc72e50710884f4a"&gt;je vous livre&lt;/a&gt;. En gros, le &lt;em&gt;pipes&lt;/em&gt; effectue une requête Web sur la page http://www.flickr.com/photos/&lt;em&gt;zorky&lt;/em&gt;, repère une balise &lt;strong&gt;&amp;lt;link&amp;gt;&lt;/strong&gt; (pour les flux RSS/Atom) et prend grâce à une regexp, la partie derrière &lt;strong&gt;id=&lt;/strong&gt; qui contient l'&lt;em&gt;userid&lt;/em&gt; et nous le renvoie, ingénieux (il existe un site qui propose d'obtenir ce type d'information, mais n'implémente pas de service pour&amp;nbsp;: &lt;a target="_blank" href="http://idgettr.com/"&gt;http://idgettr.com&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Une fois tous ces éléments en notre possession, il ne reste plus qu'à coder notre page d'affichage de photos Flickr avec une recherche sur un &lt;strong&gt;compte&lt;/strong&gt; et avec la possibilité de filtrer sur des &lt;strong&gt;tags&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Vous pouvez essayer sur quelques comptes que j'aime bien&amp;nbsp;: le mien &lt;strong&gt;&lt;a target="_blank" href="http://olivier-duval.info/flickr/?id=zorky&amp;amp;tags=sunset,architecture"&gt;zorky&lt;/a&gt;&lt;/strong&gt;, et d'autres&amp;nbsp;: &lt;strong&gt;&lt;a target="_blank" href="http://olivier-duval.info/flickr/?id=lili_jpeg"&gt;lili_jpeg&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a target="_blank" href="http://olivier-duval.info/flickr/?id=tripax"&gt;tripax&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a target="_blank" href="http://olivier-duval.info/flickr/?id=eloyricardez"&gt;eloyricardez&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a target="_blank" href="http://olivier-duval.info/flickr/?id=loomax"&gt;loomax&lt;/a&gt;, &lt;a href="http://olivier-duval.info/flickr/?id=cedricduhez" target="_blank"&gt;cedricduhez&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=L1YUyG_vLZM:5nIdbylFznk: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/L1YUyG_vLZM" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Flickr-Galleriffic-jQuery-JSON-P#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Flickr-Galleriffic-jQuery-JSON-P#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/344</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Flickr-Galleriffic-jQuery-JSON-P</feedburner:origLink></item>
    
  <item>
    <title>QR code (ou flashcode pour le grand public)</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/FiaTvT0-nP4/</link>
    <guid isPermaLink="false">urn:md5:3f6382ea1b571e29042452d47359fd9a</guid>
    <pubDate>Wed, 09 Mar 2011 21:00:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Web[2.0]</category>
        <category>flashcode</category><category>qr</category><category>qr code</category>    
    <description>&lt;h4&gt;Préambule&lt;/h4&gt;


&lt;p&gt;C'est l'expérience utilisateur &lt;em&gt;hype&lt;/em&gt; du moment, mais surtout en raison de la croissance des Smartphone (iPhone, Android &amp;amp; co) promise en 2011&amp;nbsp;: le &lt;strong&gt;QR code&lt;/strong&gt; ou connu du grand public aussi sous l'appellation trompeuse de Flashcode (qui n'a pas le même résultat, autant de l'image que des droits d'utilisation).&lt;/p&gt;


&lt;p&gt;Un &lt;strong&gt;flashcode&lt;/strong&gt;  c'est quoi&amp;nbsp;? tout simplement une image (ou logo), carrée, avec des symboles bizarres dedans, qui peut être scannée (ou flashée dans le jargon) par l'appareil photo du Smartphone. Une fois scanné, le flashcode fournit une information qui peut être de plusieurs types&amp;nbsp;: un &lt;strong&gt;lien&lt;/strong&gt;, des &lt;strong&gt;coordonnées&lt;/strong&gt; (téléphone, adresse, email), une &lt;strong&gt;date d'évènement&lt;/strong&gt; (à la iCal), etc. nous en voyons de plus en plus sur les publicités, aux arrêts de bus, etc&lt;/p&gt;    &lt;p&gt;Par exemple le QR code suivant&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/?post/ http://chart.apis.google.com/chart?cht=qr&amp;amp;chs=120x120&amp;amp;chl=MECARD%3AN%3AOlivier+DUVAL%3BURL%3Ahttp%3A%2F%2Folivier-duval.info%3BEMAIL%3Aod%40olivier-duval.info%3BNOTE%3ACharg%C3%A9+de+projets+techniques+%2F+Web%3B%3B " alt="" /&gt;&lt;/p&gt;


&lt;p&gt;encode quelques coordonnées au format &lt;a href="http://www.nttdocomo.co.jp/english/service/imode/make/content/barcode/function/application/addressbook/index.html"&gt;MECARD&lt;/a&gt; (la vCard pour Smartphone) avec&amp;nbsp;: &lt;strong&gt;nom, prénom, url, email&lt;/strong&gt;, téléphone. Il suffit alors de scanner ce dernier avec son smartphone afin de m'ajouter aux contacts ou de m'envoyer un mail rapidement, ou encore de me passer un coup de fil pour me proposer une bière.&lt;/p&gt;


&lt;p&gt;L'avantage étant la simplicité, de ne pas avoir à recopier sur son smartphone l'information.&lt;/p&gt;


&lt;p&gt;Des imprimeurs l'ont bien compris et commencent à proposer des QR codes pour les &lt;a href="http://www.ooprint.fr/ooprint/dynamic/public/chooser.shtml?cat_label=CARTES-DE-VISITE-STANDARD-AVEC-LOGO-QR_0"&gt;cartes de visite&lt;/a&gt;. Egalement, &lt;a href="http://bit.ly"&gt;bit.ly&lt;/a&gt;, le service pour raccourcir les liens propose à chaque lien bit.ly le flashcode associé, il suffit d'ajouter &lt;strong&gt;.qrcode&lt;/strong&gt; derrière l'URL (par &lt;a href="http://bit.ly/fB90vm.qrcode"&gt;exemple&lt;/a&gt;) ou encore le service Google en postfixant l'extension &lt;strong&gt;.qr&lt;/strong&gt; aux urls, comme cette &lt;a href="http://goo.gl/maps/SO3v.qr"&gt;adresse&lt;/a&gt; Google maps.&lt;/p&gt;


&lt;h4&gt;Services en ligne&lt;/h4&gt;


&lt;p&gt;Quelques sites proposent de générer un qrcode&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://zxing.appspot.com/generator/"&gt;ZXing project&lt;/a&gt;, le plus abouti, permet de générer un qrcode un peu pour tout&amp;nbsp;: coordonnées, évènement, etc utilise l'API de Google chart QR et est le service en ligne d'une librairie Java, &lt;a href="http://code.google.com/p/zxing/wiki/BarcodeContents"&gt;leur Wiki&lt;/a&gt; est riche pour tout ce qui touche aux différents formats supportés,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.beqrious.com/qrcode/create"&gt;beQRious&lt;/a&gt;, similaire à ZXing mais en plus Web 2 dirons-nous&lt;/li&gt;
&lt;li&gt;&lt;a href="http://goqr.me"&gt;goQR&lt;/a&gt;&amp;nbsp;: la même chose mais offre la possibilité d'imprimer son QR code sur un t-shirt, une tasse, une carte de visite, plus fun &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/intl/fr-FR/apis/chart/docs/gallery/qr_codes.html"&gt;Google chart QR&lt;/a&gt;&amp;nbsp;: ce service (API) encode une entrée vers un qrcode, n'offre donc pas le moyen (comme les sites ci-dessus) de générer un qrcode selon un format déterminé (ie&amp;nbsp;: vCard, évènement). Comme tout service Google, c'est très bien documenté, et donne un &lt;a href="http://code.google.com/intl/fr-FR/apis/chart/docs/gallery/qr_codes.html#details"&gt;résumé&lt;/a&gt; sur le protocole QR et ses limitations, passionnant&amp;nbsp;!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Librairies et API&lt;/h4&gt;


&lt;p&gt;Au niveau services en ligne et API, mon préférence va vers &lt;a href="http://code.google.com/intl/fr-FR/apis/chart/docs/gallery/qr_codes.html"&gt;Google chart QR&lt;/a&gt; (pérenne, résistant), mais ne fournit que la forme brute&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;une entrée (chaîne en UTF-8),&lt;/li&gt;
&lt;li&gt;une image en sortie,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sans notion de schémas (MECARD, iCal, etc).&lt;/p&gt;


&lt;p&gt;Le QR code a &lt;strong&gt;40 versions&lt;/strong&gt;, plus vous monterez en version, plus de caractères pourront être encodés, en revanche, tous les smartphone ne pourront lire le qrcode (la version 4 est conseillée pour ces derniers), ceci est expliqué sur la &lt;a href="http://code.google.com/intl/fr-FR/apis/chart/docs/gallery/qr_codes.html#details"&gt;documentation&lt;/a&gt; Google (la version est automatiquement calculée selon la quantité de données transmise à l'API, le paramètre &lt;strong&gt;chl&lt;/strong&gt; qui contient l'entrée à QRcoder).&lt;/p&gt;


&lt;p&gt;Par contre, je n'ai pas réussi à maîtriser les marges blanches que Google ajoute pour un meilleur scan (par défaut 4), cela ne semble pas prendre en compte la marge que je lui demande (1 ou 2).&lt;/p&gt;


&lt;p&gt;Le qrcode de ce billet avec l'URL &lt;strong&gt;http://chart.apis.google.com/chart?cht=qr&amp;amp;chs=140x140&amp;amp;chl=http://blog.olivier-duval.info/?post/Flashcode-QR-code&amp;amp;chld=M&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=qr&amp;amp;chs=140x140&amp;amp;chl=http://blog.olivier-duval.info/?post/Flashcode-QR-code&amp;amp;chld=M" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;Il en existe d'autres&amp;nbsp;: &lt;a href="http://www.sparqcode.com/static/QRGenAPI"&gt;QRGen API&lt;/a&gt;, laisse un marqueur/pub sur l'image générée mais à l'avantage de mâcher le travail pour ce qui est de générer des MECARD ou autre qrcode d'évènement, de ce type&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://www.sparqcode.com/qrgen?qt=addr&amp;amp;fName=Olivier&amp;amp;lName=DUVAL&amp;amp;tel=0664&amp;amp;address=place&amp;amp;city=Boulogne-Billancourt&amp;amp;zip=90210&amp;amp;country=FR&amp;amp;email=zorky00%40gmail.com&amp;amp;url=blog.olivier-duval.info&amp;amp;width=140" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;Pour ce qui est de librairie (sous &lt;strong&gt;.NET&lt;/strong&gt;), il y a celle de &lt;a href="http://twit88.com/home/opensource/qrcode"&gt;Twit88&lt;/a&gt; (il faudra s'enregistrer pour télécharger les sources) ou bien directement les assemblys via &lt;a href="http://twit88.com/platform/projects/list_files/mt-qrcode"&gt;l'exécutable&lt;/a&gt;, prendre ensuite &lt;strong&gt;MessagingToolkit.QRCode.dll&lt;/strong&gt; du répertoire ~MessagingToolkit\MessagingToolkit-QRCode\QRCode. Librairie assez complète, contrôle de la version QR (4, 10, ...), du niveau de correction (M, ...) et simple d'utilisation (Encode, Decode).&lt;/p&gt;


&lt;h4&gt;Applications Smartphone&lt;/h4&gt;


&lt;p&gt;Pour Android (Galaxy S inside), j'aime bien &lt;a href="https://market.android.com/details?id=com.google.zxing.client.android&amp;amp;feature=search_result"&gt;Barcode scanner&lt;/a&gt; et &lt;a href="https://market.android.com/details?id=la.droid.qr&amp;amp;feature=search_result"&gt;QR droid&lt;/a&gt;, pour les iPhone ou autre BB et WP7, on trouvera certainement de bonnes applications sur les market place respectifs.&lt;/p&gt;


&lt;p&gt;Note à moi-même&amp;nbsp;: passer ce blog pour une lecture sur Smartphone &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;et comme on dit&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=qr&amp;amp;chs=230x230&amp;amp;chl=Les+hommes+naissent+libres+et+%C3%A9gaux%E2%80%A6+apr%C3%A8s+ils+se+d%C3%A9merdent.+-Jean+Yanne" alt="" /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=FiaTvT0-nP4:vdvao78foLg: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/FiaTvT0-nP4" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Flashcode-QR-code#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Flashcode-QR-code#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/343</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Flashcode-QR-code</feedburner:origLink></item>
    
  <item>
    <title>Techdays 2011, jour 2 : Choisir une techno d'accès aux données distantes, 45 projets en 45 mn, accélérer vos dévs. Web grâce aux frameworks, toolkits et applications, Code Contracts</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/saUdGEHk62g/</link>
    <guid isPermaLink="false">urn:md5:5920a7348be4859f17492359affff7df</guid>
    <pubDate>Fri, 11 Feb 2011 12:09:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>.NET</category>
        <category>mstechdays</category><category>techdays</category><category>techdays 2011</category>    
    <description>&lt;p&gt;2ème jour des Techdays 2011, quelques notes prises au cours des 4 sessions suivies de la journée.&lt;/p&gt;


&lt;p&gt;Au programme&amp;nbsp;: technos. d'accès aux données, 45 projets en 45 mn, accélérer vos développements Web, Code Contracts&lt;/p&gt;    &lt;h4&gt;Choisir une techno. d'accès aux données distantes&lt;/h4&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/Screenshot_-_11_02_2011___13_47_00.png" alt="techdays-odata" style="float:right; margin: 0 0 1em 1em;" title="techdays-odata, fév. 2011" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/davrous/"&gt;David Rousset&lt;/a&gt; et &lt;a href="http://blogs.msdn.com/b/stephe/"&gt;Stéphanie Hertrich&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Cette session était dédiée aux différentes solution d'accès aux données, par une énumération de différentes techniques disponibles selon ses besoins, de WCF à WCF RIA Services.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WCF :&lt;/strong&gt; découplage entre le service métier et sa publication et de comment on le publie (binaire, http, SOAP, REST, MSMQ, ...), c'est la technique la plus générique et donc la plus souple. La souplesse amène l'inconvénient de tout gérer manuellement (web.config / code) mais permet une maitrise complète des services et des données exposés. L'avantage est que, pour une même interface, de pouvoir modifier le format de retour (l'implémentation) par "simple" modification du &lt;strong&gt;web.config&lt;/strong&gt; en précisant des &lt;strong&gt;endpoints&lt;/strong&gt; différents.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ODATA :&lt;/strong&gt; exposer des données aux travers des URI HTTP (à la REST) sous la forme de flux &lt;strong&gt;Atom&lt;/strong&gt; ou &lt;strong&gt;JSON&lt;/strong&gt;. &lt;a href="http://www.odata.org/"&gt;odata&lt;/a&gt; propose un &lt;a href="http://www.odata.org/developers/odata-sdk"&gt;SDK&lt;/a&gt; dans une majorité de langages (C#, JS, ruby, ...).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Parmi les avantages de OData&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;les méthodes &lt;strong&gt;CRUD&lt;/strong&gt; sont natives,&lt;/li&gt;
&lt;li&gt;le fitrage des données s'effectue à la source et se symbolise par des &lt;a href="http://www.odata.org/developers/protocols/uri-conventions"&gt;paramètres dans l'URI&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;SDK multi langages,&lt;/li&gt;
&lt;li&gt;accessibles par des clients hétérogènes (ndr&amp;nbsp;: j'avais testé le client Silverlight &lt;a href="http://metasapiens.com/sesame/data-browser/"&gt;Sesame&lt;/a&gt; qu'on peut tester avec la source http://proagora.com/fr/odata/ mais il y en a d'&lt;a href="http://www.odata.org/consumers"&gt;autres&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WCF Data Services&lt;/strong&gt;&amp;nbsp;: surcouche à OData, une implémentation de OData mais pour .NET (wrapper). Cela apporte notamment un proxy Linq pour le requêtage, les &lt;a href="http://www.odata.org/developers/protocols/uri-conventions#FilterSystemQueryOption"&gt;URI des filtres&lt;/a&gt; sont directement traduites de l'expression Linq.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WCF RIA Services&lt;/strong&gt;&amp;nbsp;: principalement utilisé pour du développement Silverlight, il facilite l'accès aux données pour ce type d'application. La démo est accessible directement en ligne, une &lt;a href="http://bookclub.cloudapp.net/Default.aspx#/Home"&gt;application de bouquins&lt;/a&gt; (une version &lt;a href="http://bookclub.cloudapp.net/WCFRIA_jQueryHTML5.html"&gt;HTML5 / jQuery&lt;/a&gt; est également accessible). Une &lt;a href="http://blogs.msdn.com/b/davrous/archive/2010/11/10/how-to-open-a-wcf-ria-services-application-to-other-type-of-clients-review-of-the-initial-application-1-5.aspx"&gt;introduction&lt;/a&gt; et tout un &lt;a href="http://blogs.msdn.com/b/davrous/archive/tags/wcf+ria+services/"&gt;tas de billets sur RIA Services&lt;/a&gt; sont disponibles sur le blog de David.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;45 projets en 45 mn&lt;/h4&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.Screenshot_-_11_02_2011___13_47_40_sq.jpg" alt="techdays-opensource" style="float:left; margin: 0 1em 1em 0;" title="techdays-opensource, fév. 2011" /&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="http://www.doyoubuzz.com/bruno-michel"&gt;Bruno Michel&lt;/a&gt; nous propose en 45 mn de nous parler de 45 projets (OpenSource sous Windows) que je vais tenter de lister.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TortoiseGit&amp;nbsp;: le &lt;a href="http://code.google.com/p/tortoisegit/"&gt;client Windows&lt;/a&gt; pour accéder aux répertoires Git (portage du fameux &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sourceforge.net/projects/gitextensions/"&gt;GitExtensions&lt;/a&gt;&amp;nbsp;: GIT intégré à Windows Explorer&lt;/li&gt;
&lt;li&gt;&lt;a href="http://resume.github.com/"&gt;MyGitHub résumé&lt;/a&gt;&amp;nbsp;: site qui génère un CV suivant ses projets GitHub&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hackety-hack.com/"&gt;Hackety Hack&lt;/a&gt; où comment apprendre en ligne Ruby aux...enfants  &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyonrails.org/download"&gt;Rails installer&lt;/a&gt;&amp;nbsp;: installé un bundle Rails sous Windows&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt;&amp;nbsp;: interpréteur Ruby écrit en ...Ruby&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/schacon/showoff"&gt;ShowOff&lt;/a&gt;&amp;nbsp;: le powerpoint des geeks&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cloudhead.io/toto"&gt;toto&lt;/a&gt;&amp;nbsp;: le moteur de blog minimaliste&lt;/li&gt;
&lt;li&gt;&lt;a href="http://documentcloud.github.com/docsplit/"&gt;Doc Split&lt;/a&gt;&amp;nbsp;: programme Ruby d'extraction d'informations d'un document (texte, image, ..., meta données)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chiliproject.org/"&gt;ChiliProject&lt;/a&gt;&amp;nbsp;: application de gestion de projets Web&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lamsonproject.org/"&gt;Lamson&lt;/a&gt;&amp;nbsp;: serveur SMTP en Python&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pygments.org/"&gt;Pygments&lt;/a&gt;&amp;nbsp;: coloration syntaxique&lt;/li&gt;
&lt;li&gt;&lt;a href="http://learnboost.github.com/stylus/"&gt;Stylus&lt;/a&gt;&amp;nbsp;: framework d'aide à l'écriture de CSS&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zombie.labnotes.org/"&gt;Zombie.js&lt;/a&gt;&amp;nbsp;: utilise Node.js, permet de tester des applications Web&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cloud9ide.com/"&gt;Cloud9IDE&lt;/a&gt;&amp;nbsp;: l'IDE sur le nuage&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&lt;/a&gt;&amp;nbsp;: syntaxe alternative pour écrire du javascript&lt;/li&gt;
&lt;li&gt;&lt;a href="http://documentcloud.github.com/backbone/"&gt;Backbone.js&lt;/a&gt;&amp;nbsp;: framework MVC côté client&lt;/li&gt;
&lt;li&gt;&lt;a href="http://documentcloud.github.com/underscore/"&gt;Underscore.js&lt;/a&gt;&amp;nbsp;: ajout de 60 fonctions utiles à Javascript (&lt;strong&gt;map&lt;/strong&gt;, &lt;strong&gt;select&lt;/strong&gt;, &lt;strong&gt;bind&lt;/strong&gt;, ...)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mir.aculo.us/dom-monster/"&gt;DOM Master&lt;/a&gt;&amp;nbsp;: utilitaire javascript qui permet d'analyser les performances d'un site&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/intl/fr-FR/tv/web/lib/"&gt;Google TV Web UI&lt;/a&gt;&amp;nbsp;: bibliothèque javascript pour l'intégration aux TV&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vis.stanford.edu/protovis/"&gt;Protovis&lt;/a&gt;&amp;nbsp;: création de graphes en SVG en javascript (ne fonctionne pas donc jusqu'à IE 8)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://treesaverjs.com/"&gt;Treesaver&lt;/a&gt;&amp;nbsp;: framework de publication de magazines en ligne (HTML/CSS)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ie6nomore.com/"&gt;IE6 no more&lt;/a&gt;&amp;nbsp;: tuons IE 6&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jslint.com/"&gt;JS Lint&lt;/a&gt;&amp;nbsp;: assez connu, permet de vérifier que ce que l'on écrit en JS respecte les bonnes pratiques&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ucengine.org/"&gt;U.C. engine&lt;/a&gt;&amp;nbsp;: framework pour la création d'applications Web en temps réel (Erlang/JS)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://openkinect.org/wiki/Main_Page"&gt;OpenKinect&lt;/a&gt;&amp;nbsp;: les drivers opensource pour le fonctionnement de la Kinect sous Windows, Linux ou Mac.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://depthjs.media.mit.edu/"&gt;Depth.js&lt;/a&gt;&amp;nbsp;: interagir avec la Kinect à partir d'une page Web&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt;&amp;nbsp;: Mobile framework JS/HTML5&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bitcoin.org/"&gt;BitCoin&lt;/a&gt;&amp;nbsp;: la monnaie virtuelle en P2P&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.seeks-project.info/site/"&gt;Seeks&lt;/a&gt;&amp;nbsp;: moteur de recherche social, axé sur le P2P&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oneteam.im/"&gt;OneTeam&lt;/a&gt;&amp;nbsp;: outil de messagerie en ligne pour entreprise (ou pas)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://archipelproject.org/"&gt;Archipel&lt;/a&gt;&amp;nbsp;: virtualisation sur le Cloud&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt;&amp;nbsp;: outil de déploiement  en Ruby&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vagrantup.com/"&gt;Vagrant&lt;/a&gt;&amp;nbsp;: s'appuie sur Chef pour du déploiement multi-plaformes en VirtualBox&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;&amp;nbsp;: moteur NoSQL, orienté documents&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt;&amp;nbsp;: un autre moteur NoSQL, en clés/valeurs&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nicolasff/webdis"&gt;Webdis&lt;/a&gt;&amp;nbsp;: interface HTTP + JSON pour interroger Redis&lt;/li&gt;
&lt;li&gt;&lt;a href="http://duckduckgo.com/"&gt;DuckDuckGo&lt;/a&gt;&amp;nbsp;: un moteur de recherche qui ne garde aucune trace de votre passage&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.nilsjonsson.com/post/1076166313/introducing-htty-the-http-tty"&gt;htty&lt;/a&gt;&amp;nbsp;: une console pour requêter en HTTP&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SPORE/specifications"&gt;Spore&lt;/a&gt;&amp;nbsp;: spécifications d'API en JSON (middleware)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://neyric.github.com/webhookit/docs/index.html"&gt;WebHookIt&lt;/a&gt;&amp;nbsp;: web hooks (création de mashups, ...)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.zeromq.org/"&gt;0MQ&lt;/a&gt;&amp;nbsp;: message queue de bas niveau, orienté socket&lt;/li&gt;
&lt;li&gt;&lt;a href="http://synergy-foss.org/"&gt;Synergy&lt;/a&gt;&amp;nbsp;: outil très pratique qui permet de naviguer entre plusieurs stations (Linux, Mac, Windows) avec un seul clavier et une seule souris&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/gomingw/"&gt;GomingGW&lt;/a&gt;&amp;nbsp;: portage du langage Google &lt;strong&gt;GO&lt;/strong&gt; sous Windows&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iographica.com/"&gt;IOGraph&lt;/a&gt;&amp;nbsp;: inutile et donc indispensable (dixit Bruno)&amp;nbsp;: crée un graphe des mouvements de la souris que vous avez effectués durant la journée&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Les slides de la session &lt;a href="http://techdays-45-projects.heroku.com/#1"&gt;sont en ligne&lt;/a&gt;, vous avez 1 mn par slide &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt;&lt;/p&gt;


&lt;h4&gt;Accélérer vos développements Web grâce aux frameworks, toolkits et applications&lt;/h4&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.Screenshot_-_11_02_2011___15_05_41_m.jpg" alt="techdays-vstudio-2010" style="float:right; margin: 0 0 1em 1em;" title="techdays-vstudio-2010, fév. 2011" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/pierlag/"&gt;Pierre Lagarde&lt;/a&gt; et &lt;a href="http://blogs.msdn.com/b/davrous/"&gt;David Rousset&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Parcours de quelques outils, contrôles et autres trucs utiles pour le développement.&lt;/p&gt;


&lt;h3&gt;Outils Visual Studio (2010)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Razor&lt;/strong&gt;&amp;nbsp;: le nouveau &lt;a href="http://weblogs.asp.net/scottgu/search.aspx?q=razor&amp;amp;o=Relevance"&gt;moteur de rendu&lt;/a&gt; pour ASP.NET MVC 3, simplifie et rend surtout plus clair le code à l'intérieur du code HTML.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SP1&lt;/strong&gt; de VS 2010&amp;nbsp;: permet de changer le serveur web local pour basculer vers &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/06/28/introducing-iis-express.aspx"&gt;IIS Express&lt;/a&gt;. Egalement, la venue de &lt;strong&gt;HTML5&lt;/strong&gt; (target HTML5).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NuGet&lt;/strong&gt;&amp;nbsp;: &lt;a href="http://nuget.org/"&gt;nuget&lt;/a&gt; est un gestionnaire d'extensions sous VS, qui se base sur un référentiel en ligne. Il suffit, sur le clic droit du projet, d'utiliser le "Add librairie package référence" afin de rechercher et d'ajouter un module (le service pointe sur http://packages.nuget.org/v1/FeedService.svc/)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Elmah&lt;/strong&gt;&amp;nbsp;: &lt;a href="http://code.google.com/p/elmah/"&gt;libraire pour gérer les logs&lt;/a&gt;. Le simple ajout de cette extension (et de sa configuration dans le web.config) donne accès à la page &lt;strong&gt;elmha.axd&lt;/strong&gt; qui analyse ce qui s'est passé sur la page récemment consultée.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EF Coding First&lt;/strong&gt;&amp;nbsp;: on part des classes pour créer la base ou les tables, en Entity Framework.&lt;/li&gt;
&lt;li&gt;Addins VS avec Tools (Extension Manager)&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;       - &lt;a href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef/"&gt;Productivity Power Tools&lt;/a&gt; (un R# like)
       - &lt;a href="http://msdn.microsoft.com/en-us/library/bb126445.aspx"&gt;T4&lt;/a&gt; permet (à partir de New Item dans un projet) d'avoir des fichiers d'extension .tt qui générent du code à partir d'un modèle       
       - &lt;a href="http://www.jetbrains.com/resharper/"&gt;R#&lt;/a&gt; (payant) : le must have pour le développement (refactoring, vérification du code) sous Visual Studio&lt;/pre&gt;


&lt;h3&gt;Contrôles (HTML, Silverlight, Javascript)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AjaxControlToolKit&lt;/strong&gt;&amp;nbsp;: &lt;a href="http://www.asp.net/ajax/ajaxcontroltoolkit/samples/"&gt;librairie&lt;/a&gt; assez connue qui propose une multitude de contrôle près à l'emploi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MVCHtml5toolkit&lt;/strong&gt;&amp;nbsp;: fournit des &lt;a href="http://mvchtml5.codeplex.com/"&gt;Helpers&lt;/a&gt; pour HTML5 (en ASP.NET MVC) (ne pas oublier d'ajouter le namespace dans le web.config &lt;strong&gt;section razor&lt;/strong&gt; pour profiter de l'Intellisense)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Telerik MVC Extensions&lt;/strong&gt;&amp;nbsp;: &lt;a href="http://www.telerik.com/products/aspnet-mvc.aspx"&gt;Telerik&lt;/a&gt; offre gracieusement un ensemble de contrôle pour ASP.NET MVC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLEditor&lt;/strong&gt;&amp;nbsp;: un &lt;a href="http://premiumsoftware.net/cleditor/"&gt;éditeur WYSIWYG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Silverlight Control Toolkit&lt;/strong&gt;&amp;nbsp;: tout un ensemble de &lt;a href="http://silverlight.codeplex.com/"&gt;contrôles pour Silverlight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Telerik SL&lt;/strong&gt; (payant)&amp;nbsp;: &lt;a href="http://visualstudiogallery.msdn.microsoft.com/8797A84C-7670-4044-889B-913132E48014"&gt;RadControls Telerik&lt;/a&gt; propose une 40aine de contrôle Silverlight, où l'on peut en admirer des &lt;a href="http://demos.telerik.com/silverlight/"&gt;démos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript InfoVis Toolkit&lt;/strong&gt;&amp;nbsp;: disponible sous NuGet, cette &lt;a href="http://thejit.org/"&gt;librairie&lt;/a&gt; Javascript fournit des outils/API pour créer des graphes en ligne&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Galleriffic&lt;/strong&gt;&amp;nbsp;: &lt;a href="http://www.twospy.com/galleriffic/"&gt;librairie Javascript&lt;/a&gt; pour générer des galeries photos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;enfin, hors catégorie, &lt;a href="http://www.asp.net/webmatrix"&gt;WebMatrix&lt;/a&gt; est une plateforme de création de site Web intégrée, tout en un.&lt;/p&gt;


&lt;h4&gt;Code Contracts&lt;/h4&gt;


&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.Screenshot_-_11_02_2011___13_45_38_m.jpg" alt="techdays-codecontracts" style="float:left; margin: 0 1em 1em 0;" title="techdays-codecontracts, fév. 2011" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://gilles.tourreau.fr/"&gt;Gilles Tourreau&lt;/a&gt; et &lt;a href="http://amine.zemzemi.free.fr/"&gt;Amine Zemzemi&lt;/a&gt; de Winwise.&lt;/p&gt;


&lt;p&gt;&lt;a href="http://research.microsoft.com/en-us/projects/contracts/"&gt;Code Contracts&lt;/a&gt; permet de faire de la vérification par contrats des méthodes que l'on appelle via des &lt;strong&gt;pré&lt;/strong&gt; et &lt;strong&gt;post-conditions&lt;/strong&gt;, ainsi que les &lt;strong&gt;invariants&lt;/strong&gt; (test de l'état d'un objet, toujours appelé à la fin de chaque méthode). En version Visual Studio Premium, il inclut la vérification à la &lt;strong&gt;compilation&lt;/strong&gt; des contrats (static checker), mais rendu possible en ligne de commande (&lt;strong&gt;cccheck&lt;/strong&gt;) pour les autres version VStudio. Namespace .NET 4.0 à utiliser&amp;nbsp;: System.Diagnostics.Contracts&lt;/p&gt;


&lt;p&gt;Avant les CC, les vérifications des entrées ou sorties de méthodes s'effectuaient via des &lt;strong&gt;if(! condition) ArgumentException&lt;/strong&gt;, les CC introduisent une manière simple et évolutive d'effectuer des tests en entrée ou en sortie de méthode, tout en supportant l'héritage via les interfaces et attributs de classe.&lt;/p&gt;


&lt;p&gt;Les méthodes statiques disponibles de &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contract_methods.aspx"&gt;Contract&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Contract.Requires(test)&lt;/strong&gt;&amp;nbsp;: pré-condition&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contract.Ensures(test)&lt;/strong&gt;&amp;nbsp;: post-condition&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contract.Invariant(test)&lt;/strong&gt;&amp;nbsp;: invariant, appelée à chaque fin de méthodes de la classe&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contract.Assume(test)&lt;/strong&gt;&amp;nbsp;: pour du code existant, évite la vérification statique du code (version Premium de VS), cette vérification oblige aux tests des variables utilisées du type &lt;strong&gt;if(diviseur!=0) methode(diviseur) else erreur&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;utiliser &lt;strong&gt;Contract.EndContractBlock()&lt;/strong&gt; sur du code existant contenant des séquences &lt;strong&gt;if then throw&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ou par les attributs .NET &lt;strong&gt;ContractClass(typeof(interface))&lt;/strong&gt; (pour l'interface) / &lt;strong&gt;ContractClassFor(typeof(interface))&lt;/strong&gt; (pour la classe abstraite qui implémente l'interface), cela se traduit par d'injection des contrats dans les classes, permet l'utilisation de l'héritage, voir l'exemple d'application sur &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contractclassattribute.aspx"&gt;MSDN&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;CC&lt;/strong&gt; permet de générer 2 assemblies, 1 pour la production (A.dll) et 1 pour le développement (A.Contracts.dll), peut être utile si l'assembly est livrée à un intégrateur.&lt;/p&gt;


&lt;p&gt;Retrouvez toutes les années via le &lt;a href="http://blog.olivier-duval.info/?tag/techdays"&gt;tag techdays&lt;/a&gt; et d'autres résumés listés sur le &lt;a href="http://www.nicolasesprit.com/post/2011/02/13/TechDays-2011-Retour-sur-ces-3-jours-passes-au-Palais-des-Congres.aspx"&gt;blog de Nicolas Esprit&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=saUdGEHk62g:4SaoB61zi1Y: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/saUdGEHk62g" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Techdays-2011-jour-2-Choisir-une-techno-d-acces-aux-donnees-distantes-45-projets-en-45-mn%2C-accelerer-vos-devs-Web-grace-aux-frameworks-toolkits-et-applications-code-contracts#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Techdays-2011-jour-2-Choisir-une-techno-d-acces-aux-donnees-distantes-45-projets-en-45-mn%2C-accelerer-vos-devs-Web-grace-aux-frameworks-toolkits-et-applications-code-contracts#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/342</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Techdays-2011-jour-2-Choisir-une-techno-d-acces-aux-donnees-distantes-45-projets-en-45-mn%2C-accelerer-vos-devs-Web-grace-aux-frameworks-toolkits-et-applications-code-contracts</feedburner:origLink></item>
    
  <item>
    <title>Techdays 2011, jour 1 : plénière Cloud Computing, améliorer les performances Web, Javascript dans tous ses états, SEO : mythes et techniques, MongoDB et C#</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/T4sCLyGd1Sc/</link>
    <guid isPermaLink="false">urn:md5:1a21149a6b1480b52553e97e2e6798b7</guid>
    <pubDate>Thu, 10 Feb 2011 11:47:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>.NET</category>
        <category>ms techdays</category><category>techdays</category><category>techdays 2011</category>    
    <description>&lt;p&gt;Comme chaque année, direction le &lt;a href="http://goo.gl/maps/SO3v"&gt;Palais des congrés de Paris&lt;/a&gt; pour la grande messe Microsoft&amp;nbsp;: les &lt;a href="http://www.microsoft.com/france/mstechdays/"&gt;Techdays&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les techdays c'est 3 jours de sessions et conférences sur l'ensemble des technologies Microsoft, mais &lt;strong&gt;pas seulement&lt;/strong&gt;. Un bon moyen de sentir les nouvelles tendances, ou tout simplement de s'intéresser à des alternatives ou mettre le pied à l'étrier sur des technos. méconnues.&lt;/p&gt;
&lt;p&gt;Quelques notes prises au fil des jours, principalement orientées sur le développement / Web (le 1er jour étant dédié principalement au développement me concernant).&lt;/p&gt;    &lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.2011-02-08_14.14.38_m.jpg" alt="techdays-2011" style="display:block; margin:0 auto;" title="techdays-2011, fév. 2011" /&gt;&lt;/p&gt;
&lt;h4&gt;Keynote&lt;/h4&gt;
&lt;p&gt;Un peu déçu par la keynote sur la forme, moins rythmée, il manquait cette petite touche humouristique que l'équipe précédente apportait. Le thème principal était le &lt;strong&gt;Cloud computing&lt;/strong&gt;, en partant de sa définition pour aller sur un cas virtuel d'une startup (Contoso) de vente de voitures avec quelques démos qui couvraient les briques du Cloud computing&amp;nbsp;: &lt;a href="http://fr.wikipedia.org/wiki/Cloud_computing"&gt;IaaS, PaaS, SaaS&lt;/a&gt;&amp;nbsp;: infra, système et développement.&lt;/p&gt;
&lt;h4&gt;Améliorer les performances Web&amp;nbsp;: optimisation côté client&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.Screenshot_-_11_02_2011___09_55_06_m.jpg" alt="techdays-perf" style="float:right; margin: 0 0 1em 1em;" title="techdays-perf, fév. 2011" /&gt;&lt;/p&gt;
&lt;p&gt;Intervenant&amp;nbsp;: &lt;a href="http://twitter.com/#!/nhoizey"&gt;Nicolas Hoizey&lt;/a&gt;, directeur technique de Clever Age.&lt;/p&gt;
&lt;p&gt;Session axée sur les performances Web, ou l'accès aux pages Web sur les sites, sujet qui m'intéresse fortement. Très important car pour le e-commerce ou tout simplement pour les sites qui tirent leur profit des visites (Amazon, Google, MS, ...), une augmentation du temps de chargement, ou plutôt, d'affichage de la page peut créer une baisse de leur CA, chacun des acteurs nommés en ont fait l'amère expérience (de -0.76 à -2.8 % de baisse du CA).&lt;/p&gt;
&lt;p&gt;Même si les tuyaux augmentent (avec la fibre, nous atteignons des débit de 100 MBS), l'accès aux ressources des sites n'excèdent pas les 1 600 kbps, alors que les pages Web en 2010 pésent souvent jusqu'à 300 ko, poids courant de nos jours.&lt;/p&gt;
&lt;p&gt;En 2010, il y a eu le &lt;a href="http://webperf-contest.com/"&gt;Web Perf Contest&lt;/a&gt; (remporté par un français)&amp;nbsp;: l'exemple pris pour la session fût la &lt;a href="http://entries.webperf-contest.com/base-fnac-ftw/"&gt;Fnac&lt;/a&gt; qui a bien voulu jouer le jeu&amp;nbsp;: comment optimiser l'accès à leurs pages, avec quels outils&amp;nbsp;?&lt;/p&gt;
&lt;p&gt;Paradoxalement, et contrairement à l'idée reçue, le temps de la création de la page est composée par 5 % du serveur et 95 % pour le client (navigateur), il est donc important d'axer son optimisation sur ce dernier.&lt;/p&gt;
&lt;p&gt;Des extensions (&lt;a href="http://code.google.com/intl/fr-FR/speed/page-speed/"&gt;PageSpeed&lt;/a&gt;, &lt;a href="http://code.google.com/intl/fr-FR/webtoolkit/speedtracer/"&gt;Speed tracer&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt;) permettent d'analyser la cascade de chargement d'une page, afin de déterminer tous les éléments qui sont chargés, ainsi que le départ de leur chargement, et le démarrage du rendu (Start render) à afficher sur le navigateur. Un élément (image, css, JS, etc) est composé de plusieurs parties&amp;nbsp;: DNS, connexion TCP, attente réponse, chargement réponse, chaque partie peut être améliorée.&lt;/p&gt;
&lt;p&gt;On aura alors ce &lt;a href="http://www.webpagetest.org/result/110201_JE_d348c688caec64a71952f8bc81ef37c3/"&gt;type d'analyse&lt;/a&gt; (ou pour &lt;a href="http://www.webpagetest.org/result/110201_0V_46d3cb5f659c93fcfee3d664fa795ae3/"&gt;Amazon&lt;/a&gt;) afin de corriger les éléments perturbateurs. Le site &lt;a href="http://www.webpagetest.org/"&gt;Webpagetest&lt;/a&gt; donne la possibilité de tester n'importe quel site afin de simuler l'accès par IE et à partir de plusieurs zones du monde.&lt;/p&gt;
&lt;p&gt;Des solutions d'optimisation vont plus loin, tel que &lt;a href="http://code.google.com/intl/fr-FR/speed/page-speed/docs/module.html"&gt;mod_pagespeed&lt;/a&gt;, un module Apache qui filtre le flux et l'optimise à la volée ou encore &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee423534"&gt;Doloto&lt;/a&gt; de Microsoft au stade de Labs.&lt;/p&gt;
&lt;p&gt;Quelles actions entreprendre pour optimiser l'accès aux pages&amp;nbsp;?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;réduire la &lt;strong&gt;latence&lt;/strong&gt; en mettant en place un &lt;a href="http://en.wikipedia.org/wiki/Content_delivery_network"&gt;CDN&lt;/a&gt;, nécessaire lorsque l'audience est de niveau international,&lt;/li&gt;
&lt;li&gt;réduire les &lt;strong&gt;requêtes DNS&lt;/strong&gt;, en minimisant le nombre de domaines appelés&amp;nbsp;: &lt;a href="http://blog.olivier-duval.info/?post/www.lemonde.fr"&gt;Le Monde&lt;/a&gt; inclut pas moins 50 appels vers des sites externes (contenus, pubs), sorte de mashup mais où le navigateur effectue tout le travail,&lt;/li&gt;
&lt;li&gt;réduire le &lt;strong&gt;nombre de requêtes HTTP&lt;/strong&gt;&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;     - exploiter le &lt;strong&gt;cache du navigateur&lt;/strong&gt; (j'en avais présenté une introduction dans la  &lt;a href="http://blog.olivier-duval.info/?post/2007/12/19/developpement-web-optimisation"&gt;mise en place d'une syndication&lt;/a&gt;),
- configurer le serveur afin de cacher certains éléments (statiques du type images, css, js) en indiquant une &lt;strong&gt;date de péremption&lt;/strong&gt;,
- &lt;strong&gt;concaténer&lt;/strong&gt; les sources javascript et CSS,
- réduire le &lt;strong&gt;poids des images&lt;/strong&gt;,
- &lt;strong&gt;compresser&lt;/strong&gt; directement par le serveur Web en gzip le flux de données,&lt;/pre&gt;
&lt;p&gt;pour ces 4 derniers points, j'avais également écrit une introduction sur l'optimisation côté serveur et fichiers, lors de la &lt;a href="http://blog.olivier-duval.info/?post/Optimisations-Apache-sur-un-NAS-Synology-209II-deflate-cache-expires-et-APC"&gt;mise en place du blog sur le NAS Synology&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;     - &lt;strong&gt;combiner les images&lt;/strong&gt; sous forme de &lt;a href="http://www.w3schools.com/css/css_image_sprites.asp"&gt;sprites&lt;/a&gt;, qui consiste à envoyer une seule image contenant l'ensemble des icônes utiles et de la découper grâce au CSS au moment de leur affichage, technique qu'utilise Amazon, cela réduit le nombre de requêtes HTTP afin de ramener l'ensemble des images d'une page,
- &lt;strong&gt;cookie à supprimer&lt;/strong&gt; : servir les ressources statiques par un domaine sans cookie (ie &amp;amp; nb OD : via un serveur de cache via un sous-domaine par exemple, &lt;a href="http://wiki.nginx.org/Main"&gt;nginx&lt;/a&gt; peut être une alternative),
- le navigateur limite le nombre de téléchargements simultanées par domaine : 2 requête selon le standard HTTP/1.1. La solution étant d'utiliser des sous-domaines afin de répartir le stockage des éléments statiques, solution nommée &lt;a href="http://www.stevesouders.com/blog/2009/05/12/sharding-dominant-domains/"&gt;domains sharding&lt;/a&gt; , conseillé entre 2 à 4 domaines, pas plus,
- flush partiel du HTML&lt;/pre&gt;
&lt;h3&gt;Ressources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;retour sur le &lt;a href="http://braincracking.org/2011/01/10/concours-webperf-2010-les-bases/"&gt;concours de webperf&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;les présentations seront prochainement disponibles sur &lt;a href="http://www.slideshare.net/nhoizey"&gt;Slideshare&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;un groupe dédié aux performances Web sur &lt;a href="http://groups.diigo.com/group/web-performance"&gt;Diigo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les slides est disponibles sur le blog de &lt;a href="http://www.clever-age.com/veille/blog/ameliorer-les-performances-web-les-optimisations-cote-client.html"&gt;Clever Age&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Javascript dans tous ses états&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.Screenshot_-_11_02_2011___16_03_04_m.jpg" alt="techdays-js" style="float:left; margin: 0 1em 1em 0;" title="techdays-js, fév. 2011" /&gt;&lt;/p&gt;
&lt;p&gt;Session présentée par &lt;a href="http://www.doyoubuzz.com/bruno-michel"&gt;Bruno Michel&lt;/a&gt; (&lt;a href="http://af83.com/"&gt;AF83&lt;/a&gt;) et &lt;a href="http://twitter.com/#!/abolibibelot"&gt;Yann Schwartz&lt;/a&gt; (Polom).&lt;/p&gt;
&lt;p&gt;Un petit tour sur différentes librairies / frameworks en Javascript où pour certaines, j'avais déjà lu des billets sans en avoir vu des applications concrètes. Avouons-le, je n'aime pas particulièrement écrire du javascript. En revanche, son utilité n'est plus à démontrer et m'appuyer sur des librairies qui facilite son écriture, j'adore ça, découvrons en quelques unes.&lt;/p&gt;
&lt;h3&gt;node.js&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://nodejs.org/"&gt;Serveur javascript&lt;/a&gt; &amp;amp; asynchrone, efficace pour les I/O (non bloquantes), asynchrone. Cette librairie permet d'écrire des scripts très performants (pour de la &lt;a href="http://chat.nodejs.org/"&gt;messagerie instantanée&lt;/a&gt;, notifications en temps réelles, ...), tournant sur un seul thread, ce qui simplifie le développement car aucune synchronisation n'est nécessaire (ie&amp;nbsp;: lock de ressources).&lt;/p&gt;
&lt;p&gt;Des librairie sont fournies&amp;nbsp;: &lt;strong&gt;http&lt;/strong&gt;, &lt;strong&gt;socket&lt;/strong&gt;, &lt;strong&gt;fs&lt;/strong&gt;, qui facilitent grandement la programmation "bas niveau", ainsi que l'adjonction de &lt;a href="https://github.com/ry/node/wiki/modules"&gt;modules basés&lt;/a&gt; sur node.js.&lt;/p&gt;
&lt;h3&gt;Reactive Extensions rx.js&lt;/h3&gt;
&lt;p&gt;Le pendant de Rx .NET, &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896"&gt;rx.js&lt;/a&gt; est une librairie Javascript pour de la programmation asynchrone, à base d'évènements qui suit le même paradygme que sa version .NET&amp;nbsp;: Observable / Observer. Son lead developper est &lt;a href="http://weblogs.asp.net/podwysocki/"&gt;Matthew Podwysocki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La démo présentée était sur une recherche Wikipédia (via son &lt;a href="http://fr.wikipedia.org/w/api.php"&gt;API&lt;/a&gt; Opensearch avec retours au format JSON) avec des propositions en temps réel, où rx.js est bien adapté pour des appels Ajax (et asynchrone) via la fonction &lt;strong&gt;$.ajaxAsObservable&lt;/strong&gt;  et des méthodes chaînées (Select, Where, Min, Max, ...), "à la Linq".&lt;/p&gt;
&lt;h3&gt;CoffeeScript&lt;/h3&gt;
&lt;p&gt;Avouons le, écrire du Javascript n'est pas toujours simple et conduit souvent à des erreurs de syntaxes (; } ou ) non fermées), même si nous avons des outils (&lt;a href="https://addons.mozilla.org/fr/firefox/addon/firebug/"&gt;Firebug&lt;/a&gt; le bien nommé); qui n'est pas resté bloqué des heures sur un simple problème de syntaxe&amp;nbsp;?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript &lt;/a&gt; se propose de simplifier la syntaxe du langage Javascript, en enlevant tout ce qui nous pose problème habituellement&amp;nbsp;: les &lt;strong&gt;; {} ()&lt;/strong&gt;, les &lt;strong&gt;var&lt;/strong&gt;, les comparaisons (== et ===) etc. Assez orienté Ruby / Python, CoffeeScript interprète le code et traduit en Javascript standard ce dernier, et reste compatible avec les librairies les plus connues (jQuery, ...).&lt;/p&gt;
&lt;p&gt;Un portage Windows de CoffeeScript est en cours, hébergé sur le &lt;a href="https://github.com/abolibibelot/coffeescript-dotnet"&gt;github coffeescript-dotnet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le code des différentes démos est disponible sur le répertoire github &lt;a href="https://github.com/abolibibelot/Techdays2011_Javascript"&gt;Techdays 2011 Javascript&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;SEO&amp;nbsp;: mythes et technique&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/.Screenshot_-_11_02_2011___09_58_47_m.jpg" alt="techdays-seo" style="float:right; margin: 0 0 1em 1em;" title="techdays-seo, fév. 2011" /&gt;&lt;/p&gt;
&lt;p&gt;Par &lt;a href="http://ajblog.fr/"&gt;Aymeric Jacquet&lt;/a&gt;, la session était agrémentée par des conseils ou des choses à ne pas appliquer pour le référencement. Très orientée sur Google (en France, il tient plus de 90 % des parts de marché).&lt;/p&gt;
&lt;p&gt;2 visions de référenceurs&amp;nbsp;: les &lt;strong&gt;white hat&lt;/strong&gt; (appelés les "bisounours"), les &lt;strong&gt;black hat&lt;/strong&gt; (ou les "spammeurs") qui ont une vision diamétralement opposée&amp;nbsp;: le premier respecte les règles des guidelines Google, et se repose sur le contenu, un travail, donc, à plus long terme, tandis que l'autre se moque des guidelines, le lien est roi, et a donc une stratégie à court terme.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.wordle.net/"&gt;Wordle&lt;/a&gt; peut être utile pour s'assurer de la densité des mots dans un billet ou un article, important pour un meilleur référencement sur un sujet d'actualité par exemple.&lt;/p&gt;
&lt;p&gt;Quelques points pour améliorer son référencement Web&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le &lt;strong&gt;rédactionnel&lt;/strong&gt; est important,&lt;/li&gt;
&lt;li&gt;écrire pour les &lt;strong&gt;robots&lt;/strong&gt; ET les &lt;strong&gt;internautes&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;le &lt;strong&gt;PageRank&lt;/strong&gt; reste un indicateur de qualité,&lt;/li&gt;
&lt;li&gt;les &lt;strong&gt;meta keywords&lt;/strong&gt; ne sont pratiquement plus pris en compte par les moteurs, reste la &lt;strong&gt;meta description&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;ne pas hésiter à créer des liens vers les pages profondes, les plus importantes,&lt;/li&gt;
&lt;li&gt;le nom de domaine est important, cela peut valoir le coup d'en racheter des anciens qui ont déjà une bonne réputation pour faciliter le référencement, pour cela &lt;a href="http://www.sedo.com/fr/home/bienvenue/"&gt;Sedo&lt;/a&gt; peut nous aider,&lt;/li&gt;
&lt;li&gt;le format des URLs (&lt;strong&gt;titre&lt;/strong&gt;), le balisage HTML,&lt;/li&gt;
&lt;li&gt;la &lt;strong&gt;rapidité d'affichage&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;les &lt;strong&gt;ancres&lt;/strong&gt; internes ou externes,&lt;/li&gt;
&lt;li&gt;arrêter les "cliquez ici", "la suite ici", ...&lt;/li&gt;
&lt;li&gt;ne pas publier toutes les pages d'un site d'un coup (s'il y en a des milliers), Google n'aime pas ça, mettre des &lt;strong&gt;noindex&lt;/strong&gt; et libérer au fur et à mesure&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Ressources&lt;/h3&gt;
&lt;p&gt;La référence en SEO&amp;nbsp;: &lt;a href="http://www.seomoz.org/blog"&gt;Seomoz&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;MongoDB et C#&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://blog.olivier-duval.info/public/Screenshot_-_11_02_2011___15_56_28.png" alt="techdays-mongodb" style="float:left; margin: 0 1em 1em 0;" title="techdays-mongodb, fév. 2011" /&gt;&lt;/p&gt;
&lt;p&gt;Par &lt;a href="http://twitter.com/#!/abolibibelot"&gt;Yann Schwartz&lt;/a&gt; (Polom) et &lt;a href="http://www.rui.fr/"&gt;Rui Carvalho&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le &lt;strong&gt;NoSQL&lt;/strong&gt; (Not only SQL) est en vogue en ce moment, il était temps de goûter un peu de concret ou du moins un début d'approche par une session sur un moteur NoSQL&amp;nbsp;: &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les "bases" NoSQL répondent souvent à un souci de performance qu'il faut résoudre. D'une façon générale, avec un SGBDR classique, on met en place un cache (sous forme de "Hashtable") avec les données à afficher sur la page. Vient rapidement la problématique du cache réparti, dans le cas d'une ferme de frontaux, les bases NoSQL tentent alors d'y trouver une solution.&lt;/p&gt;
&lt;p&gt;Il existe plusieurs modèles de NoSQL&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sous forme de &lt;strong&gt;clés / valeurs&lt;/strong&gt;, on pensera à &lt;a href="http://memcached.org/"&gt;Memcached&lt;/a&gt; ou &lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;colonnes&lt;/strong&gt;&amp;nbsp;: &lt;a href="http://en.wikipedia.org/wiki/BigTable"&gt;BigTable&lt;/a&gt; (by Google), &lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;documents&lt;/strong&gt;&amp;nbsp;: &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; (moteur Erlang / Javascript - API RESTful), &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; (moteur C++ / Javascript) (ndr&amp;nbsp;: et j'ajouterais &lt;a href="http://ravendb.net/"&gt;RavenDB&lt;/a&gt;)&amp;nbsp;: "documents" décrits sous forme d'arborescence d'objets/valeurs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le NoSQL ne garantit pas autant de fonctionnalités qu'un SGBD, notamment le transactionnel / journalisation. Il faudra alors accepter un compromis sur les propriétés &lt;a href="http://fr.wikipedia.org/wiki/Transaction_informatique#Les_caract.C3.A9ristiques_ACID"&gt;ACID&lt;/a&gt; qu'apportent les SGBDR, les NoSQL sont basées sur le théorème de &lt;a href="http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP"&gt;CAP&lt;/a&gt; (Eric Brewer) qui se définit selon 3 principes&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C&lt;/strong&gt;onsistance / consistency&amp;nbsp;: tous les clients ont la même vue lorsqu'il y a des mises à jour,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt;vailability (Haute disponibilité)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P&lt;/strong&gt;artition-tolerance (Tolérant à la partition)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;et on ne peut garantir uniquement que &lt;strong&gt;2 de ces principes&lt;/strong&gt; à l'&lt;strong&gt;instant T&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mais sinon, à quoi ça sert&amp;nbsp;? en gros, avoir un cache à valeur ajoutée&amp;nbsp;: &lt;strong&gt;requêtable&lt;/strong&gt;, &lt;strong&gt;distribué&lt;/strong&gt; et &lt;strong&gt;persistant&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;Quelques particularités de MongoDB :&lt;/ins&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;facile à mettre en oeuvre,&lt;/li&gt;
&lt;li&gt;fonctionne sous &lt;a href="http://www.mongodb.org/display/DOCS/Quickstart+Windows"&gt;Windows&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;requêtes en JSON,&lt;/li&gt;
&lt;li&gt;orienté documents&amp;nbsp;: pour effectuer une analogie avec les SGBDR&amp;nbsp;: document (de même nature) = 1 ligne, documents stockés dans des collections (~tables),&lt;/li&gt;
&lt;li&gt;données stockées en BSON (binary JSON),&lt;/li&gt;
&lt;li&gt;supporte la montée en charge,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Drivers"&gt;drivers&lt;/a&gt; dans la majorité des langages,&lt;/li&gt;
&lt;li&gt;propose une console (&lt;strong&gt;mongo&lt;/strong&gt;) pour requêter (en &lt;strong&gt;javascript&lt;/strong&gt;) ou administrer,&lt;/li&gt;
&lt;li&gt;de nombreuses librairies dont &lt;a href="http://www.mongodb.org/display/DOCS/CSharp+Language+Center"&gt;C#&lt;/a&gt; (supportée 10gen, on peut lui adjoindre l'extension Linq grâce à &lt;a href="https://github.com/craiggwilson/fluent-mongo"&gt;fluent-mongo&lt;/a&gt;) ou la version &lt;a href="https://github.com/atheken/NoRM"&gt;C# alternative non officielle NoRM&lt;/a&gt; (support de Linq)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attention&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les documents sont limités à 4 Mo&lt;/li&gt;
&lt;li&gt;flush toutes les 60 s sur le disque&lt;/li&gt;
&lt;li&gt;pas de journalisation (prévue pour la 1.8)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;ins&gt;exemples de requêtage :&lt;/ins&gt;&lt;/p&gt;
&lt;pre&gt;$ db.get.CollectionNames()
$ db.help()
$ db.createCollection("counter")
$ db.user.save({name:"valeur", value:10000})
$ db.user.count()
$ db.user.find({"value":{$gt:9999}}).sort({value:-1}).limit(3)
$ db.user.remove() // truncate
$ db.user.drop() // delete
&lt;/pre&gt;
&lt;p&gt;Session très intéressante pour les applications possibles de NoSQL et la compréhension des grands principes, cela donne des idées. A ce que je retiens, pour l'instant, cela peut surtout servir à mettre en place du cache, lorsque l'on souhaite mettre à plat des données pour un affichage (sur une page).&lt;/p&gt;
&lt;p&gt;A tester&amp;nbsp;!&lt;/p&gt;
&lt;p&gt;Le &lt;a href="http://www.rui.fr/news/techdays-2011-videos-asp-net-mvc3-et-mongodb/2011/03/17/"&gt;webcast&lt;/a&gt; ou les &lt;a href="https://bitbucket.org/rhwy/techdays-paris-2011-mongodb-csharp"&gt;sources de la démo&lt;/a&gt; sont en ligne.&lt;/p&gt;
&lt;h3&gt;Ressources&lt;/h3&gt;
&lt;p&gt;Sources de la session disponibles sur le &lt;a href="https://bitbucket.org/rhwy/techdays-paris-2011-mongodb-csharp"&gt;bitbucket de Rui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Retrouvez toutes les années via le &lt;a href="http://blog.olivier-duval.info/?tag/techdays"&gt;tag techdays&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=T4sCLyGd1Sc:Meqbrvf86NY: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/T4sCLyGd1Sc" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Techdays-2011-jour-1-pleniere-Cloud-Computing-ameliorer-les-performances-Web-Javascript-dans-tous-ses-etats-SEO-mythes-et-techniques-MongoDB-et-Csharp#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Techdays-2011-jour-1-pleniere-Cloud-Computing-ameliorer-les-performances-Web-Javascript-dans-tous-ses-etats-SEO-mythes-et-techniques-MongoDB-et-Csharp#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/341</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Techdays-2011-jour-1-pleniere-Cloud-Computing-ameliorer-les-performances-Web-Javascript-dans-tous-ses-etats-SEO-mythes-et-techniques-MongoDB-et-Csharp</feedburner:origLink></item>
    
  <item>
    <title>Bonne résolutions 2011 : quelques mises à jour de nos outils sont à prévoir</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/rIK9cIScD-g/</link>
    <guid isPermaLink="false">urn:md5:34123f84ddf90de07df89a17f9c6b7f0</guid>
    <pubDate>Thu, 06 Jan 2011 08:30:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Opensource</category>
        <category>castle windsor</category><category>dokuwiki</category><category>nhibernate</category><category>razor</category>    
    <description>&lt;p&gt;Quelques sorties de nouvelles versions, programmons vite les mises à jour&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ORM&amp;nbsp;: &lt;a href="http://zvolkov.com/blog/post/2010/12/04/Whats-new-in-NHibernate-30-GA.aspx" hreflang="en"&gt;NHibernate 3.0&lt;/a&gt;&amp;nbsp;: Linq, Lazy property, memcached, QueryOver API pour les requêtes &lt;strong&gt;Criteria&lt;/strong&gt;, un billet suivra sur certaines des nouveautés,&lt;/li&gt;
&lt;li&gt;IoC&amp;nbsp;: &lt;a href="http://stw.castleproject.org/Windsor.MainPage.ashx"&gt;Castle Windows 2.5.2&lt;/a&gt;&amp;nbsp;: .NET 4.0, réduction à seulement 2 assembly (au lieu de 4), et d'autres &lt;a href="http://stw.castleproject.org/Windsor.Windsor_25_release_notes.ashx"&gt;améliorations&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Wiki&amp;nbsp;: &lt;a href="http://www.dokuwiki.org/changes#release_2010-11-07_anteater"&gt;dokuWiki Anteater&lt;/a&gt;&amp;nbsp;: améliorations de l'API XmlRPC (ajout de la recherche plein texte dans les pages du Wiki), recherche sur le Wiki plus pertinente,&lt;/li&gt;
&lt;li&gt;il me plait bien ce moteur de rendu &lt;strong&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx"&gt;Razor&lt;/a&gt;&lt;/strong&gt; d'&lt;a href="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx"&gt;ASP.NET MVC 3 R2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y'a plus qu'à.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=rIK9cIScD-g:OldROeCDTTE: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/rIK9cIScD-g" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/maj-nhibernate-castle-windsor-ioc-dokuwiki#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/maj-nhibernate-castle-windsor-ioc-dokuwiki#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/340</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/maj-nhibernate-castle-windsor-ioc-dokuwiki</feedburner:origLink></item>
    
  <item>
    <title>Bonne année 2011 !</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/E7Mj-Xe-s4E/</link>
    <guid isPermaLink="false">urn:md5:5c271a9c00edcb85a95079726085f72c</guid>
    <pubDate>Sat, 01 Jan 2011 17:30:00 +0100</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Blog (attitude)</category>
        <category>2011</category><category>bonne année</category><category>voeux</category>    
    <description>&lt;p&gt;&lt;strong&gt;Santé, travail, amour et prospérité, que tous vos souhaits et projets se réalisent en 2011 ou après &lt;img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /&gt; !&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;réalisation d'une talentueuse collègue ayant des compétences distinctives en graphisme &amp;amp; co (...)&lt;/p&gt;


&lt;p&gt;&lt;img src="http://farm6.static.flickr.com/5121/5312537044_3de023a961_d.jpg" alt="" /&gt;&lt;/p&gt;


&lt;p&gt;sinon de ma composition, euh kitch non ?;)&lt;/p&gt;


&lt;p&gt;&lt;img src="http://farm6.static.flickr.com/5048/5311864273_9b367a995e_d.jpg" alt="" /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=E7Mj-Xe-s4E:XZCh03nCtL8: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/E7Mj-Xe-s4E" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/Bonne-annee-2011-voeux#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/Bonne-annee-2011-voeux#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/339</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/Bonne-annee-2011-voeux</feedburner:origLink></item>
    
  <item>
    <title>MS Days 2010</title>
    <link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/5ro1RzAdzBY/</link>
    <guid isPermaLink="false">urn:md5:7b19a8a169e956cd58ecfc1386af5dc4</guid>
    <pubDate>Mon, 11 Oct 2010 12:51:00 +0200</pubDate>
    <dc:creator>zorky</dc:creator>
        <category>Divers</category>
        <category>2010</category><category>microsoft</category><category>ms days</category><category>séminaire</category>    
    <description>&lt;p&gt;Les &lt;strong&gt;6 &amp;amp; 7 octobre 2010&lt;/strong&gt; ont eu lieu les MS Days 2010 (ou rencontres techniques), évènement qui parcourt toute la France sur les nouveautés de l'éditeur. C'est toujours l'occasion d'avoir un aperçu des nouveautés ou innovations côté Microsoft et de leur application côté code (ie&amp;nbsp;: dans Visual Studio / C#). Cet évènement n'est qu'un préambule à l'évènement de l'année, les &lt;a href="http://www.microsoft.com/france/mstechdays/default.aspx"&gt;techdays 2011&lt;/a&gt;, qui aura lieu du 8 au 10 février 2011 au Palais des congrés de Paris.&lt;/p&gt;


&lt;p&gt;Quelques notes de la 1ère journée.&lt;/p&gt;    &lt;h3&gt;Windows Phone 7&lt;/h3&gt;


&lt;p&gt;Pas tout à fait le lancement de Windows Phone 7, qui devrait avoir lieu dans les semaines qui suivent, mais au moins quelques annonces et une démo  de ce smartphone.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avant même d'ouvrir son smartphone (ie&amp;nbsp;: accès à son profil via son mot de passe), bon nombre d'informations sont données sur l'écran&amp;nbsp;: rendez-vous, # de messages reçus, etc&lt;/li&gt;
&lt;li&gt;hubs&amp;nbsp;: contrairement à ses concurrents (iPhone, Android, Blackberry), l'écran d'accueil de WP7 est organisé un peu différemment, le parti pris de partir sur des "hubs" ou sorte de catégories à thèmes, avec en plus, des raccourcis vers les applications que vous utilisez le plus (messagerie, réseaux sociaux), le tout est personnalisable,&lt;/li&gt;
&lt;li&gt;Office intégré au smartphone = rapidité,&lt;/li&gt;
&lt;li&gt;résolument orienté réseaux sociaux et la plateforme Windows Live (apparemment tout passe par Live pour publier, pas très avantageux me concernant),&lt;/li&gt;
&lt;li&gt;MarketPlace&amp;nbsp;: la plateforme d'applications Microsoft. Seul bémol à mon avis&amp;nbsp;: pour les applications métiers, d'entreprise, obligation de passer par cette plateforme pour installer une application, ce qui va en refroidir plus d'un je pense (même si l'envrionnement de dév. est bien conçu avec une simulation du smartphone)&lt;/li&gt;
&lt;li&gt;offre Orange Business Services avec un exemple de tarif sur 24 mois&amp;nbsp;: 19,90 € HT (sans la voix qu'il faudra rajouter en sus)&amp;nbsp;: 100 SMS, 3G+, Wifi, option mails, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'ergonomie du WP7 m'a plu, en tout cas, lors de la démo par le speaker. Le smartphone répond bien et est réactif.&lt;/p&gt;


&lt;h3&gt;Azure&amp;nbsp;: outils et bonnes pratiques&lt;/h3&gt;


&lt;p&gt;Speaker&amp;nbsp;: &lt;a href="http://blog.couzy.com/"&gt;Pierre Couzy&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Windows Azure se décline sur 3 axes&amp;nbsp;: un environnement applicatif (plateforme), du stockage (Blob), de la base de données (SQL Azure), avec une facturation selon l'usage, et un avantage pour absorber une charge ponctuelle.&lt;/p&gt;


&lt;p&gt;Parmi les "briques" qu'offre Azure, il y a la &lt;strong&gt;fédération d'identités&lt;/strong&gt;. Bien souvent, dans toute organisation, lorsque nous avons une multitude de plateformes, sites, applications, vient très rapidement la problématique de la sécurité et de l'identité (compte) d'accès à une application (et je peux en témoigner). Azure propose de simplifier tout cela en proposant un fournisseur d'identités qui s'intercale entre les différents systèmes, on retrouvera plusieurs sources de comptes possible&amp;nbsp;: &lt;strong&gt;AD&lt;/strong&gt;, Web (b&lt;strong&gt;ases de données&lt;/strong&gt;), comptes tiers (Free, Google, ...), &lt;strong&gt;&lt;a href="http://blog.olivier-duval.info/?q=openid"&gt;OpenID&lt;/a&gt;&lt;/strong&gt;, ...&lt;/p&gt;


&lt;p&gt;Concernant les &lt;strong&gt;données&lt;/strong&gt;, plusieurs scénarios d'accès&amp;nbsp;: JSON &amp;amp; AtomPub, ou directement sur SQL.&lt;/p&gt;


&lt;p&gt;Pour le développement, sous Visual Studio 2010, plusieurs composants sont disponibles avec le modèle projet &lt;em&gt;Cloud Service&lt;/em&gt;, ce dernier paramètre les éléments à déployer sur le Cloud&amp;nbsp;: nombre de VM, taille, etc sous forme d'un package ZIP à télécharger sur le portail Azure. Il est possible, via directement Visual Studio (cf. le &lt;a href="http://www.microsoft.com/windowsazure/"&gt;SDK&lt;/a&gt;) de déployer son projet, grâce à un certificat qui permet de signer le package.&lt;/p&gt;


&lt;p&gt;Compter environ &lt;strong&gt;15 mn&lt;/strong&gt; à chaque déploiement (préparation des VM, calcul de l'éloignement des machines dans le data center, ...). Des éditeurs de solutions externes proposent également de l'outillage&amp;nbsp;: &lt;a href="http://www.cerebrata.com/products/cloudstoragestudio/"&gt;Cloud Storage Studio&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Compte tenu du temps de déploiement, le développement pourra s'effectuer sur un environnement local (&lt;a href="http://msdn.microsoft.com/en-us/library/dd179455.aspx"&gt;Dev. Fabric&lt;/a&gt;) de simulation d'Azure, avec le gros avantage de pouvoir débugguer (cf. les &lt;a href="http://msdn.microsoft.com/en-us/library/ee923628.aspx"&gt;différences&lt;/a&gt; entre les 2 modes)&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Quelques préconisations :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pas de stockage sur le &lt;em&gt;FileSystem&lt;/em&gt;, le &lt;strong&gt;BlobContainer&lt;/strong&gt; est là pour ça, le système de fichiers est volatile, on l'utilisera que pour du temporaire (génération d'une image avant de l'envoyer par exemple). il y a également la possibilité de monter un Blob VHD qui sera visible comme un stockage local.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;débuggage sur Azure&amp;nbsp;: via &lt;strong&gt;Trace&lt;/strong&gt; avec le provider Azure Diagnostic Monitor ou l'outil Azure Diagnostic Manager sur des sources (Eventviewer, IIS logs, ...), ou &lt;a href="http://msdn.microsoft.com/fr-fr/library/dd264915.aspx"&gt;IntelliTrace&lt;/a&gt; de la version &lt;strong&gt;Ultimate&lt;/strong&gt; de VStudio 2010.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=413e88f8-5966-4a83-b309-53b7b77edf78&amp;amp;displaylang=en"&gt;Windows Azure Plateform Training Kit&lt;/a&gt; rassemble tous les scénarios possibles afin de s'en inspirer.&lt;/p&gt;


&lt;h3&gt;Quoi de 9 dans IE&amp;nbsp;?&lt;/h3&gt;


&lt;p&gt;Speaker&amp;nbsp;: &lt;a href="http://blogs.msdn.com/b/davrous/"&gt;David Rousset&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Après un bref historique d'IE (1995&amp;nbsp;: IE 1, 2000&amp;nbsp;: IE 6 avec XP, 2004&amp;nbsp;: SP 2 IE 6, 2009&amp;nbsp;: IE 8 avec Windows 7, 2010&amp;nbsp;: IE 9 CTP, ne sera pas disponible sous XP), et de chiffres divers (25 % des migrations IE 6 -&amp;gt; IE 8/9 ne sont pas fonctionnelles à cause des ActiveX, 87 %  des utilisateurs lancent une application depuis la barre des tâches, 4 % utilisent les favoris, - de 10 % utilisent plus de 8 onglets), quelques éléments sur les nouveautés et des démos de benchmarking ont été montrées, afin de démontrer les nouveautés en termes d'accélération matérielle (GPU).&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Ergonomie / usage :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 seule barre de navigation et de recherche, au même titre que la concurrence, la tendance est à la simplicité et l'épuration de la barre de navigation,&lt;/li&gt;
&lt;li&gt;possibilité de sortir les onglets du navigateur,&lt;/li&gt;
&lt;li&gt;un onglet peut être épinglé sur la barre de tâches (un menu contextuel peut être personnalisé selon le site, vers une URL, pour écrire directement un twitt par exemple),&lt;/li&gt;
&lt;li&gt;gestionnaire de téléchargements revu,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;about:Tabs&lt;/strong&gt;&amp;nbsp;: les sites les plus populaires,&lt;/li&gt;
&lt;li&gt;gestion et prévention concernant les add-ons (temps pris par ces derniers à l'ouverture d'un onglet)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;HTML 5 / CSS 3 :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;balises &amp;lt;video&amp;gt; (codec H264, VP8 selon les navigateurs), &amp;lt;canvas&amp;gt; (bitmap)&lt;/li&gt;
&lt;li&gt;CSS3&amp;nbsp;: animations, coins arrondis, opacité, ...&lt;/li&gt;
&lt;li&gt;SVG 1.1&amp;nbsp;: format vectoriel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;dans les 6 prochains mois, ce qui intéresse les développeurs&amp;nbsp;: CSS 3&amp;nbsp;: 76 % , HTML5 vidéo&amp;nbsp;: 68 %&lt;/p&gt;


&lt;p&gt;MS a fourni 7 200 jeux de tests pour CSS 2.1 / HTML 4, il en fournira 60 000 pour CSS 3 / HTML 5. Comparativement, le test &lt;a href="http://acid3.acidtests.org/"&gt;ACID 3&lt;/a&gt; ne représente que 100 tests, et pour certains, ils ne seront pas implémentés au final. ACID 3 est plus marketing qu'un véritable test.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;les développeurs n'ont pas été oubliés&amp;nbsp;: la barre &lt;strong&gt;F12&lt;/strong&gt; permet une multitude d'aides au développement (CSS,HTML,debug, JS,...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://ie.microsoft.com/testdrive/"&gt;Démos&lt;/a&gt; de benchmarking&amp;nbsp;: &lt;a href="http://ie.microsoft.com/testdrive/Performance/AmazonShelf/Default.html"&gt;Amazon Shelf&lt;/a&gt;, &lt;a href="http://ie.microsoft.com/testdrive/Performance/10FlickrExplorer/Default.html"&gt;Flickr Explorer&lt;/a&gt;, &lt;a href="http://www.nevermindthebullets.com"&gt;NeverMind the Bullets&lt;/a&gt;, &lt;a href="http://ie.microsoft.com/testdrive/Performance/FishIE%20tank/Default.html"&gt;FishIE Tank&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;moteur Javascript&lt;/strong&gt;&amp;nbsp;: le moteur (&lt;a href="http://www.thewindowsclub.com/microsofts-new-javascript-engine-codenamed-chakra-for-internet-explorer-9"&gt;Chakra&lt;/a&gt;) a été revu afin d'exploiter au maximum le multi-coeurs des processeurs actuels&amp;nbsp;: compilation à la volée du script sur un coeur puis exécution.&lt;/p&gt;


&lt;p&gt;Il reste possible d'utiliser le moteur IE 8 dans IE 9. Il est conseillé d'utiliser la &lt;em&gt;technical preview&lt;/em&gt;  afin de ne pas remplacer Internet Explorer installé sur la machine en cours.&lt;/p&gt;


&lt;p&gt;Toutes les informations sur le &lt;a href="http://blogs.msdn.com/b/iefrance/"&gt;blog d'IE FR&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Applications d'entreprise avec .NET 4 et Silverlight 4&lt;/h3&gt;


&lt;p&gt;Speaker&amp;nbsp;: &lt;a href="http://blogs.msdn.com/b/mitsu/"&gt;Mitsu Furuta&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Evolutions de l'accès aux données&amp;nbsp;: ADO (connexion directe à la base), Web services (WCF, apporte une couche d'abstraction), standardisation avec RSS et REST (+CRUD), requetage avec Linq, du syncrhone à l'asynchrone.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;RIA Services :&lt;/strong&gt; framework utilisé avec Silverlight pour l'accès aux données, propriétaire dans le sens où le framework génère la partie cliente (ie&amp;nbsp;: proxy), intégré dans &lt;a href="http://www.silverlight.net/getstarted/silverlight-4/"&gt;SL Tools 4.0&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Reactive Framework :&lt;/strong&gt; &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt; est un framework dédié à Silverlight / WPF, il permet de gérer l'asynchronisme tout en écrivant séquentiellement du code (et non plus des délégués à n'en plus finir avec &lt;em&gt;OnComplete&lt;/em&gt;), ce qui rend le code plus lisible. Une version Javascript est aussi développé (intéressant pour les appels Ajax&amp;nbsp;! ;))&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=5ro1RzAdzBY:WcAgp6RVe6A: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/5ro1RzAdzBY" height="1" width="1"/&gt;</description>
    
    
    
          <comments>http://blog.olivier-duval.info/?post/MS-Days-2010#comment-form</comments>
      <wfw:comment>http://blog.olivier-duval.info/?post/MS-Days-2010#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.olivier-duval.info/?feed/atom/comments/337</wfw:commentRss>
      <feedburner:origLink>http://blog.olivier-duval.info/?post/MS-Days-2010</feedburner:origLink></item>
    
  <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>
    
</channel>
</rss>

