<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss1full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns="http://purl.org/rss/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

<channel rdf:about="http://www.jkconception.com/dotclear/index.php/">
  <title>jkconception le blog</title>
  <description />
  <link>http://www.jkconception.com/dotclear/index.php/</link>
  <dc:language>fr</dc:language>
  <dc:creator />
  <dc:rights />
  <dc:date>2007-07-09T12:24:32+02:00</dc:date>
  <admin:generatorAgent rdf:resource="http://www.dotclear.net/" />
  
  <sy:updatePeriod>daily</sy:updatePeriod>
  <sy:updateFrequency>1</sy:updateFrequency>
  <sy:updateBase>2007-07-09T12:24:32+02:00</sy:updateBase>
  
  <items>
  <rdf:Seq>
    <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/07/09/21-les-crons-ou-les-taches-planifiees-sous-linux" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/07/02/20-un-menu-par-onglet-svp" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/06/13/19-et-si-on-parlait-navigation" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/06/10/18-eyeos-ou-l-autre-dimension-du-web" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/06/08/17-creer-un-preloader-html" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/06/02/15-les-cookies" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/05/28/12-securiser-un-formulaire" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/05/25/11-pompage-bien-utiliser-le-texte-alternatif" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/05/03/10-la-guerre-des-drm" />
  <rdf:li rdf:resource="http://www.jkconception.com/dotclear/index.php/2007/03/28/8-affichage-en-95c" />
  </rdf:Seq>
  </items>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/JkconceptionLeBlog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /></channel>

<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/07/09/21-les-crons-ou-les-taches-planifiees-sous-linux">
  <title>Les crons, ou les tâches planifiées sous Linux …</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/oekz-ubdL4o/21-les-crons-ou-les-taches-planifiees-sous-linux</link>
  <dc:date>2007-07-09T12:24:32+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Gwenael Dupont</dc:creator>
  <dc:subject>Technique</dc:subject>
  <description>Vous voulez planifier des tâches sur votre site internet ? Seul problème, vous n’êtes pas sur ce cher produit de Windows (ou ce produit cher à Windows, c’est vous qui voyez…) et le planificateur de tâches n’est pas disponible. Comme beaucoup de monde, votre hébergement se trouve sur un serveur Linux. Pas de problèmes, le planificateur de tâches existe aussi (whoohoo !), et il se nomme, assez barbarement d’ailleurs, « crontab » alors que les tâches elles-mêmes sont estampillés du joli sobriquet : « cron ».</description>
  <content:encoded><![CDATA[Vous voulez planifier des tâches sur votre site internet ? Seul problème, vous n’êtes pas sur ce cher produit de Windows (ou ce produit cher à Windows, c’est vous qui voyez…) et le planificateur de tâches n’est pas disponible. Comme beaucoup de monde, votre hébergement se trouve sur un serveur Linux. Pas de problèmes, le planificateur de tâches existe aussi (whoohoo !), et il se nomme, assez barbarement d’ailleurs, « crontab » alors que les tâches elles-mêmes sont estampillés du joli sobriquet : « cron ». <h3>Sommaire</h3>
<div id="sommaire"></div>

<p><h4>Un cron,  c&rsquo;est&nbsp;quoi ?</h4></p>
<p>Un cron est un programme informatique qui va permettre de  lancer des t&acirc;ches pr&eacute;alablement planifi&eacute;es &agrave; tel ou tel moment.</p>
<p>Un cron est ce que l&rsquo;on appelle dans le jargon informatique  un d&eacute;mon (&laquo;&nbsp;daemon&nbsp;&raquo; dans la langue de Shakespeare). C'est-&agrave;-dire que  c&rsquo;est un programme qui se lance au d&eacute;marrage du syst&egrave;me et qui attend le moment  propice pour s&rsquo;ex&eacute;cuter, soit lorsque les crit&egrave;res d&rsquo;ex&eacute;cution d&rsquo;un &eacute;v&egrave;nement  sont remplies (voir la crontab). Il se remet en attente apr&egrave;s avoir fait son  travail, jusqu&rsquo;au prochain &eacute;v&egrave;nement.</p>
<p>&nbsp;</p>
<p><h4>D&rsquo;accord, mais &ccedil;a sert  &agrave; quoi&nbsp;?</h4></p>
<p>A beaucoup de choses&nbsp;! Planifier ses t&acirc;ches permet de  lancer des scripts de mani&egrave;re automatique, sans avoir &agrave; le faire  manuellement&nbsp;! (Eh oui, n&rsquo;oublions pas que les informaticiens sont par  nature feignants&hellip; on programme pour en faire le moins possible&hellip; c&rsquo;est pas tr&egrave;s  coh&eacute;rent mais c&rsquo;est comme &ccedil;a&nbsp;:P ).</p>
<p>Ainsi, notre cron va pouvoir lancer des scripts qui vont  faire des sauvegardes automatiques de notre base de donn&eacute;es toutes les heures,  des r&eacute;cup&eacute;rations des statistiques de notre site tous les mois, etc&hellip; C&rsquo;est donc  tr&egrave;s utile pour de l&rsquo;administration syst&egrave;me, mais &ccedil;a peut aussi &ecirc;tre tout &agrave;  fait utile pour des t&acirc;ches plus communes, comme envoyer des mails de rappel &agrave;  telle date, jouer une musique &agrave; telle heure, et d&rsquo;autres choses encore&hellip;</p>
<p>&hellip;par contre, &ccedil;a fait toujours pas le caf&eacute;&hellip; mais c&rsquo;est pas  loin&nbsp; :)</p>
<p>&nbsp;</p>
<p><h4>Et la crontab, c&rsquo;est  quoi&nbsp;?</h4></p>
<p>La crontab est votre table de t&acirc;ches planifi&eacute;es. C&rsquo;est un  script qui va contenir une liste de ligne de commandes qui correspondront &agrave; vos  t&acirc;ches. Le cron va ainsi avoir &agrave; port&eacute;e de main toutes les instructions qu&rsquo;il  doit ex&eacute;cuter, ainsi que les horaires d&rsquo;ex&eacute;cution.</p>
<p>Selon le syst&egrave;me Linux, la crontab se trouve a un endroit  diff&eacute;rent&nbsp;:<br />
    <strong>Suse&nbsp;:</strong> /var/spool/cron/tabs/[utilisateur]<br />
    <strong>Debian et  Ubuntu&nbsp;:</strong> /var/spool/cron/crontabs/[utilisateur]<br />
    <strong>FreeBSD et  OpenBSD&nbsp;:</strong> /var/cron/tabs/[utilisateur]</p>
<p>Notons que le syst&egrave;me <strong>Debian</strong> poss&egrave;de une crontab centralis&eacute;e dans <strong>/etc/crontab</strong></p>
<p><strong>NB&nbsp;:</strong> Comme  vous pouvez le remarquer, il existe une crontab par utilisateur&nbsp; :).</p>
<p>&nbsp;</p>
<p><h4>Comment &eacute;diter sa  crontab&nbsp;?</h4></p>
<p>Finie la th&eacute;orie, nous allons maintenant entrer dans le vif  du sujet, l&rsquo;&eacute;dition de sa crontab&nbsp;!<br />
  Premi&egrave;re chose &agrave; faire, pour &eacute;diter sa crontab, lancer la  commande&nbsp;:<br />
  crontab -e</p>
<p>Elle permet d&rsquo;ouvrir la crontab dans l&rsquo;&eacute;diteur de texte par  d&eacute;faut.</p>
<p>Chaque ligne de commande correspondra &agrave; une t&acirc;che planifi&eacute;e.  Elle se pr&eacute;sentera sous la forme suivante&nbsp;:</p>
<pre>mm hh jj MMM JJJ t&acirc;che &gt; log</pre>
<p><em>mm</em> pour :  minutes (entre 0 et 59).<br />
    <em>hh</em> pour :  heures (entre 0 et 23).<br />
    <em>jj</em> pour :  jour (entre 1 et 31).<br />
    <em>MMM</em> pour :  mois (entre 1 et 12, ou les trois premi&egrave;res lettres du mois correspondant).<br />
    <em>JJJ</em> pour :  jour de la semaine (entre 0 (pour dimanche) et 6 (pour samedi), ou les trois  premi&egrave;res lettres du jour concern&eacute;. Notons que dimanche est aussi 7).<br />
    <em>t&acirc;che</em> pour :  commande ou script shell &agrave; ex&eacute;cuter.<br />
    <em>log</em> pour : nom d'un fichier dans lequel stocker le journal des op&eacute;rations. Si la  clause&gt; log n'est pas sp&eacute;cifi&eacute;e, cron enverra automatiquement un courriel de  confirmation. Pour &eacute;viter cela il suffit de sp&eacute;cifier &gt; /dev/null.</p>
<p>Pour les 5 premi&egrave;res colonnes (qui sont les unit&eacute;s de temps  qui d&eacute;clencheront le cron), quelques options avanc&eacute;es sont possibles&nbsp;:<br />
  Une &eacute;toile ( * ) &agrave; la place d&rsquo;une  valeur signifiera pour toutes les valeurs de cette colonne.<br />
  <em>Ainsi&nbsp;: 00 10 * * * t&acirc;che  &gt; log &agrave;  la t&acirc;che d&rsquo;effectuera tous les jours de tous les mois &agrave; 10h00.</em><br />
  Un tiret ( - ) entre deux valeurs  signifiera toutes les valeurs entre la premi&egrave;re et la deuxi&egrave;me valeur.<br />
  <em>Ainsi&nbsp;: 00 6-10 * * * t&acirc;che  &gt; log &agrave;  la t&acirc;che s&rsquo;effectuera tous les jours &agrave; 6h00, 7h00, 8h00, 9h00 et 10h00 (de 6 &agrave;  10).</em><br />
  Une virgule ( , ) indique une  liste de valeurs.<br />
  <em>Ainsi&nbsp;: 00 6,10 * * * t&acirc;che  &gt; log &agrave;  la t&acirc;che s&rsquo;effectuera tous les jours &agrave; 6h00 et &agrave; 10h00.</em><br />
  Enfin, une barre oblique ( / )  indique des valeurs p&eacute;riodiques.<br />
  <em>Ainsi, 0-59/2 10 * * * t&acirc;che &gt;  log &agrave;  la t&acirc;che s&rsquo;effetuera tous les jours, &agrave; toutes les minutes paires de 10h.</em><br />
  Notons que &lsquo;*&rsquo; peut &ecirc;tre combin&eacute;  &agrave; &lsquo;/&rsquo;&nbsp;: 00 10 */3 * * t&acirc;che &gt; log &agrave; la t&acirc;che s&rsquo;effectuera  tous les 3 jours &agrave; 10h00.</p>
<p><strong>NB&nbsp;:</strong> les  lignes commen&ccedil;ant par un di&egrave;se ( # ) sont des commentaires et ne seront pas  trait&eacute;es.</p>
<p><u>Important 1&nbsp;:</u> D'abord, il faut s'assurer que le  script fonctionne en mode shell, c'est &agrave; dire qu'il est capable de s'executer  depuis la ligne de commande. Pour cela, il faut placer dans la premi&egrave;re ligne  #!/usr/local/bin/php s'il s'agit d'un script php, #!/usr/bin/perl si c'est un  script perl, ou #!/bin/bash pour un script shell, puis utiliser la commande  chmod 700 script.cgi sur le script. Si vous avez l'acc&egrave;s telnet/ssh, vous  pouvez tester son execution avec ./script.cgi<br />
    <br />
    <u>Important 2&nbsp;:</u> N'oubliez pas d'utiliser la commande &quot;cd  /home/login&quot; au d&eacute;but de votre script, ou bien d'utiliser des chemins  absolus lorsque vous pr&eacute;cisez le nom d'un fichier (par exemple  /home/login/texte.txt au lieu de texte.txt), car votre script s'&eacute;x&eacute;cutera dans  le r&eacute;pertoire.</p>
<p>Voil&agrave; un exemple&nbsp;d&rsquo;une ligne d&rsquo;une crontab:<br />
  <q>00 10 * * * toto /usr/local/bin/php /home/toto/www/test/back.php</q> <br />
  (Tous les jours &agrave; 10h00, le script back.php s&rsquo;ex&eacute;cute.)</p>
<p>&nbsp;</p>
<p><h4>Conclusion&nbsp;:</h4></p>
<p>Vous voil&agrave; donc pr&ecirc;t &agrave; cr&eacute;er vos propres t&acirc;ches planifi&eacute;es  sous Linux. Ce didacticiel reste sommaire et n&rsquo;explique que les sp&eacute;cificit&eacute;s  pour &eacute;diter sa crontab, mais la colonne &laquo;&nbsp;t&acirc;che&nbsp;&raquo; peut &ecirc;tre tr&egrave;s  pouss&eacute;es puisqu&rsquo;elle peut comprendre un script shell, php, cgi, perl, &hellip; &agrave;  ex&eacute;cuter, et on peut tr&egrave;s vite compliquer les choses.<br />
  De nombreux sites expliquent ce que sont les crons et  comment travailler avec, &agrave; vous de parcourir la toile pour rechercher des  informations plus techniques.</p>
<p><strong>Sources&nbsp;:</strong><br />
  Guide  OVH&nbsp;: <a href="http://guides.ovh.net/MutualiseCron">MutualiseCron</a> <br />
  Wikipedia&nbsp;: <a href="http://fr.wikipedia.org/wiki/Crontab">La crontab</a> et les <a href="http://fr.wikipedia.org/wiki/Cron">  crons</a></p><script type="text/javascript" src="/dotclear/scripts/sommaire.js"></script><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/oekz-ubdL4o" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/07/09/21-les-crons-ou-les-taches-planifiees-sous-linux</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/07/02/20-un-menu-par-onglet-svp">
  <title>Un menu par onglet svp</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/YHtCDgy1YHs/20-un-menu-par-onglet-svp</link>
  <dc:date>2007-07-02T13:21:40+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Technique</dc:subject>
  <description>La navigation par onglets est devenue, depuis quelques temps, omniprésente dans le web d'aujourd'hui, c'est un fait.
Cela pose donc quelques questions et notamment, pourquoi ce système est-il devenu si populaire ? Comment le rendre véritablement éfficace et bien sur, comment qu'on fait ?</description>
  <content:encoded><![CDATA[<p>La navigation par onglets est devenue, depuis quelques temps, omniprésente dans le web d'aujourd'hui, c'est un fait.
Cela pose donc quelques questions et notamment, pourquoi ce système est-il devenu si populaire ? Comment le rendre véritablement éfficace et bien sur, comment qu'on fait ?</p> <h3>Sommaire</h3>
<ul>
 <li><a href="#pourquoi">Pourquoi c'est bien ?</a></li>
 <li><a href="#optimiser">Comment l'optimiser ?</a></li>
<li><a href="#technique">Comment qu'on fait ?</a></li>
<ul>
<li><a href="#html">Le HTML</a></li>
<li><a href="#css">Les CSS</a></li>
</ul>
</ul>

<h4><a name="pourquoi">Pourquoi c'est bien ?</a></h4>
<p>En fait l'un des principax avantages de l'onglet et sa capacité à cumuler deux indicateurs forts : 
<ul>
<li>"Je suis la navigation"</li>
<li>"Vous êtes ici"</li>
</ul>
D'autre part, les onglets sont, souvent, synonymes de profondeur. En effet de part leur agencement et leur design, on doit avoir l'impression que la page en cours est "au-dessus" des autres.</p>
<p>Au-delà de cette considération purement cosmètiques (;)), la navigation par onglets dispose donc, de bien des avantages. De par leur image renvoyée par l'inconscient collectif d'abord (l'utilisateur sait que des onglets représente la navigation), de part leur image tout court ensuite puisque les onglets sont généralement facilement identifiables</p>

<h4><a name="optimiser">Comment les optimiser</a></h4>
<p>C'est décidé, vous allez utiliser les onglets. Cependant vous vous demandez encore comment les utilisez correctement.</p>
<p>En tout premier lieu et ca tombe sous le sens, ne pas les utiliser à contre-emploi. Ne pas violer l'inconscient collectif en les utilisant à d'autres fins que la navigation. Utiliser un design clair qui fasse que :
<ol>
<li>les onglets soient facilement accessibles</li>
<li>'il y ait une réelle interconnexion entre les onglets</li>
<li>l'onglet sélectionné soit immédiatement identifiable parmi les autres</li>
</ol>
</p>
<p>Il convient, enfin de sélectionner par défaut un onglet, afin de garder la navigation cohèrente et de ne pas dépasser cinq à six onglets (sur ce sujet un article très intéressant concernant la navigation d'Amazon <a href="http://www.lukew.com/ff/entry.asp?178" hreflang="en">ICI_[en]</a>)</p>

<h4><a name="technique">Comment qu'on fait ?</a></h4>
<h5><a name="html">Le HTML</a></h5>
<pre name="code" class="html">
&lt;ul id=&quot;menu&quot;&gt;
&lt;li&gt;&lt;a href=&quot;index.php&quot;&gt;Accueil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;apropos.php&quot;&gt;A propos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;contact.php&quot;&gt;Contact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Une liste, tout ce qu'il y a de plus classique.</p>

<h5><a name="css">Les CSS</a></h5>
<pre name="code" class="css">
ul#menu{
clear:both;
list-style: none;
margin:0;
  }
  ul#menu li {
  float: left;
  }
ul#menu li a {
text-align: center;
width: 87px;
height: 15px;
display: block;
background-image:url(images/fondbouton.jpg);
background-repeat: no-repeat;
background-position: center left
 }
ul#menu li a:hover, ul#menu li a:active {
  background-position: top left;
}
ul#menu li a.selected {
  background-position: bottom left;
  cursor:default;
}
</pre>

<p>La aussi beaucoup de classique. On enlève les puces via la propriété <code>list-style</code> et on applique un <code>float:left</code> à chaque "list item" afin que notre liste soit en ligne et non pas en bloc</p>
<p>Concernant les liens, on leur applique un <code>dispay:block</code> afin de pouvoir leur fixer des dimensions (l'élément <code>a</code> est en effet de type <code>inline</code> (tant au niveau xHTML que CSS) par défaut et ne peut donc par définition se voir appliquer de dimensions).</p>
<p>Il est à noter que notre élément <code>a</code> dispose de trois états :
<ol>
<li>normal</li>
<li>survolé ou actif</li>
<li>selectionné</li>
</ol>
</p>
<p>Pour chacun de ces états on va, non pas appliquer un background diffèrent pour chaque état, mais utiliser une seule image contenant nos trois états et dont on va modifier la position.</p>
<p>Par exemple on utilisera cette image :<br/><img src="/dotclear/images/IMG/fondbouton.jpg" alt="" /></p>
<p>Ainsi pour l'effet normal on fixera le fond de l'image au centre, pour le survolé, on se met en haut et pour le selectionné, on se met en bas (A noter aussi que j'ai affecté le curseur par défaut, soit la flêche à cet état afin de rendre la navigation optimale).<br/>Simple, non ?</p>

<h5><a name="php">Le PHP</a></h5>
<p>A l'évocation du mot <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> je sens poindre la question :

<blockquote>Mais pourquoi s'entête-t-il à nous mettre du PHP partout ?</blockquote>
Et j'aurais envie de répondre, soyez heureux, il n'y a pas de JavaScript ;)</p>
Plus sérieusement, en tant que bon webmaster je suis évidemment (voire éminemment) feignant. De fait, il est impensable d'inscrire en dur sur chaque page l'élément effectivement sélectionné. Nous allons donc utiliser PHP afin que cette tâche soit automatique.<p>
<h6>Le principe</h6>
<p>Sur chaque page, nous allons, controler l'adresse de cette page, si elle correspond à l'un de nos liens, on applique à ce lien la classe <abbr title="Cascading StyleSheets">CSS</abbr> "selected" qui correspond à l'effet selectionné.</p>
<h6>La fonction</h6>
<pre name="code" class="php">
&lt;?php
&nbsp;&nbsp;function selected($myPage) {
&nbsp;&nbsp;&nbsp;&nbsp;if (strpos($_SERVER['PHP_SELF'], $myPage)===<strong>false</strong>) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo '';
&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo 'class=&quot;selected&quot; ';
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
?&gt;
</pre>
<p>On utilise la fonction <code>strpos</code> qui retourne la position numérique de la première occurrence de $myPage dans la chaîne de caractères $_SERVER['PHP_SELF'].<br/>
Si $myPage n'est pas trouvé, on ne retourne rien, sinon on écrit class="selected"</p>
<p>Il ne reste plus qu'a implémenter cela dans notre liste du début :</p>
<pre name="code" class="html">
&lt;ul id=&quot;menu&quot;&gt;
&nbsp;&lt;li&gt;&lt;a &lt;?php selected('index') ?&gt;href=&quot;index.php&quot;&gt;Accueil&lt;/a&gt;&lt;/li&gt;
&nbsp;&lt;li&gt;&lt;a &lt;?php selected('apropos') ?&gt;href=&quot;apropos.php&quot;&gt;A propos&lt;/a&gt;&lt;/li&gt;
&nbsp;&lt;li&gt;&lt;a &lt;?php selected('contact') ?&gt;href=&quot;contact.php&quot;&gt;Contact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<h4>C'est fini</h4>
<p>Voilà, voilà, vous savez maintenant comment et pourquoi créer un menu par onglets.<br/>Critiques, questions, problèmes et commentaires dans... les commentaires [mode apple off ;)]</p><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/YHtCDgy1YHs" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/07/02/20-un-menu-par-onglet-svp</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/06/13/19-et-si-on-parlait-navigation">
  <title>Et si on parlait navigation ?</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/7fi-SZCujj0/19-et-si-on-parlait-navigation</link>
  <dc:date>2007-06-13T23:05:33+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Internet</dc:subject>
  <description>Il peut paraître bizarre qu'à l'heure du web 2.0, du dynamisme affirmé de notre toile, on puisse encore discutailler sur la navigation.
C'est vrai quoi, le webmaster que je suis, et que vous êtes peut-être, sais très bien comment rendre un site navigable efficacement et agréablement.
Ben oui, non mais sans blague !!!
...
Bon allez, faisons fî, l'espace de quelques secondes, de notre ego naturel de meilleur webmaster du monde et tachons, grâce à Derek Powazek, de nous poser les vrais questions.</description>
  <content:encoded><![CDATA[Il peut paraître bizarre qu'à l'heure du web 2.0, du dynamisme affirmé de notre toile, on puisse encore discutailler sur la navigation.<br/>
C'est vrai quoi, le webmaster que je suis, et que vous êtes peut-être, sais très bien comment rendre un site navigable efficacement et agréablement.<br/>
Ben oui, non mais sans blague !!!<br/>
...<br/>
Bon allez, faisons fî, l'espace de quelques secondes, de notre ego naturel de meilleur webmaster du monde et tachons, grâce à Derek Powazek, de nous poser les vrais questions. <h3>Sommaire</h3>
<ul>
 <li><a href="#quoi">Qu'est-ce que la navigation ?</a></li>
 <li><a href="#passe">Passé, présent, futur</a></li>
<li><a href="#important">Mais pourquoi est-ce important ?</a></li>
<li><a href="#regle">Les règles à suivre</a></li>
</ul>

<h4><a name="quoi">Qu'est-ce que la navigation ?</a></h4>
On commence par les définitions du net et on apprend d'après le glossaire de powered-by-net, que la navigation c'est :
<blockquote>Fait de passer d'une page à l'autre dans un site Internet. Le système de navigation permet d'accéder directement à la page désirée sans être obligé de suivre un ordre pré-établi.</blockquote>
Ok, rien de bien neuf, rien qui mérite un article (sic). En revanche une définition trouvée sur le site de la garde côtière canadienne mérite toute notre attention :
<blockquote>Déplacement d'un point à un autre en sachant où on se trouve par rapport à la route choisie.</blockquote>
Bien qu'étant originellement, déstinée à la navigation en mer, elle se rapproche assez de ce qu'est ou en tout cas devrait être la navigation sur un site web.

<h4><a name="passe">Passé, présent, futur</a></h4>
La navigation sur un site web, n'est pas qu'un simple ensemble de liens, c'est un véritable outil de communication voire d'intéraction avec l'utilisateur. La navigation doit pouvoir le renseigner sur son passé, son présent et son futur sur votre site, répondant ainsi aux questions :
<ol>
 <li>D'où viens-je ?</li>
 <li>Où suis-je ?</li>
 <li>Où Puis-je aller ?</li>
</ol>
(Note aux futurs bacheliers qui viennent de passer l'épreuve de philo : je peux comprendre que vous arretiez là la lecture ;) )<br/>
Cela peut paraître évident à tous, mais faisons le test, prenons une page au hasard dans le vaste web.<br/>
Peut-elle répondre à nos trois questions existentielles ?<br/>La réponse est trop souvent non.

<h4><a name="important">Mais pourquoi est-ce important ?</a></h4>
<blockquote>Bien oui, c'est vrai ça au fait !</blockquote>
Tout simplement parceque c'est un élément inévitable de votre crédibilité. Des études montrent sans discussion possible que la navigation est l'un des facteurs-clé dans le choix par l'utilisateur de vous "bookmarker" ou de simplement passer à autre chose...

<h4><a name="regle">Les règles à suivre</a></h4>
Maintenant que vous êtes convaincus de la pertinence d'une bonne navigation, voici donc trois règles simples pour rendre notre navigation plus crédible.
<h5>Ne jamais lier la page sur laquelle on est</h5>
<p>La navigation parle (ne me regardez pas comme ça !), donc je le re-dis, la navigation parle et quand le pointeur de la souris se transforme en petite main au dessus-d'un lien, elle dit : <em>"Ceci est un lieu où vous pouvez aller, cliquez-moi pour y aller maintenant"</em>. </p>
<p>De fait, l'internaute s'attend donc, lors du clic, à être transporté sur une nouvelle page ou à défaut à ce qu'il se passe quelque chose. Hors s'il ne se passe rien lors du clic, l'expèrience de navigation, justement, devient mauvaise puisque le visiteur est alors déçu.</p>
<h5>Toujours montrer où l'on est</h5>
Ce point est dans la même veine que le premier, il est très important que l'utilisateur ne se sente jamais perdu (on verra dans un prochain article l'importance des "sitemaps"). Donnez-lui le maximum d'indices visuels sur sa position.
<h5>Réfelechir avant de lier</h5>
<p>Tout simplement, à chaque lien, mettez-vous à la place du visteur qui arrive sur votre page pour la première fois et posez-vous la question : <em>"Est-ce que ce lien va me servir dans le cadre de la navigation globale du site ?"</em></p>
<p>Soyez toujours sûr que votre navigation raconte l'histoire que vous voulez qu'elle raconte et surtout qu'elle demeure la description fidèle de votre site pour votre visiteur</p>
<p>Cela pose évidemment de nombreuses questions, peut-être même plus que cela n'apporte de réponses, le lien "Accueil" doit-il faire partie de la navigation globale ? Faut-il rester sous les cinq liens pour cette dernière ? <em>Quid</em> des sous-menus ? De nombreuses questions pour une réponse : ça dépend.</p>
<p>Architecturez, designez, créez votre site en fonction des internautes que vous avez et en fonction de ceux que vous voulez et surtout n'oubliez jamais, on peut toujours faire mieux...</p>

<h4><a name="ressources">Ressources</a></h4>
Cet article est une traduction libre de l'article de Derek Powazek, Where am I ? que vous pouvez trouvez en VO <a href="http://www.alistapart.com/articles/whereami" hreflang="en">ICI</a><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/7fi-SZCujj0" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/06/13/19-et-si-on-parlait-navigation</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/06/10/18-eyeos-ou-l-autre-dimension-du-web">
  <title>eyeOS ou l'autre dimension du web</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/LhmKSkqmHaU/18-eyeos-ou-l-autre-dimension-du-web</link>
  <dc:date>2007-06-10T22:00:11+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Internet</dc:subject>
  <description>Vous en avez révé (sisi avouez...) EyeOs l'a fait....</description>
  <content:encoded><![CDATA[<p>Vous en avez révé (sisi avouez...) EyeOs l'a fait....</p> <p>Mais quoi donc me direz-vous la bave aux lèvres et les yeux tout écarquillés ?!!?!?<br />
Prenez un mouchoir, je vais mettre fin à cet insoutenable suspense (sic). EyeOS vient enfin de sortir en version 1.0 finale joliment baptisée Dahlia.<br /></p>


<p>Bref tout cela est bien joli mais ne nous dis pas ce qu'est EyeOs. Et bien EyeOs est, comme son nom l'indique partiellement, un Operating System ou système d'exploitation (un Windows quoi) qui utilise uniquement votre navigateur préféré.<br />
En effet&nbsp;! Point d'installation ici, il suffit d'ouvrir votre panda et vous tombé nez-à-nez avec un véritable petit système contenant tout ce qu'il faut pour bien travailler, navigateur de fichier, calendrier, traitement de texte, jeu d'echec et même navigateur internet !<br /></p>


<p>Bon attention, on est loin de la puissance de l'outil de Microsoft ou d'une bonne distib <abbr title="Linux Is Not UniX">Linux</abbr> mais c'est déjà impressionnant.<br />
Impressionnant donc et la performance est clairement à souligner mais le mieux est encore d'aller se rendre compte par soi-même de la bête grâce à la page de <a href="http://demo.eyeos.org/" hreflang="fr">demo</a>.<br /></p>


<p>La dernière question reste de connaitre la véritable pertinence d'avoir un <abbr title="Operating System">OS</abbr> qui se lance à partir d'un autre...</p>


<h3>Ressources</h3>


<h4>Liens</h4>

<p><a href="http://eyeos.org/" hreflang="en">l'adresse d'EyeOS</a></p>


<h4>Screens</h4>

<p><a href="http://www.eyeos.org/img/screens/s1.jpg"><img src="http://www.eyeos.org/img/screens/p1.jpg" alt="" /></a><br />
<a href="http://www.eyeos.org/img/screens/s6.jpg"><img src="http://www.eyeos.org/img/screens/p6.jpg" alt="" /></a><br />
<a href="http://www.eyeos.org/img/screens/s4.jpg"><img src="http://www.eyeos.org/img/screens/p4.jpg" alt="" /></a><br /></p><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/LhmKSkqmHaU" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/06/10/18-eyeos-ou-l-autre-dimension-du-web</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/06/08/17-creer-un-preloader-html">
  <title>Créer un preloader HTML</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/RrAGPFiIRDo/17-creer-un-preloader-html</link>
  <dc:date>2007-06-08T19:21:28+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Technique</dc:subject>
  <description>Un preloader HTML ??
A quoi ça peut bien servir et comment ça se fait ?


PS: Vous pouvez cliquer sur "Lire la suite", rien ne charge vraiment ;-)</description>
  <content:encoded><![CDATA[Un preloader HTML ??<br/>
A quoi ça peut bien servir et comment ça se fait ?<br/><br/>
<img src="http://www.jkconception.com/dotclear/images/loading.gif" alt="Loader fictif" /><br/>
<br/>
PS: Vous pouvez cliquer sur "Lire la suite", rien ne charge vraiment ;-) <h3>Sommaire</h3>
<ul>
<li><a href="#but">Le but...</a></li>
<li><a href="#principe">Le principe</a></li>
<li><a href="#html">Le <abbr title="HyperText Markup Language">HTML</abbr></a></li>
<li><a href="#javascript">Le JavaScript</a></li>
<li><a href="#finir">Pour finir</a></li>
</ul>

<h4><a name="but">Le but...</a></h4>
<p>Compte tenu du poids des images, du contenu dynamique à parser toujours croissant, il peut arriver que votre page ne soit pas très esthétique durant son chargement.<br/>Afin de rendre ce chargement un peu plus agréable à l'utilisateur, nous allons voir ici comment développer un petit preloader grâce à JavaScript et la manipulation de propriétés <abbr title="Cascading Style Sheet">CSS</abbr>.</p>

<h4><a name="principe">Le principe</a></h4>
<p>Il est tout simple (le principe), nous allons diviser notre page en deux parties, l'une contenant tout le contenu de notre site, l'autre ce qui sera presenté au visiteur durant le chargement du dit-contenu.</p>

<h4><a name="html">Le <abbr title="Hyper Text Markup Language">HTML</abbr></a></h4>
<table class="code">
<tr><td><code>
&lt;body&gt;<br /> &lt;div id=&quot;wait&quot;&gt;<br /> &lt;!--on place ici notre loader, l'image vue plus haut par exemple--&gt;<br /> &lt;/div&gt;<br /> &lt;div id=&quot;content&quot;&gt;<br /> &lt;!--on place ici tout le contenu du site--&gt;<br /> &lt;/div&gt;<br /> &lt;/body&gt;
</code></td></tr>
</table>
<p>Voilà, rien de compliqué donc, on passe au JavaScript qui va nous permettre d'obtenir l'effet voulu.</p>

<h4><a name="javascript">Le JavaScript</a></h4>
<p>On va placer deux petits scripts, le premier entre les balises &lt;head&gt; de notre page, le second à la fin du document, juste avant la balise &lt;/body&gt; de celui-ci.</p>
<h5>Dans le <code>head</code></h5>
<h6>Le code</h6>
<table class="code">
<tr><td><code>
&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot;&gt;<br /> &lt;!--<br /> var DHTML = (document.getElementById || document.all || document.layers);<br /> function ap_getObj(name)<br /> {<br />  if (document.getElementById)<br />  {<br />  return document.getElementById(name).style;<br />  }<br />  else if (document.all)<br />  {<br />  return document.all[name].style;<br />  }<br />  else if (document.layers)<br />  {<br />  return document.layers[name];<br />  }<br /> }<br /> <br /> function ap_showWaitMessage(div, flag)<br /> {<br />  if (!DHTML) return;<br />  var x = ap_getObj(div);<br />  x.display = (flag) ? 'block':'none'<br />  return true;<br /> }<br />  <br /> ap_showWaitMessage('wait', 1);<br /> //--&gt;<br /> &lt;/script&gt;
</code></td></tr>
</table>
<h6>l'explication</h6>
<p>Allons y pour l'explication de ce petit bout de code :</p>
<p>La variable DHTML et la fonction ap_getObj nous permet de selectioner par l'id du div ses CSS quelque soit l'arbre de <abbr title="Document Object Model">DOM</abbr> de notre navigateur.</p>
<p>La fonction <code>ap_showWaitMessage(div, flag)</code> va en fonction du "flag" fixé le display du div à block ou à none. En d'autres termes, on donne l'identifiant du div voulu à la fonction et par l'opérateur conditionnel <code>?</code> (que l'on a déjà vu dans <a href="http://www.jkconception.com/dotclear/index.php/2007/03/27/7-faire-un-changeur-de-style-en-javascript">Le styleswitcher Javascript</a>) si le flag est à 1 on affiche le div, s'il est à 0 on le masque.</p>
<p>Pour finir, on affiche par défaut le div 'wait'</p>
<h5>A la fin de la page</h5>
<h6>Le code</h6>
<table class="code">
<tr><td><code>
&lt;script type=&quot;text/javascript&quot; language="javascript"&gt;<br /> &lt;!--<br /> ap_showWaitMessage('wait', 0);<br /> ap_showWaitMessage('content', 1);<br /> //--&gt;<br /> &lt;/script&gt;
</code></td></tr>
</table>
<h6>L'explication</h6>
<p>En fin de page, donc lorsque toute notre page est chargée (c'est là qu'est l'astuce ;-)), on cache le div d'attente et on affiche le div content</p>
<h4><a name="finir">Pour finir</a></h4>
<p>Deux petites remarques pour finir, il est à noter que le display de votre div content doit être fixé à none par défaut, et celui de wait à block</p>
<p>La seconde remarque concerne l'accessibilité, en effet si votre visiteur a désactivé l'usage de JavaScript dans son navigateur, il n'aura pas accès à votre site !<br/>Il est donc nécessaire d'insérer un lien vers votre page dépourvue de tout effet javascriptien dans votre preloader</p>
<p>Voilà pour notre preloader, remarques, critiques et autres c'est dans les comm' :)</p><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/RrAGPFiIRDo" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/06/08/17-creer-un-preloader-html</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/06/02/15-les-cookies">
  <title>Les cookies</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/ydv8xdVfG34/15-les-cookies</link>
  <dc:date>2007-06-02T21:54:48+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Technique</dc:subject>
  <description>Recettes PHP et JavaScript des cookies.

Parceque les cookies, c'est bon...</description>
  <content:encoded><![CDATA[Recettes <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> et JavaScript des cookies.<br/>
<img src="http://www.jkconception.com/dotclear/images/cookies.jpg" alt=""/><br/>
Parceque les cookies, c'est bon... <h3>Sommaire</h3>
<ul>
	<li><a href="#cookie">Qu'est-ce qu'un cookie ?</a></li>
    <li><a href="#php">Manipuler les cookies avec <abbr title="PHP : Hypertext Preprocessor">PHP</abbr></a></li>
    <li><a href="#javascript">Manipuler les cookies avec JavaScript</a></li>
</ul>

<a name="cookie"><h4>Qu'est-ce qu'un cookie</h4></a>
En plus de délicieux gateaux les cookies sont aussi, selon <a href="http://fr.wikipedia.org">Wikipedia</a>, 
<blockquote>de petits fichiers textes stockés par le navigateur Web sur le disque dur du visiteur d'un site Web et qui servent (entre autres) à enregistrer des informations sur le visiteur ou encore sur son parcours dans le site. Le webmestre peut ainsi reconnaître les habitudes d'un visiteur et personnaliser la présentation de son site pour chaque visiteur ; les cookies permettent alors de garder en mémoire combien d'articles il faut afficher en page d'accueil ou encore de retenir les identifiants de connexion à une éventuelle partie privée : lorsque le visiteur revient sur le site, il ne lui est plus nécessaire de taper son nom et son mot de passe pour se faire reconnaître, puisqu'ils sont automatiquement envoyés par le cookie.<br/>
<br/>
Un cookie a une durée de vie limitée, fixée par le concepteur du site. Ils peuvent aussi expirer à la fin de la session sur le site, ce qui correspond à la fermeture du navigateur. Les cookies sont largement utilisés pour simplifier la vie des visiteurs et lui présenter des informations plus pertinentes. Mais une technique particulière permet aussi de suivre un visiteur sur plusieurs sites et ainsi de collecter et recouper des informations très étendues sur ses habitudes. Cette technique a donné à l'usage des cookies une réputation de technique de surveillance violant la sphère privée des visiteurs.</blockquote>
Nous voilà un plus cultivé, bien maintenant comment utiliser ces cookies (pour faciliter la vie de l'utilisateur pas pour le fliquer hein !).<br/>
D'une manière générale deux voire trois manipulations se font sur les cookies, la création, la lecture et la destruction.<br/>Deux méthodes pour faire tout cela, en PHP ou en JavaScript. Puisque l'on peut avoir besoin de connaitre les deux, commençons par le PHP :
<a name="php"><h4>Manipuler des cookies en PHP</h4></a>
<h5>Création</h5>
 La création de cookies en PHP se fait via la fonction <code class="lignecode">setcookie</code> qui se definit comme suit : <code>bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )</code><br/>
Comme vous pouvez le voir seul le nom est obligatoire. Il est aussi à noter que les cookies sont des en-têtes et doivent donc être envoyer avant toute sortie balise <code>&lt;html&gt;</code> ou <code>&lt;head&gt;</code><br/>
Voyons tout de suite un exemple un poil plus concret.
<h6>Exemple</h6>
<table class="code">
<tr>
<td>
<code>
<span style="color:#FF1A00">&lt;?php</span> setcookie("Nom","Dupond",time()+3600); <span style="color:#FF1A00">?&gt;</span>
</code>
</td>
</tr>
</table>
Ceci va donc nous créer un cookie nommé "Nom" dont la valeur est "Dupond" et qui expire dans une heure. Concernant l'argument <code>expire</code>, il est à noter que celui-ci est un timestamp Unix et qu'il vous faudra donc utiliser la fonction time() ou mktime(). Si vous occultez l'argument <code>expire</code> ou si vous le fixez à 0, le cookie expirera à la fin de la session (soit la fermeture du navigateur).<br/>
Je ne m'attarderais pas plus sur les arguments de <code>setcookie</code> mais vous pouvez retrouver toutes les explications nécessaires sur l'excellent manuel php <a href="http://www.php.net/setcookie">ICI</a>.
<h5>Lecture</h5>
La aussi la manipulation est simplissime, on récupère nos cookies grâce aux variables prédéfinies <code>$_COOKIES</code> ou <code>$HTTP_COOKIE_VARS</code><br/>
Ainsi et pour reprendre l'exemple :
<h6>Exemple</h6>
<table class="code">
<tr>
<td>
<code>
<span style="color:#FF1A00">&lt;?php</span><br/>
echo $_COOKIE['Nom']; <span style="color:#FF7400;">// affichera Dupond </span><br/>
echo $HTTP_COOKIE_VARS['Nom']; <span style="color:#FF7400">//affichera aussi Dupond mais n'est disponible qu'a partir de PHP 4.1.0</span><br/>
<span style="color:#FF1A00">?&gt;</span>
</code>
</td>
</tr>
</table>
La aussi c'est tout simple !<br/>
A noter que si vous désirez lister tous vos cookies vous pouvez le faire via la méthode suivante :
<table class="code">
<tr>
<td>
<code>
<span style="color:#FF1A00">&lt;?php</span><br/>
print_r($_COOKIE); <span style="color:#FF7400">//affichera tous vos cookies</span><br/>
<span style="color:#FF1A00">?&gt;</span>
</code>
</td>
</tr>
</table>
Voilà pour la lecture, passons donc à la destruction !
<h5>Destruction (MAJ 04/06)</h5>
La méthode vue précédemment (à savoir l'utilisation de setcookie avec comme seul argument le nom du cookie) ayant à priori des réactions difficilement prévisibles, puisque si un cookie dont la valeur est <code>null</code>, est censé être éffacé du client, cela ne semble pas toujours être le cas, nous allons voir deux méthodes plus "sûres" afin de faire disparaitre ces délicieux biscuits.<br/>
La première, toujours en utilisant la fonction <code>setcookie</code>, consiste à fixer la date d'expiration dans le passé (-1 heure par exemple).
<h6>Exemple</h6>
<table class="code">
<tr>
<td>
<code>
<span style="color:#FF1A00">&lt;?php</span><br/>
setcookie("Nom", "", time()-3600); <span style="color:#FF7400">//detruira notre ami Dupond :'( </sapn><br/>
<span style="color:#FF1A00">?&gt;</span>
</code>
</td>
</tr>
</table>
la seconde méthode est, comme le suggère notre ami Thanh, d'utiliser la fonction <code>unset</code> toujours utile pour détruire une variable !
<h6>Exemple</h6>
<table class="code">
<tr>
<td>
<code>
<span style="color:#FF1A00">&lt;?php</span><br/>
unset($_COOKIE["Nom"]); <span style="color:#FF7400">//detruira notre ami Dupond :'( </sapn><br/>
<span style="color:#FF1A00">?&gt;</span>
</code>
</td>
</tr>
</table>
<br/>
Voilà, c'est à peu près tout ce qu'il y a à savoir sur les cookies et leur manipulation via <abbr title="PHP: Hypertext Preprocessor">PHP</abbr>. Rien de bien compliqué donc et c'est aussi le cas avec JavaScript, que nous allons voir tout de suite.<br/>
Mais avant je sens pointer la question :
<blockquote>Mais pourquoi je me ferais ***** à apprendre à les manipuler en JavaScript alors que je sais le faire maintenant en PHP ?</blockquote>
Très bonne question à laquelle, en temps que pseudo informaticien et vrai feignant, il est difficile de trouver une réponse engageante. Cependant on pourra en avncer au moins deux, la première : "On en sait jamais assez"...<br/>
Ok, passons à la deuxième alors, on a pu voir que la manipulation via PHP nous obligeait à utiliser la fonction <code>setcookie</code> avant toute sortie ce qui est somme toute assez limitatif hors JavaScript nous permet de nous affranchir de cette limitation en nous permettant la manipulation de cookie à n'importe quel moment/endroit de notre page.<br/>Troisième raison qui n'en est pas une, c'est aussi très simple.<br/>
<a name="javascript"><h4>Manipuler des cookies avec JavaScript</h4></a>
<h5>Création</h5>
Evidemment que ce soit en JavaScript, PHP, VBScript ou Mambo, un cookie reste un cookie avec les mêmes paramètres.<br/>
En Javascript on crée un cookie grâce à <code>document.cookie</code>, le mieux est de créer une fonction afin d'éviter les répétitions de code. On pourra donc utiliser la fonction vu précédemment dans le tuto pour <a href="http://www.jkconception.com/dotclear/index.php/2007/03/27/7-faire-un-changeur-de-style-en-javascript">créer un changeur de style en JavaScript</a> :
<table class="code">
<tr>
<td>
<code>
&lt;script type="text/javascript" language="JavaScript" &gt;<br/>
function creerCookie(name,value,days) {<br/>
 if (days) {<br/>
  var date = new Date(); <span style="color:#FF7400">//on instancie un objet Date</span><br/>
  date.setTime(date.getTime()+(days*24*60*60*1000)); <span style="color:#FF7400">//on recupère la date</span><br/>
  var expires = "; expires="+date.toGMTString(); <span style="color:#FF7400">//on fixe la date d'expiration</span><br/>
 }<br/>
  else expires = ""; <span style="color:#FF7400">//si la date n'est pas précisée on fixe la valeur par défaut</span><br/>
  document.cookie = name + "=" + value + expires + "; path=/"; <span style="color:#FF7400">//on crée le cookie</span><br/>
 }<br/>
&lt;/script&gt;<br/>
</code>
</td>
</tr>
</table>
On place ce bout de code entre les balises &lt;head&gt; de notre page. Ainsi pour créer un cookie, il suffit d'appeler cette fonction à partir du corps de notre page et de cette manière :
<h6>Exemple</h6>
<table class="code">
<tr>
<td>
<code>
&lt;script type="text/javascript" language="JavaScript" &gt;<br/>
creerCookie("Nom","Dupond",30);<br/>
&lt;/script&gt;<br/>
</code>
</td>
</tr>
</table>
Cela va donc nous créer un cookie "Nom" qui aura pour valeur "Dupond" et qui expirera à 30 jours.
<h5>Lecture</h5>
Ici aussi, on utilise une fontion qui se présente comme suit : 
<table class="code">
<tr>
<td>
<code>
&lt;script type="text/javascript" language="JavaScript" &gt;<br/>
function lireCookie(name) {<br/>
 var nameEQ = name + "=";<br/>
 var ca = document.cookie.split(';');<br/>
 for(var i=0;i < ca.length;i++) {<br/>
  var c = ca[i];<br/>
  while (c.charAt(0)==' ') c = c.substring(1,c.length);<br/>
  if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);<br/>
 }<br/>
 return null;<br/>
 }<br/>
&lt;/script&gt;<br/>
</code>
</td>
</tr>
</table>
Cette fonction étant un peu compliqué, on la détaillera pas ici (a moins que vraiment vous insistiez ;p). Toujours est-il que son utilisation, elle, est très simple puisqu'il suffit d'inserer dans notre corps de page un petit appel de cette manière :
<table class="code">
<tr>
<td>
<code>
&lt;script type="text/javascript" language="JavaScript" &gt;<br/>
<strong>var</strong> nom = lireCookie("Nom"); <span style="color:#FF7400;">//nom prendra pour valeur "Dupond"</span><br/>
&lt;/script&gt;<br/>
</code>
</td>
</tr>
</table>
<h5>Destruction</h5>
Pour finir, la destruction, pour détruire notre cookie, on va en fait recréer notre cookie, mais avec une date d'expiration obsolète :
<table class="code">
<tr>
<td>
<code>
&lt;script type="text/javascript" language="JavaScript" &gt;<br/>
function EffaceCookie(nom)<br/>
{<br/>
date = -1;<br/>
creerCookie(nom,null,date);<br/>
}<br/>
&lt;/script&gt;<br/>
</code>
</td>
</tr>
</table>
L'expiration a, ici, été fixée à -1 jour, mais peu importe du moment que c'est antérieur à maintenant (moins 1 heure aurait marché). Donc voila ne reste plus qu'a appeler la fonction depuis notre page, je vous fais grâce d'ailleurs de celui-ci et m'en vais aller déguster quelques biscuits aux pépites de chocolat... ;)<img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/ydv8xdVfG34" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/06/02/15-les-cookies</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/05/28/12-securiser-un-formulaire">
  <title>Sécuriser un formulaire</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/XP8TFeLhnag/12-securiser-un-formulaire</link>
  <dc:date>2007-05-28T11:38:21+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Technique</dc:subject>
  <description>Lorsque vous créez des formulaires (de contact par exemple), il subsiste toujours le risque, qu'un individu malveillant tente d'y insérer du code afin d'hacker votre joli site.
Nous allons donc voir ici une première base afin de rendre vos scripts un peu plus sécurisés.</description>
  <content:encoded><![CDATA[Lorsque vous créez des formulaires (de contact par exemple), il subsiste toujours le risque, qu'un individu malveillant tente d'y insérer du code afin d'hacker votre joli site.
Nous allons donc voir ici une première base afin de rendre vos scripts un peu plus sécurisés. Avant de commencer notons que l'élément important de cette sécuristaion est la fonction php <code>htmlspecialchars</code>.<br />
En effet prenons l'exemple d'un formulaire tout simple.<br />
<h4>Le formulaire</h4>
<table class="code">
<tr>
<td>
<code>
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br /> &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br /> &lt;head&gt;<br /> &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;<br /> &lt;title&gt;Mon formulaire pas sécurisé&lt;/title&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;form id=&quot;form1&quot; name=&quot;form1&quot; method=&quot;post&quot; action=&quot;traitement.php&quot;&gt;<br /> &lt;p&gt;Quel est votre nom ? &lt;input name=&quot;nom&quot; type=&quot;text&quot; id=&quot;nom&quot; size=&quot;20&quot; maxlength=&quot;20&quot; /&gt;&lt;/p&gt;<br /> &lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;Baptise&quot; /&gt;&lt;/p&gt;<br /> &lt;/form&gt;<br /> &lt;/body&gt;<br /> &lt;/html&gt;
</code>
</td>
</tr>
</table>
<br/>
Dès lors, la page traitement.php que vous pourriez utiliser ressemblerait à ceci :
<h4>la page de traitement</h4>
<table class="code">
<tr>
<td>
<code>
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br /> &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br /> &lt;head&gt;<br /> &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;<br /> &lt;title&gt;Affiche le nom&lt;/title&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;p&gt;Bonjour, votre nom est : &lt;?php echo $_POST['nom']; ?&gt;&lt;/p&gt;<br /> &lt;/body&gt;<br /> &lt;/html&gt;
</code>
</td>
</tr>
</table>
<p>Ce n'est absolument pas sécurisé !</p>
<p>En effet l'utilisation du <code>echo</code> permet d'inscrire n'importe quel code HTML et est donc une faille potentielle<br/>Mais comment regler ceci me direz-vous. Sechez donc les gouttes de sueur qui perlent sur votre front, la solution existe !</p>
<p>Il faut et il suffit (pour la plupart des utilisateurs en tout cas) de supprimer tout caractère suspicieux et notamment les "&lt;" et "&gt;".<br/>Ca tombe bien une fonction php s'occupe de faire cela très bien, j'ai nommé : <code>htmlspecialchars</code>.<br/>
Ainsi htmlspecialchars va remplacer :
<ul>
 <li>"<var>&amp;</var>" (et commercial) qui devient "<var>&amp;amp;</var>"
       </li><li>
        "<var>"</var>" (guillemets doubles) qui devient "<var>&amp;quot;</var>" lorsque <b><tt>ENT_NOQUOTES</tt></b>
        n'est pas utilisée.
       </li><li>
        "<var>'</var>" (single quote) qui devient "<var>&amp;#039;</var>" uniquement lorsque
        <b><tt>ENT_QUOTES</tt></b> est utilisée.
       </li><li>

        "<var>&lt;</var>" (inférieur à) qui devient "<var>&amp;lt;</var>"
       </li><li>
        "<var>&gt;</var>" (supérieur à) qui devient "<var>&amp;gt;</var>"</li>
</ul>
La fonction s'utilise donc de la manière suivante :<code> string htmlspecialchars ( string string [, int quote_style [, string charset]] )</code>.<br/>
Ne vous inquiètez pas, nous allons détailler quelque peu cette fonction et notamment ses arguments.</p>
<h5>Les arguments de htmlspecialchars</h5>
<ul>
 <li>string string</li>
Tout simplement la chaîne de caractères que vous voulez traiter.
<li>int quote_style</li>
Ici vous avez le choix entre :
<ul>
 <li><code>ENT_COMPAT</code></li>
Constante par défaut, elle convertit les guillemets double et ignore les simples.
<li><code>ENT_QUOTES</code></li>
Qui convertit à la fois doubles et simples.
<li><code>ENT_NOQUOTES</code></li>
Qui ignore à la fois doubles et simples
</ul>
<li>string charset</li>
Le dernier argument (optionnel), vous permet de spécifier le jeu de caractères utilisé durant la conversion (par défaut ISO-8859-1)
</ul>
<p>En définitive, notre page traitement.php ressemblera donc à ça :
<table class="code">
<tr>
<td>
<code>
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br /> &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br /> &lt;head&gt;<br /> &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;<br /> &lt;title&gt;Affiche le nom&lt;/title&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;p&gt;Bonjour, votre nom est : &lt;?php echo htmlspecialchars($_POST['nom'], ENT_QUOTES); ?&gt;&lt;/p&gt;<br /> &lt;/body&gt;<br /> &lt;/html&gt;
</code>
</td>
</tr>
</table>
<p>Voilà, plus de caractères dangereux, c'est là un premier pas vers une plus grande sécurisation de vos formulaires, il ne vous plus plus qu'à vous rendre à vos claviers !</p>
<h4>Aller plus loin</h4>
<p>N'hésitez pas à vous renseigner sur les fonctions <code>htmlentities</code> ou <code>htmlspecialchars_decode</code> qui pourront peut-être aussi vous servir</p><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/XP8TFeLhnag" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/05/28/12-securiser-un-formulaire</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/05/25/11-pompage-bien-utiliser-le-texte-alternatif">
  <title>POMPAGE - Bien utiliser le texte alternatif</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/ictcUpvOqb8/11-pompage-bien-utiliser-le-texte-alternatif</link>
  <dc:date>2007-05-25T11:41:35+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Technique</dc:subject>
  <description>Un excellent article du non-moins excellent Pompage à propos du texte alternatif (balise alt entre autre) de sa pertinence et de sa méthodologie.


POMPAGE - Bien utiliser le texte alternatif...</description>
  <content:encoded><![CDATA[ <p>Un excellent article du non-moins excellent Pompage à propos du texte alternatif (balise <code>alt</code> entre autre) de sa pertinence et de sa méthodologie.<br /></p>


<p><a href="http://www.pompage.net/pompe/bien-utiliser-le-texte-alternatif/">POMPAGE - Bien utiliser le texte alternatif</a></p><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/ictcUpvOqb8" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/05/25/11-pompage-bien-utiliser-le-texte-alternatif</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/05/03/10-la-guerre-des-drm">
  <title>La guerre des DRM</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/LQBFZe4anAs/10-la-guerre-des-drm</link>
  <dc:date>2007-05-03T23:00:13+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Internet</dc:subject>
  <description>Il n'y a pas longtemps, dans un monde très proche du notre, un homme porté par la voie populaire osa se dresser contre l'opression...
Ou quand Kevin Rose, fondateur de Digg cède à la pression de ses internautes et prend ses responsabilités face à la toute puissante industrie des DRM.</description>
  <content:encoded><![CDATA[Il n'y a pas longtemps, dans un monde très proche du notre, un homme porté par la voie populaire osa se dresser contre l'opression...<br/>
Ou quand Kevin Rose, fondateur de Digg cède à la pression de ses internautes et prend ses responsabilités face à la toute puissante industrie des DRM. <h3>Un nouvel espoir</h3>
Peut-être connaissez-vous Digg ?<br/>
Peut-être savez-vous, par ailleurs, que de nombreux DVD <abbr title="haute d&eacute;finition">HD</abbr> sont protégés par <abbr title="Digital Rights Management">DRM</abbr> (protection contre la reproduction des films) ?<br/>
<p>Bon pour répondre à la première question, <a href="http://www.digg.com" title="digg">Digg</a> est, depuis sa naissance fin 2004, l'une des icônes du Web 2.0. Digg permet notamment aux utilisateurs de proposer des actualités, sur lesquelles ceux-ci peuvent voter et ainsi influer sur le classement de ces actualités.</p>
<p>Bien, mis à part un petit elargissement de votre culture web si vous ne connaissiez pas Digg, il est légittime de se demander à ce moment du post, pourquoi ? C'est bien joli tout ça mais où veut-il en venir et quel est le rapport avec les <abbr title="Digital Rights Management">DRM</abbr> ?</p>
<p>En fait là où ça devient intéressant (qui a dit pas trop t&ocirc;t :P ) c'est que les <abbr title="Digital Rights Management">DRM</abbr> consistent en une clé sur 128 bits <em>censée rester secrète</em> et cryptant donn&eacute;es audio et vid&eacute;os.<br/>Hors ce qui devait arriver, arriva et un utilisateur, de Digg donc, dévoila la fameuse clé.</p>
<h3>L'empire contre-attaque</h3>
<p>Evidemment, cette actu a immédiatement eu un succ&egrave;s &eacute;norme avec plus de 15 000 votes en à peine quelques heures. (Notons tout de m&ecirc;me que cette cl&eacute; permet de copier n'importe quel film grav&eacute; avant la derni&egrave;re date de modification de celle-ci soit le 23 avril)</p>
<p>Apprenant cela, l'<abbr title="Advanced Access Content System Licensing Authority">AACS  LA</abbr>, consortium g&eacute;rant les protections du m&ecirc;me nom, ont imm&eacute;diatement contacter Digg afin d'exiger la suppression de cette infamie.</p>
<p>Tout rentra dans l'ordre puisque le post fut supprimer et l'utilisateur banni &agrave; titre d'exemple.</p>
<p>Pourtant, la reb&eacute;llion s'organisa et un nouvel article fut r&eacute;&eacute;cris quelques minutes seulement apr&egrave;s la suppression du premier. Nouvel article qui fut presque immédiatement supprim&eacute; &agrave; son tour. Cependant les utilisateurs de Digg continuèrent &agrave; publier massivement des articles incluant la cl&eacute; de la discorde tous supprim&eacute;s quelques instants plus tard.</p>
<h3>Le retour du Jedi</h3>
<p>Ce petit jeu continua jusqu'&agrave; ce que Kevin Rose, fondateur de Digg prenne la parole sur le blog de Digg :</p>
<blockquote>Aujourd'hui, c'est un jour de folie. En tant que fondateur de Digg, je voulais partager ma réflexion avec vous. Nous avons essayé de rester disponibles. Nous vous avons toujours laissé le pouvoir à la communauté. Occasionnellement, nous sommes intervenus pour supprimer des sujets qui violaient les règles d'utilisation du site ( lien vers des sites pornographiques, haine raciale etc..). Donc aujourd'hui a été un jour difficile pour nous. Nous avons du choisir de retirer ou de laisser des thèmes contentant un code sur la base d'une injonction. Pour éviter un scénario où Digg serai interrompu ou fermé, nous avons décidé de plier et de supprimer toute histoire mentionnant ce code.<br/>
<br/>
Mais maintenant, après avoir vu des centaines de mentions, et lu des milliers de commentaires, vous avez rendu les choses très claires. Vous préférez que Digg coule en se battant plutôt que de le voir plier face à une société plus puissante. Nous avons entendu, et à partir de maintenant, nous n'effacerons pas les histoires mentionnant ce code, et nous ferons face aux conséquences quelles qu'elles soient.<br/>
<br/>
Si nous perdons, et bien au moins nous serons morts en combattant</blockquote>
<a href="http://blog.digg.com/?p=74">La V.O.</a>
<p>Kevin Rose a certainement contenté sa force vive, celui qui le fait vivre, celui qui décide, le seul qui soit vraiment au centre du Web 2.0, l'utilisateur. Il va maintenant devoir faire face et rendre compte &agrave; la justice et &agrave; la puissante <abbr title="Advanced Access Content System Licensing Authority">AACS  LA</abbr> (derri&egrave;rre qui se cache IBM, Intel, Microsoft, Panasonic, Disney, Sony, Toshiba ou encore Warner Bros).</p>
<p>A la fin Luke bat l'empereur tandis que Vador symbole incarn&eacute; du mal se repentit. Il semble cependant que le cot&eacute; obscur soit beaucoup plus puissant dans la vie r&eacute;elle et il est probable qu'un seul Luke ne suffise pas. A bon entendeur...</p><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/LQBFZe4anAs" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/05/03/10-la-guerre-des-drm</feedburner:origLink></item>
<item rdf:about="http://www.jkconception.com/dotclear/index.php/2007/03/28/8-affichage-en-95c">
  <title>Affichage en 95C</title>
  <link>http://feedproxy.google.com/~r/JkconceptionLeBlog/~3/MfajkUcIWHc/8-affichage-en-95c</link>
  <dc:date>2007-03-28T15:52:19+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Jonathan Kowalski</dc:creator>
  <dc:subject>Marketing</dc:subject>
  <description>Excellente campagne d'affichage pour Wonderbra ! Il fallait y penser !</description>
  <content:encoded><![CDATA[<p>Excellente campagne d'affichage pour Wonderbra ! Il fallait y penser !</p> <p>On remarquera le jeune homme &agrave; qui la pub semble aussi beaucoup plaire...</p>
<object height="350" width="425"><br>
<param name="movie" value="http://www.youtube.com/v/v0jlRceGBOI">
<param name="wmode" value="transparent"><embed src="http://www.youtube.com/v/v0jlRceGBOI" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"></object><img src="http://feeds.feedburner.com/~r/JkconceptionLeBlog/~4/MfajkUcIWHc" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.jkconception.com/dotclear/index.php/2007/03/28/8-affichage-en-95c</feedburner:origLink></item>

</rdf:RDF>
