<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10frenchfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CE8BQHo5eyp7ImA9WxJVFk4.&quot;"><id>tag:blogger.com,1999:blog-8128983</id><updated>2009-07-03T16:54:11.423+02:00</updated><title>GeekFG Blog - Francois Guillaume Ribreau</title><subtitle type="html">Développeur avant d'être étudiant.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.geekfg.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.geekfg.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>128</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/geekfg" type="application/atom+xml" /><feedburner:emailServiceId>geekfg</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.feedburner.com%2Fgeekfg" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/geekfg" 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.feedburner.com%2Fgeekfg" 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.feedburner.com%2Fgeekfg" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=fr&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fgeekfg" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/bn/intatm_fr_1.gif">Subscribe with Mon Yahoo!</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;Ck8BSH47eip7ImA9WxJRFEQ.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-8848716870181685903</id><published>2009-05-16T17:50:00.002+02:00</published><updated>2009-05-16T18:20:59.002+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-16T18:20:59.002+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="astuce" /><category scheme="http://www.blogger.com/atom/ns#" term="webdav" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><title>Configurer Bonjour Mounter pour utiliser votre compte Box.net</title><content type="html">&lt;p&gt;&lt;strong&gt;Bonjour Mounter&lt;/strong&gt; (&lt;a title="Bonjour Mounter" href="http://www.gestosoft.com/software/BM/download/Bonjour%20Mounter%202.0.6.zip" target="_blank" rel="nofollow"&gt;téléchargeable ici&lt;/a&gt;) est une application Mac permettant de monter automatiquement des disques réseaux (afp, smb, cifs, webdav et ftp). Ayant eu beaucoup de difficultés à monter mon compte &lt;strong&gt;Box.net&lt;/strong&gt;, voici une capture avec les réglages fonctionnels: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/geekfg/3535460685/" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto;" src="http://farm3.static.flickr.com/2192/3535460685_264e13af3b.jpg?v=0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Le champs "server" n'accepte pas de "&lt;a href="http://%22/"&gt;http://"&lt;/a&gt; ou de "&lt;a href="https://%22/"&gt;https://"&lt;/a&gt; et l'adresse ne doit pas contenir de "/" terminateur. C'est uniquement grâce à l'application "Messages Console" et Bonjour Mounter en mode Debug que j'ai pu découvrir d'où venait le problème.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-8848716870181685903?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=e7Mhi7mh7dg:stcUcmsGLVU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=e7Mhi7mh7dg:stcUcmsGLVU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?i=e7Mhi7mh7dg:stcUcmsGLVU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=e7Mhi7mh7dg:stcUcmsGLVU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?i=e7Mhi7mh7dg:stcUcmsGLVU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/8848716870181685903/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=8848716870181685903&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8848716870181685903?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8848716870181685903?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/e7Mhi7mh7dg/configurer-bonjour-mounter-pour.html" title="Configurer Bonjour Mounter pour utiliser votre compte Box.net" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/05/configurer-bonjour-mounter-pour.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYNR3Y6eip7ImA9WxVUGU8.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-6066268897378962337</id><published>2009-03-24T18:18:00.003+01:00</published><updated>2009-03-24T20:33:16.812+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T20:33:16.812+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>Gérer les éléments input radio avec jQuery</title><content type="html">&lt;p&gt;J’ai eu hier une question sur la manipulation des éléments radio en Javascript. La personne voulait vérifier que pour chacun de ses groupes de radio, au moins un radio était sélectionné.&lt;/p&gt;Plusieurs solutions en Javascript “pur” existent sur Internet mais aucune ne semblait simple à appliquer par cette personne. Je propose donc ici quelques &lt;a href="http://fr.wikipedia.org/wiki/Snippet"&gt;snippets&lt;/a&gt; jQuery pour exploiter simplement les éléments Radio.&lt;br /&gt;&lt;p&gt;Nous partirons donc d’une page incluant la librairie jQuery et le code XHTML suivant :&lt;/p&gt;&lt;code&gt;&amp;lt;form action="?" method="get" id="monForm"&amp;gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt1" value="1" checked="checked"  /&amp;gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt1" value="2" /&amp;gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt1" value="3"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt2" value="1" /&amp;gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt2" value="2" checked="checked" /&amp;gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt2" value="3" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt3" value="1" checked="checked" /&amp;gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt3" value="2" /&amp;gt;&lt;br /&gt;&amp;lt;input type="radio" name="opt3" value="3"/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Accéder aux inputs de type radio en jQuery&lt;/h3&gt;Il existe plusieurs façon d’accéder aux inputs de type radio en jQuery, j’ai réalisé quelques tests afin de définir quelles expressions étaient les plus rapides :&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/geekfg/3380619360/" title="Benchmark jQuery de geekfg, sur Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3613/3380619360_5c2dbb51c1_o.png" alt="Benchmark jQuery" height="209" width="500" /&gt;&lt;/a&gt;&lt;a href="http://www.flickr.com/photos/geekfg/3380619360/" title="Benchmark jQuery de geekfg, sur Flickr"&gt;&lt;br /&gt;&lt;/a&gt;Il en ressort que l’expression &lt;strong&gt;input[type=radio]&lt;/strong&gt; est plus rapide que &lt;strong&gt;input:radio&lt;/strong&gt; (mais est-elle autant générique ?)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Le résultat sont très variable lorsque l’on précise un contexte (ici &lt;strong&gt;#monForm&lt;/strong&gt;) et un grand nombre de radio. Je pense donc que les trois dernières expressions &lt;span style="text-decoration: underline;"&gt;ne sont pas à prendre en compte dans l’analyse, du moins pour le moment&lt;/span&gt;. (Je travaille actuellement à améliorer mon outils de Benchmark afin que chacun puisse tester ses propres expressions jQuery).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Récupérer tout les input radios appartenant à un même groupe&lt;/h3&gt;&lt;p&gt;&lt;code&gt;$('input[type=radio][name=opt1]');//ici retourne 3 éléments input&lt;/code&gt;&lt;/p&gt;&lt;h3&gt;Connaître si un groupe de radio à une valeur&lt;/h3&gt;&lt;p&gt;&lt;code&gt;$('input[type=radio][name=opt1]:checked').length; // Doit être égal à 1 si un radio à été sélectionné dans le groupe de opt1.&lt;/code&gt;&lt;/p&gt;&lt;h3&gt;Vérifier que tout les radios ont été sélectionnés&lt;/h3&gt;&lt;p&gt;&lt;code&gt;$('input[type=radio]:checked').length; // Si au moins un radio est sélectionné pour chaque groupe, ce snippet retourne 3 (dans notre exemple)&lt;/code&gt;&lt;/p&gt;&lt;h3&gt;Récupérer la valeur d’un groupe de radio&lt;/h3&gt;&lt;p&gt;&lt;code&gt;$('input[type=radio][name=opt1]:checked').attr('value'); //Retourne la valeur du radio sélectionné dans le groupe opt1. Retourne vide si aucun radio sélectionné&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-6066268897378962337?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=wVK7hVvrY3Q:uuZ7ekLLivQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=wVK7hVvrY3Q:uuZ7ekLLivQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?i=wVK7hVvrY3Q:uuZ7ekLLivQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=wVK7hVvrY3Q:uuZ7ekLLivQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?i=wVK7hVvrY3Q:uuZ7ekLLivQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/6066268897378962337/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=6066268897378962337&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/6066268897378962337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/6066268897378962337?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/wVK7hVvrY3Q/gerer-les-elements-input-radio-avec.html" title="Gérer les éléments input radio avec jQuery" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/03/gerer-les-elements-input-radio-avec.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAHSXc7eCp7ImA9WxVVGUs.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-7091152781703502982</id><published>2009-03-12T22:29:00.001+01:00</published><updated>2009-03-13T18:02:18.900+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-13T18:02:18.900+01:00</app:edited><title>Trouver le style réellement appliqué sur un élément (sans jQuery)</title><content type="html">&lt;p&gt; Etant en train de développer un addon pour Firefox/Firebug qui aidera plus d’un développeur (en tout cas moi) j’ai eu besoin de connaitre le &lt;strong&gt;fontFamily d’un élément.&lt;/strong&gt; Dans cet article je ne traiterai donc que de la façon de récupérer un &lt;strong&gt;fontFamily.&lt;/strong&gt; Cependant la récupération d’autres propriétés CSS (via une fonction générique par exemple) est tout à fait possible.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Si le fontFamily a directement été défini (in-line) sur l’élément&lt;/h3&gt; &lt;code&gt;&amp;lt;span id='monEl' style='font-family:Tahoma'&amp;gt;Javascript&amp;lt;/span&amp;gt;&lt;/code&gt;   &lt;p&gt;... alors un simple :&lt;/p&gt; &lt;code&gt;document.getElementById('monEl').style.fontFamily;&lt;/code&gt;   &lt;p&gt;ou&lt;/p&gt; &lt;code&gt;$('#monEl').css('fontFamily');&lt;/code&gt;   &lt;p&gt;... suffit pour récupérer la valeur de la propriété fontFamily de l’élément.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Maintenant si l’on supprime l’attribut &lt;strong&gt;style&lt;/strong&gt; de notre &lt;strong&gt;span#monEl&lt;/strong&gt; le code suivant retournera une chaine vide :&lt;/p&gt; &lt;code&gt;document.getElementById('monEl').style.fontFamily;//retourne &amp;quot;&amp;quot;&lt;/code&gt;   &lt;p&gt;Cependant le code jQuery, lui, fonctionnera.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Arriver à nos fin sans jQuery&lt;/h3&gt;  &lt;p&gt;Au début je pensait qu’il suffirait d’effectuer une boucle sur les éléments parents du DOM : remonter à chaque fois d’un élément et dès qu’un élément a un fontFamily de valide, stopper la boucle et retourner sa valeur. Mais il y a beaucoup plus simple.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;jQuery procède d’une façon différente. En regardant son code de plus près j’ai découvert qu’il avait recourt à la méthode DOM de niveau 2 &lt;a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-DOMImplementationCSS" rel="nofollow"&gt;getComputedStyle()&lt;/a&gt; pour récupérer la valeur d’un attribut CSS hérité d’un élément parent. Malheureusement cette méthode ne semble pas être intégré sous IE qui lui dispose de la propriété &lt;strong&gt;currentStyle&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Voici donc une fonction (basé sur le code utilisé par jQuery) qui retourne, pour un élément donné, la valeur du fontFamily associé :&lt;/p&gt; &lt;code&gt;function getFontFamily(el){    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var ret;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (el.style &amp;amp;&amp;amp; el.style['fontFamily'])//Si l'élément a déjà la propriété de définie     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = el.style['fontFamily'];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else if (document.defaultView.getComputedStyle){//Firefox, Opera     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var computedStyle = document.defaultView.getComputedStyle(el, null );     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(computedStyle)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = computedStyle.fontFamily;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else if (el.currentStyle)//Internet Explorer     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = el.currentStyle['fontFamily'];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return ret;     &lt;br /&gt;}&lt;/code&gt;  &lt;p&gt;Testé sous Firefox et Chrome.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-7091152781703502982?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=miezO0MfvZw:mUAC7GOW3e8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=miezO0MfvZw:mUAC7GOW3e8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?i=miezO0MfvZw:mUAC7GOW3e8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=miezO0MfvZw:mUAC7GOW3e8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?i=miezO0MfvZw:mUAC7GOW3e8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/7091152781703502982/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=7091152781703502982&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/7091152781703502982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/7091152781703502982?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/miezO0MfvZw/trouver-le-style-reellement-applique.html" title="Trouver le style réellement appliqué sur un élément (sans jQuery)" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/03/trouver-le-style-reellement-applique.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QDRHo9eip7ImA9WxVWGUk.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-8591180278312377233</id><published>2009-02-25T00:46:00.000+01:00</published><updated>2009-03-01T23:09:35.462+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-01T23:09:35.462+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vb6" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="vb" /><category scheme="http://www.blogger.com/atom/ns#" term="vb.net" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>Réaliser une copie profonde d’objet (deep copy) en Javascript</title><content type="html">&lt;p&gt;Un des problèmes récurrent avec Javascript est qu’il est difficile de savoir si une variable passée &lt;strong&gt;par référence&lt;/strong&gt; ou &lt;strong&gt;par valeur&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;En VB (VB6, VB.NET) il est possible de déclarer dans l’entête de la fonction &lt;strong&gt;by val&lt;/strong&gt; ou &lt;strong&gt;by ref&lt;/strong&gt; pour préciser le mode de passage mais ce n’est pas le cas en Javascript.&lt;/p&gt;  &lt;code&gt;//Création de l'objet monObjet   &lt;br /&gt;var monObjet = new Object(); &lt;br /&gt;&lt;br /&gt;// monDeuxiemeObjet réfère à l'objet monObjet   &lt;br /&gt;var monDeuxiemeObjet = monObjet; &lt;br /&gt;&lt;br /&gt;// On modifie une propriété du premier objet   &lt;br /&gt;monObjet.unePropriete = true; &lt;br /&gt;&lt;br /&gt;// Les changements sont aussi appliqué sur le second objet   &lt;br /&gt;// (Le deuxième objet réfère au premier objet)    &lt;br /&gt;alert( monObjet.unePropriete === monDeuxiemeObjet.unePropriete );//affiche true&lt;/code&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Dans cette exemple, la copie de &lt;strong&gt;monObjet&lt;/strong&gt; dans &lt;strong&gt;monDeuxiemeObjet&lt;/strong&gt; à été effectuée par référence, ce qui signifie que &lt;strong&gt;monDeuxiemeObjet&lt;/strong&gt; pointe vers l’adresse de &lt;strong&gt;monObjet &lt;/strong&gt;(même si la réalité est un peu plus complexe que cela…monDeuxiemeObjet pointe sur la référence de l’objet final monObjet mais c’est une autre histoire).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Seulement dans certains cas, il arrive que nous ayons besoin de réaliser une vrai copie. Par exemple sauvegarder monObjet dans une variable temporaire et effectuer des traitements uniquement sur cette variable sans que cela n’affecte monObjet. Dans certains cas là méthode que je vous propose n’est pas indispensable notamment dans le cas où l’objet à copier n’est pas complexe.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Heureusement &lt;strong&gt;jQuery intègre la méthode extend&lt;/strong&gt;. Basiquement elle permet de gérer l’héritage d’un objet vers un à plusieurs autres objets. Mais elle permet aussi la copie profonde (deep copy) d’un objet vers un autre et donc une copie par valeur (et non plus par référence) via son paramètre optionnel “&lt;strong&gt;deep&lt;/strong&gt;”.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;jQuery.extend&lt;/strong&gt;( [deep], target, object1, [objectN] )&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;code&gt;//Création de l'objet monObjet    &lt;br /&gt;var monObjet = new Object();     &lt;br /&gt;    &lt;br /&gt;var monDeuxiemeObjet = {};     &lt;br /&gt;$.extend(true,monObjet,monDeuxiemeObjet);//deep copy     &lt;br /&gt;    &lt;br /&gt;// On modifie une propriété du premier objet     &lt;br /&gt;monObjet.unePropriete = true;     &lt;br /&gt;    &lt;br /&gt;// Les changements ne sont pas appliqué sur le second objet     &lt;br /&gt;// monDeuxiemeObjet.unePropriete est indéfini     &lt;br /&gt;alert( monObjet.unePropriete === monDeuxiemeObjet.unePropriete );//affiche false&lt;/code&gt;   &lt;p&gt;Ici, &lt;strong&gt;monDeuxiemeObjet&lt;/strong&gt; ne réfère plus à &lt;strong&gt;monObjet&lt;/strong&gt;. Ces deux objets possèdent chacun leurs propres adresses mémoires, il est ainsi possible de travailler sur l’un sans modifier l’autre.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-8591180278312377233?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=4A-H_fxtj-g:cCW7zJ_m6QM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=4A-H_fxtj-g:cCW7zJ_m6QM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?i=4A-H_fxtj-g:cCW7zJ_m6QM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekfg?a=4A-H_fxtj-g:cCW7zJ_m6QM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekfg?i=4A-H_fxtj-g:cCW7zJ_m6QM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/8591180278312377233/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=8591180278312377233&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8591180278312377233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8591180278312377233?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/4A-H_fxtj-g/realiser-une-copie-profonde-dobjet-deep.html" title="Réaliser une copie profonde d’objet (deep copy) en Javascript" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/02/realiser-une-copie-profonde-dobjet-deep.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUBRXg-fyp7ImA9WxVWEkw.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-4180078422019743562</id><published>2009-02-21T00:38:00.001+01:00</published><updated>2009-02-21T11:47:34.657+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-21T11:47:34.657+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="astuce" /><category scheme="http://www.blogger.com/atom/ns#" term="feedback" /><category scheme="http://www.blogger.com/atom/ns#" term="chrome" /><title>Modifier openWYSIWYG afin qu’il supporte Google Chrome</title><content type="html">&lt;p&gt;L’outil pour &lt;strong&gt;&lt;a href="http://projets.geekfg.net/?/2-comment+ajouter+une+signature+html+sous+gmail.htm"&gt;ajouter sa signature HTML à Gmail&lt;/a&gt;&lt;/strong&gt; utilise l’éditeur &lt;a href="http://www.openwebware.com/" rel="nofollow"&gt;openWYSIWYG&lt;/a&gt; que j’apprécie particulièrement pour son côté cross-browser, open-source et son interface très léger. Seulement, même la dernière version ne supporte pas &lt;a href="http://www.google.com/chrome" rel="nofollow"&gt;Google Chrome&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Après un bref regard sur le code, je me suis aperçu que la vérification de la compatibilité s’effectuait au niveau de la méthode &lt;strong&gt;isBrowserCompatible&lt;/strong&gt; :&lt;/p&gt; &lt;code&gt;isBrowserCompatible: function() {    &lt;br /&gt;// Validate browser and compatiblity     &lt;br /&gt;if ((navigator.userAgent.indexOf('Safari') != -1 ) || !document.getElementById || !document.designMode){     &lt;br /&gt;//no designMode (Safari lies)     &lt;br /&gt;return false;     &lt;br /&gt;}     &lt;br /&gt;return true;     &lt;br /&gt;},&lt;/code&gt;   &lt;p&gt;N’ayant pas Safari et ne pouvant donc pas vérifier si oui ou non “Safari lies” j’ai préféré simplement ajouter le support de Chrome tout en laissant le blocage de Safari. Il suffit donc de modifier le test et d'y ajouter l'expression booléen suivante :&lt;/p&gt; &lt;code&gt;if ((navigator.userAgent.indexOf('Safari') != -1 &amp;amp;&amp;amp; &lt;strong&gt;navigator.userAgent.indexOf('Chrome') == -1&lt;/strong&gt; ) || !document.getElementById || !document.designMode){ &lt;/code&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;C’est fini ? Eh bien non, après un test cela ne fonctionnait toujours pas, Chrome retournait une erreur &lt;strong&gt;Uncaught TypeError: Object #&lt;an htmltextareaelement&gt; has no method 'insertAdjacentHTML'&lt;/strong&gt;. Un recherche plus tard, je découvre ce block de code :&lt;/p&gt; &lt;code&gt;/**    &lt;br /&gt;* Emulates insertAdjacentHTML(), insertAdjacentText() and     &lt;br /&gt;* insertAdjacentElement() three functions so they work with Netscape 6/Mozilla     &lt;br /&gt;* by Thor Larholm me@jscript.dk     &lt;br /&gt;*/     &lt;br /&gt;if(typeof HTMLElement!=&amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !HTMLElement.prototype.insertAdjacentElement){ HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode) {.. };     &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; HTMLElement.prototype.&lt;strong&gt;insertAdjacentHTML&lt;/strong&gt; = function (where,htmlStr) {…}; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; HTMLElement.prototype.insertAdjacentText = function (where,txtStr) {… };      &lt;br /&gt;}&lt;/p&gt; &lt;/code&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Or sous Chrome l’objet &lt;strong&gt;HTMLElement&lt;/strong&gt; ET sa méthode &lt;strong&gt;insertAdjacentElement&lt;/strong&gt; existe, mais pas sa méthode &lt;strong&gt;insertAdjacentHTML&lt;/strong&gt;. Cette condition n’était donc pas validée. Il suffisait donc de modifier la condition comme ceci pour que openWYSIWYG supporte Chrome :&lt;/p&gt; &lt;code&gt;if((typeof HTMLElement!=&amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; (!HTMLElement.prototype.insertAdjacentElement || &lt;strong&gt;!HTMLElement.prototype.insertAdjacentHTML&lt;/strong&gt;))){ &lt;/code&gt;  &lt;p&gt;&lt;u&gt;Remarque:&lt;/u&gt; il est préférable ici de ne pas agir en fonction du navigateur (donc un test sur le user-agent) mais plutôt sur la présence ou non de la fonctionnalité sur le navigateur. En utilisant cette méthode on code ainsi de façon plus générique et les scripts deviennent compatibles (ou inversement) avec les mises à jour des navigateurs.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ps : En bon webnaute j’ai proposé cette &lt;a href="http://www.openwebware.com/forum/viewtopic.php?f=1&amp;amp;t=2304" rel="nofollow"&gt;modification sur le forum dédié&lt;/a&gt; afin qu’elle soit intégrée à la prochaine release.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-4180078422019743562?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=eOBDCijy"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=4XmVf2PG"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=4XmVf2PG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=pWT6xtuU"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=pWT6xtuU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/4180078422019743562/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=4180078422019743562&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/4180078422019743562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/4180078422019743562?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/EySeeVMn1VA/modifier-openwysiwyg-afin-quil-supporte.html" title="Modifier openWYSIWYG afin qu’il supporte Google Chrome" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/02/modifier-openwysiwyg-afin-quil-supporte.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkANRH07fCp7ImA9WxVXGU0.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-5726779359099983330</id><published>2009-02-15T16:28:00.001+01:00</published><updated>2009-02-17T22:06:35.304+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-17T22:06:35.304+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="algorithme" /><title>Algorithme tri de couleur (+ demonstration javascript)</title><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Il y a 3 semaines, j’expliquais sur ce blog comment créer un algorithme qui était capable de définir &lt;a title="Choix automatique de la couleur d&amp;#39;un texte en fonction de sa couleur d&amp;#39;arrière plan" href="http://blog.geekfg.net/2009/01/choix-automatique-de-la-couleur-d-texte.html"&gt;automatiquement la couleur d’un texte par rapport à son arrière plan&lt;/a&gt;. Aujourd’hui, je vous propose de trier un set (ou une palette) de couleur. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pour vous faciliter nous faciliter la tâche voici quelques restrictions :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Notre set (ou palette) sera composé de 5 couleurs &lt;/li&gt;    &lt;li&gt;Les couleurs devront être triées de la plus claire à la plus foncée (l’inverse est tout aussi possible) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;En fidèle lecteur de ce blog vous vous souvenez sans doute de cet article où j’expliquais &lt;a href="http://blog.geekfg.net/2008/10/algorithme-et-code-c-dune-fonction-de.html" rel="dofollow"&gt;comment réaliser une fonction de tri simple&lt;/a&gt;. Grâce à ces deux précédents articles nous sommes capable de réaliser de réaliser une fonction de tri de couleur.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;La théorie&lt;/h3&gt;  &lt;p&gt;Pour savoir si une couleur est plus clair ou plus foncée qu’une autre, il suffit de se référer à la &lt;a href="http://blog.geekfg.net/2009/01/choix-automatique-de-la-couleur-d-texte.html"&gt;luminance de leurs codes HSL&lt;/a&gt;. Au lieu de trier des nombres du plus petit au plus grand il faut donc&lt;strong&gt; trier les couleurs par leurs composantes HSL&lt;/strong&gt; de la plus grande (100% : blanc) à la plus petite (0% : noir).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;L’algorithme&lt;/h3&gt;  &lt;p&gt;Ce qui nous donne cet algorithme :&lt;/p&gt; &lt;code&gt;tabCouleur = [&amp;quot;0B8C8F&amp;quot;, &amp;quot;FCF8BC&amp;quot;, &amp;quot;CACF43&amp;quot;,&amp;quot;2B2825&amp;quot;,&amp;quot;D6156C&amp;quot;]    &lt;br /&gt;    &lt;br /&gt;//Convertir de HEX en HSL     &lt;br /&gt;convertirTableauCouleurHEXversHSL(tabCouleur);     &lt;br /&gt;    &lt;br /&gt;//Le tableau est maintenant de la forme :     &lt;br /&gt;//tabCouleur = [[,,], [,,], [,,], [,,], [,,]]     &lt;br /&gt;    &lt;br /&gt;//Luminance de la première couleur : tabCouleur[0][2]     &lt;br /&gt;    &lt;br /&gt;Faire     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Si(tabCouleur[0][2] &amp;lt; tabCouleur[1][2])     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tabCouleur.intervertir(0,1);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SinonSi(tabCouleur[1][2] &amp;lt; tabCouleur[2][2])     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tabCouleur.intervertir(2,3);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SinonSi(tabCouleur[2][2] &amp;lt; tabCouleur[3][2])     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tabCouleur.intervertir(2,3);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SinonSi(tabCouleur[3][2] &amp;lt; tabCouleur[4][2])     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tabCouleur.intervertir(3,4);     &lt;br /&gt;TantQue(!(&amp;#160;&amp;#160;&amp;#160; tabCouleur[0][2] &amp;gt;= tabCouleur[1][2]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;&amp;amp;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tabCouleur[1][2] &amp;gt;= tabCouleur[2][2]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;&amp;amp;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tabCouleur[2][2] &amp;gt;= tabCouleur[3][2]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;&amp;amp;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tabCouleur[3][2] &amp;gt;= tabCouleur[4][2]))     &lt;br /&gt;    &lt;br /&gt;//Convertir de HSL -&amp;gt; HEX     &lt;br /&gt;convertirTableauCouleurHSLversHEX(tabCouleur);&lt;/code&gt;   &lt;p&gt;L’équivalent Javascript n’est pas très différent. Les fonctions &lt;strong&gt;convertirTableauCouleurHEXversHSL&lt;/strong&gt; et &lt;strong&gt;convertirTableauCouleurHSLversHEX&lt;/strong&gt; vont en fait transformer&lt;strong&gt; le code HEXA en RGB puis en HSL&lt;/strong&gt; et inversement.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pour ce qui est de la méthode &lt;u&gt;intervertir&lt;/u&gt;. Elle ne fait rien d’autre qu’une inversion (swap) entre 2 éléments (spécifiés par leurs index) d’un même tableau. Le code Javascript est donc :&lt;/p&gt; &lt;code&gt;var tmp=tabCouleur[x];    &lt;br /&gt;tabCouleur[x]=tabCouleur[y];     &lt;br /&gt;tabCouleur[y]=tmp;&lt;/code&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Démonstration en javascript&lt;/h3&gt;  &lt;p&gt;J’ai réalisé une démonstration en javascript de cet algorithme sur le &lt;a href="http://projets.geekfg.net"&gt;sous domaine projets&lt;/a&gt;. Le script importe dynamiquement (via l’API de ColourLovers) des palettes de couleurs il vous suffit alors de cliquer sur une palette pour la trier.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A chaque chargement de l’API, une seconde palette est générée et contient toutes les couleurs des autres palettes le temps de tri est légèrement plus long mais le résultat est là.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pour accéder à la &lt;a href="http://projets.geekfg.net/?/6-trier+des+couleurs+en+javascript.htm" rel="dofollow"&gt;démo de tri des couleurs en javascript c’est par ici&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Remarque&lt;/strong&gt; : Certaines palettes ont déjà leurs couleurs de triées de la plus foncées à la plus clair.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-5726779359099983330?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=eCq8J1xJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=vU0nhmg9"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=vU0nhmg9" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=1tpTLqH2"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=1tpTLqH2" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/5726779359099983330/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=5726779359099983330&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/5726779359099983330?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/5726779359099983330?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/1HD-pWt8gXc/algorithme-tri-de-couleur-demonstration.html" title="Algorithme tri de couleur (+ demonstration javascript)" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/02/algorithme-tri-de-couleur-demonstration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcCRX8-eSp7ImA9WxVXEkQ.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-2151945439387734828</id><published>2009-02-10T21:01:00.001+01:00</published><updated>2009-02-10T21:01:04.151+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-10T21:01:04.151+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bookmarklet" /><category scheme="http://www.blogger.com/atom/ns#" term="projet" /><title>Mise à jour : Bookmarklet pour avoir une signature HTML sous Gmail</title><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Petite note de service pour vous informer de la mise à jour de mon &lt;strong&gt;générateur de &lt;a href="http://projets.geekfg.net/?/1-how+to+insert+html+signature+in+gmail.htm"&gt;bookmarklet&lt;/a&gt;&lt;/strong&gt; permettant d’&lt;strong&gt;&lt;a href="http://projets.geekfg.net/?/2-comment+ajouter+une+signature+html+sous+gmail.htm"&gt;insérer une signature HTML sous Gmail&lt;/a&gt;&lt;/strong&gt;. J’avais réalisé la première version dans mes débuts avec jQuery et je ne connaissais pas la méthode &lt;em&gt;.prepend() :&lt;/em&gt; maintenant la signature s’ajoute tout en haut de votre email, il vous suffit donc de l’ajouter puis d’écrire ensuite votre message.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;D’ailleurs Ghacks proposait aujourd’hui un article, qui (…outre le fait d’y intégrer un lien vers mon générateur ^^) &lt;a href="http://www.ghacks.net/2009/02/09/gmail-90-tools-and-tips-to-make-you-a-gmail-pro/"&gt;propose 90 outils et astuces pour devenir un Pro de Gmail&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si vous avez des suggestions concernant le bookmarklet, j’en tiendrais compte pour la prochaine version.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-2151945439387734828?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=Zv1EXNcG"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=YsFYFEfm"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=YsFYFEfm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=FKJY1I35"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=FKJY1I35" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/2151945439387734828/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=2151945439387734828&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/2151945439387734828?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/2151945439387734828?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/Fa4mZ9xlZ_8/mise-jour-bookmarklet-pour-avoir-une.html" title="Mise à jour : Bookmarklet pour avoir une signature HTML sous Gmail" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/02/mise-jour-bookmarklet-pour-avoir-une.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8EQH44fSp7ImA9WxVXEE0.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-5079859209321063032</id><published>2009-02-07T11:00:00.000+01:00</published><updated>2009-02-07T11:00:01.035+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-07T11:00:01.035+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="astuce" /><category scheme="http://www.blogger.com/atom/ns#" term="registre" /><title>Liste des programmes et manipulations effectuées après un formatage</title><content type="html">&lt;p&gt;En début de semaine j’ai dû formater mon ordinateur pour y ré-installer XP Pro SP3 (en attendant Windows 7) sur mon disque dur principal. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Voici la liste exhaustives des programmes que j'ai installé après le formatage :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Développement &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://notepad-plus.sourceforge.net/ " rel="nofollow"&gt;Notepad++&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.toadsoft.com/toadmysql/" rel="nofollow"&gt;Toad For Mysql&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.wampserver.com/" rel="nofollow"&gt;Wamp Server&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;SVN        &lt;ul&gt;         &lt;li&gt;&lt;a href="http://www.visualsvn.com/server/" rel="nofollow"&gt;VisualSVN Server&lt;/a&gt; &lt;/li&gt;          &lt;li&gt;&lt;a href="http://tortoisesvn.tigris.org" rel="nofollow"&gt;TortoiseSVN&lt;/a&gt; &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;&lt;a href="http://filezilla-project.org/" rel="nofollow"&gt;FileZilla / FilleZilla Server&lt;/a&gt; &lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Outils      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.7-zip.org/" rel="nofollow"&gt;7-zip&lt;/a&gt; (léger et puissant) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.realtimesoft.com/ultramon/" rel="nofollow"&gt;UltraMon&lt;/a&gt; (pour la gestion du double écran) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.adobe.com/fr/products/air/" rel="nofollow"&gt;Adobe Air/Flash&lt;/a&gt; / &lt;a href="http://silverlight.net" rel="nofollow"&gt;Silverlight&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.videolan.org/vlc/" rel="nofollow"&gt;VLC&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.wireshark.org/" rel="nofollow"&gt;Wireshark&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Bureautique      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.microsoft.com/france/office/" rel="nofollow"&gt;Microsoft Office&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.foxitsoftware.com/pdf/rd_intro.php" rel="nofollow"&gt;Foxit PDF Reader&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Graphisme      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.adobe.com/fr/products/photoshop/" rel="nofollow"&gt;Photoshop&lt;/a&gt; (même si je n’y connais pas grand chose je le préfère à The GIMP) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.paint.net" rel="nofollow"&gt;Paint.NET&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Navigateur      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.mozilla-europe.org/fr/firefox/" rel="nofollow"&gt;Mozilla Firefox&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.google.com/chrome" rel="nofollow"&gt;Google Chrome&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;(MultiplieIE, Opera, Safari pour le test) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Protection      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://phoenixlabs.org/pg2/" rel="nofollow"&gt;PeerGuardian&lt;/a&gt;&amp;#160; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Personnalisation      &lt;ul&gt;       &lt;li&gt;&lt;a href="qttabbar.wikidot.com/" rel="nofollow"&gt;QT Tabbar&lt;/a&gt; (pour le système d’onglet sur l’explorer) &lt;/li&gt;        &lt;li&gt;Uxtheme patch &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.vistastartmenu.com" rel="nofollow"&gt;VistaStartMenu&lt;/a&gt; (pour la recherche comme sous Vista) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://supercopier.sfxteam.org" rel="nofollow"&gt;SuperCopier 2&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Communication/Social      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.windowslive.fr/writer/" rel="nofollow"&gt;Windows Live Writer&lt;/a&gt; (que j’utilise pour bloguer) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.windowslive.fr/messenger/" rel="nofollow"&gt;Windows Live Messenger&lt;/a&gt;           &lt;ul&gt;           &lt;li&gt;&lt;a href="http://www.msgpluslive.fr/download/" rel="nofollow"&gt;Messenger Plus Live!&lt;/a&gt; &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.twhirl.org/" rel="nofollow"&gt;Twhirl&lt;/a&gt; (Twitter) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.google.com/talk/" rel="nofollow"&gt;Google Talk&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Virtualisation      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.microsoft.com/france/windows/xp/virtualpc/" rel="nofollow"&gt;Virtual PC&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.vmware.com/fr/" rel="nofollow"&gt;VMWare&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ensuite au niveau du registre pour une &lt;u&gt;ouverture automatique de la session et l’activation au démarrage de Verr. Num&lt;/u&gt;. Voici le code à modifier puis enregistrer dans un *.reg et enfin exécuter.&lt;/p&gt; &lt;code&gt;Windows Registry Editor Version 5.00   &lt;br /&gt;    &lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]    &lt;br /&gt;&amp;quot;DefaultUserName&amp;quot;=&amp;quot;monCompteUtilisateur&amp;quot;    &lt;br /&gt;&amp;quot;DefaultPassword&amp;quot;=&amp;quot;monMotDePasse&amp;quot;    &lt;br /&gt;&amp;quot;AutoAdminLogon&amp;quot;=&amp;quot;1&amp;quot;    &lt;br /&gt;    &lt;br /&gt;[HKEY_USERS\.DEFAULT\Control Panel\Keyboard]     &lt;br /&gt;&amp;quot;InitialKeyboardIndicators&amp;quot;=&amp;quot;2&amp;quot;&lt;/code&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Au niveau de la configuration de Windows :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Suppression de l’écran de veille et de tout les sons Windows.&lt;/li&gt;    &lt;li&gt;“Afficher les fichiers &amp;amp; dossiers cachés”, “afficher les extensions des fichiers”, “ne pas masquer les fichiers protégés”.&lt;/li&gt;    &lt;li&gt;Désactivation de la surveillance de l’antivirus &amp;amp; du pare-feu depuis le centre de sécurité.&lt;/li&gt;    &lt;li&gt;Suppression de la barre de langue.&lt;/li&gt;    &lt;li&gt;Etc…&lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-5079859209321063032?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=w1jcyeRQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=s6PkjQq3"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=s6PkjQq3" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=u259ydld"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=u259ydld" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/5079859209321063032/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=5079859209321063032&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/5079859209321063032?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/5079859209321063032?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/Oyxtq5f3hCM/liste-des-programmes-et-manipulations.html" title="Liste des programmes et manipulations effectuées après un formatage" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/02/liste-des-programmes-et-manipulations.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8FQ349fSp7ImA9WxVQGUw.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-7240402490397865323</id><published>2009-02-06T12:13:00.001+01:00</published><updated>2009-02-06T12:13:32.065+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-06T12:13:32.065+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="feedburner" /><category scheme="http://www.blogger.com/atom/ns#" term="rss" /><title>Note de service : flux RSS du site</title><content type="html">&lt;p&gt;Certains d’entre vous l’on peut-être remarqué. L’ancienne adresse du flux RSS redirige vers &lt;a title="http://feeds2.feedburner.com/geekfg" href="http://feeds2.feedburner.com/geekfg"&gt;http://feeds2.feedburner.com/geekfg&lt;/a&gt;. Cette adresse est donc la nouvelle adresse du flux, pensez à mettre à jour vos Netvibes, Google Reader et autres agrégateurs RSS.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-7240402490397865323?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=QldoG9A4"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=DailS12k"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=DailS12k" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=ObjwZ3QV"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=ObjwZ3QV" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/7240402490397865323/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=7240402490397865323&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/7240402490397865323?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/7240402490397865323?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/-e7jpFDpcdQ/note-de-service-flux-rss-du-site.html" title="Note de service : flux RSS du site" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/02/note-de-service-flux-rss-du-site.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEGQ3c6eip7ImA9WxVQEE0.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-1182096868701759047</id><published>2009-01-25T19:00:00.001+01:00</published><updated>2009-01-26T23:23:42.912+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-26T23:23:42.912+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="snippet" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="algorithme" /><title>Choix automatique de la couleur d'un texte en fonction de sa couleur d'arrière plan</title><content type="html">&lt;p&gt;Ou en terme plus technique, comment cr&amp;#233;er un algorithme qui retourne un foregroundColor ad&amp;#233;quate en fonction d'un backgroundColor variable.&lt;/p&gt;  &lt;p&gt;Dans le cadre de mon &lt;a href="http://www.zlio.fr/" rel="nofollow" target="_blank"&gt;stage @ Zlio Nantes&lt;/a&gt;, j'ai eu besoin de cr&amp;#233;er un algorithme qui, &amp;#224; partir de n'importe quelle couleur d'arri&amp;#232;res plans, serait capable de d&amp;#233;finir si la couleur du texte (blanc ou noir) afin que ce dernier soit toujours visible.&lt;/p&gt;  &lt;p&gt;Postulat : Pour la d&amp;#233;monstration, nous prendrons un vert fonc&amp;#233; comme couleur d'arri&amp;#232;re plan&lt;/p&gt; &lt;code&gt;#155147 = rgb(21, 81, 71); //&lt;a href="http://fr.wikipedia.org/wiki/Rgb" rel="nofollow" target="_blank"&gt;RGB&lt;/a&gt; (Red, Blue, Green)&lt;/code&gt; ou RVB (Rouge, Vert, Bleu)   &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;M&amp;#233;thode rapide&lt;/h3&gt;  &lt;p&gt;La premi&amp;#232;re id&amp;#233;e qui pourrait vous venir &amp;#224; l'esprit serait d' &lt;strong&gt;additionner les composantes RVB&lt;/strong&gt; :&lt;/p&gt;  &lt;p&gt;21+81+71 = 173&lt;/p&gt;  &lt;p&gt;Or, au maximum il est possible d'obtenir une somme de&lt;/p&gt;  &lt;p&gt;255+255+255 = 765&lt;/p&gt;  &lt;p&gt;Donc il suffirait donc de regarder si la somme des composantes et sup&amp;#233;rieur ou inf&amp;#233;rieur &amp;#224; &lt;strong&gt;382,5&lt;/strong&gt; (765/2) pour savoir s'il faut mettre le texte en blanc (donc plus clair) ou en noir (plus fonc&amp;#233;). Ce qui pourrait donner cet algorithme :&lt;/p&gt;  &lt;p&gt;&lt;code&gt;var couleurRGB = [21,81,71];      &lt;br /&gt;      &lt;br /&gt;Si couleurRGB[0]+couleurRGB[1]+couleurRGB[2] &amp;gt; 382 Alors       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //#FFFFFF       &lt;br /&gt;Sinon       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //#000000       &lt;br /&gt;FinSi&lt;/code&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;En r&amp;#233;alit&amp;#233; cet approche est fausse. D'ailleurs en utilisant la couleur de l'exemple, l'algorithme nous propose d'utiliser du noir. Voici le r&amp;#233;sultat :&lt;/p&gt;  &lt;p style="padding-right: 5px; padding-left: 5px; float: left; padding-bottom: 5px; margin: 5px; width: 150px; padding-top: 5px; display: block; background-color: rgb(21,81,71)"&gt;En testant on constate que le texte n'est clairement pas visible et que le blanc aurait &amp;#233;t&amp;#233; un meilleur choix.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;En baissant la valeur seuil &amp;#224; &lt;strong&gt;170&lt;/strong&gt; notre algorithme retourne une couleur correcte (blanc) pour notre exemple, mais qu'en est-il pour ces autres couleurs ? &lt;span style="color: #ffffff"&gt;&lt;span style="background-color: rgb(4,1,31)"&gt;rgb(4, 1, 31)&lt;/span&gt;, &lt;span style="background-color: rgb(9,23,9)"&gt;rgb(9, 23, 9)&lt;/span&gt;, &lt;span style="background-color: rgb(29,50,3)"&gt;rgb(29, 50, 3)&lt;/span&gt;, &lt;span style="background-color: rgb(27,15,27)"&gt;rgb(27, 15, 27)&lt;/span&gt;&lt;/span&gt;. La somme de leurs composantes ne d&amp;#233;passe pas &lt;strong&gt;170&lt;/strong&gt; et pourtant la proposition est fausse, notre algorithme propose du noir.&lt;/p&gt;  &lt;p&gt;Pour corriger cela nous pourrions baisser la valeur seuil. Lors de mes tests j'ai r&amp;#233;ussi &amp;#224; obtenir de tr&amp;#232;s bon r&amp;#233;sultat avec une valeur seuil &amp;#224; &lt;strong&gt;86&lt;/strong&gt; mais il reste encore une infinit&amp;#233; de cas o&amp;#249; notre algorithme propose une couleur erron&amp;#233;e.&lt;/p&gt;  &lt;p&gt;A ce stade, 2 possibilit&amp;#233;s. Soit nous complexifions notre algorithme en &amp;#233;tudiant chacune des composants les une apr&amp;#232;s les autres et en r&amp;#233;alisant un savant m&amp;#233;lange de test,... Soit nous passons &amp;#224; la m&amp;#233;thode fiable.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;M&amp;#233;thode fiable&lt;/h3&gt;  &lt;p&gt;La m&amp;#233;thode fiable consiste &amp;#224; &lt;strong&gt;convertir le format de gestion de couleur de RGB vers HSL&lt;/strong&gt; (Hue, Saturation, Lightness) soit &lt;a href="http://fr.wikipedia.org/wiki/Teinte_saturation_lumi%C3%A8re" rel="nofollow" target="_blank"&gt;TSL&lt;/a&gt; (Teinte, Saturation, Lumi&amp;#232;re) en fran&amp;#231;ais. C'est la composante lumi&amp;#232;re qui nous int&amp;#233;resse :&lt;/p&gt;  &lt;blockquote&gt;La lumi&amp;#232;re est la luminosit&amp;#233; (depuis 0 % qui correspond au noir jusqu'&amp;#224; 100 %, luminosit&amp;#233; maximale permise par le support, le blanc dans le cas des &amp;#233;crans).&lt;/blockquote&gt;  &lt;p&gt;Une fois la conversion effectu&amp;#233;e ils nous suffira de d&amp;#233;finir si la composante &amp;quot;L&amp;quot; est sup&amp;#233;rieur ou inf&amp;#233;rieur &amp;#224; 50% et d'en d&amp;#233;duire la couleur &amp;#224; appliquer en premier plan. Notre algorithme devient donc :&lt;/p&gt; &lt;code&gt;var couleurRGB = [21,81,71];    &lt;br /&gt;var couleurHSL = RGBtoHSL(couleurRGB);     &lt;br /&gt;    &lt;br /&gt;Si couleurHSL[2] &amp;gt; 0.5 Alors //0.5 = 50%&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //#000000     &lt;br /&gt;Sinon     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //#FFFFFF     &lt;br /&gt;FinSi&amp;#160; &lt;br /&gt;&lt;/code&gt;  &lt;p&gt;Et voila ! Cette m&amp;#233;thode est l&amp;#233;g&amp;#232;rement plus lente en calcul processeur car elle n&amp;#233;cessite une conversion suppl&amp;#233;mentaire mais elle est &lt;strong&gt;100% fiable.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;[MAJ] &lt;a title="D&amp;#233;mo" href="http://geekfg.net/blog/Choix_automatique_de_la_couleur_dun_texte_en_fonction_de_sa_couleur_darriere_plan.htm" target="_blank"&gt;La d&amp;#233;mo est disponible en ligne ici&lt;/a&gt;, elle int&amp;#232;gre le code javascript fonctionnel des deux algorithmes ainsi qu'un script de test pour comparer automatiquement leurs valeurs de retour.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-1182096868701759047?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=C737K4fP"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=3SiODN01"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=3SiODN01" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=nys3VL5w"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=nys3VL5w" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/1182096868701759047/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=1182096868701759047&amp;isPopup=true" title="6 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/1182096868701759047?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/1182096868701759047?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/eAJy4kSpvVc/choix-automatique-de-la-couleur-d-texte.html" title="Choix automatique de la couleur d&amp;#39;un texte en fonction de sa couleur d&amp;#39;arrière plan" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/01/choix-automatique-de-la-couleur-d-texte.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8ASX4_eip7ImA9WxVQEUk.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-1731552280066814360</id><published>2009-01-12T14:03:00.001+01:00</published><updated>2009-01-28T14:20:48.042+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-28T14:20:48.042+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="snippet" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="astuce" /><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="chrome" /><category scheme="http://www.blogger.com/atom/ns#" term="opera" /><category scheme="http://www.blogger.com/atom/ns#" term="firebug" /><title>Débugger avec Firebug sous Firefox en testant en parallèle avec IE, Opera et Chrome</title><content type="html">&lt;p&gt;Si vous développez et débuggez votre application sous Firefox et utilisez les méthodes de l’objet console de Firebug, tel que :&lt;/p&gt; &lt;code&gt;console.debug(maVariable);    &lt;br /&gt;console.info('Hello World :', monApplication.version);     &lt;br /&gt;console.log('Logged in'); &lt;/code&gt;  &lt;p&gt;Il vous est alors impossible de tester votre code en parallèle sous Internet Explorer, Opera et &lt;em&gt;Chrome&lt;sup&gt;[1]&lt;/sup&gt;&lt;/em&gt; sans voir apparaitre un de ces messages :&lt;/p&gt; &lt;code&gt;/* IE */    &lt;br /&gt;Erreur : 'console' est indéfini     &lt;br /&gt;    &lt;br /&gt;/* Opera */     &lt;br /&gt;Error:     &lt;br /&gt;name: ReferenceError     &lt;br /&gt;message: Statement on line 437: Undefined variable: console     &lt;br /&gt;    &lt;br /&gt;/* Chrome (v1.x.xxx.x) */     &lt;br /&gt;Uncaught TypeError: Object #&amp;lt;a console=&amp;quot;console&amp;quot;&amp;gt; has no method 'debug' &lt;/a&gt;&lt;/code&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Commençons donc par un petit rappel sur les moyens de débug offert par ces différents navigateurs :&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Internet Explorer&lt;/h3&gt;  &lt;p&gt;Il n’existe pas de console en &lt;u&gt;natif&lt;/u&gt; qui propose les mêmes fonctionnalités que celles offertes par Firebug. Cependant des plugins tel que &lt;a href="http://www.debugbar.com/" rel="nofollow"&gt;DebugBar&lt;/a&gt; devraient permettre cela.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Opera&lt;/h3&gt;  &lt;p&gt;Opera possède sa propre méthode &lt;strong&gt;postError()&lt;/strong&gt; mais son utilisation est limitée car elle n’affiche pas le contenu des objets&lt;/p&gt;  &lt;code&gt;opera.postError([1,2,3,4,5]);//Affiche: 1,2,3,4,5 &lt;br /&gt;opera.postError('Mon tableau',[1,2,3,4,5]);//Affiche: Mon tableau,1,2,3,4,5 &lt;br /&gt;opera.postError({maPropriete: 'Hello', maMethode : function(){return 'World';}});//Affiche: [object Object]&lt;/code&gt;  &lt;h3&gt;Google Chrome&lt;/h3&gt;  &lt;p&gt;Dans ses dernières versions (testé sous 2.0.156.1) Chrome supporte partiellement, via sa &lt;strong&gt;Console Javascript&lt;/strong&gt; (Ctrl+Maj+J) les méthodes suivantes :&lt;/p&gt;  &lt;code&gt;console.debug(); &lt;br /&gt;console.info(); &lt;br /&gt;console.log();&lt;/code&gt;  &lt;p&gt;Partiellement car il est actuellement impossible de passer plusieurs objets/tableaux via un seul appel&lt;/p&gt;  &lt;code&gt;monTableau = [1,2,3,4,5,6]; &lt;br /&gt;monObjet = {maPropriete : 'Hello', maMethode : function(){return 'World';}}; &lt;br /&gt;console.debug(monTableau,monObjet);//Affiche: [1, 2, 3, 4, 5, 6] Object &lt;br /&gt;console.debug(monObjet);//Affiche le contenu de l'objet monObjet&lt;/code&gt;  &lt;h3&gt;La solution&lt;/h3&gt;  &lt;p&gt;Voici un bout de code (&lt;a href="http://fr.wikipedia.org/wiki/Snippet" rel="nofollow"&gt;snippet&lt;/a&gt;) à placer &lt;strong&gt;&lt;u&gt;avant&lt;/u&gt;&lt;/strong&gt; tout appel aux méthodes&lt;strong&gt; console.debug, console.info et console.log&lt;/strong&gt;.&lt;/p&gt;  &lt;code&gt;//On créé l’objet console s’il n’existe pas (sous d’autre navigateur que Firebox &amp;amp; Chrome)  &lt;br /&gt;if(typeof console !== 'object') &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; console = {};  &lt;br /&gt;if((typeof console.debug) !== 'function')//On pourrait aussi vérifier pour console.info et console.log  &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(typeof opera === 'object')//On redirige les appels vers opera.postError(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; console = {debug : function(){return opera.postError(arguments);}, info : function(){this.debug('[INFO] ',arguments);}, log : &lt;br /&gt;function(){this.debug('[LOG] ',arguments);}}; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else//Ne rien afficher sur les autres navigateurs &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; console = {debug : function(){return true;},info : function(){return true;}, log : function(){return true;}};  &lt;br /&gt;}&lt;/code&gt;  &lt;p&gt;Il vous est maintenant possible de tester (voir même de debugger si vous êtes sous Chrome et/ou Opera) votre application sans vous soucier de supprimer les lignes de debug pour Firebug. Je vous conseille toutefois de placer ce bout de code dans l’événement DomReady afin d’éviter tout problème de chargement. &lt;/p&gt;  &lt;p&gt;DomReady avec &lt;strong&gt;jQuery&lt;/strong&gt; :&lt;/p&gt;  &lt;code&gt;$(document).ready(function(){ /* bout de code à copier ici */ });&lt;/code&gt;  &lt;p&gt;DomReady avec &lt;strong&gt;MooTools&lt;/strong&gt;:&lt;/p&gt;  &lt;code&gt;window.addEvent('domready', function() { /* bout de code à copier ici */ });&lt;/code&gt;  &lt;p&gt;[1]&lt;/sup&gt; Versions 1.x.xxx.x de Chrome&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-1731552280066814360?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=YbKv2wT2"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=NfGaRpYu"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=NfGaRpYu" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=ZtJm3LLh"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=ZtJm3LLh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/1731552280066814360/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=1731552280066814360&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/1731552280066814360?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/1731552280066814360?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/O4Z3EHxm6h8/dbugger-avec-firebug-sous-firefox-en.html" title="Débugger avec Firebug sous Firefox en testant en parallèle avec IE, Opera et Chrome" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/01/dbugger-avec-firebug-sous-firefox-en.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04DQ3ozeSp7ImA9WxVTGUk.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-399451523398020639</id><published>2009-01-03T01:19:00.001+01:00</published><updated>2009-01-03T01:19:32.481+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-03T01:19:32.481+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="yui" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="mootools" /><category scheme="http://www.blogger.com/atom/ns#" term="prototype" /><category scheme="http://www.blogger.com/atom/ns#" term="dojo" /><title>Savoir si les librairies JavaScript jQuery, Prototype, Mootools, YUI et DOJO sont présentes sur une page web</title><content type="html">&lt;p&gt;Voici plusieurs bouts de code qui vous permettrons de savoir si tel ou tel libraire est pr&amp;#233;sente (mais pas forc&amp;#233;ment initialis&amp;#233;es) dans une page web. Tr&amp;#232;s utile lorsque vous devez r&amp;#233;aliser un script reposant sur l'une de ces librairies, il vous est alors possible d'&amp;#233;viter de r&amp;#233;-inclure la librairie. Pour cela il suffit d'utiliser un bootstrap (Facebook appelle cela un bootloader).&lt;/p&gt;  &lt;blockquote&gt;bootstrap : petit programme d'amor&amp;#231;age qui permet d'en lancer un plus gros. (Wikipedia)&lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JQuery&lt;/strong&gt; :&lt;/p&gt; &lt;code&gt;var JQuery_estPresent = (typeof jQuery != &amp;quot;undefined&amp;quot;)?true:false;&lt;/code&gt;   &lt;p&gt;&lt;strong&gt;Prototype&lt;/strong&gt; :&lt;/p&gt; &lt;code&gt;var Prototype_estPresent = (typeof Prototype != &amp;quot;undefined&amp;quot;)?true:false;&lt;/code&gt;   &lt;p&gt;&lt;strong&gt;Mootools&lt;/strong&gt; :&lt;/p&gt; &lt;code&gt;var MooTools_estPresent = (typeof MooTools != &amp;quot;undefined&amp;quot;)?true:false;&lt;/code&gt;   &lt;p&gt;&lt;strong&gt;YUI&lt;/strong&gt; :&lt;/p&gt; &lt;code&gt;var YahooUI_estPresent = (typeof YAHOO != &amp;quot;undefined&amp;quot;)?true:false;&lt;/code&gt;   &lt;p&gt;&lt;strong&gt;Dojo&lt;/strong&gt; :&lt;/p&gt;  &lt;p&gt;&lt;code&gt;var Dojo_estPresent = (typeof dojo != &amp;quot;undefined&amp;quot;)?true:false;&lt;/code&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Exemple d'utilisation via un BootStrap depuis une page web&lt;/h3&gt; &lt;code&gt;var hasJQuery = (typeof jQuery != &amp;quot;undefined&amp;quot;)?true:false;//retourne un bool&amp;#233;en selon la pr&amp;#233;sence de jQuery sur la page   &lt;br /&gt;var scrpt = document.createElement('script');     &lt;br /&gt;scrpt.src = 'http://monsite.com/script/monscript.js.php?' + (hasJQuery?'besoinDeJquery=true':'');//pr&amp;#233;paration de l'URL     &lt;br /&gt;document.body.appendChild(scrpt);//ajout du script     &lt;br /&gt;&lt;/code&gt;  &lt;p&gt;Le fichier &lt;strong&gt;monscript.js.php&lt;/strong&gt; se chargera d'inclure ou non la librairie jQuery en fonction de la variable &lt;strong&gt;besoinDeJquery&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;De nombreuses autres utilisations de ces informations sont bien entendu possible.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-399451523398020639?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=ypCzIGdX"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=FYPYouxQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=FYPYouxQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=4KTS1H1W"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=4KTS1H1W" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/399451523398020639/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=399451523398020639&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/399451523398020639?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/399451523398020639?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/Hjz1tGt2n5E/savoir-si-les-librairies-javascript.html" title="Savoir si les librairies JavaScript jQuery, Prototype, Mootools, YUI et DOJO sont présentes sur une page web" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2009/01/savoir-si-les-librairies-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYNSHs_eyp7ImA9WxRaGUg.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-7118019089972623981</id><published>2008-12-20T22:24:00.001+01:00</published><updated>2008-12-22T14:23:19.543+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-22T14:23:19.543+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="xpath" /><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><title>Retrouver le chemin XPath d'un élément html via Javascript</title><content type="html">&lt;p&gt;Apr&amp;#232;s de nombreuses recherches mais en vain, j'ai d&amp;#233;cid&amp;#233; de coder cette fonction qui permet de retourner le chemin XPath d'un &amp;#233;l&amp;#233;ment html.&lt;/p&gt; &lt;code&gt;//@el &amp;#233;l&amp;#233;ment HTML    &lt;br /&gt;function getXpath(el){     &lt;br /&gt;    &lt;br /&gt;XPath = '/'+el.nodeName     &lt;br /&gt;+ (el.id?'[@id=\''+ el.id +'\']':(el.className?'[@class=\''+ el.className+'\']':''));     &lt;br /&gt;    &lt;br /&gt;while(el.parentNode &amp;amp;&amp;amp; el.parentNode.nodeName !== '#document')//on monte d'un &amp;#233;l&amp;#233;ment &amp;#224; chaque it&amp;#233;ration     &lt;br /&gt;{     &lt;br /&gt;el = el.parentNode;     &lt;br /&gt;XPath = '/'     &lt;br /&gt;+ el.nodeName     &lt;br /&gt;+ (el.id?'[@id=\''+ el.id +'\']':(el.className?'[@class=\''+ el.className+'\']':''))     &lt;br /&gt;+ XPath;     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;return XPath.toLowerCase();     &lt;br /&gt;}&lt;/code&gt;   &lt;p&gt;Si vous souhaitez retourner uniquement le chemin XPath de l'&amp;#233;l&amp;#233;ment p&amp;#232;re, il suffit de remplacer cette ligne :&lt;/p&gt; &lt;code&gt;XPath = '/'+el.nodeName    &lt;br /&gt;+ (el.id?'[@id=\''+ el.id +'\']':(el.className?'[@class=\''+ el.className+'\']':'')); &lt;/code&gt;  &lt;p&gt;Par :&lt;/p&gt;  &lt;p&gt;&lt;code&gt;XPath = ''; &lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Exemple d'utilisation pour une &lt;strong&gt;div&lt;/strong&gt; ayant une valorisation de l'ID &amp;#224; &lt;strong&gt;post-845&lt;/strong&gt; : &lt;/p&gt;  &lt;p&gt;&lt;code&gt;alert(getXpath(document.getElementById('post-845')));      &lt;br /&gt;//retourne par exemple : /html/body/div/div[@id='page']/div[@id='content']/div[@id='post-845']&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;Test&amp;#233; sous Firefox 3, Chrome, IE7, IE8. Tout les chemins retourn&amp;#233;s jusqu'&amp;#224; pr&amp;#233;sent ont &amp;#233;t&amp;#233; valide mais il est possible d'affiner la pr&amp;#233;cision en sp&amp;#233;cifiant l'index de l'&amp;#233;l&amp;#233;ment. C'est utile lorsque, par exemple, il existe plusieurs &amp;#233;l&amp;#233;ments enfants de m&amp;#234;me type pour un unique &amp;#233;l&amp;#233;ment parent.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-7118019089972623981?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=KJOzYXhZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=I6RXhoj6"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=I6RXhoj6" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=Neosulme"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=Neosulme" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/7118019089972623981/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=7118019089972623981&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/7118019089972623981?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/7118019089972623981?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/b74qXFkbs8k/retrouver-le-chemin-xpath-d-lment-html.html" title="Retrouver le chemin XPath d&amp;#39;un élément html via Javascript" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/12/retrouver-le-chemin-xpath-d-lment-html.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UGQHk6eip7ImA9WxRaEUw.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-6202424630399213913</id><published>2008-12-12T22:13:00.000+01:00</published><updated>2008-12-12T23:00:21.712+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-12T23:00:21.712+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vb6" /><category scheme="http://www.blogger.com/atom/ns#" term="algorithme" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><title>Création d’un keygen (générateur de clés) à partir d’un algorithme</title><content type="html">&lt;p&gt;Il y a quelques jours, j’ai travaillé sur la sécurité d’une application web. Cette dernière demandait à l’utilisateur de payer une licence afin de faire disparaitre le texte “version demo”. Je montrerai le travail de recherche et d’analyse du code PHP et Javascript la semaine prochaine, pour le moment intéressons nous à la &lt;strong&gt;création d’un keygen&lt;/strong&gt; (générateur de clé) à partir d’un algorithme donné. &lt;u&gt;Je précise une fois de plus que cet article a pour but de faire “découvrir” une petite partie de la “sécurité informatique” et non d’inciter au piratage.&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Rappel sur les &lt;strong&gt;keygens&lt;/strong&gt; :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Un &lt;b&gt;générateur de clés&lt;/b&gt;, aussi appelé &lt;i&gt;&lt;strong&gt;keygenerator&lt;/strong&gt;&lt;/i&gt; ou tout simplement &lt;i&gt;&lt;strong&gt;keygen&lt;/strong&gt;&lt;/i&gt;, est un logiciel générant des numéros de série afin d'installer/déverrouiller/lancer une application.&lt;/p&gt;    &lt;p&gt;Un générateur de clés a deux moyens pour trouver une clé-cd valide : la méthode brute force et&lt;strong&gt; la méthode qui consiste à reconstituer l'algorithme&lt;/strong&gt; utilisé par la société éditrice du logiciel.&lt;/p&gt;    &lt;p align="right"&gt;&lt;a href="http://fr.wikipedia.org/wiki/Keygen"&gt;&lt;em&gt;Source Wikipedia&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;J’en profite aussi pour préciser les expressions algorithmiques utilisées dans cet article :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;POS(X)&lt;/strong&gt; : retourne le caractère à la position X, en partant de 0, d’une string quelconque. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;X MOD Y&lt;/strong&gt; : retourne X modulo Y &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;LEN(STR)&lt;/strong&gt; : retourne la longueur d’une string &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Les postulats sur lesquels nous nous baserons :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;On se basera sur la string &lt;strong&gt;DK&lt;/strong&gt; suivante (&lt;em&gt;si quelqu’un connait le nom technique je suis intéressé&lt;/em&gt;) : &lt;em&gt;123456789ABCDEFGHJKLMNPQRSTUVWXYZ&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;La clé (licence key) que doit entrer l’utilisateur est de 11 caractères ou plus. &lt;/li&gt;    &lt;li&gt;Nous comptons, pour les positions de caractère par exemple, à partir de 0. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Une fois la clé de licence spécifiée, le programme va effectuer les traitements suivants afin de définir la validité d’une clé :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Création d’une seconde clé (clé temporaire/intermédiaire à partir de la clé de licence entrée par l’utilisateur) sous la forme : [11][0][8][12]      &lt;ul&gt;       &lt;li&gt;[11] est la caractère en 11ème position de la licence originale &lt;/li&gt;        &lt;li&gt;Si la licence originale est &lt;em&gt;ZK5JC9EO6IEGP &lt;/em&gt;alors la clé intermédiaire sera GZ6P &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;On vérifie à partir de cette clé intermédiaire que :      &lt;ul&gt;       &lt;li&gt;Le modulo de la position du second caractère sur &lt;strong&gt;DK&lt;/strong&gt; est différent de 1. On trouvera alors [0] c’est à dire le caractère en 0ème position de notre clé de licence finale.           &lt;ul&gt;           &lt;li&gt;Par exemple pour 12 : &lt;/li&gt;            &lt;li&gt;&lt;code&gt;12 MOD 5 = 2 //12 est valide (modulo différent de 1) on cherche donc le caractère correspondant                &lt;br /&gt;POS(12) = C //C est donc un caractère possible en position 1 pour notre clé intermédiaire et en position 0 pour notre clé finale                 &lt;br /&gt;[0] = C&lt;/code&gt; &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;On prends aléatoirement les positions des 0ème et 2ème caractères sur &lt;strong&gt;DK&lt;/strong&gt; &lt;/li&gt;        &lt;li&gt;La position du 3ème caractère doit être égale à (j'ai décomposé le code pour une lecture plus aisée) :          &lt;ul&gt;           &lt;li&gt;&lt;code&gt;X = POS([11]) + POS([8]) //on additionne les positions sur DK de 0ème et 3ème caractère                &lt;br /&gt;X *= 9                 &lt;br /&gt;X = X Mod (Len(DK) - 1) //on repositionne X sur DK                 &lt;br /&gt;[12] = POS(X) //le 3ème caractère de notre clé intermédiaire est donc à la position X sur DK&lt;/code&gt; &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;L’idée est donc de générer aléatoirement des licences qui correspondent à cet algorithme. Voici un code VB6 permettant de résoudre cette problématique :&lt;/p&gt; &lt;code&gt;Randomize '(re)initialisation du moteur de nombre aléatoire    &lt;br /&gt;Dim dK as String     &lt;br /&gt;dK = &amp;quot;123456789ABCDEFGHJKLMNPQRSTUVWXYZ&amp;quot;     &lt;br /&gt;Dim sr(12) As String 'clé de licence finale que nous allons générer     &lt;br /&gt;    &lt;br /&gt;&lt;font color="#008000"&gt;'#########################################      &lt;br /&gt;' Traitement sur la clé intermédiaire       &lt;br /&gt;'#########################################&lt;/font&gt;     &lt;br /&gt;Dim tmp0, tmp1, tmp2, tmp3 As Integer     &lt;br /&gt;    &lt;br /&gt;'Recherche du 2ème caractère     &lt;br /&gt;tmp = 1     &lt;br /&gt;Do While ((tmp Mod 5) = 1)     &lt;br /&gt;tmp = rand(1, Len(dK))     &lt;br /&gt;Loop     &lt;br /&gt;sr(1) = Mid(dK, tmp, 1)     &lt;br /&gt;    &lt;br /&gt;'On créé le 0ème &amp;amp; 2ème caractère     &lt;br /&gt;tmp0 = rand(0, Len(dK) - 1)     &lt;br /&gt;tmp2 = rand(0, Len(dK) - 1)     &lt;br /&gt;    &lt;br /&gt;sr(0) = Mid(dK, tmp0 + 1, 1)     &lt;br /&gt;sr(2) = Mid(dK, tmp2 + 1, 1)     &lt;br /&gt;    &lt;br /&gt;'Le 3ème caractère doit être égal à     &lt;br /&gt;tmp3 = tmp0 + tmp2     &lt;br /&gt;tmp3 = tmp3 * 9     &lt;br /&gt;tmp3 = tmp3 Mod (Len(dK) - 1)     &lt;br /&gt;sr(3) = Mid(dK, tmp3 + 1, 1)     &lt;br /&gt;    &lt;br /&gt;&lt;font color="#008000"&gt;'#########################################      &lt;br /&gt;' On en déduit ensuite la clé finale       &lt;br /&gt;'#########################################&lt;/font&gt;     &lt;br /&gt;'Ordre : [11][0][8][12]     &lt;br /&gt;sr(11) = sr(0)     &lt;br /&gt;sr(0) = sr(1)     &lt;br /&gt;sr(8) = sr(2)     &lt;br /&gt;sr(12) = sr(3)     &lt;br /&gt;    &lt;br /&gt;sr(1) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;sr(2) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;sr(3) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;sr(4) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;sr(5) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;sr(6) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;sr(7) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;sr(9) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;sr(10) = Mid(dK, rand(1, Len(dK)), 1)     &lt;br /&gt;'La clé finale = Join(sr, &amp;quot;&amp;quot;)&lt;/code&gt;   &lt;p&gt;J’utilise des variables intermédiaires et de nombreux appelles à la fonction rand. Ce code est très facilement optimisable mais j’ai préféré le décomposer afin de faire ressortir l’algorithme de base et pour que cet article soit accessible au plus grand nombre.&lt;/p&gt;  &lt;p&gt;Si vous avez aimé cet article ou si vous avez des demandes particulières, n’hésitez pas à le faire savoir en commentaire. N’oubliez pas de vous inscrire au &lt;a href="http://feeds.feedburner.com/geekfg"&gt;flux rss&lt;/a&gt; du blog :).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-6202424630399213913?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=ysHQQBn9"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=rWokPJAf"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=rWokPJAf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=XwJW3fGC"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=XwJW3fGC" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/6202424630399213913/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=6202424630399213913&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/6202424630399213913?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/6202424630399213913?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/YYYHgZCo3Ek/cration-dun-keygen-gnrateur-de-cls.html" title="Création d’un keygen (générateur de clés) à partir d’un algorithme" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/12/cration-dun-keygen-gnrateur-de-cls.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8EQ3c8fyp7ImA9WxRbFEs.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-5982336795961529815</id><published>2008-12-04T20:11:00.002+01:00</published><updated>2008-12-05T08:56:42.977+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-05T08:56:42.977+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="astuce" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="ascii" /><title>Un jeu caché (easter-egg) sur le site de Jquery ?</title><content type="html">&lt;p&gt;En &lt;em&gt;"triffouillant"&lt;/em&gt; un peu sur &lt;a href="http://jquery.com/" rel="nofollow" target="_blank"&gt;le site de JQuery&lt;/a&gt;, j'ai découvert &lt;a href="http://static.jquery.com/files/rocker/scripts/custom.js" rel="nofollow" target="_blank"&gt;ces quelques lignes&lt;/a&gt; :&lt;/p&gt; &lt;code&gt;// Hehe.   &lt;br /&gt;if ( window.addEventListener ) {    &lt;br /&gt;var kkeys = [], konami = "&lt;strong&gt;38,38,40,40,37,39,37,39,66,65&lt;/strong&gt;";    &lt;br /&gt;window.addEventListener("keydown", function(e){    &lt;br /&gt;kkeys.push( e.keyCode );    &lt;br /&gt;if ( kkeys.toString().indexOf( konami ) &amp;gt;= 0 )    &lt;br /&gt;window.location = "&lt;strong&gt;http://ejohn.org/apps/hero/&lt;/strong&gt;";    &lt;br /&gt;}, true);    &lt;br /&gt;} &lt;/code&gt;  &lt;p&gt;On voit donc que :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Le script enregistre toutes les touches pressées au clavier dans un tableau &lt;strong&gt;kkeys&lt;/strong&gt;  &lt;/li&gt;    &lt;li&gt;Il vérifie à chaque fois si la combinaison de touche contenu dans &lt;strong&gt;konami &lt;/strong&gt;à été saisie ou non, et si c'est le cas, la page est redirigée vers le jeu. &lt;/li&gt; &lt;/ol&gt;  &lt;p style="text-align: center"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="jquery-logo" src="http://geekfg.net/blog/UnjeucachsurlesitedeJquery_11BF8/jquerylogo.gif" width="256" height="78" /&gt;&lt;/p&gt;  &lt;p&gt;Si vous êtes de ceux qui préfère tester ce easter-egg plutôt que d'entrer directement l'adresse dans votre navigateur, il vous suffit d'appuyer sur les touches de votre clavier dans cet ordre depuis &lt;a href="http://jquery.com/" rel="nofollow" target="_blank"&gt;le site de JQuery&lt;/a&gt; :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;2x flèche haut &lt;/li&gt;    &lt;li&gt;2x flèche bas &lt;/li&gt;    &lt;li&gt;flèche gauche&lt;/li&gt;&lt;li&gt;flèche droite&lt;/li&gt;&lt;li&gt;flèche gauche&lt;/li&gt;&lt;li&gt;flèche droite&lt;/li&gt;    &lt;li&gt;b &lt;/li&gt;    &lt;li&gt;a &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Et voila !&lt;/p&gt;  &lt;p&gt;Pour ma part je connaissais déjà ce &lt;em&gt;&lt;a href="http://ejohn.org/apps/hero/" rel="nofollow" target="_blank"&gt;Guitar Hero Like&lt;/a&gt;&lt;/em&gt; de John Resig (qui est le fondateur de JQuery) mais je dois avouer que j'ai été surpris par ces quelques lignes de code.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-5982336795961529815?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=ofwpwyF5"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=XtNfiu4q"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=XtNfiu4q" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=B1lMxNDs"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=B1lMxNDs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/5982336795961529815/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=5982336795961529815&amp;isPopup=true" title="7 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/5982336795961529815?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/5982336795961529815?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/ObOxXhurRqo/un-jeu-cach-sur-le-site-de-jquery.html" title="Un jeu caché (easter-egg) sur le site de Jquery ?" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/12/un-jeu-cach-sur-le-site-de-jquery.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAGR3k4fip7ImA9WxRUFk4.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-8071730344940799032</id><published>2008-11-25T18:57:00.001+01:00</published><updated>2008-11-25T19:12:06.736+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-25T19:12:06.736+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="astuce" /><category scheme="http://www.blogger.com/atom/ns#" term="reverse-engineering" /><category scheme="http://www.blogger.com/atom/ns#" term="orange" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><title>Amusons-nous avec Sébastien Chabal (…ou comment “profiter” du buzz d’Orange)</title><content type="html">&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; display: inline; border-right-width: 0px" title="Logo Orange" border="0" alt="Logo Orange" align="right" src="http://geekfg.net/blog/AmusonsnousavecSbastienChabal_102C6/260x900_fitboxorange_logo.jpg" width="100" height="100" /&gt;Vous le savez peut-être, Orange vient de lancer une campagne marketing au doux nom de &lt;a href="http://www.chabal-le-duel.com/" rel="external" target="_blank"&gt;Chabal Le Duel&lt;/a&gt;. Visitez-donc le site si vous ne connaissez pas. L’idée est vraiment excellente : recevoir un appel personnalisé de Sébastien Chabal qui vous demande de l’aide pour marquer un but. En plus l’impression de réelle est augmentée par la synchronisation entre le mini-film que vous voyez à l’écran et ce qui se dit dans votre téléphone. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/u&gt;&lt;u&gt;&lt;strong&gt;vertissement :&lt;/strong&gt;&lt;/u&gt; Je vois fleurir ce type de site (appel téléphonique + vidéo) depuis un bon moment. Cet article n’est que le résultat d’une (petite) réflexion que je me suis permis de me poser il y à maintenant 30 minutes. Mon but est de montrer comment il est possible de “dévier” (légèrement) l’utilisation d’une telle plateforme et &lt;u&gt;en aucun cas de réaliser des actions malhonnêtes&lt;/u&gt;, je vous demanderai donc d’en faire autant.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Oui et alors ? &lt;/h3&gt;  &lt;p&gt;Alors je me suis intéressé un peu plus aux échanges client(flash)/serveur. Une fois le formulaire (où l’on doit remplir son nom, prénom, email et numéro de téléphone) envoyé ces échanges se forment et voici un résumé :&lt;/p&gt; &lt;code&gt;#request# GET http://as00.estara.com/OneCC/200106295512/checkPhone.php?phone1=&lt;strong&gt;336XXXXXXXX&lt;/strong&gt;&lt;/code&gt;   &lt;p&gt;(Hypothèse) : “vérification si le numéro de téléphone est correcte”, retourne le nombre d’appels envoyés vers ce téléphone par la plateforme.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;code&gt;#request# POST http://as00.estara.com/OneCC/200106295512/email.php (+ paramètres)&lt;/code&gt;   &lt;p&gt;(Hypothèse) : page pour l’enregistrement de l'email, nom, prénom, numéro de téléphone et options diverses.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;code&gt;#request# POST http://as00.estara.com/OneCC/200106295512/mpc2.php&lt;/code&gt;   &lt;p&gt;Paramètres : &lt;/p&gt; &lt;code&gt;&lt;strong&gt;phone1&lt;/strong&gt;=&lt;strong&gt;336XXXXXXXX&lt;/strong&gt; &lt;em&gt;Numéro de téléphone au format international&lt;/em&gt;     &lt;br /&gt;&amp;amp;ord=0%2F5684821980666167     &lt;br /&gt;&amp;amp;&lt;strong&gt;name&lt;/strong&gt;=FRANCOIS &lt;em&gt;Prénom à utiliser&lt;/em&gt;&lt;/code&gt;   &lt;p&gt;Ce script permet d'établir l'appel avec le numéro précisé et de spécifier le prénom que le Chabal virtuel devra employer.&lt;/p&gt;  &lt;p&gt;Retourne :&lt;/p&gt; &lt;code&gt;STATUS_URL=http://paetec-2901.estara.com/vxml/contact/status.php?&lt;strong&gt;confid&lt;/strong&gt;=e56978910e2936d11fae5ca9d5hh5bv6     &lt;br /&gt;DISCONNECT_URL=http://paetec-2901.estara.com/vxml/contact/disconnect.php?&lt;strong&gt;confid&lt;/strong&gt;=e56978910e2936d11fae5ca9d5hh5bv6&lt;/code&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Puis, pour garder la synchronisation entre le téléphone et la vidéo, il y a un appel récurrent de :&lt;/p&gt; &lt;code&gt;#request# POST http://paetec-2601.estara.com/vxml/contact/status.php&lt;/code&gt;   &lt;p&gt;Paramètres :&lt;/p&gt; &lt;code&gt;nbrequest=1    &lt;br /&gt;&amp;amp;&lt;strong&gt;confid&lt;/strong&gt;=e56978910e2936d11fae5ca9d5hh5bv6     &lt;br /&gt;&amp;amp;&lt;strong&gt;ord&lt;/strong&gt;=0%2F5684821980666167&lt;/code&gt;   &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Constat après quelques tests&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;La variable &lt;strong&gt;ord&lt;/strong&gt; peut être vide lors de l’appel de &lt;strong&gt;mpc2.php&lt;/strong&gt; la communication avec le téléphone sera quand même effectuée &lt;/li&gt;    &lt;li&gt;Si &lt;strong&gt;name&lt;/strong&gt; n’est pas&amp;#160; dans la liste pré-enregistrée, ou s’il n’est pas défini, le Chabal virtuel dira “salut l’ami” &lt;/li&gt;    &lt;li&gt;Si &lt;strong&gt;ord&lt;/strong&gt; n’est pas défini, alors l’appel ne sera plus en mode inconnu mais par un numéro en 01… &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; Il est donc tout à fait possible d’effectuer directement une requête POST sur &lt;strong&gt;mpc2.php&lt;/strong&gt; afin de lancer un appel vers un numéro de téléphone prédéfini.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Quels déviances sont possibles ?&lt;/h3&gt;  &lt;p&gt;Sachant ce que l’on sait maintenant il nous est possible de détourner ce système de son utilisation principale, on &lt;u&gt;&lt;strong&gt;pourrait&lt;/strong&gt;&lt;/u&gt; donc :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Flooder un ami…ou enemi &lt;/li&gt;    &lt;li&gt;Créer un bash ou un programme qui appelle, via Curl ou autre, à intervalle régulier, via un cron par exemple, le script &lt;strong&gt;mpc2.php.&lt;/strong&gt; Ce qui pourrait permettre en pratique de faire téléphoner Chabal à minuit tout les soirs à un “amis”.&lt;/li&gt;    &lt;li&gt;…et sans doute d’autres détournements dont je n’ai pas l’idée à l’heure où j’écris ces lignes. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Beaucoup trop de site “full flash”, en plus du fait qu’ils ne sont vraiment pas agréable et lent (point de vue personnel) oublient l’aspect de sécurisation des données qui transitent, un simple chiffrage des valeurs serait déjà mieux. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-8071730344940799032?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=GzXkC3Gx"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=cQU030Ce"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=cQU030Ce" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=hulJM2Oo"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=hulJM2Oo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/8071730344940799032/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=8071730344940799032&amp;isPopup=true" title="5 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8071730344940799032?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8071730344940799032?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/JHD55dxjW_I/amusons-nous-avec-sbastien-chabal-ou.html" title="Amusons-nous avec Sébastien Chabal (…ou comment “profiter” du buzz d’Orange)" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/11/amusons-nous-avec-sbastien-chabal-ou.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMEQXw7fyp7ImA9WxRUE00.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-28442207764950052</id><published>2008-11-22T00:00:00.002+01:00</published><updated>2008-11-22T00:00:00.207+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-22T00:00:00.207+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vb6" /><category scheme="http://www.blogger.com/atom/ns#" term="epsi" /><category scheme="http://www.blogger.com/atom/ns#" term="projet" /><category scheme="http://www.blogger.com/atom/ns#" term="dropbox" /><title>[Mini-Projet VB6] Machine à sous - Jackpot</title><content type="html">&lt;p&gt;Dans le cadre d’un cours de VB6 à l’EPSI Nantes, il nous a été demandé de créer une machine à sous en VB6.&lt;/p&gt;  &lt;p&gt;Le cahier des charges était le suivant :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Au démarrage l’utilisateur entre la somme à versée en banque&lt;/li&gt;    &lt;li&gt;3 libellées qui feront défiler des chiffres de 1 à 9 &lt;/li&gt;    &lt;li&gt;L’utilisateur choisit sa mise&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;7x1 : on gagne 5 fois la mise&lt;/li&gt;      &lt;li&gt;7x2 : on gagne 10 fois la mise&lt;/li&gt;      &lt;li&gt;7x3 : on gagne 100 fois la mise&lt;/li&gt;      &lt;li&gt;Aucun 7 : on perds la mise&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Afficher le taux de réussite&lt;/li&gt;    &lt;li&gt;Lorsque l’utilisateur perds, si son taux de réussite est supérieur à 25% on lui propose d’enregistrer son score&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="Mini-projet VB6 JackPot - Machine à sous de geekfg, sur Flickr" href="http://www.flickr.com/photos/geekfg/3033872021/"&gt;&lt;img alt="Mini-projet VB6 JackPot - Machine à sous" src="http://farm4.static.flickr.com/3045/3033872021_ebbfe59d70.jpg" width="500" height="280" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;Interface du jeu une fois lancé&lt;/p&gt;  &lt;p align="center"&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="Mini-projet VB6 JackPot - Machine à sous de geekfg, sur Flickr" href="http://www.flickr.com/photos/geekfg/3033872195/"&gt;&lt;img alt="Mini-projet VB6 JackPot - Machine à sous" src="http://farm4.static.flickr.com/3239/3033872195_5b150864d4.jpg" width="500" height="280" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Ici aucun 7, on perds donc la mise.&lt;/p&gt;  &lt;p align="center"&gt; &lt;/p&gt;  &lt;p align="left"&gt;En réalité, j’ai d’abord réalisé une version répondant exactement au cahier des charges lors du cours. La version que je vous propose ici est un peu plus “fantaisiste” et comme vous pouvez le voir j’en ai profiter pour me remettre à Photoshop. L’installeur du mini-projet peut être &lt;a href="http://dl.getdropbox.com/u/3892/Machine-a-Sous-JackPot.exe" rel="nofollow"&gt;téléchargé ici&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/geekfg/sets/72157609173346112/" rel="nofollow"&gt;d’autres captures sont disponibles sur mon flickr&lt;/a&gt;. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-28442207764950052?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=Ld9F8GTC"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=3f2atDX0"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=3f2atDX0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=uywm4v2J"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=uywm4v2J" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/28442207764950052/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=28442207764950052&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/28442207764950052?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/28442207764950052?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/CPbwVKNr49s/mini-projet-vb6-machine-sous-jackpot.html" title="[Mini-Projet VB6] Machine à sous - Jackpot" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/11/mini-projet-vb6-machine-sous-jackpot.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YNRn0-fyp7ImA9WxRUEks.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-8088554060734356116</id><published>2008-11-21T13:05:00.001+01:00</published><updated>2008-11-21T13:06:37.357+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-21T13:06:37.357+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="astuce" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="windows seven" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><title>Activer les fonctionnalités cachées de Windows Seven build 6801</title><content type="html">&lt;p&gt;Continuons sur notre lancée à la découverte de &lt;a title="Windows Seven" href="http://blog.geekfg.net/search/label/windows%20seven" rel="dofollow"&gt;Windows Seven&lt;/a&gt;. Aujourd’hui voyons comment débloquez en un clic les fonctions de &lt;a href="http://www.microsoft.com/whdc/device/input/Touch_tab_enhance.mspx" rel="nofollow"&gt;multitouch&lt;/a&gt;, &lt;a href="http://www.istartedsomething.com/20080806/windows-7-to-add-slideshow-wallpapers-theme-gallery-and-theme-packs/" rel="nofollow"&gt;diaporama d’arrière plan&lt;/a&gt; (slideshow wallpapers) et bien plus. Cependant avant d’appliquer ce patch sauvegardez les fichiers suivant :&lt;/p&gt; &lt;code&gt;\Windows\Explorer.exe  &lt;br /&gt;\Windows\System32\wisptis.exe   &lt;br /&gt;\Windows\System32\ieframe.dll   &lt;br /&gt;\Windows\System32\shell32.dll   &lt;br /&gt;\Windows\System32\stobject.dll   &lt;br /&gt;\Windows\System32\TabletPC.cpl   &lt;br /&gt;\Windows\System32\themecpl.dll   &lt;br /&gt;\Windows\System32\themeui.dll   &lt;br /&gt;\Windows\System32\powercfg.cpl&lt;/code&gt;   &lt;p&gt;Ensuite téléchargez le patch pour architecture &lt;a href="http://www.withinwindows.com/files/upf/BlueBadge_rev1_x86.zip" rel="nofollow"&gt;x86&lt;/a&gt;. La version pour x64 serait disponible demain.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="Patch blue badge de geekfg, sur Flickr" href="http://www.flickr.com/photos/geekfg/3018527449/"&gt;&lt;img alt="Patch blue badge" src="http://farm4.static.flickr.com/3184/3018527449_bf3c5e4078_m.jpg" height="180" width="240" /&gt;&lt;/a&gt; &lt;a title="Arrière plan aléatoire via flux rss (flickr ici) de geekfg, sur Flickr" href="http://www.flickr.com/photos/geekfg/3019360828/"&gt;&lt;img alt="Arrière plan aléatoire via flux rss (flickr ici)" src="http://farm4.static.flickr.com/3253/3019360828_a7939d42af_m.jpg" height="180" width="240" /&gt;&lt;/a&gt; &lt;a title="Option du multitouch de geekfg, sur Flickr" href="http://www.flickr.com/photos/geekfg/3018530487/"&gt;&lt;img alt="Option du multitouch" src="http://farm4.static.flickr.com/3073/3018530487_3bb304455d_m.jpg" height="180" width="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Pour plus de capture rendez-vous sur &lt;a href="http://www.flickr.com/photos/geekfg/sets/72157608668593068/" rel="dofollow"&gt;mon Flickr&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-8088554060734356116?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=cdcLJ2zy"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=gQoiBFyZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=gQoiBFyZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=NbdUZvx7"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=NbdUZvx7" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/8088554060734356116/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=8088554060734356116&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8088554060734356116?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8088554060734356116?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/7C_XdVj-6fc/activer-les-fonctionnalits-caches-de_21.html" title="Activer les fonctionnalités cachées de Windows Seven build 6801" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/11/activer-les-fonctionnalits-caches-de_21.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQHSX07cCp7ImA9WxRVE0w.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-4683631872264049053</id><published>2008-11-09T13:16:00.002+01:00</published><updated>2008-11-10T12:58:58.308+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-10T12:58:58.308+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="astuce" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="windows seven" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><title>Comment débloquer la nouvelle barre de tâche de Windows Seven</title><content type="html">&lt;p&gt;&lt;img style="margin: 0px 0px 0px 10px; display: inline" align="right" src="http://farm4.static.flickr.com/3067/3006922163_25f100de23_m.jpg" /&gt;Présentée lors de la dernière PDC, la nouvelle barre de tâche de Windows Seven a de quoi intriguer. Seulement, Microsoft a annoncer qu’elle ne serait pas présente dans les différentes versions données aux développeurs lors de la conférence du fait de son instabilité. &lt;/p&gt;  &lt;p&gt;Cependant &lt;strong&gt;Rafael de WithinWindows&lt;/strong&gt; déjà connu pour &lt;a href="http://www.withinwindows.com/uxtheme-patches" rel="nofollow"&gt;ses patchs Uxtheme&lt;/a&gt; nous propose une manipulation pour activer cette fonctionnalité.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Téléchargez d’abord le zip suivant votre plateforme &lt;a href="http://www.withinwindows.com/files/upf/upf_x86_rev0.zip" rel="nofollow"&gt;x86&lt;/a&gt; ou &lt;a href="http://www.withinwindows.com/files/upf/upf_x64_rev0.zip" rel="nofollow"&gt;x64&lt;/a&gt; que vous devrez extraire dans le dossier windows. &lt;/li&gt;    &lt;li&gt;Ouvrez ensuite une console en &lt;strong&gt;mode Administrateur&lt;/strong&gt; et exécutez les commandes suivante :       &lt;ul&gt;       &lt;li&gt;takeown /f %windir%\explorer.exe &lt;/li&gt;        &lt;li&gt;cacls %windir%\explorer.exe /E /G %username%:F &lt;em&gt;(remplacez “username” par votre nom d’utilisateur)&lt;/em&gt; &lt;/li&gt;        &lt;li&gt;taskkill /im explorer.exe /f &lt;/li&gt;        &lt;li&gt;cd %windir% &lt;/li&gt;        &lt;li&gt;start unlockProtectedFeatures.exe &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ayant moi même réalisé la manipulation, j’ai rencontré un problème au niveau des commandes &lt;strong&gt;takeown et cacls&lt;/strong&gt;, si vous rencontrez les mêmes difficultés :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Clic droit sur “explorer.exe” &lt;/li&gt;    &lt;li&gt;Onglet &lt;strong&gt;sécurité&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Ajoutez-vous dans la liste des utilisateurs et vérifiez bien que vous avez &lt;strong&gt;coché toutes les propriétés&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://www.withinwindows.com/2008/11/02/flashy-windows-7-bits-protected-by-elaborate-scheme-workaround/"&gt;Via&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-4683631872264049053?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=zGe8u4jo"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=ej9op8iA"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=ej9op8iA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=Vxf4zSQf"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=Vxf4zSQf" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/4683631872264049053/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=4683631872264049053&amp;isPopup=true" title="1 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/4683631872264049053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/4683631872264049053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/0GjakQmX1OM/comment-dbloquer-la-nouvelle-barre-de.html" title="Comment débloquer la nouvelle barre de tâche de Windows Seven" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/11/comment-dbloquer-la-nouvelle-barre-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8HSHs-cSp7ImA9WxRVE08.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-2417995991954937456</id><published>2008-11-07T22:20:00.001+01:00</published><updated>2008-11-10T14:30:39.559+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-10T14:30:39.559+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flickr" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="windows seven" /><title>Mon test de Windows Seven M3 Build 6801</title><content type="html">&lt;p&gt;Voici quelques captures d’écrans de &lt;a href="http://www.flickr.com/photos/geekfg/sets/72157608668593068/" rel="dofollow"&gt;Windows Seven Milestone 3 Build 6801 (flickr)&lt;/a&gt; réalisées lors de mon test. N’hésitez pas à afficher les informations complémentaires lors de la visualisation du diaporama.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="center"&gt;&lt;object width="700" height="525"&gt; &lt;param name="flashvars" value="&amp;amp;offsite=true&amp;amp;intl_lang=fr-fr&amp;amp;page_show_url=%2Fphotos%2Fgeekfg%2Fsets%2F72157608668593068%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2Fgeekfg%2Fsets%2F72157608668593068%2F&amp;amp;set_id=72157608668593068&amp;amp;jump_to="&gt;&lt;/param&gt; &lt;param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=61927"&gt;&lt;/param&gt; &lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=61927" allowFullScreen="true" flashvars="&amp;offsite=true&amp;intl_lang=fr-fr&amp;page_show_url=%2Fphotos%2Fgeekfg%2Fsets%2F72157608668593068%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fgeekfg%2Fsets%2F72157608668593068%2F&amp;set_id=72157608668593068&amp;jump_to=" width="700" height="525"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Il s’agit d’une Milestone donc il ne faut en tirer aucune conclusion, on se souviendra de Longhorn lors d’une précédente PDC et sa différence avec Vista. Mais pour le moment, j’en retiens une certaine stabilité, un réel progrès pour ce qui est de l’utilisation mémoire ainsi que du temps de démarrage (qui sont les principaux objectifs de Microsoft).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-2417995991954937456?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=ZLRQqSrF"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=btcj6bP6"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=btcj6bP6" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=njG78xgL"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=njG78xgL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/2417995991954937456/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=2417995991954937456&amp;isPopup=true" title="5 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/2417995991954937456?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/2417995991954937456?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/nI5w7a6hMzI/mon-test-de-windows-seven-m3-build-6801.html" title="Mon test de Windows Seven M3 Build 6801" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/11/mon-test-de-windows-seven-m3-build-6801.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIFQnY8fSp7ImA9WxRWEEQ.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-2965902975652604096</id><published>2008-10-24T18:59:00.003+02:00</published><updated>2008-10-27T08:28:33.875+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-27T08:28:33.875+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="domainfinder" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="feedback" /><category scheme="http://www.blogger.com/atom/ns#" term="domaine" /><category scheme="http://www.blogger.com/atom/ns#" term="comparatif" /><title>Comparaison entre DomainR et DomainFinder</title><content type="html">&lt;p&gt;Vous l’avez peut-être vu, un nouveau service vient de voir le jour sur internet : &lt;a href="http://domai.nr/" rel="nofollow"&gt;DomainR&lt;/a&gt;. Il fait exactement la même chose que DomainFinder et c’est d’ailleurs cela qui me chagrine un peu. Le minimum quand on reprends l’idée de quelqu’un d’autre c’est de l’améliorer, surtout quand cette idée est assez originale. C’est donc pour cela que j’ai décider de faire un petit comparatif entre ces deux services, ceci, bien entendu dans la plus grande objectivité possible (du moins je vais essayer).&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Le nom&lt;/h3&gt;  &lt;p&gt;En effet, Domainr est déjà un nom plus “tendance” pour un service de ce genre. Et c’est un fait, DomainFinder est un nom que j’ai du trouvé dans l’empressement, ce qui m’intéressai à la réalisation de ce projet était les fonctionnalités que j’allais y mettre et non ce qu’on en percevrait au premier regard c’est à dire le nom et le design.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Le design&lt;/h3&gt;  &lt;p&gt;Lorsque j’ai découvert DomainR, c’est la première chose qui m’à frapper, une simple textbox, aucun bouton, un texte descriptif et un logo. Simple et clair c’est l’essence même d’un service web 2.0. C’était bel et bien mon idée initiale à la création de &lt;a href="http://domainfinder.geekfg.net/" target="_blank"&gt;DomainFinder&lt;/a&gt; mais quand je le regarde maintenant je me dit qu’il y a beaucoup trop d’informations complémentaires. Le footer de &lt;a href="http://domainfinder.geekfg.net/"&gt;DomainFinder&lt;/a&gt; n’est pas assez clair, trop brouillon, contenant des éléments de tailles différentes. L’utilisation de cadres pour séparer les zones à l’écran et leurs dispersions (en haut à gauche, en haut à droite, au milieu, en bas à gauche et en bas à droite) empêche l’utilisateur d’avoir une vision globale de la page.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://geekfg.net/blog/ComparaisonentreDomainRetDomainFinder_761A/image.png"&gt;&lt;img style="display: inline;" title="DomainR" alt="DomainR" src="http://geekfg.net/blog/ComparaisonentreDomainRetDomainFinder_761A/image_thumb.png" width="240" height="94" /&gt;&lt;/a&gt; &lt;a href="http://geekfg.net/blog/ComparaisonentreDomainRetDomainFinder_761A/image_3.png"&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://geekfg.net/blog/ComparaisonentreDomainRetDomainFinder_761A/image_thumb_3.png" width="240" height="162" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;DomainR - DomainFinder&lt;/p&gt;  &lt;h3&gt;Le concept&lt;/h3&gt;  &lt;p&gt;Pour le moment DomainR est une simple copie du concept de &lt;a href="http://domainfinder.geekfg.net/"&gt;DomainFinder&lt;/a&gt;, l’utilisateur propose un mot, une expression, et le service cherche les domaines, sous domaine correspondant.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Les fonctionnalités&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;La vérification de disponibilité des domaines&lt;/u&gt; : sur une même expression, par exemple “francois guillaume”, DomainFinder indique la disponibilité de chaque domaine alors que DomainR n’informe que pour 2 domaines. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Le nombre de résultat&lt;/u&gt; : DomainFinder fourni l’intégralité des possibilités ce qui n’est pas le cas de DomainR (voir capture). Ainsi sur l’expression “let’s rock”, DomainR donne 4 résultats et DomainFinder 10. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Les extras&lt;/u&gt; : DomainFinder permet à l’utilisateur de recevoir par email les résultats de sa recherche, DomainR permet d’avoir des informations supplémentaires sur le TLD (Top Level Domain) via des sites extérieurs. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;En pratique&lt;/h3&gt;  &lt;p&gt;Après 6 requêtes sur les deux services, DomainFinder fourni deux fois plus de résultat et indique 33% de domaines valides (ou non) en plus.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://geekfg.net/blog/ComparaisonentreDomainRetDomainFinder_AF3A/comparaison_en_nombre_de_rsultat_par_requte.png"&gt;&lt;img style="margin-left: 0px; margin-right: 0px; display: inline;" title="comparaison_en_nombre_de_résultat_par_requête" alt="comparaison_en_nombre_de_résultat_par_requête" src="http://geekfg.net/blog/ComparaisonentreDomainRetDomainFinder_AF3A/comparaison_en_nombre_de_rsultat_par_requte_thumb.png" width="240" height="171" /&gt;&lt;/a&gt; &lt;a href="http://geekfg.net/blog/ComparaisonentreDomainRetDomainFinder_AF3A/comparaison_en_nombre_de_validation_de_domaine.png"&gt;&lt;img style="display: inline;" title="comparaison_en_nombre_de_validation_de_domaine" alt="comparaison_en_nombre_de_validation_de_domaine" src="http://geekfg.net/blog/ComparaisonentreDomainRetDomainFinder_AF3A/comparaison_en_nombre_de_validation_de_domaine_thumb.png" width="240" height="171" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Le document recueillant les différents tests est disponible sur &lt;a href="http://spreadsheets.google.com/ccc?key=pbrTjHmqtyB3VgntO-qcUbA"&gt;Google Document&lt;/a&gt; pour les intéressés. Certains diront que seulement 6 tests ne permettent pas d’avoir une bonne idée et c’est tout à fait vrai. Mais en vu des premiers résultats, je ne pense pas que DomainR puissent avoir une quelconque chance (en terme de résultat j’entends) contre &lt;a href="http://domainfinder.geekfg.net/"&gt;DomainFinder&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-2965902975652604096?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=vfAQnqla"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=voDTq8gA"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=voDTq8gA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=D72TDIRU"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=D72TDIRU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/2965902975652604096/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=2965902975652604096&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/2965902975652604096?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/2965902975652604096?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/HaNOcniiqpo/comparaison-entre-domainr-et.html" title="Comparaison entre DomainR et DomainFinder" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/10/comparaison-entre-domainr-et.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4AQ345fyp7ImA9WxRXEEU.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-77170369259232302</id><published>2008-10-15T17:19:00.001+02:00</published><updated>2008-10-15T17:19:02.027+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-15T17:19:02.027+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="flickr" /><category scheme="http://www.blogger.com/atom/ns#" term="firebug" /><title>Récupérer une photo Flickr protégée</title><content type="html">&lt;p&gt;&lt;em&gt;&lt;img title="Logo flickr" style="display: inline; margin-left: 0px; margin-right: 0px" height="26" alt="Logo flickr" src="http://l.yimg.com/g/images/flickr_logo_gamma.gif.v59899.14" width="98" align="right" /&gt;Avertissement : La méthode que je présente ici n’est à utiliser que si les photos vous appartiennent et que vous avez perdu vos identifiants Flickr.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.flickr.com/"&gt; &lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vous l’avez peut-être remarqué, il est “impossible” de récupérer certaines photos sous Flickr en effectuant un clic droit puis &lt;strong&gt;Enregistrer l’image sous…&lt;/strong&gt;. Vous obtiendrez alors une image transparente.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Pourquoi ? L’idée pour “protéger” une photo est de lui superposer une autre image de même taille et transparente (ou un filigrane). Ainsi la majorité des utilisateurs ne pourrons pas enregistrer l’image. Cette technique est aussi utilisée par les sites de vente de fonds d’écrans pour téléphone portable et bien d’autre à vous de voir lequel.&lt;/p&gt;  &lt;p&gt;Donc, il suffit simplement d’enlever l’image de “protection” pour pouvoir atteindre le saint graal. Pour cela, j’aurai pu créer un &lt;a title="Mais une Bookmarklet c&amp;#39;est quoi ?" href="http://fr.wikipedia.org/wiki/Bookmarklet" target="_blank"&gt;bookmarklet&lt;/a&gt; pour Flickr, mais quid des autres sites ? Donc je vais simplement donner une des manipulations possibles et qui me semble la plus rapide.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Allez par exemple sur &lt;a href="http://www.flickr.com/photos/bengrd/2852293155/" rel="nofollow"&gt;cette page Flickr&lt;/a&gt; qui contient une photo protégée, puis :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ouvrez Firebug&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Inspecter&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Clic sur la photo que vous souhaitez “déprotéger”&lt;/li&gt;    &lt;li&gt;Clic droit sur la partie de code html qui à été surlignée dans Firebug&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Supprimer l’élément&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Fermez firebug&lt;/li&gt;    &lt;li&gt;Maintenant vous pouvez enregistrer l’image, ou simplement l’afficher séparément.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-77170369259232302?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=FKhNFAs0"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=cb0z7dh7"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=cb0z7dh7" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=pWawPOQx"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=pWawPOQx" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/77170369259232302/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=77170369259232302&amp;isPopup=true" title="4 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/77170369259232302?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/77170369259232302?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/MqIpYzMjpY0/rcuprer-une-photo-flickr-protge.html" title="Récupérer une photo Flickr protégée" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/10/rcuprer-une-photo-flickr-protge.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQERn07eSp7ImA9WxRQE00.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-1203363671563626959</id><published>2008-10-01T10:42:00.003+02:00</published><updated>2008-10-06T15:38:27.301+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-06T15:38:27.301+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="epsi" /><category scheme="http://www.blogger.com/atom/ns#" term="algorithme" /><category scheme="http://www.blogger.com/atom/ns#" term="c/c++" /><title>Algorithme et code C d’une fonction de tri croissante</title><content type="html">&lt;p&gt;Dans le cadre d’un cours de C à l’EPSI Nantes, il nous a été demandé de créer une &lt;strong&gt;fonction qui permettra de trier de façon croissante&lt;/strong&gt; (ou décroissante, c’est simplement l’algorithme inverse) &lt;strong&gt;une série de 5 nombres&lt;/strong&gt; entrée par l’utilisateur. Il est à noter que la fonction ne pourra pas utiliser de tableau, ni de pointeur, ni les fonctions de tris disponibles en C.&lt;/p&gt;  &lt;p&gt;Je vais donc vous proposer dans cet article un des algorithmes possible pour répondre à cette problématique. &lt;/p&gt;  &lt;p&gt;&lt;code&gt;procedure tri  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;E: entier : x1,x2,x3,x4,x5;   &lt;br /&gt;debut&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Si x1 &amp;gt; x2 Alors   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tri(x2,x1,x3,x4,x5)   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SinonSi x2 &amp;gt; x3   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tri(x1,x3,x2,x4,x5)   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SinonSi (x3 &amp;gt; x4)   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tri(x1,x2,x4,x3,x5)   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SinonSi (x4 &amp;gt; x5)   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tri(x1,x2,x3,x5,x4)   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FinSinonSi&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Test si x1 &amp;gt; x2 et x2 &amp;gt; x3 ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Afficher les nombres dans le bon ordre&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Et le code C :&lt;/p&gt; &lt;code&gt;void tri(float x1, float x2, float x3, float x4, float x5){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(x1 &amp;gt; x2) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tri(x2,x1,x3,x4,x5); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(x2 &amp;gt; x3) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tri(x1,x3,x2,x4,x5); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(x3 &amp;gt; x4) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tri(x1,x2,x4,x3,x5); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(x4 &amp;gt; x5) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tri(x1,x2,x3,x5,x4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Test si x1 &amp;gt; x2 et x2 &amp;gt; x3 ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Afficher les nombres dans le bon ordre&lt;/code&gt;&lt;p&gt;Il est alors facilement imaginable d’améliorer l’algorithme : avec un nombre x d’entier ou de réel au lieu de 5, d’utiliser un tableau et des pointeurs.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-1203363671563626959?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=orFVTuT4"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=gugDDerE"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=gugDDerE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=GyPsinHK"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=GyPsinHK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/1203363671563626959/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=1203363671563626959&amp;isPopup=true" title="2 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/1203363671563626959?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/1203363671563626959?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/0O41rf_AiP4/algorithme-et-code-c-dune-fonction-de.html" title="Algorithme et code C d’une fonction de tri croissante" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/10/algorithme-et-code-c-dune-fonction-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMCQHkzeCp7ImA9WxdaEkk.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-8942093804476136583</id><published>2008-08-20T17:01:00.001+02:00</published><updated>2008-08-20T17:01:01.780+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-20T17:01:01.780+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="plurk" /><category scheme="http://www.blogger.com/atom/ns#" term="plurkcounter" /><title>Mise à jour de PlurkCounter et du Widget Karma Plurk</title><content type="html">&lt;p&gt;Petite note de service pour vous informer que &lt;a title="PlurkCounter : Suivre l&amp;#39;&amp;#233;volution de votre Karma Plurk" href="http://projets.geekfg.net/?/4-plurkcounter+afficher+le+nombre+de+vos+followers+plurk.htm" rel="me"&gt;PlurkCounter&lt;/a&gt; et le &lt;a title="Afficher son Karma Plurk sur son blog" href="http://projets.geekfg.net/?/3-afficher+son+karma+plurk+sur+son+blog.htm" rel="me"&gt;widget Karma&lt;/a&gt; n'&amp;#233;tait plus fonctionnel depuis un certain temps. D&amp;#232;s constatation du probl&amp;#232;me une mise &amp;#224; jour &amp;#224; &amp;#233;t&amp;#233; effectu&amp;#233;e afin de corriger l'erreur (qui &amp;#233;tait d&amp;#251; &amp;#224; une mise &amp;#224; jour de Plurk) les services sont donc &amp;#224; nouveaux op&amp;#233;rationnelles.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-8942093804476136583?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=iDbBHsDl"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=jxCq12G0"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=jxCq12G0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=OQrZOoTO"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=OQrZOoTO" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/8942093804476136583/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=8942093804476136583&amp;isPopup=true" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8942093804476136583?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/8942093804476136583?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/UMRzuVYmnRk/mise-jour-de-plurkcounter-et-du-widget.html" title="Mise à jour de PlurkCounter et du Widget Karma Plurk" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/08/mise-jour-de-plurkcounter-et-du-widget.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIFQ3Y_eCp7ImA9WxdbEUU.&quot;"><id>tag:blogger.com,1999:blog-8128983.post-5439179221887824143</id><published>2008-08-08T09:57:00.005+02:00</published><updated>2008-08-08T10:18:32.840+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-08T10:18:32.840+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tv" /><title>Regarder les Jeux Olympiques en live via internet</title><content type="html">Si comme moi vous souhaitez regarder les JO pendant vos vacances (ou plus précisément au travail) vous serez content d'apprendre que France Télévision à pensé à nous !&lt;br /&gt;&lt;br /&gt;La page du &lt;a href="http://sport.france2.fr/jeux-olympiques-2008/index-fr.php?page=direct&amp;amp;chaineJO="&gt;flux live du Direct des Jeux Olympique&lt;/a&gt; existe en deux versions, l'une en silverlight (vive les interfaces riches) et l'autre incorpore un simple lecteur.&lt;br /&gt;&lt;br /&gt;Sinon vous pouvez accéder directement au flux live &lt;a href="http://sport.france2.fr/appftv/akamai/token/gentoken1.php?flux=13"&gt;à cette adresse&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8128983-5439179221887824143?l=blog.geekfg.net'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/geekfg?a=yPB9UcDA"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=jykEw8Mq"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=jykEw8Mq" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/geekfg?a=fzwI0IRR"&gt;&lt;img src="http://feeds.feedburner.com/~f/geekfg?i=fzwI0IRR" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.geekfg.net/feeds/5439179221887824143/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8128983&amp;postID=5439179221887824143&amp;isPopup=true" title="2 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/5439179221887824143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8128983/posts/default/5439179221887824143?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekfg/~3/fvoxdBbf-Vg/regarder-les-jeux-olympiques-en-live.html" title="Regarder les Jeux Olympiques en live via internet" /><author><name>François-Guillaume Ribreau</name><uri>http://www.blogger.com/profile/09541846055227993599</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01541021242297486133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.geekfg.net/2008/08/regarder-les-jeux-olympiques-en-live.html</feedburner:origLink></entry></feed>
