<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Retour à La Source • RSS</title>
		<link>http://www.ab-d.fr/</link>
		<description>Retour à La Source • RSS</description>
		<copyright>http://www.ab-d.fr/ (c) 2010</copyright>
		<language>fr</language>
		<pubDate>Wed, 10 Mar 2010 14:52:56 +0100</pubDate>
		<generator>Retour à La Source • RSS • version 1.0</generator>
		<webMaster>noreply@ab-d.fr ( Benoit Asselin )</webMaster>
		<image>
			<url>http://www.ab-d.fr/images/rss.gif</url>
			<title>Retour à La Source • RSS</title>
			<link>http://www.ab-d.fr/</link>
			<width>90</width>
			<height>30</height>
		</image>

		<item>
			<title>La fonction date() PHP traduite en français ( PHP, date )</title>
			<link>http://www.ab-d.fr/date/2010-02-01/</link>
			<pubDate>Mon, 01 Feb 2010 09:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<p>
Cette fonction se comporte exactement de la même manière que la fonction <code>date()</code> en PHP, mais traduite en français.
</p>
<pre>
function date_french($format, $timestamp = null) {
	$param_D = array('', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim');
	$param_l = array('', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche');
	$param_F = array('', 'Janvier', 'F&amp;eacute;vrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Ao&amp;ucirc;t', 'Septembre', 'Octobre', 'Novembre', 'D&amp;eacute;cembre');
	$param_M = array('', 'Jan', 'F&amp;eacute;v', 'Mar', 'Avr', 'Mai', 'Jun', 'Jul', 'Ao&amp;ucirc;', 'Sep', 'Oct', 'Nov', 'D&amp;eacute;c');

	$return = '';
	if(is_null($timestamp)) { $timestamp = mktime(); }
	for($i = 0, $len = strlen($format); $i < $len; $i++) {
		switch($format[$i]) {
			case '\\\\\\' : // double.slashes
				$i++;
				$return .= isset($format[$i]) ? $format[$i] : '';
				break;
			case 'D' :
				$return .= $param_D[date('N', $timestamp)];
				break;
			case 'l' :
				$return .= $param_l[date('N', $timestamp)];
				break;
			case 'F' :
				$return .= $param_F[date('n', $timestamp)];
				break;
			case 'M' :
				$return .= $param_M[date('n', $timestamp)];
				break;
			default :
				$return .= date($format[$i], $timestamp);
				break;
		}
	}
	return $return;
}

</pre>

<hr />
<a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2010-02-01%2F&title=La+fonction+date%28%29+PHP+traduite+en+fran%C3%A7ais+%28+PHP%2C+date+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2010-02-01/</guid>
		</item>

		<item>
			<title>Comment attribuer un rang aux lignes d'un résultat en MySQL ? ( sql )</title>
			<link>http://www.ab-d.fr/date/2009-09-23/</link>
			<pubDate>Wed, 23 Sep 2009 10:40:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[MySQL]]></category>
			<description><![CDATA[<p>
Lors de tries par page ou par ligne en base de données, il est parfois utile d'attribuer un rang pour chaque enregistrement. Voici une requête SQL qui vous permettra d'effectuer une telle opération :
</p>
<pre>
SELECT (
	SELECT COUNT(id) FROM table t2
	WHERE t2.titre &lt;= t1.titre 
	) AS rang , t1.*
FROM table t1
ORDER BY t1.titre
</pre>
<hr />
<a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2009-09-23%2F&title=Comment+attribuer+un+rang+aux+lignes+d%27un+r%C3%A9sultat+en+MySQL+%3F+%28+sql+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2009-09-23/</guid>
		</item>

		<item>
			<title>Désactiver l'anti-aliasing des polices sur NetBeans Mac OS X</title>
			<link>http://www.ab-d.fr/date/2009-08-11/</link>
			<pubDate>Tue, 11 Aug 2009 18:11:18 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[NetBeans]]></category>
			<description><![CDATA[<p>
Et non, ce blog n'est pas mort, ou du moins pas encore... même si le temps manque cruellement pour ajouter de petites astuces.
</p>
<p>
<img src="http://www.ab-d.fr/divers/netbeans-logo.png" alt="NetBeans" style="float:right;" />
La recette du jour est destinée à l'attention des MacUsers qui travaillent avec NetBeans (dernière version 6.7.1). Peut-être comme moi, vous regrettez de ne pouvoir utiliser la police "Monaco" en codant. Car il faut bien l'avouer cette typo avec un anti-aliasing n'est pas franchement lisible en petite taille. Heureusement, il existe UNE solution... Il "suffit" de désactiver le fameux anti-aliasing. Pour ce faire, il faut éditer le fichier suivant :
</p>

<p>
<code>NetBeans.app/Contents/Ressources/NetBeans/etc/netbeans.conf</code><br />
<em>( Rappel: clique-droit sur l'application NetBeans.app puis "Afficher le contenu du packet" )</em>
</p>
<p>
Trouver la ligne suivante :
</p>
<pre>
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true"

</pre>

<p>
Ensuite, ajouter <code>-J-Dswing.aatext=false -Dawt.useSystemAAFontSettings=false</code>, ce qui vous donnera :
</p>
<pre>
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-Dswing.aatext=false -Dawt.useSystemAAFontSettings=false"

</pre>

<p>
Vous enregistrez le fichier, vous relancez NetBeans, et l'opération est terminée ! Il ne vous reste plus qu'à choisir la police de votre choix dans les Préférences.
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2009-08-11%2F&title=D%C3%A9sactiver+l%27anti-aliasing+des+polices+sur+NetBeans+Mac+OS+X"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2009-08-11/</guid>
		</item>

		<item>
			<title>Toute votre musique préférée gratuite et en illimitée ( Spotify, invitation )</title>
			<link>http://www.ab-d.fr/date/2009-05-15/</link>
			<pubDate>Fri, 15 May 2009 20:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Detente]]></category>
			<category><![CDATA[MP3]]></category>
			<description><![CDATA[<p>
Aujourd'hui, je ne vous propose pas un morceau de code source, mais simplement un petit outil fort pratique pour vos oreilles et qui vous permettra d'augmenter votre cadence de travail avec un fond musical de premier choix et de bonne qualité.
</p>
<p>
<img src="http://www.spotify.com/wp-content/themes/spotify/images/logo.png" alt="Spotify" style="float:right;" />
Ainsi, je vous présente le logiciel Spofity :<br />
Ce logiciel est à mi-chemin entre iTunes et Deezer !<br />
Je vous laisse donc imaginer le reste...<br />
Toute la musique que vous désirez, est disponible gratuitement en écoute streaming (aucun fichier ne peut être chargé). Le logiciel contient quelques bannières de pub, et encore quelques rares jingles publicitaires. Une version payante vous permet d'enlever ces petits parasites.
</p>

<p>
Le logiciel est pour le moment en version bêta et les inscriptions semblent limitées à des invitations. 
Toutefois, si vous vous rendez directement à l'adresse suivante :<br />
<code>https://www.spotify.com/en/get-started/</code><br />
vous n'avez pas besoin d'invitation ;-)
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2009-05-15%2F&title=Toute+votre+musique+pr%C3%A9f%C3%A9r%C3%A9e+gratuite+et+en+illimit%C3%A9e+%28+Spotify%2C+invitation+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2009-05-15/</guid>
		</item>

		<item>
			<title>Internet Explorer 8, la nouvelle croix du développeur web ( EmulateIE7 )</title>
			<link>http://www.ab-d.fr/date/2009-03-24/</link>
			<pubDate>Tue, 24 Mar 2009 19:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Internet Explorer]]></category>
			<category><![CDATA[XHTML]]></category>
			<description><![CDATA[<p>
Peut-être comme moi, vous venez de découvrir Internet Explorer 8 et que ce dernier est un " peu " plus compatible que Internet Explorer 7... Toutefois, certaines pages fonctionnent mal vu la quantité de patch CSS appliqués pour fixer les soucis de IE7, IE6, etc...
</p>

<p>
Microsoft a donc pensé à tout ! Il nous a sorti une balise META qui permet d'indiquer à Internet Explorer 8 la version du moteur graphique à utiliser. Pour forcer un rendu IE7 et non IE8, il suffit d'injecter la META ci-dessous :
</p>

<pre>
&lt;meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /&gt;
</pre>

<p>
<em>Chose assez amusante, on pourrait croire que le site officiel de Microsoft est parfaitement compatible Internet Explorer 8, et qu'il n'a pas du tout besoin de cette META... et bien il n'en est rien, leur code source contient aussi la dite balise ! " Vive Microsoft ! "</em>
</p>
<p>
<em>Pendant ce temps, on doit toujours faire attention à Internet Explorer 6, utilisé par environ 1/4 des surfeurs du Web... Heureusement, ce chiffre baisse de mois en mois.</em>
</p>

<p>
Documentation MSDN :<br />
&bull; http://msdn.microsoft.com/en-us/library/cc817574.aspx
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2009-03-24%2F&title=Internet+Explorer+8%2C+la+nouvelle+croix+du+d%C3%A9veloppeur+web+%28+EmulateIE7+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2009-03-24/</guid>
		</item>

		<item>
			<title>Comment forcer le téléchargement d'un fichier ? ( Header, FilesMatch )</title>
			<link>http://www.ab-d.fr/date/2009-01-09/</link>
			<pubDate>Fri, 09 Jan 2009 22:00:22 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[htaccess]]></category>
			<category><![CDATA[Regex]]></category>
			<description><![CDATA[<p>
Comment forcer le téléchargment d'un fichier sans utiliser de script PHP (ou autres...) ?<br />
Solution : Un simple fichier <code>.htaccess</code> à placer dans le dossier désiré !
</p>

<pre>
&lt;IfModule mod_headers.c&gt;
	&lt;FilesMatch &quot;\.(jpe?g)$&quot;&gt;
		ForceType image/jpeg
		Header set Content-Disposition attachment
	&lt;/FilesMatch&gt;
&lt;/IfModule&gt;
</pre>

<p><em>
A noter : en cas de dysfonctionnement, cela veut dire que le <code>mod_headers</code> n'est pas installé, ou est indisponible sur votre serveur Apache.
</em></p>

<p>
Documentation officielle :<br />
&bull; http://httpd.apache.org/docs/2.0/mod/core.html#filesmatch<br />
&bull; http://httpd.apache.org/docs/2.0/mod/mod_headers.html<br />
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2009-01-09%2F&title=Comment+forcer+le+t%C3%A9l%C3%A9chargement+d%27un+fichier+%3F+%28+Header%2C+FilesMatch+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2009-01-09/</guid>
		</item>

		<item>
			<title>Combinaison de document.getElementById et RegExp ( javascript, dom )</title>
			<link>http://www.ab-d.fr/date/2008-12-14/</link>
			<pubDate>Sun, 14 Dec 2008 22:41:42 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Regex]]></category>
			<category><![CDATA[DOM]]></category>
			<description><![CDATA[<p>
On sent que la récession en France est très forte, j'ai moi-même du mal à joindre les 2 bouts... notamment à propos du temps qui m'est disponible pour rédiger ce poste (<em>Travailler plus, pour gagner plus, qui disait !</em>).<br />
L'idée du code source du jour :</p>
<p>
Rechercher dans une page (X)HTML, les <code>ID</code>entifiants correspondant à une expression régulière <code>new RegExp</code>.
</p>

<pre>
function getElementsByRegExpId(p_regexp, p_element, p_tagName) {
	p_element = p_element === undefined ? document : p_element;
	p_tagName = p_tagName === undefined ? '*' : p_tagName;
	var v_return = [];
	var v_inc = 0;
	for(var v_i = 0, v_il = p_element.getElementsByTagName(p_tagName).length; v_i &lt; v_il; v_i++) {
		if(p_element.getElementsByTagName(p_tagName).item(v_i).id &amp;&amp; p_element.getElementsByTagName(p_tagName).item(v_i).id.match(p_regexp)) {
			v_return[v_inc] = p_element.getElementsByTagName(p_tagName).item(v_i);
			v_inc++;
		}
	}
	return v_return;
}

// Exemple d'utilisation
var v_array = getElementsByRegExpId(/^test.+/);

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-12-14%2F&title=Combinaison+de+document.getElementById+et+RegExp+%28+javascript%2C+dom+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-12-14/</guid>
		</item>

		<item>
			<title>Barack Obama VS John McCain, différences des 2 candidats en code</title>
			<link>http://www.ab-d.fr/date/2008-10-08/</link>
			<pubDate>Wed, 08 Oct 2008 09:02:01 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Detente]]></category>
			<category><![CDATA[Internet]]></category>
			<description><![CDATA[<p>
Voici une petite étude technique comparative des sites officiels de John McCain et de Barack Obama...
</p>

<p>
A y regarder de plus près, les portraits des deux candidats se révèlent de manière assez intéressante :
</p>

<table border="1" style="margin:10px auto;">
<tr><th>Barack Obama</th><th>John McCain</th></tr>
<tr><td>XHTML 1.0 Transitional standard</td><td>HTML 4.01</td></tr>
<tr><td>4 Erreurs W3C</td><td>151 Erreurs W3C</td></tr>
<tr><td>UTF-8</td><td>ISO-8859-1</td></tr>
<tr><td>Open source (PHP / Apache)</td><td>Corporate (Microsoft ASP)</td></tr>
<tr><td>Erreur 404 gérée</td><td>Erreur 404 standard</td></tr>
<tr><td>Pretty URL</td><td>URL case-sensitive et imbitable</td></tr>
</table>

<p>
Maintenant, il ne reste plus qu'à faire votre choix... Je vous laisse deviner vers qui se porte mon vote ;)
</p>

<p>
Sources :<br />
http://www.barackobama.com/<br />
http://www.johnmccain.com/<br />
http://www.presse-citron.net/<br />
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-10-08%2F&title=Barack+Obama+VS+John+McCain%2C+diff%C3%A9rences+des+2+candidats+en+code"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-10-08/</guid>
		</item>

		<item>
			<title>Obfuscateur de code Javascript ET geekettes en folie ( Hello geekette )</title>
			<link>http://www.ab-d.fr/date/2008-10-04/</link>
			<pubDate>Sat, 04 Oct 2008 09:00:54 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Obfuscateur]]></category>
			<category><![CDATA[Detente]]></category>
			<description><![CDATA[<p>
On peut dire qu'en ce moment, je fais fort avec des titres très accrocheur ! ( <em>ou qui ne semble avoir aucun sens... </em> ). Plus sérieusement, je vais vous parler d'un thème qui vous semblera au combien aride et en ennuyeux : l'obfuscator de code... Afin de vous captiver jusqu'au bout de ma prose, vous trouverez en fin de ce message une Geekette tout droit venue de vos rêves les plus fous !
</p>

<p>
Obfuscateur ou Obfuscator : encore un terme barbare pour ne pas dire grand chose et accessoirement pour frime dans un dîner mondain. Exemple :<br />
<br />
<em>- Oui, en effet, la semaine dernière, j'ai découvert un obfuscateur d'une grande puissance qui transforme du bytecode en un algorithme du même langage plus difficile à décompiler pour le newbie qui peine à coder deux méthodes en POO sans générer un code erreur de compilation.<br />
- Mmmffff mmmfff mmfff .....<br />
- Vous reprendrez bien un peu de thé avec ceci ?<br />
</em>
</p>

<p>
Avez-vous remarqué l'approche pédagogique qui a été faite, je vous ai donné une belle définition dans une blague totalement lamentable ?! L'obfuscateur a en effet pour mission de faire de la purée de votre code, et ainsi le rendre plus difficile à comprendre et donc à décompiler.<br />
Toutefois, dans notre cas présent, obfusquer de code Javascript a un double intérêt, rendre le code illisible (mais ceci n'est vraiment que très partiel) et surtout rendre vos scripts plus légers car ils se retrouveront débarrasser de leurs espaces et de leurs commentaires.
</p>

<p>
Voici sûrement le plus connu et gratuit <strong>/packer/</strong> de Dean Edwards disponible sur <a href="http://dean.edwards.name/packer/" rel="nofollow" onclick="window.open(this.href); return false;">http://dean.edwards.name/packer/</a> qui opère en ligne. Différentes options sont disponible, notamment retirer les espaces et commentaires, obfusquer le code, et remplacer les noms des variables sans influencer le comportent de vos scripts.
</p>

<p>
<br />
Et voici le passage que vous attendez tous : la Geekette !
</p>

<p>
Au hasard de mes navigations sur le net, je suis tombé sur le site <strong>Hello Geekette .com</strong>. Un petite série de court-métrages sur le thème des relations entre les geeks et les humains :
</p>
<pre><em>
Greg est ce que l'on peux appeler si ça existe: « un mec normal ».
Alors que Valérie est ce que l'on peux appeler: « une geekette » .

Mais cela ne serait pas grave… s’ils n’étaient pas aussi… colocataires!
</em></pre>

<p>
L'épisode <strong>Hello Geekette 5 - Geeks Vs Bobos</strong> est particulièrement savoureux ;-)<br />
Dernier épisode en date du 1er octobre <strong>Hello Geekette 8 - Faites la guerre, pas l'amour !</strong>.
</p>

<div style="text-align:center;">
<br />
Hello Geekette 5 - Geeks Vs Bobos<br />
<object width="420" height="336"><param name="movie" value="http://www.dailymotion.com/swf/k4gd0qxceKxGeoElRY&amp;related=0"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.dailymotion.com/swf/k4gd0qxceKxGeoElRY&amp;related=0" type="application/x-shockwave-flash" width="420" height="336" allowFullScreen="true" allowScriptAccess="always"></embed></object>
</div>

<p>
Sources :<br />
<a href="http://www.hellogeekette.com/" onclick="window.opent(this.href); return false;">http://www.hellogeekette.com/</a><br />
http://www.dailymotion.com/hellogeekette<br />
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-10-04%2F&title=Obfuscateur+de+code+Javascript+ET+geekettes+en+folie+%28+Hello+geekette+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-10-04/</guid>
		</item>

		<item>
			<title>O'Reilly France bientôt de retour ? Édition Ellipses... ( www.oreilly.fr )</title>
			<link>http://www.ab-d.fr/date/2008-09-24/</link>
			<pubDate>Wed, 24 Sep 2008 21:36:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Actualites]]></category>
			<category><![CDATA[Internet]]></category>
			<description><![CDATA[<p style="text-align:center;">
<img src="http://www.ab-d.fr/divers/oreilly-france.gif" alt="Oreilly France" title="" />
</p>

<p style="padding:20px 50px; text-align:justify;"><em>
La maison d’édition Ellipses s’est finalement portée acquéreuse des ouvrages qui étaient bloqués en stock depuis la liquidation des Éditions O’Reilly.<br />
<br />
Ce petit article sur le nouveau blog d’Ellipses officialise la nouvelle, mais ne précise pas quand vous pourrez trouver ces livres à nouveau chez votre libraire favori. Si votre libraire s’est déjà renseigné, n’hésitez pas à partager vos informations dans un commentaire !<br />
<br />
Autre question en suspens, est-ce qu’Ellipses obtiendra l’autorisation de réimprimer ces ouvrages auprès des auteurs (pour les ouvrages originaux) et/ou d’O’Reilly US (dans le cas des traductions) ? Nous ne savons pas non plus si les versions PDF seront à nouveau disponibles un jour.<br />
<br />
À suivre !<br />
</em></p>

<p>
Voilà enfin une lueur d'espoir pour ces ouvrages d'une grande qualité...<br />
Sinon, les ouvrages anglais sont disponible sur Oreilly.com (ou sur Amazon.fr) et avec la devise du dollar, vous aurez droit à une belle remise ;-)
</p>

<p>
Sources :<br />
<a href="http://blog.immateriel.fr/2008/09/23/le-fonds-oreilly-rediffuse-par-ellipses/" onclick="window.open(this.href); return false;">http://blog.immateriel.fr/2008/09/23/le-fonds-oreilly-rediffuse-par-ellipses/</a><br />
<a href="http://blog-ellipses.typepad.fr/presentation/2008/09/bienvenue-oreil.html" onclick="window.open(this.href); return false;">http://blog-ellipses.typepad.fr/presentation/2008/09/bienvenue-oreil.html</a><br />
<br />
http://www.oreilly.fr/<br />
http://www.editions-ellipses.fr/<br />
</p>

<hr />

<a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-09-24%2F&title=O%27Reilly+France+bient%C3%B4t+de+retour+%3F+%C3%89dition+Ellipses...+%28+www.oreilly.fr+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-09-24/</guid>
		</item>

		<item>
			<title>border: 1px solid transparent Sous Internet Explorer 6 ( css , hack )</title>
			<link>http://www.ab-d.fr/date/2008-09-17/</link>
			<pubDate>Wed, 17 Sep 2008 20:06:06 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Internet Explorer]]></category>
			<category><![CDATA[CSS]]></category>
			<description><![CDATA[<p>
Astuce du jour : Comment faire comprendre à ce bon Internet Explorer 6.0 la couleur <code>transparent</code> appliquée sur un <code>border</code> ?
</p>

<p>
Une réponse peut déjà vous passer par la tête : " baaaahhhh un <code>padding: 1px;</code>, non ?! "...<br />
oui mais voilà, Internet Explorer a une petite tendance à bugguer avec le CSS <em>( quelle découverte ! )</em> et pour fixer ces petits soucis, un <code>border: 1px solid #fff;</code> règle parfois le problème aussi étrange que celui puisse paraître, et donc la réponse a ma question prend tout son sens...
</p>

<pre>
&lt;style type="text/css" media="screen"&gt;

div.mon-test {
	width: 100%; height: 100px;
	<strong>border: 1px solid transparent;</strong>
}

&lt;/style&gt;

&lt;!-- Propriété propre à Internet Explorer 6.0 --&gt;
&lt;!--[if IE 6]&gt;
&lt;style type="text/css" media="screen"&gt;

div.mon-test {
	border-color: pink;
	filter: chroma(color=pink);
}

&lt;/style&gt;
&lt;![endif]--&gt;
</pre>

<p>
Cette solution n'est pas sans modifier le comportement du <code>div</code> impliqué, j'ai notamment remarqué que les propriétés de l'<code>overflow</code> n'étaient plus les mêmes. En bref, cette solution pourra <em>( je l'espère)</em> vous aider, mais risque aussi de vous recréer d'autres problèmes ultérieurement. Je serais personnellement plus adepte d'un <code>div</code> dans un <code>div</code>.
</p>

<p>
Mais n'oubliez jamais cet adage : " Trop de div, Tue le div ! ".
</p>

<p>
Source du hack : http://acidmartin.wordpress.com/
</p>

<p>&nbsp;</p>

<p style="text-align:center">
<img src="http://www.ab-d.fr/divers/humor-airplaines.jpg" alt="nice try" />
</p>

<hr />

<a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-09-17%2F&title=border%3A+1px+solid+transparent+Sous+Internet+Explorer+6+%28+css+%2C+hack+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-09-17/</guid>
		</item>

		<item>
			<title>Comment lire des données POST bruts en PHP ( flux, php://input )</title>
			<link>http://www.ab-d.fr/date/2008-09-09/</link>
			<pubDate>Tue, 09 Sep 2008 14:56:32 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<p>
Voici sûrement l'une des astuces les plus inutiles du moment. Comment accéder aux données <code>POST</code> bruts en PHP ? Il suffit de lire le flux d'entrée <code>php://input</code> de la manière suivante :
</p>

<pre>
&lt;form action="page-input.php" method="post"&gt;
	&lt;p&gt;
		&lt;label for="text"&gt;Zone de texte :&lt;/label&gt;
		&lt;input type="text" name="text" id="text" /&gt;
	&lt;/p&gt;
	
	&lt;p&gt;&lt;input type="submit" name="submit" value="Continuer" /&gt;&lt;/p&gt;
&lt;/form&gt;

&lt;p&gt;&lt;?php echo file_get_contents('php://input'); ?&gt;&lt;/p&gt;

</pre>

<p>
Ce qui retournera comme résultat :
</p>
<pre>
text=bla+bla+bla&amp;submit=Continuer
</pre>

<p>
<code>php://input</code> ne fonctionnera pas si vous utilisez l'attribut <code>enctype="multipart/form-data"</code> dans votre balise <code>&lt;form action="" method="post"&gt;</code>.
</p>
<p>
Documentation officielle : http://www.php.net/wrappers.php<br />
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-09-09%2F&title=Comment+lire+des+donn%C3%A9es+POST+bruts+en+PHP+%28+flux%2C+php%3A%2F%2Finput+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-09-09/</guid>
		</item>

		<item>
			<title>Détecter le navigateur Google Chrome ( Webkit, Safari, Javascript )</title>
			<link>http://www.ab-d.fr/date/2008-09-02/</link>
			<pubDate>Tue, 02 Sep 2008 22:00:22 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Google]]></category>
			<category><![CDATA[Actualites]]></category>
			<category><![CDATA[Internet]]></category>
			<category><![CDATA[Webkit]]></category>
			<description><![CDATA[<p>
Google vient de lancer son nouveau navigateur Google Chrome. J'en entends déjà raller dans leur coin : " <em>Encore un navigateur dont il va falloir contrôler le rendu avant de mettre mon site en production.</em> "</p>
<p>
Sachez que ce navigateur se base sur le moteur de Apple Webkit ( Safari sur Mac OS X ) comme le montre la ligne ci-dessous :
</p>

<pre>
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) <strong>Chrome</strong>/0.2.149.27 Safari/525.13

</pre>

<p>
Pour résumé, si votre site est compatible avec Safari, vous ne devriez pas rencontrer de problèmes particuliers.<br />
Pour ceux qui n'ont jamais essayé Webkit ( Safari ), sachez que Webkit se comporte "pratiquement" de la même manière que Mozilla Firefox au niveau du HTML et du CSS. En ce qui concerne le Javascript, l'affaire est quelque peu différente notamment dans le support du DOM W3C ou encore du designMode, toutefois les développeurs de Google Chrome semblent avoir beaucoup retravaillés le moteur Javascript (nom de code V8) donc...
</p>

<p>
Affaire à suivre, il n'en reste pas moins qu'une éternelle question subsiste :<br />
Quand pourra-t-on abandonner Microsoft Internet Explorer  6.0 ?! ^^ 
</p>

<div style="text-align:center;">
<br />
Les coulisses de Google Chrome :<br />
<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/bhGrIuwyP34&amp;hl=en&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/bhGrIuwyP34&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>
</div>

<p>
Télécharger Google Chrome :<br />
http://www.google.com/chrome<br />
http://code.google.com/chromium/<br />
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-09-02%2F&title=D%C3%A9tecter+le+navigateur+Google+Chrome+%28+Webkit%2C+Safari%2C+Javascript+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-09-02/</guid>
		</item>

		<item>
			<title>Utiliser l'écriture Array sous forme Object en PHP ( PHP5, POO, ArrayAccess )</title>
			<link>http://www.ab-d.fr/date/2008-08-25/</link>
			<pubDate>Mon, 25 Aug 2008 10:26:26 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP5]]></category>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<p>
Comme annoncé la semaine dernière et les vacances se terminant, il est maintenant temps de remonter <em>(un peu)</em> le niveau de ce blog qui sombrait doucement mais sûrement dans le grand n'importe quoi.
</p>
<p>
L'astuce du jour n'est guère facile à expliquer en quelques lignes, un exemple sera à mon avis beaucoup plus clair.<br />
Comment utiliser un tableau comme un pur objet ? ( à la sauce Java, si je puis m'exprimer ainsi )
</p>

<pre>
// Ecriture PHP classique
$array = array(); // Ligne facultative
$array['key1'] = 'value 1';
$array['key2'] = 'value 2';
$array['key3']['key31'] = 'value 31';
...
</pre>

<p>Voici une écriture qui ne fonctionne qu'en PHP 5 :</p>
<pre>
// Ecriture PHP5 objet
$array = new ClassArray(); // Ligne obligatoire !
$array['key1'] = 'value 1';
$array['key2'] = 'value 2';
...
</pre>

<p>En soit, il n'y a absolument rien de révolutionnaire, mais le <code>new</code> crée l'instance de l'objet <code>ClassArray()</code> et vous pouvez constater que l'écriture reste un tableau et non un objet<br />
<code>$array->key1 = 'value 1';</code></p>

<p>Une question se pose sûrement dans votre cerveau qui bouillonne d'impatience : Qui a-t-il dans cette <code>ClassArray()</code> ? Une simple implémentation de <code>ArrayAccess</code> ( PHP5 only ), ce qui nous donne :</p>

<pre>
class ClassArray <strong>implements ArrayAccess</strong> {
	
	protected $_array = array();
	
	public function __construct() {
		$this->_array = func_get_args();
	}
	
	// En cas d'appel de la fonction isset()
	public function offsetExists($offset) {
		return isset($this->_array[$offset]);
	}
	
	// En cas d'appel de la valeur
	public function offsetGet($offset) {
		return $this->_array[$offset];
	}
	
	// En cas d'affectation de la valeur
	public function offsetSet($offset, $value) {
		return $this->_array[$offset] = $value;
	}
	
	// En cas d'appel de la fonction unset()
	public function offsetUnset($offset) {
		unset($this->_array[$offset]);
	}
	
}
</pre>

<p>Ensuite, libre à vous de modifier cette classe pour lui ajouter de nouvelles fonctionnalités...</p>

<p>Remarque importante : Si vous essayez de créer un tableau sur plusieurs dimensions, un message d'erreur se produira avec l'écriture suivante :</p>
<pre>
$array = new ClassArray();
$array['key3']['key31'] = 'value 31';

// Problème : Vous n'avez pas définit $array['key3'] ! l'écriture POO est beaucoup plus stricte ;)
// Solution :
$array = new ClassArray();
$array['key3'] = new ClassArray();
$array['key3']['key31'] = 'value 31';

</pre>

<p>
Documentation officielle :<br />
http://www.php.net/~helly/php/ext/spl/interfaceArrayAccess.html
</p>

<hr />

<a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-08-25%2F&title=Utiliser+l%27%C3%A9criture+Array+sous+forme+Object+en+PHP+%28+PHP5%2C+POO%2C+ArrayAccess+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-08-25/</guid>
		</item>

		<item>
			<title>Get a Mac ! ( Bill Gates, Steve Jobs, Microsoft, Windows, Apple, iPhone )</title>
			<link>http://www.ab-d.fr/date/2008-08-18/</link>
			<pubDate>Mon, 18 Aug 2008 09:10:11 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Detente]]></category>
			<category><![CDATA[Mac OS X]]></category>
			<description><![CDATA[<p>
Mac ou PC ? Le bien ou le mal ? Le monde limité ou le monde buggué ? Steve ou Bill ?...
</p>

<p>
Que de questions, mais votre humble serviteur vous apportera une seule et unique réponse -> Choisissez les Mac !
</p>

<p>
Pourquoi ? Voici quelques réponses en vidéos :
</p>

<p style="text-align:center;">
Pub : Get a Mac sur Windows Vista<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/FxOIebkmrqs&amp;hl=fr&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/FxOIebkmrqs&amp;hl=fr&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>

<br />
<br />

Apple Mac Music Video : Again and Again<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/6kxDxLAjkO8&amp;hl=fr&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/6kxDxLAjkO8&amp;hl=fr&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>

<br />
<br />

Parodie : Gates VS Jobs<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Wb2eS_7CQnI&amp;hl=fr&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/Wb2eS_7CQnI&amp;hl=fr&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>

</p>

<p>
<br />
<em>Promis... pour les prochaines actualités, je retournerai aux Sources.</em>
</p>

<p>
Dernière minute : Je vous invite à tester la toute dernière version beta de NetBeans IDE 6.5 ; pour le développement PHP et autres petits langages (html, css, js...) qui gravitent autour c'est un réel bonheur !<br />
<em>Disponible sous Windows, Linux et Mac OS X bien sûr ;)</em>
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-08-18%2F&title=Get+a+Mac+%21+%28+Bill+Gates%2C+Steve+Jobs%2C+Microsoft%2C+Windows%2C+Apple%2C+iPhone+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-08-18/</guid>
		</item>

		<item>
			<title>Jeux-vidéo en Javascript ( js, svg, game, video games )</title>
			<link>http://www.ab-d.fr/date/2008-08-11/</link>
			<pubDate>Mon, 11 Aug 2008 10:09:08 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Detente]]></category>
			<description><![CDATA[<p>
Hélas, je ne vais pas vous sortir un Quake en Javascript <em>( encore que... avec les nouvelles fonctions de transformation de Webkit, je suis sûr qu'on pourrait presque y arriver )</em>. Pour le moment, on va rester dans le simple mais dont certains restent tout de même très impressionnant.
</p>

<p>
&bull; <a href="http://members.iinet.net.au/~pontipak/redsquare.html" onclick="window.open(this.href); return false;"><strong>Escapa</strong></a> : <em>vous devez sauver un carré rouge de méchants rectangles bleuuuuussss</em><br />
&bull; <a href="http://bezumie.com/" onclick="window.open(this.href); return false;"><strong>Bezumie</strong></a> :  <em>un peu de tout...</em><br />
&bull; <a href="http://p4wn.sourceforge.net/" onclick="window.open(this.href); return false;"><strong>Chess</strong></a> : <em>Jeu d'échec</em><br />
&bull; <a href="http://www.posi.net/software/othello/" onclick="window.open(this.href); return false;"><strong>Othello</strong></a> : <em>Qui ne connait pas Othello ?</em><br />
<br />
&bull; <a href="http://www.codedread.com/yastframe.php" onclick="window.open(this.href); return false;"><strong>Yast</strong></a> : <em>ni plus ni moins qu'un Tetris</em><br />
&bull; <a href="http://www.elizium.nu/scripts/lemmings/" onclick="window.open(this.href); return false;"><strong>Lemmings</strong></a> : <em>et pour finir en beauté, les Lemmings ! Oui Madame !</em><br />

</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-08-11%2F&title=Jeux-vid%C3%A9o+en+Javascript+%28+js%2C+svg%2C+game%2C+video+games+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-08-11/</guid>
		</item>

		<item>
			<title>Presto, court métrage des Studios Pixar ( Wall•E, animation, 3D )</title>
			<link>http://www.ab-d.fr/date/2008-08-04/</link>
			<pubDate>Mon, 04 Aug 2008 10:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Actualites]]></category>
			<category><![CDATA[Detente]]></category>
			<description><![CDATA[<p>
Toujours dans notre série "détente" du moins d'août, je vous présente le grand magicien <strong>Presto</strong> et son lapin blanc, Alec...
</p>
<p>
Presto est un court métrage des Studios Pixar, sorti en même temps que WALL&bull;E.<br />
<em>Soit dit en passant, ce petit Wall&bull;E est une pur merveille !</em>
<br /><br />
</p>

<div id="swf-20080804"><a href="http://www.adobe.com/go/getflashplayer">Get the Adobe Flash Player</a> pour voir le player.</div>

<script type="text/javascript" src="/javascript/swfobject.js"></script>
<script type="text/javascript">
var s1 = new SWFObject("/javascript/player.swf","ply","600","360","9","#FFFFFF");
s1.addParam("allowfullscreen","true");
s1.addParam("allowscriptaccess","always");
s1.addParam("flashvars","file=/divers/presto_pixar.flv&amp;image=/divers/presto_pixar_preview.jpg");
s1.write("swf-20080804");
</script>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-08-04%2F&title=Presto%2C+court+m%C3%A9trage+des+Studios+Pixar+%28+Wall%E2%80%A2E%2C+animation%2C+3D+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-08-04/</guid>
		</item>

		<item>
			<title>Cahiers de vacances pour vos méninges ( quiz, php, css, actionscript... )</title>
			<link>http://www.ab-d.fr/date/2008-07-28/</link>
			<pubDate>Mon, 28 Jul 2008 09:09:09 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[XHTML]]></category>
			<category><![CDATA[CSS]]></category>
			<category><![CDATA[ActionScript]]></category>
			<category><![CDATA[Detente]]></category>
			<description><![CDATA[<p>
Les vacances sont là,<br />
Les plages sont pleines de monde,<br />
Les glaces fondent trop vite,<br />
Les bières sont chaudes... <em>( vous sentez le stress monter ? )</em><br />
Et y faut faire les cahiers de vacances de vos chers petits, <em>( encore et toujours )</em><br />
Mais vous, avez-vous pensez aux vôtres ?<br />
Heureusement, votre humble serviteur, Oui ! <em>( en bon tortionnaire que je suis ;-)</em>
</p>  

<p>
Voici une liste de liens avec des petits Quiz sur vos langages de programmation préférées.
</p>

<p>&nbsp;</p>

<ul>
<li>&bull; <a href="http://www.oneplusyou.com/bb/html_quiz" onclick="window.open(this.href); return false;">Quiz HTML</a></li>
<li>&bull; <a href="http://www.oneplusyou.com/bb/css_quiz" onclick="window.open(this.href); return false;">Quiz CSS</a></li>
<li>&bull; <a href="http://www.oneplusyou.com/bb/view2/colors" onclick="window.open(this.href); return false;">Quiz Couleurs <em>( un peu en marge du Quiz CSS )</em></a></li>
<li>&bull; <a href="http://www.w3schools.com/PHP/php_quiz.asp" onclick="window.open(this.href); return false;">Quiz PHP</a></li>
<li>&bull; <a href="http://www.learningactionscript3.com/quizzes/" onclick="window.open(this.href); return false;">Quiz ActionScript</a></li>

<li>&nbsp;</li>
<li>&bull; <a href="http://quiz.alsacreations.com/" onclick="window.open(this.href); return false;">Encore des Quiz sur le XHTML, CSS, JS, PHP</a></li>

<li>&bull; <a href="http://www.01net.com/quizz/quizz.php?idquizz=50" onclick="window.open(this.href); return false;">Et enfin, juste pour le plaisir : Parlez-vous geek ?</a></li>

</ul>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-07-28%2F&title=Cahiers+de+vacances+pour+vos+m%C3%A9ninges+%28+quiz%2C+php%2C+css%2C+actionscript...+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-07-28/</guid>
		</item>

		<item>
			<title>function array2object(array $array) { ... } en PHP5 ( object, stdClass, php )</title>
			<link>http://www.ab-d.fr/date/2008-07-19/</link>
			<pubDate>Sat, 19 Jul 2008 10:10:10 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP]]></category>
			<category><![CDATA[PHP5]]></category>
			<description><![CDATA[<p>
Cette fonction <code>function array2object()</code> n'est pas nouvelle en soit, mais voici une écriture récursive en PHP5 plus rigolote ( <em>et surtout plus restrictive</em> ) à utiliser.</p>
<p>
La fonction ci-dessous ne fonctionne qu'en PHP 5 de part le typage du paramètre <code>(<strong>array</strong> $array)</code> ainsi on évite le contrôle <code>is_array()</code>. Toutefois, si vous envoyez une valeur qui n'est pas un tableau, une erreur de compilation se produira.
</p>

<pre>
function array2object(array $array) {
	$object = new stdClass();
	foreach($array as $key =&gt; $value) {
		if(is_array($value)) {
			$object-&gt;$key = array2object($value);
		} else {
			$object-&gt;$key = $value;
		}
	}
	return $object;
}
</pre>

<p>Exemples d'utilisation :</p>
<pre>
$tableau[0] = 'Valeur 0';
$tableau[1] = 'Valeur 1';
$tableau['deux'] = 'Valeur 2';
$tableau['trois'] = 'Valeur 3';

$objet = array2object($tableau);

echo $objet-&gt;0;     // Ecriture incorrecte
echo $objet-&gt;{'1'}; // Ecriture correcte
echo $objet-&gt;deux;  // Ecriture classique
echo $objet-&gt;trois; // etc...
</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-07-19%2F&title=function+array2object%28array+%24array%29+%7B+...+%7D+en+PHP5+%28+object%2C+stdClass%2C+php+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-07-19/</guid>
		</item>

		<item>
			<title>Firefox 3 et input type=file Nouvelle Formule ! ( upload, path, nsIDOMFile )</title>
			<link>http://www.ab-d.fr/date/2008-07-12/</link>
			<pubDate>Sat, 12 Jul 2008 08:40:04 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Firefox]]></category>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[XHTML]]></category>
			<category><![CDATA[DOM]]></category>
			<description><![CDATA[<p>
De bon matin, je me lève, j'arrive sur une de mes applications en ligne, et là horreur ! cette dernière ne fonctionne plus sous Mozilla Firefox 3... Après analyse des petits messages d'erreurs, je me rends à l'évidence le formulaire <code>&lt;input type="file" /&gt;</code> ne se comporte plus de la même façon...
</p>

<p>
Les développeurs de Firefox 3 ont corrigé une petite faille de sécurité : Lorsque vous cliquez sur le bouton <strong>Parcourir</strong> le <code>value</code> de votre zone <code>input type="file"</code> contenait le nom du fichier ainsi que son chemin sur le disque dur, et bien aujourd'hui cela n'est plus, vous n'aurez plus que le nom du fichier.<br />
<em>D'ailleurs, Opera Browser se comporte aussi de la sorte, pour le moment Microsoft Internet Explorer et Apple Safari retournent toujours le chemin complet du fichier.</em>
</p>

<p>
Une très bonne nouvelle s'accompagne de ce petit changement, vous pouvez à présent accéder aux données du fichier sélectionné par l'utilisateur en Javascript sans poster le formulaire grâce à l'objet <code>FileList</code>. 
</p>

<p>
Un exemple vaut mieux qu'un long discours, voici une page qui vous permettra d'essayer cette nouvelle fonctionnalité (<em>qui je le rappelle, ne fonctionne que sur Mozilla Firefox 3</em>) :
</p>

<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"&gt;
&lt;head&gt;
	&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
	&lt;title&gt;input type=file &amp; Firefox 3&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
	
&lt;h1&gt;input type=file &amp; Firefox 3&lt;/h1&gt;
	
&lt;script type="text/javascript"&gt;
// &lt;![CDATA[

function inputFileOnChange() {
	var v_console = '';
	v_console += 'value: ' + document.getElementById('fichier').value;
	v_console += '&lt;br \/&gt;';
	
	if(document.getElementById('fichier')<strong>.files</strong>) {
		// Support: nsIDOMFile, nsIDOMFileList
		v_console += 'files.length: ' + document.getElementById('fichier')<strong>.files.length</strong>;
		v_console += '&lt;br \/&gt;';
		
		v_console += 'fileName: ' + document.getElementById('fichier')<strong>.files.item(0).fileName</strong>;
		v_console += '&lt;br \/&gt;';
		
		v_console += 'fileSize: ' + document.getElementById('fichier')<strong>.files.item(0).fileSize</strong>;
		v_console += '&lt;br \/&gt;';
		
		v_console += 'data: ' + document.getElementById('fichier')<strong>.files.item(0).getAsDataURL()</strong>;
//		v_console += 'data: ' + document.getElementById('fichier')<strong>.files.item(0).getAsBinary()</strong>;
//		v_console += 'data: ' + document.getElementById('fichier')<strong>.files.item(0).getAsText()</strong>;
		v_console += '&lt;br \/&gt;';
	};
	
	document.getElementById('console').innerHTML = v_console;
};

// ]]&gt;
&lt;/script&gt;
	
&lt;div&gt;
	&lt;input type="file" name="fichier" id="fichier" onchange="inputFileOnChange();" /&gt;
	&lt;br /&gt;&lt;br /&gt;
	&lt;code id="console"&gt;...console...&lt;/code&gt;
&lt;/div&gt;
	
&lt;/body&gt;
&lt;/html&gt;

</pre>

<p>Documentation officielle :<br />
&bull; <a href="http://developer.mozilla.org/en/docs/nsIDOMFile">http://developer.mozilla.org/en/docs/nsIDOMFile</a><br />
&bull; <a href="http://developer.mozilla.org/en/docs/nsIDOMFileList">http://developer.mozilla.org/en/docs/nsIDOMFileList</a><br />
&bull; <a href="http://www.w3.org/TR/file-upload/">http://www.w3.org/TR/file-upload/</a><br />
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-07-12%2F&title=Firefox+3+et+input+type%3Dfile+Nouvelle+Formule+%21+%28+upload%2C+path%2C+nsIDOMFile+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-07-12/</guid>
		</item>

		<item>
			<title>Comment retourner plusieurs valeurs depuis une fonction PHP ? ( function )</title>
			<link>http://www.ab-d.fr/date/2008-07-05/</link>
			<pubDate>Sat, 05 Jul 2008 17:17:17 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<p>
Astuce du jour : Comment retourner plusieurs variables depuis une fonction PHP ?
</p>

<p>
Vous pouvez utiliser les tableaux <code>array()</code> ou les objets <code>new stdClass()</code> dans une variable et retourner la dite variable, toutefois cette écriture n'est pas forcément limpide lors d'une relecture de code.
</p>

<p>Je vous propose une écriture assez souple et surtout beaucoup plus claire qui vous donnera une réelle impression de <code>return</code> avec X valeurs.
</p>

<pre>
&lt;?php

function retourner_plusieurs_valeurs() {
	$variable_n_1 = 'One';
	$variable_n_2 = 'Two';
	$variable_n_3 = '333';
	
	return array(<strong>$variable_n_1, $variable_n_2, $variable_n_3</strong>);
}


list(<strong>$variable_n_1, $variable_n_2, $variable_n_3</strong>) = retourner_plusieurs_valeurs();

?&gt;

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-07-05%2F&title=Comment+retourner+plusieurs+valeurs+depuis+une+fonction+PHP+%3F+%28+function+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-07-05/</guid>
		</item>

		<item>
			<title>Formater un nombre au format monétaire ( money_format, php )</title>
			<link>http://www.ab-d.fr/date/2008-06-28/</link>
			<pubDate>Sat, 28 Jun 2008 22:00:22 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<p>
Cette astuce n'a absolument rien d'extraordinaire, mais peut être vous fera-t-elle découvrir les différentes manières de formater un nombre au format monétaire.
</p>

<pre>
&lt;?php

$number = 1234.567;


// Première méthode ( peu pratique )
echo sprintf('%.2f &amp;euro;', $number); // 1234.57 €


// Seconde méthode ( plus simple mais non automatique )
echo number_format($number, 2, ',', ' ') . ' &amp;euro;'; // 1 234,57 €


// Troisième méthode ( qui peut être automatisée )
setlocale(LC_MONETARY, 'en_US');
echo money_format('%n', $number); // &#36;1,234.57

setlocale(LC_MONETARY, 'fr_FR');
echo money_format('%n', $number); // 1 234,57 Eu
echo money_format('%!n &amp;euro;', $number); // 1 234,57 €

?&gt;
</pre>

<p>
<em>Article inspiré du livre O'Reilly PHP Cookbook, Second Edition.</em>
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-06-28%2F&title=Formater+un+nombre+au+format+mon%C3%A9taire+%28+money_format%2C+php+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-06-28/</guid>
		</item>

		<item>
			<title>Requête MySQL insensible aux accents dans une table latin1 ( mysql, sql )</title>
			<link>http://www.ab-d.fr/date/2008-06-21/</link>
			<pubDate>Sat, 21 Jun 2008 11:11:11 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[MySQL]]></category>
			<category><![CDATA[UTF-8]]></category>
			<description><![CDATA[<p>
Problème du jour : 
Vous avez une table en <code>latin1_general_ci</code> (<em>ou un interclassement assez proche</em>), et vous souhaitez effectuer une recherche sur le terme "<strong>cinéma</strong>" avec un <code>LIKE</code>.<br />
Un problème va se poser si l'utilisateur saisit "<strong>cin<ins>e</ins>ma</strong>" et non "<strong>cin<ins>é</ins>ma</strong>"... votre requête ne retournera aucun résultat...
</p>
<pre>
SELECT * FROM `table` WHERE `texte` LIKE '%cinema%' ;
</pre>

<p>
<br />
Une partie de la solution se trouve dans l'interclassement, si vous effectuez cette même requête <code>LIKE</code> dans une table en <code>utf8_general_ci</code>, le résultat retournera tous les "<strong>cinéma</strong>" !
</p>

<p>
Certains diront sûrement qu'il suffit de changer l'interclassement et le problème sera réglé mais parfois vous n'avez pas cette possibilité pour diverses raisons...<br />
Voici une solution qui je l'espère vous plaira, il "suffit" de traiter le texte reçu en <code>latin1</code> <code>ISO-8859-1</code> dans la requête avec un <code>CONVERT(_utf8 '%...%' USING utf8) COLLATE utf8_general_ci </code> :
</p>

<pre>
SELECT * FROM `table`
WHERE `texte` LIKE CONVERT(_utf8 '%cinema%' USING utf8) COLLATE utf8_general_ci ;
</pre>

<h3><br />En promo : Comment réinitialiser le numéro identifiant <code>AUTO_INCREMENT</code> dans une table ?</h3>
<pre>
ALTER TABLE `table` AUTO_INCREMENT = 1 ;
</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-06-21%2F&title=Requ%C3%AAte+MySQL+insensible+aux+accents+dans+une+table+latin1+%28+mysql%2C+sql+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-06-21/</guid>
		</item>

		<item>
			<title>Désactiver la saisie semi-automatique dans un input text ( autocomplete )</title>
			<link>http://www.ab-d.fr/date/2008-06-14/</link>
			<pubDate>Sat, 14 Jun 2008 00:07:08 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[XHTML]]></category>
			<description><![CDATA[<p>
Votre site comporte peut être des formulaires avec des zones <code>&lt;input type="text" /&gt;</code>, mais le navigateur soucieux d'assister l'utilisateur, pollue vos formulaires avec de la saisie semi-automatique...
</p>
<p>
Comment remédier à ce problème et surtout comment désactiver cette saisie semi-automatique ? Il "suffit" d'utiliser l'attribut <code>autocomplete</code>.
</p>
<pre>
&lt;input type="text" name="zone_texte" value="" autocomplete="off" /&gt;
</pre>
<p>
J'ai pu testé avec succès cet attribut sur les différents navigateurs du moment : Microsoft Internet Explorer, Mozilla Firefox, et Apple Safari (webkit). Toutefois, cet attribut <code>autocomplete</code> écrit de manière brute dans le code source de votre page n'est ni valide en HTML, ni valide en XHTML. Pour fixer ce petit soucis, vous pouvez initialiser l'attribut avec du Javascript au moyen de la méthode <code>setAttribute</code>.
</p>

<p>
Voici un exemple de code Javascript qui désactivera totalement la saisie semi-automatique dans vos formulaires HTML :
</p>
<pre>
&lt;script type="text/javascript"&gt;

window.onload = function() {
	for(var i = 0, l = document.getElementsByTagName('input').length; i &lt; l; i++) {
		if(document.getElementsByTagName('input').item(i).type == 'text') {
			document.getElementsByTagName('input').item(i).setAttribute('autocomplete', 'off');
		};
	};
};

&lt;script&gt;

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-06-14%2F&title=D%C3%A9sactiver+la+saisie+semi-automatique+dans+un+input+text+%28+autocomplete+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-06-14/</guid>
		</item>

		<item>
			<title>Voici une actualité totalement inutile et donc indispensable !</title>
			<link>http://www.ab-d.fr/date/2008-06-07/</link>
			<pubDate>Sat, 07 Jun 2008 19:50:50 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Actualites]]></category>
			<description><![CDATA[<p>
Une fois n'est pas coutume, il n'y aura pas d'astuce cette semaine... mais une actualité totalement inutile, et comme toute chose inutile, elle se trouve être indispensable !
</p>
<p>
Vous pouvez à présent <strong>Poster des commentaires</strong> sur ce site ! Les saisies sont très primaires comme tout blog qui se respecte, toutefois le splash est plutôt sympatoche.
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-06-07%2F&title=Voici+une+actualit%C3%A9+totalement+inutile+et+donc+indispensable+%21"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-06-07/</guid>
		</item>

		<item>
			<title>Gérer les PNG transparents avec Internet Explorer 6 ( javascript, filter, CSS )</title>
			<link>http://www.ab-d.fr/date/2008-06-01/</link>
			<pubDate>Sun, 01 Jun 2008 13:33:33 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Internet Explorer]]></category>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[CSS]]></category>
			<description><![CDATA[<p>
Voici un petit javascript qui vous permettra de fixer la transparence des images au format PNG transparent 24 bits sous Microsoft Internet Explorer 6.
</p>

<pre>
function fixPNG() {
	if(navigator.appName == 'Microsoft Internet Explorer') {
		var png = /\.png$/i;
		var imgs = document.getElementsByTagName('img');
		for(var i = 0, l = imgs.length; i &lt; l; i++) {
			if(png.test(imgs.item(i).src)) {
				imgs.item(i).style.width = imgs.item(i).offsetWidth;
				imgs.item(i).style.height = imgs.item(i).offsetHeight;
				imgs.item(i).style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + imgs.item(i).src + '\',sizingMethod=\'image\')';
				imgs.item(i).src = 'empty.gif';
			}
		}
	}
}

</pre>

<p>
Fonctionnement de la <code>function</code> :<br />
Le PNG transparent est remplacé par un fichier GIF totalement transparent de 1px&sup2;, puis le <code>filter</code> contenant le PNG est appliqué sur l'image GIF.<br />
Pour activer cette fonction, il suffit de l'appeler dans un événement <code>window.onload = function(){}</code>.
</p>


<p>
<em>Rappel des différentes écritures du <code>filter</code> en CSS :</em>
</p>
<pre>
img.image1 { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image1.png', sizingMethod='image'); }
img.image2 { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image2.png', sizingMethod='scale'); }
img.image3 { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image3.png', sizingMethod='crop'); }

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-06-01%2F&title=G%C3%A9rer+les+PNG+transparents+avec+Internet+Explorer+6+%28+javascript%2C+filter%2C+CSS+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-06-01/</guid>
		</item>

		<item>
			<title>Enlever les magic_quotes de $_GET, $_POST, $_COOKIE, $_REQUEST ( php6 )</title>
			<link>http://www.ab-d.fr/date/2008-05-25/</link>
			<pubDate>Sun, 25 May 2008 23:50:50 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<p>
Voici une petite commande PHP qui vous permettra de désactiver ou plutôt de nettoyer les magic_quotes quand ces dernières sont activées <em>( et accessoirement de préparer votre code si la fonction <code>get_magic_quotes_gpc()</code> venait à disparaître dans PHP 6 )</em>.
</p>
<pre>
if(!function_exists('get_magic_quotes_gpc')) {
	// En prevision de PHP 6
	function get_magic_quotes_gpc() { return 0; }
}

if(get_magic_quotes_gpc()) {
	function undo_magic_quotes(&amp;$array) {
		foreach($array as $key => $value) {
			if(is_array($array[$key])) {
				undo_magic_quotes($array[$key]);
			} else {
				$array[$key] = stripslashes($value);
			}
		}
	}
	
	undo_magic_quotes($_GET);
	undo_magic_quotes($_POST);
	undo_magic_quotes($_COOKIE);
	undo_magic_quotes($_REQUEST);
	undo_magic_quotes($_FILES);
}
</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-05-25%2F&title=Enlever+les+magic_quotes+de+%24_GET%2C+%24_POST%2C+%24_COOKIE%2C+%24_REQUEST+%28+php6+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-05-25/</guid>
		</item>

		<item>
			<title>Effectuer une rotation d'image en CSS ( rotate balise canvas HTML5 )</title>
			<link>http://www.ab-d.fr/date/2008-05-18/</link>
			<pubDate>Sun, 18 May 2008 17:18:19 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[CSS]]></category>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Canvas]]></category>
			<category><![CDATA[HTML5]]></category>
			<description><![CDATA[<p>
A l'heure où j'écris ces quelques lignes, il n'existe pas réellement de vraie solution pour effectuer une rotation sur une image (ou sur un élément) en CSS.
</p>
<p>
Sous Microsoft Internet Explorer, on peut effectuer une telle opération avec <code>filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);</code>. Toutefois, ceci ne permet pas d'effectuer une rotation au degré prêt.
</p>

<p>
Sous Apple Safari (Webkit), l'équipe de développement a proposé l'écriture suivante <code>-webkit-transform: rotate(90deg);</code>. Cette solution présente un très grand avantage, elle peut être appliquée sur tout type de balises et non simplement sur une image, mais cette propriété reste propre à Safari version 3.x...
</p>

<p>
Dans cette histoire, il reste toujours un navigateur sans réelle solution, notre cher Mozilla Firefox... on aurait pu espérer une commande du type <code>-moz-rotate: 90;</code>, mais il n'en est rien.
</p>

<p>
<br />
Voici donc la solution, utiliser la balise <code>&lt;canvas&gt;&lt;/canvas&gt;</code>.
</p>
<p>
La balise <code>&lt;canvas&gt;</code> est une extension non standard à la norme HTML qui permet d'effectuer des rendus dynamiques d'images bitmap via des scripts.<br />
Cette balise est supportée par les derniers navigateurs Mozilla Firefox, Apple Safari, et Opera Browser. A noter que Microsoft Internet Explorer ne supporte pas nativement la balise <code>&lt;canvas&gt;</code>, pour ce faire, vous devez utiliser une sous couche excanvas <em>( disponible sur http://excanvas.sourceforge.net )</em>
</p>


<p><br />
Exemple de script de rotation d'image compatible avec la plupart des navigateurs récents :</p>

<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"&gt;
&lt;head&gt;
	&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
	&lt;title&gt;rotate()&lt;/title&gt;
	
	&lt;style type="text/css" media="screen"&gt;
	img, canvas { border: 1px solid black; }
	&lt;/style&gt;


&lt;script type="text/javascript"&gt;

function rotate(p_deg) {
	if(document.getElementById('canvas')) {
		/*
		Ok!: Firefox 2, Safari 3, Opera 9.5b2
		Non: Opera 9.27
		*/
		var image = document.getElementById('image');
		var canvas = document.getElementById('canvas');
		var canvasContext = canvas.getContext('2d');
		
		switch(p_deg) {
			default :
			case 0 :
				canvas.setAttribute('width', image.width);
				canvas.setAttribute('height', image.height);
				canvasContext.rotate(p_deg * Math.PI / 180);
				canvasContext.drawImage(image, 0, 0);
				break;
			case 90 :
				canvas.setAttribute('width', image.height);
				canvas.setAttribute('height', image.width);
				canvasContext.rotate(p_deg * Math.PI / 180);
				canvasContext.drawImage(image, 0, -image.height);
				break;
			case 180 :
				canvas.setAttribute('width', image.width);
				canvas.setAttribute('height', image.height);
				canvasContext.rotate(p_deg * Math.PI / 180);
				canvasContext.drawImage(image, -image.width, -image.height);
				break;
			case 270 :
			case -90 :
				canvas.setAttribute('width', image.height);
				canvas.setAttribute('height', image.width);
				canvasContext.rotate(p_deg * Math.PI / 180);
				canvasContext.drawImage(image, -image.width, 0);
				break;
		};
		
	} else {
		/*
		Ok!: MSIE 6 et 7
		*/
		var image = document.getElementById('image');
		switch(p_deg) {
			default :
			case 0 :
				image.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=0)';
				break;
			case 90 :
				image.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=1)';
				break;
			case 180 :
				image.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2)';
				break;
			case 270 :
			case -90 :
				image.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=3)';
				break;
		};
		
	};
};


window.onload = function() {
	var image = document.getElementById('image');
	var canvas = document.getElementById('canvas');
	if(canvas.getContext) {
		image.style.visibility = 'hidden';
		image.style.position = 'absolute';
	} else {
		canvas.parentNode.removeChild(canvas);
	};
	
	rotate(0);
};

&lt;/script&gt;

&lt;/head&gt;

&lt;body&gt;


&lt;p&gt;
	rotate:
	&lt;input type="button" value="0&deg;" onclick="rotate(0);" /&gt;
	&lt;input type="button" value="90&deg;" onclick="rotate(90);" /&gt;
	&lt;input type="button" value="180&deg;" onclick="rotate(180);" /&gt;
	&lt;input type="button" value="-90&deg;" onclick="rotate(-90);" /&gt;
&lt;/p&gt;


&lt;p&gt;
	&lt;img id="image" src="http://www.google.com/intl/en_ALL/images/logo.gif" alt="" /&gt;
	&lt;canvas id="canvas"&gt;&lt;/canvas&gt;
&lt;/p&gt;


&lt;/body&gt;
&lt;/html&gt;

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-05-18%2F&title=Effectuer+une+rotation+d%27image+en+CSS+%28+rotate+balise+canvas+HTML5+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-05-18/</guid>
		</item>

		<item>
			<title>O'Reilly France - Fermeture définitive ... ( oreilly.fr éditeurs de livres )</title>
			<link>http://www.ab-d.fr/date/2008-05-08/</link>
			<pubDate>Thu, 08 May 2008 22:06:10 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Actualites]]></category>
			<category><![CDATA[Internet]]></category>
			<description><![CDATA[<p>Voici le message que l'on peut lire sur le site <strong>http://www.oreilly.fr/</strong>
</p>
<p style="text-align:center;"><em>
<br />
<img src="http://www.ab-d.fr/divers/oreilly-france.gif" alt="O'Reilly France - www.oreilly.fr" title="O'Reilly France" /><br />
<br />
Fermeture définitive<br />
<br />
Les éditions O'Reilly ont fermé définitivement.<br />
<br />
Nous sommes sincèrement désolés pour le (trop) petit nombre de lecteurs qui appréciait nos ouvrages.<br />
<br />
Si vous souhaitez nous contacter, vous pouvez nous écrire à oreilly(at)immateriel(dot)fr
</em></p>

<p><br />
Voici une bien triste nouvelle...</p>

<p><strong>UPDATE</strong> : Si vous désirez connaître les suites de cette affaire, je vous invite à consulter le blog http://www.immateriel.fr/</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-05-08%2F&title=O%27Reilly+France+-+Fermeture+d%C3%A9finitive+...+%28+oreilly.fr+%C3%A9diteurs+de+livres+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-05-08/</guid>
		</item>

		<item>
			<title>Créer une copie conforme / cloner une table MySQL (Database)</title>
			<link>http://www.ab-d.fr/date/2008-05-01/</link>
			<pubDate>Thu, 01 May 2008 00:08:08 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[MySQL]]></category>
			<description><![CDATA[<p>
L'astuce suivante consiste à copier une table avec ses données, mais surtout en faire une copie conforme. Le but étant de conserver les types et les index :
</p>
<pre>
CREATE TABLE table_destination LIKE table_source ;
INSERT INTO table_destination SELECT * FROM table_source ;
</pre>

<p><br />
Le contre-exemple le plus connu est la ligne de commande suivante :
</p>
<pre>
CREATE TABLE table_destination SELECT * FROM table_source ;
</pre>
<p>
La ligne ci-dessus fera une copie des données, mais la structure de la table de destination suivera simplement les besoins de la requête <code>SELECT</code>. 
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-05-01%2F&title=Cr%C3%A9er+une+copie+conforme+%2F+cloner+une+table+MySQL+%28Database%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-05-01/</guid>
		</item>

	</channel>
</rss>
