<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Way of Spark &#187; Web</title>
	<atom:link href="http://wayofspark.com/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://wayofspark.com</link>
	<description>problèmes et solutions de l&#039;informatique de tous les jours, pour nous, les devs.</description>
	<lastBuildDate>Sat, 14 Aug 2010 11:31:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Testez vos sites facilement sous tous les navigateurs avec Spoon / Xenocode</title>
		<link>http://wayofspark.com/2010/08/14/testez-vos-sites-facilement-sous-tous-les-navigateurs-avec-spoon-xenocode/</link>
		<comments>http://wayofspark.com/2010/08/14/testez-vos-sites-facilement-sous-tous-les-navigateurs-avec-spoon-xenocode/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 11:18:13 +0000</pubDate>
		<dc:creator>Spark</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[navigateurs]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://wayofspark.com/?p=415</guid>
		<description><![CDATA[Quand on développe des sites, on tombe forcement à un moment sur le problème de la compatibilité multi-navigateur : comment faire pour tester à la fois sous Firefox, sous IE (enfin sous tous les IE), puis aussi sous Chrome, Opéra&#8230; Il existe plusieurs solutions plus ou moins efficace pour ce problème (comme par exemple la [...]]]></description>
			<content:encoded><![CDATA[<p>Quand on développe des sites, on tombe forcement à un moment sur le problème de la compatibilité multi-navigateur : comment faire pour tester à la fois sous Firefox, sous IE (enfin sous tous les IE), puis aussi sous Chrome, Opéra&#8230;</p>
<p>Il existe plusieurs solutions plus ou moins efficace pour ce problème (comme par exemple la virtualisation), mais aujourd&#8217;hui je vais parler de <a href="http://www.spoon.net/browsers/">Spoon </a>(anciennement connu sous le nom de Xenocode).</p>
<h3>Le principe de Spoon</h3>
<p>Spoon est une sandbox permettant de lancer des applications directement à partir du web. Une fois le plugin installé, il suffit de cliquer sur une application à partir de leur site pour la lancer. <span id="more-415"></span></p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2010/08/spoon_1.png"><img class="aligncenter size-full wp-image-424" title="Spoon - Navigateurs" src="http://wayofspark.com/wp-content/uploads/2010/08/spoon_1.png" alt="" width="495" height="442" /></a></p>
<h3>Navigateurs proposés</h3>
<p>Actuellement, les navigateurs proposés sont les suivants  :</p>
<ul>
<li>Internet Explorer ( version 6, 7 et 8 )</li>
<li>Firefox ( version 2, 3, 3.5 )</li>
<li>Safari ( version 3 et 4 )</li>
<li>Chrome</li>
<li>Opera ( version 9 et 10 )</li>
</ul>
<h3>Exemple d&#8217;utilisation : Internet Explorer 6 sous Spoon</h3>
<p>Voici un exemple d&#8217;utilisation d&#8217;Internet Explorer 6 sous Spoon à partir d&#8217;une machine ne l&#8217;ayant pas. Cela aura pris au total à peine une minute pour avoir le navigateur opérationnel.</p>
<p><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2010/08/spoon_2.png"><img class="aligncenter size-full wp-image-428" title="Internet Explorer 6 lancé sous Spoon" src="http://wayofspark.com/wp-content/uploads/2010/08/spoon_2.png" alt="" width="437" height="318" /></a></p>
<p>A savoir que Spoon ne fait pas que dans les navigateurs, et propose un large choix d&#8217;application en sandbox, tel que ThunderBird, Notepad++, Office, ou même différent jeux.</p>
    ]]></content:encoded>
			<wfw:commentRss>http://wayofspark.com/2010/08/14/testez-vos-sites-facilement-sous-tous-les-navigateurs-avec-spoon-xenocode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 Générateurs de loader ajax</title>
		<link>http://wayofspark.com/2010/07/27/5-generateurs-de-loader-ajax/</link>
		<comments>http://wayofspark.com/2010/07/27/5-generateurs-de-loader-ajax/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 17:09:48 +0000</pubDate>
		<dc:creator>Spark</dc:creator>
				<category><![CDATA[Resources]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[gif]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[loader]]></category>

		<guid isPermaLink="false">http://wayofspark.com/?p=177</guid>
		<description><![CDATA[Comme j&#8217;ai du y a pas très longtemps rechercher ( encore une fois ) une image de chargement ajax spécifique pour un projet, je me suis décidé à enfin noter les sites qui me paraissent les plus intéressants dans le domaine de la génération d&#8217;images de chargement pour des appels ajax. Les voici donc : [...]]]></description>
			<content:encoded><![CDATA[<p>Comme j&#8217;ai du y a pas très longtemps rechercher ( encore une fois ) une image de chargement ajax spécifique pour un projet, je me suis décidé à enfin noter les sites qui me paraissent les plus intéressants dans le domaine de la génération d&#8217;images de chargement pour des appels ajax. Les voici donc :<span id="more-177"></span></p>
<p><strong>AjaxLoad.info</strong> &#8211; <a href="http://www.ajaxload.info/">http://www.ajaxload.info/</a></p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2010/07/ajaxLoad.png"><img class="size-full wp-image-185 aligncenter" title="ajaxLoad" src="http://wayofspark.com/wp-content/uploads/2010/07/ajaxLoad.png" alt="" width="417" height="414" /></a></p>
<p><strong>Chimply.com</strong> &#8211; <a href="http://www.chimply.com/">http://www.chimply.com/</a></p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2010/07/chimply.png"><img class="size-full wp-image-186 aligncenter" title="chimply" src="http://wayofspark.com/wp-content/uploads/2010/07/chimply.png" alt="" width="421" height="449" /></a></p>
<p><strong>Loadinfo.net</strong> -<a href="http://www.loadinfo.net/"> http://www.loadinfo.net/</a></p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2010/07/loadinfo.png"><img class="aligncenter size-full wp-image-187" title="loadinfo" src="http://wayofspark.com/wp-content/uploads/2010/07/loadinfo.png" alt="" width="499" height="343" /></a></p>
<p><strong>Preloaders.net</strong> &#8211; <a href="http://preloaders.net/">http://preloaders.net/</a></p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2010/07/preloaders.png"><img class="aligncenter size-full wp-image-188" title="preloaders" src="http://wayofspark.com/wp-content/uploads/2010/07/preloaders.png" alt="" width="531" height="448" /></a></p>
<p><strong>WebScriptLab</strong> &#8211; <a href="http://www.webscriptlab.com/ ">http://www.webscriptlab.com/ </a></p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2010/07/webscriptlab.png"><img class="aligncenter size-full wp-image-189" title="webscriptlab" src="http://wayofspark.com/wp-content/uploads/2010/07/webscriptlab.png" alt="" width="468" height="455" /></a></p>
    ]]></content:encoded>
			<wfw:commentRss>http://wayofspark.com/2010/07/27/5-generateurs-de-loader-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gestion de l&#8217;authentification de vos sites avec RPX</title>
		<link>http://wayofspark.com/2009/06/29/gestion-de-lauthentification-de-vos-sites-avec-rpx/</link>
		<comments>http://wayofspark.com/2009/06/29/gestion-de-lauthentification-de-vos-sites-avec-rpx/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 21:34:51 +0000</pubDate>
		<dc:creator>Spark</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Authentification]]></category>
		<category><![CDATA[Identification]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[RPX]]></category>

		<guid isPermaLink="false">http://wayofspark.com/?p=120</guid>
		<description><![CDATA[Étant en plein développement d&#8217;un petit pastebin-like en python ( enfin c&#8217;est un peu plus que ca, mais j&#8217;en reparlerais quand il sera fini ), le problème de la gestion de mes utilisateurs s&#8217;est posé assez vite. Ne voulant pas avoir à gérer moi même l&#8217;authentification ( D&#8217;abord parce que je ne juge pas ça [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><img class="size-full wp-image-135 aligncenter" title="rpx_2" src="http://wayofspark.com/wp-content/uploads/2009/06/rpx_2.jpg" alt="rpx_2" width="542" height="190" /></p>
<p>Étant en plein développement d&#8217;un petit pastebin-like en python ( enfin c&#8217;est un peu plus que ca, mais j&#8217;en reparlerais quand il sera fini ), le problème de la gestion de mes utilisateurs s&#8217;est posé assez vite.</p>
<p>Ne voulant pas avoir à gérer moi même l&#8217;authentification ( D&#8217;abord parce que je ne juge pas ça nécessaire, des choses comme OpenID le faisant très bien, et ensuite, ok, par flemme un peu, pas envie de gerer les mots de passes, les resets, d&#8217;être sur que tout est 100% secure&#8230;),  je me suis rappelé que mon compte StackOverflow s&#8217;identifie via mon google account. En creusant un peu, j&#8217;ai appris que leur authentification était gérer par un service se nommant RPX.</p>
<p><strong>Mais RPX c&#8217;est quoi exactement ?</strong></p>
<p>RPX est un service d&#8217;authenfication par OpenID assez jeune, et pourtant utilisé sur un certain nombre de sites de taille importante, comme <a href="http://uservoice.com/">UserVoice</a> , <a href="http://www.interscope.com/">Interscope</a>, ou encore <a href="http://stackoverflow.com/">StackOverflow</a>, dont je parlais dans un précédent billet.<span id="more-120"></span></p>
<p>Allez, comme un joli schéma vaut mieux qu&#8217;un long discours, RPX fournis un service qui ressemble à ca :</p>
<p style="text-align: center;"><img class="size-full wp-image-123 aligncenter" title="rpx_howto" src="http://wayofspark.com/wp-content/uploads/2009/06/rpx_howto.JPG" alt="rpx_howto" width="500" height="188" /></p>
<p style="text-align: left;">Traduction : RPX se positionne entre votre site web et les fournisseurs d&#8217;identification tierces (comme OpenID ou GoogleID par exemple ), et facilite l&#8217;utilisation de ces derniers.</p>
<p style="text-align: left;">En pratique, lorsque l&#8217;utilisateur va vouloir s&#8217;authentifier sur votre site, il va passer par une widget RPX (iframe embarquée ou popup), qui lui présente la liste des fournisseurs disponibles.</p>
<p style="text-align: left;">Par exemple, sur le site d&#8217;uservoice (la widget est a gauche, uservoice propose aussi une inscription directe au site) :</p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2009/06/login_uservoice.jpg"><img class="size-full wp-image-145 aligncenter" title="login_uservoice" src="http://wayofspark.com/wp-content/uploads/2009/06/login_uservoice.jpg" alt="login_uservoice" width="499" height="268" /></a></p>
<p>L&#8217;utilisateur choisir son système d&#8217;authentification et est alors dirigé vers la page de login du fournisseur tier. Par exemple pour facebook, il arrive ici :</p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2009/06/auth_facebook.jpg"><img class="size-full wp-image-127 aligncenter" title="auth_facebook" src="http://wayofspark.com/wp-content/uploads/2009/06/auth_facebook.jpg" alt="auth_facebook" width="534" height="307" /></a></p>
<p>Une fois l&#8217;authentification effectuée, l&#8217;utilisateur est redirigé vers votre site. (Pour certain fournisseurs comme google, lors de la première identification, l&#8217;utilisateur passe par une page lui demandant de confirmer qu&#8217;il autorise bien le site à accéder à ses informations)</p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2009/06/auth_google.jpg"><img class="size-full wp-image-143 aligncenter" title="auth_google" src="http://wayofspark.com/wp-content/uploads/2009/06/auth_google.jpg" alt="auth_google" width="465" height="187" /></a></p>
<p>Et c&#8217;est la que RPX fait la jointure retour avec votre site : une fois que l&#8217;utilisateur s&#8217;est authentifié, RPX vous indique (de façon sécurisée évidemment) si l&#8217;utilisateur s&#8217;est correctement authentifié ou non, et si oui, il vous transmet ses informations publiques ( email, nom d&#8217;utilisateur, nom d&#8217;usage et clef openId ).</p>
<p>A partir de la, vous avez votre utilisateur authentifié, vous savez qui il est, et vous êtes libre de faire ce que vous voulez (inscription en base, passage en session&#8230;)</p>
<p><strong>Coté services </strong></p>
<p>RPX propose 3 types de comptes :</p>
<ul>
<li>Basic ( Gratuit )</li>
<li>Plus ( 100$ / an )</li>
<li>Pro ( 500$ / an )</li>
</ul>
<p>Je vous rassure tout de suite, le basic est largement suffisant pour tout ce qu&#8217;on pourrait vouloir sur un site de petite voir moyenne envergure :</p>
<p>Il est limité à 6 providers d&#8217;identifications (alors que les autres types de comptes n&#8217;ont pas de limite), cependant on peut quand même choisir ceux qu&#8217;on veut tous ceux disponibles,  c&#8217;est amplement suffisant ( personnellement j&#8217;ai pris OpenID, Google, Facebook, Twitter, Yahoo et AOL, ce qui couvre deja pas mal). A noter que pour facebook et twitter, il faut faire une petite manip pour créer une application tierse, mais tout est très bien expliqué sur le site de RPX, ca se passe donc sans problèmes.</p>
<p style="text-align: left;">Hormis le nombre de providers, les différences entre les types de comptes viennent surtout du support apporté à coté ( profiling, stats, customisation de la widget&#8230; ). plus d&#8217;information dans le <a href="https://rpxnow.com/get">comparatif sur le site officiel</a>.<a href="https://rpxnow.com/get"><br />
</a></p>
<p style="text-align: left;"><strong>Les points négatifs</strong></p>
<p style="text-align: left;">Même si le service proposé est vraiment intéressant, il faut quand même noter quelques points négatifs :</p>
<p style="text-align: left;">Tout d&#8217;abord, l&#8217;appel à la widget affichant le service d&#8217;identification est relativement lent (au moins pour les comptes gratuits, ca à l&#8217;air moins lent sur uservoice et stackoverflow). En effet l&#8217;affichage de l&#8217;iframe sur la page de login doit mettre une bonne seconde à s&#8217;afficher. C&#8217;est un détail, mais tout de même.</p>
<p style="text-align: left;">Ensuite, cela peut dérouter les utilisateurs ne connaissant pas le principe :l&#8217;utilisateur arrive sur un site, cherche à s&#8217;inscrire, et se retrouve diriger vers sa page google ou facebook. Cela peut dérouter quelques peu, voir même ressembler à du phishing. De plus, même si, quand on prend le temps de se renseigner, on sais que les informations fournis par les providers sont publiques (email, nom, clef openId &#8230; rien de très compromettant), on peut être effrayer au début en autorisant facebook à délivrer ses informations personnels à un site tier&#8230;</p>
<p style="text-align: left;">Enfin, pour finir, même si les risques sont très faibles, le jour ou le service RPX tombe en rade, on se retrouve avec un joli site sur lequel toute identification est impossible&#8230;</p>
<p style="text-align: left;">Un retour un peu plus complet sur les &#8220;dangers&#8221; de RPX est consultable <a href="http://blog.nerdbank.net/2009/01/why-using-rpxnow-is-bad-idea.html">ici</a> , même si la plupart des choses ne sont pas spécifiquement objectives.</p>
<p style="text-align: left;">Sinon, pour ceux que ca intéresse, un autre billet devrait bientôt suivre sur comment brancher RPX sur un Pylons. En attendant, le tutoriel sur lequel je me suis principalement basé est disponible <a href="http://tonylandis.com/python/openid-db-authentication-in-pylons-is-easy-with-rpx/">ici</a>.</p>
<p style="text-align: left;">RPX -  <a href="https://rpxnow.com/">RPXNow.com</a></p>
    ]]></content:encoded>
			<wfw:commentRss>http://wayofspark.com/2009/06/29/gestion-de-lauthentification-de-vos-sites-avec-rpx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>stackoverflow.com</title>
		<link>http://wayofspark.com/2009/06/21/stackoverflow-com/</link>
		<comments>http://wayofspark.com/2009/06/21/stackoverflow-com/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 16:31:35 +0000</pubDate>
		<dc:creator>Spark</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://wayofspark.com/?p=8</guid>
		<description><![CDATA[Le concept de base de stackoverflow est vieux : Site de dépôt de questions orienté autour du développement  informatique, le principe est simple : une fois inscrit, il est possible de poser des questions, et les autres utilisateurs peuvent vous répondre. Le service est gratuit et le design simple et clair (ce qui manque parfois [...]]]></description>
			<content:encoded><![CDATA[<p>Le concept de base de <a class="thickbox" href="http://stackoverflow.com">stackoverflow</a> est vieux : Site de dépôt de questions orienté autour du développement  informatique, le principe est simple : une fois inscrit, il est possible de poser des questions, et les autres utilisateurs peuvent vous répondre. Le service est gratuit et le design simple et clair (ce qui manque parfois dans ce genre de service), mais jusque la, rien de bien extraordinaire. Ah oui, le nom est cool aussi.</p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2009/06/stackoverflow.jpg"><img class="size-full wp-image-50 aligncenter" title="stackoverflow" src="http://wayofspark.com/wp-content/uploads/2009/06/stackoverflow.jpg" alt="stackoverflow" width="580" height="328" /></a></p>
<p style="text-align: center;">
<p>Il faut quand même noter que le site est très jeune ( moins d&#8217;un an ) et compte déja 3.5 millions de visiteurs uniques par mois. Autant dire que ça va pas trop mal.</p>
<p>Alors, comment expliquer ce succès ? C&#8217;est assez simple : la ou la majorité des autres sites du genre sont souvent faits par des gens en 3 pièces pour tenter d&#8217;amasser des thunes, stackoverflow est fait par des gens qui ont compris ce qui attiraient les geeks. Remarque, quand on voit les photos du <a href="http://stackoverflow.com/about">staff</a> (scroller un peu en bas), on comprend assez vite pourquoi. Ca a l&#8217;air d&#8217;être une bien belle brochette <img src='http://wayofspark.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <span id="more-8"></span></p>
<p><strong>La réputation</strong></p>
<p>La première chose est  l&#8217;utilisation d&#8217;une &#8220;monnaie&#8221; interne, la réputation, qui fonctionne de la manière suivante:</p>
<p style="text-align: left;">Lorsque vous posez ou que vous répondez à une question, les autres utilisateurs ont la possibilité de voter pour votre contribution, soit positivement, soit négativement. Ces votes augmentent ( ou diminuent ) ainsi votre réputation.</p>
<p style="text-align: left;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2009/06/good_answer.jpg"><img class="size-full wp-image-60 aligncenter" title="good_answer" src="http://wayofspark.com/wp-content/uploads/2009/06/good_answer.jpg" alt="good_answer" width="575" height="345" /></a></p>
<p style="text-align: left;">Cette réputation représente ainsi, pour reprendre les termes du site, &#8220;A quel point la communauté Stack Overflow vous fait confiance&#8221; (&#8220;<span>how much the Stack Overflow community                     trusts you&#8221;).</span></p>
<p style="text-align: left;"><span>Elle permet aussi d&#8217;accéder à certains privilèges. Par exemple, une fois les 200 réputations atteints, le nombre de pubs qui vous est affiché sur le site est diminué (j&#8217;aime bien l&#8217;idée),  et une fois les 2000 atteints, il possible d&#8217;éditer les posts des autres utilisateurs. (La liste complète est disponible <a href="http://stackoverflow.com/faq">ici</a>).</span></p>
<p style="text-align: left;"><span>Il est aussi possible de déposer une partie de sa réputation en &#8220;bounty&#8221; sur une de vos question. Si par exemple une question importante n&#8217;a pas encore eu de réponse, il vous est possible de déposer, disont 200pts de réputation dessus, qui seront ainsi une récompense pour la personne qui vous donnera la réponse attendu. Les questions disposant de bounty sont de plus visibles dans un onglet à part, permettant de rester plus longtemps dans la ou les premières pages.<br />
</span></p>
<p style="text-align: left;"><strong>Les badges</strong></p>
<p style="text-align: left;"><span>L&#8217;autre concept est le système des badges. En effet certaines actions vous attribuent des badges, qui sont de 3 types : bronze, argent et or.<br />
</span></p>
<p style="text-align: left;"><span><a href="http://wayofspark.com/wp-content/uploads/2009/06/badge.jpeg"><img class="size-full wp-image-81 aligncenter" title="badge" src="http://wayofspark.com/wp-content/uploads/2009/06/badge.jpeg" alt="badge" width="352" height="109" /></a></span></p>
<p style="text-align: left;"><span>Par exemple, lors du premier vote positif sur l&#8217;une de vos réponses, vous vous voyez attribué le badge de bronze  &#8220;Teacher&#8221; (oui, ils ont même pousser le vice en nommant chacun des badges)</span></p>
<p style="text-align: left;"><span>Cette idée démoniaque, tout droit tirée des MMORPG  (concept d&#8217;achievement de WAR ou de WOW) est l&#8217;assurance que tout bon geek va passer plus de temps sur le site à essayer de monter sa réputation et débloquer des badges qu&#8217;à réellement bosser en semaine. Balaise. Vraiment balaise.</span></p>
<p style="text-align: left;"><span>Dernier point interessant, il faut savoir que la base de donnée de stackoverflow est disponible en download libre, <a href="http://blog.stackoverflow.com/wp-content/uploads/so-export-2009-06.7z.torrent">via torrent</a>. Le post avec les mises à jour mensuelles est <a href="http://blog.stackoverflow.com/2009/06/stack-overflow-creative-commons-data-dump/">ici</a>.<br />
</span></p>
<p style="text-align: left;"><span><strong>Serverfault.com</strong><br />
</span></p>
<p style="text-align: left;">Stackoverflow dispose également d&#8217;un autre site, <a href="http://serverfault.com">serverfault.com</a>, qui lui est orienté vers les administrateurs système, et qui fonctionne sur le même principe.</p>
<p style="text-align: center;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2009/06/serverfault.jpg"><img class="size-full wp-image-43 aligncenter" title="serverfault" src="http://wayofspark.com/wp-content/uploads/2009/06/serverfault.jpg" alt="serverfault" width="592" height="349" /></a></p>
<p style="text-align: left;"><strong>Superuser.com</strong></p>
<p style="text-align: left;">Et pour finir, un troisième site est prévu pour bientôt pour clôturer <a href="hhttp://blog.stackoverflow.com/2009/05/the-stack-overflow-trilogy/">la trilogy stack overflow</a> : <a href="http://superuser.com/">Superuser.com</a> , qui lui ciblera, litéralement : <em>&#8220;computer enthusiasts and power users&#8221;</em></p>
<p style="text-align: center;"><em><img class="size-full wp-image-44 aligncenter" title="superuser" src="http://wayofspark.com/wp-content/uploads/2009/06/superuser.jpg" alt="superuser" width="272" height="139" /><br />
</em></p>
    ]]></content:encoded>
			<wfw:commentRss>http://wayofspark.com/2009/06/21/stackoverflow-com/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Positeo.com</title>
		<link>http://wayofspark.com/2009/06/18/positeocom/</link>
		<comments>http://wayofspark.com/2009/06/18/positeocom/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 17:47:30 +0000</pubDate>
		<dc:creator>Spark</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[référencement]]></category>

		<guid isPermaLink="false">http://wayofspark.com/?p=10</guid>
		<description><![CDATA[Je sais plus trop comment je suis tombé sur le site, mais j&#8217;ai trouvé l&#8217;idée cool. Positeo propose un service de vérification de son référencement google. On choisi son mot clef, le site cible, et positeo nous indique la position du site sur une recherche du mot clef choisi. Par exemple avec le mot clef [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">
<p style="text-align: left;">Je sais plus trop comment je suis tombé sur le site, mais j&#8217;ai trouvé l&#8217;idée cool.</p>
<p style="text-align: left;"><a href="http://www.positeo.com/check-position/">Positeo</a> propose un service de vérification de son référencement google.</p>
<p style="text-align: left;">On choisi son mot clef, le site cible, et positeo nous indique la position du site sur une recherche du mot clef choisi.</p>
<p style="text-align: left;">Par exemple avec le mot clef &#8216;chaussures&#8217; positeo nous indique que le site sarenza.com  est en première position (quelle surprise !) et eram.fr en 8ème.</p>
<p style="text-align: left;">Autant pour des sites se trouvant en première page de google, on ne gagne pas spécialement de temps par rapport à une recherche à la main, autant si le site recherché se trouve plus loin, cela evite de se tapper le défilement des pages jusqu&#8217;à trouver le résultat voulu.</p>
<p style="text-align: left;">Autre détail pratique, les mots clefs et sites déjà utilisés sont mémorisés, ce qui permet d&#8217;eviter de les retapper à chaque fois.</p>
<p style="text-align: left;">A noter également que le service va vérifier les résultats sur plusieurs datacenter google ( 15 aléatoires par requête ), même si je suis pas sur de l&#8217;interet de la chose.</p>
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;"><a class="thickbox" href="http://wayofspark.com/wp-content/uploads/2009/06/positeo.jpg"><img class="alignnone size-medium wp-image-9 aligncenter" title="positeo" src="http://wayofspark.com/wp-content/uploads/2009/06/positeo.jpg" alt="" width="555" height="343" /></a></p>
    ]]></content:encoded>
			<wfw:commentRss>http://wayofspark.com/2009/06/18/positeocom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript et les arguments optionnels</title>
		<link>http://wayofspark.com/2008/07/23/javascript-et-les-arguments-optionnels/</link>
		<comments>http://wayofspark.com/2008/07/23/javascript-et-les-arguments-optionnels/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 15:57:23 +0000</pubDate>
		<dc:creator>Spark</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://wayofspark.com/?p=5</guid>
		<description><![CDATA[Javascript est un langage de script relativement puissant, mais dont certaines fonctionnalités sont souvent peu ou pas connu de la majorité. La gestion des arguments optionnels lors de l&#8217;appel à des fonction en fait parti. Dans ce tutorial, j&#8217;expliquerai comment créer une méthode gérant un argument optionnel, puis une autre pouvant recevoir un nombre variable [...]]]></description>
			<content:encoded><![CDATA[<p>Javascript est un langage de script relativement puissant, mais dont certaines fonctionnalités sont souvent peu ou pas connu de la majorité. La gestion des arguments optionnels lors de l&#8217;appel à des fonction en fait parti.</p>
<p>Dans ce tutorial, j&#8217;expliquerai comment créer une méthode gérant un argument optionnel, puis une autre pouvant recevoir un nombre variable d&#8217;argument.<span id="more-5"></span></p>
<h3>Arguments optionnels</h3>
<p>Mettont que nous ayons besoin de trier une liste. Pour ce faire, nous créons une méthode qui s&#8217;occupe de trier la liste, puis de la retourner ( dans l&#8217;exemple, la fonction fait juste appel à la méthode sort de la liste, mais on imagine la déclaration d&#8217;une vrai méthode de tri puis de son exécution )</p>
<p>On obtientrait donc quelque chose de ce type :</p>
<pre class="prettyprint">mySort = function(l){
    l.sort();
    return l;
};
>>> mySort([4,2,3]);
[2,3,4]</pre>
<p>Cependant, plus tard lors de notre développement, apparait un autre besoin : il faudrait pouvoir trier la liste, mais en sens inverse cette fois-ci.</p>
<p>Plusieurs solutions apparaissent alors :</p>
<p>La premiere serait de séparer les deux étapes, en effectuant d&#8217;abord l&#8217;appel à mySort(), puis ensuite à myReverse() par exemple ( qui, ferait d&#8217;ailleurs simplement return l.reverse() dans cet exemple très basique ). Mais cela allourdirait le code.</p>
<p>La seconde est de rajouter un second paramètre à mySort, pour spécifier l&#8217;ordre dans lequel on veut trier la liste.<br />
On obtiendrait alors quelque chose de ce genre :</p>
<pre class="prettyprint">mySort = function(l, order){
    l.sort();
    if(order=="reverse") l.reverse();
    return l;
};
>>> mySort([2,4,3], "normal")
[2,3,4]
>>> mySort([2,4,3], "reverse")
[4,3,2]</pre>
<p>On observe effectivemment qu&#8217;en fonction du second paramètre ( &#8220;normal&#8221; ou &#8220;reverse&#8221; ), le sens du tri est, ou non, inversé.</p>
<p>Seulement voila, cela oblige à passer un second parametre à chaque appel de sa méthode. Paramètre au final inutile si on veut trier la liste &#8216;simplement&#8217;, sans l&#8217;inverser.</p>
<p>Et bien en fait (oh surprise!) non.</p>
<p>En effet, une astuce trop peu connue des débutants est l&#8217;utilisation de paramètres optionnels. Un paramètre contenu dans la déclaration d&#8217;une méthode et non envoyé lors de l&#8217;appel de cette dernière ne pose,en fait, pas de problème. La variable est simplement considérée comme étant à la valeur null.</p>
<p>exemple :</p>
<pre class="prettyprint">f = function(a){
    return a
}
>>> f(2)
2
>>> f()
null</pre>
<p>On constate qu&#8217;effectivemment, quand le paramètre &#8216;a&#8217; n&#8217;est pas envoyé à la fonction &#8216;f&#8217;, &#8216;a&#8217; est quand meme défini, et a la valeur null, dans le corps de la fonction. En exploitant cela, on peut modifier notre méthode de tri pour obtenir la suivante :</p>
<pre class="prettyprint">mySort = function(l, reverse){
    l.sort();
    if(reverse) l.reverse();
    return l;
};
>>> mySort([2,4,3])
[2,3,4]
>>> mySort([2,4,3], "reverse")
[4,3,2]</pre>
<p>A noter qu&#8217;ici, la variable reverse est utilisé comme un flag : dans l&#8217;exemple on lui donne la valeur &#8220;reverse&#8221;, mais un simple &#8220;true&#8221; aurait suffit ( même si &#8220;reverse&#8221; aide à la lisibilitée du code )</p>
<h3>Utilisation de la variable argument</h3>
<p>Au passage, une autre astuce (un peu plus avancée celle la) concernant les arguments en javascript : dans une fonction, la variable &#8216;arguments&#8217; contient la liste des arguments qui ont été passés.</p>
<p>Très simplement :</p>
<pre class="prettyprint">myTest2 = function(){
    return arguments;
};
>>> myTest2()
null
>>> myTest2(1,2,3)
[1,2,3]</pre>
<p>Et cela marche quelque soient les arguments &#8216;normallement&#8217; définis :</p>
<pre class="prettyprint">myTest2 = function(a,b){
    return arguments;
};
>>> myTest2()
null
>>> myTest2(1,2,3)
[1,2,3]</pre>
<p>Arguments est une liste tout ce qu&#8217;il y a de plus classique : on peut connaitre sa taille avec arguments.length, et on recupère un élement avec arguments[position].</p>
<p>Concretement, cela permet d&#8217;envoyer un nombre variable de paramètres.</p>
<p>Par exemple, on peut envisager une fonction qui additionne un nombre quelconque de variables.</p>
<pre class="prettyprint">Additionner = function(){
    var sum = 0;
    for(var i=0; i < arguments.length; i++){
        sum += arguments[i];
    }
    return sum;
};
>>> Additionner()
0
>>> Additionner(1,2)
3
>>> Additionner(1,2,3)
6
>>> Additionner(1,2,3,6,12,48)
72</pre>
<p>On constate bien qu&#8217;on peut passer un nombre variable de paramètres, et que le résultat de la méthode est la somme de tous.</p>
    ]]></content:encoded>
			<wfw:commentRss>http://wayofspark.com/2008/07/23/javascript-et-les-arguments-optionnels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bien connaitre le type d&#8217;une variable javascript : les limites de typeof</title>
		<link>http://wayofspark.com/2008/07/17/bien-connaitre-le-type-dune-variable-javascript-les-limites-de-typeof/</link>
		<comments>http://wayofspark.com/2008/07/17/bien-connaitre-le-type-dune-variable-javascript-les-limites-de-typeof/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 13:39:23 +0000</pubDate>
		<dc:creator>Spark</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://wayofspark.com/?p=3</guid>
		<description><![CDATA[Lorsqu&#8217;on commence à faire du javascript, il arrive forcement un moment ou l&#8217;on à besoin de connaitre le type d&#8217;une variable avec laquelle l&#8217;on travaille. Cela peut être par exemple pour du passage de paramètres multitypés, ou lors de l&#8217;utilisation de paramètres optionnels, Ou l&#8217;ont a parfois besoin de vérifier ce qui a réellement été [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsqu&#8217;on commence à faire du javascript, il arrive forcement un moment ou l&#8217;on à besoin de connaitre le type d&#8217;une variable avec laquelle l&#8217;on travaille. Cela peut être par exemple pour du passage de paramètres multitypés, ou lors de l&#8217;utilisation de paramètres optionnels, Ou l&#8217;ont a parfois besoin de vérifier ce qui a réellement été passé dans les args.</p>
<p>En recherchant sur google, on tombe vite sur ce qui semble être la solution au problème : en effet, javascript dispose d&#8217;une méthode typeof, retournant une string identifiant le type de l&#8217;élément.</p>
<p>exemples :</p>
<pre class="prettyprint">>>> typeof 1
"number"
>>> typeof "hello"
"string"
</pre>
<p>Jusque la, tout va bien. Cependant, les surprises arrivent dès qu&#8217;on pousse les tests un peu plus :</p>
<pre class="prettyprint">>>> typeof [1,2,3]
"object"
</pre>
<p>Tiens, il considère ma liste comme un objet !</p>
<pre class="prettyprint">>>> typeof new Date()
"object"
</pre>
<p>Et les dates aussi !</p>
<pre class="prettyprint">>>> typeof null
"object"
</pre>
<p>Même null est considéré comme étant du type object&#8230;<span id="more-3"></span></p>
<p>En effet, l&#8217;opérateur typeof n&#8217;identifie que les types suivants :</p>
<pre class="prettyprint">"number"
"string"
"function"
"boolean"
"object"
</pre>
<p>Dans la pratique, on a besoin de pouvoir faire la différence entre une liste et un objet, ou de savoir si un paramètre est une date, ou si le retour d&#8217;une méthode est une erreur, par exemple.</p>
<p>La solution consiste donc à bricoler sa propre méthode typeof, pour avoir une identification plus précise des variables. Concrètement, pour identifier un type, on va chercher une bidouille sur la variable à chaque fois.</p>
<p>Par exemple :</p>
<p>Pour les dates c&#8217;est très simple, on regarde si le constructeur est bien &#8216;Date&#8217;.</p>
<pre class="prettyprint">if( var.constructor==Date) // it's a date.</pre>
<p>Pour les listes, on pourrait faire pareil ( regarder si le constructeur est bien &#8216;Array&#8217; ), cependant cela peut poser problème dans certains cas. les selecteurs jQuery, par exemple, sont des listes (on peut faire selecteur[0]), mais sont crées à partir du constructeur object.<br />
Pour les identifier, on vérifie donc à la place la présence d&#8217;un attribut &#8216;length&#8217; sur la variable testée</p>
<pre class="prettyprint">if (el.length) // it's a list</pre>
<p>Pour null, on fait juste un test avec la variable null !</p>
<pre class="prettyprint">if (var==null) // it's null !</pre>
<p>Il reste deux autres pseudotypes, moins utilisés, mais qu&#8217;il peut être tout de même utile de dissocier :</p>
<p>Les erreurs (utile en cas de retour dans un catch par exemple)<br />
La classe erreur est spécifique au navigateur (evidemment), cependant, sous tous, elle dispose toujours de deux attributs : &#8216;message&#8217; et &#8216;name&#8217;. On verifie donc la présence de ces deux attributs, et pour bien faire, on vérifie bien la présence de &#8220;Error&#8221; dans l&#8217;attribut nom.</p>
<pre class="prettyprint">if(el.message!=null &amp;&amp; el.name!=null &amp;&amp; el.name.search("Error")>-1) return 'error';</pre>
<p>Et pour finir, les noeuds DOM. La aussi, c&#8217;est de la bidouille : on verifie l&#8217;existence d&#8217;un attribut nodeName ou tagName sur la variable.</p>
<pre class="prettyprint">if(el.nodeName || el.tagName) return 'node'; // it's a node</pre>
<p>Ce qui donne la méthode suivante :</p>
<pre class="prettyprint">/**
* Return 'advanced' type for an element
* Type can be of :
*  - 'null'
*  - 'string'
*  - 'number'
*  - 'boolean'
*  - 'function'
*  - 'list'
*  - 'node'
*  - 'date'
*  - 'error'
*  - 'object'
* @param el
**/
typeOf = function(el){
var elType = typeof el;

// null type
if(el==null) return 'null';

// basic types : number, string, function
if(elType=='number'||elType=='string'||elType=='function'||elType=='boolean')
    return elType;

// date
if(el.constructor==Date) return "date";

// domElem
if(el.nodeName || el.tagName) return 'node';

// list
if(el.length) return 'list';

// error
if(el.message!=null &amp;&amp; el.name!=null &amp;&amp; el.name.search("Error")>-1) return 'error';

// object
return 'object';
}
</pre>
<p>Et voila, une fonction typeOf qu&#8217;elle est mieux que l&#8217;originale !</p>
<pre class="prettyprint">>>> typeOf([1,2,3])
'list'
>>> typeOf(null)
'null'
>>> typeOf(document.body)
'node'
>>> typeOf(new Date())
'date'
</pre>
<p>Et les type originels sont identifiés aussi :</p>
<pre class="prettyprint">>>> typeOf(1)
'number'
>>> typeOf('hello')
'string'
>>> typeOf(String)
'function'
>>> typeOf(true)
'boolean'
</pre>
<p>Voila, comment gagner pas mal de temps sur les verifs avec une méthode de 10 lignes !</p>
    ]]></content:encoded>
			<wfw:commentRss>http://wayofspark.com/2008/07/17/bien-connaitre-le-type-dune-variable-javascript-les-limites-de-typeof/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
