<?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>LoïcG &#187; WebDev</title>
	<atom:link href="http://blog.loicg.net/category/webdev/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.loicg.net</link>
	<description>Carnet d&#039;un développeur web</description>
	<lastBuildDate>Sat, 04 Feb 2012 17:31:19 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Pagination personnalisée sur un custom post type</title>
		<link>http://blog.loicg.net/webdev/pagination-custom-post-type/</link>
		<comments>http://blog.loicg.net/webdev/pagination-custom-post-type/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 16:16:50 +0000</pubDate>
		<dc:creator>loicg</dc:creator>
				<category><![CDATA[WebDev]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1399</guid>
		<description><![CDATA[WordPress propose depuis un bon moment le système des &#171;&#160;custom post type&#160;&#187; (aka les posts personnalisés). Cette fonctionnalité permet principalement de créer des articles &#171;&#160;spéciaux&#160;&#187; (ex : film avec le casting complet, rendez-vous avec des dates et/ou lieux, etc &#8230;) J&#8217;ai récemment utilisé les custom post types sur un projet, et j&#8217;avais besoin de faire [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress propose depuis un bon moment le système des &laquo;&nbsp;custom post type&nbsp;&raquo; (aka les posts personnalisés).<br />
Cette fonctionnalité permet principalement de créer des articles &laquo;&nbsp;spéciaux&nbsp;&raquo; (ex : film avec le casting complet, rendez-vous avec des dates et/ou lieux, etc &#8230;)</p>
<p>J&#8217;ai récemment utilisé les custom post types sur un projet, et j&#8217;avais besoin de faire une page de type archive (archive-MON_CUSTOM.php, dans le thème WP) affichant 3 éléments par page. Les articles &laquo;&nbsp;normaux&nbsp;&raquo; devant s&#8217;afficher en liste de 9 éléments.<span id="more-1399"></span></p>
<h2>Le souci :</h2>
<p>WordPress m&#8217;affichait bien la première page (de mon archive de custom, soit archive-MON_CUSTOM.php) http://localhost/MON_CUSTOM/ , contenant bien 3 articles (max) et m&#8217;affichait une pagination correcte (nombre total de mes articles / nombre d&#8217;articles à afficher par page), mais la page 2 (et les suivantes) affichait une erreur 404&#8230;</p>
<p>Dans le détail de cette 404 (que j&#8217;obtiens grâce à l&#8217;extension debug-bar), je remarque que WP a trouvé la réécriture correcte, et tente d&#8217;afficher la page 2 de l&#8217;archive de mon custom post type, mais ne trouve aucun contenu.<br />
C&#8217;est en examinant les requêtes MySQL que je remarque que WP tente de charger mes custom avec un offset de 9 (au lieu de 3), et comme j&#8217;avais créé seulement 5 articles, il ne trouvait rien (CQFD&#8230;).</p>
<p>En fait WP, au moment de la requête principale utilisait le réglage par défaut du blog, à savoir 9 articles par page&#8230;</p>
<p>Du coup, il fallait lui faire comprendre qu&#8217;on souhaite afficher 3 articles par page, lorsqu&#8217;on est dans l&#8217;archive du custom post type.</p>
<p>Comme je sais à quel point ce problème peut être chronophage à diagnostiquer/corriger, je vous offre le bout de code que j&#8217;ai créé pour me débloquer.</p>
<p><a href="https://gist.github.com/1554288"> https://gist.github.com/1554288</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/pagination-custom-post-type/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 snippets PHP pour les dates</title>
		<link>http://blog.loicg.net/webdev/3-snippets-php-pour-les-dates/</link>
		<comments>http://blog.loicg.net/webdev/3-snippets-php-pour-les-dates/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 20:43:01 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[WebDev]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=845</guid>
		<description><![CDATA[Voici 3 snippets qui peuvent servir. Ils permettent d&#8217;obtenir ou de modifier des dates assez facilement. Premier jour de la semaine Explication : Ici, strtotime reçoit comme paramètre &#171;&#160;2010W031&#8243;, ce qui se traduit par &#171;&#160;En 2010, à la semaine 03, le jour 1&#8243;. Le jour &#171;&#160;1&#8243; étant lundi en PHP (cf. la doc de date). [...]]]></description>
			<content:encoded><![CDATA[<p>Voici 3 snippets qui peuvent servir.<br />
Ils permettent d&#8217;obtenir ou de modifier des dates assez facilement.<span id="more-845"></span></p>
<h2>Premier jour de la semaine</h2>
<pre class="brush: php; title: ; notranslate">$year = 2010;//L'année ...
$week = 3;//Le numéro de la semaine dont on souhaite connaitre le premier jour
date('Y-m-d',strtotime($year.'W'.sprintf('%02d',$week).'1'));</pre>
<h3>Explication :</h3>
<p>Ici, strtotime reçoit comme paramètre &laquo;&nbsp;2010W031&#8243;, ce qui se traduit par &laquo;&nbsp;En 2010, à la semaine 03, le jour 1&#8243;. Le jour &laquo;&nbsp;1&#8243; étant lundi en PHP (cf. la <a href="http://php.net/manual/fr/function.date.php">doc de date</a>).</p>
<h2>Dernière semaine de l&#8217;année</h2>
<pre class="brush: php; title: ; notranslate">date('W',strtotime($y.'-12-28'));</pre>
<h3>Explication :</h3>
<p>La dernière semaine de l&#8217;année comprend obligatoirement le 28 décembre. En effet, la dernière semaine de l&#8217;année comprend toujours le dernier jeudi de l&#8217;année.<br />
Le jeudi étant le 4ème jour de la semaine, soit le 3ème en partant du dimanche, elle se termine au plus tôt le 28 décembre (31-3 &#8230;) (cf. <a href="http://fr.wikipedia.org/wiki/ISO_8601#Syst.C3.A8me_de_num.C3.A9rotation">Wikipedia</a>).</p>
<h2>Convertir une date du format MySQL au format Français</h2>
<pre class="brush: php; title: ; notranslate">$date_fr = preg_replace('/([\d]{4}[^\d]{1}([\d]{2}[^\d]{1}([\d]{2})/','$3/$2/$1',$date_mysql);</pre>
<h3>Explication :</h3>
<p>Cette conversion de date se fait grâce à une expression régulière. Celle-ci va matcher :</p>
<ul style="font-weight: normal;">
<li>un bloc composé de 4 chiffres</li>
<li>un élément seul qui n&#8217;est pas un chiffre (/ ou &#8211; ou espace &#8230;)</li>
<li>un bloc  composé de 2 chiffres</li>
<li>un élément seul qui n&#8217;est pas un chiffre (/ ou &#8211; ou espace &#8230;)</li>
<li>un bloc  composé de 2 chiffres</li>
</ul>
<p>Puis, il va les mettre dans l&#8217;ordre inverse : jour/mois/année, soit la notation française.<br />
Grâce à cette ligne, il est facile de faire l&#8217;opération inverse (à savoir convertir une date au format français en date au format MySQL) en échangeant le 4 et le dernier 2, ce qui donne :</p>
<pre class="brush: php; title: ; notranslate">$date_mysql = preg_replace('/([\d]{2}[^\d]{1}([\d]{2}[^\d]{1}([\d]{4})/','$3-$2-$1',$date_fr);</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/3-snippets-php-pour-les-dates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un nouvel écrin pour ma page d&#8217;accueil</title>
		<link>http://blog.loicg.net/webdev/nouvelle-page-accueil/</link>
		<comments>http://blog.loicg.net/webdev/nouvelle-page-accueil/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 05:47:37 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[WebDev]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1151</guid>
		<description><![CDATA[Depuis que j&#8217;ai ce nom de domaine (un peu plus de 3 ans&#8230;), je n&#8217;avais jamais touché à mon &#171;&#160;site racine&#160;&#187;, à savoir loicg.net ou encore www.loicg.net. Pourtant, il est indexé et apparait lorsqu&#8217;on me cherche (Loïc Gerbaud). Du coup, ça la foutait mal pour les quelques personnes qui tombaient dessus (clients, employeurs, partenaires potentiels). [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1154" title="logo_loicg" src="http://blog.loicg.net/wp-content/uploads/2010/11/logo_loicg.png" alt="" width="100" height="100" />Depuis que j&#8217;ai ce nom de domaine (un peu plus de 3 ans&#8230;), je n&#8217;avais jamais touché à mon &laquo;&nbsp;site racine&nbsp;&raquo;, à savoir loicg.net ou encore <a href="http://www.loicg.net">www.loicg.net</a>. Pourtant, il est indexé et apparait lorsqu&#8217;on me cherche (<a href="http://www.google.fr/search?q=Loic+Gerbaud">Loïc Gerbaud</a>).</p>
<p>Du coup, ça la foutait mal pour les quelques personnes qui tombaient dessus (clients, employeurs, partenaires potentiels).</p>
<div id="attachment_1156" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.loicg.net/wp-content/uploads/2010/11/ancienne_home.jpg"><img class="size-medium wp-image-1156" title="ancienne_home" src="http://blog.loicg.net/wp-content/uploads/2010/11/ancienne_home-300x134.jpg" alt="" width="300" height="134" /></a><p class="wp-caption-text">Admirez l&#39;ancienne version que Google a daigné capturer ^^</p></div>
<p style="text-align: left;">Ce week-end, je me suis donc lancé dans l&#8217;habillage de cette page (je n&#8217;oserai pas parler de refonte puisqu&#8217;il n&#8217;y avait quasi-rien à l&#8217;origine&#8230;).<br />
Il s&#8217;agit d&#8217;un &laquo;&nbsp;site&nbsp;&raquo; en one-page avec un scroll assez grand (un peu plus de 6 écrans), animé par jQuery.<br />
La page contient mon CV de développeur web (il manque mes études, mais il y a <a href="http://fr.linkedin.com/in/devseo">linkedin</a> pour ça).</p>
<p>Pour le code HTML, j&#8217;ai pris le parti de tenter le HTML5, que je n&#8217;avais jamais essayer. La sémantique est assez bien foutue puisque chaque balise décrit ce qu&#8217;elle est (header, footer, article &#8230;).</p>
<p>La feuille de style est actuellement en CSS2 et je tente actuellement de refaire le logo en CSS3 (en me prenant un peu la tête avec ces p##### de gradient sous Chrome et Safari &#8230;).</p>
<div id="attachment_1158" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.loicg.net/wp-content/uploads/2010/11/logo_css3.png"><img class="size-medium wp-image-1158" title="logo_css3" src="http://blog.loicg.net/wp-content/uploads/2010/11/logo_css3-300x186.png" alt="" width="300" height="186" /></a><p class="wp-caption-text">Le rendu actuel du logo (la police a changé pour s&#39;harmoniser avec celle du reste du site)</p></div>
<p>En bon professionnel, j&#8217;ai pris le temps de regarder la page sous IE (6,7,8) et de pleurer en pensant aux adaptations nécessaires pour que le rendu soit identique &#8230;</p>
<p>En dev qui vient de se faire une page pour le plaisir de SES yeux en tout premier lieu, j&#8217;ai pris le temps de regarder la page sous IE (6,7,8) et j&#8217;ai pensé &#8230; OSEF ! Je mettrai certainement un bout de javascript pour indiquer aux visiteurs sous IE qu&#8217;il est temps de passer à des navigateurs qui font l&#8217;internet plus beau.</p>
<p>Cher lecteur, que penses-tu de <a href="http://www.loicg.net/">ce design simple et épuré</a> ? Ainsi que de l&#8217;idée de coder le site en HTML5 ? As-tu des suggestions pour améliorer cette page ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/nouvelle-page-accueil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evolutions sur twitter_favs</title>
		<link>http://blog.loicg.net/webdev/evolutions-outil-veille-twitter_favs/</link>
		<comments>http://blog.loicg.net/webdev/evolutions-outil-veille-twitter_favs/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 22:05:22 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[twitter_favs]]></category>
		<category><![CDATA[WebDev]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1129</guid>
		<description><![CDATA[Depuis le 3 novembre, date du tout premier commit, twitter_favs a un peu évolué : J&#8217;ai notamment rajouté le tracking de l&#8217;utilisation et des visites avec Google Analytics, la récupération des urls d&#8217;origines pour les liens raccourcis ainsi que l&#8217;ajout de deux caches pour soulager twitter et ma bande passante ^^ Nouveautés : Le tracking [...]]]></description>
			<content:encoded><![CDATA[<p>Depuis le 3 novembre, date du tout premier commit, <a href="http://lab.loicg.net/twitter_favs/">twitter_favs</a> a un peu évolué :</p>
<p>J&#8217;ai notamment rajouté le tracking de l&#8217;utilisation et des visites avec Google Analytics, la récupération des urls d&#8217;origines pour les liens raccourcis ainsi que l&#8217;ajout de deux caches pour soulager twitter et ma bande passante ^^<span id="more-1129"></span></p>
<h2>Nouveautés :</h2>
<p>Le tracking avec Google Analytics est simplement paramétrable en inscrivant son &laquo;&nbsp;code&nbsp;&raquo; Analytics dans le fichier config.php</p>
<p>La récupération des urls d&#8217;origines pour les liens courts se fait d&#8217;une manière simple (et un peu cradoc &#8230;) :</p>
<ul>
<li>J&#8217;ouvre le lien, avec curl, et je regarde si celui-ci est redirigé (code HTTP:301), puis je suis le &laquo;&nbsp;Location&nbsp;&raquo; qui est retourné par le serveur distant.</li>
<li>Je répète l&#8217;opération jusqu&#8217;à ce que je n&#8217;ai plus de code 301&#8230;</li>
</ul>
<p>Pour économiser de la bande passante, le résultat de la &laquo;&nbsp;décompression d&#8217;URL&nbsp;&raquo; est stocké dans une table MySQL (dont je fourni la structure avec <a href="http://code.google.com/p/twitterfavs/">le code source</a>).<br />
Ainsi, chaque URL présente dans les Tweets est testée pour voir si elle est en cache.<br />
Si ce n&#8217;est pas le cas, on tente la &laquo;&nbsp;décompression&nbsp;&raquo;.</p>
<p>Ensuite, j&#8217;ai également ajouté un cache sur les liste que Twitter me retourne. Ce cache se compose de simples fichiers texte contenant le json tel qu&#8217;il est renvoyé par l&#8217;API de Twitter.<br />
Ce cache a une durée de vie (en secondes) configurable dans le fichier config.php.</p>
<h2>Restes de la todolist de départ :</h2>
<ul>
<li><del>suivre les url réduites, pour donner de beaux BL aux auteurs des articles</del></li>
<li>donner une petite interface à l&#8217;ensemble, histoire qu&#8217;il paraisse moins austère brut &#8212; ça c&#8217;est en cours&#8230;</li>
<li>proposer l&#8217;affichage des dates de publications des tweets et leur date d&#8217;ajout aux favoris</li>
<li>regrouper les tweets par auteurs</li>
</ul>
<h2>Ce qui s&#8217;est rajouté :</h2>
<ul>
<li><del>ajouter un formulaire pour aider à la recherche de favoris</del></li>
<li><del>ajouter un cache pour la récupération des tweets</del></li>
<li><del>ajouter un cache pour la décompression des urls</del></li>
<li>permettre à l&#8217;utilisateur de choisir la disposition des tweets</li>
<li>navigation à travers les favoris des autres Twittos présents dans ses propres favoris</li>
<li>navigation à travers le temps (remonter ou descendre d&#8217;une duration)</li>
</ul>
<p>Et j&#8217;en appelle à toi, lecteur, pour me suggérer des idées et me faire également ton retour sur cet outil.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/evolutions-outil-veille-twitter_favs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lire Twitter Stream en PHP avec curl</title>
		<link>http://blog.loicg.net/webdev/lire-twitter-stream-php-curl/</link>
		<comments>http://blog.loicg.net/webdev/lire-twitter-stream-php-curl/#comments</comments>
		<pubDate>Sat, 06 Nov 2010 21:14:14 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[WebDev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1029</guid>
		<description><![CDATA[Twitter met à disposition un &#171;&#160;stream&#160;&#187; (ou flux en bon Français) qui permet de faire des recherches en temps réel sur un ou plusieurs mots clés. Récemment, j&#8217;ai eu besoin d&#8217;utiliser le stream pour obtenir les tweets et retweets sur un mot clé spécifique, grâce à l&#8217;option &#171;&#160;track&#160;&#187; de Twitter. Pour cela, j&#8217;ai codé un [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.loicg.net/wp-content/uploads/2010/11/twitter_logo_right.png"><img class="size-full wp-image-1116 alignleft" title="twitter_logo" src="http://blog.loicg.net/wp-content/uploads/2010/11/twitter_logo_right.png" alt="" width="108" height="20" /></a>Twitter met à disposition un &laquo;&nbsp;stream&nbsp;&raquo; (ou flux en bon Français) qui permet de faire des recherches en temps réel sur un ou plusieurs mots clés.</p>
<p>Récemment, j&#8217;ai eu besoin d&#8217;utiliser le stream pour obtenir les tweets et retweets sur un mot clé spécifique, grâce à l&#8217;<a href="http://dev.twitter.com/pages/streaming_api_methods#track">option &laquo;&nbsp;track&nbsp;&raquo; de Twitter</a>.<br />
Pour cela, j&#8217;ai codé un script PHP exploitant les fonctionnalités de curl.<span id="more-1029"></span></p>
<p>Le script que je propose aujourd&#8217;hui permet de suivre un (ou plusieurs) mots clés :</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
/**
 * Un bout de script rapide pour faire du tracking sur l'API Streaming de Twitter.
 *
 * @author  Loïc Gerbaud &lt;gerbaudloic@gmail.com&gt;
 * @version 0.1 &quot;itjustworks&quot;
 */

define('TWITTER_LOGIN','mon_login_twitter'); //login twitter
define('TWITTER_PASSWORD','mon_mot_de_passe_twitter');    //mot de passe twitter
$sTrackingList = 'bonjour,hello world';//Le ou les mots clés à suivre (séparés par des virgules)

//En cas de perte de la connexion, on la relance automatiquement (grâce à cette belle boucle while)
//Si on tente une lecture de l'API Stream 2x sur une même IP, on se fait déconnecter...
while(1){
 echo 'Connexion : '.date('Y-m-d @ h:i:s');
 read_the_stream($sTrackingList);
 echo 'Deconnexion : '.date('Y-m-d @ h:i:s').&quot;\n&quot;;
}

/**La fonction de suivi du stream
 *
 */
function read_the_stream($sTrackingList){
 $ch = curl_init();
 curl_setopt($ch,CURLOPT_URL,'https://stream.twitter.com/1/statuses/filter.json');
 curl_setopt($ch,CURLOPT_USERPWD,TWITTER_LOGIN.':'.TWITTER_PASSWORD);//Le couple login:password
 curl_setopt($ch, CURLOPT_NOBODY, 0);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_USERAGENT, '');
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Twitter-Client: ItsMe','X-Twitter-Client-Version: 0.1','X-Twitter-Client-URL: http://blog.loicg.net/'));
 curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS,&quot;track=&quot;.$sTrackingList);//Les mots clés à suivre (séparés par des virgules)
 curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'write_callback');//La fonction de callback

 curl_exec($ch);
 curl_close($ch);
}

/** Fonction de callback. Elle reçoit les données envoyées par twitter. Elle est appelée à chaque tweet reçu
 *  Pour la démo, le text des tweet est enregistré dans un fichier nommé &quot;log&quot;
 *
 * @param $ch le handle curl
 * @param $data les données envoyées par curl
 */
function write_callback($ch, $data) {
 if(strlen($data)&gt;2){
 $oData = json_decode($data);
 if(isset($oData-&gt;text)){
 file_put_contents('log',$oData-&gt;text.&quot;\n&quot;,FILE_APPEND);
 }
 }
 return strlen($data);
}</pre>
<p>Ce script est à lancer en passant par PHP en ligne de commande.<br />
Dans cet exemple, le script ne fait qu&#8217;enregistrer le texte des tweets trouvés dans un fichier nommé &laquo;&nbsp;log&nbsp;&raquo;.</p>
<p>Des suggestions, des questions ? Les commentaires sont ouverts <img src='http://blog.loicg.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Edit : suite à <a href="https://twitter.com/#!/CrowdCrisis/status/141451298666065920">un tweet</a>, j&#8217;ai modifié légèrement le script pour qu&#8217;il fasse appel à &laquo;&nbsp;https://stream.twitter.com/&#8230;&nbsp;&raquo; car la version http (sans &laquo;&nbsp;s&nbsp;&raquo;) ne répond plus.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/lire-twitter-stream-php-curl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Twitter Favs : mon petit outil de veille</title>
		<link>http://blog.loicg.net/webdev/twitter-favs-outil-de-veille/</link>
		<comments>http://blog.loicg.net/webdev/twitter-favs-outil-de-veille/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 14:16:55 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[twitter_favs]]></category>
		<category><![CDATA[WebDev]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1085</guid>
		<description><![CDATA[Depuis peu, je publie ma veille du week-end qui regroupe certains tweets que j&#8217;ai mis en favoris avec d&#8217;autres éléments récoltés ça et là au cours de la semaine. Pour me faciliter la vie (et parce que je suis fainéant), j&#8217;ai codé un petit outil en PHP qui va chercher mes favoris twitter et les [...]]]></description>
			<content:encoded><![CDATA[<p>Depuis peu, je publie ma veille du week-end qui regroupe certains tweets que j&#8217;ai mis en favoris avec d&#8217;autres éléments récoltés ça et là au cours de la semaine.<br />
Pour me faciliter la vie (et parce que je suis fainéant), j&#8217;ai codé un petit outil en PHP qui va chercher mes favoris twitter et les affiche dans une syntaxe &laquo;&nbsp;prête à coller&nbsp;&raquo; dans un article sur ce blog.<span id="more-1085"></span></p>
<p>Ainsi, il me suffit de copier-coller la liste qui sort et de supprimer et trier les éléments proposés ^^</p>
<p>Puisque je suis un prince (ahem &#8230;) au grand coeur, j&#8217;ai  choisi de proposer <a href="http://lab.loicg.net/twitter_favs/">cet outil</a> ainsi que son code source au plus grand nombre.<br />
La licence appliquée est la GNU-GPL v2 (je ne connais pas la v3, du coup, je suis resté à la v2&#8230;) .</p>
<p>Le code est tout jeune (quelques heures de développement) et est basé sur une méthode de travail nommée <a href="http://www.la-rache.com/">&laquo;&nbsp;La Rache&nbsp;&raquo;</a> (très réputée auprès des développeurs). Et en l&#8217;état actuel il permet de :</p>
<ul>
<li>lister les favoris de n&#8217;importe que compte public</li>
<li>choisir la période (et durée) d&#8217;observation</li>
<li>garder les résultats de requête en cache pendant 10 minutes</li>
<li>ou d&#8217;obtenir un contenu frais à chaque requête (ce qui est un peu plus long &#8230;)</li>
</ul>
<p>Dans les modifications à venir, je prévois de :</p>
<ul>
<li>donner une petite interface à l&#8217;ensemble, histoire qu&#8217;il paraisse moins austère brut</li>
<li>proposer l&#8217;affichage des dates de publications des tweets et leur date d&#8217;ajout aux favoris</li>
<li>regrouper les tweets par auteurs</li>
<li>suivre les url réduites, pour donner de beaux BL aux auteurs des articles</li>
</ul>
<p>Pour essayer l&#8217;outil, c&#8217;est par ici : <a href="http://lab.loicg.net/twitter_favs/">http://lab.loicg.net/twitter_favs/</a><br />
Pour les checkout, c&#8217;est par là : <a href="http://code.google.com/p/twitterfavs/">http://code.google.com/p/twitterfavs/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/twitter-favs-outil-de-veille/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Négocier avec une grosse jointure MySQL</title>
		<link>http://blog.loicg.net/webdev/optimisation-jointure-lef-mysql/</link>
		<comments>http://blog.loicg.net/webdev/optimisation-jointure-lef-mysql/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 14:05:20 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[murl]]></category>
		<category><![CDATA[WebDev]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1072</guid>
		<description><![CDATA[Récemment, j&#8217;ai ajouté un antispam sur murl.fr. Celui-ci est assez rudimentaire et se base sur un blacklistage de domaines (ou sous-domaines). Ainsi, je peux filtrer les urls à leur création, ainsi qu&#8217;à leur affichage. Sur murl, il existe une page qui liste les derniers liens créés et le &#171;&#160;top 10&#8243; (de clics) de la journée. [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment, j&#8217;ai ajouté un <a href="http://blog.loicg.net/murl/blacklist-mur/">antispam sur murl.fr</a>. Celui-ci est assez rudimentaire et se base sur un blacklistage de domaines (ou sous-domaines).<br />
Ainsi, je peux filtrer les urls à leur création, ainsi qu&#8217;à leur affichage.</p>
<p>Sur <a href="http://murl.fr/" target="_blank">murl</a>, il existe une page qui liste les derniers liens créés et le &laquo;&nbsp;top 10&#8243; (de clics) de la journée. Les requêtes qui chargent les liens sur cette pages ont donc été modifiées pour intégrer la blacklist.<span id="more-1072"></span></p>
<p>Voici une de ces requêtes :</p>
<pre class="brush: sql; title: ; notranslate">SELECT lu.id, SUM( ls.clics ) AS cliclic
    FROM lil_stats ls
    INNER JOIN lil_urls lu
        ON ls.id = lu.id
    LEFT JOIN lil_domain_blacklist ldb1
        ON (ldb1.domain = lu.domain OR ldb1.domain = lu.subdomain)
        AND ldb1.b_display =1
WHERE ls.date=&quot;2010-10-31&quot;
    AND ldb1.id IS NULL
GROUP BY lu.id
ORDER BY cliclic DESC
LIMIT 0 , 10</pre>
<p>Cette requête fonctionnait très bien quand la table lil_domain_blacklist était petite (au début, elle faisait moins de 100 lignes&#8230;)</p>
<p>Puis, j&#8217;ai importé un énorme fichier de domaines reconnus comme spammeurs. Ce fichier comportait environ 150000 entrées, et là, ma requête ne passait plus et finissait par bloquer le serveur.</p>
<p>En faisant un explain de cette requête, on remarque que la table lil_domain_blacklist est analysée en entier, et qu&#8217;elle ne fait appel à aucun index&#8230;</p>
<p><a href="http://blog.loicg.net/wp-content/uploads/2010/10/murl_1288531203376.png"><img class="aligncenter size-medium wp-image-1074" title="Ancienne requête MySQL" src="http://blog.loicg.net/wp-content/uploads/2010/10/murl_1288531203376-300x29.png" alt="" width="300" height="29" /></a></p>
<p>J&#8217;ai donc décidé de changer les choses (en même temps, je n&#8217;avais pas trop le choix&#8230;), en séparant la jointure sur la table incriminée en deux jointures.</p>
<p>Voici la nouvelle requête :</p>
<pre class="brush: sql; title: ; notranslate">SELECT lu.id, SUM( ls.clics ) AS cliclic
    FROM lil_stats ls
    INNER JOIN lil_urls lu
        ON ls.id = lu.id
    LEFT JOIN lil_domain_blacklist ldb1
        ON ldb1.domain = lu.domain
        AND ldb1.b_display =1
    LEFT JOIN lil_domain_blacklist ldb2
        ON ldb2.domain = lu.subdomain
        AND ldb2.b_display =1
WHERE ls.date=&quot;2010-10-31&quot;
    AND ldb1.id IS NULL
    AND ldb2.id IS NULL
GROUP BY lu.id
ORDER BY cliclic DESC
LIMIT 0 , 10
</pre>
<p>Cette nouvelle version de la requête s&#8217;exécute en environ 0.025 secondes, ce qui est tout à fait correct.</p>
<p>En observant un explain de celle-ci, on constate que les 2 jointures sur la table lil_domain_blacklist utilisent correctement les index et retournent un nombre limité de lignes.</p>
<p><a href="http://blog.loicg.net/wp-content/uploads/2010/10/murl_1288531203375.png"><img class="aligncenter size-medium wp-image-1073" title="Nouvelle requête MySQL" src="http://blog.loicg.net/wp-content/uploads/2010/10/murl_1288531203375-300x40.png" alt="" width="300" height="40" /></a></p>
<p>Ainsi, je sais désormais qu&#8217;il vaut mieux, parfois, faire 2 jointures sur une même table qu&#8217;une seule jointure sur cette même table.</p>
<p>Et toi, ami lecteur, as-tu déjà fait face à ce cas de figure ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/optimisation-jointure-lef-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passer le datepicker de jQuery UI en Français</title>
		<link>http://blog.loicg.net/webdev/jquery-datepicker-en-francais/</link>
		<comments>http://blog.loicg.net/webdev/jquery-datepicker-en-francais/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 02:19:01 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[WebDev]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=969</guid>
		<description><![CDATA[Je me sert assez fréquemment du datepicker fourni avec jQuery UI, mais, j&#8217;ai aussi très souvent besoin que les jours, les mois et le format de dates soient en Français. Pour passer le datepicker en Français, je m&#8217;étais fait un petit snippet dans lequel j&#8217;avais placé les paramètres à appliquer lorsque je déclare le plugin [...]]]></description>
			<content:encoded><![CDATA[<p>Je me sert assez fréquemment du datepicker fourni avec jQuery UI, mais, j&#8217;ai aussi très souvent besoin que les jours, les mois et le format de dates soient en Français.</p>
<p>Pour passer le datepicker en Français, je m&#8217;étais fait un petit snippet dans lequel j&#8217;avais placé les paramètres à appliquer lorsque je déclare le plugin jQuery pour lui fournir les informations nécessaires à la traduction&#8230;</p>
<p>Mais depuis peu, je me suis aperçu qu&#8217;il exite des fichiers tout prêts pour ça :</p>
<p><a href="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/">http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/</a></p>
<p>Il suffit de choisir la langue souhaitée, puis d&#8217;inclure (ou copier) le fichier correspondant juste après avoir inclus jQuery UI.<br />
Et voilà ^^</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/jquery-datepicker-en-francais/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Activer les short-tags (PHP) depuis un .htaccess</title>
		<link>http://blog.loicg.net/webdev/activation-short-tags-php-htaccess/</link>
		<comments>http://blog.loicg.net/webdev/activation-short-tags-php-htaccess/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 19:55:52 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[WebDev]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1001</guid>
		<description><![CDATA[De nombreux gestionnaires de vues, codés en PHP, nécessitent l&#8217;activation des short-tags. A lieu de les activer dans mon php.ini, je préfère les laisser désactivés par défaut, je les active au cas par cas (tous les projets n&#8217;en ont pas la nécessité). Voici donc la ligne que j&#8217;ajoute aux .htaccess concernés : php_flag short_open_tag on [...]]]></description>
			<content:encoded><![CDATA[<p>De nombreux gestionnaires de vues, codés en PHP, nécessitent l&#8217;activation des short-tags.</p>
<p>A lieu de les activer dans mon php.ini, je préfère les laisser désactivés par défaut, je les active au cas par cas (tous les projets n&#8217;en ont pas la nécessité).</p>
<p>Voici donc la ligne que j&#8217;ajoute aux .htaccess concernés :</p>
<pre><code>php_flag short_open_tag on</code><span style="font-family: verdana; color: #000000; font-size: x-small;"> </span></pre>
<p><span style="font-family: verdana; color: #000000; font-size: x-small;">Et les shorts tags sont ainsi disponibles (sans relancer mon serveur Apache ^^)<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/activation-short-tags-php-htaccess/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Découper une adresse physique grâce aux expressions régulières en PHP</title>
		<link>http://blog.loicg.net/webdev/decouper-adresse-expressions-regulieres/</link>
		<comments>http://blog.loicg.net/webdev/decouper-adresse-expressions-regulieres/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 10:00:57 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[WebDev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=992</guid>
		<description><![CDATA[Récemment, j&#8217;ai du découper une bonne liste d&#8217;adresses formatées ainsi : 12 bis rue du 18 Mai 1945, 78000 Versailles (je ne sais même pas si cette adresses existe, c&#8217;est un exemple..) Je souhaitais obtenir les informations suivantes : N° dans la voie + éventuellement la mention bis ou ter Nom de la voie Code [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment, j&#8217;ai du découper une bonne liste d&#8217;adresses formatées ainsi :<br />
12 bis rue du 18 Mai 1945, 78000 Versailles<br />
(je ne sais même pas si cette adresses existe, c&#8217;est un exemple..)</p>
<p>Je souhaitais obtenir les informations suivantes :</p>
<ul>
<li>N° dans la voie + éventuellement la mention bis ou ter</li>
<li>Nom de la voie</li>
<li>Code Postal</li>
<li>Ville</li>
</ul>
<p><span id="more-992"></span>Au lieu de passer à la main sur la liste, j&#8217;ai codé un petit bout de PHP pour le faire à ma place <img src='http://blog.loicg.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Pour cela, je me suis servi des expressions régulières grâce à la fonction <a title="Documentation de preg_match" href="http://www.php.net/manual/fr/function.preg-match.php">preg_match(); </a></p>
<h2>Le code PHP :</h2>
<pre>preg_match('/^([\d\/-]+?[\h]?(bis|ter)?)[\h]*([\D]{3}.*),[\h]*([\d]{5})[\h]*(.*)$/i', $adresse, $aMatch);
$numero = $aMatch[1];
$voie = $aMatch[3];
$code_postal = $aMatch[4];
$ville = $aMatch[5];</pre>
<h2>Analyse :</h2>
<p>Analysons cette (magnifique, avouons-le) expression régulière :</p>
<pre>^([\d\/-]*[\h]?(bis|ter)?)[\h]*([\D]{3}.*),[\h]*([\d]{5})[\h]*(.*)$</pre>
<p>Dans l&#8217;ordre :</p>
<ul>
<li><span style="color: #00ccff;">^</span> : début du texte à analyser</li>
<li><span style="color: #00ccff;">([\d\/-]*[\h]?(bis|ter)?) </span>: capture d&#8217;une série de chiffres (pouvant comprendre un -, genre 5-7 rue &#8230;.) suivi ou non d&#8217;un espace puis de la mention &laquo;&nbsp;bis&nbsp;&raquo; ou &laquo;&nbsp;ter&nbsp;&raquo; (ou pas)</li>
<li><span style="color: #00ccff;">[\h]*</span> : aucun, un ou plusieurs espaces</li>
<li><span style="color: #00ccff;">([\D]{3}.*)</span> : 3 caractères qui ne sont pas numériques, suivi (ou non) de divers caractères (le nom de la voie)</li>
<li><span style="color: #00ccff;">,</span> : la virgule qui sépare le nom de la voie du code postal</li>
<li><span style="color: #00ccff;">[\h]*</span> : encore aucun, un ou plusieurs espaces</li>
<li><span style="color: #00ccff;">([\d]{5}) </span>: 5 caractères numériques (le code postal)</li>
<li><span style="color: #00ccff;">[\h]*</span> : encore aucun, un ou plusieurs espaces</li>
<li><span style="color: #00ccff;">(.*)</span> : une série de n&#8217;importe quel caractère (le nom de la ville)</li>
<li><span style="color: #00ccff;">$</span> : fin du texte à analyser</li>
</ul>
<p>J&#8217;ai utilisé le modificateur &laquo;&nbsp;i&nbsp;&raquo; en fin d&#8217;expression régulière pour que le traitement soit insensible à la case uniquement pour &laquo;&nbsp;bis&nbsp;&raquo; et &laquo;&nbsp;ter&nbsp;&raquo;).</p>
<p>Cette expression fonctionne sur ces adresses :</p>
<ul>
<li>12 bis rue du 18 Mai 1945, 78000 Versailles</li>
<li>5-7 avenue de Paris, 84000 Avignon</li>
<li>Place d&#8217;Arme, 75001 Paris</li>
<li>Certainement d&#8217;autres&#8230;</li>
</ul>
<p>Si j&#8217;ai omis quoi que ce soit, ou que l&#8217;expression ne fonctionne pas sur certaines adresses, n&#8217;hésitez pas à me le signaler dans les commentaires, je ferai évoluer ce bout de code <img src='http://blog.loicg.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/decouper-adresse-expressions-regulieres/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached (Feed is rejected)
Page Caching using memcached (User agent is rejected)
Database Caching 24/58 queries in 0.042 seconds using memcached

Served from: blog.loicg.net @ 2012-02-07 13:45:33 -->
