<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cyril - Mes astuces</title>
	<atom:link href="http://blog.cyril.me/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.cyril.me</link>
	<description>Yet Another Wordpress Blog</description>
	<lastBuildDate>Fri, 30 Jul 2010 06:56:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Port forwarding avec iptables</title>
		<link>http://blog.cyril.me/2010/07/udp-tcp-port-forwarding-iptables/</link>
		<comments>http://blog.cyril.me/2010/07/udp-tcp-port-forwarding-iptables/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 06:55:37 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[gentoo]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=339</guid>
		<description><![CDATA[Ceci est un petit mémo sur la méthode pour transférer des paquets sous linux avec iptables. 1. Autoriser votre ordinateur à transférer des packets Vous devez activer dans un premier temps le transfert de paquets par votre ordinateur. En root, exécutez la commande suivante : # sysctl net.ipv4.ip_forward=1 Si vous souhaitez que ce paramètre soit [...]]]></description>
			<content:encoded><![CDATA[<p>Ceci est un petit mémo sur la méthode pour transférer des paquets sous linux avec iptables.</p>
<h3><a name="p339_ip_forward">1. Autoriser votre ordinateur à transférer des packets</a></h3>
<p>Vous devez activer dans un premier temps le transfert de paquets par votre ordinateur. En root, exécutez la commande suivante :</p>
<p><code># sysctl net.ipv4.ip_forward=1</code></p>
<p>Si vous souhaitez que ce paramètre soit activé par défaut au démarrage de votre ordinateur, éditez le fichier /etc/sysctl.conf, qui sera utilisé au boot pour remettre les paramètres à jour.</p>
<h3><a name="p339_nat">2. Faire du NAT avec iptables (translation d&#8217;adresse)</a></h3>
<p>Le NAT consiste à autoriser qu&#8217;un ordinateur utilise le votre comme passerelle vers internet. Par exemple, vous avez une clé 3G ou un accès simple à Internet : mettez-vous en réseau avec l&#8217;autre ordinateur (avec des IPs fixes, un câble réseau ou un wifi en ad-hoc). Ensuite, autorisez le NAT de la manière suivante (remplacez eth0 par l&#8217;interface de votre connexion Internet).</p>
<p><code># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</code></p>
<h3><a name="p339_forward_udp">3. Forwarder des paquets</a></h3>
<p>Pour forwarder les paquets qui arrivent sur un port vers un autre, utilisez iptables ! L&#8217;exemple suivant montre comment router les paquets UDP port 31234 vers une autre IP (on aurait aussi pu changer le port de destination pour en mettre un différent).</p>
<p><code># iptables -t nat -A PREROUTING -p udp --dport 31234 -j DNAT --to 10.0.0.2:31234</code></p>
<p><span style="text-decoration: underline;">Exemple d&#8217;utilisation :</span> transférer des paquets RSTP (comme ceux de la TV Freebox) vers un autre ordinateur.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/07/udp-tcp-port-forwarding-iptables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guitar Hero 6 : Warriors of rock</title>
		<link>http://blog.cyril.me/2010/07/guitar-hero-6-warriors-of-rock/</link>
		<comments>http://blog.cyril.me/2010/07/guitar-hero-6-warriors-of-rock/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 19:30:09 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[Guitar Hero]]></category>
		<category><![CDATA[igraal]]></category>
		<category><![CDATA[shopping]]></category>
		<category><![CDATA[Wii]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=338</guid>
		<description><![CDATA[Ca y est, Guitar Hero 6 arrive ! Alors accordez vos guitares, ça va rocker ! Enfin accordez&#8230; prenez un chiffon et nettoyez-moi cette crasse qui s&#8217;accumule sur vos guitares, micro et batterie : ça se nettoie de temps en temps&#8230; Et comme je suis sympa, voici un player deezer d&#8217;une partie de la tracklist [...]]]></description>
			<content:encoded><![CDATA[<p>Ca y est, Guitar Hero 6 arrive ! Alors accordez vos guitares, ça va rocker ! Enfin accordez&#8230; prenez un chiffon et nettoyez-moi cette crasse qui s&#8217;accumule sur vos guitares, micro et batterie : ça se nettoie de temps en temps&#8230;</p>
<p>Et comme je suis sympa, voici un player deezer d&#8217;une partie de la tracklist de cet opus : <a href="http://www.deezer.com/music/playlist/guitar-hero-6-47724459?provider=website">Tracklist Guitar Hero 6 : Warriors of Rock</a>. Ce jeu est plus ROCK, plus dans le style de <em>Guitar Hero 3 : Lengends of Rock</em>. Il est donc moins grand public, mais personnellement je préfère ! Y en a un peu marre des chansons à accords, surtout quand les accords sont plus difficiles que les solos : c&#8217;est le monde inversé !</p>
<p><em>Guitar Hero 6 : Warriors of rock</em> est déjà disponible en précommande sur <a href="http://www.amazon.fr/s/ref=nb_sb_ss_c_1_8?tag=cyrilme-21&#038;__mk_fr_FR=%C5M%C5Z%D5%D1&#038;url=search-alias%3Dvideogames&#038;field-keywords=warriors+of+rock&#038;sprefix=warriors&#038;ih=5_3_0_0_0_1_0_0_1_1.11_179&#038;fsc=4">le site d&#8217;Amazon</a> et <a href="http://ad.zanox.com/ppc/?15717479C660707997T&#038;ULP=[[http://recherche.fnac.com/search/quick.do?text=warriors+of+rock&#038;category=all&#038;download_ebook=false&#038;bl=HGACrera&#038;submitbtn=Ok]]">le site de Fnac</a>. Il sortira pour Nintendo Wii, Playstation PS3 et XBox 360, et ce le 24 septembre 2010 (d&#8217;après le site d&#8217;Amazon).</p>
<p>Les tarifs : comme d&#8217;habitude ! 70€ pour les version XBox et PS3, 60€ pour la version Wii. Les packs sont aussi disponibles : comptez 100€ pour Jeu + Guitare et 200€ pour le bundle complet avec la batterie. <strong>Mon astuce : utilisez iGraal !</strong> Vous aurez une réduction Guitar Hero de 4%, soit le jeu Wii pour 58€. Utilisez les 2€ restant pour vous offrir des chansons dans la boutique en ligne ! (Disponible depuis le jeu, sur la console)</p>
<div style="text-align: center"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="450" height="375" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.deezer.com/embed/player?pid=47724459&amp;ap=0&amp;ln=fr&amp;sl=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="450" height="375" src="http://www.deezer.com/embed/player?pid=47724459&amp;ap=0&amp;ln=fr&amp;sl=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<div style="font-size: 80%">Autres mots clé : GH6 setlist, Warriors of Rock song list, Ecoutez la playlist Guitar Hero sur deezer</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/07/guitar-hero-6-warriors-of-rock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notifications HTML5 : exemple et demo</title>
		<link>http://blog.cyril.me/2010/06/notifications-html5-exemple-demo/</link>
		<comments>http://blog.cyril.me/2010/06/notifications-html5-exemple-demo/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 21:40:37 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=297</guid>
		<description><![CDATA[Consécutivement à l&#8217;article sur les notifications HTML 5, voici un article qui donne un exemple de fonctionnement des notifications. La démo Votre navigateur ne supporte pas les notifications. L&#8217;exemple ci-dessous ne fonctionnera pas. Avant de pouvoir afficher une notification, vous devez autoriser le site à vous en présenter : Autoriser les notifications Il y a [...]]]></description>
			<content:encoded><![CDATA[<p>Consécutivement à l&#8217;article sur les <a href="http://blog.cyril.me/2010/05/html5-chrome-notifications/">notifications HTML 5</a>, voici un article qui donne un exemple de fonctionnement des notifications.</p>
<h3>La démo</h3>
<div id="p297_disabled" style="display: none; color: #f00; font-weight: bold; text-aglin: center; padding: 20px; background-color: #eee;">Votre navigateur ne supporte pas les notifications. L&#8217;exemple ci-dessous ne fonctionnera pas.</div>
<p>Avant de pouvoir afficher une notification, vous devez autoriser le site à vous en présenter : <button id="p297_allow" onclick="p297_allowNotification()">Autoriser les notifications</button><br />
<span style="color: #ff0000;">Il y a parfois des limitations qui empêchent le site de lancer une autorisation au chargement de la page : vous êtes parfois obligé de faire cliquer l&#8217;utilisateur sur un bouton pour voir apparaître l&#8217;avertissement d&#8217;autorisation.</span></p>
<p>Ensuite, vous pouvez afficher des notifications (avec ou sans bouton) :<br />
<button id="p297_show" onclick="p297_showNotification()">Afficher la notification</button><br />
<a onclick="window.setTimeout(p297_showNotification, 3000);" href="javascript:;">Programmer une notification dans 3 secondes</a><br />
<script type="text/javascript">// <![CDATA[
             window.addEventListener("load", function() { if(!('webkitNotifications' in window)){document.getElementById("p297_disabled").style.display = '';}}, true); function p297_allowNotification() { if('webkitNotifications' in window) { webkitNotifications.requestPermission(p297_showNotification); } } function p297_showNotification() { if('webkitNotifications' in window) { var notification = webkitNotifications.createNotification(undefined, "Titre : cyril.me", "Ceci est une notification"); notification.show(); window.setTimeout(function() {notification.cancel();}, 5000); } }
// ]]&gt;</script></p>
<h3>Sources de l&#8217;exemple</h3>
<p><span style="text-decoration: underline;">Code HTML :</span></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><a href="http://december.com/html/4/element/button.html"><span class="kw2">&lt;button</span></a> <span class="kw3">onclick</span>=<span class="st0">&quot;showNotification()&quot;</span><span class="kw2">&gt;</span></span>Afficher la notification<span class="sc2"><span class="kw2">&lt;/button&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><a href="http://december.com/html/4/element/button.html"><span class="kw2">&lt;button</span></a> <span class="kw3">onclick</span>=<span class="st0">&quot;p297_showNotification()&quot;</span><span class="kw2">&gt;</span></span>Afficher la notification<span class="sc2"><span class="kw2">&lt;/button&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><a href="http://december.com/html/4/element/a.html"><span class="kw2">&lt;a</span></a> <span class="kw3">onclick</span>=<span class="st0">&quot;window.setTimeout(showNotification, 3000);&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;javascript:;&quot;</span><span class="kw2">&gt;</span></span>Programmer une notification dans 3 secondes<span class="sc2"><span class="kw2">&lt;/a&gt;</span></span></div>
</li>
</ol>
</div>
<p><span style="text-decoration: underline;">Code javascript :</span></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;script type=<span class="st0">&quot;text/javascript&quot;</span>&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/** Demande la permission d’afficher des notifications */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> allowNotification<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="st0">&quot;webkitNotifications&quot;</span> in window<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Demande la permission. En cas de succès, afficher la notification</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; webkitNotifications.<span class="me1">requestPermission</span><span class="br0">&#40;</span>p297_showNotification<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/** Affiche la notification */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> showNotification<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="st0">&quot;webkitNotifications&quot;</span> in window<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Crée une notification à partir d’une image, d’un titre</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// et d’une description (pas d’HTML possible).</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Pour créer une notification avec de l’HTML</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// (pour le formatage), utiliser createHTMLNotification()</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; var notification = webkitNotifications.<span class="me1">createNotification</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;http://www.google.fr/favicon.ico&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;Titre : cyril.me&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;Ceci est une notification&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Afficher la notification</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; notification.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// N’afficher la notification que 5 secondes</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; window.<span class="me1">setTimeout</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>notification.<span class="me1">cancel</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span>, <span class="nu0">5000</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&lt;/script&gt;</div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/06/notifications-html5-exemple-demo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Expressions régulières : combiner match et non-match</title>
		<link>http://blog.cyril.me/2010/06/expressions-regulieres-combiner-match-non-match/</link>
		<comments>http://blog.cyril.me/2010/06/expressions-regulieres-combiner-match-non-match/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 20:12:05 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regexps]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=289</guid>
		<description><![CDATA[Match et non-match&#8230; En cette période de coupe du monde de football 2010, quoi de plus naturel que de parler de match ? &#8230; Hum. Problématique Mon problème aujourd&#8217;hui, c&#8217;est de sélectionner les listes qui contiennent une certaines expression régulière, mais pas une autre. Plus exactement, et pour faire dans les anglicismes, je cherche &#171;&#160;foo.*&#160;&#187;, [...]]]></description>
			<content:encoded><![CDATA[<h3>Match et non-match&#8230;</h3>
<p>En cette période de <a title="Allez les bleus !" href="http://fr.fifa.com/">coupe du monde de football 2010</a>, quoi de plus naturel que de parler de match ? &#8230; Hum.</p>
<h3>Problématique</h3>
<p>Mon problème aujourd&#8217;hui, c&#8217;est de sélectionner les listes qui contiennent une certaines expression régulière, mais pas une autre. Plus exactement, et pour faire dans les anglicismes, je cherche &laquo;&nbsp;foo.*&nbsp;&raquo;, mais pas &laquo;&nbsp;foobar&nbsp;&raquo;.</p>
<h3>La solution</h3>
<p>Il faut utiliser la forme suivante : <code>(?!regexp)</code> pour choisir quelque chose qui ne match pas la <code>regexp</code> en question.</p>
<p>Mon exemple en pratique :</p>
<pre>$ echo -e 'foo\nfoobar\nfoofighting' | grep -P 'foo(?!bar)'
foo
foofighting</pre>
<p>Plus d&#8217;informations disponible avec <a title="Manuel des expressions régulières perl" href="http://perldoc.perl.org/perlre.html">perldoc perlre</a>, en particulier le chapitre sur les expressions régulières étendues (Extended Patterns)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/06/expressions-regulieres-combiner-match-non-match/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conversion javascript</title>
		<link>http://blog.cyril.me/2010/05/conversion-json-text-xml-javascript/</link>
		<comments>http://blog.cyril.me/2010/05/conversion-json-text-xml-javascript/#comments</comments>
		<pubDate>Tue, 11 May 2010 19:22:10 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=282</guid>
		<description><![CDATA[Parce qu&#8217;on n&#8217;a pas toujours le document au format qui nous convient, ou parce qu&#8217;on a parfois besoin de repasser par des chaînes de caractères pour passer des arguments ou stocker des variables, différents outils de conversion sont mis à disposition du développeur. Conversion en passant par JSON Certains types peuvent être convertis en passant [...]]]></description>
			<content:encoded><![CDATA[<p>Parce qu&#8217;on n&#8217;a pas toujours le document au format qui nous convient, ou parce qu&#8217;on a parfois besoin de repasser par des chaînes de caractères pour passer des arguments ou stocker des variables, différents outils de conversion sont mis à disposition du développeur.</p>
<h3>Conversion en passant par JSON</h3>
<p>Certains types peuvent être convertis en passant par JSON : le texte, les objets, les tableaux, les nombres&#8230;</p>
<p>Du type javascript au texte : il faut utiliser <strong>JSON.stringify</strong><br />
<span style="text-decoration: underline;">Exemple :</span> JSON.stringify([1,2,3]) =&gt; &laquo;&nbsp;[1,2,3]&nbsp;&raquo;</p>
<p>Du texte vers un type javascript : il faut utiliser <strong>JSON.parse</strong><br />
<span style="text-decoration: underline;">Exemple :</span> JSON.parse(&laquo;&nbsp;[1,2,3]&laquo;&nbsp;) =&gt; [1,2,3] (où 1, 2 et 3 sont des entiers)</p>
<h3>Conversion d&#8217;un document DOMDocument ou XMLDocument</h3>
<p>Deux outils sont à disposition : <strong>XMLSerializer</strong> (du document vers string) et <strong>DOMParser</strong> (de string vers un document).</p>
<p><span style="text-decoration: underline;">XMLSerializer :</span> DOMDocument vers une chaîne de caractères<br />
Exemple : s = new XMLSerializer(); var documentString = s.serializeToString(document);</p>
<p><span style="text-decoration: underline;">DOMParser :</span> Conversion d&#8217;une chaîne de caractères vers un objet DOMDocument<br />
Exemple : p = new DOMParser(); var doc = p.parseFromString(&#8216;&lt;html&gt;&lt;body&gt;coucou&lt;/body&gt;&lt;/html&gt;&#8217;, &#8216;text/xml&#8217;);</p>
<h3>Compatibilité</h3>
<p>Ces APIs sont compatibles avec, entre autres, Safari 4.0+, Chrome, Firefox 3.5+, et peut-être IE&#8230; <img src='http://blog.cyril.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/05/conversion-json-text-xml-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Communication avec une iframe : window postMessage</title>
		<link>http://blog.cyril.me/2010/05/html-5-dom-window-postmessage/</link>
		<comments>http://blog.cyril.me/2010/05/html-5-dom-window-postmessage/#comments</comments>
		<pubDate>Tue, 11 May 2010 06:07:27 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=266</guid>
		<description><![CDATA[Il peut être parfois nécessaire d&#8217;utiliser une iframe, pour accéder par exemple à des cookies sur un autre site, se logguer, etc. Le problème est que si vous utilisez une iframe sur un domaine différent, le navigateur va vous renvoyer une erreur. iframe et sécurité Lorsque les domaine ou port diffèrent entre les deux frames, [...]]]></description>
			<content:encoded><![CDATA[<p>Il peut être parfois nécessaire d&#8217;utiliser une iframe, pour accéder par exemple à des cookies sur un autre site, se logguer, etc. Le problème est que si vous utilisez une iframe sur un domaine différent, le navigateur va vous renvoyer une erreur.</p>
<h3>iframe et sécurité</h3>
<p>Lorsque les domaine ou port diffèrent entre les deux frames, le navigateur va refuser la communication. En effet, imaginez que vous puissiez afficher une iframe cachée dans votre page, pour ensuite y récupérer des informations sensibles.</p>
<p>Exemple : dans mon site example.org, je mets une iframe vers mabanque.com et je récupère les informations bancaires de l&#8217;utilisateur de mon site (si celui-ci est déjà loggué sur le site de la banque).</p>
<h3>La solution</h3>
<p>Pour autoriser la communication entre les frames, il faut utiliser le <a title="API HTML5 window.postMessage()" href="http://www.w3.org/TR/html5/comms.html">protocole de communication entre les fenêtres</a>.</p>
<p>Cette communication se fait par évènement : une fenêtre envoie à l&#8217;autre un objet<a href="#n266_1"><sup>1</sup></a>, qui le reçoit en ajoutant un handler sur l&#8217;évènement &laquo;&nbsp;message&nbsp;&raquo;.</p>
<h3>Exemple</h3>
<p>Dans notre exemple, l&#8217;iframe enverra un message à la fenêtre principale.</p>
<p><span style="text-decoration: underline;">Fenêtre principale :</span></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// On rajoute un handler d&#8217;évènement</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> onMessage<span class="br0">&#40;</span>e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// Vous pouvez vérifier l&#8217;origine de la fenêtre avec e.origin</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&#8216;div-test&#8217;</span><span class="br0">&#41;</span>.<span class="me1">innerHTML</span> = <span class="st0">&quot;Réception du message &quot;</span> + JSON.<span class="me1">stringify</span><span class="br0">&#40;</span>e.<span class="me1">data</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;message&quot;</span>, onMessage, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p><span style="text-decoration: underline;">Fenêtre iframe</span></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">var dstWindow = window.<span class="me1">parent</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Vous pouvez choisir le domaine vers lequel vous acceptez d&#8217;envoyer un message (ici, tous les domaines)</span></div>
</li>
<li class="li1">
<div class="de1">dstWindow.<span class="me1">postMessage</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span><span class="br0">&#93;</span>, <span class="st0">&#8216;*&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p><div id="266_div-test">div-test pour la réception du message</div>
<p>  <iframe src="http://paxal.net/cyril.me/266_postMessage.iframe.html"></iframe><br />
  <script>
function onMessage_266(e)
{
  document.getElementById('266_div-test').innerHTML = "Réception du message " + JSON.stringify(e.data);
}
window.addEventListener('message', onMessage_266, true);
  </script>
</p>
<p>
<a name="n266_1"><sup>1</sup></a> : en fonction du navigateur, vous ne pourrez passer que des chaînes de caractères (Firefox 3.6 par exemple &#8211; Chrome supportant les objets). Pour pallier ce défaut, vous pouvez utiliser JSON.stringify et JSON.parse pour passer des objets comme des chaines ou des variables. Pour tout ce qui est DOM, ce n&#8217;est pas possible de faire passer les handler d&#8217;évènement définis dans la fenêtre source.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/05/html-5-dom-window-postmessage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 : copier avec chrome et DOM Selection</title>
		<link>http://blog.cyril.me/2010/05/html5-copier-chrome-dom-selection/</link>
		<comments>http://blog.cyril.me/2010/05/html5-copier-chrome-dom-selection/#comments</comments>
		<pubDate>Mon, 03 May 2010 20:35:50 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=251</guid>
		<description><![CDATA[La question du jour : comment copier du texte en javascript. En théorie On va utiliser les objets suivants : la sélection DOM, et un Range. La sélection DOM consiste en un objet, présent dans HTML5, qui permet de gérer les sélections de texte à l&#8217;intérieur d&#8217;un document. Le range est un intervalle, qui permet [...]]]></description>
			<content:encoded><![CDATA[<p>La question du jour : comment copier du texte en javascript.</p>
<h3>En théorie</h3>
<p>On va utiliser les objets suivants : la <a title="API html5 getSelection()" href="http://www.w3.org/TR/html5/editing.html#documentSelection">sélection DOM</a>, et un <a title="API DOM Range" href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html">Range</a>.</p>
<p>La sélection DOM consiste en un objet, présent dans HTML5, qui permet de gérer les sélections de texte à l&#8217;intérieur d&#8217;un document.</p>
<p>Le range est un intervalle, qui permet de définir une zone continue dans un document.</p>
<h3>En pratique, mis bout à bout</h3>
<p>En pratique : on crée un range, on fait pointer la sélection dessus (en veillant à supprimer la sélection actuelle), et on exécute la commande &laquo;&nbsp;copy&nbsp;&raquo; pour copier la sélection dans le presse-papier.</p>
<div id="code_251">
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">var r = document.<span class="me1">createRange</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">r.<span class="me1">selectNode</span><span class="br0">&#40;</span>mon_element_a_selectionner<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">var s = window.<span class="me1">getSelection</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">s.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">s.<span class="me1">addRange</span><span class="br0">&#40;</span>r<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">execCommand</span><span class="br0">&#40;</span><span class="st0">&#8216;Copy&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
</div>
<p>Exemple : <a href="javascript:copy();">copier le code javascript</a> (ne fonctionne qu&#8217;avec un navigateur compatible HTML5)<br />
<script>
function copy()
{
  var r = document.createRange();
  r.selectNode(document.getElementById('code_251'));
  var s = window.getSelection();
  if('empty' in s) s.empty();
  else s.removeAllRanges();
  s.addRange(r);
  document.execCommand('Copy');
}
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/05/html5-copier-chrome-dom-selection/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5 : notifications et limites sur Chrome</title>
		<link>http://blog.cyril.me/2010/05/html5-chrome-notifications/</link>
		<comments>http://blog.cyril.me/2010/05/html5-chrome-notifications/#comments</comments>
		<pubDate>Mon, 03 May 2010 19:54:26 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=244</guid>
		<description><![CDATA[Les notifications Introduit parmi les nouvelles fonctionnalités de l&#8217;HTML5, les notifications permettent aux sites web (que vous autorisez) de vous informer d&#8217;une activité sur un site. C&#8217;est comme les notifications de MSN messenger, quand une fenêtre apparaît en bas à droite de l&#8217;écran. L&#8217;API supporte deux fonctions pour créer des notifications : soit à partir [...]]]></description>
			<content:encoded><![CDATA[<h3>Les notifications</h3>
<p>Introduit parmi les nouvelles fonctionnalités de l&#8217;HTML5, les notifications permettent aux sites web (que vous autorisez) de vous informer d&#8217;une activité sur un site. C&#8217;est comme les notifications de MSN messenger, quand une fenêtre apparaît en bas à droite de l&#8217;écran.</p>
<p>L&#8217;API supporte deux fonctions pour créer des notifications : soit à partir d&#8217;une URL, soit à partir d&#8217;une icône, d&#8217;un titre et d&#8217;une description. Utiliser une URL d&#8217;un fichier HTML permet d&#8217;avoir beaucoup plus de possibilités, au niveau de l&#8217;interaction comme au niveau de l&#8217;affichage (gras, images, liens, etc).</p>
<h3>Utilisation dans chrome</h3>
<p>Pour l&#8217;instant, chrome est le seul navigateur à supporter ce standard (sous Linux, hein !).</p>
<p>Voici un petit exemple de script (plus de détails dans <a title="API de desktop notification par chrome" href="http://www.chromium.org/developers/design-documents/desktop-notifications/api-specification">la doc de chrome</a>) :</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> showNotification<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// Création de l&#8217;objet, puis affichage</span></div>
</li>
<li class="li1">
<div class="de1">  var notification = webkitNotifications.<span class="me1">createHTMLNotification</span><span class="br0">&#40;</span><span class="st0">&#8216;http://monurldenotification.com/&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; notification.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> sendNotification<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; var auth = webkitNotifications.<span class="me1">checkPermission</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>auth == <span class="nu0">0</span><span class="br0">&#41;</span> showNotification<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Autorisé</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span>auth == <span class="nu0">1</span><span class="br0">&#41;</span> webkitNotifications.<span class="me1">requestPermission</span><span class="br0">&#40;</span>sendNotification<span class="br0">&#41;</span>; <span class="co1">// Demande la permission</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span> <span class="co1">// Refusé</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<h3>Les limites</h3>
<p>Malheureusement, il n&#8217;est pas possible de faire tout ce qu&#8217;on veut . Voici quelques limitations encore valables à ce jour :</p>
<ul>
<li>Impossible de dialoguer entre la desktop notification et le script qui l&#8217;a ouverte ;</li>
<li>Impossible de spécifier une adresse du type <a href="data:text/html,&lt;h1&gt;test&lt;/h1&gt;">data:text/html,&lt;h1&gt;test&lt;/h1&gt;</a></li>
</ul>
<p>A améliorer donc, afin d&#8217;avoir une réelle possibilité d&#8217;intégration dans des applications (type chat, &#8230;).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/05/html5-chrome-notifications/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Concatener des pdfs avec pdftk</title>
		<link>http://blog.cyril.me/2010/04/concatener-combiner-pdfs-pdftk/</link>
		<comments>http://blog.cyril.me/2010/04/concatener-combiner-pdfs-pdftk/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 06:39:12 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[gentoo]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=238</guid>
		<description><![CDATA[Manipuler des PDFs Admettons que vous ayez deux fichiers PDF que vous souhaitiez regrouper en un seul fichier (par exemple les recto et verso de votre carte d&#8217;identité). Pour ce faire, voici un petit outil bien pratique : pdftk. Bien que l&#8217;utilisation de ce programme est un peu compliquée, il n&#8217;en reste pas moins bien [...]]]></description>
			<content:encoded><![CDATA[<h3>Manipuler des PDFs</h3>
<p>Admettons que vous ayez deux fichiers PDF que vous souhaitiez regrouper en un seul fichier (par exemple les recto et verso de votre carte d&#8217;identité). Pour ce faire, voici un petit outil bien pratique : <a title="pdftk : manipulation de fichiers PDF" href="http://www.accesspdf.com/pdftk/">pdftk</a>.</p>
<p>Bien que l&#8217;utilisation de ce programme est un peu compliquée, il n&#8217;en reste pas moins bien pratique !<br />
<code>$ pdftk recto.pdf verso.pdf cat output combine.pdf</code></p>
<h3>Convertir des JPG en PDF</h3>
<p>Je me suis mis à scanner ce matin un document, directement sur une clé USB (c&#8217;est plus pratique avec Linux que de commencer à chercher comment installer les drivers de scan <img src='http://blog.cyril.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). Je me suis récupéré, à ma grande surprise, des fichiers JPEG au lieu d&#8217;un PDF tant attendu !</p>
<p>Pas de soucis : avec convert de imagemagick, vous pouvez convertir chaque JPG en PDF :<br />
<code>$ for f in *.jpg; do echo Converting $f; convert $f $f.pdf; done</code></p>
<p>Ensuite, utilisez <code>pdftk</code> pour concaténer les fichiers PDF ainsi créés.</p>
<p><em>Installation des outils : les outils présentés ici sont disponibles dans la majorité des distributions (ubuntu, gentoo, &#8230;)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/04/concatener-combiner-pdfs-pdftk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Synchronisation du calendrier Funambol sur iPhone</title>
		<link>http://blog.cyril.me/2010/04/synchroniser-calendrier-funambol-iphone/</link>
		<comments>http://blog.cyril.me/2010/04/synchroniser-calendrier-funambol-iphone/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 20:28:37 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[funambol]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[synchronisation]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=231</guid>
		<description><![CDATA[Jusqu&#8217;à présent, il n&#8217;était pas possible de synchroniser ses évènements avec Funambol sans jailbreaker son iPhone. Aujourd&#8217;hui ? Ce n&#8217;est toujours pas possible Mais ça va le devenir. L&#8217;API de calendrier iPhone dans le nouveau SDK Auparavant, Apple ne proposait pas dans son SDK d&#8217;API permettant d&#8217;accéder au calendrier. C&#8217;est désormais chose possible ! Il [...]]]></description>
			<content:encoded><![CDATA[<p>Jusqu&#8217;à présent, il n&#8217;était pas possible de synchroniser ses évènements avec Funambol sans jailbreaker son iPhone. Aujourd&#8217;hui ? Ce n&#8217;est toujours pas possible <img src='http://blog.cyril.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Mais ça va le devenir.</p>
<h3>L&#8217;API de calendrier iPhone dans le nouveau SDK</h3>
<p>Auparavant, Apple ne proposait pas dans son <abbr title="Software Development Kit : Kit de programmation de logiciel">SDK</abbr> d&#8217;<abbr title="Application Programming Interface : Ensemble de méthodes, fournies dans le SDK, permettant d'accéder à des fonctionnalités">API</abbr> permettant d&#8217;accéder au calendrier. <a title="Annonce de l'API calendrier iPhone" href="http://developer.apple.com/technologies/iphone/whats-new.html#api">C&#8217;est désormais chose possible</a> ! Il ne reste plus qu&#8217;à attendre d&#8217;une part la sortie du nouveau Firmware 4 iPhone (prévu cet été), et d&#8217;autre part la mise à jour de l&#8217;application Funambol.</p>
<p>Il sera alors possible de synchroniser non seulement ses contacts (comme maintenant), mais aussi tout son calendrier et ses évènements.</p>
<p><a title="Funambol iPhone" href="http://clk.tradedoubler.com/click?p=23753&amp;a=1766468&amp;g=0&amp;url=http://itunes.apple.com/fr/app/funambol/id284457844?mt=8&amp;partnerId=2003">Télécharger Funambol</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/04/synchroniser-calendrier-funambol-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
