<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Chez ZeGuigui</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/technique/" />
    <link rel="self" type="application/atom+xml" href="http://www.zeguigui.com/weblog/archives/technique/atom.xml" />
    <id>tag:www.zeguigui.com,2010:/weblog/1/C/3</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1" title="Chez ZeGuigui" />
    <updated>2010-01-09T12:39:42Z</updated>
    <subtitle>Technique</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 5.01</generator>

<entry>
    <title>Gérer sa médiathèque avec Movable Type v. 4</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2008/11/gerer-sa-mediat-2.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=582" title="Gérer sa médiathèque avec Movable Type v. 4" />
    <id>tag:www.zeguigui.fr,2008:/weblog//1.582</id>
    
    <published>2008-11-14T07:00:00Z</published>
    <updated>2010-01-09T12:39:42Z</updated>
    
    <summary type="html">Vous rêvez d&apos;ajouter une médiathèque à votre site mais ça vous semble long et compliqué à mettre en œuvre ? Grâce à Movable Type et les API d&apos;Amazon, on peut facilement réaliser cela en quelques heures. Visite guidée !</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-amazon" style="display: inline;"><a href="http://www.amazon.fr/gp/redirect.html%3FASIN=2800138459%26tag=lewebdezeg-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/Spirou-Fantasio-lint%C3%A9grale-d%C3%A9buts-dessinateur/dp/2800138459%253FSubscriptionId=1KK4W7EC5WHY6BSREY82"><img alt="Spirou et Fantasio, l'intégrale tome 1 : Les débuts d'un dessinateur" src="http://images.amazon.com/images/P/2800138459.01._SCLZZZZZZZ_SX175_.jpg" class="mt-image-right illustration" /></a></span> <p>Vous avez probablement constaté sur ce site un changement d'envergure&nbsp;: l'ajout d'une médiathèque. Celle-ci est gérée de façon quasi automatique grâce à Movable Type et quelques plugins astucieux.&nbsp;</p>  <h2>Quelques prérequis</h2> <p>Déjà il vous faut movable type... j'utilise la version 4.1 et donc tout ce que je vais écrire là se rapporte à cette version. Cependant cette idée de gérer ma médiathèque avec movable type est née à partir d'une expérience similaire <a href="http://bradchoate.com/weblog/2002/08/02/way-too-many-games">datant de 2002</a>. Idée qu'il a fallut adapter pour suivre les évolutions de Movable Type notamment. On va supposer ici que Movable Type est installé correctement et que vous savez vous en servir. Le but n'est pas ici de faire un mode d'emploi exhaustif de ce logiciel (!).</p> <p>Ensuite il vous faut une clé d'API Amazon. Là il faut causer un peu anglais pour pouvoir l'obtenir sur <a href="http://aws.amazon.com/">le site dédié</a>.</p> <p>Il vous faudra aussi le greffon Media Manager pour Movable Type 4. Il est pour l'instant disponible uniquement en version beta. Il inclue MTAmazon dont on aura besoin pour afficher les pages du site. Il est disponible sur <a href="http://www.majordojo.com/projects/">le site de majordojo</a>.</p><p>&nbsp;</p>]]>
        <![CDATA[<h2>Une idée simple</h2> <p>L'idée simple de départ consiste à dire que la médiathèque est gérée comme un <i>sideblog</i>. Autrement dit vous avez votre blog principal et vous utilisez les fonctionnalités de movable type pour générer des pages dans un coin.</p> <p>Au sein de ce sideblog, chaque article de la médiathèque est représenté par une note. Là vous avez deux options : soit vous utilisez la fonctionnalité de gestion des <i>assets</i> de movable type avec Media manager : création de l'<i>asset</i>, création de la note, etc. soit vous optez pour quelque chose d'un peu plus sioux. J'ai bien entendu choisi cette seconde option bien que la première fonctionne parfaitement (pour preuve l'illustration de cet article).</p> <p>Pour bien gérer une médiathèque il faut des catégories. J'ai choisi de créer une catégorie par type de média (CD, DVD, livre, jeux vidéo, etc.) puis pour chaque catégorie de décliner en sous-catégories. Cela permet de ne pas tout mélanger. On peut même envisager de créer une catégorie <i>Wish Liste</i> et lorsqu'on a acheté (ou qu'on vous a offert ?!) un élément de cette liste il ne reste plus qu'à en changer la catégorie !</p> <p>Ensuite chaque média est représenté par une note. J'utilise le titre de la note comme nom du média (c'est original non ?!). Le corps de la note me permet d'ajouter un commentaire ou une description si je me sens une âme de commentateur. Ensuite je stocke l'ASIN dans le champs <i>Mots clés</i>. A noter que la version 4.2 de Movable Type (sortie depuis que j'ai commencé à écrire ce billet !) permet de gérer des champs personnalisés (fonctionnalité jusqu'alors payante de la version pro) et on pourrait donc mettre l'ASIN dans un champ à part... mais bon c'est juste un détail !</p> <p>Qu'est-ce donc que cet ASIN ? C'est l'identifiant d'un objet chez Amazon. C'est LA clé d'entrée de l'API Amazon qui va permettre d'afficher une image du produit, d'en récupérer des informations comme le nom de l'auteur voir une description plus complète. Grâce à cet ASIN et en bidouillant les templates de Movable Type on va pouvoir afficher une belle médiathèque !</p> <p>Et comme je suis amateur de bandes dessinées il me faut gérer des collections (par exemple la série des Tintin) et quel champ mieux adapté à cela que celui des tags (les fonctions de recherche par tag étant intégrée dans MT).</p> <h2>Mise en route</h2> <p>Première chose à faire : créer le sideblog dans Movable Type. En quelques clics hop c'est fait. Ensuite on installe Media Manager et on va le configurer aussi bien dans les propriétés du système que dans les propriétés du sideblog (notamment pour la locale qui permet de choisir le magasin Amazon dans lequel on fait les recherches pour la création des <i>assets</i>).</p> <p>Enfin il ne reste plus qu'à créer sa première note avec son livre préféré... pour cela se rendre sur Amazon, rechercher le livre en question. Dans la description on trouve l'ASIN. S'il n'y est pas il suffit de prendre l'ISBN.</p> <p>On clique sur "créer &gt; note", on rentre le titre, on choisi la catégorie, on met l'ASIN dans les mots clés et éventuellement la collection en tag (attention : pas de virgule qui est le séparateur de tags !).</p> <p>Une fois cela fait on peut aller voir le site publié... bon il manque l'illustration et la présentation n'est pas franchement très "médiathèque". Mais on va remédier à cela grâce à MTAmazon !</p> <h2>Paramétrage de Movable Type</h2> <p>On va déjà commencer par gérer l'accès aux médias. Pour l'instant si vous avez fait tout comme je vous l'ai dit vous devriez avoir un truc qui ressemble à ça :</p> <span style="display: inline;" class="mt-enclosure mt-enclosure-image"><img style="margin: 0pt auto 20px; text-align: center; display: block;" class="mt-image-center" src="http://www.zeguigui.com/weblog/uploads/Image/mediamanager1.jpg" alt="mediamanager1.jpg" height="421" width="640" /></span> <p>L'accès au livre se fait par une adresse qui inclut la date de la note... Si ce choix est optimal pour un blog, pour une médiathèque il est plus intéressant d'avoir un accès par catégorie et sous catégorie. On va donc aller changer celà dans Movable Type. Pour cela il faut aller dans Design / gabarits et choisir les "gabarits d'archives".</p> <p>Cliquer sur "Note" et modifier la table de correspondance des archives pour choisir un chemin de type "categorie/sous-categorie/nomdebase-note.html" (ou les variantes avec le caractère souligné, comme vous préférez). Enregistrez.</p> <p>On va aussi en profiter pour supprimer des archives inutiles (et accélérer ainsi la publication) : cliquez sur "Liste des notes" et dans la table de correspondance ne conservez que la ligne "par catégories". Republiez votre site et admirez les changements d'adresses (!).</p> <p>Oui bon c'est gentil tout ça mais on a pas encore les jaquettes... patience, ça arrive !!!</p> <p>Bon alors l'idée c'est d'utiliser MTAmazon qui est fourni avec Media Manager. Pour cela on va aller modifier quelques gabarits standards. Le premier à modifier c'est "Résumé de la note" (c'est un gabarit de type module).</p> <p>Grâce à MT 4 on peut maintenant utiliser des variables. Il est donc facile de mémoriser le mot clé (qui contient l'ASIN du produit) dans une variable et d'utiliser celle-ci en paramètre à la fonction MTAmazonItemLookup. En gros ça donne ça :</p> <pre class="code">&lt;mt:ifnonempty tag="EntryKeywords"&gt;
	&lt;$MTEntryKeywords setvar="asin"$&gt;
	&lt;MTAmazonItemLookup ItemId="$asin"&gt;
		&lt;div id="entry-&lt;$MTEntryID$&gt;" class="entry-asset asset hentry"&gt;
			&lt;a rel="bookmark" href="&lt;$MTEntryPermalink$&gt;"&gt;&lt;img src="&lt;$MTAmazonCustomImageURL size="small" shadow="right"$&gt;" alt="&lt;$MTAmazonTitle encode_html="1"$&gt;" title="&lt;$MTAmazonTitle encode_html="1"$&gt;" /&gt;&lt;/a&gt;&lt;br /&gt;
			&lt;a rel="bookmark" href="&lt;$MTEntryPermalink$&gt;"&gt;&lt;small&gt;&lt;$MTEntryTitle$&gt;&lt;/small&gt;&lt;/a&gt;
		&lt;/div&gt;
	&lt;/MTAmazonItemLookup&gt;
&lt;/mt:ifnonempty&gt;
</pre> <p>Au passage on remarquera que j'ai supprimé pas mal de choses :) Avec plusieurs livres le résultat devrait être semblable à celui-ci (après sauvegarde et republication).</p> <span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="mediamanager2.jpg" src="http://www.zeguigui.com/weblog/uploads/Image/mediamanager2.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="559" width="640" /></span> <p>On a bien nos jaquettes par contre la mise en page laisse à désirer : chaque titre prends une ligne à lui tout seul ! On va donc aller modifier la feuille de style pour améliorer tout cela. Retour aux gabarits index et direction la feuille de style (styles.css).</p> <p>Par défaut c'est du minimaliste : on inclut les feuilles de style du thème courant... on va ajouter nos propres déclarations pour forcer les choses :</p> <pre class="code">/* Default Layout: <mtsetvar name="page_layout" value="layout-wtt"> */<br />@import url(&lt;$MTStaticWebPath$&gt;themes-base/blog.css);<br />@import url(&lt;$MTStaticWebPath$&gt;themes/minimalist-red/screen.css);<br /><br />#alpha .asset {<br />	width		: 200px;<br />	height		: 220px;<br />	line-height	: 1.0em;<br />	float		: left;<br />	vertical-align	: bottom;<br />	text-align	: center;<br />	padding		: 0;<br />	margin		: 0.25em;<br />	clear		: none;<br />}<br /><br />.content-nav {<br />	clear		: both;<br />}<br /></mtsetvar></pre> <p>En gros on lui explique que l'on désire avoir des éléments carrés de 200 pixels de largeur qui "floatent" les uns à côté des autres.</p> <p>Déjà ça commence à ressembler à quelque chose. Il ne nous reste plus qu'à modifier ce que l'on voit lorsqu'on clique sur un livre (ou autre média)... mais ça je vous le laisse en exercice (façon simple de mettre en ligne ce billet qui trainait en mode "brouillon" depuis le mois de juin dernier !</p> <p>A noter que j'ai fait une petite modification dans la librairie MTAmazon. En effet par défaut l'URL de l'image est pour la version américaine (.01. dans l'URL, de tête) alors que la majorité de mes livres, CD, etc. sont français. J'ai donc modifié le code pour prendre en compte cette différence (je détaillerai dès que j'aurai un peu de temps... si vous êtes sages !).</p>]]>
    </content>
</entry>

<entry>
    <title>ViaMichelin 3.x et Palm T|X...</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2008/01/viamichelin-3x.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=372" title="ViaMichelin 3.x et Palm T|X..." />
    <id>tag:www.zeguigui.com,2008:/weblog//1.372</id>
    
    <published>2008-01-20T18:50:17Z</published>
    <updated>2008-01-20T19:00:17Z</updated>
    
    <summary type="html">ViaMichelin ne trouve pas assez de mémoire et vous demande de faire un soft reset et ça boucle indéfiniment ? Voici la solution !</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p>Depuis quelques temps déjà, je suis l'heureux propriétaire d'un palm T|X. Sur mon ancien palm j'avais installé ViaMichelin 3 et là j'ai voulu installer ce dernier sur mon palm "dernière génération". Murphy aidant c'était le début de mes problèmes.</p>
<p>L'installation sur le PC du logiciel s'est bien déroulée. Je vous passe le temps interminable nécessité pour la synchro de la carte en bluetooth lors de la hotsync (la prochaine fois je prends le mode avancé et je copie la carte sur la SD via mon lecteur de cartes, ça ira plus vite !). Je lance et là... erreur ! En gros la mémoire du palm a besoin d'être <i>optimisée</i> et ça se fait par un soft reset. Pas de soucis, ViaMichelin va se relancer tout seul. Sauf qu'à la fin du soft reset pouf j'ai à nouveau ce message d'erreur et ça boucle.</p>
<p>Pour arrêter la boucle des softs resets le plus simple c'est de faire un <i>warm reset</i> (bouton à l'arrière + flèche vers le haut maintenue) puis un nouveau soft reset (bouton à l'arrière seul). Mais ça ne résout pas le problème de lancement de ViaMichelin.</p>
<p>Alors comment faire ?</p>]]>
        <![CDATA[<p>Ce qui différencie le palm T|X du T3 (mon précédent PDA) c'est :</p>
<ul>
<li>un processeur moins puissant (!)</li>
<li>la présence du Wifi</li>
<li>une mémoire non volatile</li>
</ul>
<p>C'est la mémoire non volatile qui ici est importante. Sur le T|X et les palms de même technologie la RAM a été remplacée par de la mémoire non volatile comme celle qu'on trouve par exemple dans une clé USB. Avantage : si on oublie de recharger son palm on ne perds plus les données.</p>
<p>Maintenant quel est le problème avec ViaMichelin ? Quand le logiciel se lance il vérifie s'il a assez de mémoire. Si le T|X il vérifie une partie "spéciale" de la mémoire allouée à cela. Quand il n'y a pas assez de mémoire soft reset. Sur les anciens palms ça permet de vider la mémoire mal désallouée quand un logiciel sur termine.</p>
<p>Mais sur le T|X ce qui se passe lors d'un soft reset c'est bien un vidage mémoire puis tous les logiciels installés en mémoire sont notifiés qu'il vient d'y avoir un soft reset. Ca leur permet de faire du ménage ou ce genre de choses. Problème : le fait que les logiciels soient notifiés remplie la mémoire et quand ViaMichelin se relance on recommence à zéro !</p>
<p>La solution, car elle existe, consiste à installer un logiciel qui permette de récupérer la mémoire libre. On pourra utiliser pour cela Memory Info (voir <a href="http://discussion.treocentral.com/showthread.php?t=105771">par ici</a>). C'est en anglais mais en gros il faut utiliser dans le menu les options flush. Vous verrez que ça libère la mémoire et après, ô miracle, ViaMichelin fonctionne parfaitement !</p>
<p>A la décharge de ViaMichelin notons tout de même que les Palms utilisant cette technologie n'existaient pas au moment où la version 3.x est sortie. La version actuelle du logiciel étant la 6 ou 7 ce comportement bizarre est probablement résolu depuis&nbsp;!</p>]]>
    </content>
</entry>

<entry>
    <title>Dotclear 1.2.7 et les binettes... !</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2007/10/dotclear-127-et.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=367" title="Dotclear 1.2.7 et les binettes... !" />
    <id>tag:www.zeguigui.com,2007:/weblog//1.367</id>
    
    <published>2007-10-03T19:14:19Z</published>
    <updated>2007-10-09T11:32:32Z</updated>
    
    <summary type="html">Pour tous ceux qui ont perdus leurs binettes avec la version 1.2.7 de dotclear voici une nouvelle version du plugin !</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p>Pour tous ceux qui sont passés à dotclear 1.2.7 et qui ne retrouvent plus leur gestionnaire de binettes (qui plus est le site de l'auteur a semble-t'il fermé) j'ai fait une rapide conversion du plugin pour cette nouvelle version de dotclear. Attention la modification automatique du fichier <i>poster.php</i> change avec le passage en 1.2.7 et donc ça ne fonctionne qu'avec cette version&nbsp;!</p>
<p>Et comme ça ne suffisait pas (et surtout que je l'utilise pas mal...) j'ai aussi adapté pour la version 1.2.7 de dotclear le plugin <i>filemanager</i>. Là encore ce sont les modifications de sécurité de cette nouvelle version qui plantait le plugin (lors de la modification de fichiers... le reste fonctionnait encore&nbsp;!)</p>
<p>Et comme je suis gentil (et que la license GPL du plugin l'impose ;-)) je vous livre le tout ci-dessous&nbsp;:</p>
<ul>
   <li><span class="mt-enclosure mt-enclosure-file"><a href="http://www.zeguigui.com/weblog/uploads/File/plugin-smiliesmanager-0.6.tar.gz">plugin-smiliesmanager-0.6.tar.gz</a></span>&nbsp;: l'archive au format .tar.gz (12&nbsp;ko)</li>
   <li><span class="mt-enclosure mt-enclosure-file"><a href="http://www.zeguigui.com/weblog/uploads/File/plugin-smiliesmanager-0.6.pkg.gz">plugin-smiliesmanager-0.6.pkg.gz</a></span>&nbsp;: l'installeur (19&nbsp;ko)</li>
  <li><span class="mt-enclosure mt-enclosure-file"><a href="http://www.zeguigui.com/weblog/uploads/File/plugin-filemanager-0.5.1.tar.gz">plugin-filemanager-0.5.1.tar.gz</a></span>&nbsp;: l'archive au format .tar.gz (9&nbsp;ko)</li>
   <li><span class="mt-enclosure mt-enclosure-file"><a href="http://www.zeguigui.com/weblog/uploads/File/plugin-filemanager-0.5.1.pkg.gz">plugin-filemanager-0.5.1.pkg.gz</a></span>&nbsp;: l'installeur (12&nbsp;ko)</li>
</ul>
<p><strong>Mise à jour&nbsp;:</strong> nouvelle version 0.4 qui corrige les instructions de modification manuelle de poster.php et qui permet d'utiliser le greffon même quand on a renommer son dossier ecrire (si vous ne comprenez pas ce que ça veut dire, c'est pas grave... c'est juste que c'est mieux comme ça !).</p>
<p><strong>Mise à jour&nbsp;:</strong> la version 0.5 corrige la modification d'un smiley qui n'était pas compatible avec dotclear 1.2.7 (<i>precondition failed</i>).</p>
<p><strong>Mise à jour&nbsp;:</strong> la version 0.6 affiche un avertissement si l'affichage des smilies est désactivé dans la configuration de dotclear.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Géolocalisation de ses photos</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2007/09/geolocalisation.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=362" title="Géolocalisation de ses photos" />
    <id>tag:www.zeguigui.com,2007:/weblog//1.362</id>
    
    <published>2007-09-03T11:38:00Z</published>
    <updated>2007-09-03T12:30:07Z</updated>
    
    <summary type="html">Le nouveau buzz à la mode c&apos;est la géolocalisation des photos. Alors forcément il fallait que moi aussi je m&apos;essaye à ce petit jeu. Petit résumé de mon expérience avec un appareil photo, un GPS bluetooth et un palm. Ajoutez une sauce de perl, un peu de magie et hop !</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p><a href="/photos/v/20070901_ballade_jardin_du_luxembourg"><img width="256" height="172" class="illustration" alt="Géolocalisation" src="http://www.zeguigui.com/gallery2/d/12823-2/DSC_6023.JPG" /></a> Le nouveau <em>buzz</em> à la mode c'est la géolocalisation des photos. Alors forcément il fallait que moi aussi je m'essaye à ce petit jeu.</p>
<p>Tout a commencé avec la démocratisation des GPS autonomes. Il devient facile de se procurer un petit GPS bluetooth (par exemple) pour le brancher sur son PDA. Souvent couplé à un logiciel de cartographie / navigation cela permet de retrouver son chemin facilement (et quand on connait mon sens de l'orientation on se doute que j'ai fait rapidement l'acquisition de ce petit gadget technologique)...</p>]]>
        <![CDATA[<p>Par la suite les usages ont évolués. De l'itinéraire on est passé aux POI (POint d'Intérêt) qui permettent, entre autre, d'éviter les radars automatiques ou du moins de signaler leur présence. Avec la réduction des coûts liée à un développement du marché les &quot;puces GPS&quot; se retrouvent partout. Il y a maintenant des <em>smartphones</em> (PDA qui font également téléphone) qui intègrent une telle puce.</p>
<p>Et puis un jour Monsieur Sony il a eu une bonne idée et il a sorti une sorte de clé USB qui intègre un récepteur GPS et qui enregistre sa position. Avec un petit logiciel ça permet de dire où la photo a été prise. L'astuce consiste dans l'exploitation des méta données EXIF présentent dans chaque photo (dont la date/heure de prise de vue).</p>
<p>Il faut aussi noter que les EXIF prévoient la possibilité d'avoir des coordonnées GPS. En effet certains appareils photos haut de gamme permettent (voire intègrent !) de brancher un GPS via un simple câble de liaison (c'est le cas de mon D200 par exemple). Malheureusement un tel câble ne fonctionne qu'avec certains GPS et surtout pas en bluetooth.</p>
<p>Oui mais voilà moi mon GPS il est bluetooth, branché avec mon palm et je me suis dit qu'il devrait être possible de faire quelque chose qui ne soit pas trop une usine à gaz. Et en cherchant bien on finit par trouver ! Trouver des logiciels commerciaux mais aussi un logiciel libre : <a href="http://www.carto.net/projects/photoTools/gpsPhoto/">gps2photo</a> qui utilise ExifTool.</p>
<p>La première chose à noter c'est que la bestiole est écrite en perl. Perl c'est bien sur linux mais sous windows c'est déjà moins à la portée du premier venu. En plus il faut au moins un perl 5.8.8 alors à vos mises à jour ! Je ne vais cependant pas détailler l'usage de perl ici, ce n'est pas le but...</p>
<p>Première constat : il faut un fichier trace dans le format standard GPX... sur le palm on peut obtenir un tel fichier avec <a href="http://core.de/~coto/projects/cotogps/">cotoGPS</a> ou encore <a href="http://www.cetusgps.dk/">Cetus GPS</a>. Pour cette fois j'ai utilisé cotoGPS (dispo en français qui plus est). Il faut connecter le GPS au Palm puis aller sur la page &quot;Piste&quot;. On crée une nouvelle piste en cliquant sur &quot;Pistes&quot; et on oublie pas de cliquer sur &quot;utilise&quot;. Après il suffit de faire &quot;Début&quot; pour commencer l'enregistrement.</p>
<p dragover="true">A partir de là il faut aller se balader et prendre des photos. Pour faire dans l'original je suis aller faire un tour dans le jardin du Luxembourg (Paris VI). Une fois les photos prises on récupère la piste (dans le répertoire backup après une synchro de son palm), on prend jcotoDT (utilitaire <em dragover="true">desktop</em> de cotoGPS) et on converti en GPX (et en KMZ pour le voir sous google earth).</p>
<p dragover="true"><img width="676" height="581" alt="Ma ballade" src="/weblog/uploads/Image/track.jpg" /> </p>
<p dragover="true">On remarque au passage que mon GPS n'était pas très précis à l'allumage car il me voit dans la cour d'honneur du Sénat alors que j'étais devant l'entrée...</p>
<p dragover="true">Fin de la ballade, on décharge les photos sur son ordinateur. J'ai mis dans un dossier jpeg et un dossier raw mes images (je photographie dans les deux formats simultanément). Dans la racine j'ai mis le fichier gpx. J'ouvre ma ligne de commande et je tape :</p>
<pre class="Code">perl gpsPhoto.pl<br />	--dir=jpg<br />	--gpsfile=track.gpx<br />	--timeoffset=-7200<br />	--copydate<br />	--credit=&quot;Guillaume Lapierre&quot;<br />	--city=&quot;Paris&quot;<br />	--sublocation=&quot;Jardin du Luxembourg&quot;<br />	--country=&quot;France&quot;<br />	--copyright=&quot;(c) 2007 Guillaume Lapierre&quot;<br /></pre>
<p>En fait tout est sur une seule ligne de commande. Le point important c'est le paramètre timeoffset. C'est là que la photo qui illustre cet article est importante. Elle permet de voir le décalage entre le GPS et l'heure stockée dans les exifs. Mon appareil étant bien réglé l'heure affichée à l'écran et l'heure dans les exif correspondent (même heure/minute/seconde). Mais attention : cotoGPS affiche en UTC+2 (options / configuration) afin de correctement synchroniser l'heure du palm et l'heure du GPS. Par contre le fichier stocke bien les dates et heures en UTC. Il y a donc un décalage de 2h soit 7200 secondes.</p>
<p>A partir de là tout fonctionne tout seul (du moins si tout est bien installé !) et on obtient des photos avec des EXIF et des IPTC qui contiennent les coordonnées GPS. Magique :)</p>
<p>Avec l'option --kmz=toto.mkz on peut même créer un fichier google earth qui contient ses photos (pas fait).</p>
<p>Prochaine opération : ajouter le module Google Earth pour Gallery 2 et le thème associé afin de vous faire profiter de tout ça sur une carte !    <br />
</p>]]>
    </content>
</entry>

<entry>
    <title>Un plugin Movable Type pour identifier un auteur de commentaire</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2006/06/un-plugin-movab.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=310" title="Un plugin Movable Type pour identifier un auteur de commentaire" />
    <id>tag:www.zeguigui.com,2006:/weblog//1.310</id>
    
    <published>2006-06-14T19:25:42Z</published>
    <updated>2006-07-30T20:44:41Z</updated>
    
    <summary type="html"><![CDATA[Le but de ce plugin pour Movable Type est de permettre d'identifier un auteur de commentaire à partir de son adresse email. Cela permet, par exemple, d'identifier l'auteur du blog et, pour ce dernier, d'afficher ses réponses dans les commentaires différemment. Le plugin accepte un paramètre supplémentaire &quot;trusted&quot; qui, en plus de vérifier l'adresse email, vérifie que le commentaire est émis par une source authentifiée (typekey par exemple).]]></summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p>Vous aurez peut-&ecirc;tre remarqu&eacute; que les commentaires que je poste sur mon blog apparaissent dans une autre couleur. Si vous vous demandez comment j'ai fait &ccedil;a sous movable-type et bien c'est gr&acirc;ce &agrave; un plugin maison.</p>
<p>Le but de ce plugin est de permettre d'identifier un auteur de commentaire &agrave; partir de son adresse email. A quoi &ccedil;a sert ? Par exemple &agrave; ajouter une classe dans le code HTML afin de changer la couleur et ainsi reconna&icirc;tre un auteur du blog.</p>]]>
        <![CDATA[<p>Ce plugin est en fait ma premi&egrave;re r&eacute;alisation technique pour Movable Type. Jusqu'&agrave; pr&eacute;sent j'avais surtout bidouill&eacute; les mod&egrave;les mais je n'avais pas trouv&eacute; de solution miracle pour changer la couleur de mes commentaires, sauf &agrave; passer par un interm&eacute;diaire PHP (ce qui est r&eacute;aliste pour mon site puisqu'il utilise PHP).</p>
<p>Ce plugin ajoute une nouvelle balise conditionnelle &lt;MTIfCommenterEmailIs&gt; qui accepte deux param&egrave;tres : email et trusted. email est un param&egrave;tre obligatoire qui correspond &agrave; l'adresse email &agrave; reconna&icirc;tre. Si trusted=&quot;1&quot; alors non seulement l'adresse email doit correspondre mais en plus le commentaire doit avoir &eacute;t&eacute; post&eacute; dans un mode authentifi&eacute; (typekey par exemple). On peut bien entendu utilis&eacute; la balise &lt;MTElse&gt; dans sa page pour ajouter du code en cas de commentaire non reconnu.</p>
<pre class="exemple">
package MT::Plugin::ZeGuigui;

use strict;
use warnings;

use vars qw( $VERSION );
$VERSION = 1.0;

eval { use MT::Plugin };
unless ($@) {
    my $static_path = MT::ConfigMgr-&gt;instance-&gt;StaticWebPath;
    my $about = {
             key         =&gt; __PACKAGE__,
             name        =&gt; 'mt-zeguigui',
             description =&gt; 'Small plugins by ZeGuigui',
             author_name =&gt; 'ZeGuigui',
             author_link =&gt; 'http://www.zeguigui.com/',
             plugin_link =&gt; 'http://www.zeguigui.com/technique.php',
             version     =&gt; $VERSION
    };
    MT-&gt;add_plugin(MT::Plugin-&gt;new($about));
}

MT::Template::Context-&gt;add_conditional_tag(&quot;IfCommenterEmailIs&quot; =&gt; \&amp;checkCommenterEmail);

sub checkCommenterEmail {
	my ($ctx, $args) = @_;
	
	# Check context
	my $comment = $ctx-&gt;stash('comment')
		or return $ctx-&gt;error(&quot;Tag called without a comment in context&quot;);

	# Check arguments
	if (! $args-&gt;{email}) {
		return $ctx-&gt;error(&quot;An 'email' argument must be provided&quot;);
	}

	my $email   = $args-&gt;{email};
	my $trusted = $args-&gt;{trusted};

	return (($email eq $comment-&gt;email) &amp;&amp; ($trusted ? $comment-&gt;commenter_id : 1));
}

1;
</pre>
<p>Comme on peut le voir rien de bien extraordinaire dans le code source... sauf peut-&ecirc;tre l'utilisation de commenter_id de l'objet $comment qui n'est pas document&eacute; sur le site de SixApart. Probablement un oubli mais en lisant le source de Movable Type on trouve rapidement l'existence de ce param&egrave;tre qui simplifie grandement la reconnaissance d'un commentaire authentifi&eacute;&nbsp;!</p>
<p>Et maintenant pour nos amis anglophones une description nettement plus succinte et rapide de ce plugin.</p>
<blockquote><p>This plugin adds a new MovableType conditionnal tag named MTIfCommenterEmailIs. It accepts two arguments: email (mandatory) and trusted. The aim is to recognise a commenter by its email address. If trusted is set to 1 then the comment must also be from an authentified source (typekey for example). You can use MTElse to add some code when the comment is not from the expected source.</p></blockquote>
<p>En pratique voici comment vous pouvez utiliser ce tag (small example) :</p>
<pre class="exemple">
&lt;MTComments&gt;
    &lt;MTIfCommenterEmailIs email=&quot;authoremail@someisp.com&quot; trusted=&quot;1&quot;&gt;
         &lt;div class=&quot;comment blogauthor&quot; id=&quot;comment-&lt;$MTCommentID$&gt;&quot;&gt;
       &lt;MTElse&gt;
         &lt;div class=&quot;comment&quot; id=&quot;comment-&lt;$MTCommentID$&gt;&quot;&gt;
       &lt;/MTElse&gt;
    &lt;/MTIfCommenterEmailIs&gt;
[...]
&lt;/MTComments&gt;
</pre>
<p>Si vous avez des questions, commentaires, am&eacute;liorations &agrave; sugg&eacute;rer, n'h&eacute;sitez pas &agrave; utiliser les commentaires&nbsp;!</p>]]>
    </content>
</entry>

<entry>
    <title>Flux RSS, la totale sur ZeGuigui !</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2006/05/flux-rss-la-tot.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=302" title="Flux RSS, la totale sur ZeGuigui !" />
    <id>tag:www.zeguigui.com,2006:/weblog//1.302</id>
    
    <published>2006-05-23T11:04:30Z</published>
    <updated>2006-07-31T12:37:58Z</updated>
    
    <summary type="html">Ce billet expose les différents types de flux RSS que l&apos;on peut trouver sur un blog. Il propose une série d&apos;habillages pour Movable Type afin de combler les lacunes de ce dernier et d&apos;ajouter les flux manquant (commentaires pour le site, flux RSS par catégorie, commentaires d&apos;une note).</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
        <category term="Vie du site" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<img style="border-style: none;" src="/weblog/uploads/Image/rss.jpg" width="200" height="200" alt="RSS" class="illustration" /><p>Il &eacute;tait une fois un blogueur qui &eacute;tait bien tranquille avec son site perso. Il utilisait blogger.com pour mettre &agrave; jour ses pages pour &eacute;viter de les modifier &agrave; la main. Et puis, le temps faisant, d'autres personnes dans son entourage ont commenc&eacute; &agrave; &eacute;crire dans des blogs. Sa maman, ses amis, sa frangine... &agrave; tel point que tout le monde &eacute;crit sur son blog et met des commentaires dans ceux des autres (voire parfois utilise des r&eacute;troliens).</p>]]>
        <![CDATA[<p>Donc ce blogueur il commence &agrave; mettre tous les blogs dans ses signets. Et il surf r&eacute;guli&egrave;rement d'un site &agrave; l'autre pour voir s'il y a des nouveaut&eacute;s... pas tr&egrave;s pratique. Heureusement Zorro est arriv&eacute;... heu... non... <strong>les flux RSS</strong>. Un flux RSS c'est quoi donc ? C'est un petit fichier qui pr&eacute;sent sur un site web (pas forc&eacute;ment un blog) annonce la liste des derniers billets parus sur le site et ce dans un format bien d&eacute;termin&eacute;. Avec un logiciel adapt&eacute; qui charge ce petit fichier r&eacute;guli&egrave;rement vous &ecirc;tes imm&eacute;diatement inform&eacute; quand un nouveau message arrive sur l'un de vos sites pr&eacute;f&eacute;r&eacute;s. On appelle ce type de logiciel un &quot;agr&eacute;gateur de flux RSS&quot;.</p>
<p>En pratique on distingue diff&eacute;rents types de flux RSS. On parle de RSS 0.96, RSS 1.0, RSS 2.0 et Atom. Le but de ces fichiers est strictement le m&ecirc;me. Ce qui change c'est la fa&ccedil;on dont c'est &eacute;crit dedans et les fonctionnalit&eacute;s propos&eacute;es par chaque format. Atom est le plus r&eacute;cent de ces formats.<br /></p>
<p>Alors hop le blogueur commence &agrave; faire une collection de flux dans son logiciel pr&eacute;f&eacute;r&eacute;, Thunderbird par exemple. Le blogueur est content et &ccedil;a lui permet de mettre un petit commentaire sur le blog de chacun lorsque c'est n&eacute;cessaire.</p>
<p>Et puis arrive une soir&eacute;e o&ugrave; le blogueur croise un autre blogueur qui lui dit &quot;t'as vu, sur le blog de Fabrice, Coralie a r&eacute;pondu &agrave; mon commentaire...&quot; Heu... oui, certes... peut-&ecirc;tre. Et c'est l&agrave; que le blogueur se retrouve &agrave; nouveau &agrave; visiter les blogs individuellement et, pire, &agrave; devoir re-lire les commentaires des notes sur lesquelles il est intervenu. Bref il faut pouvoir suivre les commentaires.</p>
<p>Oui mais quels commentaires ? Autant sur le blog de ses amis le blogueur veut pouvoir suivre tous les commentaires (des fois que) autant sur un blog technique trouv&eacute; en surfant il peut-&ecirc;tre int&eacute;ressant de suivre les commentaires d'un seul billet. De m&ecirc;me sur certains blogs il peut-&ecirc;tre int&eacute;ressant de suivre tous les billets autant sur d'autres il peut-&ecirc;tre utile de ne suivre qu'une cat&eacute;gorie.</p>
<p>Et l&agrave; en mati&egrave;re de blogs les logiciels sont in&eacute;gaux. Je vais parler ici uniquement des 3 logiciels que je connais &agrave; peu pr&egrave;s.</p>
<ul>
    <li>MovableType (le logiciel que j'utilise) ne propose, par d&eacute;faut, qu'un flux pour les billets du site. Impossible de suivre les commentaires ou une cat&eacute;gorie. Cependant MovableType permet d'ajouter des mod&egrave;les personnalis&eacute;s et de combler ces petits manques</li>
    <li>DotClear, un produit fran&ccedil;ais fort sympatique, propose un flux pour les billets et un flux pour les commentaires. C'est un bon d&eacute;but. Un syst&egrave;me de plugins permet probablement d'&eacute;tendre ces possibilit&eacute;s mais je n'ai pas v&eacute;rifi&eacute; :-)</li>
    <li>Serendipity propose quant &agrave; lui un flux global des billets, un flux par cat&eacute;gorie et un flux global pour les commentaires. Il permet &eacute;galement, lorsqu'on pose un commentaire sur un billet, de s'abonner par email pour &ecirc;tre pr&eacute;venu des mises &agrave; jour des commentaires.</li>
</ul>
<p>Comme on peut le voir c'est assez vari&eacute; comme approche. Le flux RSS pour les commentaires d'une note je ne me souviens plus sur quelle plateforme je l'ai vu mais je sais que certains le mettent en place. Et <a href="http://www.kozlika.org/kozeries/index.php/2005/05/12/228-liberez-vos-commentaires">ce billet</a> a achev&eacute; de me convaincre :-)<br /></p>
<p>Prenant mon courage &agrave; deux mains et arm&eacute; de mon ami Google je d&eacute;cide d'ajouter des flux RSS dans tous les sens sur mon site. Pour cela je surf un peu et je tombe rapidement sur un article expliquant comment <a href="http://tweezersedge.com/archives/2003/10/000157.html" style="">ajouter un flux RSS pour les commentaires</a> sur Movable Type. Et pour les cat&eacute;gories j'ai trouv&eacute; un <a href="http://www.jacobsen.no/anders/blog/archives/2002/10/30/optimizing_movable_type_part_6_category_xml_feeds.html">autre tutorial</a>.<br /></p>
<p>Je reprend donc l'habillage propos&eacute; pour les commentaires et je le modifie &agrave; ma sauce. Je recherche ensuite comment faire de m&ecirc;me pour Atom mais je ne trouve pas grand chose. Au passage j'applique le tutoriel d'Anders Jacobsen et roule. Mes premiers essais sont assez concluants. Pour les&nbsp; flux de RSS pour les notes j'adapte tout b&ecirc;tement le tutoriel d'Anders : je reprend l'habillage global des commentaires pour cr&eacute;er une archive par note. Et roule.</p>
<p>Etape ultime j'ai modifi&eacute; mes index et mes fichiers d'archives pour ajouter les diff&eacute;rents flux RSS/Atom dans les pages sur lesquelles c'est pertinent.</p>
<p>Pour r&eacute;sumer vous trouverez donc sur mon site :</p>
<ul>
    <li>Un flux pour l'ensemble des billets. Ce flux est propos&eacute; aux formats RSS 1.0, RSS 2.0 et Atom. On trouve le lien directement sur la page d'accueil du site.<br /></li>
    <li>Un flux pour l'ensemble des commentaires du site (RSS 2.0 et Atom), directement sur la page d'accueil du site.</li>
    <li>Un flux pour chaque cat&eacute;gorie. Pour acc&eacute;der au lien il suffit de cliquer sur la cat&eacute;gorie en question sur la page d'accueil. Le lien se trouve en bas de la page d'archive de la cat&eacute;gorie.<br /></li>
    <li>Le lien vers le flux des commentaires d'une note n'est accessible que depuis la note en question. Sur la m&ecirc;me page les flux des cat&eacute;gories du billet sont d&eacute;clar&eacute;es dans l'ent&ecirc;te pour que votre navigateur puisse &eacute;ventuellement les d&eacute;tecter.<br /> </li>
</ul>
<p>Et, cerise sur le g&acirc;teau, pour ceux qui navigent avec un butineur qui reconnait les flux d&eacute;clar&eacute;s dans l'ent&ecirc;te de la page (Op&eacute;ra, Firefox, le futur IE 7) une petite ic&ocirc;ne devrait appara&icirc;tre qui pr&eacute;sente les flux disponibles.</p>
<p>Voici les mod&egrave;les que j'ai utilis&eacute; pour mon site :</p>

<p>Flux RSS des commentaires (type index, fichier commentaires.xml) :</p>
<pre style="height: 20em;" class="exemple">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;&lt;$MTPublishCharset$&gt;&quot;?&gt;
&lt;rss version=&quot;2.0&quot;&gt;
  &lt;channel&gt;
    &lt;title&gt;&lt;$MTBlogName remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt; - Commentaires&lt;/title&gt;
    &lt;link&gt;&lt;$MTBlogURL$&gt;&lt;/link&gt;
    &lt;description&gt;Derniers commentaires sur &lt;$MTBlogName remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/description&gt;
    &lt;language&gt;fr-fr&lt;/language&gt;
    &lt;lastBuildDate&gt;&lt;MTComments lastn=&quot;1&quot;&gt;&lt;$MTCommentDate language=&quot;en&quot; format=&quot;%a, %d %b %Y %H:%M:%S&quot;$&gt; &lt;$MTBlogTimezone no_colon=&quot;1&quot;$&gt;&lt;/MTComments&gt;&lt;/lastBuildDate&gt;
    &lt;generator&gt;http://www.movabletype.org/?v=&lt;$MTVersion$&gt;&lt;/generator&gt;
    &lt;docs&gt;http://blogs.law.harvard.edu/tech/rss&lt;/docs&gt;
&lt;MTComments lastn=&quot;20&quot; sort_order=&quot;descend&quot;&gt;
    &lt;item&gt;
      &lt;title&gt;&lt;MTCommentEntry&gt;&lt;$MTEntryTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/MTCommentEntry&gt; - &lt;$MTCommentAuthor encode_xml=&quot;1&quot;$&gt;&lt;/title&gt;
      &lt;link&gt;&lt;MTCommentEntry&gt;&lt;$MTEntryPermalink$&gt;&lt;/MTCommentEntry&gt;#comment-&lt;$MTCommentID$&gt;&lt;/link&gt;
      &lt;description&gt;&lt;$MTCommentBody encode_html=&quot;1&quot;$&gt; &lt;p&gt;- &lt;$MTCommentAuthorLink show_email=&quot;0&quot; encode_html=&quot;1&quot;$&gt;&lt;/p&gt;&lt;/description&gt;
      &lt;guid isPermaLink=&quot;false&quot;&gt;comment&lt;$MTCommentID pad=&quot;1&quot;$&gt;@&lt;$MTBlogURL$&gt;&lt;/guid&gt;
      &lt;pubDate&gt;&lt;$MTCommentDate language=&quot;en&quot; format=&quot;%a, %d %b %Y %H:%M:%S&quot;$&gt; &lt;$MTBlogTimezone no_colon=&quot;1&quot;$&gt;&lt;/pubDate&gt;
    &lt;/item&gt;
&lt;/MTComments&gt;
  &lt;/channel&gt;
&lt;/rss&gt;
</pre>

<p>Flux Atom des commentaires (type index, fichier commentaires.atom.xml) :</p>
<pre style="height: 20em;" class="exemple">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;&lt;$MTPublishCharset$&gt;&quot;?&gt;
&lt;feed xmlns=&quot;http://www.w3.org/2005/Atom&quot;&gt;
    &lt;title&gt;&lt;$MTBlogName remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt; - Commentaires&lt;/title&gt;
    &lt;id&gt;tag:&lt;$MTBlogHost exclude_port=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;,&lt;$MTDate format=&quot;%Y&quot;$&gt;:&lt;$MTBlogRelativeURL encode_xml=&quot;1&quot;$&gt;/comments/&lt;$MTBlogID$&gt;&lt;/id&gt;
    &lt;updated&gt;&lt;MTComments lastn=&quot;1&quot;&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/MTComments&gt;&lt;/updated&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;text/html&quot; href=&quot;&lt;$MTBlogURL encode_xml=&quot;1&quot;$&gt;&quot; /&gt;
    &lt;link rel=&quot;self&quot; type=&quot;application/atom+xml&quot; href=&quot;&lt;$MTBlogURL$&gt;commentaires.atom.xml&quot; /&gt;
    &lt;generator uri=&quot;http://www.sixapart.com/movabletype/&quot;&gt;Movable Type &lt;$MTVersion$&gt;&lt;/generator&gt;

&lt;MTComments lastn=&quot;20&quot; sort_order=&quot;descend&quot;&gt;
&lt;entry&gt;
    &lt;title&gt;&lt;MTCommentEntry&gt;&lt;$MTEntryTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/MTCommentEntry&gt;&lt;/title&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;text/html&quot; href=&quot;&lt;MTCommentEntry&gt;&lt;$MTEntryPermalink$&gt;&lt;/MTCommentEntry&gt;#comment-&lt;$MTCommentID$&gt;&quot; /&gt;
    &lt;id&gt;&lt;MTCommentEntry&gt;&lt;$MTEntryAtomID$&gt;.&lt;$MTCommentID$&gt;&lt;/MTCommentEntry&gt;&lt;/id&gt;
    &lt;published&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/published&gt;
    &lt;updated&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/updated&gt;
    &lt;summary type=&quot;html&quot;&gt;&lt;$MTCommentBody remove_html=&quot;1&quot; encode_xml=&quot;1&quot; $&gt;&lt;/summary&gt;
    &lt;author&gt;
        &lt;name&gt;&lt;$MTCommentAuthor encode_xml=&quot;1&quot; $&gt;&lt;/name&gt;
    &lt;/author&gt;
&lt;/entry&gt;
&lt;/MTComments&gt;

&lt;/feed&gt;
</pre>

<p>Flux RSS 2.0 des cat&eacute;gories (type archive cat&eacute;gorie, fichier %c/index.rss.xml) :</p>
<pre style="height: 20em;" class="exemple">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;&lt;$MTPublishCharset$&gt;&quot;?&gt;
&lt;rss version=&quot;2.0&quot;&gt;
&lt;channel&gt;
&lt;title&gt;&lt;$MTBlogName remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt; - &lt;$MTArchiveTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot; $&gt;&lt;/title&gt;
&lt;link&gt;&lt;$MTArchiveLink$&gt;&lt;/link&gt;
&lt;description&gt;&lt;$MTArchiveTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/description&gt;
&lt;copyright&gt;Copyright &lt;$MTDate format=&quot;%Y&quot;$&gt;&lt;/copyright&gt;
&lt;lastBuildDate&gt;&lt;MTEntries lastn=&quot;1&quot;&gt;&lt;$MTEntryDate format_name=&quot;rfc822&quot;$&gt;&lt;/MTEntries&gt;&lt;/lastBuildDate&gt;
&lt;generator&gt;http://www.movabletype.org/?v=&lt;$MTVersion$&gt;&lt;/generator&gt;
&lt;docs&gt;http://blogs.law.harvard.edu/tech/rss&lt;/docs&gt; 

&lt;MTEntries lastn=&quot;15&quot;&gt;
&lt;item&gt;
&lt;title&gt;&lt;$MTEntryTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/title&gt;
&lt;description&gt;&lt;$MTEntryBody encode_xml=&quot;1&quot;$&gt;&lt;/description&gt;
&lt;link&gt;&lt;$MTEntryPermalink encode_xml=&quot;1&quot;$&gt;&lt;/link&gt;
&lt;guid&gt;&lt;$MTEntryPermalink encode_xml=&quot;1&quot;$&gt;&lt;/guid&gt;
&lt;category&gt;&lt;$MTEntryCategory remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/category&gt;
&lt;pubDate&gt;&lt;$MTEntryDate format_name=&quot;rfc822&quot;$&gt;&lt;/pubDate&gt;
&lt;/item&gt;
&lt;/MTEntries&gt;

&lt;/channel&gt;
&lt;/rss&gt;
</pre>

<p>Flux Atom des cat&eacute;gories (type archive cat&eacute;gorie, fichier %c/index.atom.xml) :</p>
<pre style="height: 20em;" class="exemple">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;&lt;$MTPublishCharset$&gt;&quot;?&gt;
&lt;feed xmlns=&quot;http://www.w3.org/2005/Atom&quot;&gt;
    &lt;title&gt;&lt;$MTBlogName remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/title&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;text/html&quot; href=&quot;&lt;$MTArchiveLink encode_xml=&quot;1&quot;$&gt;&quot; /&gt;
    &lt;link rel=&quot;self&quot; type=&quot;application/atom+xml&quot; href=&quot;&lt;$MTArchiveLink encode_xml=&quot;1&quot;$&gt;atom.xml.php&quot; /&gt;
   &lt;id&gt;tag:&lt;$MTBlogHost exclude_port=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;,&lt;$MTDate format=&quot;%Y&quot;$&gt;:&lt;$MTBlogRelativeURL encode_xml=&quot;1&quot;$&gt;&lt;$MTBlogID$&gt;/C/&lt;$MTCategoryID$&gt;&lt;/id&gt;
    &lt;link rel=&quot;service.post&quot; type=&quot;application/atom+xml&quot; href=&quot;&lt;$MTCGIPath$&gt;&lt;$MTAtomScript$&gt;/weblog/blog_id=&lt;$MTBlogID$&gt;&quot; title=&quot;&lt;$MTBlogName encode_html=&quot;1&quot;$&gt;&quot; /&gt;
    &lt;updated&gt;&lt;MTEntries lastn=&quot;1&quot;&gt;&lt;$MTEntryModifiedDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/MTEntries&gt;&lt;/updated&gt;
    &lt;MTIfNonEmpty tag=&quot;MTArchiveTitle&quot;&gt;&lt;subtitle&gt;&lt;$MTArchiveTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/subtitle&gt;&lt;/MTIfNonEmpty&gt;
    &lt;generator uri=&quot;http://www.sixapart.com/movabletype/&quot;&gt;Movable Type &lt;$MTVersion$&gt;&lt;/generator&gt;
&lt;MTEntries lastn=&quot;15&quot;&gt;
&lt;entry&gt;
    &lt;title&gt;&lt;$MTEntryTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/title&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;text/html&quot; href=&quot;&lt;$MTEntryPermalink encode_xml=&quot;1&quot;$&gt;&quot; /&gt;
    &lt;link rel=&quot;service.edit&quot; type=&quot;application/atom+xml&quot; href=&quot;&lt;$MTCGIPath$&gt;&lt;$MTAtomScript$&gt;/weblog/blog_id=&lt;$MTBlogID$&gt;/entry_id=&lt;$MTEntryID$&gt;&quot; title=&quot;&lt;$MTEntryTitle encode_html=&quot;1&quot;$&gt;&quot; /&gt;
    &lt;id&gt;&lt;$MTEntryAtomID$&gt;&lt;/id&gt;
    
    &lt;published&gt;&lt;$MTEntryDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/published&gt;
    &lt;updated&gt;&lt;$MTEntryModifiedDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/updated&gt;
    
    &lt;summary type=&quot;html&quot;&gt;&lt;$MTEntryExcerpt remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/summary&gt;
    &lt;author&gt;
        &lt;name&gt;&lt;$MTEntryAuthorDisplayName encode_xml=&quot;1&quot;$&gt;&lt;/name&gt;
        &lt;MTIfNonEmpty tag=&quot;MTEntryAuthorURL&quot;&gt;&lt;uri&gt;&lt;$MTEntryAuthorURL encode_xml=&quot;1&quot;$&gt;&lt;/uri&gt;&lt;/MTIfNonEmpty&gt;
    &lt;/author&gt;
    &lt;MTEntryCategories&gt;
        &lt;category term=&quot;&lt;$MTCategoryLabel encode_xml=&quot;1&quot;$&gt;&quot; /&gt;
    &lt;/MTEntryCategories&gt;
    &lt;content type=&quot;html&quot; xml:lang=&quot;&lt;$MTBlogLanguage ietf=&quot;1&quot;$&gt;&quot; xml:base=&quot;&lt;$MTBlogURL encode_xml=&quot;1&quot;$&gt;&quot;&gt;
        &lt;$MTEntryBody encode_xml=&quot;1&quot;$&gt;
        &lt;$MTEntryMore encode_xml=&quot;1&quot;$&gt;
    &lt;/content&gt;
&lt;/entry&gt;
&lt;/MTEntries&gt;
&lt;/feed&gt;
</pre>

<p>Flux RSS 2.0 des commentaires d'une note (type archive de note, fichier %y/%m/commentaires_%F.rss.xml) :</p>
<pre style="height: 20em;" class="exemple">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;&lt;$MTPublishCharset$&gt;&quot;?&gt;
&lt;rss version=&quot;2.0&quot;&gt;
  &lt;channel&gt;
    &lt;title&gt;&lt;$MTArchiveTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt; - Commentaires&lt;/title&gt;
    &lt;link&gt;&lt;$MTArchiveLink encode_xml=&quot;1&quot;$&gt;&lt;/link&gt;
    &lt;description&gt;Derniers commentaires de la note &lt;$MTArchiveTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/description&gt;
    &lt;language&gt;fr-fr&lt;/language&gt;
    &lt;lastBuildDate&gt;&lt;MTComments lastn=&quot;1&quot;&gt;&lt;$MTCommentDate language=&quot;en&quot; format=&quot;%a, %d %b %Y %H:%M:%S&quot;$&gt; &lt;$MTBlogTimezone no_colon=&quot;1&quot;$&gt;&lt;/MTComments&gt;&lt;/lastBuildDate&gt;
    &lt;generator&gt;http://www.movabletype.org/?v=&lt;$MTVersion$&gt;&lt;/generator&gt;
    &lt;docs&gt;http://blogs.law.harvard.edu/tech/rss&lt;/docs&gt;
&lt;MTComments sort_order=&quot;descend&quot;&gt;
    &lt;item&gt;
      &lt;title&gt;&lt;MTCommentEntry&gt;&lt;$MTEntryTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/MTCommentEntry&gt; - &lt;$MTCommentAuthor encode_xml=&quot;1&quot;$&gt;&lt;/title&gt;
      &lt;link&gt;&lt;MTCommentEntry&gt;&lt;$MTEntryPermalink$&gt;&lt;/MTCommentEntry&gt;#comment-&lt;$MTCommentID$&gt;&lt;/link&gt;
      &lt;description&gt;&lt;$MTCommentBody encode_html=&quot;1&quot;$&gt; &lt;p&gt;- &lt;$MTCommentAuthorLink show_email=&quot;0&quot; encode_html=&quot;1&quot;$&gt;&lt;/p&gt;&lt;/description&gt;
      &lt;guid isPermaLink=&quot;false&quot;&gt;comment&lt;$MTCommentID pad=&quot;1&quot;$&gt;@&lt;$MTBlogURL$&gt;&lt;/guid&gt;
      &lt;pubDate&gt;&lt;$MTCommentDate language=&quot;en&quot; format=&quot;%a, %d %b %Y %H:%M:%S&quot;$&gt; &lt;$MTBlogTimezone no_colon=&quot;1&quot;$&gt;&lt;/pubDate&gt;
    &lt;/item&gt;
&lt;/MTComments&gt;
  &lt;/channel&gt;
&lt;/rss&gt;
</pre>

<p>Flux Atom des commentaires d'une note (type archive de note, fichier %y/%m/commentaires_%F.atom.xml) :</p>
<pre style="height: 20em;" class="exemple">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;&lt;$MTPublishCharset$&gt;&quot;?&gt;
&lt;feed xmlns=&quot;http://www.w3.org/2005/Atom&quot;&gt;
    &lt;title&gt;&lt;$MTArchiveTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt; - Commentaires&lt;/title&gt;
    &lt;id&gt;&lt;$MTEntryAtomID$&gt;/comments&lt;/id&gt;
    &lt;updated&gt;&lt;MTComments lastn=&quot;1&quot;&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/MTComments&gt;&lt;/updated&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;text/html&quot; href=&quot;&lt;$MTArchiveLink encode_xml=&quot;1&quot;$&gt;&quot; /&gt;
    &lt;link rel=&quot;self&quot; type=&quot;application/atom+xml&quot; href=&quot;&lt;$MTBlogArchiveURL encode_xml=&quot;1&quot;$&gt;&lt;$MTFileTemplate format=&quot;%y/%m/commentaires_%F.atom.xml&quot; encode_xml=&quot;1&quot;$&gt;&quot; /&gt;
    &lt;generator uri=&quot;http://www.sixapart.com/movabletype/&quot;&gt;Movable Type &lt;$MTVersion$&gt;&lt;/generator&gt;

&lt;MTComments lastn=&quot;20&quot; sort_order=&quot;descend&quot;&gt;
&lt;entry&gt;
    &lt;title&gt;&lt;MTCommentEntry&gt;&lt;$MTEntryTitle remove_html=&quot;1&quot; encode_xml=&quot;1&quot;$&gt;&lt;/MTCommentEntry&gt;&lt;/title&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;text/html&quot; href=&quot;&lt;MTCommentEntry&gt;&lt;$MTEntryPermalink$&gt;&lt;/MTCommentEntry&gt;#comment-&lt;$MTCommentID$&gt;&quot; /&gt;
    &lt;id&gt;&lt;MTCommentEntry&gt;&lt;$MTEntryAtomID$&gt;.&lt;$MTCommentID$&gt;&lt;/MTCommentEntry&gt;&lt;/id&gt;
    &lt;published&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/published&gt;
    &lt;updated&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%SZ&quot;$&gt;&lt;/updated&gt;
    &lt;summary type=&quot;html&quot;&gt;&lt;$MTCommentBody remove_html=&quot;1&quot; encode_xml=&quot;1&quot; $&gt;&lt;/summary&gt;
    &lt;author&gt;
        &lt;name&gt;&lt;$MTCommentAuthor encode_xml=&quot;1&quot; $&gt;&lt;/name&gt;
    &lt;/author&gt;
&lt;/entry&gt;
&lt;/MTComments&gt;

&lt;/feed&gt;
</pre>
<p>Déclaration des flux dans les archives individuelles</p>
<pre class="exemple">
[...]
&lt;link rel=&quot;stylesheet&quot; href=&quot;&lt;$MTBlogURL$&gt;styles-site.css&quot; type=&quot;text/css&quot; /&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;Billets (RSS 1.0)&quot; href=&quot;&lt;$MTBlogURL$&gt;index.rdf.php&quot; /&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;Billets (RSS 2.0)&quot; href=&quot;&lt;$MTBlogURL$&gt;index.xml.php&quot; /&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/atom+xml&quot; title=&quot;Billets (Atom)&quot; href=&quot;&lt;$MTBlogURL$&gt;atom.xml.php&quot; /&gt;
&lt;MTEntryCategories&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;&lt;$MTCategoryLabel encode_xml=&quot;1&quot;$&gt; (RSS 2.0)&quot; href=&quot;&lt;$MTCategoryArchiveLink$&gt;index.rss.php&quot; /&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;&lt;$MTCategoryLabel encode_xml=&quot;1&quot;$&gt; (Atom)&quot; href=&quot;&lt;$MTCategoryArchiveLink$&gt;index.atom.php&quot; /&gt;
&lt;/MTEntryCategories&gt;
&lt;MTIfCommentsActive&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;Commentaires (RSS 2.0)&quot; href=&quot;&lt;$MTBlogURL$&gt;commentaires.xml&quot; /&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/atom+xml&quot; title=&quot;Commentaires (Atom)&quot; href=&quot;&lt;$MTBlogURL$&gt;commentaires.atom.xml&quot; /&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/atom+xml&quot; title=&quot;Commentaires de la note au format Atom&quot; href=&quot;&lt;$MTBlogArchiveURL encode_xml=&quot;1&quot;$&gt;&lt;$MTFileTemplate format=&quot;%y/%m/commentaires_%F.atom.xml&quot; encode_xml=&quot;1&quot;$&gt;&quot; /&gt;
&lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;Commentaires de la note au foramt RSS 2.0&quot; href=&quot;&lt;$MTBlogArchiveURL encode_xml=&quot;1&quot;$&gt;&lt;$MTFileTemplate format=&quot;%y/%m/commentaires_%F.rss.xml&quot; encode_xml=&quot;1&quot;$&gt;&quot; /&gt;
&lt;/MTIfCommentsActive&gt;
[...]
</pre>
<p>Je vous laisse les autres fichiers d'archive ou d'index en exercice... mais le principe est globalement le même.</p>
]]>
    </content>
</entry>

<entry>
    <title>Calcul de la distance entre deux points &quot;GPS&quot;</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2006/05/calcul-de-la-di.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=297" title="Calcul de la distance entre deux points &quot;GPS&quot;" />
    <id>tag:www.zeguigui.com,2006:/weblog//1.297</id>
    
    <published>2006-05-19T09:55:28Z</published>
    <updated>2007-10-26T09:14:02Z</updated>
    
    <summary type="html">Pour celles et ceux qui voudraient connaître une méthode rapide pour calculer la distance à vol d&apos;oiseau entre deux points dont on connait les coordonnées GPS voici comment faire. Attention, allergiques aux math s&apos;abstenir :-)</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p><img width="255" height="255" class="illustration" alt="La Terre vue depuis Apollo 17 (merci la NASA !)" src="/weblog/uploads/Image/globe_terrestre.jpg" />Pour celles et ceux qui voudraient connaître une méthode rapide pour calculer la distance à vol d'oiseau entre deux points dont on connait les coordonnées GPS voici comment faire. Attention, allergiques aux math s'abstenir :-)</p>
<p>On suppose ici, pour simplifier, que la terre est une sphère. Je sais, ce n'est pas exact et le relief peut également intervenir (c'est pour ça que j'ai écrit à vol d'oiseau !). On suppose aussi que l'on dispose des coordonnées GPS (lattitude et longitude) en degrés et non pas en degrés, minutes, secondes.</p>
<p>La première étape consiste à convertir nos degrés en radians. Ca c'est facile, il suffit de tout multiplier par 2?/360.</p>
<p>Ensuite la distance c'est, si le point source a comme coordonnées (sourceLat, sourceLong) et le point destination (destLat, destLong) :</p>
<p>d = R * (Pi/2 - ArcSin( sin(destLat) * sin(sourceLat) + cos(destLong - sourceLong) * cos(destLat) * cos(sourceLat)))</p>
<p>L'unité de <em>d</em> dépendra de l'unité prise pour le rayon. Si celui-ci est exprimé en km alors la distance sera elle aussi en kilomètres.</p>
<p>Pour R je prend généralement 6378km.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Mes extensions firefox préférées</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2006/04/mes-extensions.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=286" title="Mes extensions firefox préférées" />
    <id>tag:www.zeguigui.com,2006:/weblog//1.286</id>
    
    <published>2006-04-21T23:01:32Z</published>
    <updated>2006-09-23T09:38:42Z</updated>
    
    <summary type="html">Le but de ce billet est de lister les extensions Firefox que j&apos;utilise le plus. Comme vous allez vite voir je ne suis pas pour surcharger l&apos;animal et je vais donc à l&apos;essentiel. AdBlock. Celle-là je crois que tout le...</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Divers" />
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[Le but de ce billet est de lister les extensions Firefox que j'utilise le plus. Comme vous allez vite voir je ne suis pas pour surcharger l'animal et je vais donc à l'essentiel.<br />
<ul>
    <li><a href="http://adblock.mozdev.org/">AdBlock</a>. Celle-là je crois que tout le monde devrait l'avoir. C'est un filtre qui permet de réécrire les pages à la volées pour faire disparaître un maximum de pub. Ca ne gère pas forcément les <em>intersticiels</em> mais c'est assez efficace pour certaines pubs envahissantes ! Remplace efficacement le proxomitron.<br />
    </li>
    <li><a href="http://users.skynet.be/mgueury/mozilla/">Html Validator</a>. Ca c'est mon côté développeur web qui resort ! Ca ajoute une chtite icône en bas de la page qui dit si la page est valide ou non ou s'il y a des avertissements. En pratique ça utilise <em>HtmlTidy</em> qui n'est pas parfait et signale parfois des erreurs là où le validateur du W3C n'en voit pas (l'inverse est parfois vrai mais nettement plus rare). Une extension pratique donc mais qui ne dispense pas de vérifier.</li>
    <li><a href="http://livehttpheaders.mozdev.org/">Live HTTP Header</a>. Là encore c'est pour du développement (90%) et la curiosité (10%). Ca permet de voir tout ce qui s'est passé entre le navigateur et le serveur web. Ca remplace la fenêtre de log du proxomitron.</li>
    <li>Tabbrowser Preferences permet d'améliorer la gestion des onglets de firefox (qui est déjà exemplaire !).</li>
    <li><a href="https://addons.mozilla.org/firefox/1269/">Fasterfox</a>... Ca je l'ai installé mais je ne sais pas si ça accélère vraiment. Quoi qu'il en soit ça me dit en combien de temps une page a été chargée ce qui peut-être rigolo :-)</li>
    <li><a href="http://www.chaosware.net/extensions/">TabFx</a> est une autre extension pour les onglets. Ca permet de rajouter un bouton de fermeture sur chaque onglet (plutôt que d'utiliser celui qui est tout à droite, qu'on peut conserver ou cacher).</li>
    <li><a href="http://sitebar.org/downloads.php">Bookmarks Synchronizer</a> (édition SiteBar). Celui là je ne peux plus m'en passer ! Ca permet d'avoir un fichier de signets quelque part sur internet et de le partager sur tous ses ordinateurs. Par exemple le navigateur à la maison, le navigateur au travail, etc. En plus ça génère des fichiers compatibles XBEL ce qui permet d'afficher le fichier sur mon site (oui, c'est la page liens !)</li>
    <li><a href="http://ted.mielczarek.org/code/mozilla/fxif/">FxIF</a> permet de visualiser les métadonnées EXIF d'une image en affichant les propriétés de cette dernière.</li>
    <li><a href="http://chrispederick.com/work/webdeveloper/">Web Developer</a> ajoute une barre dédiée au développement web. Elle permet de torturer une page directement depuis le navigateur ou d'aller directement sur les sites de validation.</li>
    <li><a href="http://performancing.com/firefox">Performancing</a> (que je suis en train d'utiliser à l'instant même) est un éditeur de blogs (en anglais). Ca permet d'ajouter des notes sur son blog sans pour autant devoir se connecter à l'interface de celui-ci. On verra à l'usage si je le conserve ou non mais quand on a plusieurs blogs ça évite de se souvenir des URL de chacun et de son login / pass. Bref à voir !</li>
</ul>
Si vous avez d'autres extensions que vous aimez bien, pensez à les indiquer dans les commentaires !]]>
        
    </content>
</entry>

<entry>
    <title>Mise à jour pour Sébastien ;-)</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2006/02/mise-a-jour-pou.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=265" title="Mise à jour pour Sébastien ;-)" />
    <id>tag:www.zeguigui.com,2006:/weblog//1.265</id>
    
    <published>2006-02-13T12:10:28Z</published>
    <updated>2010-01-07T13:43:43Z</updated>
    
    <summary type="html">Ce billet explique comment créer un fichier Google SiteMap pour Movable Type et donne un exemple de code PHP/MySQL pour créer un fichier similaire pour Gallery 2. A noter cependant que la version 2.1 de Gallery dispose d&apos;un module permettant d&apos;obtenir un tel fichier ce qui rend mon script obsolète (sauf qu&apos;il est un rien plus personnalisable donc je le laisse !).</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
        <category term="Vie du site" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[S&eacute;bastien trouvant que le flux RSS manque d'actualit&eacute; je cr&eacute;e une note rien que pour lui <img src="/weblog/Images/emoticons/wink_smile.gif" alt="" /><br /><br />Ce WE j'ai commenc&eacute; &agrave; jouer avec le Google SiteMap. Cette technique permet d'aider les moteurs de recherche &agrave; indexer le contenu du site en listant les URL disponibles et en leur donnant une priorit&eacute; (priorit&eacute; pour le webmaster... pas forc&eacute;ment pour le moteur de recherche !).<br /><br />Pour exp&eacute;rimenter cela j'ai cr&eacute;&eacute; un <em>template</em> pour Movable Type &agrave; partir de celui fourni par <a href="http://www.jacobsen.no/anders/blog/archives/2005/06/06/google_sitemaps_for_movable_type_now_with_correct_last_modified_dates.html">Anders Jacobsen</a> (pour les entr&eacute;es directes qui prennent en compte les commentaires) et celui de <a href="http://www.cbulock.com/2005/06/sitemaps_-_latest_update.html">Cameron</a>. Et &ccedil;a fonctionne plut&ocirc;t bien !<br /><br />Malheureusement le blog n'est pas la seule source d'information de ce site et j'ai donc &eacute;t&eacute; oblig&eacute; de modifier mon g&eacute;n&eacute;rateur de base DVD pour qu'il cr&eacute;e &eacute;galement un index sitemap. Coup de chance j'ai pu r&eacute;utiliser la modification que j'avais faite pour g&eacute;rer la liste des nouveaut&eacute;s (fonction demand&eacute;e par S&eacute;bastien justement).<br /><br />Restait &eacute;galement &agrave; cr&eacute;er un petit script pour g&eacute;n&eacute;rer un index SiteMap pour Gallery 2. L&agrave; je suis reparti de z&eacute;ro et j'ai tap&eacute; directement dans la base de donn&eacute;es... Le script que j'ai cr&eacute;&eacute; n'est vraiment pas optimis&eacute; mais &ccedil;a suffira en attendant la prochaine version de Gallery 2 qui elle incluera directement un module export SiteMap (que j'ai bien tent&eacute; d'ajout&eacute; &agrave; mon installation &agrave; partir du CVS mais il faudrait que je monte en version le reste de l'install ce que je ne compte pas faire vu que &ccedil;a fonctionne !).<br /><br />Le script pour MovableType et le script Gallery2 sont disponibles dans la suite !]]>
        <![CDATA[<h2>Habillage pour Movable Type</h2>
<pre class="code" style="height: 20em;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;urlset xmlns=&quot;http://www.google.com/schemas/sitemap/0.84&quot;&gt;<br /><br />&lt;url&gt;<br />&lt;loc&gt;&lt;$MTBlogURL encode_xml=&quot;1&quot;$&gt;&lt;/loc&gt;<br />&lt;priority&gt;1.0&lt;/priority&gt;<br />&lt;MTEntries lastn=&quot;1&quot;&gt;<br />&lt;lastmod&gt;&lt;$MTEntryModifiedDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%S+00:00&quot;$&gt;&lt;/lastmod&gt;<br />&lt;/MTEntries&gt;<br />&lt;changefreq&gt;daily&lt;/changefreq&gt;<br />&lt;/url&gt;<br /><br />&lt;MTEntries lastn=&quot;10&quot;&gt;<br />&lt;url&gt;<br />&lt;loc&gt;&lt;$MTEntryPermalink encode_xml=&quot;1&quot;$&gt;&lt;/loc&gt;<br />&lt;lastmod&gt;&lt;MTIfNonZero tag=&quot;MTEntryCommentCount&quot;&gt;&lt;MTComments lastn=&quot;1&quot;&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%S+00:00&quot;$&gt;&lt;/MTComments&gt;&lt;MTElse&gt;&lt;$MTEntryModifiedDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%S+00:00&quot;$&gt;&lt;/MTElse&gt;&lt;/MTIfNonZero&gt;<br />&lt;/lastmod&gt;<br />&lt;priority&gt;0.9&lt;/priority&gt;<br />&lt;changefreq&gt;daily&lt;/changefreq&gt;<br />&lt;/url&gt;<br />&lt;/MTEntries&gt;<br /><br />&lt;MTEntries lastn=&quot;10&quot; offset=&quot;10&quot;&gt;<br />&lt;url&gt;<br />&lt;loc&gt;&lt;$MTEntryPermalink encode_xml=&quot;1&quot;$&gt;&lt;/loc&gt;<br />&lt;lastmod&gt;&lt;MTIfNonZero tag=&quot;MTEntryCommentCount&quot;&gt;&lt;MTComments lastn=&quot;1&quot;&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%S+00:00&quot;$&gt;&lt;/MTComments&gt;&lt;MTElse&gt;&lt;$MTEntryModifiedDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%S+00:00&quot;$&gt;&lt;/MTElse&gt;&lt;/MTIfNonZero&gt;<br />&lt;/lastmod&gt;<br />&lt;priority&gt;0.8&lt;/priority&gt;<br />&lt;changefreq&gt;daily&lt;/changefreq&gt;<br />&lt;/url&gt;<br />&lt;/MTEntries&gt;<br /><br />&lt;MTEntries lastn=&quot;1000&quot; offset=&quot;20&quot;&gt;<br />&lt;url&gt;<br />&lt;loc&gt;&lt;$MTEntryPermalink encode_xml=&quot;1&quot;$&gt;&lt;/loc&gt;<br />&lt;lastmod&gt;&lt;MTIfNonZero tag=&quot;MTEntryCommentCount&quot;&gt;&lt;MTComments lastn=&quot;1&quot;&gt;&lt;$MTCommentDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%S+00:00&quot;$&gt;&lt;/MTComments&gt;&lt;MTElse&gt;&lt;$MTEntryModifiedDate utc=&quot;1&quot; format=&quot;%Y-%m-%dT%H:%M:%S+00:00&quot;$&gt;&lt;/MTElse&gt;&lt;/MTIfNonZero&gt;<br />&lt;/lastmod&gt;<br />&lt;priority&gt;0.5&lt;/priority&gt;<br />&lt;changefreq&gt;monthly&lt;/changefreq&gt;<br />&lt;/url&gt;<br />&lt;/MTEntries&gt;<br /><br />&lt;MTArchiveList archive_type=&quot;Category&quot;&gt;<br />&lt;url&gt;<br />&lt;loc&gt;&lt;$MTArchiveLink encode_xml=&quot;1&quot;$&gt;&lt;/loc&gt;<br />&lt;changefreq&gt;weekly&lt;/changefreq&gt;<br />&lt;priority&gt;0.6&lt;/priority&gt;<br />&lt;/url&gt;<br />&lt;/MTArchiveList&gt;<br /><br />&lt;MTArchiveList archive_type=&quot;Monthly&quot;&gt;<br />&lt;url&gt;<br />&lt;loc&gt;&lt;$MTArchiveLink encode_xml=&quot;1&quot;$&gt;&lt;/loc&gt;<br />&lt;changefreq&gt;monthly&lt;/changefreq&gt;<br />&lt;priority&gt;0.4&lt;/priority&gt;<br />&lt;/url&gt;<br />&lt;/MTArchiveList&gt;<br /><br />&lt;/urlset&gt;<br /></pre>
<h2>Petit script pour Gallery2</h2>
<pre class="code" style="height: 20em;">&lt;?<br />	header(&quot;Content-Type: text/xml; charset=utf-8&quot;);<br />	echo ('&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;');<br />?&gt;<br />&lt;urlset xmlns=&quot;http://www.google.com/schemas/sitemap/0.84&quot;&gt;<br />&lt;?<br />	// Sitemap for Gallery2 (waiting for CVS next release!)<br />	// Scratch from database... brute force !<br /><br />	//<br />	// HERE YOUR NEED TO SETUP AN ACCESS TO YOUR DATABASE<br />	// YOUR WEBSITE AND OTHER STUFF...<br />	// <br />	// Note: this site relies on URL rewriting!<br />	// You'll need to modify this script if table prefix is not 'g2_'<br />	// <br />	// Todo:<br />	// - check if comments exist and use last comment date<br />	// - use G2 module to handle URLs and configuration<br />	// <br />	define ('BdDServer',   'localhost');<br />	define ('BdDLogin',    'gallery2');<br />	define ('BdDPass',     'password');<br />	define ('BdDDatabase', 'gallery2');<br />	define ('rootURL',     'http://www.zeguigui.com/photos/v/');<br />	define ('albFreq',     'daily');<br />	define ('albPrio',     '0.8');<br />	define ('phoFreq',     'weekly');<br />	define ('phoPrio',     '0.5');<br /><br />	mysql_connect(BdDServer, BdDLogin, BdDPass) or die(&quot;Unable to connect: &quot; . mysql_error());<br />	mysql_select_db(BdDDatabase);<br />	<br />	function getURL($id, $album) {<br />		// Looks like i am a recursive function... oops!<br />		<br />		$sql = 'select c.g_id, c.g_parentId, f.g_pathComponent '<br />		     . 'from g2_ChildEntity c, g2_FileSystemEntity f '<br />		     . 'where c.g_id = f.g_id and '<br />		     . &quot;c.g_id = $id&quot;;<br />				 <br />		$s = mysql_query ($sql) or die ('Error in getURL: ' . mysql_error());<br />		$r = mysql_fetch_array ($s);<br />		mysql_free_result ($s);<br />		<br />		if ($r['g_parentId'] == 0) {<br />			return rootURL;<br />		} else {<br />			if ($album) {<br />				return getURL($r['g_parentId'], true) . $r['g_pathComponent'] . '/';<br />			} else {<br />				return getURL($r['g_parentId'], true) . $r['g_pathComponent'] . '.html';<br />			}<br />		}<br />	}<br />	<br />	// Add albums to Google Index<br />	$sql = 'SELECT i.g_id, i.g_title, i.g_originationTimestamp '<br />   	     . 'FROM g2_Item i, g2_AlbumItem a '<br />	     . 'WHERE a.g_id = i.g_id';<br />			 <br />	$statement = mysql_query ($sql) or die (&quot;Error: &quot; . mysql_error());<br />	while ($row = mysql_fetch_array($statement)) {<br />		$url = getURL ($row['g_id'], true);<br />?&gt;<br />	&lt;url&gt;<br />		&lt;loc&gt;&lt;?= $url ?&gt;&lt;/loc&gt;<br />		&lt;lastmod&gt;&lt;?= gmdate('Y-m-d', $row['g_originationTimestamp']) . 'T' .<br />			     gmdate('H:i', $row['g_originationTimestamp']) . 'Z'<br />			 ?&gt;&lt;/lastmod&gt;<br />		&lt;changefreq&gt;&lt;?= albFreq ?&gt;&lt;/changefreq&gt;<br />		&lt;priority&gt;&lt;?= albPrio ?&gt;&lt;/priority&gt;<br />	&lt;/url&gt;<br />&lt;?<br />	}<br />	mysql_free_result ($statement);<br /><br />	// Photos<br />	$sql = 'SELECT i.g_id, i.g_title, i.g_originationTimestamp '<br />	     . 'FROM g2_Item i, g2_PhotoItem p '<br />	     . 'WHERE p.g_id = i.g_id';<br />			 <br />	$statement = mysql_query ($sql) or die (&quot;Erreur : &quot; . mysql_error());<br />	while ($row = mysql_fetch_array($statement)) {<br />		$url = getURL ($row['g_id'], false);<br />?&gt;<br />	&lt;url&gt;<br />		&lt;loc&gt;&lt;?= $url ?&gt;&lt;/loc&gt;<br />		&lt;lastmod&gt;&lt;?= gmdate('Y-m-d', $row['g_originationTimestamp']) . 'T' .<br />			     gmdate('H:i', $row['g_originationTimestamp']) . 'Z'<br />			 ?&gt;&lt;/lastmod&gt;<br />		&lt;changefreq&gt;&lt;?= phoFreq ?&gt;&lt;/changefreq&gt;<br />		&lt;priority&gt;&lt;?= phoPrio ?&gt;&lt;/priority&gt;<br />	&lt;/url&gt;<br />&lt;?<br />	}<br />	mysql_free_result ($statement);<br /><br />	mysql_close();<br />?&gt;<br />&lt;/urlset&gt;</pre>
<p><strong>Note :</strong> je n'ai pas test&eacute; le script Gallery2 tel que... Je viens de le modifier pour le rendre un peu plus param&eacute;trable et pour qu'il soit exploitable en dehors de mon installation personnelle. N'h&eacute;sitez pas &agrave; me laisser un commentaire s'il y a un probl&egrave;me avec.</p>
<p><strong>Mise à jour&nbsp;:</strong> vu le grand nombre de spams reçus en commentaire sur cette note, j'ai décidé de fermer les commentaires&nbsp;!</p>]]>
    </content>
</entry>

<entry>
    <title>Comment formater une partition de plus de 32Go en FAT32 !?</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2005/06/comment-formate.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=228" title="Comment formater une partition de plus de 32Go en FAT32 !?" />
    <id>tag:www.zeguigui.com,2005:/weblog//1.228</id>
    
    <published>2005-06-21T09:17:01Z</published>
    <updated>2007-07-05T11:17:31Z</updated>
    
    <summary type="html">Mais comment faire pour dépasser la barrière des 32Go pour un formatage en FAT32 ?</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p>J'ai récemment fait l'acquisition d'un disque dur externe qui propose la fonction "OTG". Cette fonction permet de copier le contenu d'un périphérique USB (comme un appareil photo ou une clé USB) directement sans passer par un PC. Pour un fan de photo comme moi c'est assez pratique lorsqu'on part en vacances... </p>

<p>Le seul soucis c'est que cette fonction OTG ne fonctionne QUE si le disque dur est formatté en FAT32. Cela semble assez logique puisque le NTFS est bien plus compliqué à gérer...</p>]]>
        <![CDATA[<p>Me voici donc à vouloir formater le disque dur de 40Go en FAT32... Or windows XP ne permet pas de formater les partitions de plus de 32Go en FAT32 pour des raisons de taille de cluster qui sont trop importantes à partir de 32Go. J'ai essayé la ligne de commande mais après avoir testé tous les secteurs du disque celle-ci dit que le formatage n'aura pas lieu (dommage&nbsp;!).</p>

<p>Les autres solutions trouvées sur le net était de passer par Partition Magic (mais payant et je ne voulais pas l'acheter rien que pour ça), Ranish Partition Manager (gratuit lui !) ou encore de booter sur le CD d'installation de Windows XP qui n'a pas cette limite... oui mais le disque dur est en USB et Ranish Partition Manager comme le CD de démarrage demandent de rebooter le PC et donc on ne voit plus le disque dur externe.</p>

<p>J'étais résigné à booter sur une Knoopix (distribution linux qui n'a pas besoin d'être installée) quand je suis tombé sur l'utilitaire <a href="http://www1.mager.org/mkdosfs/">mkdosfs</a> (qui vient de linux justement) mais compilé pour windows. Téléchargement, décompression de l'archive, une ligne de commande plus tard le disque dur était formaté en FAT32&nbsp;!</p>

<p>Une histoire qui se finit bien... &Agrave; noter que comme d'habitude je suis tombé sur le seul disque externe qui avait un défaut (arrêt du disque au bout de 15/20s de copie avec un bruit symptomatique de futurs problèmes). &Eacute;changé (en fait remboursé puis racheté) chez Carrefour lundi soir sans aucun soucis... quelques fois passer par une enseigne traditionnelle a du bon&nbsp;!</p>

<p>Mise à jour du 5 juillet 2007 : le lien vers vers mkdosfs a changé (merci à Franchil de m'avoir signalé le lien mort)... on remarque aussi que 2 ans après sa première publication cet article est toujours d'actualité, sauf en ce qui concerne les disques USB&nbsp;: certaines cartes mères récentes scannent le bus USB et il est donc possible que le disque soit vu par des outils comme Ranish. Si certains ont réussi laissez un commentaire</p>]]>
    </content>
</entry>

<entry>
    <title>Désécuriser des pages sous Apache</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2005/01/desecuriser-des.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=277" title="Désécuriser des pages sous Apache" />
    <id>tag:www.zeguigui.com,2005:/weblog//1.277</id>
    
    <published>2005-01-12T20:53:02Z</published>
    <updated>2006-04-06T19:59:31Z</updated>
    
    <summary type="html">Vous savez tous comment sécuriser des pages pour demander un identifiant et un mot de passe sous Apache ? Normal, de nombreux sites web en discutent... Mais si vous avez déjà cherché à dé-sécuriser un sous-répertoire d&apos;un répertoire protégé (!) vous aurez peut-être plus de mal à trouver des explications. Comme j&apos;ai moi-même cherché pendant un petit moment je vous livre ici ma solution. Note : il faut avoir accès à la configuration du serveur ou du moins aux fichiers .htaccess et ceci n&apos;est donc d&apos;aucune utilité aux script kiddies.</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p>Ne vous m&eacute;prenez pas sur le but de cet article. Le but n'est pas de <em>casser</em> le serveur web Apache mais plut&ocirc;t de jouer avec ses options de configuration. Le but est de vous montrer comment am&eacute;liorer la gestion de la s&eacute;curit&eacute; d'acc&egrave;s a ses pages.</p>
<h2>Les pr&eacute;liminaires</h2>
<p>Le nombre de sites web qui expliquent comment configurer apache par un .htaccess pour interdire l'acc&egrave;s non autoris&eacute; &agrave; des pages d'un site ne manquent pas. Cependant comme c'est un pr&eacute;-requis pour aller plus loin je vais faire un rapide r&eacute;sum&eacute;.</p>
<p>On peut, dans Apache, modifier l'acc&egrave;s &agrave; des pages. Ceci se fait au niveau du fichier de configuration du serveur. On peut cependant autoris&eacute; les utilisateurs &agrave; reparam&eacute;trer &agrave; la vol&eacute;e l'acc&egrave;s &agrave; certain r&eacute;pertoires en utilisant des fichiers sp&eacute;ciaux (g&eacute;n&eacute;ralement nomm&eacute; .htaccess mais c'est param&eacute;trable). A noter aussi qu'un FAI peut interdire l'utilisation des .htaccess pour am&eacute;liorer les performances de son serveur web (qui n'a plus &agrave; v&eacute;rifier  l'existance de ces fichiers &agrave; chaque nouvel acc&egrave;s &agrave; un r&eacute;pertoire).</p>
<p>Pour s&eacute;curiser l'acc&egrave;s &agrave; un r&eacute;pertoire on utilise g&eacute;n&eacute;ralement un fichier de login / mot de passe stock&eacute;s dans un r&eacute;pertoire non visible depuis le web (soit en dehors de l'arborescence du serveur - ce qui est le plus s&eacute;curis&eacute; - soit dans un dossier lui-m&ecirc;me prot&eacute;g&eacute; par une interdiction totale d'acc&egrave;s en HTTP). On peut &eacute;galement utiliser la notion de groupes qui permet de limiter l'acc&egrave;s &agrave; un ou plusieurs groupes.</p>
<p>Ensuite il suffit d'&eacute;crire un petit .htaccess qui pourrait resembler &agrave; ceci, en partant du plus contraignant&nbsp;:</p>
<pre class="exemple">AuthUserFile /auth/.htpasswd<br />AuthName &quot;Secure Access&quot;<br />AuthType Basic require user toto </pre>
<pre class="exemple">AuthUserFile /auth/.htpasswd<br />AuthGroupFile /auth/.htgroups<br />AuthName &quot;Secure Access&quot;<br />AuthType Basic require group admin </pre>
<pre class="exemple">AuthUserFile /auth/.htpasswd<br />AuthName &quot;Secure Access&quot;<br />AuthType Basic require valid-user </pre>
<p>Dans le premier exemple seul l'utilisateur <tt>toto</tt> peut acc&eacute;der aux pages. Dans le deuxi&egrave;me exemple tout membre du groupe admin peut acc&eacute;der aux pages. Enfin dans le troisi&egrave;me tout utilisateur d&eacute;clar&eacute; dans le fichier .htpasswd peut acc&eacute;der aux pages. Bien entendu ceci suppose d'avoir connaissance du mot de passe&nbsp;!</p>
<p>Les fichier .htpasswd et .htgroups peuvent resembler &agrave; ceci&nbsp;:</p>
<pre class="exemple"># Fichier .htpasswd<br />toto:CryptedPassword<br />tutu:OtherCryptedPass<br />titi:SecurePass!<br /><br /># Fichier .htgroups<br />admin: titi toto<br />test: tutu titi </pre>
<p>L'avantage des groupes c'est que quand vous ajoutez un utilisateur &agrave; votre syst&egrave;me, si vous avez plusieurs zones logiques, il suffit d'ajouter l'utilisateur aux diff&eacute;rents groupes auxquels il a droit et hop tout le site est bon. Sans cela il faut aller &eacute;diter tous les fichier .htaccess (ou modifier le fichier de config du serveur) pour ajouter&nbsp;/ enlever l'utilisateur avec toujours le risque d'en oublier un quelque part. Bref d'un point de vue maintenance cela permet de tout centraliser... bien entendu si votre fichier central est mal prot&eacute;g&eacute; le ch&acirc;teau de cartes s'&eacute;croule&nbsp;!</p>
<h2>Hey, c'est r&eacute;cursif cette protection&nbsp;!</h2>
<p>Une fois un r&eacute;pertoire s&eacute;curis&eacute;, tous ses sous-r&eacute;pertoires se voient appliquer les m&ecirc;me restrictions. C'est dans 99,999% des cas une bonne chose mais il peut arriver qu'on d&eacute;sire modifier voire supprimer la s&eacute;curit&eacute; d'un r&eacute;pertoire. Pourquoi&nbsp;? Parce-que&nbsp;! Bon disons que par exemple vous s&eacute;curisez une zone de votre site web en l'appelant <tt>extranet</tt>. Dedans vous mettez les outils qui sont accessibles &agrave; votre collaborateurs et vous sp&eacute;cifiez que cette zone est crypt&eacute;e SSL. Et puis vous vous dites tient je vais mettre tel outil que j'ai trouv&eacute; qui a l'air sympa (IMP pour lire son mail&nbsp;?)...  et comme de juste cet outil propose sa propre authentification. Donc pour &eacute;viter le double login vous devez supprimer l'une ou l'autre des protection d'acc&egrave;s. G&eacute;n&eacute;ralement pour le logiciel c'est pas &eacute;vident... donc il faut supprimer la protection apache. Oui mais comment&nbsp;?</p>
<p>Une tentative pour mettre un .htaccess vide ne fonctionne pas. Zut, bien essay&eacute;. Mais alors comment lui faire comprendre &agrave; l'animal&nbsp;? En fait il suffit de ruser un peu. Il existe une directive permettant de restreindre les adresses IP qui peuvent se connecter au r&eacute;pertoire. Ainsi on peut s&eacute;curiser une zone en n'autorisant que les adresses IP du r&eacute;seau interne. C'est pas 100% s&ucirc;r (on peut usurper une adresse IP) mais c'est d&eacute;j&agrave; un bon d&eacute;but. On peut aussi dire <em>j'autorise/interdit n'importe quelle adresse IP</em>.</p>
<p>Voici par exemple un fichier qui interdit tout acces &agrave; un r&eacute;pertoire et ce quelle que soit l'adresse utilis&eacute;e. Un tel fichier est souvent plac&eacute; pour interdire &agrave; un client web de lire le contenu du r&eacute;pertoire qui peut contenir, au hasard, un fichier .htpasswd</p>
<pre class="exemple">Deny from all </pre>
<p>On peut donc se dire que si on utilise la directive <tt>Allow from all</tt> celle-ci va remplacer la s&eacute;curit&eacute; du r&eacute;pertoire... un rapide essai vous prouvera le contraire. En fait les directives se compl&egrave;tent. On pourrait en effet expliquer au serveur web qu'il faut que l'utilisateur soit valide ET qu'il se connecte depuis une adresse IP valide.</p>
<p>Heureusement il y a une solution. En fouillant un peu dans la documentation Apache on trouve la directive magique <tt>Satisfy</tt>. Celle-ci permet de modifier le mode de s&eacute;curisation par d&eacute;faut (un ET de toutes les directives) pour, par exemple, dire qu'une seule directive suffit. Exemple&nbsp;:</p>
<pre class="exemple">AuthUserFile /auth/.htpasswd<br />AuthName &quot;Secure Access&quot;<br /><br />AuthType Basic<br />require valid-user<br /><br />Order allow,deny<br />Allow from all<br /><br /><strong>Satisfy any </strong></pre>
<p>J'ai remis la directive de protection par utilisateur mais en r&eacute;alit&eacute; elle ne sera jamais utilis&eacute;e puisque dans cet exemple j'ai mis un &quot;Allow from all&quot;. La directive Order permet de dire qu'on commence par autoriser l'acc&egrave;s puis ensuite on applique les restrictions. Je ne pense pas que dans ce cas pr&eacute;ci cela change quelque chose mais je n'ai pas v&eacute;rifi&eacute;&nbsp;!</p>
<p>Autre exemple d'utilisation de la directive satisfy. Revenons &agrave; notre exemple d'extranet. Disons que depuis internet nous trouvions normal que les utilisateurs saisissent un  login et un mot de passe (&agrave; noter que cela pourrait tout aussi bien &ecirc;tre &quot;pr&eacute;senter un certificat SSL... mais l&agrave; n'est pas notre propos). Cependant en interne on peut d&eacute;cider d'autoriser toutes les machines &agrave; se connecter sans mot de passe.</p>
<p>Premi&egrave;re mauvaise id&eacute;e utiliser le nom de domaine pour le allow. Il ne faut <strong>surtout pas</strong> dire <tt>Allow from .mondomaine.com</tt> car il est plus facile d'usurper un nom qu'une adresse IP (du moins je pense, je ne suis pas expert en s&eacute;curit&eacute;&nbsp;!). Il faut donc donner le domaine d'adresse IP autoris&eacute;es (adresses qui si c'est bien fait ne seront pas routables sur internet).</p>
<p>Pour en savoir plus sur ce domaine je vous invite &agrave; lire en d&eacute;tail la documentation du serveur Apache. On trouve toujours plein de choses amusantes. A noter que tout ceci est valable pour une version 1.3 du serveur. Je n'ai pas exp&eacute;riment&eacute; sur une version 2.x donc si &ccedil;a ne fonctionne pas merci de m'envoyer un petit message&nbsp;!</p>]]>
        
    </content>
</entry>

<entry>
    <title>Tester le format PNG</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2005/01/tester-le-forma.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=278" title="Tester le format PNG" />
    <id>tag:www.zeguigui.com,2005:/weblog//1.278</id>
    
    <published>2005-01-11T21:00:27Z</published>
    <updated>2006-04-06T20:03:42Z</updated>
    
    <summary type="html">Le PNG est un format graphique qui a été définit au moment où le format GIF, énormément utilisé sur Internet, a été remis en question suite à des demandes de royalties. Sur le papier il présente bien des avantages : gestion de plus de 256 couleurs, transparence (totale ou alpha channel pour 256 degrés de transparence), taux de compression variable... Bref un concurrent aussi bien au GIF qu&apos;au JPEG. Cependant une gestion assez désastreuse de ce standard dans nombre de navigateurs fait qu&apos;il est souvent sous-employé. La page que je vous propose permet de constater de visu ce que rend le PNG avec une image assez complexe.

Note : cette page existe depuis très longtemps mais j&apos;avais oublié de faire un lien dessus :-)</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p>Cette page vous permet de tester la compatibilit&eacute; de votre navigateur avec le format graphique PNG (qui pr&eacute;sente plein d'avantages). Je suis parti d'une image avec un fond d&eacute;grad&eacute; blanc vers bleu + transparence de 100% pour le haut pour atteindre 0% dans le bas. J'ai ajout&eacute; une sph&egrave;re sans transparence sur le tout avec un  d&eacute;grad&eacute; de couleurs difficile &agrave; reproduire en GIF ou m&ecirc;me en JPEG. Enfin j'ai coup&eacute; un morceau de sph&egrave;re pour qu'il soit 100% transparent et ainsi mieux constater les diff&eacute;rences avec le d&eacute;grad&eacute; de transparence. &Agrave; titre de comparaison j'ai mis le .gif g&eacute;n&eacute;r&eacute;. Voici le r&eacute;sultat final.</p>
<table cellspacing="2" cellpadding="5">
    <tbody>
        <tr>
            <td>Couleur transparente, 16 millions de couleurs</td>
            <td><img width="150" height="150" border="0" src="/technique/testPNG/test_stc_16mcolors.png" alt="Test PNG" title="Test PNG" /></td>
        </tr>
        <tr>
            <td>Alpha chanel, 16 millions de couleurs</td>
            <td><img width="150" height="150" border="0" src="/technique/testPNG/test_alpha_16mcolors.png" alt="Test PNG" title="Test PNG" /></td>
        </tr>
        <tr>
            <td>Couleur transparente, palette</td>
            <td><img width="150" height="150" border="0" src="/technique/testPNG/test_stc_palette.png" alt="Test PNG" title="Test PNG" /></td>
        </tr>
        <tr>
            <td>Pas de transparence</td>
            <td><img width="150" height="150" border="0" src="/technique/testPNG/test_no_transp.png" alt="Test PNG" title="Test PNG" /></td>
        </tr>
        <tr>
            <td>Format gif</td>
            <td><img width="150" height="150" border="0" src="/technique/testPNG/test.gif" alt="Test GIF" title="Test GIF" /></td>
        </tr>
    </tbody>
</table>]]>
        
    </content>
</entry>

<entry>
    <title>Mise en page de mes sites web</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2005/01/mise-en-page-de.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=279" title="Mise en page de mes sites web" />
    <id>tag:www.zeguigui.com,2005:/weblog//1.279</id>
    
    <published>2005-01-10T21:04:43Z</published>
    <updated>2006-05-22T06:02:51Z</updated>
    
    <summary type="html">Sur Free et sur mon PC perso pour que ça fonctionne au mieux. C&apos;est une présentation générale qui explique comment je fais ma mise en page et quelles solutions j&apos;ai retenu. Bien entendu ça parle de PHP mais c&apos;est adaptable à tout langage gérant des includes (SHTML par exemple).</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<h2>Introduction</h2>
<p>Si comme moi vous aimez le <a href="http://www.php.net">PHP</a> et que vous le mettez &agrave; toutes les sauces sur votre site web, vous vous &ecirc;tes certainement pos&eacute; un certain nombre de questions. Je vais donc essayer ici de donner quelques &eacute;l&eacute;ments de r&eacute;ponses... qui ne sont pas exhaustifs mais seulement ce que j'ai personnellement retenu comme solution.</p>
<h2>Avoir son site web sur son PC et sur Free</h2>
<p>Je n'ai pas encore l'ADSL et donc je ne suis pas connect&eacute; en permanence &agrave; Internet. Or il faut bien tester son site perso pour se rendre compte de ce qu'il va donner. J'ai test&eacute; plusieurs solutions&nbsp;:</p>
<ul>
    <li>Apache + PHP</li>
    <li>IIS + PHP</li>
    <li>PWS + PHP</li>
</ul>
<p>Apache est la solution qui se rapproche le plus de la configuration de Free. Pourquoi Free&nbsp;? Parce que c'est un h&eacute;bergeur fran&ccedil;ais (comme moi) qui propose PHP (&agrave; l'exception de la fonction <tt>mail()</tt>), 100 Mo d'espace disque et qui est tr&egrave;s rapide.</p>
<p>Cependant comme vous pouvez le constater Apache n'est pas obligatoire. J'ai r&eacute;ussi &agrave; faire fonctionner mes sites web avec IIS (serveur Web de Microsoft sous NT/Windows 2000) et sous PWS (version de IIS adapt&eacute; &agrave; windows 98 et ME). Cependant le but de cette page <strong>n'est pas</strong> d'expliquer comment faire fonctionner PHP avec ces serveurs web. D'autre sites le font tr&egrave;s bien&nbsp;!</p>
<p>Ma configuration personnelle est PHP 4.0.5. Ce choix peut parra&icirc;tre surprenant &eacute;tant donn&eacute; que Free fonctionne toujours en version 3. Cependant avec un peu de rigueur et en regardant dans la doc &agrave; partir de quelle version une fonction est valide on s'en sort tr&egrave;s bien. J'ai modifi&eacute; le fichier <tt>php.ini</tt> et la configuration de mon serveur pour accepter les extensions .php et .php3. Cette derni&egrave;re est la seule utilisable sur free (pour le moment bien entendu).</p>
<p>Je n'ai pas install&eacute; MySQL (ce qui est une grave erreur ;-)) mais c'est en projet. Donc pour le moment mes scripts fonctionnent avec base sur free et sans base de donn&eacute;es chez moi... Ce qui n'est pas trop grave&nbsp;!</p>
<h2>Gestion des Includes</h2>
<p>Une des force de PHP est de pouvoir faire des <tt>include</tt> et des <tt>require</tt>. La diff&eacute;rence entre ces deux fonctions est expliqu&eacute;e dans la <a href="http://faqfciwap.free.fr/">FAQ</a> du newsgroup fran&ccedil;ais consacr&eacute; &agrave; PHP et je vous conseille fortement de la lire.</p>
<p>Cependant, je g&egrave;re plusieurs sites web... Donc l'utilisation de chemins absolus dans mes includes m&ecirc;me si elle fonctionne parfaitement sur le site de free ne me convient vraiment pas. Donc je m'arrange toujours pour que mes includes soient relatifs.</p>
<p>A un moment j'avais pens&eacute; utiliser la variable <tt>$PHP_SELF</tt> avec une fonction pour extraire la &quot;racine&quot; de mon site. Ca fonctionnait parfaitement sur mon PC mais je me suis aper&ccedil;u par la suite que $PHP_SELF prenait des valeurs &quot;&eacute;tranges&quot; chez Free... et avec PHP4 configur&eacute; en  module sur apache c'est pas mieux ;-)</p>
<p>Ma solution est donc <em>toute simple</em>. En d&eacute;but de chaque page j'identifie une variable $srcInclude que je positionne sur un r&eacute;pertoire dans lequel je stocke mes fichiers &agrave; include. Ensuite &ccedil;a va tout seul.</p>
<h2>Mise en page du site</h2>
<p>Pour la mise en page de mes sites, je suis parti d'une constatation simple&nbsp;: la structure des fichiers HTML est toujours la m&ecirc;me&nbsp;:</p>
<ul>
    <li>D&eacute;but de page HTML (principalement le doctype et la balise <tt>&lt;HTML&gt;</tt>)</li>
    <li>D&eacute;but de la section <tt>&lt;HEAD&gt;</tt> avec scripts, feuille de style, etc.</li>
    <li>Fin de la section <tt>&lt;HEAD&gt;</tt></li>
    <li>D&eacute;but de la section principale (<tt>&lt;BODY&gt;</tt>)</li>
    <li>Fin de la section principale</li>
    <li>Fin de la page HTML</li>
</ul>
<p>Je cr&eacute;e donc un fichier PHP par section... ou presque ;-) En effet entre la fin du HEAD et le d&eacute;but du BODY on n'ajoute g&eacute;n&eacute;ralement pas de code HTML.</p>
<h2>Exemple</h2>
<p>Par exemple, cette page web a la structure suivante&nbsp;:  </p>
<pre class="exemple">&lt;?php<br />&nbsp;$srcInclude = &quot;../include&quot;;<br />&nbsp;$pageTitle  = &quot;Includes sur Free&quot;;<br />&nbsp;require (&quot;$srcInclude/dpage.inc&quot;);<br />?&gt;<br />&lt;html&gt;<br />   &lt;head&gt;<br />&lt;?php<br />&nbsp;require (&quot;$srcInclude/head.inc&quot;);<br />?&gt;<br />   &lt;/head&gt;<br />   &lt;body&gt;<br />&lt;?php<br />&nbsp;require (&quot;$srcInclude/dbody.inc&quot;);<br />?&gt;<br />&lt;p&gt;Mes explications...&lt;/p&gt;<br />&lt;?php<br />&nbsp;require (&quot;$srcInclude/fbody.inc&quot;);<br />?&gt;<br />   &lt;/body&gt;<br />&lt;/html&gt;<br />&lt;?php<br />&nbsp;require (&quot;$srcInclude/fpage.inc&quot;);<br />?&gt; </pre>
<p>Vous remarquerez que j'ai choisi, pour ce site, de laisser les balises HEAD et autres dans mon code... Je trouve que &ccedil;a en simplifie la lecture tout en n'emp&ecirc;chant pas des effet de fond de page gr&acirc;ce aux feuilles de style (pourvu que le navigateur soit assez r&eacute;cent)... qui sont incluses dans le fichier head.inc (&agrave; noter aussi qu'il manque le DOCTYPE dans cet exemple !).<br /></p>
<h2>Avantages de ce syst&egrave;me</h2>
<p>L'avantage principal de ce syst&egrave;me est de s&eacute;parer le contenu de la pr&eacute;sentation chez un prestataire proposant le PHP. En effet tout le monde n'a pas de prestataire proposant XML, XPATH, XMLT, XSL et autres&nbsp;! L'autre avantage c'est que la pr&eacute;sentation est g&eacute;r&eacute;e par PHP... et autorise donc tout un tas de trucs sympas comme&nbsp;: </p>
<ul>
    <li>citation du jour (dans une base de donn&eacute;es par exemple)</li>
    <li>anniversaire du jour</li>
    <li>modification de l'aspect du site en fonction de param&egrave;tres comme, par exemple&nbsp;:
    <ul>
        <li>pr&eacute;f&eacute;rences de l'utilisateur stock&eacute;es dans un cookie (site <a href="http://www.msit.org">msit.org</a> par exemple)</li>
        <li>la date du jour (si la date est le 25 d&eacute;cembre alors utiliser tels fichiers)</li>
        <li>la r&eacute;solution de l'&eacute;cran (plus complexe... n&eacute;cessite javascript).</li>
    </ul>
    </li>
</ul>
<p>Comme tous les fichiers sont appel&eacute;s &agrave; chaque page il est &eacute;galement possible d'appeler une fonction &agrave; chaque fois (utilisation possible&nbsp;: statistiques de visite stock&eacute;es en base).</p>]]>
        
    </content>
</entry>

<entry>
    <title>Gestion des objets COM/DCOM en PHP4.</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2005/01/gestion-des-obj.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=280" title="Gestion des objets COM/DCOM en PHP4." />
    <id>tag:www.zeguigui.com,2005:/weblog//1.280</id>
    
    <published>2005-01-07T21:12:53Z</published>
    <updated>2006-04-06T20:16:47Z</updated>
    
    <summary type="html">Avec un objet COM fourni (sources + binaire) pour tester par vous-même. En utilisant MTS il est possible de rendre cet objet distant très facilement.</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<p>Bonjour... Comme beaucoup de monde se demande comment &ccedil;a fonctionne COM avec PHP4, et que je me suis aussi pos&eacute; la question, voici un petit exemple de code source et un objet COM pour le faire fonctionner. Comme cet objet n'est pas r&eacute;volutionnaire (il fourni un nombre al&eacute;atoire... difficile non ?) je vous le livre &quot;tel quel&quot; avec son code source (comme &ccedil;a les parano&iuml;aques pourront v&eacute;rifier ce qu'il fait). Pour des raisons de facilit&eacute;, je l'ai programm&eacute; avec Delphi 5, mais n'importe quel langage capable de produire des objets COM fera tout aussi bien l'affaire.</p>
<h2>L'objet COM</h2>
<p>Vous pouvez le t&eacute;l&eacute;charger en cliquant <a title="Fichier zip de 180ko" href="/technique/php4comtest.zip">ici</a> (180ko). L'installation est la m&ecirc;me que pour tout objet COM&nbsp;: il faut le copier dans un r&eacute;pertoire et dans une fen&ecirc;tre de commande (cmd sous NT, command.com sous 9x) saisir la commande suivante&nbsp;:</p>
<ul>
    <li>Installation&nbsp;: <tt>regsvr32 testPHP4.dll</tt></li>
    <li>D&eacute;sinstallation&nbsp;: <tt>regsvr32 /u testPHP4.dll</tt></li>
</ul>
<h2>Exemple de source PHP4</h2>
<p>Ce code appelle la commande n fois (param&eacute;trable) et calcule le temps qu'il faut pour le faire.</p>
<pre class="exemple">&lt;?php<br /> 	if (!isset($nbAppels))<br /> 	{<br /> 		$nbAppels = 100;<br /> 	}<br /> 	$comName = &quot;testPHP4.test&quot;;<br /> 	$debMTime = microtime();<br /> 	<br /> 	$tst = new COM($comName) or die(&quot;Unable to instanciate $comName&quot;);<br /> 	$stoquage = array();<br /> 	for ($i=0; $i &lt; $nbAppels; $i++)<br /> 	{<br /> 		$stoquage[$i] = $tst-&gt;randNumber();<br /> 	}<br /> 	sort($stoquage);<br /> 	$endMTime = microtime();<br /> 	<br /> 	list($msec, $sec) = explode(&quot; &quot;, $debMTime);<br /> 	$debut = $sec + $msec;<br /> 	<br /> 	list($msec, $sec) = explode(&quot; &quot;, $endMTime);<br /> 	$fin = $sec + $msec;<br /> 	<br /> 	echo &quot;&lt;P&gt;&lt;B&gt;R&eacute;sultats&lt;/B&gt;&nbsp;: &quot;.number_format($fin - $debut,4,',','').&quot; s.&lt;BR&gt;\n&quot;;<br /> ?&gt;<br /> </pre>]]>
        
    </content>
</entry>

<entry>
    <title>Les behaviors, mais qu&apos;est-ce donc ?</title>
    <link rel="alternate" type="text/html" href="http://www.zeguigui.com/weblog/archives/2005/01/les-behaviors-m.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.zeguigui.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=281" title="Les behaviors, mais qu'est-ce donc ?" />
    <id>tag:www.zeguigui.com,2005:/weblog//1.281</id>
    
    <published>2005-01-05T21:17:09Z</published>
    <updated>2006-04-06T20:25:30Z</updated>
    
    <summary type="html">Les behaviors ont été introduits avec IE5 et permettent de factoriser certain développements pour obtenir un comportement générique. Si vous êtez sous IE les boutons en haut de cette page sont développés grâce à un behavior assez simple.</summary>
    <author>
        <name>ZeGuigui</name>
        <uri>http://www.zeguigui.com</uri>
    </author>
    
        <category term="Technique" />
    
    <content type="html" xml:lang="fr" xml:base="http://www.zeguigui.com/weblog/">
        <![CDATA[<h2>Table des Mati&egrave;res</h2>
<ul>
    <li><a href="#prerequis">Pr&eacute;requis</a></li>
    <li><a href="#apercu">Aper&ccedil;u</a></li>
    <li><a href="#maizencor">Mais encore... &ccedil;a fait quoi ?</a></li>
    <li><a href="#komentcamarche">Comment &ccedil;a fonctionne ?</a></li>
    <li><a href="#fichierhtc">Et je met quoi dans le .htc ?</a></li>
    <li><a href="#exemple">Exemple complet</a></li>
    <li><a href="#ouimais">C'est g&eacute;nial... mais...</a></li>
    <li><a href="#conclusion">Conclusion</a></li>
</ul>
<h2 id="prerequis">Pr&eacute;requis</h2>
<p>Pour pouvoir appr&eacute;cier pleinement cette page il faut quelques pr&eacute;requis. Le premier est de regarder la page sous Internet Explorer 5 (ou plus). M&ecirc;me si les autres navigateurs peuvent lire la page les behaviors sont sp&eacute;cifiques &agrave; Microsoft et donc l'exemple ne peut-&ecirc;tre visualis&eacute; que sous cet environnement. Ensuite il faut quelques connaissances. Le HTML, les feuilles de style et le javascript sont un minimum &agrave;  conna&icirc;tre pour appr&eacute;cier compl&egrave;tement l'article (du moins dans les d&eacute;tails techniques).</p>
<h2 id="apercu">Aper&ccedil;u</h2>
<p>Les behaviors ont &eacute;t&eacute; introduits par Microsoft dans la version 5 d'Internet Explorer. Comme d'habitude c'est une <em>proposition pour le W3C</em>, doux euph&eacute;misme pour dire que c'est une extension propri&eacute;taire. Le but des behaviors est de s&eacute;parer encore plus le contenu de la pr&eacute;sentation. A ce titre c'est donc une <em>extension</em> des feuilles de style... et d'ailleurs &ccedil;a se positionne comme une feuille de style.</p>
<h2 id="maizencor">Mais encore... &ccedil;a fait quoi&nbsp;?</h2>
<p>Il &eacute;tait une fois le javascript... c'est en gros ce que se dit tout d&eacute;veloppeur de pages web qui d&eacute;sire faire des effets un peu sympa dans sa page. Le seul probl&egrave;me c'est que pour &eacute;crire du javascript un peu g&eacute;n&eacute;rique il faut se lever de bonne heure. Et pour le r&eacute;exploiter bof. On peut bien entendu mettre son code dans un fichier s&eacute;par&eacute; mais la r&eacute;utilisabilit&eacute; est limit&eacute;e.</p>
<p>L'autre probl&egrave;me de Javascript c'est que m&ecirc;me si on a fait un joli script permettant de modifier quelque chose en dynamique, il faut tout de m&ecirc;me l'appeler. Par exemple imaginons un tableau dont on d&eacute;sire modifier la couleur de fond des lignes quand la souris passe dedans. Ca veut dire que pour chaque ligne il faut &eacute;crire un gestionnaire <tt>onMouseOver</tt> et un gestionnaire <tt>onMouseOut</tt>. Sous IE &ccedil;a pourrait donner &ccedil;a&nbsp;:  </p>
<pre class="exemple">&lt;TABLE&gt;<br /> &lt;TR onMouseOver=&quot;this.bgColor='#CCCCCC';&quot; onMouseOut=&quot;this.bgColor='white';&quot;&gt;<br />    &lt;td&gt;Colonne 1&lt;/td&gt;<br />    &lt;td&gt;Colonne 2&lt;/td&gt;<br /> &lt;/TR&gt;<br /> &lt;TR onMouseOver=&quot;this.bgColor='#CCCCCC';&quot; onMouseOut=&quot;this.bgColor='white';&quot;&gt;<br />    &lt;td&gt;Colonne 1 ligne 2&lt;/td&gt;<br />    &lt;td&gt;Colonne 2 ligne 2&lt;/td&gt;<br /> &lt;/TR&gt;<br /> [...]<br /> &lt;/TABLE&gt; </pre>
<p>Bref on se rend compte que le <strong>comportement</strong> de la ligne est <strong>g&eacute;n&eacute;rique</strong> et on aimerait donc le factoriser. Ca tombe bien, c'est &agrave; &ccedil;a que sert un behavior (dont la traduction en fran&ccedil;ais est <em>comportement</em>... tient donc&nbsp;!).</p>
<h2 id="komentcamarche">Comment &ccedil;a fonctionne&nbsp;?</h2>
<p>En gros on fait un fichier <tt>.htc</tt> dans lequel on va &eacute;crire notre behavior de fa&ccedil;on g&eacute;n&eacute;rique. Comme le but c'est de g&eacute;rer l'&eacute;l&eacute;ment &agrave; la vol&eacute;e, le mot cl&eacute; <tt>this</tt> est associ&eacute; &agrave; l'&eacute;l&eacute;ment sur lequel est attach&eacute; le behavior. On peut alors jouer avec des <tt>this.style</tt> voir m&ecirc;me des <tt>this.className</tt> (attention tout de m&ecirc;me &agrave; conserver un behavior sur la nouvelle classe).</p>
<p>Ce behavior est ensuite attach&eacute; &agrave; n'importe quel &eacute;l&eacute;ment de la page HTML comme on attacherait un style. On a donc plusieurs options&nbsp;:</p>
<ul>
    <li>le mettre dans une classe de la feuille de style</li>
    <li>utiliser le mot cl&eacute; <tt>STYLE</tt> sur l'&eacute;l&eacute;ment &agrave; modifier</li>
</ul>
<p>Exemple de d&eacute;finition de style&nbsp;:</p>
<pre class="exemple">&lt;STYLE TYPE=&quot;text/css&quot;&gt;&lt;!--<br />    .beh    { behavior: url('monbehavior.htc'); }<br /> //--&gt;<br /> &lt;/STYLE&gt; </pre>
<p>On peut bien entendu mettre d'autre choses sur la classe comme <tt>color</tt> et autres... mais ce n'est pas un article sur les feuilles de style que je suis en train d'&eacute;crire&nbsp;! ;-)) La classe s'utilise tr&egrave;s facilement de par la suite. Pour revenir sur le tableau&nbsp;:</p>
<pre class="exemple">&lt;TABLE&gt;<br /> <br /> &lt;TR CLASS=&quot;beh&quot;&gt;<br />    &lt;td&gt;Colonne 1&lt;/td&gt;<br />    &lt;td&gt;Colonne 2&lt;/td&gt;<br /> &lt;/TR&gt;<br /> &lt;TR CLASS=&quot;beh&quot;&gt;<br />    &lt;td&gt;Colonne 1 ligne 2&lt;/td&gt;<br />    &lt;td&gt;Colonne 2 ligne 2&lt;/td&gt;<br /> &lt;/TR&gt;<br /> [...]<br /> &lt;/TABLE&gt; </pre>
<h2 id="fichierhtc">Et je met quoi dans le .htc&nbsp;?</h2>
<p>Le fichier .htc est en fait un fichier contenant deux parties distinctes&nbsp;: une partie d&eacute;clarative et une partie script. La partie d&eacute;clarative explique ce que fait le behavior et comment il s'ins&egrave;re dans la page tandis que la partie script impl&eacute;mente le comportement. C'est comme les packages en PL/SQL, les unit&eacute;s en Pascal ou les fichier .h / .cpp en C (sauf que pour les .htc tout est dans le m&ecirc;me fichier).</p>
<p><strong><big>Partie d&eacute;clarative</big></strong></p>
<p>C'est dans cette zone que l'on d&eacute;clare quels &eacute;v&eacute;nements on veut intercepter et que l'on d&eacute;clare de nouveaux attributs. En effet les behaviors permettent d'enrichir les balises standards pour passer des param&egrave;tres au behavior, le rendant ainsi plus g&eacute;n&eacute;rique (mais rien n'emp&ecirc;che d'avoir des valeurs par d&eacute;faut). Il est m&ecirc;me possible de d&eacute;clarer tout cela dynamiquement via un lot de fonctions sp&eacute;cialis&eacute;es.</p>
<p>Le plus simple c'est de prendre un exemple. Voici donc la partie d&eacute;clarative d'un fichier .htc assez simple.</p>
<pre class="exemple">&lt;PUBLIC:ATTACH EVENT=&quot;onmouseover&quot; ONEVENT=&quot;menuOver()&quot; /&gt;<br /> &lt;PUBLIC:ATTACH EVENT=&quot;onmouseout&quot;  ONEVENT=&quot;menuOut()&quot; /&gt;<br /> &lt;PUBLIC:PROPERTY INTERNALNAME=&quot;hiliteColor&quot; NAME=&quot;MOBGCOLOR&quot; /&gt; </pre>
<p>Comme vous pouvez le constater, la syntaxe est celle d'un fichier XML (comme l'indique le /&gt;). L'exemple ci-dessus est relativement simple. Les deux premi&egrave;res lignes indiquent que l'on veut g&eacute;rer les &eacute;v&eacute;nements <tt>onmouseover</tt> et <tt>onmouseout</tt> via les fonctions <tt>menuOver()</tt> et <tt>menuOut()</tt> qui sont alors automatiquement appel&eacute;e lorsque l'&eacute;v&eacute;nement source est d&eacute;clench&eacute;. La derni&egrave;re ligne permet de cr&eacute;er un nouvel attribut de balise qui s'appelle <tt>MOBGCOLOR</tt>. La valeur de cet attribut est stock&eacute;e dans la variable <tt>hiliteColor</tt>. Il est possible de pr&eacute;-initialiser cette variable dans la section script. Dans ce cas si l'attribut est pr&eacute;sent c'est sa valeur qui compte, sinon c'est la valeur par d&eacute;faut.</p>
<p><strong><big>Le script</big></strong></p>
<p>A chaque &eacute;v&eacute;nement intercept&eacute; on a affect&eacute; une fonction que l'on peut &eacute;crire en JScript, JavaScript (il y a de subtiles diff&eacute;rences), VBScript, etc. Personnellement j'utilise le JScript (impl&eacute;mentation enrichie de Javascript et d'ECMAScript) car les behavior sont d&eacute;j&agrave; du pur sp&eacute;cifique IE... alors pourquoi se priver de fonctionnalit&eacute;s suppl&eacute;mentaires&nbsp;?!</p>
<p>Comme pour tous les scripts, cette section commence par une balise <tt>&lt;SCRIPT&gt;</tt> et se termine par <tt>&lt;/SCRIPT&gt;</tt>. Il faut sp&eacute;cifier le langage dans la balise script pour &eacute;viter les surprises. Ainsi peut avoir&nbsp;:</p>
<pre class="exemple">&lt;SCRIPT LANGUAGE=&quot;JScript&quot;&gt;<br /> <br /> // On peut avoir besoin de variables globales, alors hop on en met. Elles<br /> // seront de toutes fa&ccedil;ons locales au behavior (sauf si pr&eacute;cis&eacute; autrement ;-)).<br /> var toto;<br /> <br /> function mouseOver()<br /> {<br /> 	// Ici plein de choses &agrave; faire lorsque la souris passe sur<br /> 	// un &eacute;l&eacute;ment actif.<br /> }<br /> <br /> function mouseOut()<br /> {<br /> 	// R&eacute;tablir l'&eacute;tat pr&eacute;c&eacute;dent<br /> }<br /> &lt;/SCRIPT&gt; </pre>
<p>Vous remarquerez qu'il n'est pas n&eacute;cessaire de prot&eacute;ger le script par les balises habituelle &lt;!-- et --&gt; car le script est inclus dans un fichier s&eacute;par&eacute;. Il n'y a donc pas de risques de mauvaise interpr&eacute;tation par un <em>vieux</em> navigateur qui de toutes fa&ccedil;ons ne lira pas la feuille de style (prot&eacute;g&eacute;e par commentaires) ni par les navigateurs plus r&eacute;cents incompatibles avec les behaviors qui, croisant un mot cl&eacute; inconnu, ignorera la d&eacute;claration.</p>
<h2 id="exemple">Exemple complet</h2>
<p>Au d&eacute;but de cet article j'avais pris comme exemple un tableau dont les lignes r&eacute;agissent &agrave; la pr&eacute;sence de la souris en changeant leur couleur de fond. Voici comment l'impl&eacute;menter avec les behaviors de fa&ccedil;on assez g&eacute;n&eacute;rique&nbsp;:</p>
<pre class="exemple">&lt;PUBLIC:ATTACH EVENT=&quot;onmouseover&quot; ONEVENT=&quot;Hilite()&quot; /&gt;<br /> &lt;PUBLIC:ATTACH EVENT=&quot;onmouseout&quot;  ONEVENT=&quot;Restore()&quot; /&gt;<br /> &lt;PUBLIC:PROPERTY INTERNALNAME=&quot;hiliteColor&quot; NAME=&quot;MOBGCOLOR&quot; /&gt;<br /> <br /> &lt;SCRIPT LANGUAGE=&quot;JScript&quot;&gt;<br /> <br /> var normalColor;<br /> var hiliteColor = &quot;#CCCCCC&quot;;<br /> <br /> function Hilite()<br /> {<br />    normalColor = style.backgroundColor;  <br />    runtimeStyle.backgroundColor  = hiliteColor;<br /> }<br /> <br /> function Restore()<br /> {<br />     runtimeStyle.backgroundColor  = normalColor;<br /> }<br /> &lt;/SCRIPT&gt; </pre>
<p>Vous remarquerez l'utilisation d'un attribut personnalis&eacute; ayant une valeur par d&eacute;faut via l'initialisation du script. Il est cependant possible de proc&eacute;der autrement en d&eacute;tournant l'&eacute;v&eacute;nement <tt>ondocumentready</tt> (qui est d&eacute;clench&eacute; lorsque le document parent est charg&eacute;) pour initialiser dynamiquement la variable et attacher les &eacute;v&eacute;nements (ce qui &eacute;vite leur utilisation tant que le document source n'est pas totalement charg&eacute;). Je trouve n&eacute;anmoins ma solution plus lisible car il n'est plus alors utile de lire la fonction <tt>init()</tt> pour savoir quels &eacute;v&eacute;nements sont g&eacute;r&eacute;s par le behavior. Voici un fichier HTML exemple&nbsp;:</p>
<pre class="exemple">&lt;HTML&gt;<br /> <br /> &lt;HEAD&gt;<br /> &lt;TITLE&gt;Exemple de behavior&lt;/TITLE&gt;<br /> &lt;STYLE type=&quot;text/css&quot;&gt;&lt;!--<br /> 	// On suppose que l'exemple pr&eacute;c&eacute;dent est stock&eacute; dans le m&ecirc;me r&eacute;pertoire que<br /> 	// ce fichier et sous le nom test.htc.<br /> 	exemple		{ behavior: url('test.htc'); }<br /> //--&gt;<br /> &lt;/STYLE&gt;<br /> &lt;/HEAD&gt;<br /> &lt;BODY&gt;<br /> &lt;TABLE WIDTH=&quot;100%&quot; CELLPADDING=&quot;2&quot; CELLSPACING=&quot;1&quot;&gt;<br /> &lt;TR CLASS=&quot;exemple&quot;&gt;<br />     &lt;TD&gt;Attribut personnalis&eacute;&lt;/TD&gt;<br />     &lt;TD&gt;inexistant&lt;/TD&gt;<br /> &lt;/TR&gt;<br /> &lt;TR CLASS=&quot;exemple&quot; MOBGCOLOR=&quot;white&quot;&gt;<br />     &lt;TD&gt;Attribut personnalis&eacute;&lt;/TD&gt;<br />     &lt;TD&gt;white&lt;/TD&gt;<br /> &lt;/TR&gt;<br /> &lt;/TABLE&gt;<br /> &lt;/BODY&gt;<br /> &lt;/HTML&gt; </pre>
<p>Cet exemple donne&nbsp;:</p>
<table width="100%" cellspacing="1" cellpadding="2" style="border: 2px solid rgb(0, 0, 128);">
    <tbody>
        <tr style="">
            <td>Attribut personnalis&eacute;</td>
            <td>inexistant</td>
        </tr>
        <tr mobgcolor="white" style="">
            <td>Attribut personnalis&eacute;</td>
            <td>white</td>
        </tr>
    </tbody>
</table>
<h2 id="ouimais">C'est g&eacute;nial... mais...</h2>
<p>Et oui, malheureusement, il y a un mais. Et de taille en plus. Le premier concerne l'utilisation de ces behaviors sur internet. Outre le fait que c'est sp&eacute;cifique &agrave; internet explorer il y a aussi la fa&ccedil;on dont c'est d&eacute;clar&eacute;. Si vous avez bien fait attention, on utilise la commande <tt>url</tt> soit dans le style, soit dans la classe. Or pour chaque <strong>instance</strong> &eacute;l&eacute;ment de la page auquel on affecte le behavior il va y avoir une requ&ecirc;te HTTP pour charger le fichier <tt>.htc</tt>. Vous allez me dire que ce n'est pas un probl&egrave;me avec le cache du navigateur... Certes... si le navigateur gardait le fichier en cache ce ne serait pas un probl&egrave;me (du moins chez moi il n'est pas conserv&eacute; en cache... mais &ccedil;a ne change rien car mes param&egrave;tres sont de v&eacute;rifier la pr&eacute;sence d'une <em>nouvelle version</em> des fichiers &agrave; chaque visite de la page... d'o&ugrave; des requ&ecirc;tes suppl&eacute;mentaires). Autrement dit si vous avez un tableau de 75 lignes il chargera 75 fois le fichier <tt>.htc</tt> ce qui n'est pas toujours tr&egrave;s rapide (surtout par modem&nbsp;!).</p>
<p>Second probl&egrave;me... J'ai parl&eacute; des variables que l'on pouvait d&eacute;clarer dans un script. J'ai m&ecirc;me dit que la variable &eacute;tait <strong>locale</strong> &agrave; chaque instance du behavior. Ca signifie que si vous d&eacute;clarez 5 variables et que vous avez 20 instances du behavior vous vous retrouvez avec une occupation m&eacute;moire de 5 x 20 = 100 variables. Sur des machines puissantes ce n'est pas trop un probl&egrave;mes mais il faut conserver ce fait en m&eacute;moire. La solution consiste &agrave; cr&eacute;er des variables dans le document appelant via un script d'initialisation puis de faire r&eacute;f&eacute;rence &agrave; ces variables dans le script... Pour peu que l'on puisse globaliser les variables bien entendu.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Ma conclusion c'est que j'aime bien les behaviors. Ca comble une lacune du javascript et des feuilles de style et permet de cr&eacute;er des composants un peu complexes r&eacute;utilisables. Sur le site de Microsoft par exemple ils utilisent les behaviors pour g&eacute;rer des pseudo treeviews de fa&ccedil;on tr&egrave;s simple. En cherchant un peu on arrive &agrave; des r&eacute;sultats spectaculaires comme par exemple l'utilisation de HTML dans les infobulles de Internet Explorer (celles qui s'affichent quand il y a un attribut TITLE sur un lien par exemple) permettant ainsi de jouer sur les retour &agrave; la ligne ou de mettre des images.</p>
<p>Enfin une derni&egrave;re remarque&nbsp;: je n'ai fait que vous donner un aper&ccedil;u de la puissance des behaviors. Si je vous dit que depuis IE5.5 on peut cr&eacute;er des composants appelables comme des balises en HTML, que l'on peut se faire des behavior en C++ ou qu'il y en a d'inclus dans IE5 pour g&eacute;rer la persistance vous aurez probablement envie d'aller plus loin... en lisant la doc compl&egrave;te sur le <a title="MSDN Workshop" href="http://msdn.microsoft.com/workshop/author/behaviors/overview.asp">site de Microsoft</a> (attention, c'est en anglais).</p>]]>
        
    </content>
</entry>

</feed>
