<?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:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns: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>péripéties d'un passionné du Web, .NET &amp; more</description>
	<lastBuildDate>Thu, 19 Apr 2012 08:41:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</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/xhloZsfNYiE/</link>
		<comments>http://blog.olivier-duval.info/quelques-applications-android/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 14:40:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog (attitude)]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[applications]]></category>
		<category><![CDATA[apps]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=338</guid>
		<description><![CDATA[<p>Je suis devenu un fan inconditionnel du Smartphone, et particulièrement du Galaxy S, doté d'Android (2.2.1).</p> <p>Ci-après quelques applications que j'utilise couramment dans les transports ou de chez moi.</p> <a class="more-link" href="http://blog.olivier-duval.info/quelques-applications-android/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je suis devenu un fan inconditionnel du Smartphone, et particulièrement du Galaxy S, doté d&#8217;Android (2.2.1).</p>
<p>Ci-après quelques applications que j&#8217;utilise couramment dans les transports ou de chez moi.</p>
<p><span id="more-338"></span></p>
<h4>Applications utilisées</h4>
<p>Réseaux sociaux</p>
<ul>
<li><a href="http://seesmic.com/products/android">Seesmic</a>&nbsp;: l&#8217;Application ultime pour suivre vos tweets ou autres statuts Facebook,</li>
<li><a href="https://market.android.com/details?id=com.viadeo.android">Viadeo</a>&nbsp;: messages, activités de vos contacts,</li>
<li><a href="https://market.android.com/details?id=com.facebook.katana">Facebook</a>&nbsp;: pour les inconditionnels de FB, très bien faite,</li>
<li><a href="https://market.android.com/details?id=com.google.android.apps.reader">Google Reader</a>&nbsp;: vos flux RSS,</li>
<li><a href="https://market.android.com/details?id=com.electronchaos.AddLink">Trunk</a> du site <a href="http://trunk.ly">trunk.ly</a> qui agrège vos liens Twitter et Facebook</li>
</ul>
<p>QRCode</p>
<ul>
<li><a href="https://market.android.com/details?id=com.google.zxing.client.android">Barcode scanner</a>&nbsp;: mais nécessite une connexion réseau,</li>
<li><a href="https://market.android.com/details?id=la.droid.qr">QR Droid</a></li>
</ul>
<p>3G &amp; utilitaires Smartphone</p>
<ul>
<li><a href="https://market.android.com/details?id=com.rechild.advancedtaskkiller">Open Advanced Task Kill</a>&nbsp;: permet de tuer d&#8217;une pression de bouton tout un ensemble d&#8217;applictions ouvertes,</li>
<li><a href="https://market.android.com/details?id=net.rgruet.android.g3watchdog">3G Watchdog</a>&nbsp;: statistiques très précises sur votre consommation Data 3G</li>
</ul>
<p>Utiles dans la vie (ou pas)</p>
<ul>
<li><a href="https://market.android.com/details?id=com.lachainemeteo.androidapp">La chaîne météo</a>,</li>
<li><a href="https://market.android.com/details?id=com.fabernovel.ratp">RATP Premium</a>&nbsp;: la seule application achetée mais rend de fiers services,</li>
<li><a href="https://market.android.com/details?id=com.google.android.apps.translate">Google Translate</a>,</li>
<li><a href="https://market.android.com/details?id=net.bnpparibas.mescomptes">BNP Mes comptes</a>,</li>
<li><a href="https://market.android.com/details?id=fr.snapp.fidme">FidMe</a>&nbsp;: enregistrer ses cartes de fidélités sous forme électronique,</li>
<li><a href="https://market.android.com/details?id=com.apksoftware.compass">Boussole</a> si vous êtes perdus <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li><a href="https://market.android.com/details?id=net.androgames.level">Niveau</a>&nbsp;: un niveau à bulle,</li>
<li><a href="https://market.android.com/details?id=dgirard.radar">ABonEntendeur</a>&nbsp;: un avertisseur de radars</li>
<li><a href="https://market.android.com/details?id=com.booking">Booking.com</a>&nbsp;: le site de réservations d&#8217;hôtels</li>
</ul>
<p>Journaux</p>
<ul>
<li><a href="https://market.android.com/details?id=com.lemonde.androidapp">Le Monde</a>,</li>
<li><a href="https://market.android.com/details?id=com.smartnsoft.metro">Metro France</a>,</li>
<li><a href="https://market.android.com/details?id=com.backelite.vingtminutes">20 minutes</a>,</li>
<li><a href="https://market.android.com/details?id=com.tf1.lci">TF1 News</a>&nbsp;: TF1 News de LCI</li>
</ul>
<p>Photo / Vidéo</p>
<ul>
<li><a href="https://market.android.com/details?id=ymst.android.fxcamera">FxCamera</a>&nbsp;: utilisez l&#8217;appareil photo du mobile et appliquez des effets,</li>
<li><a href="https://market.android.com/details?id=com.pixvision.studiobuddy">Studio Buddy Lite</a>&nbsp;: pour dessiner vos scènes &#8220;studio&#8221;, mais j&#8217;attends avec impatience la version Android de <a href="http://www.sylights.com/">Sylights</a>,</li>
<li><a href="https://market.android.com/details?id=com.synology.dsphoto">DS Photo+</a>&nbsp;: pour les détenteurs d&#8217;un NAS Synology, visionne les photos stockées,</li>
<li>Flickr&nbsp;: bien qu&#8217;il existe <a href="https://market.android.com/details?id=com.zmosoft.flickrcompanionfree">FlickrCompagnion</a> je préfère le site <a href="http://m.flickr.com">Flickr au format mobile</a>,</li>
<li><a href="https://market.android.com/details?id=com.makotosan.vimeodroid">VimeoDroid Alpha</a>&nbsp;: version non officielle de la plateforme de partage <a href="http://vimeo.com">Vimeo</a></li>
</ul>
<p>Musique</p>
<ul>
<li><a href="https://market.android.com/details?id=com.synology.DSaudio">DS Audio</a>&nbsp;: écouter les morceaux de musique stockés sur votre NAS Synology</li>
</ul>
<p>IT</p>
<ul>
<li><a href="https://market.android.com/details?id=org.droidstack">DroidStack</a>&nbsp;: accéder aux sites de <a href="http://stackexchange.com/sites">StackExchange</a>, et aux questions / réponses,</li>
<li><a href="https://market.android.com/details?id=com.acrea.doodle.android">Doodle</a>&nbsp;: l&#8217;application du fameux site de prise de décisions <a href="http://www.doodle.com">doodle</a>,</li>
<li>pour les stats. de mes blogs, l&#8217;application <a href="https://market.android.com/details?id=org.piwik.mobile">Piwik</a></li>
<li><a href="https://market.android.com/details?id=com.paypal.android.p2pmobile">PayPal</a> et <a href="https://market.android.com/details?id=com.ebay.mobile">eBay</a></li>
</ul>
<p>Si vous en avez d&#8217;autres, n&#8217;hésitez pas à les partager en commentaire&nbsp;!</p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=xhloZsfNYiE:817WK8ZiMLE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/xhloZsfNYiE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/quelques-applications-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/quelques-applications-android/</feedburner:origLink></item>
		<item>
		<title>Flickr, Galleriffic et jQuery</title>
		<link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/9T3Or78Vj-E/</link>
		<comments>http://blog.olivier-duval.info/flickr-galleriffic-et-jquery/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 10:30:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web[2.0]]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[Galleriffic]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonp]]></category>
		<category><![CDATA[Yahoo pipes]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=337</guid>
		<description><![CDATA[<p>J'aime plusieurs choses dans la vie, et notamment Flickr, jQuery et un plugin bien sympa&#160;:&#160;<a target="_blank" href="http://www.twospy.com/galleriffic/">Galleriffic</a>. Ce dernier permet de concevoir des galeries photos assez facilement, à l'aide de balises&#160;<strong>&#60;ul&#62;&#60;li&#62;</strong>&#160;qui contiennent des liens vers des images (miniatures et "grand format"). Amusons-nous à créer une&#160;<strong>galerie Flickr</strong>&#160;avec recherche.</p> <a class="more-link" href="http://blog.olivier-duval.info/flickr-galleriffic-et-jquery/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;aime plusieurs choses dans la vie, et notamment Flickr, jQuery et un plugin bien sympa : <a href="http://www.twospy.com/galleriffic/" target="_blank">Galleriffic</a>. Ce dernier permet de concevoir des galeries photos assez facilement, à l&#8217;aide de balises <strong>&lt;ul&gt;&lt;li&gt;</strong> qui contiennent des liens vers des images (miniatures et &#8220;grand format&#8221;). Amusons-nous à créer une <strong>galerie Flickr</strong> avec recherche.</p>
<p><span id="more-337"></span></p>
<p><strong>Flickr</strong> propose dans son API, via un appel public (ie : sans clé), d&#8217;explorer les dernières photos publiées pour un compte sous forme d&#8217;un <a href="http://www.flickr.com/services/feeds/" target="_blank">flux</a>, avec différents formats de retour : RSS, Atom, Yaml, CSV, PHP ou <strong>JSON</strong>. Le flux qui nous intéresse concerne les <a href="http://www.flickr.com/services/feeds/docs/photos_public/" target="_blank">photos publiques pour un utilisateur</a>, et optionnellement avec un filtre sur des <strong>tags</strong> précis. Comme tout est dans la <strong>page HTML</strong>, le retour souhaité sera du <strong>JSON </strong>pour faciliter le traitement, tout ceci permettra :</p>
<ul>
<li>d&#8217;effectuer un <strong>appel Ajax</strong> (JSON-P) vers <strong>Flickr</strong> sur un <em>user id</em> en filtrant si on le souhaite sur des <em>tags</em> (séparés par des virgules),</li>
<li>d&#8217;effectuer un <strong>appel Ajax</strong> (JSON-P) vers <strong>Yahoo pipes</strong> pour obtenir l<em>&#8216;userid</em> de l<em>&#8216;username</em> à rechercher (cf. ci-après),</li>
<li>d&#8217;avoir en <strong>retour</strong> la liste des photos au format <strong>JSON</strong>,</li>
<li>de construire cette liste sous forme<strong> &lt;li&gt;image&lt;/li&gt;</strong> afin de l&#8217;injecter dans Galleriffic</li>
</ul>
<p>Un exemple d&#8217;une URL du flux, pour l&#8217;utilisateur <strong>zorky</strong> (mon compte flickr) et les tags <strong>paysages,sunset</strong> :</p>
<pre></pre>
<pre class="brush: plain; title: ; notranslate">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</pre>
<p>Malheureusement, Flickr demande l&#8217;<strong>userid</strong> (la chose barbare <em>55936300@N00</em>) du compte Flickr et il n&#8217;est pas possible de préciser directement son <strong>username</strong> (par exemple <em>zorky</em>) dans l&#8217;API (qu&#8217;on utilise pour accéder à notre compte Flickr : http://www.flickr.com/photos/<em>zorky</em>), plus facile à retenir pour effectuer des requêtes vers Flickr.</p>
<p>Heureusement, <strong>Yahoo pipes</strong> est là, et j&#8217;ai pu trouver une <em>pipe</em> très bien réalisée pour obtenir l&#8217;<strong>username</strong> à partir d&#8217;un <strong>userid</strong> : j&#8217;ai honteusement fait une copie sur mon compte que <a href="http://pipes.yahoo.com/pipes/pipe.info?_id=808f21fc64038d41cc72e50710884f4a" target="_blank">je vous livre</a>. En gros, le <em>pipes</em> effectue une requête Web sur la page http://www.flickr.com/photos/<em>zorky</em>, repère une balise <strong>&lt;link&gt;</strong> (pour les flux RSS/Atom) et prend grâce à une regexp, la partie derrière <strong>id=</strong> qui contient l&#8217;<em>userid</em> et nous le renvoie, ingénieux (il existe un site qui propose d&#8217;obtenir ce type d&#8217;information, mais n&#8217;implémente pas de service pour : <a href="http://idgettr.com/" target="_blank">http://idgettr.com</a>)</p>
<p>Une fois tous ces éléments en notre possession, il ne reste plus qu&#8217;à coder notre page d&#8217;affichage de photos Flickr avec une recherche sur un <strong>compte</strong> et avec la possibilité de filtrer sur des <strong>tags</strong>.</p>
<p>Vous pouvez essayer sur quelques comptes que j&#8217;aime bien : le mien <strong><a href="http://olivier-duval.info/flickr/?id=zorky&amp;tags=sunset,architecture" target="_blank">zorky</a></strong>, et d&#8217;autres : <strong><a href="http://olivier-duval.info/flickr/?id=lili_jpeg" target="_blank">lili_jpeg</a></strong>, <strong><a href="http://olivier-duval.info/flickr/?id=tripax" target="_blank">tripax</a></strong>, <strong><a href="http://olivier-duval.info/flickr/?id=eloyricardez" target="_blank">eloyricardez</a></strong>, <strong><a href="http://olivier-duval.info/flickr/?id=loomax" target="_blank">loomax</a>, <a href="http://olivier-duval.info/flickr/?id=cedricduhez" target="_blank">cedricduhez</a> </strong></p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=9T3Or78Vj-E:ljBh0rFxaq4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/9T3Or78Vj-E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/flickr-galleriffic-et-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/flickr-galleriffic-et-jquery/</feedburner:origLink></item>
		<item>
		<title>QR code (ou flashcode pour le grand public)</title>
		<link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/ERmu-kBsJZE/</link>
		<comments>http://blog.olivier-duval.info/qr-code-ou-flashcode-pour-le-grand-public/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 21:00:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web[2.0]]]></category>
		<category><![CDATA[flashcode]]></category>
		<category><![CDATA[qr]]></category>
		<category><![CDATA[qr code]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=336</guid>
		<description><![CDATA[<h4>Préambule</h4> <p>C'est l'expérience utilisateur <em>hype</em> du moment, mais surtout en raison de la croissance des Smartphone (iPhone, Android &#38; co) promise en 2011&#160;: le <strong>QR code</strong> 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).</p> <p>Un <strong>flashcode</strong>  c'est quoi&#160;? 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&#160;: un <strong>lien</strong>, des <strong>coordonnées</strong> (téléphone, adresse, email), une <strong>date d'évènement</strong> (à la iCal), etc. nous en voyons de plus en plus sur les publicités, aux arrêts de bus, etc</p> <a class="more-link" href="http://blog.olivier-duval.info/qr-code-ou-flashcode-pour-le-grand-public/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h4>Préambule</h4>
<p>C&#8217;est l&#8217;expérience utilisateur <em>hype</em> du moment, mais surtout en raison de la croissance des Smartphone (iPhone, Android &amp; co) promise en 2011 : le <strong>QR code</strong> ou connu du grand public aussi sous l&#8217;appellation trompeuse de Flashcode (qui n&#8217;a pas le même résultat, autant de l&#8217;image que des droits d&#8217;utilisation).</p>
<p>Un <strong>flashcode</strong> c&#8217;est quoi ? 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&#8217;appareil photo du Smartphone. Une fois scanné, le flashcode fournit une information qui peut être de plusieurs types : un <strong>lien</strong>, des <strong>coordonnées</strong> (téléphone, adresse, email), une <strong>date d&#8217;évènement</strong> (à la iCal), etc. nous en voyons de plus en plus sur les publicités, aux arrêts de bus, etc</p>
<p><span id="more-336"></span></p>
<p>Par exemple le QR code suivant</p>
<p><img src=" http://chart.apis.google.com/chart?cht=qr&amp;chs=120x120&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="" /></p>
<p>encode quelques coordonnées au format <a href="http://www.nttdocomo.co.jp/english/service/developer/make/content/barcode/function/application/addressbook/index.html ">MECARD</a> (la vCard pour Smartphone) avec : <strong>nom, prénom, url, email</strong>, téléphone. Il suffit alors de scanner ce dernier avec son smartphone afin de m&#8217;ajouter aux contacts ou de m&#8217;envoyer un mail rapidement, ou encore de me passer un coup de fil pour me proposer une bière.</p>
<p>L&#8217;avantage étant la simplicité, de ne pas avoir à recopier sur son smartphone l&#8217;information.</p>
<p>Des imprimeurs l&#8217;ont bien compris et commencent à proposer des QR codes pour les <a href="http://www.ooprint.fr/ooprint/dynamic/public/chooser.shtml?cat_label=CARTES-DE-VISITE-STANDARD-AVEC-LOGO-QR_0">cartes de visite</a>. Egalement, <a href="http://bit.ly">bit.ly</a>, le service pour raccourcir les liens propose à chaque lien bit.ly le flashcode associé, il suffit d&#8217;ajouter <strong>.qrcode</strong> derrière l&#8217;URL (par <a href="http://bit.ly/fB90vm.qrcode">exemple</a>) ou encore le service Google en postfixant l&#8217;extension <strong>.qr</strong> aux urls, comme cette <a href="http://goo.gl/maps/SO3v.qr">adresse</a> Google maps.</p>
<h4>Services en ligne</h4>
<p>Quelques sites proposent de générer un qrcode :</p>
<ul>
<li><a href="http://zxing.appspot.com/generator/">ZXing project</a>, le plus abouti, permet de générer un qrcode un peu pour tout : coordonnées, évènement, etc utilise l&#8217;API de Google chart QR et est le service en ligne d&#8217;une librairie Java, <a href="http://code.google.com/p/zxing/wiki/BarcodeContents">leur Wiki</a> est riche pour tout ce qui touche aux différents formats supportés,</li>
<li><a href="http://www.beqrious.com/qrcode/create">beQRious</a>, similaire à ZXing mais en plus Web 2 dirons-nous</li>
<li><a href="http://goqr.me">goQR</a> : la même chose mais offre la possibilité d&#8217;imprimer son QR code sur un t-shirt, une tasse, une carte de visite, plus fun <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li><a href="http://code.google.com/intl/fr-FR/apis/chart/docs/gallery/qr_codes.html">Google chart QR</a> : ce service (API) encode une entrée vers un qrcode, n&#8217;offre donc pas le moyen (comme les sites ci-dessus) de générer un qrcode selon un format déterminé (ie : vCard, évènement). Comme tout service Google, c&#8217;est très bien documenté, et donne un <a href="http://code.google.com/intl/fr-FR/apis/chart/docs/gallery/qr_codes.html#details">résumé</a> sur le protocole QR et ses limitations, passionnant !</li>
</ul>
<h4>Librairies et API</h4>
<p>Au niveau services en ligne et API, mon préférence va vers <a href="http://code.google.com/intl/fr-FR/apis/chart/docs/gallery/qr_codes.html">Google chart QR</a> (pérenne, résistant), mais ne fournit que la forme brute :</p>
<ul>
<li>une entrée (chaîne en UTF-8),</li>
<li>une image en sortie,</li>
</ul>
<p>sans notion de schémas (MECARD, iCal, etc).</p>
<p>Le QR code a <strong>40 versions</strong>, 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 <a href="http://code.google.com/intl/fr-FR/apis/chart/docs/gallery/qr_codes.html#details">documentation</a> Google (la version est automatiquement calculée selon la quantité de données transmise à l&#8217;API, le paramètre <strong>chl</strong> qui contient l&#8217;entrée à QRcoder).</p>
<p>Par contre, je n&#8217;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).</p>
<p>Le qrcode de ce billet avec l&#8217;URL <strong>http://chart.apis.google.com/chart?cht=qr&amp;chs=140&#215;140&amp;chl=http://blog.olivier-duval.info/?post/Flashcode-QR-code&amp;chld=M</strong></p>
<p><img src="http://chart.apis.google.com/chart?cht=qr&amp;chs=140x140&amp;chl=http://blog.olivier-duval.info/?post/Flashcode-QR-code&amp;chld=M" alt="" /></p>
<p>Il en existe d&#8217;autres : <a href="http://www.sparqcode.com/static/QRGenAPI">QRGen API</a>, laisse un marqueur/pub sur l&#8217;image générée mais à l&#8217;avantage de mâcher le travail pour ce qui est de générer des MECARD ou autre qrcode d&#8217;évènement, de ce type :</p>
<p><img src="http://www.sparqcode.com/qrgen?qt=addr&amp;fName=Olivier&amp;lName=DUVAL&amp;tel=0664&amp;address=place&amp;city=Boulogne-Billancourt&amp;zip=90210&amp;country=FR&amp;email=zorky00%40gmail.com&amp;url=blog.olivier-duval.info&amp;width=140" alt="" /></p>
<p>Pour ce qui est de librairie (sous <strong>.NET</strong>), il y a celle de <a href="http://twit88.com/home/opensource/qrcode">Twit88</a> (il faudra s&#8217;enregistrer pour télécharger les sources) ou bien directement les assemblys via <a href="http://twit88.com/platform/projects/list_files/mt-qrcode">l&#8217;exécutable</a>, prendre ensuite <strong>MessagingToolkit.QRCode.dll</strong> du répertoire ~MessagingToolkit\\MessagingToolkit-QRCode\\QRCode. Librairie assez complète, contrôle de la version QR (4, 10, &#8230;), du niveau de correction (M, &#8230;) et simple d&#8217;utilisation (Encode, Decode).</p>
<h4>Applications Smartphone</h4>
<p>Pour Android (Galaxy S inside), j&#8217;aime bien <a href="https://market.android.com/details?id=com.google.zxing.client.android&amp;feature=search_result">Barcode scanner</a> et <a href="https://market.android.com/details?id=la.droid.qr&amp;feature=search_result">QR droid</a>, pour les iPhone ou autre BB et WP7, on trouvera certainement de bonnes applications sur les market place respectifs.</p>
<p>Note à moi-même : passer ce blog pour une lecture sur Smartphone <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>et comme on dit :</p>
<p><img src="http://chart.apis.google.com/chart?cht=qr&amp;chs=230x230&amp;chl=Les+hommes+naissent+libres+et+%C3%A9gaux%E2%80%A6+apr%C3%A8s+ils+se+d%C3%A9merdent.+-Jean+Yanne" alt="" /></p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=ERmu-kBsJZE:BfYuXS6Eaj4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/ERmu-kBsJZE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/qr-code-ou-flashcode-pour-le-grand-public/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/qr-code-ou-flashcode-pour-le-grand-public/</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/2KX8I0AO5K4/</link>
		<comments>http://blog.olivier-duval.info/techdays-2011-jour-2-choisir-une-techno-dacces-aux-donnees-distantes-45-projets-en-45-mn-accelerer-vos-devs-web-grace-aux-frameworks-toolkits-et-applications-code-contracts/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 12:09:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[mstechdays]]></category>
		<category><![CDATA[techdays]]></category>
		<category><![CDATA[techdays 2011]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=335</guid>
		<description><![CDATA[<p>2ème jour des Techdays 2011, quelques notes prises au cours des 4 sessions suivies de la journée.</p> <p>Au programme&#160;: technos. d'accès aux données, 45 projets en 45 mn, accélérer vos développements Web, Code Contracts</p> <a class="more-link" href="http://blog.olivier-duval.info/techdays-2011-jour-2-choisir-une-techno-dacces-aux-donnees-distantes-45-projets-en-45-mn-accelerer-vos-devs-web-grace-aux-frameworks-toolkits-et-applications-code-contracts/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>2ème jour des Techdays 2011, quelques notes prises au cours des 4 sessions suivies de la journée.</p>
<p>Au programme&nbsp;: technos. d&#8217;accès aux données, 45 projets en 45 mn, accélérer vos développements Web, Code Contracts</p>
<p><span id="more-335"></span></p>
<h4>Choisir une techno. d&#8217;accès aux données distantes</h4>
<p><img src="/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" /></p>
<p><a href="http://blogs.msdn.com/b/davrous/">David Rousset</a> et <a href="http://blogs.msdn.com/b/stephe/">Stéphanie Hertrich</a>.</p>
<p>Cette session était dédiée aux différentes solution d&#8217;accès aux données, par une énumération de différentes techniques disponibles selon ses besoins, de WCF à WCF RIA Services.</p>
<ul>
<li><strong>WCF :</strong> découplage entre le service métier et sa publication et de comment on le publie (binaire, http, SOAP, REST, MSMQ, &#8230;), c&#8217;est la technique la plus générique et donc la plus souple. La souplesse amène l&#8217;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&#8217;avantage est que, pour une même interface, de pouvoir modifier le format de retour (l&#8217;implémentation) par &#8220;simple&#8221; modification du <strong>web.config</strong> en précisant des <strong>endpoints</strong> différents.</li>
</ul>
<ul>
<li><strong>ODATA :</strong> exposer des données aux travers des URI HTTP (à la REST) sous la forme de flux <strong>Atom</strong> ou <strong>JSON</strong>. <a href="http://www.odata.org/">odata</a> propose un <a href="http://www.odata.org/developers/odata-sdk">SDK</a> dans une majorité de langages (C#, JS, ruby, &#8230;).</li>
</ul>
<p>Parmi les avantages de OData&nbsp;:</p>
<ul>
<li>les méthodes <strong>CRUD</strong> sont natives,</li>
<li>le fitrage des données s&#8217;effectue à la source et se symbolise par des <a href="http://www.odata.org/developers/protocols/uri-conventions">paramètres dans l&#8217;URI</a>,</li>
<li>SDK multi langages,</li>
<li>accessibles par des clients hétérogènes (ndr&nbsp;: j&#8217;avais testé le client Silverlight <a href="http://metasapiens.com/sesame/data-browser/">Sesame</a> qu&#8217;on peut tester avec la source http://proagora.com/fr/odata/ mais il y en a d&#8217;<a href="http://www.odata.org/consumers">autres</a>)</li>
</ul>
<ul>
<li><strong>WCF Data Services</strong>&nbsp;: surcouche à OData, une implémentation de OData mais pour .NET (wrapper). Cela apporte notamment un proxy Linq pour le requêtage, les <a href="http://www.odata.org/developers/protocols/uri-conventions#FilterSystemQueryOption">URI des filtres</a> sont directement traduites de l&#8217;expression Linq.</li>
</ul>
<ul>
<li><strong>WCF RIA Services</strong>&nbsp;: principalement utilisé pour du développement Silverlight, il facilite l&#8217;accès aux données pour ce type d&#8217;application. La démo est accessible directement en ligne, une <a href="http://bookclub.cloudapp.net/Default.aspx#/Home">application de bouquins</a> (une version <a href="http://bookclub.cloudapp.net/WCFRIA_jQueryHTML5.html">HTML5 / jQuery</a> est également accessible). Une <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">introduction</a> et tout un <a href="http://blogs.msdn.com/b/davrous/archive/tags/wcf+ria+services/">tas de billets sur RIA Services</a> sont disponibles sur le blog de David.</li>
</ul>
<h4>45 projets en 45 mn</h4>
<p><img src="/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" /></p>
<p><a href="http://www.doyoubuzz.com/bruno-michel">Bruno Michel</a> nous propose en 45 mn de nous parler de 45 projets (OpenSource sous Windows) que je vais tenter de lister.</p>
<ol>
<li>TortoiseGit&nbsp;: le <a href="http://code.google.com/p/tortoisegit/">client Windows</a> pour accéder aux répertoires Git (portage du fameux <a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a>)</li>
<li><a href="http://sourceforge.net/projects/gitextensions/">GitExtensions</a>&nbsp;: GIT intégré à Windows Explorer</li>
<li><a href="http://resume.github.com/">MyGitHub résumé</a>&nbsp;: site qui génère un CV suivant ses projets GitHub</li>
<li><a href="http://hackety-hack.com/">Hackety Hack</a> où comment apprendre en ligne Ruby aux&#8230;enfants  <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li><a href="http://rubyonrails.org/download">Rails installer</a>&nbsp;: installé un bundle Rails sous Windows</li>
<li><a href="http://rubini.us/">Rubinius</a>&nbsp;: interpréteur Ruby écrit en &#8230;Ruby</li>
<li><a href="https://github.com/schacon/showoff">ShowOff</a>&nbsp;: le powerpoint des geeks</li>
<li><a href="http://cloudhead.io/toto">toto</a>&nbsp;: le moteur de blog minimaliste</li>
<li><a href="http://documentcloud.github.com/docsplit/">Doc Split</a>&nbsp;: programme Ruby d&#8217;extraction d&#8217;informations d&#8217;un document (texte, image, &#8230;, meta données)</li>
<li><a href="https://www.chiliproject.org/">ChiliProject</a>&nbsp;: application de gestion de projets Web</li>
<li><a href="http://lamsonproject.org/">Lamson</a>&nbsp;: serveur SMTP en Python</li>
<li><a href="http://pygments.org/">Pygments</a>&nbsp;: coloration syntaxique</li>
<li><a href="http://learnboost.github.com/stylus/">Stylus</a>&nbsp;: framework d&#8217;aide à l&#8217;écriture de CSS</li>
<li><a href="http://zombie.labnotes.org/">Zombie.js</a>&nbsp;: utilise Node.js, permet de tester des applications Web</li>
<li><a href="http://cloud9ide.com/">Cloud9IDE</a>&nbsp;: l&#8217;IDE sur le nuage</li>
<li><a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a>&nbsp;: syntaxe alternative pour écrire du javascript</li>
<li><a href="http://documentcloud.github.com/backbone/">Backbone.js</a>&nbsp;: framework MVC côté client</li>
<li><a href="http://documentcloud.github.com/underscore/">Underscore.js</a>&nbsp;: ajout de 60 fonctions utiles à Javascript (<strong>map</strong>, <strong>select</strong>, <strong>bind</strong>, &#8230;)</li>
<li><a href="http://mir.aculo.us/dom-monster/">DOM Master</a>&nbsp;: utilitaire javascript qui permet d&#8217;analyser les performances d&#8217;un site</li>
<li><a href="http://code.google.com/intl/fr-FR/tv/web/lib/">Google TV Web UI</a>&nbsp;: bibliothèque javascript pour l&#8217;intégration aux TV</li>
<li><a href="http://vis.stanford.edu/protovis/">Protovis</a>&nbsp;: création de graphes en SVG en javascript (ne fonctionne pas donc jusqu&#8217;à IE <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </li>
<li><a href="http://treesaverjs.com/">Treesaver</a>&nbsp;: framework de publication de magazines en ligne (HTML/CSS)</li>
<li><a href="http://www.ie6nomore.com/">IE6 no more</a>&nbsp;: tuons IE 6</li>
<li><a href="http://www.jslint.com/">JS Lint</a>&nbsp;: assez connu, permet de vérifier que ce que l&#8217;on écrit en JS respecte les bonnes pratiques</li>
<li><a href="http://www.ucengine.org/">U.C. engine</a>&nbsp;: framework pour la création d&#8217;applications Web en temps réel (Erlang/JS)</li>
<li><a href="http://openkinect.org/wiki/Main_Page">OpenKinect</a>&nbsp;: les drivers opensource pour le fonctionnement de la Kinect sous Windows, Linux ou Mac.</li>
<li><a href="http://depthjs.media.mit.edu/">Depth.js</a>&nbsp;: interagir avec la Kinect à partir d&#8217;une page Web</li>
<li><a href="http://www.phonegap.com/">PhoneGap</a>&nbsp;: Mobile framework JS/HTML5</li>
<li><a href="http://www.bitcoin.org/">BitCoin</a>&nbsp;: la monnaie virtuelle en P2P</li>
<li><a href="http://www.seeks-project.info/site/">Seeks</a>&nbsp;: moteur de recherche social, axé sur le P2P</li>
<li><a href="http://oneteam.im/">OneTeam</a>&nbsp;: outil de messagerie en ligne pour entreprise (ou pas)</li>
<li><a href="http://archipelproject.org/">Archipel</a>&nbsp;: virtualisation sur le Cloud</li>
<li><a href="http://www.opscode.com/chef/">Chef</a>&nbsp;: outil de déploiement  en Ruby</li>
<li><a href="http://vagrantup.com/">Vagrant</a>&nbsp;: s&#8217;appuie sur Chef pour du déploiement multi-plaformes en VirtualBox</li>
<li><a href="http://www.mongodb.org/">MongoDB</a>&nbsp;: moteur NoSQL, orienté documents</li>
<li><a href="http://redis.io/">Redis</a>&nbsp;: un autre moteur NoSQL, en clés/valeurs</li>
<li><a href="https://github.com/nicolasff/webdis">Webdis</a>&nbsp;: interface HTTP + JSON pour interroger Redis</li>
<li><a href="http://duckduckgo.com/">DuckDuckGo</a>&nbsp;: un moteur de recherche qui ne garde aucune trace de votre passage</li>
<li><a href="http://blog.nilsjonsson.com/post/1076166313/introducing-htty-the-http-tty">htty</a>&nbsp;: une console pour requêter en HTTP</li>
<li><a href="https://github.com/SPORE/specifications">Spore</a>&nbsp;: spécifications d&#8217;API en JSON (middleware)</li>
<li><a href="http://neyric.github.com/webhookit/docs/index.html">WebHookIt</a>&nbsp;: web hooks (création de mashups, &#8230;)</li>
<li><a href="http://www.zeromq.org/">0MQ</a>&nbsp;: message queue de bas niveau, orienté socket</li>
<li><a href="http://synergy-foss.org/">Synergy</a>&nbsp;: outil très pratique qui permet de naviguer entre plusieurs stations (Linux, Mac, Windows) avec un seul clavier et une seule souris</li>
<li><a href="http://code.google.com/p/gomingw/">GomingGW</a>&nbsp;: portage du langage Google <strong>GO</strong> sous Windows</li>
<li><a href="http://iographica.com/">IOGraph</a>&nbsp;: inutile et donc indispensable (dixit Bruno)&nbsp;: crée un graphe des mouvements de la souris que vous avez effectués durant la journée</li>
</ol>
<p>Les slides de la session <a href="http://techdays-45-projects.heroku.com/#1">sont en ligne</a>, vous avez 1 mn par slide <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h4>Accélérer vos développements Web grâce aux frameworks, toolkits et applications</h4>
<p><img src="/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" /></p>
<p><a href="http://blogs.msdn.com/b/pierlag/">Pierre Lagarde</a> et <a href="http://blogs.msdn.com/b/davrous/">David Rousset</a></p>
<p>Parcours de quelques outils, contrôles et autres trucs utiles pour le développement.</p>
<h3>Outils Visual Studio (2010)</h3>
<ul>
<li><strong>Razor</strong>&nbsp;: le nouveau <a href="http://weblogs.asp.net/scottgu/search.aspx?q=razor&amp;o=Relevance">moteur de rendu</a> pour ASP.NET MVC 3, simplifie et rend surtout plus clair le code à l&#8217;intérieur du code HTML.</li>
<li><strong>SP1</strong> de VS 2010&nbsp;: permet de changer le serveur web local pour basculer vers <a href="http://weblogs.asp.net/scottgu/archive/2010/06/28/introducing-iis-express.aspx">IIS Express</a>. Egalement, la venue de <strong>HTML5</strong> (target HTML5).</li>
<li><strong>NuGet</strong>&nbsp;: <a href="http://nuget.org/">nuget</a> est un gestionnaire d&#8217;extensions sous VS, qui se base sur un référentiel en ligne. Il suffit, sur le clic droit du projet, d&#8217;utiliser le &#8220;Add librairie package référence&#8221; afin de rechercher et d&#8217;ajouter un module (le service pointe sur http://packages.nuget.org/v1/FeedService.svc/)</li>
<li><strong>Elmah</strong>&nbsp;: <a href="http://code.google.com/p/elmah/">libraire pour gérer les logs</a>. Le simple ajout de cette extension (et de sa configuration dans le web.config) donne accès à la page <strong>elmha.axd</strong> qui analyse ce qui s&#8217;est passé sur la page récemment consultée.</li>
<li><strong>EF Coding First</strong>&nbsp;: on part des classes pour créer la base ou les tables, en Entity Framework.</li>
<li>Addins VS avec Tools (Extension Manager)&nbsp;:</li>
</ul>
<pre>       - <a href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef/">Productivity Power Tools</a> (un R# like)        - <a href="http://msdn.microsoft.com/en-us/library/bb126445.aspx">T4</a> 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        - <a href="http://www.jetbrains.com/resharper/">R#</a> (payant) : le must have pour le développement (refactoring, vérification du code) sous Visual Studio</pre>
<h3>Contrôles (HTML, Silverlight, Javascript)</h3>
<ul>
<li><strong>AjaxControlToolKit</strong>&nbsp;: <a href="http://www.asp.net/ajax/ajaxcontroltoolkit/samples/">librairie</a> assez connue qui propose une multitude de contrôle près à l&#8217;emploi</li>
<li><strong>MVCHtml5toolkit</strong>&nbsp;: fournit des <a href="http://mvchtml5.codeplex.com/">Helpers</a> pour HTML5 (en ASP.NET MVC) (ne pas oublier d&#8217;ajouter le namespace dans le web.config <strong>section razor</strong> pour profiter de l&#8217;Intellisense)</li>
<li><strong>Telerik MVC Extensions</strong>&nbsp;: <a href="http://www.telerik.com/products/aspnet-mvc.aspx">Telerik</a> offre gracieusement un ensemble de contrôle pour ASP.NET MVC</li>
<li><strong>CLEditor</strong>&nbsp;: un <a href="http://premiumsoftware.net/cleditor/">éditeur WYSIWYG</a></li>
<li><strong>Silverlight Control Toolkit</strong>&nbsp;: tout un ensemble de <a href="http://silverlight.codeplex.com/">contrôles pour Silverlight</a></li>
<li><strong>Telerik SL</strong> (payant)&nbsp;: <a href="http://visualstudiogallery.msdn.microsoft.com/8797A84C-7670-4044-889B-913132E48014">RadControls Telerik</a> propose une 40aine de contrôle Silverlight, où l&#8217;on peut en admirer des <a href="http://demos.telerik.com/silverlight/">démos</a></li>
<li><strong>JavaScript InfoVis Toolkit</strong>&nbsp;: disponible sous NuGet, cette <a href="http://thejit.org/">librairie</a> Javascript fournit des outils/API pour créer des graphes en ligne</li>
<li><strong>Galleriffic</strong>&nbsp;: <a href="http://www.twospy.com/galleriffic/">librairie Javascript</a> pour générer des galeries photos</li>
</ul>
<p>enfin, hors catégorie, <a href="http://www.asp.net/webmatrix">WebMatrix</a> est une plateforme de création de site Web intégrée, tout en un.</p>
<h4>Code Contracts</h4>
<p><img src="/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" /></p>
<p><a href="http://gilles.tourreau.fr/">Gilles Tourreau</a> et <a href="http://amine.zemzemi.free.fr/">Amine Zemzemi</a> de Winwise.</p>
<p><a href="http://research.microsoft.com/en-us/projects/contracts/">Code Contracts</a> permet de faire de la vérification par contrats des méthodes que l&#8217;on appelle via des <strong>pré</strong> et <strong>post-conditions</strong>, ainsi que les <strong>invariants</strong> (test de l&#8217;état d&#8217;un objet, toujours appelé à la fin de chaque méthode). En version Visual Studio Premium, il inclut la vérification à la <strong>compilation</strong> des contrats (static checker), mais rendu possible en ligne de commande (<strong>cccheck</strong>) pour les autres version VStudio. Namespace .NET 4.0 à utiliser&nbsp;: System.Diagnostics.Contracts</p>
<p>Avant les CC, les vérifications des entrées ou sorties de méthodes s&#8217;effectuaient via des <strong>if(! condition) ArgumentException</strong>, les CC introduisent une manière simple et évolutive d&#8217;effectuer des tests en entrée ou en sortie de méthode, tout en supportant l&#8217;héritage via les interfaces et attributs de classe.</p>
<p>Les méthodes statiques disponibles de <a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contract_methods.aspx">Contract</a>&nbsp;:</p>
<ul>
<li><strong>Contract.Requires(test)</strong>&nbsp;: pré-condition</li>
<li><strong>Contract.Ensures(test)</strong>&nbsp;: post-condition</li>
<li><strong>Contract.Invariant(test)</strong>&nbsp;: invariant, appelée à chaque fin de méthodes de la classe</li>
<li><strong>Contract.Assume(test)</strong>&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 <strong>if(diviseur!=0) methode(diviseur) else erreur</strong></li>
<li>utiliser <strong>Contract.EndContractBlock()</strong> sur du code existant contenant des séquences <strong>if then throw</strong></li>
</ul>
<p>ou par les attributs .NET <strong>ContractClass(typeof(interface))</strong> (pour l&#8217;interface) / <strong>ContractClassFor(typeof(interface))</strong> (pour la classe abstraite qui implémente l&#8217;interface), cela se traduit par d&#8217;injection des contrats dans les classes, permet l&#8217;utilisation de l&#8217;héritage, voir l&#8217;exemple d&#8217;application sur <a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contractclassattribute.aspx">MSDN</a>.</p>
<p><strong>CC</strong> 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&#8217;assembly est livrée à un intégrateur.</p>
<p>Retrouvez toutes les années via le <a href="http://blog.olivier-duval.info/?tag/techdays">tag techdays</a> et d&#8217;autres résumés listés sur le <a href="http://www.nicolasesprit.com/post/2011/02/13/TechDays-2011-Retour-sur-ces-3-jours-passes-au-Palais-des-Congres.aspx">blog de Nicolas Esprit</a>.</p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=2KX8I0AO5K4:TxLU0fMGqto:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/2KX8I0AO5K4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/techdays-2011-jour-2-choisir-une-techno-dacces-aux-donnees-distantes-45-projets-en-45-mn-accelerer-vos-devs-web-grace-aux-frameworks-toolkits-et-applications-code-contracts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/techdays-2011-jour-2-choisir-une-techno-dacces-aux-donnees-distantes-45-projets-en-45-mn-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/cWQNzmnmcBg/</link>
		<comments>http://blog.olivier-duval.info/techdays-2011-jour-1-pleniere-cloud-computing-ameliorer-les-performances-web-javascript-dans-tous-ses-etats-seo-mythes-et-techniques-mongodb-et-c/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 11:47:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ms techdays]]></category>
		<category><![CDATA[techdays]]></category>
		<category><![CDATA[techdays 2011]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=334</guid>
		<description><![CDATA[<p>Comme chaque année, direction le <a href="http://goo.gl/maps/SO3v">Palais des congrés de Paris</a> pour la grande messe Microsoft&#160;: les <a href="http://www.microsoft.com/france/mstechdays/">Techdays</a>.</p> <p>Les techdays c'est 3 jours de sessions et conférences sur l'ensemble des technologies Microsoft, mais <strong>pas seulement</strong>. 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.</p> <p>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).</p> <a class="more-link" href="http://blog.olivier-duval.info/techdays-2011-jour-1-pleniere-cloud-computing-ameliorer-les-performances-web-javascript-dans-tous-ses-etats-seo-mythes-et-techniques-mongodb-et-c/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Comme chaque année, direction le <a href="http://goo.gl/maps/SO3v">Palais des congrés de Paris</a> pour la grande messe Microsoft&nbsp;: les <a href="http://www.microsoft.com/france/mstechdays/">Techdays</a>.</p>
<p>Les techdays c&#8217;est 3 jours de sessions et conférences sur l&#8217;ensemble des technologies Microsoft, mais <strong>pas seulement</strong>. Un bon moyen de sentir les nouvelles tendances, ou tout simplement de s&#8217;intéresser à des alternatives ou mettre le pied à l&#8217;étrier sur des technos. méconnues.</p>
<p>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).</p>
<p><span id="more-334"></span></p>
<p><img src="/public/.2011-02-08_14.14.38_m.jpg" alt="techdays-2011" style="display:block; margin:0 auto;" title="techdays-2011, fév. 2011" /></p>
<h4>Keynote</h4>
<p>Un peu déçu par la keynote sur la forme, moins rythmée, il manquait cette petite touche humouristique que l&#8217;équipe précédente apportait. Le thème principal était le <strong>Cloud computing</strong>, en partant de sa définition pour aller sur un cas virtuel d&#8217;une startup (Contoso) de vente de voitures avec quelques démos qui couvraient les briques du Cloud computing&nbsp;: <a href="http://fr.wikipedia.org/wiki/Cloud_computing">IaaS, PaaS, SaaS</a>&nbsp;: infra, système et développement.</p>
<h4>Améliorer les performances Web&nbsp;: optimisation côté client</h4>
<p><img src="/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" /></p>
<p>Intervenant&nbsp;: <a href="http://twitter.com/#!/nhoizey">Nicolas Hoizey</a>, directeur technique de Clever Age.</p>
<p>Session axée sur les performances Web, ou l&#8217;accès aux pages Web sur les sites, sujet qui m&#8217;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, &#8230;), une augmentation du temps de chargement, ou plutôt, d&#8217;affichage de la page peut créer une baisse de leur CA, chacun des acteurs nommés en ont fait l&#8217;amère expérience (de -0.76 à -2.8 % de baisse du CA).</p>
<p>Même si les tuyaux augmentent (avec la fibre, nous atteignons des débit de 100 MBS), l&#8217;accès aux ressources des sites n&#8217;excèdent pas les 1 600 kbps, alors que les pages Web en 2010 pésent souvent jusqu&#8217;à 300 ko, poids courant de nos jours.</p>
<p>En 2010, il y a eu le <a href="http://webperf-contest.com/">Web Perf Contest</a> (remporté par un français)&nbsp;: l&#8217;exemple pris pour la session fût la <a href="http://entries.webperf-contest.com/base-fnac-ftw/">Fnac</a> qui a bien voulu jouer le jeu&nbsp;: comment optimiser l&#8217;accès à leurs pages, avec quels outils&nbsp;?</p>
<p>Paradoxalement, et contrairement à l&#8217;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&#8217;axer son optimisation sur ce dernier.</p>
<p>Des extensions (<a href="http://code.google.com/intl/fr-FR/speed/page-speed/">PageSpeed</a>, <a href="http://code.google.com/intl/fr-FR/webtoolkit/speedtracer/">Speed tracer</a>, <a href="http://developer.yahoo.com/yslow/">YSlow</a>) permettent d&#8217;analyser la cascade de chargement d&#8217;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&nbsp;: DNS, connexion TCP, attente réponse, chargement réponse, chaque partie peut être améliorée.</p>
<p>On aura alors ce <a href="http://www.webpagetest.org/result/110201_JE_d348c688caec64a71952f8bc81ef37c3/">type d&#8217;analyse</a> (ou pour <a href="http://www.webpagetest.org/result/110201_0V_46d3cb5f659c93fcfee3d664fa795ae3/">Amazon</a>) afin de corriger les éléments perturbateurs. Le site <a href="http://www.webpagetest.org/">Webpagetest</a> donne la possibilité de tester n&#8217;importe quel site afin de simuler l&#8217;accès par IE et à partir de plusieurs zones du monde.</p>
<p>Des solutions d&#8217;optimisation vont plus loin, tel que <a href="http://code.google.com/intl/fr-FR/speed/page-speed/docs/module.html">mod_pagespeed</a>, un module Apache qui filtre le flux et l&#8217;optimise à la volée ou encore <a href="http://msdn.microsoft.com/en-us/devlabs/ee423534">Doloto</a> de Microsoft au stade de Labs.</p>
<p>Quelles actions entreprendre pour optimiser l&#8217;accès aux pages&nbsp;?</p>
<ul>
<li>réduire la <strong>latence</strong> en mettant en place un <a href="http://en.wikipedia.org/wiki/Content_delivery_network">CDN</a>, nécessaire lorsque l&#8217;audience est de niveau international,</li>
<li>réduire les <strong>requêtes DNS</strong>, en minimisant le nombre de domaines appelés&nbsp;: <a href="www.lemonde.fr">Le Monde</a> inclut pas moins 50 appels vers des sites externes (contenus, pubs), sorte de mashup mais où le navigateur effectue tout le travail,</li>
<li>réduire le <strong>nombre de requêtes HTTP</strong>&nbsp;:</li>
</ul>
<pre>     - exploiter le <strong>cache du navigateur</strong> (j'en avais présenté une introduction dans la  <a href="http://blog.olivier-duval.info/?post/2007/12/19/developpement-web-optimisation">mise en place d'une syndication</a>), - configurer le serveur afin de cacher certains éléments (statiques du type images, css, js) en indiquant une <strong>date de péremption</strong>, - <strong>concaténer</strong> les sources javascript et CSS, - réduire le <strong>poids des images</strong>, - <strong>compresser</strong> directement par le serveur Web en gzip le flux de données,</pre>
<p>pour ces 4 derniers points, j&#8217;avais également écrit une introduction sur l&#8217;optimisation côté serveur et fichiers, lors de la <a href="http://blog.olivier-duval.info/?post/Optimisations-Apache-sur-un-NAS-Synology-209II-deflate-cache-expires-et-APC">mise en place du blog sur le NAS Synology</a></p>
<pre>     - <strong>combiner les images</strong> sous forme de <a href="http://www.w3schools.com/css/css_image_sprites.asp">sprites</a>, 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, - <strong>cookie à supprimer</strong> : servir les ressources statiques par un domaine sans cookie (ie &amp; nb OD : via un serveur de cache via un sous-domaine par exemple, <a href="http://wiki.nginx.org/Main">nginx</a> 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 <a href="http://www.stevesouders.com/blog/2009/05/12/sharding-dominant-domains/">domains sharding</a> , conseillé entre 2 à 4 domaines, pas plus, - flush partiel du HTML</pre>
<h3>Ressources</h3>
<ul>
<li>retour sur le <a href="http://braincracking.org/2011/01/10/concours-webperf-2010-les-bases/">concours de webperf</a>,</li>
<li>les présentations seront prochainement disponibles sur <a href="http://www.slideshare.net/nhoizey">Slideshare</a>,</li>
<li>un groupe dédié aux performances Web sur <a href="http://groups.diigo.com/group/web-performance">Diigo</a></li>
</ul>
<p>Les slides est disponibles sur le blog de <a href="http://www.clever-age.com/veille/blog/ameliorer-les-performances-web-les-optimisations-cote-client.html">Clever Age</a></p>
<h4>Javascript dans tous ses états</h4>
<p><img src="/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" /></p>
<p>Session présentée par <a href="http://www.doyoubuzz.com/bruno-michel">Bruno Michel</a> (<a href="http://af83.com/">AF83</a>) et <a href="http://twitter.com/#!/abolibibelot">Yann Schwartz</a> (Polom).</p>
<p>Un petit tour sur différentes librairies / frameworks en Javascript où pour certaines, j&#8217;avais déjà lu des billets sans en avoir vu des applications concrètes. Avouons-le, je n&#8217;aime pas particulièrement écrire du javascript. En revanche, son utilité n&#8217;est plus à démontrer et m&#8217;appuyer sur des librairies qui facilite son écriture, j&#8217;adore ça, découvrons en quelques unes.</p>
<h3>node.js</h3>
<p><a href="http://nodejs.org/">Serveur javascript</a> &amp; asynchrone, efficace pour les I/O (non bloquantes), asynchrone. Cette librairie permet d&#8217;écrire des scripts très performants (pour de la <a href="http://chat.nodejs.org/">messagerie instantanée</a>, notifications en temps réelles, &#8230;), tournant sur un seul thread, ce qui simplifie le développement car aucune synchronisation n&#8217;est nécessaire (ie&nbsp;: lock de ressources).</p>
<p>Des librairie sont fournies&nbsp;: <strong>http</strong>, <strong>socket</strong>, <strong>fs</strong>, qui facilitent grandement la programmation &#8220;bas niveau&#8221;, ainsi que l&#8217;adjonction de <a href="https://github.com/ry/node/wiki/modules">modules basés</a> sur node.js.</p>
<h3>Reactive Extensions rx.js</h3>
<p>Le pendant de Rx .NET, <a href="http://msdn.microsoft.com/en-us/devlabs/ee794896">rx.js</a> est une librairie Javascript pour de la programmation asynchrone, à base d&#8217;évènements qui suit le même paradygme que sa version .NET&nbsp;: Observable / Observer. Son lead developper est <a href="http://weblogs.asp.net/podwysocki/">Matthew Podwysocki</a>.</p>
<p>La démo présentée était sur une recherche Wikipédia (via son <a href="http://fr.wikipedia.org/w/api.php">API</a> 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 <strong>$.ajaxAsObservable</strong>  et des méthodes chaînées (Select, Where, Min, Max, &#8230;), &#8220;à la Linq&#8221;.</p>
<h3>CoffeeScript</h3>
<p>Avouons le, écrire du Javascript n&#8217;est pas toujours simple et conduit souvent à des erreurs de syntaxes (; } ou ) non fermées), même si nous avons des outils (<a href="https://addons.mozilla.org/fr/firefox/addon/firebug/">Firebug</a> le bien nommé); qui n&#8217;est pas resté bloqué des heures sur un simple problème de syntaxe&nbsp;?</p>
<p><a href="http://jashkenas.github.com/coffee-script/">CoffeeScript </a> se propose de simplifier la syntaxe du langage Javascript, en enlevant tout ce qui nous pose problème habituellement&nbsp;: les <strong>; {} ()</strong>, les <strong>var</strong>, 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, &#8230;).</p>
<p>Un portage Windows de CoffeeScript est en cours, hébergé sur le <a href="https://github.com/abolibibelot/coffeescript-dotnet">github coffeescript-dotnet</a>.</p>
<p>Le code des différentes démos est disponible sur le répertoire github <a href="https://github.com/abolibibelot/Techdays2011_Javascript">Techdays 2011 Javascript</a>.</p>
<h4>SEO&nbsp;: mythes et technique</h4>
<p><img src="/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" /></p>
<p>Par <a href="http://ajblog.fr/">Aymeric Jacquet</a>, 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é).</p>
<p>2 visions de référenceurs&nbsp;: les <strong>white hat</strong> (appelés les &#8220;bisounours&#8221;), les <strong>black hat</strong> (ou les &#8220;spammeurs&#8221;) qui ont une vision diamétralement opposée&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&#8217;autre se moque des guidelines, le lien est roi, et a donc une stratégie à court terme.</p>
<p><a href="http://www.wordle.net/">Wordle</a> peut être utile pour s&#8217;assurer de la densité des mots dans un billet ou un article, important pour un meilleur référencement sur un sujet d&#8217;actualité par exemple.</p>
<p>Quelques points pour améliorer son référencement Web&nbsp;:</p>
<ul>
<li>le <strong>rédactionnel</strong> est important,</li>
<li>écrire pour les <strong>robots</strong> ET les <strong>internautes</strong>,</li>
<li>le <strong>PageRank</strong> reste un indicateur de qualité,</li>
<li>les <strong>meta keywords</strong> ne sont pratiquement plus pris en compte par les moteurs, reste la <strong>meta description</strong>,</li>
<li>ne pas hésiter à créer des liens vers les pages profondes, les plus importantes,</li>
<li>le nom de domaine est important, cela peut valoir le coup d&#8217;en racheter des anciens qui ont déjà une bonne réputation pour faciliter le référencement, pour cela <a href="http://www.sedo.com/fr/home/bienvenue/">Sedo</a> peut nous aider,</li>
<li>le format des URLs (<strong>titre</strong>), le balisage HTML,</li>
<li>la <strong>rapidité d&#8217;affichage</strong>,</li>
<li>les <strong>ancres</strong> internes ou externes,</li>
<li>arrêter les &#8220;cliquez ici&#8221;, &#8220;la suite ici&#8221;, &#8230;</li>
<li>ne pas publier toutes les pages d&#8217;un site d&#8217;un coup (s&#8217;il y en a des milliers), Google n&#8217;aime pas ça, mettre des <strong>noindex</strong> et libérer au fur et à mesure</li>
</ul>
<h3>Ressources</h3>
<p>La référence en SEO&nbsp;: <a href="http://www.seomoz.org/blog">Seomoz</a></p>
<h4>MongoDB et C#</h4>
<p><img src="/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" /></p>
<p>Par <a href="http://twitter.com/#!/abolibibelot">Yann Schwartz</a> (Polom) et <a href="http://www.rui.fr/">Rui Carvalho</a>.</p>
<p>Le <strong>NoSQL</strong> (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&#8217;approche par une session sur un moteur NoSQL&nbsp;: <a href="http://www.mongodb.org/">MongoDB</a>.</p>
<p>Les &#8220;bases&#8221; NoSQL répondent souvent à un souci de performance qu&#8217;il faut résoudre. D&#8217;une façon générale, avec un SGBDR classique, on met en place un cache (sous forme de &#8220;Hashtable&#8221;) avec les données à afficher sur la page. Vient rapidement la problématique du cache réparti, dans le cas d&#8217;une ferme de frontaux, les bases NoSQL tentent alors d&#8217;y trouver une solution.</p>
<p>Il existe plusieurs modèles de NoSQL&nbsp;:</p>
<ul>
<li>sous forme de <strong>clés / valeurs</strong>, on pensera à <a href="http://memcached.org/">Memcached</a> ou <a href="http://redis.io/">Redis</a>,</li>
<li><strong>colonnes</strong>&nbsp;: <a href="http://en.wikipedia.org/wiki/BigTable">BigTable</a> (by Google), <a href="http://cassandra.apache.org/">Cassandra</a>,</li>
<li><strong>documents</strong>&nbsp;: <a href="http://couchdb.apache.org/">CouchDB</a> (moteur Erlang / Javascript &#8211; API RESTful), <a href="http://www.mongodb.org/">MongoDB</a> (moteur C++ / Javascript) (ndr&nbsp;: et j&#8217;ajouterais <a href="http://ravendb.net/">RavenDB</a>)&nbsp;: &#8220;documents&#8221; décrits sous forme d&#8217;arborescence d&#8217;objets/valeurs</li>
</ul>
<p>Le NoSQL ne garantit pas autant de fonctionnalités qu&#8217;un SGBD, notamment le transactionnel / journalisation. Il faudra alors accepter un compromis sur les propriétés <a href="http://fr.wikipedia.org/wiki/Transaction_informatique#Les_caract.C3.A9ristiques_ACID">ACID</a> qu&#8217;apportent les SGBDR, les NoSQL sont basées sur le théorème de <a href="http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP">CAP</a> (Eric Brewer) qui se définit selon 3 principes&nbsp;:</p>
<ul>
<li><strong>C</strong>onsistance / consistency&nbsp;: tous les clients ont la même vue lorsqu&#8217;il y a des mises à jour,</li>
<li><strong>A</strong>vailability (Haute disponibilité)</li>
<li><strong>P</strong>artition-tolerance (Tolérant à la partition)</li>
</ul>
<p>et on ne peut garantir uniquement que <strong>2 de ces principes</strong> à l&#8217;<strong>instant T</strong>.</p>
<p>Mais sinon, à quoi ça sert&nbsp;? en gros, avoir un cache à valeur ajoutée&nbsp;: <strong>requêtable</strong>, <strong>distribué</strong> et <strong>persistant</strong>.</p>
<p><ins>Quelques particularités de MongoDB :</ins></p>
<ul>
<li>facile à mettre en oeuvre,</li>
<li>fonctionne sous <a href="http://www.mongodb.org/display/DOCS/Quickstart+Windows">Windows</a>,</li>
<li>requêtes en JSON,</li>
<li>orienté documents&nbsp;: pour effectuer une analogie avec les SGBDR&nbsp;: document (de même nature) = 1 ligne, documents stockés dans des collections (~tables),</li>
<li>données stockées en BSON (binary JSON),</li>
<li>supporte la montée en charge,</li>
<li><a href="http://www.mongodb.org/display/DOCS/Drivers">drivers</a> dans la majorité des langages,</li>
<li>propose une console (<strong>mongo</strong>) pour requêter (en <strong>javascript</strong>) ou administrer,</li>
<li>de nombreuses librairies dont <a href="http://www.mongodb.org/display/DOCS/CSharp+Language+Center">C#</a> (supportée 10gen, on peut lui adjoindre l&#8217;extension Linq grâce à <a href="https://github.com/craiggwilson/fluent-mongo">fluent-mongo</a>) ou la version <a href="https://github.com/atheken/NoRM">C# alternative non officielle NoRM</a> (support de Linq)</li>
</ul>
<p>Attention&nbsp;:</p>
<ul>
<li>les documents sont limités à 4 Mo</li>
<li>flush toutes les 60 s sur le disque</li>
<li>pas de journalisation (prévue pour la 1.8)</li>
</ul>
<p><ins>exemples de requêtage :</ins></p>
<pre>$ 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 </pre>
<p>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&#8217;instant, cela peut surtout servir à mettre en place du cache, lorsque l&#8217;on souhaite mettre à plat des données pour un affichage (sur une page).</p>
<p>A tester&nbsp;!</p>
<p>Le <a href="http://www.rui.fr/news/techdays-2011-videos-asp-net-mvc3-et-mongodb/2011/03/17/">webcast</a> ou les <a href="https://bitbucket.org/rhwy/techdays-paris-2011-mongodb-csharp">sources de la démo</a> sont en ligne.</p>
<h3>Ressources</h3>
<p>Sources de la session disponibles sur le <a href="https://bitbucket.org/rhwy/techdays-paris-2011-mongodb-csharp">bitbucket de Rui</a>.</p>
<p>Retrouvez toutes les années via le <a href="http://blog.olivier-duval.info/?tag/techdays">tag techdays</a>.</p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=cWQNzmnmcBg:HUVEeZFEpZs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/cWQNzmnmcBg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/techdays-2011-jour-1-pleniere-cloud-computing-ameliorer-les-performances-web-javascript-dans-tous-ses-etats-seo-mythes-et-techniques-mongodb-et-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/techdays-2011-jour-1-pleniere-cloud-computing-ameliorer-les-performances-web-javascript-dans-tous-ses-etats-seo-mythes-et-techniques-mongodb-et-c/</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/divt13LzxSE/</link>
		<comments>http://blog.olivier-duval.info/bonne-resolutions-2011-quelques-mises-a-jour-de-nos-outils-sont-a-prevoir/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 08:30:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Opensource]]></category>
		<category><![CDATA[castle windsor]]></category>
		<category><![CDATA[dokuwiki]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[razor]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=333</guid>
		<description><![CDATA[Quelques sorties de nouvelles versions, programmons vite les mises à jour&#160;: ORM&#160;: NHibernate 3.0&#160;: Linq, Lazy property, memcached, QueryOver API pour les requêtes Criteria, un billet suivra sur certaines des nouveautés, IoC&#160;: Castle Windows 2.5.2&#160;: .NET &#8230; <a class="more-link" href="http://blog.olivier-duval.info/bonne-resolutions-2011-quelques-mises-a-jour-de-nos-outils-sont-a-prevoir/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Quelques sorties de nouvelles versions, programmons vite les mises à jour&nbsp;:</p>
<ul>
<li>ORM&nbsp;: <a href="http://zvolkov.com/blog/post/2010/12/04/Whats-new-in-NHibernate-30-GA.aspx" hreflang="en">NHibernate 3.0</a>&nbsp;: Linq, Lazy property, memcached, QueryOver API pour les requêtes <strong>Criteria</strong>, un billet suivra sur certaines des nouveautés,</li>
<li>IoC&nbsp;: <a href="http://stw.castleproject.org/Windsor.MainPage.ashx">Castle Windows 2.5.2</a>&nbsp;: .NET 4.0, réduction à seulement 2 assembly (au lieu de 4), et d&#8217;autres <a href="http://stw.castleproject.org/Windsor.Windsor_25_release_notes.ashx">améliorations</a>,</li>
<li>Wiki&nbsp;: <a href="http://www.dokuwiki.org/changes#release_2010-11-07_anteater">dokuWiki Anteater</a>&nbsp;: améliorations de l&#8217;API XmlRPC (ajout de la recherche plein texte dans les pages du Wiki), recherche sur le Wiki plus pertinente,</li>
<li>il me plait bien ce moteur de rendu <strong><a href="http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx">Razor</a></strong> d&#8217;<a href="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx">ASP.NET MVC 3 R2</a></li>
</ul>
<p>Y&#8217;a plus qu&#8217;à.</p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=divt13LzxSE:FnbILzUSzQM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/divt13LzxSE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/bonne-resolutions-2011-quelques-mises-a-jour-de-nos-outils-sont-a-prevoir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/bonne-resolutions-2011-quelques-mises-a-jour-de-nos-outils-sont-a-prevoir/</feedburner:origLink></item>
		<item>
		<title>Bonne année 2011 !</title>
		<link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/3d0AmavQi8s/</link>
		<comments>http://blog.olivier-duval.info/bonne-annee-2011/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 17:30:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog (attitude)]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[bonne année]]></category>
		<category><![CDATA[voeux]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=332</guid>
		<description><![CDATA[Santé, travail, amour et prospérité, que tous vos souhaits et projets se réalisent en 2011 ou après ! réalisation d&#8217;une talentueuse collègue ayant des compétences distinctives en graphisme &#38; co (&#8230;) sinon de ma composition, euh &#8230; <a class="more-link" href="http://blog.olivier-duval.info/bonne-annee-2011/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Santé, travail, amour et prospérité, que tous vos souhaits et projets se réalisent en 2011 ou après <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  !</strong></p>
<p>réalisation d&#8217;une talentueuse collègue ayant des compétences distinctives en graphisme &amp; co (&#8230;)</p>
<p><img src="http://farm6.static.flickr.com/5121/5312537044_3de023a961_d.jpg" alt="" /></p>
<p>sinon de ma composition, euh kitch non ?;)</p>
<p><img src="http://farm6.static.flickr.com/5048/5311864273_9b367a995e_d.jpg" alt="" /></p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=3d0AmavQi8s:94G2uS7fGGE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/3d0AmavQi8s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/bonne-annee-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/bonne-annee-2011/</feedburner:origLink></item>
		<item>
		<title>MS Days 2010</title>
		<link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/ot85PKn9xhs/</link>
		<comments>http://blog.olivier-duval.info/ms-days-2010/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 12:51:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[ms days]]></category>
		<category><![CDATA[séminaire]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=330</guid>
		<description><![CDATA[<p>Les <strong>6 &#38; 7 octobre 2010</strong> 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&#160;: dans Visual Studio / C#). Cet évènement n'est qu'un préambule à l'évènement de l'année, les <a href="http://www.microsoft.com/france/mstechdays/default.aspx">techdays 2011</a>, qui aura lieu du 8 au 10 février 2011 au Palais des congrés de Paris.</p> <p>Quelques notes de la 1ère journée.</p> <a class="more-link" href="http://blog.olivier-duval.info/ms-days-2010/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Les <strong>6 &amp; 7 octobre 2010</strong> ont eu lieu les MS Days 2010 (ou rencontres techniques), évènement qui parcourt toute la France sur les nouveautés de l&#8217;éditeur. C&#8217;est toujours l&#8217;occasion d&#8217;avoir un aperçu des nouveautés ou innovations côté Microsoft et de leur application côté code (ie&nbsp;: dans Visual Studio / C#). Cet évènement n&#8217;est qu&#8217;un préambule à l&#8217;évènement de l&#8217;année, les <a href="http://www.microsoft.com/france/mstechdays/default.aspx">techdays 2011</a>, qui aura lieu du 8 au 10 février 2011 au Palais des congrés de Paris.</p>
<p>Quelques notes de la 1ère journée.</p>
<p><span id="more-330"></span></p>
<h3>Windows Phone 7</h3>
<p>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.</p>
<ul>
<li>avant même d&#8217;ouvrir son smartphone (ie&nbsp;: accès à son profil via son mot de passe), bon nombre d&#8217;informations sont données sur l&#8217;écran&nbsp;: rendez-vous, # de messages reçus, etc</li>
<li>hubs&nbsp;: contrairement à ses concurrents (iPhone, Android, Blackberry), l&#8217;écran d&#8217;accueil de WP7 est organisé un peu différemment, le parti pris de partir sur des &#8220;hubs&#8221; 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,</li>
<li>Office intégré au smartphone = rapidité,</li>
<li>résolument orienté réseaux sociaux et la plateforme Windows Live (apparemment tout passe par Live pour publier, pas très avantageux me concernant),</li>
<li>MarketPlace&nbsp;: la plateforme d&#8217;applications Microsoft. Seul bémol à mon avis&nbsp;: pour les applications métiers, d&#8217;entreprise, obligation de passer par cette plateforme pour installer une application, ce qui va en refroidir plus d&#8217;un je pense (même si l&#8217;envrionnement de dév. est bien conçu avec une simulation du smartphone)</li>
<li>offre Orange Business Services avec un exemple de tarif sur 24 mois&nbsp;: 19,90 € HT (sans la voix qu&#8217;il faudra rajouter en sus)&nbsp;: 100 SMS, 3G+, Wifi, option mails, etc</li>
</ul>
<p>L&#8217;ergonomie du WP7 m&#8217;a plu, en tout cas, lors de la démo par le speaker. Le smartphone répond bien et est réactif.</p>
<h3>Azure&nbsp;: outils et bonnes pratiques</h3>
<p>Speaker&nbsp;: <a href="http://blog.couzy.com/">Pierre Couzy</a></p>
<p>Windows Azure se décline sur 3 axes&nbsp;: un environnement applicatif (plateforme), du stockage (Blob), de la base de données (SQL Azure), avec une facturation selon l&#8217;usage, et un avantage pour absorber une charge ponctuelle.</p>
<p>Parmi les &#8220;briques&#8221; qu&#8217;offre Azure, il y a la <strong>fédération d&#8217;identités</strong>. 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&#8217;identité (compte) d&#8217;accès à une application (et je peux en témoigner). Azure propose de simplifier tout cela en proposant un fournisseur d&#8217;identités qui s&#8217;intercale entre les différents systèmes, on retrouvera plusieurs sources de comptes possible&nbsp;: <strong>AD</strong>, Web (b<strong>ases de données</strong>), comptes tiers (Free, Google, &#8230;), <strong><a href="/?q=openid">OpenID</a></strong>, &#8230;</p>
<p>Concernant les <strong>données</strong>, plusieurs scénarios d&#8217;accès&nbsp;: JSON &amp; AtomPub, ou directement sur SQL.</p>
<p>Pour le développement, sous Visual Studio 2010, plusieurs composants sont disponibles avec le modèle projet <em>Cloud Service</em>, ce dernier paramètre les éléments à déployer sur le Cloud&nbsp;: nombre de VM, taille, etc sous forme d&#8217;un package ZIP à télécharger sur le portail Azure. Il est possible, via directement Visual Studio (cf. le <a href="http://www.microsoft.com/windowsazure/">SDK</a>) de déployer son projet, grâce à un certificat qui permet de signer le package.</p>
<p>Compter environ <strong>15 mn</strong> à chaque déploiement (préparation des VM, calcul de l&#8217;éloignement des machines dans le data center, &#8230;). Des éditeurs de solutions externes proposent également de l&#8217;outillage&nbsp;: <a href="http://www.cerebrata.com/products/cloudstoragestudio/">Cloud Storage Studio</a>.</p>
<p>Compte tenu du temps de déploiement, le développement pourra s&#8217;effectuer sur un environnement local (<a href="http://msdn.microsoft.com/en-us/library/dd179455.aspx">Dev. Fabric</a>) de simulation d&#8217;Azure, avec le gros avantage de pouvoir débugguer (cf. les <a href="http://msdn.microsoft.com/en-us/library/ee923628.aspx">différences</a> entre les 2 modes)</p>
<p><strong>Quelques préconisations :</strong></p>
<ul>
<li>pas de stockage sur le <em>FileSystem</em>, le <strong>BlobContainer</strong> est là pour ça, le système de fichiers est volatile, on l&#8217;utilisera que pour du temporaire (génération d&#8217;une image avant de l&#8217;envoyer par exemple). il y a également la possibilité de monter un Blob VHD qui sera visible comme un stockage local.</li>
</ul>
<ul>
<li>débuggage sur Azure&nbsp;: via <strong>Trace</strong> avec le provider Azure Diagnostic Monitor ou l&#8217;outil Azure Diagnostic Manager sur des sources (Eventviewer, IIS logs, &#8230;), ou <a href="http://msdn.microsoft.com/fr-fr/library/dd264915.aspx">IntelliTrace</a> de la version <strong>Ultimate</strong> de VStudio 2010.</li>
</ul>
<p>Le <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=413e88f8-5966-4a83-b309-53b7b77edf78&amp;displaylang=en">Windows Azure Plateform Training Kit</a> rassemble tous les scénarios possibles afin de s&#8217;en inspirer.</p>
<h3>Quoi de 9 dans IE&nbsp;?</h3>
<p>Speaker&nbsp;: <a href="http://blogs.msdn.com/b/davrous/">David Rousset</a></p>
<p>Après un bref historique d&#8217;IE (1995&nbsp;: IE 1, 2000&nbsp;: IE 6 avec XP, 2004&nbsp;: SP 2 IE 6, 2009&nbsp;: IE 8 avec Windows 7, 2010&nbsp;: IE 9 CTP, ne sera pas disponible sous XP), et de chiffres divers (25 % des migrations IE 6 -&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, &#8211; 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&#8217;accélération matérielle (GPU).</p>
<p><strong>Ergonomie / usage :</strong></p>
<ul>
<li>1 seule barre de navigation et de recherche, au même titre que la concurrence, la tendance est à la simplicité et l&#8217;épuration de la barre de navigation,</li>
<li>possibilité de sortir les onglets du navigateur,</li>
<li>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),</li>
<li>gestionnaire de téléchargements revu,</li>
<li><strong>about:Tabs</strong>&nbsp;: les sites les plus populaires,</li>
<li>gestion et prévention concernant les add-ons (temps pris par ces derniers à l&#8217;ouverture d&#8217;un onglet)</li>
</ul>
<p><strong>HTML 5 / CSS 3 :</strong></p>
<ul>
<li>balises &lt;video&gt; (codec H264, VP8 selon les navigateurs), &lt;canvas&gt; (bitmap)</li>
<li>CSS3&nbsp;: animations, coins arrondis, opacité, &#8230;</li>
<li>SVG 1.1&nbsp;: format vectoriel</li>
</ul>
<p>dans les 6 prochains mois, ce qui intéresse les développeurs&nbsp;: CSS 3&nbsp;: 76 % , HTML5 vidéo&nbsp;: 68 %</p>
<p>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 <a href="http://acid3.acidtests.org/">ACID 3</a> ne représente que 100 tests, et pour certains, ils ne seront pas implémentés au final. ACID 3 est plus marketing qu&#8217;un véritable test.</p>
<ul>
<li>les développeurs n&#8217;ont pas été oubliés&nbsp;: la barre <strong>F12</strong> permet une multitude d&#8217;aides au développement (CSS,HTML,debug, JS,&#8230;)</li>
</ul>
<p><a href="http://ie.microsoft.com/testdrive/">Démos</a> de benchmarking&nbsp;: <a href="http://ie.microsoft.com/testdrive/Performance/AmazonShelf/Default.html">Amazon Shelf</a>, <a href="http://ie.microsoft.com/testdrive/Performance/10FlickrExplorer/Default.html">Flickr Explorer</a>, <a href="http://www.nevermindthebullets.com">NeverMind the Bullets</a>, <a href="http://ie.microsoft.com/testdrive/Performance/FishIE%20tank/Default.html">FishIE Tank</a></p>
<p><strong>moteur Javascript</strong>&nbsp;: le moteur (<a href="http://www.thewindowsclub.com/microsofts-new-javascript-engine-codenamed-chakra-for-internet-explorer-9">Chakra</a>) a été revu afin d&#8217;exploiter au maximum le multi-coeurs des processeurs actuels&nbsp;: compilation à la volée du script sur un coeur puis exécution.</p>
<p>Il reste possible d&#8217;utiliser le moteur IE 8 dans IE 9. Il est conseillé d&#8217;utiliser la <em>technical preview</em>  afin de ne pas remplacer Internet Explorer installé sur la machine en cours.</p>
<p>Toutes les informations sur le <a href="http://blogs.msdn.com/b/iefrance/">blog d&#8217;IE FR</a>.</p>
<h3>Applications d&#8217;entreprise avec .NET 4 et Silverlight 4</h3>
<p>Speaker&nbsp;: <a href="http://blogs.msdn.com/b/mitsu/">Mitsu Furuta</a></p>
<p>Evolutions de l&#8217;accès aux données&nbsp;: ADO (connexion directe à la base), Web services (WCF, apporte une couche d&#8217;abstraction), standardisation avec RSS et REST (+CRUD), requetage avec Linq, du syncrhone à l&#8217;asynchrone.</p>
<p><strong>RIA Services :</strong> framework utilisé avec Silverlight pour l&#8217;accès aux données, propriétaire dans le sens où le framework génère la partie cliente (ie&nbsp;: proxy), intégré dans <a href="http://www.silverlight.net/getstarted/silverlight-4/">SL Tools 4.0</a></p>
<p><strong>Reactive Framework :</strong> <a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx">Rx</a> est un framework dédié à Silverlight / WPF, il permet de gérer l&#8217;asynchronisme tout en écrivant séquentiellement du code (et non plus des délégués à n&#8217;en plus finir avec <em>OnComplete</em>), ce qui rend le code plus lisible. Une version Javascript est aussi développé (intéressant pour les appels Ajax&nbsp;! <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=ot85PKn9xhs:Gcjsa629QAs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/ot85PKn9xhs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/ms-days-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/ms-days-2010/</feedburner:origLink></item>
		<item>
		<title>“meme” du jour : URL-ABC</title>
		<link>http://feeds.olivier-duval.info/~r/OlivierDuval/~3/IdvsD_L-jqQ/</link>
		<comments>http://blog.olivier-duval.info/meme-du-jour-url-abc/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 11:48:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[meme]]></category>
		<category><![CDATA[urlabc]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=329</guid>
		<description><![CDATA[Prendre le 1er site que propose le navigateur pour chaque lettre (Chrome chez moi), cela donne ceci&#160;: A http://area51.stackexchange.com B http://www.bnpparibas.net C http://www.codethinked.com D http://docs.google.com E http://ebay.fr F http://facebook.com G http://gmail.com H http://hotmail.com I http://www.imc.fr J &#8230; <a class="more-link" href="http://blog.olivier-duval.info/meme-du-jour-url-abc/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Prendre le 1er site que propose le navigateur pour chaque lettre (Chrome chez moi), cela donne ceci&nbsp;:</p>
<ul>
<li>A <a href="http://area51.stackexchange.com" title="http://area51.stackexchange.com">http://area51.stackexchange.com</a></li>
<li>B <a href="http://www.bnpparibas.net" title="http://www.bnpparibas.net">http://www.bnpparibas.net</a></li>
<li>C <a href="http://www.codethinked.com" title="http://www.codethinked.com">http://www.codethinked.com</a></li>
<li>D <a href="http://docs.google.com" title="http://docs.google.com">http://docs.google.com</a></li>
<li>E <a href="http://ebay.fr" title="http://ebay.fr">http://ebay.fr</a></li>
<li>F <a href="http://facebook.com" title="http://facebook.com">http://facebook.com</a></li>
<li>G <a href="http://gmail.com" title="http://gmail.com">http://gmail.com</a></li>
<li>H <a href="http://hotmail.com" title="http://hotmail.com">http://hotmail.com</a></li>
<li>I <a href="http://www.imc.fr" title="http://www.imc.fr">http://www.imc.fr</a></li>
<li>J <a href="http://julienboisard.fr" title="http://julienboisard.fr">http://julienboisard.fr</a></li>
<li>K <a href="http://www.krakote.com" title="http://www.krakote.com">http://www.krakote.com</a></li>
<li>L <a href="http://lutalivre.fr" title="http://lutalivre.fr">http://lutalivre.fr</a></li>
<li>M <a href="http://meteofrance.com" title="http://meteofrance.com">http://meteofrance.com</a></li>
<li>N <a href="http://netvibes.com" title="http://netvibes.com">http://netvibes.com</a></li>
<li>O <a href="http://www.obturations.com" title="http://www.obturations.com">http://www.obturations.com</a></li>
<li>P <a href="http://programme-tv.net" title="http://programme-tv.net">http://programme-tv.net</a></li>
<li>Q <a href="http://www.quelle.fr" title="http://www.quelle.fr">http://www.quelle.fr</a></li>
<li>R <a href="http://rtl9.com" title="http://rtl9.com">http://rtl9.com</a></li>
<li>S <a href="http://sharpness.me" title="http://sharpness.me">http://sharpness.me</a></li>
<li>T <a href="http://twitter.com" title="http://twitter.com">http://twitter.com</a></li>
<li>U <a href="http://upload.facebook.com" title="http://upload.facebook.com">http://upload.facebook.com</a></li>
<li>V <a href="http://vimeo.com" title="http://vimeo.com">http://vimeo.com</a></li>
<li>W <a href="http://www.flickr.com" title="http://www.flickr.com">http://www.flickr.com</a></li>
<li>X</li>
<li>Y <a href="http://www.youtube.com" title="http://www.youtube.com">http://www.youtube.com</a></li>
<li>Z <a href="http://zorky.darqroom.fr" title="http://zorky.darqroom.fr">http://zorky.darqroom.fr</a></li>
</ul>
<p>petites frayeurs pour le S et le P <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  si vous avez des sites pour le X, je reste intéressé bien évidemment.</p>
<p>A qui le tour&nbsp;?</p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=IdvsD_L-jqQ:vq0T9R2Whpk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/IdvsD_L-jqQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/meme-du-jour-url-abc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/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/O4PzQnS25K4/</link>
		<comments>http://blog.olivier-duval.info/dokuwiki-et-integration-sso-annuaire-modeles-co/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 22:45:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web[2.0]]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[authentification]]></category>
		<category><![CDATA[dokuwiki]]></category>
		<category><![CDATA[sso]]></category>
		<category><![CDATA[websso]]></category>

		<guid isPermaLink="false">http://diskstation/wp-3.2.1/wordpress/?p=328</guid>
		<description><![CDATA[<h4>Préambule</h4> <p>Avant de parler plus spécialement de <a href="http://www.dokuwiki.org">dokuWiki</a> , un point sur le mot <strong>intégration</strong> d'applications. Que signifie "intégrer une application ou un progiciel ou un module ou ..." et comment le permet-on&#160;?</p> <p>On peut avoir plusieurs niveaux d'intégration entre 2 applications (Web j'entends), toutes doivent être, si possible, transparentes pour l'utilisateur&#160;:</p> <ul> <li>inclure des données d'une application A dans une application B&#160;: l'utilisateur se trouve sur la A, et des informations du site B sont incluses dans le 1er sous diverses formes&#160;: <strong>flux RSS</strong>, <strong>widget</strong>, <a href="http://code.google.com/intl/fr-FR/apis/opensocial/">OpenSocial</a>, à l'aide d'une <strong>API</strong> (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),</li> <li>à 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),</li> </ul> <p>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 <strong>transparente</strong> pour l'utilisateur une application dans une autre pour y apporter un service supplémentaire.</p> <p>L'intégration d'une application est souvent rendu possible à l'aide d'<strong>API</strong> sous forme de services Web (données, annuaire, ...) et aussi également par l'ajout d'un <strong>(Web)SSO</strong> 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.</p> <a class="more-link" href="http://blog.olivier-duval.info/dokuwiki-et-integration-sso-annuaire-modeles-co/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h4>Préambule</h4>
<p>Avant de parler plus spécialement de <a href="http://www.dokuwiki.org">dokuWiki</a> , un point sur le mot <strong>intégration</strong> d&#8217;applications. Que signifie &#8220;intégrer une application ou un progiciel ou un module ou &#8230;&#8221; et comment le permet-on&nbsp;?</p>
<p>On peut avoir plusieurs niveaux d&#8217;intégration entre 2 applications (Web j&#8217;entends), toutes doivent être, si possible, transparentes pour l&#8217;utilisateur&nbsp;:</p>
<ul>
<li>inclure des données d&#8217;une application A dans une application B&nbsp;: l&#8217;utilisateur se trouve sur la A, et des informations du site B sont incluses dans le 1er sous diverses formes&nbsp;: <strong>flux RSS</strong>, <strong>widget</strong>, <a href="http://code.google.com/intl/fr-FR/apis/opensocial/">OpenSocial</a>, à l&#8217;aide d&#8217;une <strong>API</strong> (service Web SOAP, REST, XmlRPC, &#8230;) 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),</li>
<li>à partir d&#8217;une application A, qu&#8217;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),</li>
</ul>
<p>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&#8217;il s&#8217;agit d&#8217;intégrer de façon <strong>transparente</strong> pour l&#8217;utilisateur une application dans une autre pour y apporter un service supplémentaire.</p>
<p>L&#8217;intégration d&#8217;une application est souvent rendu possible à l&#8217;aide d&#8217;<strong>API</strong> sous forme de services Web (données, annuaire, &#8230;) et aussi également par l&#8217;ajout d&#8217;un <strong>(Web)SSO</strong> qui permet à l&#8217;utilisateur de passer d&#8217;une application vers une application avec son même login et mot de passe et ce, sans se reconnecter s&#8217;il l&#8217;était déjà, s&#8217;authentifier qu&#8217;une seule fois est très important afin de faciliter l&#8217;usage des outils.</p>
<p><span id="more-328"></span></p>
<p><img src="http://farm5.static.flickr.com/4003/4679698377_b2ff5ec9e7_d.jpg" alt="" /></p>
<h4>dokuWiki</h4>
<h3>Wiki</h3>
<p>Une petite définition d&#8217;un Wiki, selon <a href="http://fr.wikipedia.org/wiki/Wiki">Wikipédia</a></p>
<blockquote><p>Un wiki est un site web dont les pages sont modifiables par tout ou partie des visiteurs du site. Il permet ainsi l&#8217;écriture et l&#8217;illustration collaboratives de documents.</p>
</blockquote>
<p>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&#8217;est à dire des <strong>balises</strong> simples pour formater le texte d&#8217;une page (gras, liens, titres, &#8230;), l&#8217;écriture de ce billet est effectué de cette façon, à l&#8217;aide de balises Wiki, d&#8217;autres moteur de blog implémentent <a href="http://fr.wikipedia.org/wiki/Markdown">Markdown</a> ou <a href="http://textism.com/tools/textile/">Textile</a> qui suivent le même principe .</p>
<p>La <strong>collaboration</strong> sur un document est effectuée contributeur par contributeur, c&#8217;est à dire qu&#8217;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, <a href="http://docs.google.com">Google docs</a> est plus approprié (que l&#8217;on ait un compte google ou non), plus dédié à de court document je pense, à la &#8220;Word&#8221;.</p>
<p>Exemples d&#8217;utilisation d&#8217;un Wiki&nbsp;:</p>
<ul>
<li>élaboration d&#8217;une documentation sur un projet afin de garder un historique</li>
<li>documentation d&#8217;une plateforme</li>
<li>manuels utilisateur ou tutoriels</li>
</ul>
<h3>le choix de dokuWiki</h3>
<p><img src="/public/dokuwiki-128.png" alt="dokuwiki" style="float:right; margin: 0 0 1em 1em;" title="dokuwiki, juin 2010" /></p>
<p>Pourquoi <strong>dokuWiki</strong>&nbsp;?</p>
<p>Parmi la pléthore de moteurs qui existent sur le <a href="http://www.wikimatrix.org">marché OpenSource ou non</a>, 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&#8217;<strong>authentification</strong>, des <strong>modèles</strong> (de charte graphique), <strong>API</strong> (<a href="http://www.dokuwiki.org/devel:xmlrpc">XmlRPC</a> et API interne), avec bien entendu bon nombre de plugins proposés (&gt; 600) (cf. les <a href="http://www.dokuwiki.org/features">fonctionnalités</a>), sans compter une architecture de développement de plugins bien pensée (<a href="http://www.dokuwiki.org/devel:events">évènements et hooks</a> utilisées dans les <a href="http://www.dokuwiki.org/devel:action_plugins">actions</a>).</p>
<p>L&#8217;un des points négatifs de mon point de vue étant qu&#8217;il soit développé en PHP <img src='http://blog.olivier-duval.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  mais on s&#8217;y remet vite aux $, mais aussi, des releases officielles peu fréquentes, malgré un <a href="http://github.com/splitbrain/dokuwiki">trunk assez actif</a>.</p>
<h3>Principes d&#8217;authentification</h3>
<p><img src="/public/identite.png" alt="sso-identite" style="float:right; margin: 0 0 1em 1em;" title="sso-identite, juin 2010" /></p>
<p>dokuWiki propose un système d&#8217;<strong>authentification</strong> extensible, qui peut être étendu à d&#8217;autres protocoles d&#8217;<a href="http://www.dokuwiki.org/auth">authent</a> (<a href="http://www.dokuwiki.org/auth:ldap">LDAP</a>, <a href="http://fr.wikipedia.org/wiki/Central_Authentication_Service">CAS</a>, <a href="http://fr.wikipedia.org/wiki/Shibboleth_(fédération_d&#039;identité)">Shibboleth</a>, OpenID, NTLM, <a href="http://www.dokuwiki.org/:auth:ad">AD</a>, spécifique, etc). Par défaut, dokuWiki gère les logins et mots de passe sous forme de fichier texte (le mode <em><a href="http://www.dokuwiki.org/auth:plain">plain</a></em>).</p>
<p>Il suffit de dériver de la classe <strong>auth_basic</strong> (l&#8217;interface/classe abstraite qui représente le contrat d&#8217;authent), d&#8217;implémenter les méthodes obligatoires et certaines optionnelles, et ensuite de préciser la stratégie utilisée pour l&#8217;authentification (la nouvelle classe dérivée d&#8217;auth_basic) dans le fichier de configuration (l&#8217;entrée <strong>$conf['authtype'] = &#8216;maclasse&#8217;</strong>)&nbsp;: dokuWiki se chargera d&#8217;instancier cette dernière et d&#8217;appeler les méthodes voulues qui sont précisées dans la classe dérivée, à l&#8217;aide du tableau <strong>cando</strong> définit dans la classe de base auth_basic.</p>
<p>Par exemple <strong>addUser</strong> à <strong>true</strong> provoquera l&#8217;appel de la méthode <strong>createUser($user,$pwd,$name,$mail,$grps=null)</strong> qui devra être implémentée.</p>
<p>Souvent, les méthodes utilisées permettent de se brancher sur une base de comptes existantes (bdd, LDAP, &#8230;qu&#8217;on appellera référentielle) pour les besoins d&#8217;authent et d&#8217;annuaire (login mais aussi nom, prénom, email, &#8230;), afin de lire le compte et/ou ses groupes d&#8217;accès ou bien de le modifier, la page <a href="http://www.dokuwiki.org/devel:authentication_backends#required_methods">authentication_backend</a> précise les méthodes à utiliser le cas échéant.</p>
<p>Dans ce cas, nous avons bien de la <strong>fédération d&#8217;identités</strong> (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&#8217;application A, dokuWiki, etc, on ne répond pas dans ce cas au besoin de <strong>SSO</strong>&nbsp;: 1 login et ne pas se réauthentifier sur dokuWiki si on l&#8217;était déjà sur l&#8217;application A.</p>
<p>dokuWiki propose la méthode <strong>trustExternal</strong> qui surpasse toutes les autres (elles seront alors ignorées à quelques exceptions près), elle nous permettra d&#8217;implémenter le SSO. Son activation s&#8217;effectue via le tableau <strong>cando</strong> avec la clé <strong>external</strong> qu&#8217;on mettra à true dans le constructeur de la classe dérivée.</p>
<pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cando</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'external'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span></pre>
<p>Le <strong>SSO</strong>, comment&nbsp;?</p>
<p>On peut voir au moins 2 manières d&#8217;implémenter du SSO, ou plus précisemment détecter une authentification existante sur un site tiers&nbsp;:</p>
<ul>
<li>par l&#8217;usage d&#8217;un <strong>cookie de domaine</strong>, qui contiendra un jeton&nbsp;: nous dira si l&#8217;internaute est déjà passé par une application et qu&#8217;il s&#8217;est donc déjà authentifié&nbsp;: si non, soit une redirection s&#8217;effectuera afin de le rediriger vers un point central d&#8217;authent, soit sur l&#8217;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&#8217;arrivée de l&#8217;internaute (s&#8217;il était déjà connecté sur une application partenaire), le jeton contenu dans le cookie est bien évidemment à vérifier afin d&#8217;éviter toute faille de sécurité. S&#8217;il n&#8217;existe pas de cookie avec le jeton, il est redirigé vers l&#8217;application qui centralise l&#8217;authentification, se connecte, le cookie est fixé avec le jeton, puis il est redirigé vers l&#8217;application appelante dokuWiki.</li>
</ul>
<p>Cela est schématisé par l&#8217;image suivante, si l&#8217;internaute était arrivé par l&#8217;application A, le cookie de domaine serait déjà garni lors de l&#8217;arrivée sur dokuWiki, cela réduit d&#8217;un aller-retour systématique, ce qui n&#8217;est pas le cas dans la solution par session ci-après</p>
<p><img src="/public/.doku-cookie_m.jpg" alt="doku-cookie.png" style="display:block; margin:0 auto;" title="doku-cookie.png, juin 2010" /></p>
<p>En revanche, une très grosse contrainte technique des navigateurs sur HTTP peut rendre difficile son utilisation, comme le précise le <a href="http://www.ietf.org/rfc/rfc2109.txt">RFC 2109</a>, section <em>4.3.2 Rejecting Cookies</em></p>
<blockquote><p>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</p>
</blockquote>
<p>autrement dit, cela interdit les sous-domaines qui contiendraient un . (point ou <em>dot</em>), d&#8217;aller plus loin de 2 niveaux que <strong>domain.ntld</strong>. Par exemple <em>www.info.domain.ntld</em> et <em>www.finance.domain.ntld</em> ne pourront pas partager le même cookie de domaine (qui serait fixé sur domain.ntld), alors que pour <em>docs.google.com</em> et <em>calendar.google.com</em> cela est rendu possible. Cette contrainte devrait être levée dans les futures versions des navigateurs, en attendant, il faudra trouver une autre solution.</p>
<ul>
<li>en jouant sur l&#8217;<strong>ouverture de session</strong>, puis ensuite par un jeu de redirection&nbsp;: la 1ère fois que l&#8217;internaute arrive sur dokuWiki, à l&#8217;ouverture de session, il est instantanément redirigé vers la plateforme/application qui centralise l&#8217;authentification (application A), vers une page spéciale qui gèrera ensuite le retour vers dokuWiki&nbsp;: si l&#8217;internaute était connecté sur application A alors il est immédiatement redirigé vers dokuWiki, sinon il se connecte puis est redirigé vers dokuWiki. L&#8217;URL de retour contient notamment en paramètre un jeton de type <a href="http://fr.wikipedia.org/wiki/Keyed-Hash_Message_Authentication_Code">HMAC </a>, avec une clé secrète partagée entre l&#8217;application qui gère le login et dokuWiki afin de s&#8217;assurer de qui envoie les informations vers le Wiki lors de l&#8217;authentification, notamment la clé utilisateur (id, email, &#8230;). Ce type de challenge est assez courant, on retrouve ce principe de redirections sur OpenID ou OAuth.</li>
</ul>
<p>le principe&nbsp;:</p>
<p><img src="/public/.doku-session_m.jpg" alt="doku-session.png" style="display:block; margin:0 auto;" title="doku-session.png, juin 2010" /></p>
<p>Même si elle impose automatiquement une redirection, la 2è solution est moins contraignante, nous choisirons donc cette dernière pour dokuWiki.</p>
<p>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&#8217;authentifier. L&#8217;URL de retour vers le Wiki contient le jeton HMAC, ainsi qu&#8217;une clé identifiant l&#8217;utilisateur qui s&#8217;est authentifié, clé qui pourra être utilisé dans un service d&#8217;annuaire pour en connaitre plus sur lui (nom, prénom, email). On pourra ajouter également la date/heure de connexion de l&#8217;utilisateur afin de limiter l&#8217;usage du lien / jeton dans le temps.</p>
<p>Concernant les groupes d&#8217;accès, dokuWiki stocke le(s) groupe(s) dans un fichier texte <strong>~dokuwiki/conf/acl.auth.php</strong>, la clé de configuration ACL doit être activée <strong>$conf['useacl']=1;</strong> . On pourra s&#8217;aider d&#8217;un service d&#8217;habilitations, inclus ou non dans le service d&#8217;annuaire, afin de déterminer à quels groupes appartient l&#8217;utilisateur qui arrive sur le Wiki.</p>
<p>un exemple de groupes d&#8217;accès, déclinés selon les <a href="http://www.dokuwiki.org/acl#background_info">droits dokuWiki</a>&nbsp;:</p>
<pre> *       @ALL    0 *       @rpc    4 *       @geeks  16 *       @geeks%2dro     1 </pre>
<p>Le groupe <em>geeks</em> a tous les droits d&#8217;édition sur les pages, ainsi que sur les fichiers, pour une population de <strong>contributeurs</strong>. Le groupe <em>rpc</em> pourrait être affecté lors de l&#8217;accès à l&#8217;API (XmlRPC ou la syndication) par un système tiers, avec des droits moins forts (pas de suppression par exemple). Le groupe <em>geeks-ro</em> (les caractères du type <strong>-</strong> doivent être fournis en code hexa) pourrait être réservé pour des utilisateurs qui n&#8217;ont droit qu&#8217;à une <strong>consultation</strong> seule (et non à l&#8217;édition). Tout le reste (@ALL) aucun droit.</p>
<h3>exemples de code</h3>
<p>On aura besoin&nbsp;: de la <strong>classe dérivée</strong>, de son <strong>constructeur</strong>, et de la méthode <strong>trustExternal</strong> qui contiendra l&#8217;initialisation de l&#8217;utilisateur et groupes appartenant à dokuWiki. Hormis l&#8217;authentification et l&#8217;affectation des groupes, l&#8217;authent est souvent couplé à un service d&#8217;annuaire, afin de connaitre a minima l&#8217;email, le nom, prénom et civilité du connecté. A défaut de service d&#8217;annuaire (SOAP, REST), ces derniers pourraient être renvoyés en même temps que l&#8217;URL de retour, en tant que paramètres.</p>
<p>Ce ne sont que des bouts de code pour démontrer le principe en 3 étapes, le principal étant dans <strong>trustExternal</strong></p>
<p><img src="/public/.principes-provider_m.jpg" alt="principes-provider.png" style="display:block; margin:0 auto;" title="principes-provider.png, juin 2010" /></p>
<p>Les parties dont on a besoin&nbsp;:</p>
<p>la classé dérivée que nous nommerons <strong>auth_provider</strong>, hérite de <strong>auth_basic</strong>, dokuWiki sait quel provider instancier par la clé de configuration <strong>$conf['authtype']=&#8217;provider&#8217;</strong>, la classe sera contenue dans le fichier <strong>~dokuwiki/inc/auth/provider.class.php </strong></p>
<pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> auth_provider <span style="color: #000000; font-weight: bold;">extends</span> auth_basic <span style="color: #009900;">&#123;</span>   <span style="color: #339933;">...</span> <span style="color: #009900;">&#125;</span></pre>
<p>son constructeur</p>
<pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> auth_provider<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>       <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cando</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'external'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// on utilise le mode external pour l'authent, seule trustExternal sera appelée de façon implicite</span>       <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cando</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'logoff'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// pour usage manuel, vidage cookie et session, permet d'ajouter à une page ?do=logout pour un logoff</span> &nbsp;       <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">success</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span>       <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>     <span style="color: #009900;">&#125;</span></pre>
<p>et la méthode <strong>trustExternal</strong> pour l&#8217;initialisation de l&#8217;utilisateur dokuWiki avec ses groupes si le <em>challenge</em> SSO a réussi</p>
<pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> trustExternal<span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #339933;">,</span><span style="color: #000088;">$pass</span><span style="color: #339933;">,</span><span style="color: #000088;">$sticky</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>       <span style="color: #666666; font-style: italic;">// session déjà ouverte ? on initialise l'utilisateur dokuWiki</span>       <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span>DOKU_COOKIE<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'auth'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'buid'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>       <span style="color: #009900;">&#123;</span>             <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_setUser<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span>DOKU_COOKIE<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'auth'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'buid'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>       <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// retour de la redirection de l'appli de login ?</span>                         <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;token&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #000000; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>             <span style="color: #009900;">&#123;</span>               <span style="color: #666666; font-style: italic;">// vérif signature / clé</span>               <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_verifSignature<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;token&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ui'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>               <span style="color: #009900;">&#123;</span>                   <span style="color: #666666; font-style: italic;">// appel à un service d'annuaire pour l'obtention des infos utilisateurs</span>                   <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">annuaireGetUser</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ui'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                   <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span>                    <span style="color: #009900;">&#123;</span>                      <span style="color: #666666; font-style: italic;">// init utilisateur dokuWiki</span>                                        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_setUser<span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                   <span style="color: #009900;">&#125;</span>               <span style="color: #009900;">&#125;</span>                         <span style="color: #666666; font-style: italic;">// non alors redirection vers l'app login              </span>             <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>                               <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Location: http://&quot;</span><span style="color: #339933;">.</span>APPLICATION_A<span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/logon/?return_url=&quot;</span><span style="color: #339933;">.</span><span style="color: #990000;">rawurlencode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://&quot;</span><span style="color: #339933;">.</span>SERVEUR_WIKI<span style="color: #339933;">.</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                         <span style="color: #009900;">&#125;</span> &nbsp;       <span style="color: #009900;">&#125;</span> &nbsp;       <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">success</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>       <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>  <span style="color: #009900;">&#125;</span> &nbsp;   <span style="color: #666666; font-style: italic;">// initialise l'utilisateur dokuWiki</span>   <span style="color: #000000; font-weight: bold;">function</span> _setUser<span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span>   <span style="color: #009900;">&#123;</span>          <span style="color: #990000;">global</span> <span style="color: #000088;">$USERINFO</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// l'utilisateur dokuWiki</span>      <span style="color: #000088;">$grps</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// groupe(s) de l'utilisateur</span> &nbsp;           <span style="color: #666666; font-style: italic;">// profil utilisateur dokuWiki         </span>      <span style="color: #000088;">$USERINFO</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Nom</span><span style="color: #339933;">;</span>      <span style="color: #000088;">$USERINFO</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mail'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">;</span>      <span style="color: #990000;">array_unshift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$grps</span><span style="color: #339933;">,</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">groupe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #000088;">$USERINFO</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'grps'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$grps</span><span style="color: #339933;">;</span> &nbsp;           <span style="color: #666666; font-style: italic;">// obligatoire</span>      <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REMOTE_USER'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Email</span><span style="color: #339933;">;</span> &nbsp;      <span style="color: #666666; font-style: italic;">// session de cache dokuWiki     </span>      <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span>DOKU_COOKIE<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'auth'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Nom</span><span style="color: #339933;">;</span>      <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span>DOKU_COOKIE<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'auth'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'info'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$USERINFO</span><span style="color: #339933;">;</span>      <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span>DOKU_COOKIE<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'auth'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'time'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #009900;">&#125;</span></pre>
<p>et voilà&nbsp;!</p>
<p>Le SSO est une réelle valeur ajoutée pour l&#8217;utilisateur, quoi de plus désarmant que de devoir se connecter plusieurs fois, voire, avec un compte différent. Dans un autre contexte, <a href="/?post/OpenID,-Google,-Yahoo,-Orange,-MyOpenID,-Facebook,-LiveID-and-me-:-l-authentification-à-moindre-frais">OpenID</a>, 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.</p>
<h3>Modèles, plugins</h3>
<p>dokuWiki, dans sa conception permet d&#8217;étendre et de développer son propre modèle de charte. Le mieux étant de partir d&#8217;un <a href="http://www.dokuwiki.org/template">template existant</a> et de le modifier. Le modèle est stocké sur <strong>~dokuwiki/lib/tpl/&lt;template&gt;</strong>.</p>
<p>Egalement, le nombre de <a href="http://www.dokuwiki.org/plugins">plugins</a> proposé est assez conséquent, 650&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 <strong>~dokuwiki/lib/plugins/&lt;plugin&gt;</strong>. Chaque plugin est désactivable par la simple création d&#8217;un fichier vide <em>disabled</em>. Pour l&#8217;authentification, il nous faudra au moins le plugin <a href="http://www.dokuwiki.org/plugin:acl">acl</a>. Parmi les intéressants, on notera <a href="http://www.dokuwiki.org/plugin:tag">tag</a> qui permet de marquer une page par des tags et de retrouver toutes les pages relatives à un <em>tag</em>, mais aussi <a href="http://www.dokuwiki.org/plugin:note">note</a> ou <a href="http://www.dokuwiki.org/plugin:odt">odt</a>, il reste le plugin <a href="http://www.dokuwiki.org/plugins?plugintag=pdf">PDF</a> à tester.</p>
<div class="feedflare">
<a href="http://feeds.olivier-duval.info/~ff/OlivierDuval?a=O4PzQnS25K4:dzUjyjVeeuE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OlivierDuval?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OlivierDuval/~4/O4PzQnS25K4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.olivier-duval.info/dokuwiki-et-integration-sso-annuaire-modeles-co/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.olivier-duval.info/dokuwiki-et-integration-sso-annuaire-modeles-co/</feedburner:origLink></item>
	</channel>
</rss>

