<?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>La Case de l&#039;Oncle Tom &#187; astuce</title>
	<atom:link href="http://case.oncle-tom.net/tag/astuce/feed/" rel="self" type="application/rss+xml" />
	<link>http://case.oncle-tom.net</link>
	<description>Développement Web, bonnes pratiques et performances</description>
	<lastBuildDate>Sun, 25 Dec 2011 19:33:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="search"
           href="http://case.oncle-tom.net/opensearch"
           type="application/opensearchdescription+xml"
           title="Content Search" />		<item>
		<title>WordPress, mises à jour automatiques et FTP : la solution</title>
		<link>http://case.oncle-tom.net/2010/wordpress-updates-automatiques/</link>
		<comments>http://case.oncle-tom.net/2010/wordpress-updates-automatiques/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 16:33:14 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[upgrade]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=17698</guid>
		<description><![CDATA[Marre de mettre à jour vos extensions WordPress à la main ? Vous ne comprenez pas quoi faire avec l'écran de mise à jour FTP de WordPress ? Cet article contient la solution pour rétablir les mises à jour automatiques sans toucher à votre configuration serveur.]]></description>
			<content:encoded><![CDATA[<p>Lorsque j&#8217;étais hébergé chez <a href="http://www.ovh.com/">OVH</a>, avant de basculer vers <a href="http://alwaysdata.com/">AlwaysData</a> pour gagner en vitesse d&#8217;affichage, la mise à jour de mes extensions se faisait le plus simplement du monde depuis l&#8217;interface d&#8217;administration.</p>
<p>Seulement voilà, lors de toute tentative de mise à jour, que ce soit du blog, d&#8217;une extension ou d&#8217;un thème, un écran de configuration de paramètres <acronym title="File Transfer Protocol">FTP</acronym> apparaît. Comme nous sommes des feignants, on ne voudra en aucun cas ouvrir un serveur <acronym title="File Transfer Protocol">FTP</acronym>, qui n&#8217;aurait d&#8217;ailleurs pour d&#8217;autre intérêt que de faciliter les intrusions dans votre système.</p>
<p><span id="more-17698"></span></p>
<h3>Où trouver l&#8217;information ?</h3>
<p>En cherchant un peu, je suis tombé sur l&#8217;ensemble des <a href="http://codex.wordpress.org/Editing_wp-config.php">directives de configuration de WordPress</a>, dont les <a href="http://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants">constantes liées au système de fichier</a>.<br />
Cette section précise ce qu&#8217;il faut savoir, même si c&#8217;est suffisamment technique pour perdre toute personne ne comprenant rien au code (et on ne leur en voudra pas).</p>
<p>Le problème vient du fait que si l&#8217;<strong>utilisateur propriétaire</strong> du système de fichier n&#8217;est pas le même utilisateur du serveur <acronym title="HyperText Transfer Protocol">HTTP</acronym>, WordPress bascule automatiquement en mise à jour via <acronym title="File Transfer Protocol">FTP</acronym>.</p>
<p>L&#8217;astuce consiste à forcer WordPress en mode <em>direct</em> (système de fichier) et à donner les droits d&#8217;écriture au <strong>groupe propriétaire</strong> correspondant à celui du serveur <acronym title="HyperText Transfer Protocol">HTTP</acronym> (<em>www-data</em> pour Apache et Nginx sous Debian et Ubuntu).</p>
<h3>Configuration de wp-config.php</h3>
<p>Forcer le mode direct est très simple. Il suffit d&#8217;éditer le fichier <em>wp-config.php</em>, celui-là même qui contient les identifiants de connexion à la base de données et autres joyeusetés. Et d&#8217;y rajouter cette ligne, avant la première directive par exemple :</p>
<pre><code class="php">define('FS_METHOD', 'direct');</code></pre>
<p>Enregistrez, et c&#8217;est plié.</p>
<h3>Réglage des permissions</h3>
<p>Côté permissions, ça peut également se régler en 2 coups de terminal. Partons du principe que le <strong>groupe propriétaire</strong> de votre serveur <acronym title="HyperText Transfer Protocol">HTTP</acronym> est <em>www-data</em>, à la base de votre installation WordPress, il suffit de faire ceci :</p>
<pre><code class="shell">chgrp -R www-data wp-content/upgrade wp-content/themes wp-content/plugins wp-content/uploads
chmod g+wx wp-content/upgrade wp-content/themes wp-content/plugins wp-content/uploads</code></pre>
<p>Cette manipulation attribue <em>www-data</em> comme propriétaire des répertoires que vous souhaitez rendre accessibles en écriture et ce, de manière récursive. Dans un second temps, elle attribute les droits d&#8217;écriture et d&#8217;exécution au groupe propriétaire (peu importe le nom du groupe).<br />
Si vous êtes perdu(e) avec la commande <a href="http://www.siteduzero.com/tutoriel-3-36115-les-chmod.html"><code>chmod</code>, un peu de lecture pour apprendre à le manipuler</a> (ça sauve la vie).</p>
<h3>Conclusion</h3>
<p>A ce stade des choses, tout est fonctionnel : tentez d&#8217;installer une nouvelle extension, ça passera comme une lettre à la poste.<br />
Si vous rencontrez des difficultés, c&#8217;est très certainement parce que les permissions des fichiers qui tentent d&#8217;être modifiées ne sont pas suffisantes pour le groupe propriétaire du serveur <acronym title="HyperText Transfer Protocol">HTTP</acronym>. Ajustez la procédure des permissions par rapport à votre besoin.</p>
<p>C&#8217;est pas sorcier, il suffisait de le savoir  :-)</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2010/wordpress-updates-automatiques/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Gérer sa blogroll sur une page à part avec WordPress et les modèles de page</title>
		<link>http://case.oncle-tom.net/2008/gerer-sa-blogroll-sur-une-page-a-part-avec-wordpress-et-les-modeles-de-page/</link>
		<comments>http://case.oncle-tom.net/2008/gerer-sa-blogroll-sur-une-page-a-part-avec-wordpress-et-les-modeles-de-page/#comments</comments>
		<pubDate>Tue, 13 May 2008 05:00:03 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[blogroll]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[template]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=909</guid>
		<description><![CDATA[J&#8217;ai récemment lu une astuce pour afficher sa blogroll sur une page à part et ça m&#8217;a donné envie de réagir à la solution proposée. Gérer sa blogroll sur une page dédiée est une bonne idée car ça évite de surcharger inutilement ses barres latérales de liens, surtout s&#8217;ils sont nombreux. Cette séparation permet également [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-912" title="Logo WordPress" src="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png" alt="Logo WordPress" width="273" height="66" /></p>
<p>J&#8217;ai récemment lu une astuce pour afficher sa blogroll sur une page à part et ça m&#8217;a donné envie de réagir à la solution proposée.</p>
<p><strong>Gérer sa blogroll sur une page dédiée est une bonne idée</strong> car ça évite de surcharger inutilement ses barres latérales de liens, surtout s&#8217;ils sont nombreux. Cette séparation permet également d&#8217;avoir davantage de liberté pour les présenter et les styler. Ce n&#8217;est pas un mal pour apporter un souffle d&#8217;originalité.</p>
<p><span id="more-909"></span></p>
<p>En revanche la solution du copié/collé n&#8217;est pas à mes yeux une <em>véritable solution</em> car :</p>
<ul>
<li>soit on gère sa blogroll dans le module de blogroll et on doit systématiquement copier/coller le résultat dans une page</li>
<li>soit on gère directement la blogroll dans la page dédiée ; le module de gestion perdant alors totalement son intérêt</li>
</ul>
<p>Je suis feignant donc je n&#8217;aime pas faire le travail 2 fois alors je propose une solution qui fonctionnera chez vous. C&#8217;est d&#8217;ailleurs celle que j&#8217;emploie depuis la refonte de ce blog &#8230; c&#8217;est à dire bientôt 1 an.</p>
<h3>Les modèles de page WordPress</h3>
<p>Il existe peu de différences entre une page et un article dans WordPress :</p>
<ul>
<li>les <strong>articles sont datés</strong>, n&#8217;ont pas de hiérarchie et peuvent être dans 1 ou plusieurs catégories</li>
<li>les p<strong>ages ne le sont pas datées</strong>, ont une hiérarchie et ne peuvent pas être dans une catégorie</li>
</ul>
<p>Les pages possèdent également un autre atout : <strong>on peut leur appliquer un modèle de présentation</strong>. Cette pratique est adaptée à toute présentation où vous souhaiteriez afficher davantage que le seul texte saisi depuis l&#8217;interface d&#8217;administration.</p>
<p>La notion des <a href="http://codex.wordpress.org/Pages#Page_Templates">templates de pages</a> est bien expliquée dans le <a href="http://codex.wordpress.org">Codex WordPress</a>. Petit rappel synthétique néanmoins.</p>
<p>Un template de page correspond à un fichier créé dans le répertoire du thème de votre choix (celui que vous utilisez de préférence). Autrement dit ça correspond à un fichier comme ceci : <code>wp-content/themes/&lt;votre thème&gt;/&lt;votre template&gt;.php</code>.</p>
<p>Ce fichier de template doit obligatoirement comporter une entête de description. Sans elle, pas de sélection possible depuis la page de rédaction. Cette entête doit correspondre à ceci :</p>
<pre><code class="php">&lt;?php
/*
Template Name: &lt;Nom du template&gt;
*/</code></pre>
<p>La dernière étape avant son utilisation consiste à tapoter un peu de code <acronym title="Pre-Hypertext Processing">PHP</acronym> pour aboutir à votre souhait. N&#8217;hésitez pas à parcourir la <a href="http://codex.wordpress.org">documentation de WordPress</a> pour produire un code pérenne et utiliser au maximum les <a href="http://codex.wordpress.org/Function_Reference">fonctionnalités proposées par WordPress</a>.</p>
<h3>Un modèle de page WordPress pour Blogroll</h3>
<p>Notre besoin initial tombe à point nommé puisque nous avons justement besoin d&#8217;un template de page pour gérer sa blogroll depuis son module d&#8217;administration sans avoir à mettre à jour manuellement quelconque autre page que ce soit <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>La première étape consiste à créer un nouveau template dans le thème employé par votre blog. Si vous utilisez le thème de base, le thème default, nous allons créer le fichier suivant :<br />
wp-content/themes/default/template-blogroll.php.</p>
<p>Pour remplir ce fichier, nous allons devoir accéder aux éléments contenus dans la blogroll. Ça tombe bien puisqu&#8217;il existe pour ça la fonction <a href="http://codex.wordpress.org/wp_list_bookmarks">wp_list_bookmarks()</a>.<br />
À ce stade, notre template devrait ressembler à ça :</p>
<pre><code class="php">&lt;?php
/*
Template Name: Liens
*/
get_header() ?&gt;
&lt;h2&gt;&lt;?php the_title() ?&gt;&lt;/h2&gt;
&lt;?php the_content() ?&gt;
&lt;ol id="page-blogroll"&gt;
  &lt;?php <strong>wp_list_bookmarks()</strong> ?&gt;
&lt;/ol&gt;
&lt;?php get_sidebar() ?&gt;
&lt;?php get_footer() ?&gt;</code></pre>
<p>Une fois enregistré, le modèle apparaît dans le sélecteur de modèle (uniquement sur les contenus de type <em>Page</em>) :</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-910" title="Wordpress Template Selector" src="http://case.oncle-tom.net/images/2008/05/wordpress-template-selector.png" alt="Wordpress Template Selector" width="500" height="90" /></p>
<p>Ça y&#8217;est, vous avez votre page dédiée aux liens sans travail de recopie supplémentaire.</p>
<h3>Un modèle imparfait</h3>
<p>Attention toutefois puisque créer un modèle signifie que <strong>WordPress ne va utiliser QUE ce modèle</strong> pour la présentation. Autrement dit il va falloir toute reproduire jusqu&#8217;au titre de la page si vous le désirez.</p>
<p>L&#8217;exemple ci-dessus est minimaliste à ce sujet pour la simple et bonne raison que <strong>le balisage dépendra uniquement du thème employé</strong>. Ça explique pourquoi les modèles sont à définir au cas par cas.</p>
<p>Pour bien reproduire le thème, plusieurs possibilités :</p>
<ul>
<li><em>vous vous débrouillez</em> vous-même pour comprendre comment est construit l&#8217;affichage du thème</li>
<li>vous <em>connaissez quelqu&#8217;un</em> qui se débrouille avec WordPress et vous lui demandez de le faire (pas la peine de me demander)</li>
</ul>
<h3>Conclusion</h3>
<p>Les modèles de page (ou templates) est une fonctionnalité assez méconnue mais pourtant ô combien utile pour les utilisations suivantes :</p>
<ul>
<li>utilisation tournée <acronym title="Content Management System">CMS</acronym></li>
<li>affichage différent pour certaines pages uniquement, sans vouloir créer un thème spécifique</li>
<li>création de pages plus riches allant au-delà de la simple présentation de contenu rédigé</li>
</ul>
<p>Si vous vous débrouillez bien, vous aurez un résultat comme sur ma page de liens, <a href="http://case.oncle-tom.net/liens/">les liens de l&#8217;Oncle Tom</a>.<br />
Et n&#8217;oubliez pas, dès que vous pensez &laquo;&nbsp;spécifique&nbsp;&raquo;, pensez <strong>modèle de page</strong> <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/gerer-sa-blogroll-sur-une-page-a-part-avec-wordpress-et-les-modeles-de-page/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Internet Explorer ne peut pas afficher cette page Web</title>
		<link>http://case.oncle-tom.net/2007/internet-explorer-ne-peut-pas-afficher-cette-page-web/</link>
		<comments>http://case.oncle-tom.net/2007/internet-explorer-ne-peut-pas-afficher-cette-page-web/#comments</comments>
		<pubDate>Fri, 20 Jul 2007 11:00:23 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[erreur]]></category>
		<category><![CDATA[internet explorer]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/07/20/internet-explorer-ne-peut-pas-afficher-cette-page-web/</guid>
		<description><![CDATA[Si l&#8217;on en croit la recherche Google Internet Explorer ne peut pas afficher cette page Web, il semblerait que pas mal de monde soit concerné par un facheux problème. Internet Explorer 7 affiche sur certains site cette page d&#8217;erreur sans raison évidente. Ca en a même causé sur les groupes de discussions Microsoft. Alerté par [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><img src='http://case.oncle-tom.net/images/2007/07/internet-explorer-ne-peut-pas-afficher-cette-page-web.png' alt='Internet Explorer ne peut pas afficher cette page Web' /></p>
<p>Si l&#8217;on en croit la recherche Google <a href="http://www.google.fr/search?q=probl%C3%A8me+%22Internet+Explorer+ne+peut+pas+afficher+cette+page+Web%22">Internet Explorer ne peut pas afficher cette page Web</a>, il semblerait que pas mal de monde soit concerné par un facheux problème. <strong>Internet Explorer 7 affiche sur certains site cette page d&#8217;erreur sans raison évidente</strong>. <a href="http://www.microsoft.com/communities/newsgroups/list/en-us/default.aspx?dg=microsoft.public.fr.ie7&#038;tid=57f02485-74c9-4ddb-ad28-5c4b7df4c922&#038;p=1">Ca en a même causé sur les groupes de discussions Microsoft</a>.</p>
<p>Alerté par un client par l&#8217;expression sibylline <cite>votre site a plein de bugs</cite> (c&#8217;était le seul), j&#8217;ai décidé de perdre une heure à trouver une solution au problème. Préparez vos favoris, j&#8217;ai trouvé la solution !<br />
<span id="more-718"></span><br />
Il existe en fait 3 solutions :</p>
<ol>
<li><strong>revenir à Internet Explorer 6</strong> (ceux qui ont Vista pourront se brosser, vous pouvez aussi revenir à Windows XP)</li>
<li><strong>utiliser un véritable navigateur Web</strong>, gratuit et plus sûr : <a href="http://www.mozilla-europe.org/fr/">Firefox</a> ou <a href="http://www.opera.com/">Opera</a> (je ne recommanderai pas <a href="http://www.apple.com/fr/safari/">Safari</a> pour l&#8217;instant, trop instable)</li>
<li><strong>changer un réglage d&#8217;Internet Explorer 7</strong> et attention, c&#8217;est du lourd !</li>
</ol>
<p>En cliquant sur <em>Outils > Options Internet > Avancés</em>, descendez au niveau de <strong>Paramètres <abbr title="Hypertext Transfer Protocol"><acronym title="HyperText Transfer Protocol">HTTP</acronym></abbr> 1.1</strong>. Décochez tout, validez et quittez le navigateur (même si rien ne vous indique de le faire). Relancez Internet Explorer 7 et comme par magie, toutes les pages inaccessibles ne le sont plus !</p>
<p style="text-align:center"><img src='http://case.oncle-tom.net/images/2007/07/internet-explorer-reglages-http.png' alt='Réglages HTTP 1.1 Internet Explorer 7' /></p>
<p>Reste maintenant à élucider pourquoi l&#8217;interprétation du <a href="http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_1.1">protocole <abbr title="Hypertext Transfer Protocol"><acronym title="HyperText Transfer Protocol">HTTP</acronym></abbr> 1.1</a> pose problème uniquement sur certaines pages.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/internet-explorer-ne-peut-pas-afficher-cette-page-web/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Utilisation de variables dans MySQL</title>
		<link>http://case.oncle-tom.net/2007/utilisation-variables-mysql/</link>
		<comments>http://case.oncle-tom.net/2007/utilisation-variables-mysql/#comments</comments>
		<pubDate>Fri, 13 Jul 2007 11:00:30 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimisation]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/07/13/utilisation-variables-mysql/</guid>
		<description><![CDATA[MySQL, depuis la version 3.23.6, permet de déclarer des variables dans ses requêtes. Il est d&#8217;ailleurs possible de scripter ses requêtes mais c&#8217;est une autre histoire. Ca peut sembler inutile à première vue lorsqu&#8217;on utilise MySQL au travers d&#8217;API d&#8217;autres langages (PHP, Perl, C# etc.). Et pourtant ça peut vous être très utile pour économiser [...]]]></description>
			<content:encoded><![CDATA[<p><strong>MySQL</strong>, depuis la version <em>3.23.6</em>, permet de déclarer des variables dans ses requêtes. Il est d&#8217;ailleurs possible de scripter ses requêtes mais c&#8217;est une autre histoire.</p>
<p>Ca peut sembler inutile à première vue lorsqu&#8217;on utilise MySQL au travers d&#8217;<acronym title="Application Programming Interface"><acronym title="Application Programming Interface">API</acronym></acronym> d&#8217;autres langages (<acronym title="PHP : Hypertext Processor"><acronym title="Pre-Hypertext Processing">PHP</acronym></acronym>, <acronym title="Practical Extraction and Report Language">Perl</acronym>, C# etc.). Et pourtant ça peut vous être très utile pour économiser des requêtes, du temps à programmer ces boucles et puis surtout, <strong>par flemme</strong>.</p>
<p>Oui, la flemme est pour moi la <strong>qualité numéro un</strong> du développeur car <em>le flemmard a pour but d&#8217;arriver à ses fins en un minimum d&#8217;efforts</em>.<br />
<span id="more-618"></span></p>
<h3>Déclaration de variables</h3>
<p>On peut déclarer une variable de deux façons dans MySQL.<br />
La première méthode consiste à utiliser l&#8217;opérateur <code>SET</code>.</p>
<pre><code class="sql">SET @pierre = 3, @feuille = 3 + 2, @ciseau = @pierre % @feuille ;</code></pre>
<p>On peut également consister une variable à partir d&#8217;une requête.</p>
<pre><code class="sql">SELECT @nb_total := COUNT(*) FROM `ma_table` ;</code></pre>
<p><strong>Note</strong> : dans ce cas là, on préfixe l&#8217;opérateur <code>=</code> de <code>:</code> (deux points).</p>
<h3>Utilisation simple des variables</h3>
<p>L&#8217;utilisation première qui peut en être faite c&#8217;est d&#8217;assainir vos requêtes <acronym title="Structured Query Language">SQL</acronym> en évitant au maximum l&#8217;apparition de variables issues d&#8217;autres langages.<br />
<strong>Avant</strong> :</p>
<pre><code class="sql">SELECT * FROM `ma_table` WHERE colonne1 = {$variable1}, colonne2 = '{$variable2}' LIMIT 1;</code></pre>
<p><strong>Après</strong> :</p>
<pre><code class="sql">SET @variable1 = {$variable1}, @variable2 = '{$variable2}';
SELECT * FROM `ma_table` WHERE colonne1 = @variable1, colonne2 = @variable2 LIMIT 1;</code></pre>
<p>Comme les variables sont effectives pour la connexion courante, une variable MySQL peut être réutilisée à tout moment. De quoi décomplexifier certains scripts pas forcément bien structurés.</p>
<h3>Utilisation complexe des variables</h3>
<p><strong>Les variables peuvent également être modifiées à même la requête</strong>. C&#8217;est à dire qu&#8217;à chaque itération effectuée par MySQL, le moteur va réévaluer le contenu de la variable. J&#8217;ai notamment eu besoin de ça pour ajouter de nouveaux éléments à la suite d&#8217;autres tout en renumérotant leur ordre. Je souhaitais <strong>éviter une boucle récursive en <acronym title="Pre-Hypertext Processing">PHP</acronym></strong> qui aurait occasionné de multiples requêtes.</p>
<p>Je dispose d&#8217;une table (<code>item_liste</code>) avec plusieurs éléments, une clé primaire sur deux champs (<code>item_id</code> et <code>item_cat</code>) ainsi qu&#8217;un autre champ indexé permettant de les trier dans un ordre donné (<code>item_ordre</code>). Le but : prendre des éléments de la catégorie 1 pour les mettre à la suite de la catégorie 2.</p>
<p>Voici en gros ce que ça donne au final :</p>
<pre><code class="sql">SELECT @ordre := IFNULL(MAX(item_ordre), 0) FROM `item_liste` WHERE item_cat = 2 ;
UPDATE `item_liste` SET item_ordre = @ordre := @ordre+1, item_cat = 2 WHERE item_cat = 1 ;</code></pre>
<ol>
<li>On compte la borne supérieure de la catégorie 2. Pourquoi un <code>IFNULL</code> ? Parce <code>MAX()</code> retournera <code>NULL</code> si un des <code>item_ordre</code> en contient un. C&#8217;est une sécurité ;</li>
<li>On met à jour les éléments de la catégorie 1 avec leur nouvel ordonnancement et leur nouvelle catégorie.</li>
</ol>
<p><strong>Alors pourquoi ça fonctionne</strong> ? La commande <code>UPDATE</code> balaie les lignes <strong>une par une</strong> et du coup, <strong>met à jour la variable <code>@ordre</code> à chaque ligne</strong>. Nous retrouvons ainsi l&#8217;effet désiré : incrémenter chaque ligne déplacée dans la nouvelle catégorie.</p>
<p>Il existe des utilisations plus compliquées que celles-là mais je pense que c&#8217;est un bon départ pour se faire une idée de ce qui est faisable par ce biais là. L&#8217;imagination et les besoins feront le reste <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/utilisation-variables-mysql/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pivoter automatiquement des photos avec gThumb</title>
		<link>http://case.oncle-tom.net/2007/pivoter-automatiquement-photos-gthumb-linux/</link>
		<comments>http://case.oncle-tom.net/2007/pivoter-automatiquement-photos-gthumb-linux/#comments</comments>
		<pubDate>Sat, 09 Jun 2007 11:00:36 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[gthumb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[logiciel libre]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[Photographie]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/06/09/pivoter-automatiquement-photos-gthumb-linux/</guid>
		<description><![CDATA[Je prends souvent mes photos à la verticale pour valoriser le sujet. Si le choix est plus ou moins discutable, la photo numérique, elle, est toujours enregistrée dans le même sens. Les photos verticales sont donc inclinées à 90 degrés. Il existe deux solutions pour la rotation de vos images : activer la rotation automatique [...]]]></description>
			<content:encoded><![CDATA[<p>Je prends souvent mes photos à la verticale pour valoriser le sujet. Si le choix est plus ou moins discutable, la photo numérique, elle, est toujours enregistrée dans le même sens. Les photos verticales sont donc inclinées à 90 degrés.</p>
<p>Il existe <strong>deux solutions pour la rotation de vos images</strong> :</p>
<ol>
<li><strong>activer la rotation automatique de l&#8217;appareil photo</strong> (si celui-ci la propose). Personnellement je n&#8217;aime pas cette option à cause des bordures noires ajoutées à la photo ;</li>
<li><strong>effectuer soi-même la rotation de la photo</strong> pour qu&#8217;elle se présente telle qu&#8217;on l&#8217;a prise.</li>
</ol>
<p>L&#8217;inconvénient de cette dernière méthode est qu&#8217;il faut <strong>appliquer une rotation à chaque image, dans le bon sens</strong>. Une opération qui devient <em>rapidement fastidieuse</em>.<br />
Depuis sa version 2.16 (il me semble), le logiciel de visualisation d&#8217;images <a href="http://gthumb.sourceforge.net">gThumb</a> sous Linux propose deux outils sympathiques de rotation automatique d&#8217;images. Un énorme gain de temps.<br />
<span id="more-663"></span></p>
<h3>Pré-requis</h3>
<p>Le seul pré-requis à ces outils de feignants est que votre <strong>appareil photo numérique enregistre l&#8217;orientation de la prise de vue</strong>. Je pense que tous les appareils doivent le faire car déjà en 2000 c&#8217;était le cas. Si ce n&#8217;est pas le cas, vous avez sûrement choisi un appareil plus que bas de gamme et retournés ou pas, les clichés ne sont pas vraiment exploitables.</p>
<h3>Rotation automatique à l&#8217;import</h3>
<p style="text-align: center"><img src="http://case.oncle-tom.net/images/2007/06/gthumb-pivoter-images-import.png" alt="Pivoter des images avec gThumb lors de l’import d’images" /></p>
<p>Comme l&#8217;illustre la capture d&#8217;écran ci-dessus, l&#8217;assistant d&#8217;import d&#8217;images de <em>gThumb</em> propose une option <cite>Pivoter physiquement l&#8217;image</cite>. Lors de l&#8217;import des photos depuis le medium en question, <em>gThumb pivotera les images dans le bon sens</em>. Du coup il n&#8217;y a plus rien à faire si ce n&#8217;est regarder les photos sans avoir à pencher la tête sur le côté pour admirer les photos de mémé.</p>
<h3>Rotation automatique sur une sélection d&#8217;images</h3>
<p>Pas de chance pour vous, mémé vous a refilé un <acronym title="Compact Disc">CD</acronym> entier d&#8217;images qui n&#8217;ont pas été pivotées. Vous souffrez d&#8217;avance rien qu&#8217;à l&#8217;idée de pivoter les images une par une mais par chance, gThumb est encore là grâce à un outil utilisable à tout moment.<br />
Lorsque gThumb est lancé et que vous parcourez un répertoire rempli de photos à pivoter, sélectionnez-les toutes (<kbd>Control + A</kbd> pour faire vite) et activez le menu <code>Outils &gt; Pivoter les images</code>. En cochant ensuite les cases <cite>Appliquer à toutes les images</cite> et <cite>Appliquer les transformations physiques</cite>, <em>gThumb</em> passera au crible toutes les photos sélectionnées et les pivotera automatiquement dans le bon sens, peu importe l&#8217;orientation d&#8217;origine.</p>
<p style="text-align: center"><img src="http://case.oncle-tom.net/images/2007/06/gthumb-pivoter-images-selection.png" alt="Pivoter des images avec gThumb lors d’une sélection" /></p>
<p><em>gThumb</em> est un outil particulièrement bien conçu pour les manipulations d&#8217;images. D&#8217;ailleurs je regrette qu&#8217;il ait été délaissé dans GNOME au profit de <a href="http://f-spot.org/">F-Spot</a>. Ce dernier est en revanche plus agréable à utiliser pour la visualisation de photos, surtout grâce à son système de chronologie.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/pivoter-automatiquement-photos-gthumb-linux/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Mise à jour automatique d&#8217;une feuille de style CSS dans le navigateur Web</title>
		<link>http://case.oncle-tom.net/2007/mise-a-jour-automatique-css-navigateur-web/</link>
		<comments>http://case.oncle-tom.net/2007/mise-a-jour-automatique-css-navigateur-web/#comments</comments>
		<pubDate>Fri, 25 May 2007 11:00:09 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Standards du Web]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[css]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/05/25/mise-a-jour-automatique-css-navigateur-web/</guid>
		<description><![CDATA[Bien souvent on est amené à modifier une feuille de style existante pour adapter la présentation ou corriger un bug (qui a pensé à Internet Explorer ?). Bien souvent on modifie directement cette feuille de style pour ensuite écraser les anciennes versions sur les sites en production. Et généralement on se confronte au problème du [...]]]></description>
			<content:encoded><![CDATA[<p>Bien souvent on est amené à <strong>modifier une feuille de style existante pour adapter la présentation</strong> ou corriger un bug (qui a pensé à <em>Internet Explorer</em> ?).<br />
Bien souvent on modifie directement cette feuille de style pour ensuite écraser les anciennes versions sur les sites en production.</p>
<p>Et généralement on se confronte au <strong>problème du cache des navigateurs Web</strong>. Ces derniers conservent en mémoire les feuilles de style pendant un certain temps causant ainsi un décalage entre le fichier <acronym title="Cascading Style Sheet"><acronym title="Cascading Style Sheets">CSS</acronym></acronym> du serveur (et la présentation souhaitée) et celui du navigateur (reposant sur une présentation obsolète).<br />
<span id="more-632"></span></p>
<h3>Inclure une feuille de style</h3>
<p>L&#8217;inclusion d&#8217;une feuille de style au sein même de la page n&#8217;est pas une opération qui devrait vous poser trop de problèmes. Elle peut se faire de deux façons, la première étant compatible avec tous les navigateurs, la seconde seulement avec les navigateurs modernes.</p>
<pre><code class="txt">/* inclusion "old school" */
&lt;link rel="stylesheet" type="text/css" href="url/style.css" media="screen" /&gt;
/* inclusion "moderne" */
&lt;style type="text/css"&gt;@import url('url/style.css') screen;&lt;/style&gt;</code></pre>
<h3>Inclure une feuille de style avec mise à jour automatique</h3>
<p>Vous allez voir, c&#8217;est tout bête. <em>On reprend l&#8217;exemple précédent</em> ; on veut conserver le même nom de fichier mais il a été mis à jour et on souhaite que le <em>navigateur le recharge sans que l&#8217;utilisateur ait à faire un petit F5</em> sur son clavier.</p>
<pre><code class="txt">/* inclusion "old school" */
&lt;link rel="stylesheet" type="text/css" href="url/style.css<ins>?v=1234</ins>" media="screen" /&gt;
/* inclusion "moderne" */
&lt;style type="text/css"&gt;@import url('url/style.css<ins>?v=1234</ins>') screen;&lt;/style&gt;</code></pre>
<p>Vous voyez le <strong>v=1234</strong> ? Le fait d&#8217;ajouter un paramètre au fichier appelé dupe le navigateur et lui fait croire qu&#8217;il s&#8217;agit d&#8217;un fichier différent de <em>style.css</em>. En réalité on peut mettre n&#8217;importe quoi en paramètre (le timestamp de mise à jour du fichier par exemple. Par exemple <code>style.css?1180077252</code>).</p>
<h3>Pourquoi ça fonctionne ?</h3>
<p>Dans une <acronym title="Uniform Ressource Identifier"><acronym title="Uniform Resource Identifier">URI</acronym></acronym>, le chemin physique du fichier s&#8217;arrête juste avant le <kbd>?</kbd>. <em>Tout ce qui est inscrit après est considéré comme étant des paramètres</em>, compléments virtuels du-dit fichier. Ce qui importe au navigateur, c&#8217;est que le fichier en question renvoie bien des données dans le type <acronym title="Multipurpose Internet Mail Extensions"><acronym title="Multipurpose Internet Mail Extension">MIME</acronym></acronym> attendu, ici <code>text/css</code>.</p>
<p><strong>Le navigateur gère le cache d&#8217;un fichier par rapport à son adresse complète</strong>, ceci incluant les paramètres fournis. Pour lui, <code>style.css?v=1</code> et <code>style.css?v=2</code> sont deux fichiers différents, peu importe s&#8217;il s&#8217;agit en réalité du fichier <code>style.css</code>.<br />
En cas de changement de paramètre, <strong>le navigateur estime qu&#8217;il s&#8217;agit d&#8217;un nouveau fichier</strong>, récupère celui-ci et, magie, utilise la dernière version en date de celui-ci plutôt qu&#8217;une version en cache, obsolète.</p>
<p>Cette petite astuce permet de <em>gagner en crédibilité face à des clients</em>, <em>évite aux internautes d&#8217;être perdus</em> dans un affichage incohérent misant fortement sur les feuilles de style.<br />
Exactement ce que l&#8217;on recherchait <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/mise-a-jour-automatique-css-navigateur-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IN() et GROUP_CONCAT() sont dans un bateau</title>
		<link>http://case.oncle-tom.net/2007/in-et-group_concat-sont-dans-un-bateau/</link>
		<comments>http://case.oncle-tom.net/2007/in-et-group_concat-sont-dans-un-bateau/#comments</comments>
		<pubDate>Mon, 09 Apr 2007 11:00:31 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimisation]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/04/09/in-et-group_concat-sont-dans-un-bateau/</guid>
		<description><![CDATA[Il m&#8217;arrive fréquemment d&#8217;avoir à sélectionner des lignes de données à partir d&#8217;un ou plusieurs critères. C&#8217;est le cas dès que l&#8217;on souhaite récupérer une liste. C&#8217;est également très pratique pour mettre à jour ces dites-lignes. Seulement voilà, des fois on pourrait éviter quelques boucles et quelques complications avec l&#8217;utilisation de deux fonctions magiques de [...]]]></description>
			<content:encoded><![CDATA[<p>Il m&#8217;arrive fréquemment d&#8217;avoir à sélectionner des lignes de données à partir d&#8217;un ou plusieurs critères. C&#8217;est le cas dès que l&#8217;on souhaite récupérer une liste. C&#8217;est également très pratique pour mettre à jour ces dites-lignes. Seulement voilà, des fois on pourrait éviter quelques boucles et quelques complications avec l&#8217;utilisation de deux fonctions magiques de MySQL : <a href="http://dev.mysql.com/doc/refman/4.1/en/comparison-operators.html">IN()</a> et <a href="http://dev.mysql.com/doc/refman/4.1/en/group-by-functions.html">GROUP_CONCAT()</a>.<br />
<span id="more-550"></span></p>
<h3>Sélection optimisée avec IN()</h3>
<p><code>IN()</code> devrait être utilisé dès lors que l&#8217;on a plusieurs critères sur un même colonne. L&#8217;écriture suivante ne devrait pas apparaitre dans votre code :</p>
<pre><code class="sql">SELECT * FROM `ma_table` WHERE id = 3 OR id = 5;</code></pre>
<p>A la place, il devrait y avoir ceci :</p>
<pre><code class="sql">SELECT * FROM `ma_table` WHERE id IN (3, 5);</code></pre>
<p>C&#8217;est une habitude à prendre car elle permettra d&#8217;automatiser bien des choses. Imaginez qu&#8217;on ne fasse plus cette sélection &laquo;&nbsp;en dur&nbsp;&raquo; mais à partir d&#8217;un tableau <acronym title="Pre-Hypertext Processing">PHP</acronym>. Trois façons d&#8217;écrire la requête, vous verrez vite laquelle sera la plus pratique à réutiliser :</p>
<pre><code class="php">
$tableau = array(3, 5);
/* Méthode 1 : vite-fait mal fait */
$separateur = '';
$sql = "SELECT * FROM `ma_table` WHERE ";
foreach( $tableau as $id )
{
	$sql .= $separateur." id = ".$id;
	$separateur = ' OR ';
}
/* Méthode 2 : utilisation "optimisée" avec des OR dans la requête */
$sql = "SELECT * FROM `ma_table` WHERE id = ".implode(' OR id = ', $tableau);
/* Méthode 3 : passe-partout */
$sql = "SELECT * FROM `ma_table` WHERE id IN (".implode(',', $tableau).")";
</code></pre>
<p>Le gros avantage de la dernière méthode c&#8217;est le retraitement des données. Il est facile et plus logique d&#8217;<a href="http://fr.php.net/implode">imploser</a> et d&#8217;<a href="http://fr.php.net/manual/fr/function.explode.php">exploser</a> une chaine composée de <em>séparateurs virgule</em> (ou autre caractère employé aux mêmes fins).</p>
<pre><code class="php">$tableau = array(3, 5);
$tableau = implode(',', $tableau);
/* du code nécessitant $tableau en tant que chaîne */
$tableau = explode(',', $tableau);
/* du code nécessitant $tableau en tant que tableau */</code></pre>
<h3>Aggrégats avec GROUP_CONCAT()</h3>
<p>Dans les exemples précédents, <code>$tableau</code> était rempli &laquo;&nbsp;en dur&nbsp;&raquo;. Dans la vraie vie, ça ne se passe pas comme ça : on récupère des identifiants (clés et/ou index) pour valider les sélections. L&#8217;exemple basique : <em>on veut mettre à jour une table de configuration avec les ID d&#8217;articles présents dans une ou plusieurs catégories</em>.</p>
<pre><code class="php">$tableau = array();
/* Sélection des ID */
$query = mysql_query("SELECT id FROM `ma_table` WHERE cat_id IN ('fromage', 'tortues');");
while( $ligne = mysql_fetch_assoc($query) )
{
	$tableau[] = $ligne['id'];
}
/* On met à jour notre table de configuration */
$tableau = implode(',', $tableau);
mysql_query("REPLACE INTO `table_config` (config_id, config_valeur) ".
	"('cache_articles', '{$tableau}')");</code></pre>
<p>C&#8217;est simple, propre et on se dit qu&#8217;on a bien bossé. Et pourtant, l&#8217;utilisation de la fonction d&#8217;agrégation <code>GROUP_CONCAT()</code> de MySQL nous épargnera quelques lignes. On appréciera :</p>
<pre><code class="php">$tableau = array();
/* Sélection des ID */
$query = mysql_query("SELECT GROUP_CONCAT(id) AS cache_articles FROM `ma_table` WHERE cat_id IN ('fromage', 'tortues');");
$tableau = mysql_fetch_assoc($query);
/* On met à jour notre table de configuration */
mysql_query("REPLACE INTO `table_config` (config_id, config_valeur) ".
	"('cache_articles', '{$tableau['cache_articles']}'");</code></pre>
<p>Bref, on a gagné une boucle (le <code>while</code>), des lignes de résultats MySQL (autant de ressources d&#8217;économisées) et un traitement <acronym title="Pre-Hypertext Processing">PHP</acronym> en moins (<code>implode</code>). Et devinez quoi ? Le résultat retourné par le <code>GROUP_CONCAT</code> s&#8217;intègre très bien dans le &#8230; <code>IN()</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/in-et-group_concat-sont-dans-un-bateau/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Prenez des raccourcis</title>
		<link>http://case.oncle-tom.net/2007/prenez-des-raccourcis/</link>
		<comments>http://case.oncle-tom.net/2007/prenez-des-raccourcis/#comments</comments>
		<pubDate>Thu, 22 Feb 2007 12:00:42 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[clavier]]></category>
		<category><![CDATA[optimisation]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/02/22/prenez-des-raccourcis/</guid>
		<description><![CDATA[Quand on utilise régulièrement les mêmes logiciels, on aime à pouvoir gagner du temps tout en se simplifiant la vie. Les seuls pré-requis sont 2 doigts et un peu de mémoire. Autant dire que tout le monde (ou presque) est concerné. Voyons ensemble 10 combinaisons de touches avec Control, facilement mémorisables. Ces combinaisons se retrouvent [...]]]></description>
			<content:encoded><![CDATA[<p>Quand on utilise régulièrement les mêmes logiciels, on aime à pouvoir gagner du temps tout en se <em>simplifiant la vie</em>. Les seuls pré-requis sont 2 doigts et un peu de mémoire. Autant dire que tout le monde (ou presque) est concerné.</p>
<p>Voyons ensemble 10 combinaisons de touches avec <kbd>Control</kbd>, facilement mémorisables. Ces combinaisons se retrouvent sur la plupart des logiciels Windows, Linux et Mac <acronym title="Operating System">OS</acronym> X à la différence près que pour ce dernier, c&#8217;est la touche <kbd>Pomme</kbd> qui interagit.<br />
<span id="more-467"></span><br />
Sur la première rangée de votre clavier :</p>
<ul>
<li><kbd>Control + A</kbd> (<strong>A</strong>ll, tous) : sélectionner tout le contenu d&#8217;une zone active (document, zone de texte etc.) ;</li>
<li><kbd>Control + Z</kbd> : annule un changement et revient à l&#8217;état précédent. Très pratique dans les éditeurs de texte pour corriger rapidement une phrase ;</li>
<li><kbd>Control + T</kbd> (<strong>T</strong>ab, onglet) : crée un nouvel onglet dans les applications gérant ce mécanisme (Firefox, Internet Explorer 7, GAIM etc.) ;</li>
</ul>
<p>Sur la deuxième rangée de votre clavier :</p>
<ul>
<li><kbd>Control + Q</kbd> (<strong>Q</strong>uit, quitter) : ferme entièrement une application ;</li>
<li><kbd>Control + S</kbd> (<strong>S</strong>ave, sauvegarder) : enregistre le document actif. <strong>Indispensable</strong> avec les éditeurs de texte ;</li>
</ul>
<p>Sur la troisième rangée de votre clavier :</p>
<ul>
<li><kbd>Control + W</kbd> (<strong>W</strong>indow, fenêtre) : ferme l&#8217;onglet actif dans les applications gérant ce mécanisme ;</li>
<li><kbd>Control + X</kbd> (<strong>Cross</strong>, Cut, couper) : coupe la sélection (texte, documents) en attendant d&#8217;être collée ;</li>
<li><kbd>Control + C</kbd> (<strong>C</strong>opy, copier) : copie la sélection (texte, documents) en attendant d&#8217;être collée ;</li>
<li><kbd>Control + V</kbd> : colle la sélection (texte, documents) ;</li>
<li><kbd>Control + N</kbd> (<strong>N</strong>ew, nouveau): crée un nouveau document au sein de l&#8217;application (fenêtre, fichier etc.).</li>
</ul>
<p>Ca peut paraître barbare à première vue et pourtant. Regardez votre clavier : ce sont systématiquement des touches placées en début de rangée et allant vers la droite. Toutes ces combinaisons s&#8217;effectuent facilement avec une seule mains et 2 doigts.<br />
Pour faire simple et efficace : appuyez sur la touche <kbd>Control</kbd> avec votre auriculaire puis sur son complément avec votre index <em>OU</em> votre majeur pour les touches les plus proches de <kbd>Control</kbd>. Ca évite les contorsions inconfortables.</p>
<p>Personnellement je préfère <strong>largement abuser</strong> du <kbd>Control + S</kbd> que faire confiance aux sauvegardes automatiques (surtout quand on connaît la capacité de <em>Microsoft Office</em> à détruire vos fichiers). Vous économisez des clics, votre poignet et du temps tout en gagnant en confort d&#8217;utilisation.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/prenez-des-raccourcis/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

