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

<channel>
	<title>Blog perso de Paul Da Silva &#187; Programmation</title>
	<atom:link href="http://www.paulds.fr/category/programmation/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.paulds.fr</link>
	<description>Un blog utilisant WordPress</description>
	<lastBuildDate>Fri, 30 Jul 2010 15:23:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Echofon] Faire en sorte qu&#8217;echofon réduise toutes les URL</title>
		<link>http://www.paulds.fr/2010/06/echofon-faire-en-sorte-quechofon-reduise-toutes-les-url/</link>
		<comments>http://www.paulds.fr/2010/06/echofon-faire-en-sorte-quechofon-reduise-toutes-les-url/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 07:52:15 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tweak]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[echofon]]></category>
		<category><![CDATA[extension firefox]]></category>
		<category><![CDATA[twitterfox]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=967</guid>
		<description><![CDATA[
			
				
			
		
En tant que gros utilisateur de twitter (essentiellement consommateur, puis depuis peu gros posteur / floodeur) j&#8217;ai opté pour la superbe extension firefox Echofon, anciennement Twitterfox. Cette extension permet de twitter directement depuis son navigateur web (Firefox en l&#8217;occurrence).
Mais j&#8217;avais un léger soucis avec cette extension : elle ne réduit les URL contenues dans un [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F06%2Fechofon-faire-en-sorte-quechofon-reduise-toutes-les-url%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F06%2Fechofon-faire-en-sorte-quechofon-reduise-toutes-les-url%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>En tant que gros <a href="http://twitter.com/Paul_Da_Silva" target="_blank">utilisateur de twitter</a> (essentiellement consommateur, puis depuis peu gros posteur / floodeur) j&#8217;ai opté pour la superbe extension firefox Echofon, anciennement Twitterfox. Cette extension permet de twitter directement depuis son navigateur web (Firefox en l&#8217;occurrence).</p>
<p>Mais j&#8217;avais un léger soucis avec cette extension : elle ne réduit les URL contenues dans un tweet que si celui-ci fait plus de 140 caractères&#8230; Je ne sais pas trop pourquoi, mais ce comportement ne me plaisait pas. J&#8217;ai donc résolu le problème ^^</p>
<p>Pour ce faire il va vous falloir éditer l&#8217;un des fichiers de l&#8217;extension pour en modifier deux lignes. Le fichier se trouve dans votre profil Firefox, dans le dossier chrome de votre extension :</p>
<p>Sous Linux :</p>
<p><em>/home/[vous]/.Mozilla/firefox/[votre_profil]/extensions/twitternotifier@naan.net/chrome/</em></p>
<p>Sous Windows :</p>
<p><em>C:\Documents and Settings\[vous]\Application Data\Mozilla\Firefox\Profiles\[votre_profil]\extensions\twitternotifier@naan.net\chrome\</em></p>
<p>En remplaçant bien sûr [vous] et [votre_profil] par les valeurs correspondantes. Sous Windows le dossier &laquo;&nbsp;Application Data&nbsp;&raquo; est un dossier caché, il faut donc en activer l&#8217;affichage</p>
<p>Il va s&#8217;agir de modifier le fichier twitterfox.js contenu dans le dossier &laquo;&nbsp;content&nbsp;&raquo; de l&#8217;archive Echofon.jar (s&#8217;ouvre avec winrar par exemple) elle même contenue dans le dossier chrome de l&#8217;extension (donc le chemin précisé au dessus). Si vous avez réussi à trouver le fameux fichier, vous avez déjà fait le plus dur <img src='http://www.paulds.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> <span id="more-967"></span></p>
<p>Il suffit ensuite de modifier la ligne 702 :</p>
<blockquote class="js"><p>if (text.length &gt; 140) {</p></blockquote>
<p>devient :</p>
<blockquote class="js"><p>if(true){</p></blockquote>
<p>Et la ligne 715 :</p>
<blockquote class="js"><p>if (url.length &gt; 25 &amp;&amp; !url.match(/tinyurl\.com/i)) {</p></blockquote>
<p>devient :</p>
<blockquote class="js"><p>if (url.length &gt; 10 &amp;&amp; !url.match(/tinyurl\.com/i)) {</p></blockquote>
<p>Sauvez les modifications (en replaçant le fichier twitternotifier.js dans l&#8217;archive Echofon.jar si besoin&#8230; Normalement il n&#8217;y a pas besoin de redémarrer Firefox, mais si ça ne marche pas vous pouvez essayer&#8230;</p>
<p>Ainsi chaque fois que vous postez une URL de plus de 10 caractères (au lieu de 25), quelle que soit la taille du tweet en lui même, l&#8217;url est réduite via bit.ly <img src='http://www.paulds.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Et si vous voulez encore plus de fun avec Echofon le plus simple c&#8217;est encore de me suivre sur twitter : <a href="http://twitter.com/Paul_Da_Silva" target="_blank">@Paul_Da_Silva</a> (oh le vilain placement !)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2010/06/echofon-faire-en-sorte-quechofon-reduise-toutes-les-url/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[jQuery] Un plugin type date picker de mon cru : jdPicker</title>
		<link>http://www.paulds.fr/2010/05/jquery-un-plugin-type-date-picker-de-mon-cru/</link>
		<comments>http://www.paulds.fr/2010/05/jquery-un-plugin-type-date-picker-de-mon-cru/#comments</comments>
		<pubDate>Sun, 23 May 2010 14:24:20 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Mes sites]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[datepicker]]></category>
		<category><![CDATA[jdpicker]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=866</guid>
		<description><![CDATA[
			
				
			
		
C&#8217;est pas parce que je n&#8217;ai pas eu le temps d&#8217;écrire cette semaine que j&#8217;ai mis de côté mes projets divers et variés : je travaille sur un framework PHP, plusieurs sites et le bouquin BDG avance petit à petit&#8230;
Mais je m&#8217;arrête pas à si peu de projets, vous me connaissez !
Aussi je me suis [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F05%2Fjquery-un-plugin-type-date-picker-de-mon-cru%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F05%2Fjquery-un-plugin-type-date-picker-de-mon-cru%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>C&#8217;est pas parce que je n&#8217;ai pas eu le temps d&#8217;écrire cette semaine que j&#8217;ai mis de côté mes projets divers et variés : je travaille sur un framework PHP, plusieurs sites et le bouquin BDG avance petit à petit&#8230;</p>
<p>Mais je m&#8217;arrête pas à si peu de projets, vous me connaissez !</p>
<p>Aussi je me suis mis en tête de reprendre un plugin jQuery abandonné par son créateur pour l&#8217;adapter à mes besoins et, accessoirement, pour l&#8217;adapter aux besoins de la société pour laquelle je travaille puisqu&#8217;une partie du dev de ce nouveau jouet a été effectué sur mon temps de travail (la société en question, AMJ Groupe, a bien sûr donné son accord pour que je publie mon travail &#8211; et je l&#8217;en remercie).</p>
<p>Trêves de blabla je vais vous donner le lien directement et on va ensuite discuter des fonctionnalités que j&#8217;ai ajouté à la version originale : <a href="http://jdpicker.p4ul.info" target="_blank">jdPicker &#8211; The ultimate datepicker</a> (Ouais le SEO ça se travaille).</p>
<p>Comme il faut rendre à César ce qui est à Jonathan, je vous donne aussi le lien vers le plugin d&#8217;origine : <a href="http://http://jonathanleighton.com/projects/date-input" target="_blank">jQuery Date Input</a>. Il est par ailleurs crédité sur chacune des pages du site de présentation du plugin, dans les crédits et un peu partout sur le site : sans son travail je n&#8217;aurai probablement pas réussit à aller si loin dans les évolutions effectuées.</p>
<p><span id="more-866"></span>J&#8217;ai donc rajouté un certain nombre d&#8217;options de configuration dont j&#8217;avais besoin ainsi que plusieurs comportements que j&#8217;avais vu demandés sur la page du plugin du site jQuery (pas très claire cette phrase).</p>
<h3>Deux nouveaux comportements :</h3>
<p>Dans le cas d&#8217;un champ type &laquo;&nbsp;text&nbsp;&raquo;, la saisie est contrainte par le date input : au focus on rend le champ non éditable grâce à un attribut readonly que l&#8217;on dégage au blur. Cette méthode a été choisie pour que le champ ne soit pas bloqué si un visiteur a désactivé javascript.</p>
<p>Il a donc fallu rajouter un &laquo;&nbsp;bouton&nbsp;&raquo; (qui est en fait un &amp;times;) pour remettre à zéro le champ.</p>
<p>Dans le cas d&#8217;un champ de type &laquo;&nbsp;hidden&nbsp;&raquo;, le calendrier va se charger en mode inline : il sera intégré à la page comme un composant <em>&lt;div&gt;</em> classique.</p>
<p>Ces deux évolutions avaient été demandées par des membres de plugin.jquery.com&#8230;</p>
<h3>De nombreuses options pour s&#8217;adapter à tous les besoins</h3>
<p>Comme vous pouvez en avoir un aperçu sur <a href="http://jdpicker.p4ul.info/?p=doc" target="_blank">la page documentation du plugin</a>, j&#8217;ai rajouté toute une série d&#8217;options permettant la personnalisation du comportement du plugin : on peut choisir le format de la date utilisée, si l&#8217;on veut afficher les numéros de semaine, interdire la sélection de certains jours précis ou de dates tous les ans, et éventuellement choisir de sélectionner une semaine complète.</p>
<p>Pour cela il suffit de spécifier ces options à la création d&#8217;une nouvelle instance du date picker ou changer les options par défaut directement dans le fichier javascript&#8230;</p>
<h3>Le tout est gratuit&#8230; et libre of course !</h3>
<p>Pour respecter la license choisie originalement par Jonathan je diffuse le projet sous la license MIT qui est décrite sur <a href="http://jdpicker.p4ul.info/?p=about" target="_blank">la page à propos du plugin</a>. Vous êtes donc libre de l&#8217;utiliser pour en faire ce que bon vous semble à partir du moment où cette license reste en place&#8230;</p>
<p>Sur ce : enjoy <a href="http://jdpicker.p4ul.info" target="_blank">jQuery jdPicker, le date picker ultime</a>, mon premier plugin jQuery !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2010/05/jquery-un-plugin-type-date-picker-de-mon-cru/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Javascript] Connaitre le nombre de jours d&#8217;un mois</title>
		<link>http://www.paulds.fr/2010/05/javascript-connaitre-le-nombre-de-jours-dun-mois/</link>
		<comments>http://www.paulds.fr/2010/05/javascript-connaitre-le-nombre-de-jours-dun-mois/#comments</comments>
		<pubDate>Tue, 18 May 2010 20:57:13 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=859</guid>
		<description><![CDATA[
			
				
			
		
Quand on a l&#8217;habitude de coder en PHP et que l&#8217;on doit se mettre au javascript pour enrichir les interfaces on est vite limité par certaines fonctions pourtant si évidentes en PHP. Dernier exemple pour moi : récupérer le nombre de jours d&#8217;un mois donné de façon simple, sans calcul&#8230; En un mot un équivalent [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F05%2Fjavascript-connaitre-le-nombre-de-jours-dun-mois%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F05%2Fjavascript-connaitre-le-nombre-de-jours-dun-mois%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Quand on a l&#8217;habitude de coder en PHP et que l&#8217;on doit se mettre au javascript pour enrichir les interfaces on est vite limité par certaines fonctions pourtant si évidentes en PHP. Dernier exemple pour moi : récupérer le nombre de jours d&#8217;un mois donné de façon simple, sans calcul&#8230; En un mot un équivalent à la fonction suivante :</p>
<blockquote class="php"><p>date(&#8216;t&#8217;, $date);</p></blockquote>
<p>J&#8217;ai eu beau chercher sur le net je n&#8217;ai pas réussi à mettre la main sur une fonction équivalente &#8211; l&#8217;objet Date de javascript ne prenant pas en charge cette fonctionnalité pourtant très utile. Et comme souvent dans ce cas je me suis mis à bidouiller jusqu&#8217;à trouver la solution. Celle-ci est tellement simple et efficace que j&#8217;ai décidé de vous la faire partager :</p>
<blockquote class="js"><p>function getNbJours(date){<br />
return new Date(date.getFullYear(), date.getMonth()+1, -1).getDate()+1;<br />
}</p></blockquote>
<p>Il s&#8217;agit donc de créer une nouvelle date temporaire dont l&#8217;année soit la même, le mois m+1 (n&#8217;oubliez pas que les mois sont les mois ordonnés dans l&#8217;ordre de 0 à 11) et le jour à -1. On récupère ensuite le jour de cette date auquel on ajoute 1 (oui je ne sais pas pourquoi il faut ajouter 1, mais de tous mes essais ça fonctionne sans soucis).</p>
<p>Petite note de service : je suis sur une mission qui me prend un peu plus de temps que la normale et je ne pourrais donc pas mettre à jour mon blog aussi souvent que d&#8217;habitude. Par ailleurs je ne peux pas tweeter, mais je vous laisse le soin de me suivre quand même : <a href="http://www.twitter.com/Paul_Da_Silva" target="_blank">@Paul_Da_Silva</a> &#8211; retour à une activité normale programmé le 31 mai&#8230; D&#8217;ici là comptez sur moi pour faire de mon mieux pour continuer à vous fournir un maximum de contenu intéressant <img src='http://www.paulds.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2010/05/javascript-connaitre-le-nombre-de-jours-dun-mois/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Note de service : apparition du pagebreak sur le blog</title>
		<link>http://www.paulds.fr/2010/05/note-de-service-apparition-du-pagebreak-sur-le-blog/</link>
		<comments>http://www.paulds.fr/2010/05/note-de-service-apparition-du-pagebreak-sur-le-blog/#comments</comments>
		<pubDate>Thu, 13 May 2010 13:05:12 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Mes sites]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tweak]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[pagebreak]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=826</guid>
		<description><![CDATA[
			
				
			
		
Avec ma manie de toujours écrire des quantités astronomiques sans réussir à synthétiser le fond de ma pensée en quelques lignes (imaginez combien twitter me torture avec ses 140 caractères), ce blog s&#8217;est vite retrouvé à avoir des pages plus longues que mon bras (non sérieusement, je suis sûr qu&#8217;en en imprimant certaines, &#8230;).

De plus, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F05%2Fnote-de-service-apparition-du-pagebreak-sur-le-blog%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F05%2Fnote-de-service-apparition-du-pagebreak-sur-le-blog%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Avec ma manie de toujours écrire des quantités astronomiques sans réussir à synthétiser le fond de ma pensée en quelques lignes (imaginez combien twitter me torture avec ses 140 caractères), ce blog s&#8217;est vite retrouvé à avoir des pages plus longues que mon bras (non sérieusement, je suis sûr qu&#8217;en en imprimant certaines, &#8230;).</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-827" style="border: 3px solid #ccc;" title="pagebreak" src="http://blog.p4ul.info/wp-content/uploads/2010/05/pagebreak.png" alt="page break wordpress" width="600" height="125" /></p>
<p>De plus, j&#8217;ai découvert récemment, ne m&#8217;étant impliqué dans ce blog que depuis quelques semaines, combien le taux de rebond de mon blog n&#8217;avait aucun rapport avec celui de mes autres sites&#8230; Les visiteurs, avides de nouveautés, ne venant parfois que pour vérifier si un nouvel article est paru (héhé en voilà un pour vous d&#8217;ailleurs bande de petits rebondisseurs).</p>
<p>Bref, j&#8217;ai pris la décision de rajouter des pagebreak quand les articles sont trop longs pour remédier à ces deux problèmes : avoir une présentation globalement plus agréable et augmenter potentiellement le nombre de pages vues. Pour cette deuxième partie de solution je réfléchis à n&#8217;insérer le pagebreak qu&#8217;au bout de quelques jours de publication de l&#8217;article &#8211; histoire de ne pas contraindre les habitués à visualiser 12.000 pages et leur fournir directement ce qui les intéresse : le contenu.</p>
<p>Bon, bien sûr, je ne pouvais pas faire les choses comme tout le monde et j&#8217;ai un tout petit peu customisé mes pagebreak pour qu&#8217;ils soient esthétique (tous les gouts sont dans la nature, en termes de webdesign les miens sont très mauvais et j&#8217;assume !) et SEO friendly.</p>
<p>Pour cela 3 fichiers à modifier : deux dans le thème de votre Wordpress et un dans le dossier wp-includes (si si, celui qu&#8217;il faut pas modifier normalement&#8230;).</p>
<p><span id="more-826"></span></p>
<h3>Le fichier wp-content/themes/[votre_theme]/index.php</h3>
<p>Modification très simple ici : il s&#8217;agit de rajouter le titre de l&#8217;article dans le texte du pagebreak (et de le mettre à votre goût) : cherchez la ligne suivante (avec &laquo;&nbsp;Lire la suite&#8230;&nbsp;&raquo; qui corresponde au texte actuel de vos pagebreak) :</p>
<blockquote class="php"><p>&lt;?php the_content(&laquo;&nbsp;Lire la suite&#8230;&nbsp;&raquo;); ?&gt;</p></blockquote>
<p>Et remplacez simplement par ceci :</p>
<blockquote class="php"><p>&lt;?php the_content(the_title(&#8216;Lire la suite de : &#8216;,&nbsp;&raquo;, false)); ?&gt;</p></blockquote>
<p>En appelant la méthode the_title(); on va récupérer le titre de l&#8217;article courant. Les paramètres servent à préciser respectivement : le texte à inclure avant le titre, après le titre et si l&#8217;on doit l&#8217;afficher ou le retourner en PHP.</p>
<h3>Le fichier wp-content/themes/[votre_theme]/style.css</h3>
<p>Ok là je vous tiens pas la main, modifiez juste la class <em>.more-link</em> (appliquée directement sur le lien <em>a</em> et pas sur le paragraphe <em>p</em> qui le contient malheureusement) pour la mettre à votre goût.</p>
<h3>Le fichier wp-includes/post-template.php</h3>
<p>Cette modification, relativement mineure ne sert qu&#8217;à ajouter une balise title sur le lien du pagebreak &#8211; ce que je n&#8217;ai pas trouvé comment faire autrement, directement dans le thème. Les fichiers contenus dans le dossier <em>wp-includes</em> sont assez critiques alors ne les éditez que si vous savez ce que vous faites (ou que vous suivez à la lettre ce que je vais écrire ici).</p>
<p>A la ligne 226, dans la fonction <em>get_the_content();</em> Wordpress créé le fameux pagebreak. On aurait pu, si on était de gros grades, faire toutes les modifications uniquement à cette ligne&#8230; Mais là ce que je veux faire n&#8217;est pas, à ma connaissance, prévu par Wordpress : ajouter une balise <em>title</em> au pagebreak. Pour ce faire rien de plus simple : on va remplacer la ligne 226 de votre fichier par celle ci :</p>
<blockquote class="php"><p>$output .= apply_filters( &#8216;the_content_more_link&#8217;, &#8216; &lt;a href=&nbsp;&raquo;&#8216; . get_permalink() . &laquo;&nbsp;#more-$id\&nbsp;&raquo; class=\&nbsp;&raquo;more-link\&nbsp;&raquo; title=&#8217;&nbsp;&raquo;.get_the_title().&nbsp;&raquo;&#8216;&gt;$more_link_text&lt;/a&gt;&nbsp;&raquo;, $more_link_text );</p></blockquote>
<p>La méthode <em>get_the_title();</em> permet en effet de retourner le titre en PHP.</p>
<p>Et vous, vous en pensez quoi des pagebreaks ? (pas les miens hein, le principe en général !)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2010/05/note-de-service-apparition-du-pagebreak-sur-le-blog/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Facebook] Voir le contenu d&#8217;une fanpage sans avoir à devenir fan</title>
		<link>http://www.paulds.fr/2010/04/facebook-voir-le-contenu-dune-fanpage-sans-avoir-a-devenir-fan/</link>
		<comments>http://www.paulds.fr/2010/04/facebook-voir-le-contenu-dune-fanpage-sans-avoir-a-devenir-fan/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 14:01:26 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tweak]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=753</guid>
		<description><![CDATA[
			
				
			
		
Je sais pas vous (enfin si j&#8217;ai quand même une vague idée) mais moi je suis fatigué de voir ce type de pages pulluler sur le réseau social des jeunes. Je veux bien sûr parler des fanpage dont il faut devenir membre pour voir le contenu. Souvent le contenu en question n&#8217;est pas des plus [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F04%2Ffacebook-voir-le-contenu-dune-fanpage-sans-avoir-a-devenir-fan%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F04%2Ffacebook-voir-le-contenu-dune-fanpage-sans-avoir-a-devenir-fan%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Je sais pas vous (enfin si j&#8217;ai quand même une vague idée) mais moi je suis fatigué de voir ce type de pages pulluler sur le réseau social des jeunes. Je veux bien sûr parler des fanpage dont il faut devenir membre pour voir le contenu. Souvent le contenu en question n&#8217;est pas des plus intéressant mais le titre est suffisamment aguicheur pour qu&#8217;un nombre colossal de pigeons se laissent avoir et oublient de quitter les groupes une fois le &laquo;&nbsp;précieux&nbsp;&raquo; contenu découvert. Ces listes de pigeons servent ensuite à envoyer de la pub soit via le mur soit directement par messages.</p>
<p>Je me suis un peu penché sur le problème et y ai trouvé une solution très simple et diablement efficace : une seule ligne de javascript (pondue par mes soins un jour de repos !) qui permet d&#8217;afficher le contenu caché sans avoir à rejoindre quoi que ce soit.</p>
<p>La ligne en question la voici :</p>
<blockquote class="js"><pre style="overflow-x:scroll">javascript:spans=document.getElementById("tab_canvas").getElementsByTagName("span"); for(var sp in spans){spans[sp].style.visibility="visible"}</pre>
</blockquote>
<p>Pour que cela fonctionne il faut que vous soyez sur l&#8217;onglet de la page qui contient le contenu caché. Souvent il s&#8217;agit du premier onglet à être ouvert quand vous cliquez sur un lien. Ensuite vous avez deux solutions : la copier/coller dans la barre d&#8217;adresse à la place de l&#8217;url et valider avec la touche entrée comme si vous veniez d&#8217;entrer une réelle url. Ou, plus simple, ajouter un favoris dans votre navigateur dont l&#8217;adresse serait cette fameuse ligne. En plaçant le favoris dans la barre personnelle de Firefox par exemple vous n&#8217;aurez plus qu&#8217;à cliquer sur le bouton pour que le contenu de la page se mette à jour en direct.</p>
<h3>Comment et pourquoi cela fonctionne</h3>
<p>Le principe de ces pages est très simple : le créateur ajoute un onglet à sa page pour y faire figurer son contenu et décide de n&#8217;afficher le contenu qu&#8217;aux membres en le cachant aux autres dans un bête <em>&lt;span&gt;</em> caché par la propriété CSS <em>visibility:hidden</em>. Partant de là il suffit de parcourir tous les <em>spans</em> de la page affichée et de transformer la propriété <em>visibility:hidden</em> en <em>visibility:visible</em>.</p>
<p>Bien sûr cette méthode ne fonctionne que pour les balises <em>&lt;span&gt;</em> et uniquement si celles-ci ont été cachées en utilisant la propriété <em>visibility</em>. Mais jusqu&#8217;à présent je n&#8217;ai pas trouvé une seule page sur laquelle cela ne soit pas fait comme cela.</p>
<p>Petit conseil aux super développeurs qui ont pondu un concept du genre : utilisez des <em>&lt;div&gt;</em> ou d&#8217;autres balises et les propriétés <em>display</em> ou <em>opacity</em> pour continuer à ferrer du pigeon ! Et quand ça ne suffira plus il faudra songer à cacher le contenu côté serveur et à le faire apparaître en Ajax ^^</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2010/04/facebook-voir-le-contenu-dune-fanpage-sans-avoir-a-devenir-fan/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Retrouver le créateur d&#8217;une fanpage sur Facebook</title>
		<link>http://www.paulds.fr/2010/04/retrouver-le-createur-dune-fanpage-sur-facebook/</link>
		<comments>http://www.paulds.fr/2010/04/retrouver-le-createur-dune-fanpage-sur-facebook/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 09:57:17 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tweak]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[créateur]]></category>
		<category><![CDATA[fan]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=728</guid>
		<description><![CDATA[
			
				
			
		
Cet article fait référence à une version de Facebook qui n&#8217;est plus d&#8217;actualité.
Pour trouver la nouvelle méthode à utiliser pour identifier le créateur d&#8217;une fanpage, lisez l&#8217;article suivant :
[Facebook] Trouver le créateur d’une fanpage (bis).
Je sais j&#8217;écris beaucoup à propos de Facebook ces derniers temps. Mais là j&#8217;ai trouvé un truc assez intéressant pour retrouver [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F04%2Fretrouver-le-createur-dune-fanpage-sur-facebook%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F04%2Fretrouver-le-createur-dune-fanpage-sur-facebook%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p style="margin: 5px 20px; border: 1px solid #F00; background: #FEEEEE; padding: 5px 10px; text-align: center;">Cet article fait référence à une version de Facebook qui n&#8217;est plus d&#8217;actualité.<br />
Pour trouver la nouvelle méthode à utiliser pour identifier le créateur d&#8217;une fanpage, lisez l&#8217;article suivant :<br />
<a href="http://blog.p4ul.info/2010/05/facebook-trouver-le-createur-dune-fanpage-bis/">[Facebook] Trouver le créateur d’une fanpage (bis)</a>.</p>
<p>Je sais j&#8217;écris beaucoup à propos de Facebook ces derniers temps. Mais là j&#8217;ai trouvé un truc assez intéressant pour retrouver le créateur d&#8217;une page fan sur le réseau social le plus utilisé du moment.</p>
<p>Je vous préviens tout de suite, la technique est assez compliquée et implique de trifouiller un peu plus que d&#8217;habitude.</p>
<p>L&#8217;idée est assez simple à la base :  lorsque l&#8217;on affiche la liste des fans d&#8217;une page, ceux-ci sont affichés par ordre d&#8217;inscription &#8211; les derniers inscrits étant affichés en premier. Aussi, en toute logique, le créateur de la page doit-être le dernier de la liste aka le premier inscrit.</p>
<p>Lorsque la page n&#8217;a qu&#8217;un faible nombre de fans il est assez simple de tous les parcourir à la main &#8211; Mais si l&#8217;on s&#8217;attaque à un sujet hautement intellectuel tel que &laquo;&nbsp;Obliger un agent de la SNCF à travailler et le regarder pleurer&nbsp;&raquo; (exemple pris au hasard parmi les derniers statuts de mes amis facebook), on ne va pas s&#8217;amuser à parcourir xx pages à la main.</p>
<h3>De quoi a-t-on besoin ?</h3>
<p>Pour trouver cette astuce je me suis basé sur Firefox ainsi que deux de mes extensions préférées : Tamper Data et Firebug.</p>
<p>Avec Tamper Data on va modifier la requête envoyée par Facebook pour choisir d&#8217;afficher la dernière page &#8211; ceci va générer un bug et les données, bien que transmises, ne seront pas affichées &#8211; il faudra donc les lire à l&#8217;aide de Firebug.</p>
<h4>Tamper Data</h4>
<p>Tamper Data permet de modifier tous les paramètres d&#8217;une requête envoyée au serveur &#8211; qu&#8217;elle soit synchrone ou asynchrone. Cette extension est très pratique pour faire des essais en Ajax et avait déjà été utilisée dans un précédent hack qui permettait de visionner tous les profils Facebook, qu&#8217;ils soient publics ou non. <a href="https://addons.mozilla.org/fr/firefox/addon/966" target="_blank">Télécharger</a></p>
<h4>Firebug</h4>
<p>Je n&#8217;ai même pas envie de présenter cette extension tant vous auriez tort de ne pas déjà la connaître ! En l&#8217;occurrence elle va nous servir à analyser le retour d&#8217;une requête Ajax que le script côté client a du mal à rendre&#8230; C&#8217;est pas grave, on est plus fort que Chuck Norris, on lit directement le code source ! <a href="https://addons.mozilla.org/fr/firefox/addon/1843" target="_blank">Télécharger</a></p>
<p><span id="more-728"></span></p>
<h3>La méthode</h3>
<p>Avant toutes choses il faut afficher la popup listant les fans de la page. Pour ce faire, un simple clic sur le nombre de fans devrait suffire (si ça bloque là, le mieux c&#8217;est que vous arrêtiez tout de suite sinon on va pas s&#8217;en sortir hein !)</p>
<p>Une fois la popup chargée &#8211; et surtout pas avant &#8211; lancez les deux extensions nécessaires à savoir Tamper Data et Firebug.</p>
<p>Dans la fenêtre de Tamper Data cliquez sur &laquo;&nbsp;Démarrer altération&nbsp;&raquo; et laissez Firebug ouvert sur la console.</p>
<p>Il ne reste plus qu&#8217;à descendre tout en bas de la popup listant les fans pour cliquer sur &laquo;&nbsp;Suiv.&nbsp;&raquo; Ceci aura pour effet de déclencher Tamper Data qui vous proposera de modifier la requête. Acceptez et décochez la case &laquo;&nbsp;Continuer altération&nbsp;&raquo; : nous n&#8217;avons qu&#8217;une requête à forger.</p>
<p><a href="http://blog.p4ul.info/wp-content/uploads/2010/04/alteration.png" rel="lightbox[728]"><img class="aligncenter size-medium wp-image-739" title="alteration" src="http://blog.p4ul.info/wp-content/uploads/2010/04/alteration-300x245.png" alt="" width="300" height="245" /></a></p>
<p>Dans la fenêtre qui s&#8217;ouvre vous pouvez modifier tous les paramètres transmis en Ajax à Facebook. Le paramètre qui nous intéresse est le paramètre &laquo;&nbsp;Page&nbsp;&raquo; que vous devez passer à l&#8217;indice de la dernière page. Les pages contenant 100 personnes à chaque fois il suffit de diviser le nombre de fans par 100 pour trouver l&#8217;indice de la dernière page. Pour mon exemple : il y a 7944 fans donc il faut remplacer le paramètre &laquo;&nbsp;1&#8243; par &laquo;&nbsp;79&#8243;.</p>
<p>Une fois ce paramètre modifié, vous pouvez envoyer la requête en cliquant sur &laquo;&nbsp;Ok&nbsp;&raquo;. Veillez bien à ce que Firebug soit lancé avant de cliquer sur le bouton &laquo;&nbsp;Ok&nbsp;&raquo;, sinon ça ne sert à rien <img src='http://www.paulds.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  A la question &laquo;&nbsp;voulez vous modifier &#8230;&nbsp;&raquo; répondez &laquo;&nbsp;Oui&nbsp;&raquo;.</p>
<p>Enfin, il vous suffit d&#8217;analyser le retour Json de la dernière requête passée à Facebook &#8211; et plus précisément son dernier enregistrement &#8211; pour trouver le créateur de la page.</p>
<p>La requête à analyser est celle dont l&#8217;url est <em>http://www.facebook.com/ajax/social_graph/fetch.php?__a=1</em>. En cliquant sur le petit signe + à gauche de l&#8217;url vous pourrez visionner le retour Json de la requête. Celui-ci est un tableau associatif de la forme suivante :</p>
<blockquote><p>&laquo;&nbsp;id_profil&nbsp;&raquo;:{&laquo;&nbsp;id&nbsp;&raquo;:0000,&nbsp;&raquo;title&nbsp;&raquo;:&nbsp;&raquo;Prénom Nom&nbsp;&raquo;,&nbsp;&raquo;alternate_title&nbsp;&raquo;:&nbsp;&raquo;",&nbsp;&raquo;href&nbsp;&raquo;:&nbsp;&raquo;http:\/\/www.facebook.com\/url&nbsp;&raquo;,&nbsp;&raquo;subtitle&nbsp;&raquo;:&nbsp;&raquo;",&nbsp;&raquo;index&nbsp;&raquo;:89,&nbsp;&raquo;pic&nbsp;&raquo;:&nbsp;&raquo;http:\/\/profile.ak.fbcdn.net\/image.jpg&nbsp;&raquo;,&nbsp;&raquo;actionText&nbsp;&raquo;:&nbsp;&raquo;Ajouter comme ami(e)&nbsp;&raquo;,&nbsp;&raquo;action&nbsp;&raquo;:&nbsp;&raquo;add_friend&nbsp;&raquo;}</p></blockquote>
<p>L&#8217;enregistrement qui nous intéresse est donc le dernier du tableau, celui qui arrive juste avant les informations relatives au nombre de membres du groupe et de la page &#8211; celui qui précède : <em><code>,"count":7944,"page":79}</code></em></p>
<p>Et plus particulièrement, ce qui nous intéresse ici c&#8217;est le paramètre <em>title</em> qui contient le couple nom / prénom du créateur et éventuellement le <em>alternate_title</em> qui contient l&#8217;url encodée du profil du créateur.</p>
<p>Je songe à faire une extension Firefox qui automatise tout le process parce que là c&#8217;est peut-être un peu compliqué pour un novice&#8230; Ça vous brancherai ?</p>
<p>Accessoirement je me permet de rebondir sur un fait d&#8217;actualité : <a href="http://www.numerama.com/magazine/15508-un-eveque-fait-condamner-facebook-france-pour-une-page-insultante.html" target="_blank">Facebook a été condamné à donner le nom du créateur d&#8217;une page jugée insultante</a>&#8230; Si vous le voulez le nom, je l&#8217;ai <img src='http://www.paulds.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Mais elle ne risque pas grand chose : elle vit en Allemagne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2010/04/retrouver-le-createur-dune-fanpage-sur-facebook/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Redimensionner plusieurs éléments du DOM en jQuery</title>
		<link>http://www.paulds.fr/2010/04/design-colonnes-meme-longueur/</link>
		<comments>http://www.paulds.fr/2010/04/design-colonnes-meme-longueur/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 10:43:03 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tweak]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[float]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=704</guid>
		<description><![CDATA[
			
				
			
		
Je vois souvent la question se poser un peu partout sur le web : avec cette manie (bonne manie, mais manie tout de même)  de structurer les pages à grand renforts de &#60;div&#62; (en y ajoutant le plus souvent la propriété float) là où nos ancêtres (ou juste nous il y a quelques années) utilisaient [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F04%2Fdesign-colonnes-meme-longueur%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F04%2Fdesign-colonnes-meme-longueur%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Je vois souvent la question se poser un peu partout sur le web : avec cette manie (bonne manie, mais manie tout de même)  de structurer les pages à grand renforts de <em>&lt;div&gt;</em> (en y ajoutant le plus souvent la propriété <em>float</em>) là où nos ancêtres (ou juste nous il y a quelques années) utilisaient une grande quantité de <em>&lt;table&gt;</em>, les présentations en plusieurs colonnes souffrent d&#8217;un défaut majeur : elles n&#8217;ont plus nécessairement la même longueur.</p>
<p>Il existe un certain nombre de solutions pour remédier à cela. Celle que je vous propose aujourd&#8217;hui se base sur un bête code javascript (ignoré des Serps donc, mais peu importe vu qu&#8217;il s&#8217;agit de mise en page) et plus précisément sur du jQuery.</p>
<p>L&#8217;idée est d&#8217;attribuer le même nom de classe à tous les éléments du DOM que l&#8217;on veut voir de la même taille et ensuite d&#8217;appeler, à la fin du chargement de la page, une fonction javascript qui va redimensionner tous les éléments correspondants à un sélecteur jQuery que l&#8217;on basera sur la fameuse classe ajoutée à tous les éléments à redimensionner.</p>
<p>L&#8217;avantage, par rapport aux autres solutions, est qu&#8217;elle ne nécessite presque aucun code supplémentaire et par conséquent, que l&#8217;on garde la logique sémantique de la page. Et, après tout, c&#8217;est là tout le but de l&#8217;abandon des <em>&lt;table&gt;</em> au profit des <em>&lt;div&gt;</em>.</p>
<p>Trêves de blabla, voici le code javascript, à ajouter de préférence dans un fichier séparé :</p>
<blockquote class="js"><p>function redimensionner(selecteur){<br />
var hauteur=0;<br />
$(selecteur).each(function(){<br />
if($(this).height()&gt;hauteur) hauteur = $(this).height();<br />
});</p>
<p>$(selecteur).each(function(){ $(this).height(hauteur); });<br />
}</p></blockquote>
<p>Il suffira ensuite d&#8217;appeler, au chargement de la page, ladite fonction en lui passant en argument le sélecteur jQuery qui matche nos éléments à redimensionner. Le code se chargera de déterminer la taille du plus grand élément et de mettre les autres à l&#8217;échelle.</p>
<p>Concrètement, il vous faudra ajouter le morceau de code suivant :</p>
<blockquote class="js"><p>$(document).ready(function(){<br />
redimensionner(&#8216;div.toSize&#8217;);<br />
});</p></blockquote>
<p>Pour redimensionner tous les <em>&lt;div&gt;</em> ayant la classe <em>toSize</em> à la taille du plus grand de ces éléments. Pour plus de détails sur les sélecteurs jQuery, je vous renvoie à <a href="http://api.jquery.com/category/selectors/">l&#8217;excellente doc en ligne</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2010/04/design-colonnes-meme-longueur/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Créer et installer un outil pour surveiller le passage de Google sur son site</title>
		<link>http://www.paulds.fr/2010/03/creer-et-installer-un-outil-pour-surveiller-le-passage-de-google-sur-son-site/</link>
		<comments>http://www.paulds.fr/2010/03/creer-et-installer-un-outil-pour-surveiller-le-passage-de-google-sur-son-site/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 07:00:56 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tweak]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serp]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=664</guid>
		<description><![CDATA[
			
				
			
		
Il peut être utile, dans bien des cas, de surveiller l&#8217;activité de notre cher Google (ou de ses amis SERPs divers et variés) sur son(/ses) sites. Pour ce faire je n&#8217;ai pas trouvé mieux qu&#8217;un outil, fait maison et installé sur la quasi-totalité de mes sites.
Comme je ne suis pas avare de mes idées je [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F03%2Fcreer-et-installer-un-outil-pour-surveiller-le-passage-de-google-sur-son-site%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2010%2F03%2Fcreer-et-installer-un-outil-pour-surveiller-le-passage-de-google-sur-son-site%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Il peut être utile, dans bien des cas, de surveiller l&#8217;activité de notre cher Google (ou de ses amis SERPs divers et variés) sur son(/ses) sites. Pour ce faire je n&#8217;ai pas trouvé mieux qu&#8217;un outil, fait maison et installé sur la quasi-totalité de mes sites.</p>
<p>Comme je ne suis pas avare de mes idées je vais vous détailler un peu le fonctionnement dudit outil et vous en donner les sources afin que vous puissiez l&#8217;installer éventuellement sur votre site.</p>
<h3>Se baser sur l&#8217;user-agent</h3>
<p>Comme souvent quand on cherche à définir un comportement spécifique pour un type de visiteur particulier il suffit de se baser sur le user-agent de celui-ci. Pour rappel le user-agent d&#8217;un navigateur (ou d&#8217;un bot d&#8217;ailleurs) est une chaine de caractères qui identifie l&#8217;outil utilisé pour accéder à un site.</p>
<p>En PHP on peut le récupérer simplement avec la variable super globale $_SERVER et plus précisément avec $_SERVER['HTTP_USER_AGENT'].</p>
<p>Par exemple, si vous utilisez Firefox 3.6 sous Windows le user-agent envoyé à tous les sites que vous visitez sera : <em>Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2) Gecko/20100115  Firefox/3.6</em></p>
<p>A partir de là, et sachant que chaque Crawler (les bots qui visitent inlassablement le net pour indexer le contenu) utilisent des user-agent bien connus il est simple de les surveiller.</p>
<p><span id="more-664"></span></p>
<h3>Un script à inclure sur toutes les pages</h3>
<p>Pour que le script ait un quelconque intérêt il faut bien sûr que vous l&#8217;ajoutiez à toutes vos pages. La bonne nouvelle c&#8217;est que le script en question n&#8217;affiche rien à vos visiteurs et vous permet simplement de remplir un fichier html de votre choix dont vous seul connaitrez l&#8217;adresse &#8211; si vous êtes aussi parano que moi vous pouvez même le mettre dans un dossier protégé par .htaccess : les connexions de notre script à ce fichier se passant en local rien ne transitera par le protocole HTTP.</p>
<p>L&#8217;idéal pour que le script soit utilisé sur toutes vos pages est d&#8217;inclure celui-ci directement dans un fichier de config, déjà inclu sur la totalité de vos pages. Pour ma part j&#8217;ai choisi le fichier dans lequel je défini les paramètres de mon site et qui comporte entre autre les informations de connexion à la base de données.</p>
<p>Juste au cas où, je vous rappèle la syntaxe à utiliser pour inclure le script :</p>
<blockquote class="php"><p>&lt;?php include &laquo;&nbsp;chemin/script.php&nbsp;&raquo;; ?&gt;</p></blockquote>
<h3>Et dans le script on met quoi ?</h3>
<p>C&#8217;est vrai que là à part inclure un fichier vide sur toutes vos pages ça n&#8217;a pas grand intérêt comme article&#8230;</p>
<p>Le plus simple c&#8217;est de regarder l&#8217;algo de ce que l&#8217;on veut que le script fasse :</p>
<p>- Regarder si le user agent-appartient à une liste de bots &laquo;&nbsp;surveillés&nbsp;&raquo;<br />
- Si c&#8217;est le cas ajouter un marqueur de cette visite dans un fichier<br />
- Pour éviter les mauvaises surprises, limiter la taille de ce fichier à un certain nombre d&#8217;enregistrements</p>
<h3>Regarder si l&#8217;user-agent est intéressant</h3>
<blockquote class="php"><p>$bots = array(&laquo;&nbsp;crawler&nbsp;&raquo;,&nbsp;&raquo;Googlebot&nbsp;&raquo;,&nbsp;&raquo;Scooter&nbsp;&raquo;,&nbsp;&raquo;Slurp&nbsp;&raquo;);</p>
<p>for($i=0, $iMax=count($bots); $i&lt;$iMax; $i++)<br />
{<br />
if(strpos($_SERVER['HTTP_USER_AGENT'],$bots[$i]))<br />
{<br />
//le code ici<br />
}<br />
}</p></blockquote>
<p>Les bots à surveiller sont simplement dans un array ($bots) sur lequel on va boucler pour vérifier si le user-agent contient la chaine de caractères qui correspond. Si c&#8217;est le cas, on va rentrer dans le vif de notre script : l&#8217;ajout d&#8217;un marqueur de visite dans un fichier.</p>
<h3>Créer un marqueur de la visite</h3>
<p>Là encore rien de bien compliqué, à ceci près que l&#8217;on va en profiter pour vider systématiquement le fichier et en limiter la taille à un certain nombre d&#8217;enregistrements. Si vous ne faites pas cela et que le fichier devient trop conséquent il pourrait bloquer le chargement du reste des pages et empêcher aux bots de les visiter&#8230; Ce qui est à peu près le contraire de ce que l&#8217;on veut faire.</p>
<blockquote class="php"><p>if ($_SERVER['QUERY_STRING'] != &laquo;&nbsp;&nbsp;&raquo;)<br />
$url = &laquo;&nbsp;http://&nbsp;&raquo; . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'] . &laquo;&nbsp;?&nbsp;&raquo; . $_SERVER['QUERY_STRING']. &laquo;&nbsp;&nbsp;&raquo;;<br />
else<br />
$url = &laquo;&nbsp;http://&nbsp;&raquo; . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']. &laquo;&nbsp;&nbsp;&raquo;;</p>
<p>$f = fopen(&laquo;&nbsp;robots.html&nbsp;&raquo;,&nbsp;&raquo;r+&nbsp;&raquo;);<br />
$prev=file_get_contents(&#8217;save.html&#8217;);<br />
$prev = explode(&#8216;&lt;br /&gt;&#8217;, $prev);<br />
$prev = array_splice($prev,0, 15);<br />
$prev = implode(&#8216;&lt;br /&gt;&#8217;, $prev);</p>
<p>rewind($f);<br />
ftruncate($f, 0);<br />
fwrite($f, &#8216;[ '.date("d/m/Y H:i").' | '.$_SERVER['REMOTE_ADDR'].&#8217; | &#8216;.$bot.&#8217; ] : &lt;a href=&nbsp;&raquo;&#8216;.$url.&#8217;&nbsp;&raquo;&gt;&#8217;.$url.&#8217;&lt;/a&gt;&lt;br /&gt;&#8217;.&nbsp;&raquo;\r&nbsp;&raquo;.$prev);<br />
fclose($f);</p></blockquote>
<p>Petite explication rapide avant de vous donner un lien pour télécharger le script : on commence par récupérer l&#8217;url complète à laquelle le bot essaye d&#8217;accéder. Celle-ci est stockée dans la variable $url et sera réutilisée au moment d&#8217;insérer une nouvelle ligne dans le fichier.</p>
<p>On récupère ensuite le contenu du fichier déjà existant sous la forme d&#8217;une chaine (file_get_contents) que l&#8217;on transforme en tableau (explode). On réduit la taille de ce tableau à 15 enregistrements avec la fonction array_splice et on le retransforme en chaine de caractères avec implode.</p>
<p>Ensuite on vide le fichier en plaçant le pointeur de lecture en début de fichier (fseek) et en vidant tout ce qui suit (ftruncate). Il ne reste plus qu&#8217;à ajouter notre nouvelle ligne suivie des 15 anciennes que l&#8217;on souhaitait garder et à refermer le fichier (fclose).</p>
<p>N&#8217;oubliez pas de donner les droits en écriture à Apache sur le fichier html sous peine de voir le script ne pas fonctionner et une belle erreur s&#8217;afficher pour les bots.</p>
<p>Pour tester le script, il vous suffit de changer votre user-agent &#8211; soit en utilisant une extension firefox très sympathique : <a href="https://addons.mozilla.org/fr/firefox/addon/59">user-agent switcher</a> &#8211; soit en modifiant la chaine general.useragent.extra.firefox dans le about:config</p>
<p>Et pour les plus feignants d&#8217;entre vous : un petit fichier zip contenant les deux fichiers nécessaires à la mise en place de mouchard : [<a href="http://blog.p4ul.info/wp-content/uploads/2010/03/script.zip">script</a>].</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2010/03/creer-et-installer-un-outil-pour-surveiller-le-passage-de-google-sur-son-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Corriger le bug de l&#8217;extension firefox LongURL</title>
		<link>http://www.paulds.fr/2009/07/corriger-le-bug-de-lextension-firefox-longurl/</link>
		<comments>http://www.paulds.fr/2009/07/corriger-le-bug-de-lextension-firefox-longurl/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 10:15:19 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tweak]]></category>
		<category><![CDATA[extension firefox]]></category>
		<category><![CDATA[yoplink]]></category>

		<guid isPermaLink="false">http://blog.p4ul.info/?p=343</guid>
		<description><![CDATA[
			
				
			
		
Si vous utilisez twitter ou si vous surfez régulièrement sur des forums, vous êtes forcément tombé sur des liens «réduits». C&#8217;est d&#8217;ailleurs un service que je propose avec mon réducteur d&#8217;url : Yoplink.
Sauf que parfois on veut savoir sur quoi on clic, avant de cliquer. Ne serait-ce que pour éviter de se faire rick-rolled&#8230;
C&#8217;est là [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px; position:relative; bottom:20px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.paulds.fr%2F2009%2F07%2Fcorriger-le-bug-de-lextension-firefox-longurl%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.paulds.fr%2F2009%2F07%2Fcorriger-le-bug-de-lextension-firefox-longurl%2F&amp;source=Paul_Da_Silva&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-thumbnail wp-image-125" title="twitter-logo-small" src="http://blog.p4ul.info/wp-content/uploads/2009/05/twitter-logo-small.png" alt="twitter-logo-small" width="150" height="71" />Si vous utilisez twitter ou si vous surfez régulièrement sur des forums, vous êtes forcément tombé sur des liens «réduits». C&#8217;est d&#8217;ailleurs un service que je propose avec mon réducteur d&#8217;url : <a href="http://www.yoplink.com">Yoplink</a>.</p>
<p>Sauf que parfois on veut savoir sur quoi on clic, avant de cliquer. Ne serait-ce que pour éviter de se faire rick-rolled&#8230;</p>
<p>C&#8217;est là qu&#8217;intervient la superbe (oui je pèse mes mots) extension firefox <a href="https://addons.mozilla.org/fr/firefox/addon/8636">LongURL Mobile Expander</a>.</p>
<p>Sauf que depuis la dernière mise à jour, lorsque vous ouvrez un fichier local ou que vous allez sur un site local (http://localhost par exemple) vous avez le droit à une superbe erreur javascript à peine gênante :</p>
<blockquote class="js"><p>Error: current_domain is null</p></blockquote>
<p>La bonne nouvelle c&#8217;est que j&#8217;ai réussi à isoler la source du problème (la fameuse extension LongURL Mobile Expander) et que, du coup, j&#8217;ai corrigé quelque peu cette extension pour qu&#8217;elle continue à fonctionner sans pour autant m&#8217;empêcher de bosser en local&#8230;</p>
<p>Pour cela il suffit de chercher le dossier de l&#8217;extension dans votre profil firefox. Sous Linux par exemple :</p>
<blockquote class="bash"><p>cd<br />
cd .mozilla/firefox/s54sdf454.default/extensions<br />
rgrep -iFlr &laquo;&nbsp;longURL&nbsp;&raquo; .</p></blockquote>
<p>Où s54sdf545.default est votre dossier de profil. Si vous ne savez pas ce que c&#8217;est, j&#8217;ai une bonne nouvelle : vous ne devriez en avoir qu&#8217;un.</p>
<p>Grâce à ces commandes vous devriez avoir retrouvé le dossier d&#8217;installation de l&#8217;extension. Il vous suffit ensuite d&#8217;ouvrir le dossier et d&#8217;éditer le fichier content/script-compiler.js</p>
<p>Juste avant  la ligne 101 de ce fichier (<em>alert(e2);</em>)  vous allez rajouter la condition suivante :</p>
<blockquote class="js"><p>if(e2!=&nbsp;&raquo;Error: current_domain is null&nbsp;&raquo;)</p></blockquote>
<p>Ce qui donnera :</p>
<blockquote class="js"><p>if(e2!=&nbsp;&raquo;Error: current_domain is null&nbsp;&raquo;)<br />
alert(e2);</p></blockquote>
<p>En gros : si l&#8217;erreur est celle qui nous embête : on ne l&#8217;affiche pas !</p>
<p>Il suffit ensuite de redémarrer firefox, et d&#8217;apprécier la différence !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulds.fr/2009/07/corriger-le-bug-de-lextension-firefox-longurl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
