<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Jonathan Petitcolas</title>
	
	<link>http://www.jonathan-petitcolas.com</link>
	<description>Blog d'un geek entrepreneur et globe-trotter</description>
	<pubDate>Fri, 03 Jul 2009 06:48:21 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/jonathan-petitcolas" type="application/rss+xml" /><item>
		<title>Lipdub SUPINFO Montpellier</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/xcNUx71Ocds/</link>
		<comments>http://www.jonathan-petitcolas.com/lipdub-supinfo-montpellier/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 09:50:36 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Détente]]></category>

		<category><![CDATA[lipdub]]></category>

		<category><![CDATA[SUPINFO]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=1184</guid>
		<description><![CDATA[Voici une vidéo extrêmement bien réalisée d&#8217;un lipdub (d&#8217;après Wikipédia : vidéo réalisée en plan séquence et en playback par des particuliers) sur le campus de SUPINFO Montpellier. Je vous laisse admirer.
Lipdub SCO SUPINFO Montpellier 2009par TimFufu
Je tiens au passage à remercier tous les étudiants de ce campus sur lequel je me suis bien amusé [...]]]></description>
			<content:encoded><![CDATA[<p>Voici une vidéo extrêmement bien réalisée d&#8217;un lipdub (d&#8217;après <a href="http://fr.wikipedia.org/wiki/Lip_dub">Wikipédia</a> : <em>vidéo réalisée en plan séquence et en playback par des particuliers</em>) sur le campus de SUPINFO Montpellier. Je vous laisse admirer.</p>
<div style="text-align: center; margin: 20px;"><object width="420" height="339"><param name="movie" value="http://www.dailymotion.com/swf/x9fggc" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://www.dailymotion.com/swf/x9fggc" type="application/x-shockwave-flash" width="420" height="339" allowFullScreen="true" allowScriptAccess="always"></embed></object><br /><b><a href="http://www.dailymotion.com/swf/x9fggc">Lipdub SCO SUPINFO Montpellier 2009</a></b><br /><i>par <a href="http://www.dailymotion.com/TimFufu">TimFufu</a></i></div>
<p>Je tiens au passage à remercier tous les étudiants de ce campus sur lequel je me suis bien amusé à donner cours, dans la joie et la bonne humeur ! Et ce, malgré la chaleur excessive pour un &#8220;nordiste&#8221;, même en février. ^^</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/lipdub-supinfo-montpellier/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/lipdub-supinfo-montpellier/</feedburner:origLink></item>
		<item>
		<title>Moteur de templates du PEJO framework : classe TemplateEngine</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/FClBqHuvu5E/</link>
		<comments>http://www.jonathan-petitcolas.com/moteur-templates-pejo-framework-classe-template-engine/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 08:55:51 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[moteur de templates]]></category>

		<category><![CDATA[PEJO Framework]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=1084</guid>
		<description><![CDATA[A la découverte du moteur de templates du framework PHP 5 PEJO.]]></description>
			<content:encoded><![CDATA[<p>Première étape dans la compréhension du <a href="http://www.jonathan-petitcolas.com/pejo-framework/">framework PEJO</a>, et pierre angulaire de tout cet édifice complexe, le moteur de templates permet la séparation du code PHP et du code HTML, et ce afin de simplifier un maximum le développement, et d&#8217;optimiser la répartition du travail entre intégrateur et développeur. Voyons donc le fonctionnement de cette classe centrale.</p>
<p>A noter que pour une meilleur compréhension de l&#8217;utilité des moteurs de templates, je vous invite à (re)lire mon article <a href="http://www.jonathan-petitcolas.com/creation-dun-moteur-de-templates-en-php-5-objet/">&#8220;Création d’un moteur de templates en PHP 5 objet&#8221;</a>.</p>
<p>La première partie de cette article comprendra la <a href="#utilisation">documentation de la classe</a>, ainsi qu&#8217;un <a href="#exemple">exemple d&#8217;utilisation</a>. La <a href="#details#">deuxième</a>, réservée aux développeurs souhaitant m&#8217;aider à optimiser cette classe, expliquera en détail l&#8217;intérieur des différentes méthodes. Elle ne sera en rien nécessaire à l&#8217;utilisation de ce framework.</p>
<p><span id="more-1084"></span></p>
<p style="text-align: center;"><a href="http://www.jonathan-petitcolas.com/wp-content/pejo-framework/class/common/templateEngine.php.txt">Télécharger la classe TemplateEngine, moteur de templates du framework PEJO</a></p>
<h3><a href="#" name="utilisation"></a>Méthodes de la classe TemplateEngine</h3>
<p>Cette classe contient différentes méthodes. Nous ne verrons ici, dans cette partie réservée aux utilisateurs du framework PEJO, uniquement les méthodes accessibles depuis l&#8217;extérieur, et requise pour la manipulation quotidienne de la classe.</p>
<h4>Constructeur :</h4>
<p>Tout d&#8217;abord, commençons à instancier notre moteur de template, dans le fichier <em>index.php</em> par exemple.</p>
<pre name="code" class="php">< ?php 

	require_once('templateEngine.php');

	$tpl = new TemplateEngine();

?></pre>
<p>Ce constructeur prend un paramètre booléen, <em>$localization</em>. Celui-ci permettra d&#8217;indiquer au moteur s&#8217;il doit internationaliser notre application en utilisant l&#8217;extension PHP <em>gettext</em>. Par défaut, il ne cherchera pas à le faire. Et nous non plus, pour simplifier les choses. :)</p>
<h4>Affichage de sous-templates</h4>
<p>Il est possible de séparer un fichier HTML en plusieurs sous parties. Ce que nous allons faire ici. Créons donc un fichier <em>index.html</em>, et insérons-y le code suivant :</p>
<pre name="code" class="html"><!---===== tpl_name = bonjour =====--->
&lt;p>Bonjour le monde !&lt;/p>

<!---===== tpl_name = main =====--->
<h1>Test du moteur de templates !</h1>
</pre>
<p>Ce fichier est séparé en une sous-partie d&#8217;identifiant <em>bonjour</em> et en une autre d&#8217;identifiant <em>main</em>. On remarque la syntaxe particulière de séparation des sous-parties :</p>
<pre name="code" class="html"><!---===== tpl_name = IDENTIFIANT =====---></pre>
<p>A noter qu&#8217;il faut au minimum une sous-partie par fichier, afin de pouvoir l&#8217;utiliser.</p>
<p>Comment récupérer une sous-partie depuis notre moteur de templates ? C&#8217;est le rôle de la méthode <em>GetHTMLCode</em>.</p>
<pre name="code" class="php">< ?php 

	require_once('templateEngine.php');

	$tpl = new TemplateEngine();
	$buffer = $tpl->GetHTMLCode('index.html', 'bonjour');

?></pre>
<p>La méthode <em>GetHTMLCode</em> prend deux arguments. Le premier est le nom du fichier où aller récupérer la sous-partie, et le deuxième l&#8217;identifiant de la sous-partie. Dans ce cas, notre variable <em>$buffer</em> cmoprendra donc le paragraphe <em>&#8220;Bonjour le monde !&#8221;</em>.</p>
<p>On pourra constater que ce code n&#8217;affiche rien à l&#8217;heure actuel. Pour afficher quelque chose, il nous faudra passer par la méthode <em>Output</em>.</p>
<h4>Affichage</h4>
<p>La méthode <em>Output</em> va nous permettre d&#8217;afficher le contenu de la variable passée en argument.</p>
<pre name="code" class="php">TemplateEngine::Output($buffer);</pre>
<p>Cette méthode peut-être utile au cas où vous auriez des problèmes d&#8217;affichage (problèmes d&#8217;encodage, d&#8217;échappement d&#8217;apostrophes, etc.). En effet, il vous suffira de mettre votre fonction de traitement à l&#8217;intérieur de cette méthode, sans avoir à manipuler les buffers.</p>
<h4>Utilisation de variables</h4>
<p>A présent, nous allons voir comment interfacer notre code PHP avec notre code HTML. Imaginons le code PHP suivant :</p>
<pre name="code" class="php">< ?php 

	require_once('templateEngine.php');

	$prenom = 'Jonathan';
	$nom = 'Petitcolas';

	$tpl = new TemplateEngine();
	$bonjour = $tpl->GetHTMLCode('index.html', 'bonjour');
	TemplateEngine::Output($tpl->GetHTMLCode('index.html', 'main'));

?></pre>
<p>Et effectuons quelques modifications à notre code HTML :</p>
<pre name="code" class="html"><!---===== tpl_name = bonjour =====--->
&lt;p>Bonjour ${prenom} ${nom} !&lt;/p>

<!---===== tpl_name = main =====--->
<h1>Test du moteur de templates !</h1>

${bonjour}</pre>
<p>En observant le résultat, on aura le code source suivant :</p>
<pre name="code" class="html">
<h1>Test du moteur de templates !</h1>

&lt;p>Bonjour Jonathan Petitcolas !&lt;/p></pre>
<p>Que s&#8217;est-il passé ? A la ligne 9 du code PHP, nous avons récupéré le sous-template <em>bonjour</em>. A l&#8217;intérieur, nous avons deux variables, repérées par l&#8217;écriture <em>${VARIABLE}</em>. Le moteur de templates s&#8217;est alors chargé de remplacer ces étiquettes par les valeurs des variables respectives, par l&#8217;intermédiaire de la méthode <em>GetHTMLCode</em>.</p>
<p>Après avoir placé ce code modifié dans une variable, nous l&#8217;avons affiché dans la partie <em>main</em>, avant de tout envoyer au navigateur, via la méthode statique <em>Output</em>. Rien de plus compliqué. :)</p>
<p>A présent, vous connaissez toute la théorie de niveau supérieur pour utiliser ce moteur de templates. Vous pourrez ainsi développer proprement, en séparant à la fois partie PHP et partie HTML. En effet, pour obtenir un taux de maintenabilité le plus élevé possible, il est important de séparer le code de votre application en ses différentes composantes : PHP, HTML, Javascript, CSS, etc&#8230; Tout doit être dans un fichier différent (idéalement). Nous veillerons particulièrement à cette <em>best-pratice</em> dans l&#8217;utilisation du framework PEJO.</p>
<h3><a href="#" name="exemple"></a>Exemple d&#8217;utilisation</h3>
<p>Nous allons voir ici un exemple d&#8217;utilisation de cette classe, exemple que nous aurons souvent besoin de retrouver dans la suite de nos développements, à savoir l&#8217;affichage d&#8217;un tableau (mais on pourrait aussi prendre l&#8217;affichage d&#8217;une liste, ou de tout autre élément).</p>
<p>Imaginons que nous récupérons un tableau de la couche métier de notre application. Ce tableau peut par exemple provenir d&#8217;une base de données. Pour des raisons de simplification, nous déclarerons ce tableau &#8220;en dur&#8221; dans le code.</p>
<pre name="code" class="php">$datas[0]['titre'] = 'Les Misérables'; 	$datas[0]['auteur'] = 'Victor Hugo';
$datas[1]['titre'] = 'Candide'; 		$datas[1]['auteur'] = 'Voltaire';
$datas[2]['titre'] = 'Le Cid'; 			$datas[2]['auteur'] = 'Corneille';
$datas[2]['titre'] = 'L\'Avare'; 		$datas[3]['auteur'] = 'Molière';</pre>
<p>A présent, nous voulons afficher le tout dans un tableau. Pour ce faire, modifions notre fichier HTML :</p>
<pre name="code" class="html">&lt;!---===== tpl_name = main =====---&gt;
&lt;h1&gt;Librairie&lt;/h1&gt;
&lt;table&gt;
	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th&gt;Titre&lt;/th&gt;
			&lt;th&gt;Auteur&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		${livres}
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;!---===== tpl_name = livre =====---&gt;
&lt;tr&gt;
	&lt;td&gt;${titre}&lt;/td&gt;
	&lt;td&gt;${auteur}&lt;/td&gt;
&lt;/tr&gt;</pre>
<p>Rien qu&#8217;en voyant ce code, vous devriez être en mesure de deviner le cheminement. Nous allons concaténer dans une variable <em>${livres}</em> le contenu du sous-template <em>livre</em>, en faisant varier <em>${titre}</em> et <em>${auteur}</em> grâce aux données de notre tableau. </p>
<p>Traduisons donc cela en PHP :</p>
<pre name="code" class="php">< ?php 

	require_once('templateEngine.php');

	$datas[0]['titre'] = 'Les Misérables'; 	$datas[0]['auteur'] = 'Victor Hugo';
	$datas[1]['titre'] = 'Candide'; 		$datas[1]['auteur'] = 'Voltaire';
	$datas[2]['titre'] = 'Le Cid'; 			$datas[2]['auteur'] = 'Corneille';
	$datas[2]['titre'] = 'L\'Avare'; 		$datas[3]['auteur'] = 'Molière';

	$tpl = new TemplateEngine();

	foreach($datas as $livre)
	{
		$titre 	= $livre['titre'];
		$auteur = $livre['auteur'];

		$livres .= $tpl->GetHTMLCode('index.html', 'livre');
	}

	TemplateEngine::Output($tpl->GetHTMLCode('index.html', 'main'));

?></pre>
<p>Je ne m&#8217;étendrais pas davantage dans les explications, étant donné que le paragraphe précédant est suffisamment explicite.</p>
<p>Une petite remarque cependant, destinée aux développeurs. De nombreux stagiaires ayant travaillé sur mon moteur de templates me posent la : pourquoi ne pas prévoir une méthode nous permettant d&#8217;écrire directement dans le HTML une variable sous la forme (par exemple) : <em>${livre['titre']}</em>. Je refuse ce développement, et ce pour une simple raison.</p>
<p>Si nous insérons l&#8217;élément du tableau directement dans le HTML, cela nous fera perdre la possibilité d&#8217;effectuer une mise en forme sur l&#8217;élément avant de l&#8217;afficher. Par exemple, si notre tableau contient un élément de type <em>timestamp</em> (à savoir le nombre de secondes écoulées depuis le 1er janvier 1970), il est bien plus ergonomique d&#8217;afficher la date au format humain (par exemple 12/03/2008) plutôt que cet entier incompréhensible. La conversion se fait en PHP, et doit donc être dans le fichier <em>index.php</em>. Suivant cette logique, la question n&#8217;a plus lieu d&#8217;être.</p>
<p>Ainsi s&#8217;achève cet exemple. Ainsi que la partie &#8220;grand public&#8221; (bien que public très restreint) se termine. La suite est réservée aux développeurs souhaitant comprendre les fondations de ce framework, et pourquoi pas le faire évoluer. :)</p>
<h3>Documentation technique</h3>
<p>Si vous êtes encore là, c&#8217;est que vous n&#8217;avez pas peur de mettre les mains dans le cambouis. Bravo ! :)</p>
<p>Voici donc une petite documentation technique, qui vous permettra d&#8217;approfondir davantage le fonctionnement de la classe, au cas où certains commentaires vous sembleraient obscurs. Allons-y donc méthode par méthode. :)</p>
<h4>Constructeur</h4>
<pre name="code" class="php">/**
* Initializes all options of our templates engine.
* @param $localization		Will our application be internationalized (with PHP extension gettext)? Default: no.
* @return void
*/
public function __construct($localization = false)
{
	$this->files = array();
	$this->subtemplates = array();
	$this->localization = $localization;
}</pre>
<p>Ici, rien de particulier à indiquer, si ce n&#8217;est l&#8217;utilité des variables. L&#8217;attribut <em>$files</em> contiendra les fichiers déjà parsés de notre moteur de templates, ce qui permettra une sorte de mise en cache, dans le but d&#8217;optimiser les performances. L&#8217;attribut <em>subtemplates</em>, quant à lui, permettra de stocker le contenu de chacune des parties, afin de faciliter les traitements ultérieurs internes au moteur. Quant à <em>$localization</em>, cela nous permettra de garder en mémoire si nous devons utiliser l&#8217;extension PHP <em>gettext</em> ou non, pour internationaliser notre application.</p>
<h4>Méthode GetHTMLCode</h4>
<pre name="code" class="php">/**
 * Transforms a sub-template to the HTML output.
 * @param $filename	File containing the used sub-template.
 * @param $subtemplate Name of the subtempalte to use.
 * @return string HTML code ready to be displayed.
 */
public function GetHTMLCode($filename, $subtemplate)
{
	$this->ParseFile($filename);					// Reads the sub-template
	return $this->Evaluate($filename, $subtemplate);	// Replaces all HTML variables.
}</pre>
<p>Pas grand chose à dire sur cette fonction, les commentaires se suffisant à eux-mêmes. :)</p>
<h4>Méthode ParseFile</h4>
<pre name="code" class="php">/**
 * Reads the file and extracts all sub-templates.
 * @param $filename File to parse.
 * @return void
 */
private function ParseFile($filename)
{
	// If the file has already be parsed, we do not parse it again.
	if($this->files[$filename] !== true)
	{
		// Retrieving file content.
		$filename = addslashes($filename);
		if(!file_exists($filename))	throw new Exception('File '.$filename.' does not exist.');
		$this->files[$filename] = file_get_contents($filename);

		// Retrieving all sub-templates from file.
		$this->GetSubTemplates($filename);
	}
}</pre>
<p>Ce code est légèrement plus complexe. Cette méthode va lire le contenu du fichier <em>$filename</em>, s&#8217;il n&#8217;a pas déjà été lu. En effet, si on a déjà parsé ce fichier dans le passé, l&#8217;attribut <em>$this->files[$filename]</em> vaudra <em>true</em>. Et ainsi, il sera inutile de relire ce fichier, étant donné que nous avons déjà ses sous-parties en mémoire dans l&#8217;attribut <em>subtemplates</em>. On ne rentrera pas dans la structure de contrôle.</p>
<p>Afin de simplifier la saisie de l&#8217;utilisateur, on échappe automatiquement les slashes. Sans cette ligne, le nom du fichier aurait dû, pour un maximum de compatibilité, contenir des doubles slashes, chose assez rébarbative, il faut bien l&#8217;avouer.</p>
<p>Le fichier est alors lu (s&#8217;il existe) et son contenu placé dans <em>$this->files</em>.</p>
<h4>Méthode GetSubTemplates</h4>
<p>Comme indiqué dans la documentation utilisateur un peu plus haut dans cet article, chaque fichier sera décomposé en plusieurs sous-parties, appelées sous-templates. Chaque sous-partie sera séparée par : <em><!---===== tpl_name = TEMPLATE_NAME =====---></em>, où TEMPLATE_NAME sera remplacé par un nom unique dans chaque fichier, identifiant de cette partie.</p>
<pre name="code" class="php">/**
 * Retrieving all sub-templates from a given file.
 * @param $filename	File from which to extract sub-templates.
 * @return void
 */
private function GetSubTemplates($filename)
{
	/**
	 * All sub-templates will look like the following:
	 *
	 * 		<!---===== tpl_name = TEMPLATE_NAME =====--->
	 * 		&lt;h1>This is my sub-templates&lt;/h1>
	 *
	 * No closing tags are required.
	 */

	// Splitting the file in sub-templates.
	$explosion = explode('<!---===== tpl_name = ', $this->files[$filename]);

	// Retrieving the name and content for each sub-template.
	foreach($explosion as $tmp)
	{
		$tmp = 	explode(' =====--->', $tmp);

		$subTemplateName	= $tmp[0];
		$subTemplateContent = $tmp[1];

		// If internationalized, we translate it now with gettext extension.
		$this->subtemplates[$filename][$subTemplateName] = ($this->localization ? $this->Localize($subTemplateContent) : $subTemplateContent);
	}

	// If the file is parsed, we replace the textual content heavy in memory by a single bit.
	$this->files[$filename] = true;
}</pre>
<p>On découpe notre fichier en sous-templates ligne 18 grâce à la fonction <em>explode</em>. Nous aurons alors dans <em>$explosion</em> l&#8217;ensemble de nos sous-templates, contenant encore l&#8217;identifiant et le morceau parasite <em>=====&#8212;></em>. Qu&#8217;à cela ne tienne, nous séparons le nom du contenu grâce à l&#8217;explosion de la ligne 23. </p>
<p>Pourquoi ne pas avoir pris une expression régulière pour effectuer cette découpe ? Pour des raisons de performances, un <em>explode</em> étant bien plus rapide qu&#8217;une REGEX. D&#8217;autre part, cela est bien plus simple à appréhender. Et comme le disait si justement mon prof de mécanique en hypotaupe : <em>on va pas prendre un char d&#8217;assaut pour percer un trou de 8 !</em>. Tout est dit. :p</p>
<p>On range alors le contenu de notre template (éventuellement internationalisé grâce à l&#8217;extension <em>php_gettext</em> grâce à la méthode <em>Localize</em>) dans le tableau associatif <em>$subtemplates</em>, classé par nom de fichier et nom de template.</p>
<p>Enfin, pour nous assurer que nous ne relirons pas le même fichier deux fois et donc mettre en place une mise en cache de base, nous remplaçons le contenu de notre fichier dans la variable <em>$files</em> relativement coûteux en mémoire par un simple <em>true</em>, codé sur un seul et simple bit.</p>
<h4>Méthode Evaluate</h4>
<p>Cette méthode va nous permettre de remplacer nos variables (de la forme <em>${VARIABLE}</em>) par leur valeur dans notre code HTML.</p>
<pre name="code" class="php">/**
 * Replaces all variables by their content in the HTML file.
 * @param $filename File where to replace the variables.
 * @param $subtemplate Sub-template to use.
 * @return string HTML code ready to be displayed.
 */
private function Evaluate($filename, $subtemplate)
{
	/**
	 * All variables will be written in the HTML code with ${VARIABLE_NAME}.
	 */

	// Retrieving the localized (or not) HTML content, without replacing variables.
	$evaluatedCode = $this->subtemplates[$filename][$subtemplate];

	// Retrieving all variables names from the sub-template.
	preg_match_all('#\${(.*)}#U', $evaluatedCode, $variables);
	$variables = $variables[1];

	// Replacing the value of each variable.
	foreach ($variables as $variable)
	{
		global $$variable;
		$evaluatedCode = str_replace('${'.$variable.'}', $$variable, $evaluatedCode);
	}

	// Returns the code with variable values inside.
	return $evaluatedCode;
}</pre>
<p>Nous récupérons d&#8217;abord tous les noms de variables grâce à l&#8217;expression régulière ligne 17.</p>
<p>Puis, pour chaque noms de variables contenus dans <em>$variables</em>, on travaille sur la variable <em>$$variable</em>. On va en fait utiliser une variable du nom la valeur contenue dans <em>$variable</em>. Petit exemple, qui sera sans doute bien plus explicite :</p>
<pre class="php" name="code">$a = 1;
$variable = 'a';
echo $$variable;</pre>
<p>Ici, afficher <em>$$variable</em> est équivalent à afficher <em>$a</em>, donc 1. Pratique n&#8217;est-ce pas ? :p</p>
<p>On place donc notre variable en <em>global</em>, ce qui nous permettra de récupérer la valeur de celle-ci lors de son initialisation dans notre script PHP (nous évitant ainsi de devoir la passer en paramètre de notre méthode). Puis, nous remplaçons simplement l&#8217;écriture <em>${variable}</em> dans notre code HTML avec la fonction <em>str_replace</em>, plus performant qu&#8217;une autre expression régulière.</p>
<h4>Méthode Localize</h4>
<p>Nous n&#8217;allons pas nous étendre très profondément sur cette méthode, un futur article traitant de l&#8217;internationalisation de nos applications (prévue par le framework : je vous avais dit que c&#8217;était un truc sympa ! (-:) étant prévu.</p>
<pre class="php" name="code">/**
 * Translates the content of a sub-template thanks to gettext PHP extension.
 * @param $content Content of the sub-template to translate.
 * @return string Translated content.
 */
private function Localize($content)
{
	/**
	 * All texts to internationalize will be written like the following: _("Text to translate.").
	 */

	// Retrieving text to internationalize.
	preg_match_all('#_\(\"(.+)\"\)#Us', $content, $unlocalizedTexts);
	$unlocalizedTexts = $unlocalizedTexts[1];

	// Translating all pieces of text.
	foreach($unlocalizedTexts as $unlocalizedText)
	{
		$content = preg_replace('#_\(\"'.$unlocalizedText.'\"\)#Us', gettext($unlocalizedText), $content);
	}

	// Returns the translated text.
	return $content;
}</pre>
<p>Dans notre template, il est possible d&#8217;internationaliser du texte. Celui-ci devra être compris entre les chaînes de caractères : <em>_(&#8221;Texte à traduire&#8221;)</em>. Il s&#8217;agit de la syntaxe la plus proche de l&#8217;extension <em>gettext</em>, d&#8217;où ce choix. Cependant, étant donné que la traduction passe par le moteur de templates, vous pouvez modifier celle-ci si elle ne vous plaît pas.</p>
<p>Nous récupérons donc tous les textes à traduire ligne ligne 13, et nous les remplaçons par leurs versions traduites à la ligne 19, en utilisant la méthode <em>gettext</em>, qui cherchera des correspondances dans notre fichier de langue.</p>
<p>Ainsi s&#8217;achève les méthodes plutôt techniques. Voyons donc les deux dernières, qui reposeront le cerveau. </p>
<h4>Méthode Output</h4>
<p>Cette méthode va permettre d&#8217;afficher le contenu d&#8217;une variable, en lui appliquant éventuellement un ou plusieurs traitements.</p>
<pre name="code" class="php">/**
 * Writes a buffer, results of some templates engine treatments. Static function for better performances.
 * @param $buffer Text to write.
 * @return void
 */
public static function Output($buffer)
{
	// You will be able to use here some display functions depending your configuration, as the following:

	// $buffer = utf8_encode($buffer);
	// $buffer = strip_slashes($buffer);

	echo $buffer;
}</pre>
<p>Tout d&#8217;abord, on remarque que cette méthode est statique. Et pour cause, une méthode statique est 4 fois plus efficace (environ) qu&#8217;une méthode non statique (dynamique ?). </p>
<p>Cette fonction affiche simplement notre variable. C&#8217;est une sur-couche de <em>echo</em> en quelques sortes. Pourquoi avoir fait cela ? Simplement pour vous permettre d&#8217;encoder en UTF-8, de retirer des slashes en trop, ou que sais-je encore&#8230; avant l&#8217;affichage. Un comportement un peu similaire aux filtres WordPress pour les connaisseurs. Cela vous évitera donc de manipuler les buffers, à la documentation plutôt énigmatique et à l&#8217;utilité contestable, si on pense bien son code. ;)</p>
<h4>Méthode Debug</h4>
<p>Cette méthode se retrouve dans toutes les classes du framework PEJO, et permet d&#8217;afficher à l&#8217;instant <em>t</em> le contenu de notre classe.</p>
<pre name="code" class="php">/**
 * Used to print the content of our template engine. For debug purposes.
 * @return void
 */
public function Debug()
{
	echo '&lt;pre>';
	print_r($this);
	die('&lt;/pre>');
}</pre>
<p>Cela se passe de commentaires.</p>
<p style="text-align: center;"><a href="http://www.jonathan-petitcolas.com/wp-content/pejo-framework/class/common/templateEngine.php.txt">Télécharger la classe TemplateEngine, moteur de templates du framework PEJO</a></p>
<p>Ainsi s&#8217;achève cet article sur le moteur de templates du framework PEJO. N&#8217;hésitez surtout pas à me faire part de vos remarques (c&#8217;est après tout le but de la publicisation de ce framework) ou de vos questions. Les commentaires sont faits pour ça après tout. ;)</p>
<p>Prochaine étape dans notre découverte de ce framework : l&#8217;arborescence normalisée et le routeur de navigation. Patience&#8230; :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/moteur-templates-pejo-framework-classe-template-engine/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/moteur-templates-pejo-framework-classe-template-engine/</feedburner:origLink></item>
		<item>
		<title>HADOPI démolie par le Conseil constitutionnel</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/WJRGyFYT3_g/</link>
		<comments>http://www.jonathan-petitcolas.com/hadopi-demolie-conseil-constitutionnel/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 07:05:16 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Politique]]></category>

		<category><![CDATA[christine albanel]]></category>

		<category><![CDATA[droits de l'homme]]></category>

		<category><![CDATA[hadopi]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=1121</guid>
		<description><![CDATA[
Le Conseil Constitutionnel a rendu avant-hier (mercredi 10 juin) sa décision concernant la loi &#8220;Création et Internet&#8221;, aussi connue sous projet HADOPI. Que dit cette décision, très simple à lire au demeurant (les juristes ont fait de grands efforts au niveau de la vulgarisation des documents) ? Que du bon amis technophiles, que du bon [...]]]></description>
			<content:encoded><![CDATA[<div class="floatLeft" style="padding-left: 20px;"><a href="http://www.laquadrature.net/files/hadopi-mortuaire.jpg"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2009/06/hadopi-rip.jpg" alt="HADOPI, repose en paix !" title="HADOPI, repose en paix !" width="200" height="161" class="size-full wp-image-1135" /></a></div>
<p>Le Conseil Constitutionnel a rendu avant-hier (mercredi 10 juin) sa <a href="http://www.conseil-constitutionnel.fr/conseil-constitutionnel/francais/les-decisions/2009/decisions-par-date/2009/2009-580-dc/decision-n-2009-580-dc-du-10-juin-2009.42666.html">décision concernant la loi &#8220;Création et Internet&#8221;</a>, aussi connue sous projet HADOPI. Que dit cette décision, très simple à lire au demeurant (les juristes ont fait de grands efforts au niveau de la vulgarisation des documents) ? Que du bon amis technophiles, que du bon !</p>
<p>Comme indiqué maintes et maintes fois par l&#8217;opposition, par la communauté des bloggueurs, par différents médias, par différentes groupes et collectifs indépendants tels que la <a href="http://www.laquadrature.net/">Quadrature du Net</a>, le Conseil Constitutionel s&#8217;est prononcé à l&#8217;encontre de cette loi liberticide. Ainsi, cette décision rappelle la déclaration des droits de l&#8217;homme et du citoyen de 1789, qui a été oubliée par notre ministre, Christine Albanel. </p>
<p><span id="more-1121"></span></p>
<p>Tout d&#8217;abord, la liberté d&#8217;expression :</p>
<blockquote><p>La <strong>liberté de communication et d&#8217;expression</strong>, énoncée à l&#8217;article 11 de la Déclaration des droits de l&#8217;homme et du citoyen de 1789, fait l&#8217;objet d&#8217;une constante jurisprudence protectrice par le Conseil constitutionnel (voir dernièrement décision n °2009-577 DC du 3 mars 2009). Cette liberté implique aujourd&#8217;hui, eu égard au développement généralisé d&#8217;internet et à son importance pour la participation à la vie démocratique et à l&#8217;expression des idées et des opinions, la <strong>liberté d&#8217;accéder à ces services de communication au public en ligne</strong>.</p>
<p>Or les articles 5 et 11 de la loi déférée confiaient à la commission de protection des droits de la HADOPI des pouvoirs de sanction l&#8217;habilitant à <strong>restreindre ou à empêcher l&#8217;accès à Internet à des titulaires d&#8217;abonnement</strong>. Ces pouvoirs pouvaient donc conduire à restreindre l&#8217;exercice, par toute personne, de son droit de s&#8217;exprimer et de communiquer librement. Dans ces conditions, le législateur ne pouvait, quelles que soient les garanties encadrant le prononcé des sanctions, confier de tels pouvoirs à une autorité administrative dans le but de protéger les titulaires du droit d&#8217;auteur. <strong>Ces pouvoirs ne peuvent incomber qu&#8217;au juge</strong>.</p></blockquote>
<p>Ainsi, il est naturellement hors de question de conférer à une autorité indépendante le pouvoir d&#8217;un juge, seul apôtre de la justice capable de punir le citoyen, déjà en temps normal, mais encore plus lorsqu&#8217;il s&#8217;agit d&#8217;un vecteur d&#8217;information et d&#8217;éducation tel qu&#8217;Internet.</p>
<p>Autre point que le gouvernement semble remettre en question, la présomption d&#8217;innocence. </p>
<blockquote><p>L&#8217;article 9 de la Déclaration de 1789 pose le principe de la <strong>présomption d&#8217;innocence</strong> duquel il résulte que la loi ne saurait, en principe, instituer de présomption de culpabilité en matière répressive (n° 99-411 DC du 16 juin 1999). Or, aux termes de la loi déférée, seul le titulaire du contrat d&#8217;abonnement à internet pouvait faire l&#8217;objet des sanctions instituées. Pour s&#8217;exonérer, il lui incombait de produire des éléments de nature à établir que l&#8217;atteinte portée au droit d&#8217;auteur procède de la fraude d&#8217;un tiers. En méconnaissance de l&#8217;article 9 de la Déclaration de 1789, <strong>la loi instituait</strong> ainsi, en opérant un renversement de la charge de la preuve, <strong>une présomption de culpabilité pouvant conduire à prononcer contre l&#8217;abonné des sanctions privatives ou restrictives du droit</strong>.</p></blockquote>
<p>Et en effet&#8230; Si votre IP est découverte comme adresse source de téléchargements illégaux (ou même du téléchargement de distributions Linux via peer-to-peer : comment différencier les deux flux, l&#8217;un tout à fait légal l&#8217;autre non ? d&#8217;autant plus quand on voit l&#8217;incompétence complète de la majeure partie de nos politiciens vis à vis des nouvelles technologies !), vous deviez, avec cette loi incohérente, prouver d&#8217;une part que ce n&#8217;était pas vous qui téléchargiez ainsi et que vous étiez simplement la victime d&#8217;un méchant pirate ; d&#8217;autre part que vous aviez assuré un niveau de sécurité &#8220;maximal&#8221; (comprendre l&#8217;installation d&#8217;un mouchard) pour vous prémunir de toute attaque. Délires ministériels sans doute. Quoiqu&#8217;il en soit, le Conseil Constitutionnel a réprimé cet aspect de la loi.</p>
<p>Mais ce n&#8217;est pas fini. Autre point fondamental que cette loi voulait tout simplement supprimer : le respect de la vie privée.</p>
<blockquote><p>Considérant que, selon les requérants, la loi déférée opère une conciliation manifestement déséquilibrée entre la protection des droits d&#8217;auteur et le droit au respect de la vie privée ; que l&#8217;objectif poursuivi par le législateur nécessiterait la mise en oeuvre de mesures de surveillance des citoyens et l&#8217;instauration d&#8217;un &#8221; contrôle généralisé des communications électroniques &#8221; incompatibles avec l&#8217;exigence constitutionnelle du droit au respect de la vie privée ; que les requérants font valoir que les pouvoirs reconnus aux agents privés, habilités à collecter les adresses des abonnés suspectés d&#8217;avoir partagé un fichier d&#8217;oeuvre protégée, ne sont pas encadrés par des garanties suffisantes ; </p></blockquote>
<p>Ainsi, au revoir récolte des adresses IP, mouchard et surveillances des communications électroniques ! Ouf ! Seul bémol : que va-t-il arriver à <a href="http://www.jonathan-petitcolas.com/tf1-licenciement-de-jerome-bourreau-guggenheim-vers-une-democratie-totalitaire/">Jérome Bourreau-Guggenheim, licencié par TF1 pour son opinion anti-HADOPI, déclarée par email</a> ? Mystère&#8230;</p>
<p>Bref, des avancées qui vont bien plus dans le sens démocratique que les lois édictées par nos dirigeants. Mais il est vrai que contrôler Internet n&#8217;est pas chose facile, tant la liberté est un principe fondamental de l&#8217;Homme.</p>
<p>Cette loi est donc vidée de son contenu, et ne reste plus qu&#8217;une vulgaire machine d&#8217;envoi d&#8217;emails. Mais aussi, tout comme l&#8217;indique très ironiquement <a href="http://maitre-eolas.fr/2009/06/11/1447-in-memoriam-hadopi">maître Eolas</a> :</p>
<blockquote><p> La HADOPI se contentera donc de délivrer son label “ ici, on télécharge légalement, lol ” à qui en fera la demande, et remplira ses autres missions, purement consultatives.</p></blockquote>
<p>Je n&#8217;en reste pas moins dégoûté quant à la France :</p>
<ul>
<li>Être obligé d&#8217;aller jusqu&#8217;au Conseil Constitutionnel pour respecter la liberté d&#8217;expression et la présomption d&#8217;innocence, deux principes clefs de la déclaration des droits de l&#8217;homme et du citoyen, </li>
<li>Rester aussi insensible à l&#8217;opposition, qui elle au moins, apporte des faits et des arguments concrets et valables, </li>
<li>Laisser des dirigeants aussi éloignés de la sphère technologique édicter des lois régulant le monde virtuel, </li>
<li>Organiser des lois pour assurer la survie d&#8217;industries incapables de s&#8217;adapter à leurs modèles économiques : sont-ce les citoyens ou les lobbies qui établissent indirectement (ou pas) la loi ?</li>
</ul>
<p>Mais, bien qu&#8217;HADOPI étant une vulgaire coquille vide, il ne faut pas baisser les bras pour autant, étant donné la présence imminente de la loi LOPPSI, cette fois-ci pour assurer la &#8220;sécurité intérieure&#8221; (comprendre la légalisation de l&#8217;espionnage du citoyen lambda). Bref, <em>&#8220;la France, tu l&#8217;aimes ou tu la quittes&#8221;</em>&#8230; Je dois avouer que j&#8217;envisage de plus en plus la seconde solution. Et je ne suis pas le seul&#8230; </p>
<p>Enfin, pour clore cet article, une petite piqûre de rappel à notre amie Christine : le talk Orange-Le Figaro effectué le 29 avril dernier, concernant cette même loi.</p>
<div style="text-align: center; margin-bottom: 20px;"><object id="iLyROoafJym9" type="application/x-shockwave-flash" data="http://sa.kewego.com/swf/p3/epix.swf" width="400" height="300"><param name="flashVars" value="language_code=fr&#038;playerKey=f5c5b9689b58&#038;skinKey=&#038;sig=iLyROoafJym9&#038;autostart=false" /><param name="movie" value="http://sa.kewego.com/swf/p3/epix.swf" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /></object></div>
<p>Aura-t-elle le <del datetime="2009-06-12T06:19:48+00:00">bon sens</del> courage de démissionner ? Rien n&#8217;est moins sûr, étant donné que, preuve de son entêtement démentiel, elle s&#8217;est elle-même <em>&#8220;félicité que le principe d’un dispositif pédagogique de prévention du piratage ait été validé par le Conseil constitutionnel&#8221;</em>. Oui, vous avez bien lu&#8230; C&#8217;est beau n&#8217;est-ce pas, autant de mauvaise foi ? >_< </ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/hadopi-demolie-conseil-constitutionnel/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/hadopi-demolie-conseil-constitutionnel/</feedburner:origLink></item>
		<item>
		<title>Hacks CSS et commentaires conditionnels</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/lFLRxgVNQO8/</link>
		<comments>http://www.jonathan-petitcolas.com/hacks-css-et-commentaires-conditionnels/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 16:00:11 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=1041</guid>
		<description><![CDATA[Tout développeur Web est un jour confronté à la dure réalité des différents navigateurs. En effet, que ce soit en Javascript ou en CSS, chacun se permet quelques libertés par rapport aux normes du W3C. Outre le fait que cela soit totalement aberrant (des normes ne sont-elle pas faîtes pour être suivies et faciliter l&#8217;interopérabilité [...]]]></description>
			<content:encoded><![CDATA[<p>Tout développeur Web est un jour confronté à la dure réalité des différents navigateurs. En effet, que ce soit en Javascript ou en CSS, chacun se permet quelques libertés par rapport aux normes du <a href="http://www.w3.org">W3C</a>. Outre le fait que cela soit totalement aberrant (des normes ne sont-elle pas faîtes pour être suivies et faciliter l&#8217;interopérabilité ?), cela a de lourdes répercussions en terme de développement.</p>
<p>La solution pour pallier à tous ces problèmes de compatibilité en Javascript est l&#8217;utilisation d&#8217;un framework, qui a l&#8217;avantage d&#8217;être compatible avec de nombreux navigateurs et qui vous simplifie par la même occasion grandement le code. Nous pouvons par exemple citer le framework <a href="http://www.mootools.net">MooTools</a>.</p>
<p>En CSS en revanche, les choses sont un peu plus difficiles. En effet, il n&#8217;existe pas réellement de framework (si ce n&#8217;est pour mettre grossièrement en page votre site). Et il arrive très souvent de déceler des écarts importants, des chevauchements inesthétiques, des couleurs qui varient (si, si, ça arrive !), etc. Comment faire ? Eh bien, il existe essentiellement 2 méthodes.</p>
<p><span id="more-1041"></span></p>
<h3>Hacks CSS</h3>
<p>Cette technique consiste à jouer sur les différences d&#8217;interprétation des navigateurs. Ainsi, il sera possible de donner une règle pour un navigateur uniquement (par exemple IE7), sans que les autres n&#8217;arrivent à la comprendre. Ainsi, seul le navigateur concerné l&#8217;appliquera. </p>
<p>Souvent, les développeurs considèrent cette méthode comme &#8220;sale&#8221;. Et pour cause, jouer avec les libertés très particulières offertes par rapport aux normes est plutôt dangereux. Imaginez une mise à jour qui modifie ce comportement. Outre le fait que vous ne serez pas forcément prévenu dès le départ (la veille technologique ayant ses limites), il va falloir répondre très rapidement à ce changement, afin que celui-ci soit le moins visible pour vos visiteurs.</p>
<p>Voici une liste de hacks pour les navigateurs les plus courants. Ici, on appliquera une couleur de fond différente pour chaque navigateur. Par défaut, elle est argentée.</p>
<pre name="code" class="css">body { background-color: silver; }</pre>
<h4>Hack IE6 :</h4>
<p>Pour tous ceux qui développeraient encore sur navigateur déprécié (même par Microsoft), voici le très célèbre hack :</p>
<pre name="code" class ="css">* html body { background-color: red; }</pre>
<p>A noter que je ne développe plus, aussi bien à titre personnel que professionnel, pour ce navigateur. Il est temps d&#8217;évoluer un peu, sans quoi nous serions encore à réaliser des sites optimisés pour du 680&#215;460. :o</p>
<h4>Hack IE7 :</h4>
<p>IE7 est relativement incontournable, étant donné qu&#8217;il s&#8217;agit de la version la plus répandue. On le CSS-hacke avec&nbsp;:</p>
<pre name="code" class ="css">*+html body { background-color: green; }</pre>
<h4>Hack IE8 :</h4>
<p>Pensons à l&#8217;avenir, et préparons immédiatement notre site pour IE8, qui commence tout doucement à être adopté.</p>
<pre name="code" class ="css">body { background-color/*\**/: blue\9 }</pre>
<p>Petite remarque ici : vous serez obligé de répéter le sélecteur autant de fois que d&#8217;attributs modifiés. Cela peut vite s&#8217;avérer relativement lourd, mais c&#8217;est, à ma connaissance, la seule solution.</p>
<h4>Hack Firefox :</h4>
<p>Un hack Firefox est une chose plutôt étrange, étant donné que ce navigateur est le plus répandu pour le développement Web, en raison notamment de son respect des normes et de la diversité de ses plug-ins. Il est donc logique de développer et d&#8217;optimiser pour ce navigateur, faisant de petites adaptations pour les autres. Mais, sait-on jamais, ce hack pourrait peut-être vous servir&#8230;</p>
<pre name="code" class ="css">html>/**/body, x:-moz-any-link, x:default { background-color: yellow;}</pre>
<h4>Hack Safari / Chrome :</h4>
<p>A présent, une propriété CSS que je ne connaissais même pas avant d&#8217;apprendre ce hack :</p>
<pre name="code" class ="css">body:nth-of-type(1) { background-color: red; }</pre>
<p>Je pense avoir fait le tour de tous les principaux navigateurs. A noter que, comme expliqué précédemment, ces morceaux de code sont susceptibles d&#8217;être rendus caducs par une mise à jour de ces navigateurs. A consommer avec modération donc. ;)</p>
<p>Quant à Opera, je ne l&#8217;ai pas oublié, mais n&#8217;ai pas réussi à lui trouver de hacks exclusifs. Si vous en avez, n&#8217;hésitez pas à les partager en commentaires. :)</p>
<h3>Commentaires conditionnels</h3>
<p>Les commentaires conditionnels sont une caractéristique spécifique à Internet Explorer. Cet écart par rapport aux normes permet aux intégrateurs CSS de se simplifier grandement la vie en jouant sur la propriété de <em>cascade</em> des feuilles de style : toute propriété définit une seconde (ou plus) fois écrase la valeur précédente.</p>
<p>Ainsi, le développeur mettra en place une feuille de style pour les navigateurs &#8220;normaux&#8221;. Généralement, Firefox, les autres tels que Safari n&#8217;ayant pas de grandes différences d&#8217;interprétation par rapport au renard orange. Puis, il mettra en place d&#8217;autres feuilles de style venant surcharger les propriétés posant problèmes sous IE. Ces feuilles de style ne seront chargées QUE par le produit de la firme de Redmond.</p>
<p>Voici la syntaxe des commentaires conditionnels :</p>
<pre name="code" class="html">&lt;!--[if IE]&gt;
<link rel="stylesheet" href="ie.css" type="text/css" media="screen" />&lt;![endif]--&gt;</pre>
<p>Mais, encore plus intéressant, nous pouvons choisir la bonne feuille de style en fonction de la version d&#8217;Internet Explorer. Par exemple :</p>
<pre name="code" class="html">&lt;!--[if IE 8]&gt;
<link rel="stylesheet" href="ie8.css" type="text/css" media="screen" />&lt;![endif]--&gt;
&lt;!--[if IE 7]&gt;
<link rel="stylesheet" href="ie7.css" type="text/css" media="screen" />&lt;![endif]--&gt;
&lt;!--[if IE 6]&gt;
<link rel="stylesheet" href="ie6.css" type="text/css" media="screen" />&lt;![endif]--&gt;</pre>
<p>Ainsi, pour chaque version, vous pourrez appliquer une feuille de style particulière. Je vous conseille vivement de respecter cet ordre : du navigateur respectant le plus les normes à celui qui les respectent le moins. Ainsi, on pourra procéder par ajustements successifs, s&#8217;éloignant petit à petit des normes.</p>
<h3>Hacks et commentaires conditionnels : c&#8217;est quoi le mieux ?</h3>
<p>Dans l&#8217;absolu, aucun des deux. Dans un monde parfait, il ne faudrait pas avoir à utiliser ce genre de contournement des normes. Si le <a href="http://www.w3.org">W3C</a> édicte des normes, ce n&#8217;est pas seulement pour 5 gus dans un garage (petite dédicace à Cricri !), mais bel et bien pour harmoniser tous ces comportements. Mais cela relèverait presque de la science-fiction.</p>
<p>Personellement, ma préférence se porte pour les hacks. Et ce pour la simple raison que le navigateur n&#8217;aura à récupérer qu&#8217;un seul fichier, et non pas plusieurs, ce qui optimisera légèrement (mais toute optimisation est bonne à prendre) le chargement de la page. Qui plus est, il sera plus facile de se repérer dans vos feuilles de style. Lire du code centralisé dans un seul fichier est toujours plus simple que de changer régulièrement de sources. ;)</p>
<p>Et enfin, pour se détendre un peu après cet article technique, une dernière explication CSS :</p>
<div style="text-align: center; margin-bottom: 20px;"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2009/06/z-index.jpg" alt="CSS : explication sexy du z-index" title="CSS : explication sexy du z-index" width="476" height="394" class="size-full wp-image-1071" /></div>
<p>Qui a dit que le métier d&#8217;infographiste était pénible ? :p</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/hacks-css-et-commentaires-conditionnels/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/hacks-css-et-commentaires-conditionnels/</feedburner:origLink></item>
		<item>
		<title>Shadoks : la persévérance est la clef du succès !</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/IjXfGYx-pYY/</link>
		<comments>http://www.jonathan-petitcolas.com/shadoks-la-perseverance-est-la-clef-du-succes/#comments</comments>
		<pubDate>Sat, 23 May 2009 12:47:06 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Détente]]></category>

		<category><![CDATA[shadoks]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=1034</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2009/05/shadoks-plus-rate-plus-chances-marche.jpg" alt="Plus ça rate, plus on a de chances que ça marche !" title="Plus ça rate, plus on a de chances que ça marche !" width="397" height="571" class="size-full wp-image-1035" /></div>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/shadoks-la-perseverance-est-la-clef-du-succes/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/shadoks-la-perseverance-est-la-clef-du-succes/</feedburner:origLink></item>
		<item>
		<title>La tragique histoire de Roméo et Juliette - Comedia dell Arte</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/Tpp81XTGIgI/</link>
		<comments>http://www.jonathan-petitcolas.com/la-tragique-histoire-de-romeo-et-juliette-comedia-dell-arte/#comments</comments>
		<pubDate>Sun, 17 May 2009 09:15:52 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Détente]]></category>

		<category><![CDATA[Comedia dell Arte]]></category>

		<category><![CDATA[théâtre]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=1023</guid>
		<description><![CDATA[
Afin de remplir mon quota de vie sociale mensuelle, je me suis rendu, hier soir, au théâtre Akteon afin de voir une représentation tragi-comique de la Comedia dell Arte. Une interprétation originale de &#8220;Roméo et Juliette&#8221;, réalisée par 5 acteurs jeunes et dynamiques, le tout dans un petit théâtre sympathique d&#8217;une soixantaine de places.
Une ambiance [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2009/05/tragique-histoire-romeo-juliette-comedia-del-arte.jpg" alt="La tragique histoire de Roméo et Juliette" title="La tragique histoire de Roméo et Juliette" width="240" height="339" class="size-full wp-image-1024 alignright" /></p>
<p>Afin de remplir mon quota de vie sociale mensuelle, je me suis rendu, hier soir, au théâtre Akteon afin de voir une représentation tragi-comique de la <em>Comedia dell Arte</em>. Une interprétation originale de <em>&#8220;Roméo et Juliette&#8221;</em>, réalisée par 5 acteurs jeunes et dynamiques, le tout dans un petit théâtre sympathique d&#8217;une soixantaine de places.</p>
<p>Une ambiance musicale plutôt réussie, des références discrètes à différentes oeuvres (de Hamlet à la petite vendeuse d&#8217;allumettes en passant par le petit chaperon rouge), des effets spéciaux hors du commun (ou pas), on passe un excellent moment. Et, le point le plus frappant est sans aucun doute le dynamisme et l&#8217;inventivité des comédiens, bien loin de la pièce originale de Shakespeare. Ce qui est relativement rare dans ce genre de petites salles privées parisiennes. Du grand art donc. :)</p>
<p>Comme vous l&#8217;aurez sans doute compris, je vous recommande vivement cette pièce. Dépêchez-vous, il vous reste encore deux semaines, à raison de deux représentations par semaine (samedi et dimanche, à 18h). :)</p>
<p><a href="http://www.billetreduc.com/28289/evt.htm">Réserver sur BilletReduc.com &raquo;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/la-tragique-histoire-de-romeo-et-juliette-comedia-dell-arte/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/la-tragique-histoire-de-romeo-et-juliette-comedia-dell-arte/</feedburner:origLink></item>
		<item>
		<title>TF1 : licenciement de Jérôme Bourreau-Guggenheim. Vers une démocratie totalitaire…</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/jm5-rRlC6Tg/</link>
		<comments>http://www.jonathan-petitcolas.com/tf1-licenciement-de-jerome-bourreau-guggenheim-vers-une-democratie-totalitaire/#comments</comments>
		<pubDate>Sun, 10 May 2009 16:08:36 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Politique]]></category>

		<category><![CDATA[hadopi]]></category>

		<category><![CDATA[tf1]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=1012</guid>
		<description><![CDATA[
Après deux semaines d&#8217;inactivités sur ce blog, dû à un agenda des plus remplis, et ce tant d&#8217;un point de vue personnel que professionnel, me revoilà qui reprend la plume le clavier afin de vous tenir au courant de la HADOPI, et plus particulièrement de l&#8217;affaire qui cause énormément de remous ces temps-ci : le [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blorg.canalblog.com"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2009/05/licenciement-tf1-rodho.png" alt="licenciement-tf1-rodho" title="licenciement-tf1-rodho" class="alignleft size-full wp-image-1017" /></a></p>
<p>Après deux semaines d&#8217;inactivités sur ce blog, dû à un agenda des plus remplis, et ce tant d&#8217;un point de vue personnel que professionnel, me revoilà qui reprend <del datetime="2009-05-10T15:13:58+00:00">la plume</del> le clavier afin de vous tenir au courant de la HADOPI, et plus particulièrement de l&#8217;affaire qui cause énormément de remous ces temps-ci : le licenciement par TF1 de son responsable Innovation et Internet, à savoir Jérôme Bourreau-Guggenheim.</p>
<p>Que s&#8217;est-il passé exactement ? M. Bourreau-Guggenheim (que nous appellerons désormais JBG) a simplement décidé de faire partager, de manière <strong>privée</strong> (donc sans aucune implication de TF1), son point de vue à Françoise de Panafieu, sa députée (UMP), concernant le projet de loi &#8220;Création et Internet&#8221;. Bien évidemment, comme toute personne intéressée un minimum aux nouvelles technologies, JBG était opposée à cette <a href="http://www.jonathan-petitcolas.com/la-loi-creation-et-internet-adoptee-par-lassemblee-nationale/">loi liberticide</a>.</p>
<p><span id="more-1012"></span></p>
<p>Une quinzaine de jours plus tard, et après un entretien auprès de sa direction où son courrier <strong>privé</strong> (encore une fois mis en gras, mais cela semble avoir échappé aux yeux de la chaîne), TF1 lui envoie une lettre de licenciement, sous motif que <em>&#8220;cette prise de position est un acte d&#8217;opposition à la stratégie du groupe TF1 pour qui l&#8217;adoption de ce projet de loi est un enjeu fort&#8221;</em> (d&#8217;après le journal Libération). Comment une lettre alors initialement destinée à Mme de Panafieu s&#8217;est-elle retrouvée dans les mains de la direction de TF1 ? Explications dans la lettre de licenciement : <em>&#8220;Cette correspondance nous est parvenue via le cabinet du ministre de la Culture qui l&#8217;a adressé le jour même à TF1&#8243;</em>. Tiens, tiens&#8230; Revoilà notre chère amie Christine ! </p>
<p>Au niveau communication, il y a eu quelques couacs du côté du ministère de la Culture. Ainsi, Mme Albanel indique dans un communiqué qu&#8217;elle &#8220;<em>trouve absurde les accusations et affirme n&#8217;avoir jamais contacté TF1 pour s&#8217;immiscer dans la politique de gestion de la chaîne</em>&#8220;. Problème, le site <a href="http://www.lepoint.fr/">Le Point</a> a mis en ligne dans le même temps une citation d&#8217;un des conseillers du Ministère : <em>&#8220;Nous avons fait une erreur en transférant ce mail&#8221;</em>. Cette citation est désormais effacée. Etrange, non ? ;)</p>
<p>Bien entendu, JBG va faire défendre ses droits. Notamment au niveau du respect de la correspondance privée et de la liberté d&#8217;opinion politique. Espérons que celui-ci emportera la victoire aux Prud&#8217;hommes. Après tout, il me semble qu&#8217;un texte finalement assez connu, répondant au doux nom de <em>&#8220;Déclaration Universelle des Droits de l&#8217;Homme et du Citoyen&#8221;</em>, indique, article 19 : </p>
<blockquote><p>Tout individu a droit à la liberté d&#8217;opinion et d&#8217;expression, ce qui implique le droit de ne pas être inquiété pour ses opinions et celui de chercher, de recevoir et de répandre, sans considérations de frontières, les informations et les idées par quelque moyen d&#8217;expression que ce soit.</p></blockquote>
<p>Etrange que ce précepte ne soit pas respecté. Surtout sachant que ce texte a été écrit par nos ancêtres réolutionnaires. Alors, quand il s&#8217;agit de rappeller à l&#8217;ordre la Chine à propos de ce même traité, soudainement, il prend plus d&#8217;importance. Bref, on assiste à un magnifique <em>&#8220;fais comme je dis, mais pas comme je fais&#8221;</em>. Déjà avec le paquet Télécom européen et HADOPI. Bref&#8230;</p>
<p>Nous entrons petit à petit dans un état <em>totalitarisme</em>. Oui, totalitarisme. Ce mot est souvent associé à des périodes sombres de l&#8217;Histoire, mais je l&#8217;emploie sciemment. Celui-ci est définit comme l&#8217;interdiction de toute opposition au gouvernement, comme l&#8217;adhésion à une seule idéologie. Or, vers quoi allons-nous tout doucement ? Ce n&#8217;est pas la liberté totale d&#8217;expression en tout cas.</p>
<p>Bref, le débat initié il y a plusieurs semaines avec la loi &#8220;Création et Internet&#8221; ne cesse de s&#8217;envenimer, à juste titre. La chaîne TF1 est désormais submergée de commentaires très incisifs, dénonçant ce licenciement abusif. Etant donné qu&#8217;une &#8220;modération&#8221; a lieue sur le site de TF1, voici la <a href="http://hithlum.adm.ielo.net/~pnl/mootf1/avis.html">liste des commentaires</a> un maximum tenue à jour. Elle n&#8217;est pas de moi, mais merci à ses auteurs. En cherchant bien, il est toutefois possible de retrouver certains passages dans le forum ou sur le <a href="http://www.tf1.fr/tf1-et-vous/reponse-a-vos-questions/bonjour-pouvez-vous-expliquer-le-licenciement-de-mr-jerome-bourreau-4406123.html">billet concerné</a>.</p>
<p>Petit point des plus drôles : il semblerait que les webmasters de TF1 n&#8217;aient pas prévu ce genre de buzz négatif, et qu&#8217;aucune fonctionnalité de fermeture de commentaires n&#8217;ait été prévue. Bientôt une offre de stage chez TF1 ? Attention, il vous faudra votre carte UMP ! ;)</p>
<p>Il y a fort à parier que TF1 ait quelques difficultés à s&#8217;extirper de cette affaire. De plus en plus d&#8217;internautes suivent ce débat qu&#8217;est HADOPI, et celui-ci se généralise petit à petit à la population lambda. Et, ce délicat remerciement à son collaborateur ne va pas arranger les choses. Il y a fort à parier que TF1 subisse une baisse d&#8217;audience cruciale ces prochains mois. Plutôt gênant quand on sait que ce groupe a dégagé en 2008 un <em>&#8220;bénéfice net en recul de 28%, pour un chiffre d&#8217;affaires en repli de 5,3%&#8221;</em> (source : <a href="http://jeanmarcmorandini.tele7.fr/article-24308-bouygues-exclut-de-vendre-tf1-malgre-ses-difficultes.html">Jean-Marc Morandini</a>).</p>
<p>Jérôme, tu as mon soutien ! Certes, ce n&#8217;est pas grand chose, mais c&#8217;est déjà ça ! ;)</p>
<p>Edit : Une petite chanson sympathique par Camille et Jean-Marie : <a href="http://deuxcopainsdabord.musique.com/366805/QUI-A-TUE-BOURREAU-GUGGENHEIM/">&#8220;Qui a tué Bourreau-Guggenheim ?&#8221;</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/tf1-licenciement-de-jerome-bourreau-guggenheim-vers-une-democratie-totalitaire/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/tf1-licenciement-de-jerome-bourreau-guggenheim-vers-une-democratie-totalitaire/</feedburner:origLink></item>
		<item>
		<title>Que faire en cas de vol de téléphone portable ?</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/Qa4cOhuG7EI/</link>
		<comments>http://www.jonathan-petitcolas.com/que-faire-en-cas-de-vol-de-telephone-portable/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 09:14:31 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Inclassables]]></category>

		<category><![CDATA[téléphone portable]]></category>

		<category><![CDATA[vol]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=989</guid>
		<description><![CDATA[Que faire alors en cas de vol de téléphone portable ? Instructions en 4 points clef pour bloquer votre mobile.]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2009/04/257581_3203.jpg" alt="Téléphone portable" title="Téléphone portable" width="240" height="180" class="size-full wp-image-992 " /></div>
<p>M&#8217;étant fait volé mon téléphone portable dans la nuit de vendredi à samedi dernier, alors que je rentrais tard du bureau (eh oui&#8230; un travail de folie en ce moment, ce qui explique le peu d&#8217;actualités sur ce blog). Que faire alors en de pareil cas ? Tout est relativement rapide, et une demi-journée (sic&#8230; vive la bureaucratie) suffit pour effectuer toutes les démarches.</p>
<ol>
<li>Vous procurer le numéro IMEI de votre téléphone. Ce numéro est un identifiant de votre mobile, et permettra de bloquer celui-ci, en plus de la carte SIM. Il se trouve généralement sous la batterie de votre portable&#8230; que vous ne devez plus avoir si vous êtes en pareil situation. Pas de panique, il est aussi présent sur le coffret d&#8217;emballage (vous l&#8217;avez gardé, hein ? :s)</li>
<li>Appeler votre opérateur pour lui signaler le vol, en lui indiquant le numéro de la ligne et l&#8217;IMEI. Il bloquera ainsi et votre ligne, et votre téléphone.</li>
<li>Vous rendre dans le commissariat le plus proche et déposer plainte (ne toujours pas oublier l&#8217;IMEI).</li>
<li>Contacter éventuellement votre assurance afin de vous faire renvoyer un autre appareil, dans un délai de 15 jours, moyennant le respect de certains critères.</li>
</ol>
<p>Je suis actuellement en attente du dossier à renvoyer à l&#8217;assurance (on me l&#8217;envoie par mail&#8230; mais il faut compter un délai de 3 jours&#8230; o_0). Mais il y a fort à parier que des renseignements alambiqués seront demandés. Cela serait bien trop facile autrement.</p>
<p>Enfin, petit message personnel aux contacts dont j&#8217;avais le numéro sur mon téléphone et donc dont je n&#8217;ai plus les coordonnées : n&#8217;hésitez pas à me recontacter par mail, réseaux sociaux, MSN, Skype, pigeons voyageurs, signaux de fumée, etc. afin de me renvoyer tout ça ! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/que-faire-en-cas-de-vol-de-telephone-portable/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/que-faire-en-cas-de-vol-de-telephone-portable/</feedburner:origLink></item>
		<item>
		<title>Le Canard Inutile - Comment cuire un steak haché ?</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/JcMDO-kM1hQ/</link>
		<comments>http://www.jonathan-petitcolas.com/le-canard-inutile-comment-cuire-un-steak-hache/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 08:22:10 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Détente]]></category>

		<category><![CDATA[canard inutile]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=979</guid>
		<description><![CDATA[Voici le premier épisode du Canard Inutile, un journal se prévalant de vous faire partager une tonne d&#8217;informations complètement inutiles pour &#8220;briller à la machine à café&#8221;.

Pas si inutile que cela, car la réponse sur les steaks hachés a changé ma vision de la vie. A présent, je sais comment les faire cuire de manière [...]]]></description>
			<content:encoded><![CDATA[<p>Voici le premier épisode du Canard Inutile, un journal se prévalant de vous faire partager une tonne d&#8217;informations complètement inutiles pour <em>&#8220;briller à la machine à café&#8221;</em>.</p>
<div class="video"><object width="420" height="339"><param name="movie" value="http://www.dailymotion.com/swf/x8551h" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://www.dailymotion.com/swf/x8551h" type="application/x-shockwave-flash" width="420" height="339" allowFullScreen="true" allowScriptAccess="always"></embed></object></div>
<p>Pas si inutile que cela, car la réponse sur les steaks hachés a changé ma vision de la vie. A présent, je sais comment les faire cuire de manière optimisée ! Merci beaucoup à toute l&#8217;équipe donc ! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/le-canard-inutile-comment-cuire-un-steak-hache/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/le-canard-inutile-comment-cuire-un-steak-hache/</feedburner:origLink></item>
		<item>
		<title>Réduire la taille des polices des applications GTK sous KDE</title>
		<link>http://feedproxy.google.com/~r/jonathan-petitcolas/~3/OOLqbrhBWRw/</link>
		<comments>http://www.jonathan-petitcolas.com/reduire-la-taille-des-polices-des-applications-gtk-sous-kde/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 11:23:28 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[apparence]]></category>

		<category><![CDATA[gtk]]></category>

		<category><![CDATA[kde]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=982</guid>
		<description><![CDATA[
Ayant eu un gros souci avec différentes applications (souci dont la raison reste toujours obscure), j&#8217;ai installé KDE, un autre environnement graphique, et là, victoire ! Tout fonctionne de nouveau. Or, ce nouvel environnement, KDE, a quelques soucis avec les applications GTK (propre à Gnome). En effet, les tailles de police sont tout simplement énormes, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2009/04/logo-kde.png" alt="Logo KDE" title="Logo KDE" width="128" height="131" class="alignleft size-full wp-image-983" /></p>
<p>Ayant eu un gros souci avec différentes applications (souci dont la raison reste toujours obscure), j&#8217;ai installé KDE, un autre environnement graphique, et là, victoire ! Tout fonctionne de nouveau. Or, ce nouvel environnement, KDE, a quelques soucis avec les applications GTK (propre à Gnome). En effet, les tailles de police sont tout simplement énormes, et la configuration via le <em>Settings Manager</em> de KDE n&#8217;a aucun effet. Et pour cause : les applications GTK ne sont pas impactées par ces changements, propres aux librairies QT (propre, elles, à KDE).</p>
<p>Comment faire ? Eh bien, il suffit de modifier le fichier <em>~/.gtkrc-2.0-kde4</em>, et d&#8217;y insérer le contenu suivant :</p>
<blockquote><p># This file was written by KDE<br />
# You can edit it in the KDE control center, under &#8220;GTK Styles and Fonts&#8221;</p>
<p>include &#8220;/usr/share/themes/Qt4/gtk-2.0/gtkrc&#8221;</p>
<p>style &#8220;user-font&#8221;<br />
{<br />
        font_name=&#8221;Sans Serif&#8221;<br />
}<br />
widget_class &#8220;*&#8221; style &#8220;user-font&#8221;</p>
<p>gtk-theme-name=&#8221;Qt4&#8243;<br />
<strong>gtk-font-name=&#8221;Sans Serif 6&#8243;</strong></p></blockquote>
<p>C&#8217;est la dernière ligne qui nous intéresse. Il s&#8217;agira de la police utilisée, ainsi que sa taille (ici, 6 pixels, qui correspond à un affichage correct sur ma machine). Une fois ce fichier modifié, il ne vous reste plus qu&#8217;à redémarrer votre application GTK, et le tour est joué ! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/reduire-la-taille-des-polices-des-applications-gtk-sous-kde/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jonathan-petitcolas.com/reduire-la-taille-des-polices-des-applications-gtk-sous-kde/</feedburner:origLink></item>
	</channel>
</rss>
