<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title>Le Weblog de ZeGuigui - Technique</title>
<link>http://www.zeguigui.fr/weblog/archives/technique/</link>
<description>Technique</description>
<copyright>Copyright 2008</copyright>
<lastBuildDate>Thu, 14 Nov 2008 08:00:00 +0100</lastBuildDate>
<generator>http://www.movabletype.org/?v=4.21-fr</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs> 


<item>
<title>Gérer sa médiathèque avec Movable Type v. 4</title>
<description><![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&eacute;grale tome 1 : Les d&eacute;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&eacute; sur ce site un changement d'envergure&nbsp;: l'ajout d'une m&eacute;diath&egrave;que. Celle-ci est g&eacute;r&eacute;e de fa&ccedil;on quasi automatique gr&acirc;ce &agrave; Movable Type et quelques plugins astucieux.&nbsp;</p>  <h2>Quelques pr&eacute;requis</h2> <p>D&eacute;j&agrave; il vous faut movable type... j'utilise la version 4.1 et donc tout ce que je vais &eacute;crire l&agrave; se rapporte &agrave; cette version. Cependant cette id&eacute;e de g&eacute;rer ma m&eacute;diath&egrave;que avec movable type est n&eacute;e &agrave; partir d'une exp&eacute;rience similaire <a href="http://bradchoate.com/weblog/2002/08/02/way-too-many-games">datant de 2002</a>. Id&eacute;e qu'il a fallut adapter pour suivre les &eacute;volutions de Movable Type notamment. On va supposer ici que Movable Type est install&eacute; 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&eacute; d'API Amazon. L&agrave; il faut causer un peu anglais pour pouvoir l'obtenir sur <a href="http://aws.amazon.com/">le site d&eacute;di&eacute;</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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2008/11/gerer_sa_mediat_2.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2008/11/gerer_sa_mediat_2.php</guid>
<category>Technique</category>
<pubDate>Thu, 14 Nov 2008 08:00:00 +0100</pubDate>
</item>

<item>
<title>ViaMichelin 3.x et Palm T|X...</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2008/01/viamichelin_3x.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2008/01/viamichelin_3x.php</guid>
<category>Technique</category>
<pubDate>Sat, 20 Jan 2008 19:50:17 +0100</pubDate>
</item>

<item>
<title>Dotclear 1.2.7 et les binettes... !</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2007/10/dotclear_127_et.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2007/10/dotclear_127_et.php</guid>
<category>Technique</category>
<pubDate>Tue, 03 Oct 2007 21:14:19 +0100</pubDate>
</item>

<item>
<title>Géolocalisation de ses photos</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2007/09/geolocalisation.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2007/09/geolocalisation.php</guid>
<category>Technique</category>
<pubDate>Sun, 03 Sep 2007 13:38:00 +0100</pubDate>
</item>

<item>
<title>Un plugin Movable Type pour identifier un auteur de commentaire</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2006/06/un_plugin_movab.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2006/06/un_plugin_movab.php</guid>
<category>Technique</category>
<pubDate>Tue, 14 Jun 2006 21:25:42 +0100</pubDate>
</item>

<item>
<title>Flux RSS, la totale sur ZeGuigui !</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2006/05/flux_rss_la_tot.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2006/05/flux_rss_la_tot.php</guid>
<category>Technique</category>
<pubDate>Mon, 23 May 2006 13:04:30 +0100</pubDate>
</item>

<item>
<title>Calcul de la distance entre deux points &quot;GPS&quot;</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2006/05/calcul_de_la_di.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2006/05/calcul_de_la_di.php</guid>
<category>Technique</category>
<pubDate>Thu, 19 May 2006 11:55:28 +0100</pubDate>
</item>

<item>
<title>Mes extensions firefox préférées</title>
<description><![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 !]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2006/04/mes_extensions.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2006/04/mes_extensions.php</guid>
<category>Divers</category>
<pubDate>Fri, 22 Apr 2006 01:01:32 +0100</pubDate>
</item>

<item>
<title>Mise à jour pour Sébastien ;-)</title>
<description><![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 !]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2006/02/mise_a_jour_pou.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2006/02/mise_a_jour_pou.php</guid>
<category>Technique</category>
<pubDate>Sun, 13 Feb 2006 13:10:28 +0100</pubDate>
</item>

<item>
<title>Comment formater une partition de plus de 32Go en FAT32 !?</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2005/06/comment_formate.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2005/06/comment_formate.php</guid>
<category>Technique</category>
<pubDate>Mon, 21 Jun 2005 11:17:01 +0100</pubDate>
</item>

<item>
<title>Désécuriser des pages sous Apache</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2005/01/desecuriser_des.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2005/01/desecuriser_des.php</guid>
<category>Technique</category>
<pubDate>Tue, 12 Jan 2005 21:53:02 +0100</pubDate>
</item>

<item>
<title>Tester le format PNG</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2005/01/tester_le_forma.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2005/01/tester_le_forma.php</guid>
<category>Technique</category>
<pubDate>Mon, 11 Jan 2005 22:00:27 +0100</pubDate>
</item>

<item>
<title>Mise en page de mes sites web</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2005/01/mise_en_page_de.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2005/01/mise_en_page_de.php</guid>
<category>Technique</category>
<pubDate>Sun, 10 Jan 2005 22:04:43 +0100</pubDate>
</item>

<item>
<title>Gestion des objets COM/DCOM en PHP4.</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2005/01/gestion_des_obj.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2005/01/gestion_des_obj.php</guid>
<category>Technique</category>
<pubDate>Thu, 07 Jan 2005 22:12:53 +0100</pubDate>
</item>

<item>
<title>Les behaviors, mais qu&apos;est-ce donc ?</title>
<description><![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>]]></description>
<link>http://www.zeguigui.fr/weblog/archives/2005/01/les_behaviors_m.php</link>
<guid>http://www.zeguigui.fr/weblog/archives/2005/01/les_behaviors_m.php</guid>
<category>Technique</category>
<pubDate>Tue, 05 Jan 2005 22:17:09 +0100</pubDate>
</item>


</channel>
</rss>