<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.martiusweb.net/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Martius Web</title>
  <link>http://www.martiusweb.net/</link>
  <atom:link href="http://www.martiusweb.net/feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Martius Web propose des articles, de la veille, et des cours sur le développement d'applications Web, principalement axés sur les langages XHTML/CSS/Javascript et PHP.</description>
  <language>fr</language>
  <pubDate>Tue, 17 Jan 2012 20:22:54 +0100</pubDate>
  <copyright>(cc) Sauf mention contraire, le contenu de ce site est sous licence Creative Commons BY-NC-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Zsh for the shell nerds</title>
    <link>http://www.martiusweb.net/post/Zsh-for-the-shell-nerds</link>
    <guid isPermaLink="false">urn:md5:b704cc735eea5d0675187e6335f33057</guid>
    <pubDate>Wed, 02 Mar 2011 00:37:00 +0100</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>Archlinux</category><category>bash</category><category>customization</category><category>Linux</category><category>productivité</category><category>shell</category><category>zsh</category>    
    <description>    &lt;p&gt;Il y a quelques semaines mes amis Paul et Nicolas m&amp;#8217;ont encouragé a essayé une alternative à Bash, le shell que nous utilisons généralement tous par défaut. Le changement s&amp;#8217;est pratiquement fait directement (je suis un gros utilisateur de la console).&lt;/p&gt;
&lt;p&gt;Changer de shell dans la console, c&amp;#8217;est comme changer d&amp;#8217;environnement de bureau (GNOME, Kde, etc)&amp;#160;: globalement c&amp;#8217;est la même chose, mais la manière dont ils sont présentés va varier. Alors Zsh, ça apporte quoi par rapport à Bash&amp;#160;?&lt;/p&gt;
&lt;p&gt;Concrètement, on peut le voir comme une surcouche&amp;#160;: la syntaxe des commandes ne change pas énormément. Les principales fonctionnalités qui vous feront basculer sont celles qui apparaissent en mode interactif&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;l&amp;#8217;auto-complétion/complétement (&lt;a hreflang=&quot;fr&quot; href=&quot;http://fr.wikipedia.org/wiki/Compl%C3%A8tement&quot;&gt;faites votre choix sur la terminologie&lt;/a&gt;) est vraiment puissant et paramétrable,&lt;/li&gt;
&lt;li&gt;la correction des commandes est magique, et évite de retaper de longues commandes pour une faute de frappe,&lt;/li&gt;
&lt;li&gt;une meilleure gestion de l&amp;#8217;historique des commandes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En plus, zsh supporte de nombreux plugins et supporte un mécanisme de thèmes, dont une impressionnante collection est maintenue sur un dépôt github dans un projet appelé &lt;a hreflang=&quot;en&quot; href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot;&gt;Oh-My-Zsh&lt;/a&gt;. Il suffit de cloner le dépôt en local, de suivre le Readme, et de choisir &lt;a hreflang=&quot;en&quot; href=&quot;https://github.com/robbyrussell/oh-my-zsh/wiki/Themes&quot;&gt;son thème&lt;/a&gt; pour qu&amp;#8217;en quelques minutes, Zsh soit adopté&amp;#160;!&lt;/p&gt;
&lt;p&gt;En plus, de nombreux thèmes supportent nativement le plug-in git qui offre la complétion/le complétement et affiche la branche de travail et si des données n&amp;#8217;ont pas été archivées dans un commit.&lt;/p&gt;
&lt;p&gt;En ce qui me concerne, j&amp;#8217;ai choisi le thème &amp;#8220;jreese&amp;#8221;. Si vous avez le loisir de commenter et de me recommander des plug-ins ou docs pour encore améliorer ma productivité, je suis preneur&amp;#160;!&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Zsh-for-the-shell-nerds#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Zsh-for-the-shell-nerds#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/204</wfw:commentRss>
      </item>
    
  <item>
    <title>Annuler un rm (retrouver des fichiers supprimés) sur une partition ext3 ou ext4</title>
    <link>http://www.martiusweb.net/post/undo-rm-undelete-ext</link>
    <guid isPermaLink="false">urn:md5:d59974d2f9fc8518b073a9a4225b2116</guid>
    <pubDate>Tue, 18 Jan 2011 15:40:00 +0100</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Histoires brèves</category>
            
    <description>    &lt;p&gt;Le billet court du jour devrait vous permettre d&amp;#8217;éviter de paniquer bêtement parce que votre doigt à glissé et que vous avez lancé la commande&lt;/p&gt;
&lt;pre&gt;rm -rf *&lt;/pre&gt;&lt;p&gt;plutôt que&amp;#160;:&lt;/p&gt;
&lt;pre&gt;rsync -rf *&lt;/pre&gt;&lt;p&gt;Si si, ça arrive. L&amp;#8217;outil qui va vous sauver la vie s&amp;#8217;appelle &lt;code&gt;extundelete&lt;/code&gt;. Il fonctionne très bien sur une partition ext3 ou ext4, cependant, pour l&amp;#8217;utiliser la partition ne doit pas être montée. Pour démonter &lt;code&gt;/home&lt;/code&gt;, il vaut mieux soit passer par un live-usb (comme ça &lt;code&gt;/home&lt;/code&gt; n&amp;#8217;est jamais monté) ou quitter votre session, lancer un terminal non graphique (Ctrl+Alt+F2 par exemple), vous logguer en root (c&amp;#8217;est plus génant sur ubuntu&amp;#8230;) et hop&amp;#160;:&lt;/p&gt;
&lt;pre&gt;# extundelete --restore-all /dev/sda3&lt;/pre&gt;
&lt;p&gt;D&amp;#8217;autres options comme &lt;code&gt;--restore-file&lt;/code&gt; et &lt;code&gt;--restore-files&lt;/code&gt; sont également bien pratiques.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/undo-rm-undelete-ext#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/undo-rm-undelete-ext#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/194</wfw:commentRss>
      </item>
    
  <item>
    <title>Set up a Teeworlds server on Debian Lenny (or any other Gnu/Linux)</title>
    <link>http://www.martiusweb.net/post/Set-up-a-Teeworlds-server-on-Linux</link>
    <guid isPermaLink="false">urn:md5:2baba2ead04a83299e8b8290d5424a15</guid>
    <pubDate>Tue, 30 Nov 2010 08:53:00 +0100</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>Linux</category><category>Online gaming</category><category>server</category><category>Teeworlds</category>    
    <description>&lt;p&gt;If you are reading this, I&amp;#8217;m pretty sure you already know Teeworlds, an Open source 2D game between Worms (I mean Wormux) and Doom with graphics from Kirby. Today I&amp;#8217;m trying to set up a server to host some sessions of this game.&lt;/p&gt;
&lt;p&gt;As you will see, this is quite straightforward, and does not require tremendous skills in GNU/Linux systems administration.&lt;/p&gt;
&lt;p&gt;Notice&amp;#160;: This content is available in English and I&amp;#8217;ll try to provide it in French as soon as possible. I decided to write it in English since I did not found a complete how-to on this -very important- topic.&lt;/p&gt;    &lt;p&gt;The very first step I recommend you to follow is&amp;#160;: Play the game with friends. Done&amp;#160;? Okay, let&amp;#8217;s go&amp;#160;!&lt;/p&gt;
&lt;p&gt;Packages for the game and the server are already provided, but they are too old for the current version of the game that you may have downloaded just now. So, forget the installation through aptitude (or apt-get if you like oldies). Thanks to the project maintainers, the whole project is available in a binary version. We grab this archive, extract it and rename the new folder&amp;#160;:&lt;/p&gt;
&lt;pre&gt;$ wget http://www.teeworlds.com/files/teeworlds-0.5.2-linux_x86.tar.gz&lt;br /&gt;$ tar -xzvf teeworlds-0.5.2-linux_x86.tar.gz&lt;br /&gt;$ mv teeworlds-0.5.2-linux_x86 teeworlds_bin&lt;/pre&gt;&lt;p&gt;You may need to find the latest version URL (available on the website).&lt;/p&gt;
&lt;p&gt;The very only requirement is to run &lt;code&gt;teeworlds_srv&lt;/code&gt; (you may start the server as a normal user), but you haven&amp;#8217;t yet configured the type of game experience you want to offer to players, and, if you close ssh connection or your terminal, the task will be killed and your server will be gone (too bad).&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s create configuration files teeworlds server is looking for, the software will look for them in &lt;code&gt;~/.teeworlds&lt;/code&gt;&amp;#160;:&lt;/p&gt;
&lt;pre&gt;cd ~&lt;br /&gt;mkdir .teeworlds &amp;amp;&amp;amp; cd .teeworlds&lt;br /&gt;touch settings.cfg&lt;br /&gt;touch autoexec.cfg&lt;/pre&gt;&lt;p&gt;Configuration options are described in the wiki of the project (&lt;a hreflang=&quot;en&quot; href=&quot;http://teeworlds.com/?page=docs&amp;amp;wiki=SettingUpAServer&quot;&gt;Setting up a Teeworlds server&lt;/a&gt;), we will just focus on some of them. I put all the following lines in &lt;code&gt;autoexec.cfg&lt;/code&gt;, but I don&amp;#8217;t really know if this is the right place to put that. Here is my configuration file&amp;#160;:&lt;/p&gt;
&lt;pre&gt;sv_name Bazinga! teh Server&lt;br /&gt;sv_bindaddr bazinga.martiusweb.net&lt;br /&gt;sv_motd Teh Bazinga Server with lolcatz n cheezburgerz&lt;br /&gt;sv_rcon_password my_admin_passwd&lt;br /&gt;password my_user_passwd&lt;br /&gt;sv_register 1&lt;br /&gt;&lt;br /&gt;sv_gametype dm&lt;br /&gt;sv_max_clients 12&lt;br /&gt;sv_spectator_slots 0&lt;br /&gt;sv_scorelimit 30&lt;br /&gt;sv_timelimit 10&lt;br /&gt;sv_maprotation dm1 dm2 dm3 dm4 dm5 dm6 dm7 dm8&lt;br /&gt;sv_map dm1&lt;br /&gt;sv_rounds_per_map 5&lt;br /&gt;sv_spamprotection 0&lt;br /&gt;sv_teamdamage 1&lt;br /&gt;sv_vote_kick 1&lt;br /&gt;sv_warmup 3&lt;/pre&gt;
&lt;p&gt;What does mean all these options&amp;#160;? Explanations&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;sv_name&lt;/code&gt; is my server name,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_bindaddr&lt;/code&gt; is used if you want to use a domain name instead of an IP to reach your server,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_motd&lt;/code&gt; is the message displayed when the user connects (and as a description of your server),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_rcon_password&lt;/code&gt; is the admin password you have to enter when you type F2 in game (to access the remote control console),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt; is the password users must provide to connect on your server (remove this line to create a public server),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_register&lt;/code&gt; means that my server will be displayed on the servers list of the game.&lt;/li&gt;
&lt;/ul&gt;
We configured the engine, now, have a look to game options&amp;#160;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;sv_gametype&lt;/code&gt; is the type of game, values are dm for death match, ctf (capture the flag), tdm (team death match),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_max_clients&lt;/code&gt; is the number of clients you want on your server,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_spectator_slots&lt;/code&gt; is the number of spectators allowed (a spectator is a client too),&lt;/li&gt;
&lt;li&gt;when &lt;code&gt;sv_scorelimit&lt;/code&gt; score is reached, the round is over,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_timelimit&lt;/code&gt; is the maximum duration of a round,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_map&lt;/code&gt; is the first map served,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_maprotation&lt;/code&gt; is a list of maps that your server allow to play on (space separated),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_rounds_per_map&lt;/code&gt; is&amp;#8230; well, number of rounds played on each map before to switch on new map,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_spamprotection&lt;/code&gt; don&amp;#8217;t disable it if your server is public,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_teamdamage&lt;/code&gt; means that during tdm, players from the same team can hit each others,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_vote_kick&lt;/code&gt; allows players to vote the kick of another player,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sv_warmup&lt;/code&gt; is the time (in seconds) at the beginning of a round when players have free time to prepare themselves,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;#8217;s all for configuration. If you want to add a map, add it to &lt;code&gt;sv_maprotation&lt;/code&gt; and copy the map file in &lt;code&gt;teewords/data/maps&lt;/code&gt; (you can find new ones on the forum). Most of these settings can be updated in live via the &lt;em&gt;rcon&lt;/em&gt; console (F2 during game).&lt;/p&gt;
&lt;p&gt;Now, we will set up the server to last long. This can be done easily with &lt;code&gt;nohup&lt;/code&gt;, which allows a process to live after the user is disconnected. &lt;code&gt;nohup&lt;/code&gt; will save the standard output in &lt;code&gt;nohup.log&lt;/code&gt;, in order to save our perfs and disk space, we will so deactivate output from the teeworlds server (in fact, redirect standard output to the &lt;code&gt;/dev/null&lt;/code&gt; black hole). The command will be&amp;#160;:&lt;/p&gt;
&lt;pre&gt;$ nohup teeworlds_srv &amp;gt; /dev/null&lt;/pre&gt;&lt;p&gt;That&amp;#8217;s all for today&amp;#160;!&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Set-up-a-Teeworlds-server-on-Linux#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Set-up-a-Teeworlds-server-on-Linux#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/187</wfw:commentRss>
      </item>
    
  <item>
    <title>Flash AS3 : Détecter les clics sur un élément caché par un autre</title>
    <link>http://www.martiusweb.net/post/Flash-AS3-D%C3%A9tecter-les-clics-sur-un-%C3%A9l%C3%A9ment-cach%C3%A9-par-un-autre</link>
    <guid isPermaLink="false">urn:md5:ee1b7dd114337e5db985c96754127c5e</guid>
    <pubDate>Wed, 10 Nov 2010 21:02:00 +0100</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Histoires brèves</category>
        <category>AS3</category><category>Flash</category><category>programmation événementielle</category><category>web design</category>    
    <description>    &lt;p&gt;Ceci est donc le petit billet du jour, fruit d&amp;#8217;un paquet d&amp;#8217;heures de recherche pour un résultat fort simple&amp;#160;!&lt;/p&gt;
&lt;p&gt;Dans le cadre d&amp;#8217;une application réalisée en Flash (Action Script 3) - oui, je sais - j&amp;#8217;ai une série d&amp;#8217;éléments qui sont masqués par une image transparente, faisant office de masque&amp;#160;: le calque supérieur prend tout l&amp;#8217;espace et capte donc les événements de la souris (notamment le clic).&lt;/p&gt;
&lt;p&gt;J&amp;#8217;ai cherché plusieurs solutions, j&amp;#8217;ai réfléchi à déterminer l&amp;#8217;objet cliqué d&amp;#8217;après les coordonnées du pointeur, ce qui me semblait complexe étant donné que la forme d&amp;#8217;un élément d&amp;#8217;un calque en dessous n&amp;#8217;est pas vraiment prévisible. Après avoir googlé le problème pendant un moment donc, je suis tombé sur une propriété de la classe (abstraite) &lt;code&gt;InteractiveObject&lt;/code&gt; fort utile&amp;#160;: &lt;a href=&quot;http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/display/InteractiveObject.html#mouseEnabled&quot; onclick=&quot;window.open(this.href); return false;&quot;&gt;&lt;code&gt;mouseEnabled&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cette propriété permet de désactiver toute interaction de la souris sur l&amp;#8217;objet concerné, et la bonne surprise fût que, tout naturellement, le clic souris prenait pour cible l&amp;#8217;élément du dessous.&lt;/p&gt;
&lt;p&gt;On récapitule donc rapidement&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;actionscript sourcecode actionscript&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; gfxElt:MyGraphicElement = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; MyGraphicElement&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; mask:MyMask = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; MyMask&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;addChild&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;gfxElement&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;addChild&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;mask&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;
&lt;p&gt;l&amp;#8217;objet graphique &lt;code&gt;mask&lt;/code&gt; recouvre l&amp;#8217;objet élément, il n&amp;#8217;est plus cliquable.&lt;/p&gt;
&lt;pre class=&quot;actionscript sourcecode actionscript&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;mask.&lt;span style=&quot;color: #006600;&quot;&gt;mouseEnabled&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;
&lt;p&gt;Maintenant si&amp;#160;!&lt;/p&gt;
&lt;p&gt;Je suis bien conscient que cette découverte n&amp;#8217;est pas génialissime en soi, mais peut-être que ce billet épargnera à l&amp;#8217;un d&amp;#8217;entre vous de perdre du temps et d&amp;#8217;imaginer une solution complétement farfelue proche d&amp;#8217;une ré-invention de la roue.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Flash-AS3-D%C3%A9tecter-les-clics-sur-un-%C3%A9l%C3%A9ment-cach%C3%A9-par-un-autre#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Flash-AS3-D%C3%A9tecter-les-clics-sur-un-%C3%A9l%C3%A9ment-cach%C3%A9-par-un-autre#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/185</wfw:commentRss>
      </item>
    
  <item>
    <title>Paris Web : Conclusion !</title>
    <link>http://www.martiusweb.net/post/Paris-Web-Conclusion</link>
    <guid isPermaLink="false">urn:md5:0f4b6ac981f2933f7ad2036b9fa7f6af</guid>
    <pubDate>Wed, 20 Oct 2010 18:44:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>IBM</category><category>Merci !</category><category>ParisWeb</category>    
    <description>&lt;p&gt;Voilà, j&amp;#8217;ai publié tous mes comptes rendus sur &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.paris-web.fr/&quot;&gt;Paris Web&lt;/a&gt;, il est temps d&amp;#8217;en faire un petit pour tout résumer. Je remercie à nouveau &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.mammouthland.net/&quot;&gt;Pascale&lt;/a&gt; et &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.nota-bene.org/&quot;&gt;Stéphane&lt;/a&gt;, grâce à qui j&amp;#8217;ai pu accéder à cet événement malgré ma situation d&amp;#8217;étudiant.&lt;/p&gt;
&lt;p&gt;Paris Web, c&amp;#8217;était deux jours de conférences à l&amp;#8217;IBM Forum à Bois-Colombes (au nord de Paris), suivie par 450 personnes (et une centaine d&amp;#8217;autres en direct via le net) et une journée d&amp;#8217;ateliers à Telecom-Paristech (Paris XIIIe) qui a réunit 250 personnes.&lt;/p&gt;
&lt;p&gt;Je remercie également mon amie &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.lesbridgets.com/&quot;&gt;Mélanie&lt;/a&gt; pour m&amp;#8217;avoir hébergé pendant ces quelques jours.&lt;/p&gt;    &lt;h3&gt;Petit contexte&lt;/h3&gt;
&lt;p&gt;Je suis arrivé à Paris le mercredi soir&amp;#160;: je suis sorti de cours et j&amp;#8217;ai sauté dans mon TGV. Malgré les grèves, je n&amp;#8217;ai eu aucun problème dans les transports (ce qui n&amp;#8217;a pas été le cas de tout le monde). Je suis arrivé à Bois-Colombes le jeudi matin, le campus IBM est vraiment impressionnant, très chic et constituait un excellent cadre pour l&amp;#8217;événement. L&amp;#8217;accueil était très bon, j&amp;#8217;ai mis un peu de temps à retrouver &lt;a hreflang=&quot;fr&quot; href=&quot;http://twitter.com/fetard&quot;&gt;fetard&lt;/a&gt;, et nous nous sommes dirigés vers les amphithéâtres.&lt;/p&gt;
&lt;p&gt;Je ne vais pas (re)commenter les conférences, d&amp;#8217;ailleurs &lt;a hreflang=&quot;en&quot; href=&quot;http://ovineyards.com/english/parisweb-2010-my-tiny-brains-effort-to-summarize/&quot;&gt;Ryan l&amp;#8217;a très bien fait&lt;/a&gt;&amp;#160;! Encore une fois, j&amp;#8217;ai été bluffé par le cadre (le grand amphi de l&amp;#8217;IBM Forum donne l&amp;#8217;impression de rentrer dans une sorte de vaisseau spatial du futur Wahou&amp;#160;!) et les facilités d&amp;#8217;accès au contenu mises en place (traduction en langage des signes des conférences, sous-titrage et traduction en français pour ceux qui le souhaitaient) étaient parfaites.&lt;/p&gt;
&lt;h3&gt;Ce que j&amp;#8217;ai adoré&lt;/h3&gt;
&lt;p&gt;Ce que j&amp;#8217;ai adoré dans Paris Web, c&amp;#8217;est que tout le monde est accessible&amp;#160;: les orateurs, les organisateurs comme les participants sont tous dans cette ambiance propre au web. un peu comme si on se retrouvait sur un réseau social IRL. D&amp;#8217;ailleurs, le premier réflexe de chacun d&amp;#8217;entre nous à été de noter sur nos badges notre pseudonyme sur Twitter, histoire de mettre un visage sur un &amp;#8220;following&amp;#8221;.&lt;/p&gt;
&lt;p&gt;J&amp;#8217;ai (presque) toujours aimé le contenu&amp;#160;: les sujets étaient intéressants et variés pour la plupart, et présentés par des orateurs qui étaient de très bons à excellents&amp;#160;! J&amp;#8217;ai un peu de mal à décrire ce que j&amp;#8217;ai vécu là bas. C&amp;#8217;est un peu comme emmener un enfant à Disneyland, et la conférence de Paul Rouget prenait la place du StarTour(c)&amp;#160;!&lt;/p&gt;
&lt;p&gt;Les ateliers était beaucoup plus intimistes, ce qui permettait d&amp;#8217;être actif (comme dans l&amp;#8217;atelier de Pascal et Raphaël, qui proposaient des phases de mise en pratique), d&amp;#8217;échanger des points de vue ou des stratégies adoptés (atelier &amp;#8220;comment convaincre un client de la qualité de sa prestation&amp;#8221;), ou même de troller de bon matin (oui je regrette un peu de m&amp;#8217;être &amp;#8220;enflammé&amp;#8221; pendant l&amp;#8217;atelier sur le web temps-réel - la fatigue et &lt;em&gt;toussa&lt;/em&gt;). &lt;/p&gt;
&lt;p&gt;En bref, c&amp;#8217;était un moment presque magique, où je me retenais de faire ma groupie devant un paquet de gens que je lis depuis quelques années.&lt;/p&gt;
&lt;p&gt;Encore merci Pascale et Stéphane&amp;#160;!&lt;/p&gt;
&lt;h3&gt;Ce que j&amp;#8217;ai un peu moins aimé&lt;/h3&gt;
&lt;p&gt;J&amp;#8217;ai été un peu surpris parfois par l&amp;#8217;attitude prise par certains quand ils apprenaient que je suis étudiant. J&amp;#8217;imagine qu&amp;#8217;il y a un certain décalage entre mon vécu, mon attitude ou même mon expression par rapport à d&amp;#8217;autres&amp;#160;; mais c&amp;#8217;était parfois un peu vexant. Tant pis pour eux&amp;#160;!&lt;/p&gt;
&lt;p&gt;Au sujet d&amp;#8217;HTML5&amp;#160;: je n&amp;#8217;ai pris des notes que sur deux conférences, mais il y en avait un peu plus. En fait, il y avait quand même un peu de redite d&amp;#8217;une conférence à l&amp;#8217;autre, ou même, des informations de bases déjà lues par la plupart d&amp;#8217;entre nous. &lt;/p&gt;
&lt;p&gt;Pour finir, je crois que nous étions tous vraiment affamés, et il n&amp;#8217;était pas toujours facile d&amp;#8217;atteindre le buffet avant qu&amp;#8217;il soit vide&amp;#160;!&lt;/p&gt;
&lt;p&gt;Que des histoires terribles en somme.&lt;/p&gt;
&lt;h3&gt;&amp;#8220;Finish him&amp;#8221;&lt;/h3&gt;
&lt;p&gt;Titre en référence à la fin de la conférence de Chris Heilmann (qui m&amp;#8217;a aussi vraiment bluffée). J&amp;#8217;ai adoré Paris Web, c&amp;#8217;est peut-être un peu l&amp;#8217;effet jeunesse (et ma première fois dans un événement de cette envergure) qui maintient les étoiles que j&amp;#8217;ai dans les yeux depuis presque une semaine.&lt;/p&gt;
&lt;p&gt;Les points utra-positifs (et personnels)&amp;nbsp;&amp;#160;:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;les nombreuses rencontres&lt;/li&gt;
&lt;li&gt;la confirmation de mon projet professionnel, de mon enthousiasme et de ma motivation pour le web&amp;#160;!&lt;/li&gt;
&lt;li&gt;les étoiles (toujours) dans mes yeux et la double page de dessins et dédicaces sur le livre &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.eyrolles.com/Informatique/Livre/html-5-pour-les-web-designers-9782212128611&quot;&gt;Html 5 pour les Webdesigners&lt;/a&gt; que j&amp;#8217;ai gagné à la fin de la conférence de Chris.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il ne me reste plus qu&amp;#8217;à prendre confiance en mon expression en anglais pour l&amp;#8217;année prochaine&amp;#160;!&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Paris-Web-Conclusion#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Paris-Web-Conclusion#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/182</wfw:commentRss>
      </item>
    
  <item>
    <title>(Paris Web !) #8 Upgrading the frontend, encore un peu d'HTML5</title>
    <link>http://www.martiusweb.net/post/Paris-Web-8-Upgrading-the-frontend-HTML5</link>
    <guid isPermaLink="false">urn:md5:cd42fb99638e0ec819caa797aabb5b48</guid>
    <pubDate>Wed, 20 Oct 2010 16:36:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>accessibilité</category><category>formulaire</category><category>HTML 5</category><category>innovation</category><category>intégrateur</category><category>Javascript</category><category>ParisWeb</category><category>W3C</category>    
    <description>&lt;p&gt;Cette conférence était dirigée par &lt;a hreflang=&quot;en&quot; href=&quot;http://www.mezzoblue.com/&quot;&gt;Dave Shea&lt;/a&gt;,que l&amp;#8217;on connait tous pour être le créateur de Css Zen Garden (même si il nous rappelle tous qu&amp;#8217;il n&amp;#8217;a pas fait que ça&amp;#160;!). La conférence était en anglais.&lt;/p&gt;
&lt;p&gt;C&amp;#8217;est la dernière conférence pour laquelle j&amp;#8217;ai pris des notes suffisamment complètes pour les résumer sur le blog. Je n&amp;#8217;ai pas trop pris de notes sur les conférences orientées graphisme, car beaucoup en parleront mieux que moi.&lt;/p&gt;    &lt;h3&gt;Le changement&lt;/h3&gt;
&lt;p&gt;Il y a plein de nouveautés cools en HTML5 et CSS3, Dave en a encore découvert hier. Le problème c&amp;#8217;est de toujours de
trouver le temps pour apprendre et expérimenter. La solution de Dave c&amp;#8217;est de développer des projets personnels, de participer
à des Hacks nights ou autres compétition. Un autre moyen intéressant, c&amp;#8217;est de bidouiller les pages secondaires de certains sites,
comme la page 404 que Dailymotion.&lt;/p&gt;
&lt;p&gt;Dave présente quelques exemples sympathiques qu&amp;#8217;on voit passer en ce moment sur le web. Bon, ces démos sont sympathiques, mais on
est loin des contraintes du &amp;#8220;monde réel&amp;#8221;. On peut se poser la question des limites actuelles à utiliser ces technologies&amp;#160;: comme
d&amp;#8217;habitude, les navigateurs anciens posent problème, mais on compte aussi sur les outils avec moins de puissance (netbooks) ou
moins de bande passante (mobiles).&lt;/p&gt;
&lt;p&gt;L&amp;#8217;une des questions les plus pertinentes, c&amp;#8217;est probablement&amp;#160;: &amp;#8220;Est-ce que ça marchera encore plus tard&amp;#160;?&amp;#8221;. En ce moment ça
bouge vraiment vite, et c&amp;#8217;est pour ça qu&amp;#8217;on essaie de faire du &lt;em lang=&quot;en&quot;&gt;Progressive Enhencement&lt;/em&gt;, qui consiste à faire
une base qui fonctionne sur des outils limités, et on ajoute des fonctionnalités pour les navigateurs plus récents et appareils plus puissants sans tout casser.&lt;/p&gt;
&lt;p&gt;Bon, à côté, le W3C dit que HTML5 n&amp;#8217;est pas prêt pour la production, mais les navigateurs poussent à l&amp;#8217;utilisation de ces nouvelles
technos, donc selon l&amp;#8217;orateur, on peut rester en désaccord avec le W3C sur ce point. Il faut quand même fixer quelques règles.&lt;/p&gt;
&lt;h3&gt;Quelques règles&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Analysons le site de la FIFA pour la dernière coupe du monde. On regarde quelques éléments dans la page. Ils auraient pu
les faire avec CSS3, mais on aurait remarqué rapidement le problème sur les vieux navigateurs. Sur le site de Vélib, au contraire,
les coins arrondis qui ne passent pas choquent beaucoup moins&amp;#160;: ils auraient pu utiliser CSS3 (border-radius).&lt;/p&gt;
&lt;h3&gt;L&amp;#8217;audience&lt;/h3&gt;
&lt;p&gt;Il faut regarder qui visite votre site. C&amp;#8217;est ce qui doit guider la stratégie technologique. On peut trouver de nombreuses ressources
sur le web qui listent très bien les différences d&amp;#8217;implémentation. On peut donc regarder les fallbacks pour les autres.&lt;/p&gt;
&lt;p&gt;Intéressons nous un peu au propriétés CSS3 et aux &lt;em lang=&quot;en&quot;&gt;vendor prefixes&lt;/em&gt;. Ils permettent facilement de faire du
&lt;em lang=&quot;en&quot;&gt;progressive enhencement&lt;/em&gt;. Il faut par contre faire attention, puisque ça signifie que la spécification risque
encore de poser problème.&lt;/p&gt;
&lt;p&gt;Voici Modernizr, c&amp;#8217;est un script Javascript qui facilite le support des vieux navigateurs et propose des outils de détection des
fonctionnalités supportées par les navigateurs.&lt;/p&gt;
&lt;h3&gt;Attention&amp;#160;!&lt;/h3&gt;
&lt;p&gt;Soyons quand même vigilent&amp;#160;: n&amp;#8217;en faisons pas trop comme mettre des ombres sur tout le texte d&amp;#8217;une page, dessiner des icônes en
pur CSS (à quoi ça sert&amp;#160;?). Les performances doivent être considérées car les ressources des systèmes varient beaucoup. L&amp;#8217;utilisation de CSS3 peut toujours
poser problème quand on utiliser plein de fonctionnalités cool mais qui vont consommer beaucoup de CPU.&lt;/p&gt;
&lt;p&gt;Le threading a été poussé par Chrome. Aujourd&amp;#8217;hui les web workers (dans la spécifications) sont ici pour normaliser ça,
et ça bouge encore beaucoup.&lt;/p&gt;
&lt;h3&gt;Que peut-on utiliser maintenant&amp;#160;?&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;Les PNG transparents&amp;#160;: mais tout le monde le fait déjà&amp;#160;!&lt;/li&gt;
&lt;li&gt;Dieu merci, l&amp;#8217;inclusion de fontes est aussi arrivé et fonctionne.&lt;/li&gt;
&lt;li&gt;Le Doctype HTML5&amp;#160;: c&amp;#8217;est facile à retenir et utiliser, en plus, ça ne change presque rien aux navigateurs, même IE6.&lt;/li&gt;
&lt;li&gt;Les balises sémantiques (&lt;code&gt;header&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, etc)&amp;#160;: on peut les utiliser, mais IE ne les gère pas, il faut
ajouter un petit script. Et la version actuelle de firefox (3.7) n&amp;#8217;applique pas encore la règle &lt;code&gt;display:block;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On peut aussi utiliser l&amp;#8217;ajout de nouveaux attributs. Les navigateurs sont habitués à des horreurs, donc ceux qui ne le supportent pas dans
l&amp;#8217;optique de respecter HTML5 les géreront quand même.&lt;/li&gt;
&lt;li&gt;Les nouveaux champs de formulaires&amp;#160;: vous pouvez les utilisez, mais le fallback peut faire mal car l&amp;#8217;expérience utilisateur s&amp;#8217;en retrouve
franchement réduite.&lt;/li&gt;
&lt;li&gt;les ombres ou les border-radius en CSS ne posent jamais trop de problèmes, puisque ça ne change pas grand chose pour l&amp;#8217;utilisateur. Ça sera
juste un peu moins beau.&lt;/li&gt;
&lt;li&gt;RGBA est un nouveau schéma de couleur CSS3 qui supporte le canal alpha. Le paramètre alpha, placé en dernier, sera généralement ignoré.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les suivants posent un peu plus de problèmes&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manipuler l&amp;#8217;opacité marche aussi souvent bien et ne pose pas trop de problèmes.&lt;/li&gt;
&lt;li&gt;Canvas est là pour bidouiller des images à pixels, SVG est prévu pour les images vectorielles. C&amp;#8217;est quand même tôt pour les
utiliser, accessoirement Google propose un outil pour implémenter leur support dans IE.&lt;/li&gt;
&lt;li&gt;Les transitions et transformations risque quand même de poser des soucis puisqu&amp;#8217;on ne peut pas trop faire de fallback.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il est encore vraiment trop tôt pour utiliser des outils comme les Webworkers, WebGL, etc.&lt;/p&gt;
&lt;h3&gt;Un petit troll&amp;#160;? On en est où avec les graphistes&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Hier, il y a eu un débat passionné sur &amp;#8220;Photoshop&amp;#160;? Fireworks&amp;#160;? Css&amp;#160;?&amp;#8221;. Les graphistes n&amp;#8217;étaient
pas trop branché CSS. L&amp;#8217;orateur pense qu&amp;#8217;il est important d&amp;#8217;utiliser les outils de design actuels pour
se faire une bonne idée. Mais c&amp;#8217;est probablement intéressant d&amp;#8217;essayer aussi un peu avec les CSS. Le
souci principal, c&amp;#8217;est qu&amp;#8217;il est difficile de se représenter ce qui se passe une fois qu&amp;#8217;on passe dans
le navigateur. À commencer par les possibilités offertes par Photoshop sur les fontes, qui ne peuvent être
reproduites en intégralité avec CSS.&lt;/p&gt;
&lt;h3&gt;Quoi d&amp;#8217;autre&amp;#160;?&lt;/h3&gt;
&lt;p&gt;L&amp;#8217;orateur voulait faire une animation pour un client, et plutôt que le faire en Flash, il s&amp;#8217;est orienté
vers Javascript (c&amp;#8217;est trop tôt pour CSS3 et Canvas étant donné le public visé). Par contre, il a découvert
que les PNGs transparents étaient assez mal supportés sur IE7 et 8 quand ils étaient animés. Il a fallu trouver
un hack de hack&amp;#8230; Aïe.&lt;/p&gt;
&lt;p&gt;L&amp;#8217;orateur a fait un petit projet (PaintbrushJS), qui utilise de nombreuses nouveautés de HTML5 et CSS3. Il
a essayé d&amp;#8217;implémenter quelques effets sur des photos pour voir ce qui était fonctionnel ou pas. Il a appris
beaucoup de détails grâce à ce projet. En bref, faire un projet personnel qui pousse un peu à faire de la veille
technologique.&lt;/p&gt;
&lt;h3&gt;Questions et réponses&lt;/h3&gt;
&lt;h4&gt;On fait quoi avec les utilisateurs sans JS&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: Ah ah, en fait je ne m&amp;#8217;en occupe pas trop. Je sais qu&amp;#8217;il y a controverse, mais je trouve aujourd&amp;#8217;hui que le web
est inutilisable pour quelqu&amp;#8217;un qui désactive JS.&lt;/p&gt;
&lt;p&gt;Un intervenant précise que les chiffres de Yahoo! annoncent entre 1 et 2% d&amp;#8217;utilisateurs sans Javascript.&lt;/p&gt;
&lt;h4&gt;Je vais poser un gros troll&amp;#160;: je ne comprends pas trop pourquoi les orateurs anglophones sont si fascinés par webkit.
Êtes vous tous fan de Webkit parce que vous utilisez tous des Macs&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: Euh, non, enfin, peut-être un peu. Bon, si. Mais Webkit est quand même innovant (même si ils perdent leur avance)
et on se bouge toujours vers les fonctionnalités qui permettent de faire des trucs sexys.&lt;/p&gt;
&lt;h4&gt;&lt;em lang=&quot;en&quot;&gt;Progressive Enhencement&lt;/em&gt; ou &lt;em lang=&quot;en&quot;&gt;Graceful Degradation&lt;/em&gt;&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: Pour moi il n&amp;#8217;y a pas vraiment de débat&amp;#160;: ce sont des deux faces d&amp;#8217;une même pièce. Au final, vous obtenez les mêmes
résultats.&lt;/p&gt;
&lt;p&gt;Le trolleur sur webkit gagne le bouquin.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Paris-Web-8-Upgrading-the-frontend-HTML5#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Paris-Web-8-Upgrading-the-frontend-HTML5#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/181</wfw:commentRss>
      </item>
    
  <item>
    <title>(Paris Web !) #7 HTML5 maintenant... et même avec IE 6</title>
    <link>http://www.martiusweb.net/post/Paris-Web-7-HTML5-maintenant-avec-IE6</link>
    <guid isPermaLink="false">urn:md5:ac86e34f8dbecbdc649ca855a298f10f</guid>
    <pubDate>Wed, 20 Oct 2010 16:30:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>accessibilité</category><category>développeur</category><category>formulaire</category><category>hack</category><category>HTML 5</category><category>innovation</category><category>intégrateur</category><category>ParisWeb</category><category>SVG</category><category>W3C</category><category>xhtml</category>    
    <description>&lt;p&gt;Conférence dirigée par &lt;a hreflang=&quot;fr&quot; href=&quot;http://braincracking.org/&quot;&gt;Jean Pierre Vincent&lt;/a&gt;, que je lis avec assiduité dans les transports en commun ou pendant les pauses déjeuner.&lt;/p&gt;
&lt;p&gt;Cette conférence parle comme beaucoup d&amp;#8217;HTML5 et des nouvelles fonctionnalités qui arrivent avec. Jean-Pierre Vincent en utilise quelques unes, et cherche (ou réalise) des fallbacks utilisés en production.&lt;/p&gt;
&lt;p&gt;Les &lt;a hreflang=&quot;fr&quot; href=&quot;http://braincracking.org/2010/10/15/conference-paris-web-html5-cest-maintenant-ie6-inclus/&quot;&gt;slides de la présentation sont disponibles sur le site de l&amp;#8217;orateur&lt;/a&gt;.&lt;/p&gt;    &lt;h3&gt;Pour maintenant ou pour plus tard&amp;#160;?&lt;/h3&gt;
&lt;p&gt;HTML 5 est prévu pour 2022&amp;#8230; CSS 2.1 est toujours en RC, la selector API 2 est toujours en &amp;#8220;Draft&amp;#8221;,
mais d&amp;#8217;un autre côté, HTML4 et CSS qui sont finalisés depuis (respectivement) 1999 et 1996 et ne sont
toujours pas intégralement implémentés.&lt;/p&gt;
&lt;p&gt;Les développeurs s&amp;#8217;intéressent à la facilité d&amp;#8217;accès, la stabilité et à leurs besoins. Les recommandations
sont secondaires.&lt;/p&gt;
&lt;p&gt;Prenons l&amp;#8217;exemple du &lt;em&gt;web storage&lt;/em&gt;. Il existe 7 implémentations différentes et qui existent depuis IE6-7&amp;#160;:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;UserData (IE)&lt;/li&gt;
&lt;li&gt;GlobalStorage (Firefox 2)&lt;/li&gt;
&lt;li&gt;Flash Shared Objects (Flash)&lt;/li&gt;
&lt;li&gt;Hack window.name&lt;/li&gt;
&lt;li&gt;Web storage (3 implémentations)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Heureusement que les bibliothèques sont là&amp;#160;! jQuery jStorage (&lt;a href=&quot;http://jstorage.info&quot;&gt;jstorage.info&lt;/a&gt;),
YUI3 (&lt;a href=&quot;http://bit.ly/lib_store1&quot;&gt;bit.ly/lib_store1&lt;/a&gt;), etc&amp;#160;:
&lt;em&gt;Web Storage&lt;/em&gt;, avec une bibliothèque, devient OK pour la production.&lt;/p&gt;
&lt;h3&gt;Quel HTML5&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Il y a de nombreuses nouveautés officielles et d&amp;#8217;autres technologies périphériques (comme &lt;em&gt;svg&lt;/em&gt;) qu&amp;#8217;on
place sous ce terme. Il existe de nombreuses implémentations pour ces outils. On retient&amp;#160;: Spécification +
Hacks = Production&amp;#160;!&lt;/p&gt;
&lt;p&gt;Rappelons les bases&amp;#160;: nouveau doctype plus light, nouvelles balises plus sémantiques (&lt;code&gt;header&lt;/code&gt;, &lt;code&gt;article&lt;/code&gt;). D&amp;#8217;autres
plus originales&amp;#160;: &lt;code&gt;&amp;lt;meter value=&quot;25&quot; max=&quot;100&quot; /&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;progress&amp;gt;&lt;/code&gt;. Ces nouvelles
balises sont standard, plus faciles à utiliser et comprendre, et donc, la page est plus maintenable et plus accessible
(y compris pour les autres outils), et le bénéfice pour la SEO devrait se faire sentir dans les temps à venir.&lt;/p&gt;
&lt;p&gt;Ces nouvelles balises sont utilisables en production. Cependant, il est nécessaire d&amp;#8217;utiliser des bibliothèques
pour IE6-8 (par exemple &lt;a href=&quot;http://bit.ly/HTML5_shiv&quot;&gt;bit.ly/HTML5_shiv&lt;/a&gt;). On perd les utilisateurs d&amp;#8217;IE sans
javascript.&lt;/p&gt;
&lt;h3&gt;Les microdonnées (&lt;em lang=&quot;en&quot;&gt;Microdata&lt;/em&gt;)&lt;/h3&gt;
&lt;p&gt;Il est possible de décrire des balises sémantiques avec un vocabulaire personnalisé. Les microdonnées sont en
concurrence avec les microformats et RDFa qu&amp;#8217;on connait depuis plusieurs années. Cette sémantique standardisée permet
d&amp;#8217;ajouter des données qui seront facilement exploitables.&lt;/p&gt;
&lt;p&gt;Les robots d&amp;#8217;indexation sont amateurs de microdatas (Google les exploite déjà).&lt;/p&gt;
&lt;h3&gt;Les formulaires&lt;/h3&gt;
&lt;p&gt;La spécification prévoit de nouveaux types de formulaires (&lt;code&gt;&amp;lt;input type=&quot;email, color, url ...&quot; /&amp;gt;&lt;/code&gt;), c&amp;#8217;est
particulièrement utile pour les navigateurs mobiles qui peuvent adapter la saisie. Quand un nouveau champ de formulaire n&amp;#8217;est pas supporté, les navigateurs utiliseront un champ textuel classique. Le grand
débat sur ces fonctionalités concernent plus les limites du stylage visuel.&lt;/p&gt;
&lt;h3&gt;On passe aux API&lt;/h3&gt;
&lt;p&gt;En fait, les spécifications ne présentent pas toujours des API qui n&amp;#8217;ont jamais étaient vues, c&amp;#8217;est plus une harmonisation
de ce qui est déjà utilisé d&amp;#8217;une autre manière.&lt;/p&gt;
&lt;p&gt;Comment on faisait&amp;#160;?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Géolocalisation&amp;#160;: Adresse IP,&lt;/li&gt;
&lt;li&gt;Drag&amp;amp;Drop&amp;#160;: Applet Java (les specs reprennent l&amp;#8217;implémentation proposée par IE6)&lt;/li&gt;
&lt;li&gt;Forms 2&amp;#160;: Js&lt;/li&gt;
&lt;li&gt;video&amp;#160;: Flash&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J.-P. Vincent présente un exemple de page, présentée sous IE6&amp;#160;en HTML5, et dont les fonctionnalités sont supportées par du Javascript.
Le formulaire est sensiblement identique sous Chrome, mais qui ne fait pas appel à Javascript. On gagne franchement du temps en décrivant en HTML5 les comportements qu&amp;#8217;on devait produire en Javascript. Les formulaires avec Forms 2 peuvent êtres utilisés sur des nouveaux formulaires ou pour compléter des formulaires
existants. Le comportement par défaut des vieux navigateurs est d&amp;#8217;afficher un champ texte classique.&lt;/p&gt;
&lt;h3&gt;Géolocalisation&lt;/h3&gt;
&lt;p&gt;La nouvelle géolocalisation n&amp;#8217;utilise plus tout le temps l&amp;#8217;IP&amp;#160;: par exemple, les google cars on enregistré les SSID des réseaux Wifi accessibles
et les ont géolocalisés. On gagne en précision (mais ça fait un peu peur&amp;#8230;).&lt;/p&gt;
&lt;p&gt;Chris Heilmann nous propose aussi &lt;a href=&quot;http://bit.ly/lib_geo&quot;&gt;bit.ly/lib_geo&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Fallbacks, fallbacks, fallbacks&amp;#160;!&lt;/h3&gt;
&lt;p&gt;De nombreuses bibliothèques couvrent le fossé entre vieux navigateurs et nouveaux standards&amp;#160;: Raphaël JS. La plupart des liens présentés dans
cette conférence peuvent être retrouvés sur le site internet de l&amp;#8217;auteur. Pour le Drag&amp;amp;Drop, malgré le fallback un peu bancal en Java, il a
été franchement utilisé (c&amp;#8217;est donc une fonctionnalité qu’apprécient les utilisateurs).&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Les nouveaux standards apportent des outils pratiques pour les utilisateurs, et sont utilisables en production grâce aux bibliothèques. On
peut peut-être faire une exception pour la vidéo quand les besoins de personnalisation sont un peu avancés.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Paris-Web-7-HTML5-maintenant-avec-IE6#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Paris-Web-7-HTML5-maintenant-avec-IE6#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/180</wfw:commentRss>
      </item>
    
  <item>
    <title>(Paris Web !) #6 Innover de 9 à 5 (sur les heures de bureau)</title>
    <link>http://www.martiusweb.net/post/%28Paris-Web-%21%29-6-Innover-de-9-a-5</link>
    <guid isPermaLink="false">urn:md5:4719c9f226993c656a27c4b2e5072e46</guid>
    <pubDate>Tue, 19 Oct 2010 13:46:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>entreprise</category><category>hack</category><category>innovation</category><category>ParisWeb</category>    
    <description>&lt;p&gt;&amp;nbsp;La conférence est dirigée par Olivier Thereaux. Il présente ses observations sur le concept d&amp;#8217;innovation dans l&amp;#8217;entreprise. Cette conférence changeait des autres puisqu&amp;#8217;on a pas vraiment parlé de web. Par contre, c&amp;#8217;était en fin de journée, je commençais à avoir du mal à prendre des notes.&lt;/p&gt;    &lt;h3&gt;L&amp;#8217;innovation, c&amp;#8217;est quoi&amp;#160;?&lt;/h3&gt;
&lt;p&gt;On va donner un cadre à la notion d&amp;#8217;innovation. Définition basique&amp;#160;: &amp;#8220;créer de nouvelles solutions au problèmes&amp;#8221;.
Si on ne cherche pas une solution, ici, on ne parle pas d&amp;#8217;innovation. Une innovation peut être radicale (elle change
nos vies) ou incrémentale (par exemple, amélioration de processus).&lt;/p&gt;
&lt;p&gt;L&amp;#8217;innovation plus radicale change &amp;#8220;tout&amp;#8221;. Prenons un produit&amp;#160;: la bougie. On analyse pour trouver le besoin. On
créé un nouveau système. L&amp;#8217;ampoule a conduit au développement du réseau électrique. L&amp;#8217;innovation devient radicale. C&amp;#8217;est l&amp;#8217;histoire
qui le montre.&lt;/p&gt;
&lt;h3&gt;Le cadre de l&amp;#8217;innovation&lt;/h3&gt;
&lt;p&gt;Aujourd&amp;#8217;hui on voit typiquement la R&amp;amp;D comme centre d&amp;#8217;innovation. La R&amp;amp;D c&amp;#8217;est souvent un petite partie des cerveaux de l&amp;#8217;entreprise.
Il faut donc impliquer tout le monde, la R&amp;amp;D peut tester les idées de tout le monde. Typiquement, ce modèle
d&amp;#8217;innovation partagée est employé par 3M et Google. Ces entreprises on laissé respectivement 15 et 20% du temps des
employés à faire leurs propres expérimentations. Google impose que 10% de ce temps soit utilisé en dehors du cadre de
l&amp;#8217;entreprise pour élargir l&amp;#8217;esprit et ne pas rester limité à la culture d&amp;#8217;entreprise.&lt;/p&gt;
&lt;p&gt;L&amp;#8217;entreprise dans laquelle l&amp;#8217;orateur travaille a développé les &lt;em&gt;jardins de l&amp;#8217;innovation&lt;/em&gt;. Résultat&amp;#160;: plein
d&amp;#8217;idées, aucune réalisation. Il faut se méfier du mythe de &lt;em&gt;la grande idée&lt;/em&gt;. Il faut arrêter de penser qu&amp;#8217;on
veut garder secrète notre &amp;#8220;très bonne idée qu&amp;#8217;on risque de se faire voler si on en parle&amp;#8221;. Quelqu&amp;#8217;un aura peut-être
l&amp;#8217;idée en même temps et lui, il va la réaliser.&lt;/p&gt;
&lt;h3&gt;Culture&amp;#160;: la culture du &lt;em&gt;hacker&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Cette culture, qu&amp;#8217;on un peu tous puisqu&amp;#8217;on fait de l&amp;#8217;informatique, peut servir à hacker l&amp;#8217;entreprise.&lt;/p&gt;
&lt;p&gt;Hacker l&amp;#8217;espace de l&amp;#8217;entreprise&amp;#160;: l&amp;#8217;open-space, les tableaux (partout&amp;#160;!) et la machine à café sont d&amp;#8217;excellents
moyens d&amp;#8217;hacker l&amp;#8217;espace. Mais c&amp;#8217;est rarement une difficulté.&lt;/p&gt;
&lt;p&gt;Par contre, hacker un processus est plus compliqué&amp;#160;: il faut du temps et de l&amp;#8217;argent. Le retour court-terme
d&amp;#8217;une innovation dans le processus est difficile à estimer, donc le gestionnaire est souvent frileux à son implémentation. On peut quand même
trouver des petits moments pour étudier et bidouiller&amp;#160;: on avance par &lt;em&gt;petits pas&lt;/em&gt;. Mais le projet reste petit,
le risque reste gérable, et on est en mesure de gérer les attentes (annoncer que le projet risque de ne pas
marcher).&lt;/p&gt;
&lt;p&gt;Le vrai avantage compétitif qu&amp;#8217;on peut apporter, c&amp;#8217;est l&amp;#8217;apprentissage. Il faut apprendre à apprendre.
On fait bouger le cadre de travail grâce à des moments qui permettent d&amp;#8217;échanger et d&amp;#8217;apprendre. Il faut
aussi apprendre à échouer, car innover entraine souvent des échecs&amp;#160;: &lt;em&gt;Mistakes will be made&lt;/em&gt; (chairman de 3M).&lt;/p&gt;
&lt;p&gt;Une bonne façon d&amp;#8217;apprendre à échouer et à persévérer, c&amp;#8217;est de jouer&amp;#160;: il faut rendre le travail fun. Ceci amène au dernier
point qui peut être hacké&amp;#160;: l&amp;#8217;aspect humain. Entre les années 50 et 90, on voulait de la &amp;#8220;qualité totale&amp;#8221;, c&amp;#8217;est le rôle
du champion dans la qualité. Le champion c&amp;#8217;est la R&amp;amp;D, il est plus que probable que cette isolation casse les performances
du champion.&lt;/p&gt;
&lt;p&gt;Pour éviter ça, on mélange les gens avec d&amp;#8217;autres qui veulent jouer. Des idées sont produites, &amp;#8220;comme ça&amp;#8221;. Une idée qui pousse
&amp;#8220;comme ça&amp;#8221;, peut devenir une réponse à un besoin dans un cas encore inconnu au moment ou l&amp;#8217;idée pousse.&lt;/p&gt;
&lt;p&gt;Avec une série d&amp;#8217;expérimentations, on peut obtenir des métriques de succès et créer un cadre d&amp;#8217;innovation.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Mince, la conclusion c&amp;#8217;est une image&amp;#8230; et &amp;#8220;Petits pas + Culture de bidouille = Hacker l&amp;#8217;entreprise&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Bibliographie&amp;#160;: Scott Berkun &amp;#8220;The Myths of Innovation&amp;#8221;&lt;/p&gt;
&lt;h3&gt;Questions et réponses&lt;/h3&gt;
&lt;h4&gt;Est-on dans un bon cadre -en France- pour innover&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: euh&amp;#8230; j&amp;#8217;en sais rien (ndlr: l&amp;#8217;orateur est un français expatrié au Canada). Probablement, car le français est plutôt &amp;#8220;frondeur&amp;#8221;, à condition d&amp;#8217;avoir des chefs pas trop&amp;#8230;&lt;/p&gt;
&lt;h4&gt;Métrique du succès de l&amp;#8217;innovation&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: Disons qu&amp;#8217;en moyenne c&amp;#8217;est le &amp;#8220;110-1&amp;#8221;: 90 idées sur 110 sont à jeter, mais c&amp;#8217;est toujours un peu difficile de présenter une métrique
comme ça.&lt;/p&gt;
&lt;h4&gt;Tu penses quoi de 37signal&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: Cette entreprise américaine est assez innovante, ils ne se définissent pas comme l&amp;#8217;entreprise qui va battre l&amp;#8217;autre mais
celle qui sera &amp;#8220;l&amp;#8217;anti&amp;#8221; (de Microsoft project). Je trouve que 37signal est quand même un peu trop dogmatique&amp;#160;: une grosse recette,
ça ne marche pas avec tout le monde&amp;#160;: pas de meetings, pas de ça, toujours comme ça. Je suis partagé.&lt;/p&gt;
&lt;h4&gt;Le modèle français c&amp;#8217;est souvent à coup de subventions publiques, et là, on apprend que le statut jeune entreprise innovante. Qu&amp;#8217;en penses-tu&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: Pour des projets de recherche, l&amp;#8217;institution est importante et doit maintenir ses efforts. Mais bien souvent, c&amp;#8217;est à celui qui est &amp;#8220;titillé&amp;#8221; de
tenter quelque chose.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/%28Paris-Web-%21%29-6-Innover-de-9-a-5#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/%28Paris-Web-%21%29-6-Innover-de-9-a-5#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/179</wfw:commentRss>
      </item>
    
  <item>
    <title>(Paris Web !) #5 Reusable Code : For Good or For Awesome</title>
    <link>http://www.martiusweb.net/post/%28Paris-Web-%21%29-5-Reusable-Code-%3A-For-Good-or-For-Awesome</link>
    <guid isPermaLink="false">urn:md5:1791bbd186558c0d083c5269294c2ae4</guid>
    <pubDate>Fri, 15 Oct 2010 10:50:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>API</category><category>Génie logiciel</category><category>Javascript</category><category>ParisWeb</category><category>php</category><category>POO</category>    
    <description>&lt;p&gt;Une conférence qui s&amp;#8217;appelle &amp;#8220;reusable code&amp;#8221;, je sais d&amp;#8217;avance que ça va me plaire. En plus, Jake utilisait une wiimote pour contrôler sa présentation, c&amp;#8217;était forcément génial.&lt;/p&gt;
&lt;p&gt;Une excellente conférence, mais qui s&amp;#8217;adresse essentiellement aux développeurs. L&amp;#8217;orateur présente des bonnes pratiques pour réaliser des API réutilisables en Javascript. Bien sûr, bon nombre de conseils s&amp;#8217;appliquent dans d&amp;#8217;autres cas. C&amp;#8217;est la deuxième conférence que j&amp;#8217;ai suivi en anglais.&lt;/p&gt;
&lt;p&gt;Conférence dirigée par Jake Archibald, qui fait de belles APIs Javascript pour la BBC.&lt;br /&gt;&lt;br /&gt;L&amp;#8217;une de ses grosses missions, c&amp;#8217;est de produire du Javascript réutilisable.&lt;/p&gt;
&lt;p&gt;Les &lt;a hreflang=&quot;en&quot; href=&quot;http://www.slideshare.net/jaffathecake/reusable-code-for-good-or-for-awesome&quot;&gt;slides de la présentation&lt;/a&gt; sont disponibles sur slideshare.&lt;/p&gt;    Il y a cinq éléments pour faire une bonne API&amp;#160;:
&lt;ul&gt;&lt;li&gt;consistency&lt;/li&gt;
&lt;li&gt;flexibility&lt;/li&gt;
&lt;li&gt;readability&lt;/li&gt;
&lt;li&gt;writability&lt;/li&gt;
&lt;li&gt;Kinda useful-ability&lt;/li&gt;
&lt;li&gt;= Captain &amp;#8220;I build Reusable code&amp;#8221;&amp;#160;!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On va prendre l&amp;#8217;exemple des Carrousel en JS, ils ont poussé comme des champignons&amp;#160;! Il y a des carousels partout sur le site de la BBC.&lt;/p&gt;
&lt;p&gt;Bruce Wayne a dévoué sa vie à se battre contre le crime et c&amp;#8217;est pour ça qu&amp;#8217;il est devenu Batman.
Jake a une histoire aussi&amp;#160;: quand il était enfant, il voulait regarder un film documentaire avec sa mère. Il pensait que le documentaire en question était &amp;#8220;Historical Fallacies&amp;#8221;. Il avait mal compris, le documentaire était en fait &amp;#8220;Historical Phalluses&amp;#8221;, et il a subit le visionnage de ce documentaire avec sa mère. Voilà, une démonstration qui montre que mal nommer quelque chose peut avoir des conséquences désastreuses&amp;#160;: c&amp;#8217;est difficile à lire, difficile à comprendre, et tout ça peut être source de confusions. Tous les jours, avec les API, les risques de confusion sont nombreux. Une API est difficile à faire et difficile à changer. Si elle est mal conçue, les gens ne vont pas savoir l&amp;#8217;utiliser. Fort de cette expérience télévisuelle avec sa maman, Jake se devait de lutter contre les confusions, surtout dans son boulot. Mais passons à la pratique.&lt;/p&gt;
&lt;h3&gt;A function&amp;#160;: where do we put it&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Global scope, custom &amp;#8220;namespace&amp;#8221;, existing object, plugin&amp;#160;? Oublions déjà le scope global. Regardons les namespaces.
Les namespaces servent à regrouper des choses qui collent ensemble. Soyons un peu vigilant à ne pas non plus
trop découper&amp;#160;!&lt;/p&gt;
&lt;pre&gt;[javascript]
jToys.carousel();
jToys.accordion();
&lt;/pre&gt;
&lt;p&gt;Pensons aussi aux alias pour la compatibilité&amp;#160;:&lt;/p&gt;
&lt;pre&gt;[javascript]
jToys.same();
jToys.deepEquals();
jToys.same = jToys.deepEquals;
&lt;/pre&gt;
&lt;p&gt;Ajouter à des objets existants est aussi une bonne idée&amp;#160;: en javascript on peut bidouiller un objet à volonté. On peut produire du code super facile à lire. C&amp;#8217;est cool. Bien sûr, il y a des pièges.&lt;/p&gt;
&lt;p&gt;Par exemple, en surchargeant un objet standard, on risque d&amp;#8217;entrer en collision avec une nouveauté du langage (&lt;code&gt;getElementsByClassName()&lt;/code&gt;). C&amp;#8217;est un problème car la définition du W3C n&amp;#8217;est pas la même que celle définie dans le framework prototype pour cette méthode. Ils vont devoir rompre la compatibilité.&lt;/p&gt;
&lt;p&gt;Conclusion, c&amp;#8217;est peut-être pas une excellente solution.&lt;/p&gt;
&lt;p&gt;Écrire un plugin, ça a l&amp;#8217;air cool aussi. C&amp;#8217;est un peu comme étendre les types par défaut, mais avec moins de risques. Bien sûr un risque de collisions subsiste.&lt;/p&gt;
&lt;p&gt;Choisissons donc entre namespaces et plugins. Si les utilisateurs ne connaissent pas javascript mais JQuery, utilisez les plugins. Dans un environnement ou le noyau est presque réduit à zéro. Les namespaces peuvent être cool.&lt;/p&gt;
&lt;p&gt;N&amp;#8217;oubliez pas d&amp;#8217;être cohérent&amp;#160;! Regardez &lt;a href=&quot;http://fr.wikipedia.org/wiki/Patrick_Stewart&quot; onclick=&quot;window.open(this.href); return false;&quot;&gt;Patrick Stewart&lt;/a&gt; il n&amp;#8217;a pas changé en 20 ans&amp;#160;!&lt;/p&gt;
&lt;h3&gt;Fonctions et paramètres&lt;/h3&gt;
&lt;p&gt;Commencez par la documentation. Comment appelle-t-on les paramètres&amp;#160;? Avec la documentation on
peut donner des noms cohérents (et ça évite les confusions et les enfants qui regardent des émissions
sur des sexes masculins, entre autres).&lt;/p&gt;
&lt;p&gt;JS Doc, P Doc sont d&amp;#8217;excellents outils pour décrire la documentation. La documentation du code
avant de coder permet de tester l&amp;#8217;API avant même de commencer à écrire le code. On peut facilement
vérifier si elle est intuitive grâce à ça.&lt;/p&gt;
&lt;p&gt;Soyons vigilent aux termes que nous utilisons&amp;#160;: restons cohérents. Sur wikipédia (enfin, celui que seul Jake utilise), &amp;#8220;consistency&amp;#8221; est décrit par
&amp;#8220;pas PHP&amp;#160;!&amp;#8221;. C&amp;#8217;est un tel bordel dans les fonctions PHP, aucune convention, c&amp;#8217;est tordu&amp;#160;! Mais bon, au moins, il y a une bonne documentation.&lt;/p&gt;
&lt;p&gt;Patrick Stewart n&amp;#8217;aime pas PHP.&lt;/p&gt;
&lt;p&gt;Donc, pour revenir au Carousel, on a essayé un truc comme&amp;#160;:&lt;/p&gt;
&lt;pre&gt;[javascript]
jToys.carousel('#c', 500, true);
&lt;/pre&gt;
&lt;p&gt;Mais qui fait quoi&amp;#160;? On ne voit pas tout à quoi correspond le second paramètre. Pire &lt;code&gt;elt.cloneNode(true)&lt;/code&gt;&amp;#160;:
mais c&amp;#8217;est quoi ce &amp;#8220;true&amp;#8221;&amp;#160;?&lt;/p&gt;
&lt;p&gt;Essayons de faire en sorte que les arguments se lisent bien.&lt;/p&gt;
&lt;p&gt;Utilisons des objets optionnels pour les arguments&amp;#160;:&lt;/p&gt;
&lt;pre&gt;[javascript]
jToys.carousel('#whatever', {loop: true, speed: 500});
&lt;/pre&gt;
&lt;p&gt;Dans ce cas, ne soyons pas stupides, décrivons et documentons ces paramètres (les générateurs de docs proposent
des manières de décrire ça proprement).&lt;/p&gt;
&lt;p&gt;C&amp;#8217;est d&amp;#8217;autant plus avantageux qu&amp;#8217;il est possible de de rajouter des options comme on veut. Utiliser des métaphores
c&amp;#8217;est une bonne idée quand on a pas trop le choix, mais il faut faire attention à ne pas être mal compris. Pensez à
Desktop Wallpaper, le sens fondamental est plutôt débile (Papier peint de bureau&amp;#8230;).&lt;/p&gt;
&lt;p&gt;Pensons également à l&amp;#8217;usage le plus courant en donnant des comportements et des valeurs par défaut à notre objet.&lt;/p&gt;
&lt;p&gt;Regardez CSS3, on a &lt;code&gt;overflow-x&lt;/code&gt; et &lt;code&gt;overflow-y&lt;/code&gt;. Certaines combinaisons de ces propriétés et de leurs valeurs sont
incompatibles. Et tout ça devient illisible&amp;#160;! Évitons d&amp;#8217;avoir des dépendances entre les paramètres. Pensez aux enfants&amp;#160;!&lt;/p&gt;
&lt;h3&gt;Est-on sur la bonne voie&amp;#160;?&lt;/h3&gt;
&lt;p&gt;C&amp;#8217;est difficile de prouver la qualité de notre propre API. Avec les illusions d&amp;#8217;optiques, on ne voit pas le &amp;#8220;truc&amp;#8221; tant qu&amp;#8217;on a pas eu
la solution. Si on y revient, il saute aux yeux&amp;#160;! C&amp;#8217;est pareil avec les API. Quand on fait l&amp;#8217;API, on voit tout de suite ce qui va se passer,
après tout, c&amp;#8217;est notre bébé&amp;#160;! L&amp;#8217;idée c&amp;#8217;est de faire lire un code utilisant l&amp;#8217;API a quelqu&amp;#8217;un. Il faut voir si il arrive à avoir une idée
de ce que ce code fait.&lt;/p&gt;
&lt;h3&gt;Flexible&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Être flexible c&amp;#8217;est important, parce qu&amp;#8217;il faut penser aux usages futurs. La solution&amp;#160;: l&amp;#8217;abstraction. Par exemple Carousel
peut hériter de CarouselPane qui ne contient pas de logique visuelle. Un autre aspect important, c&amp;#8217;est de faire en sorte de rendre
les erreurs faciles à détecter. Quand l&amp;#8217;erreur est dans un paramètre (par exemple une faute de frappe), elle devient silencieuse.
C&amp;#8217;est frustrant pour l&amp;#8217;utilisateur.&lt;/p&gt;
&lt;p&gt;Note&amp;#160;: les slides et la conf seront bientôt dispos en ligne. On a été un peu pressé par le temps.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/%28Paris-Web-%21%29-5-Reusable-Code-%3A-For-Good-or-For-Awesome#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/%28Paris-Web-%21%29-5-Reusable-Code-%3A-For-Good-or-For-Awesome#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/178</wfw:commentRss>
      </item>
    
  <item>
    <title>(Paris Web !) #4 L'accessibilité dans la chaine de production</title>
    <link>http://www.martiusweb.net/post/%28Paris-Web-%21%29-4-L-accessibilit%C3%A9-dans-la-chaine-de-production</link>
    <guid isPermaLink="false">urn:md5:2eccd786e46e9b213f6e00215a090ff1</guid>
    <pubDate>Fri, 15 Oct 2010 10:19:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
            
    <description>&lt;p&gt;Conférence dirigée par Denis Boudreau&amp;nbsp; (co-fondateur de la Coopérative Accessibilité Web expert invité au W3C HTML-WG) et &lt;br /&gt;Vincent François (co-fondateur de cette fameuse coop).&lt;/p&gt;    &lt;p&gt;Exemple type du mauvais élève&amp;#160;: hé&amp;#160;! Tu peux ajouter les &amp;#8220;alt&amp;#8221;&amp;#160;? Le développeur n&amp;#8217;a pas que ça à faire, en plus
il ne sait pas bien ce qu&amp;#8217;il faut faire. Le rédacteur ne travaille plus sur le projet depuis un moment. Aïe.
C&amp;#8217;est un cas courant&amp;#160;: l&amp;#8217;accessibilité est souvent traité en fin de chaine, comprendre&amp;#160;: bien trop tard.&lt;/p&gt;
&lt;p&gt;Un autre exemple classique&amp;#160;: les contrastes sont trop faibles et le site est presque livré&amp;#160;!&lt;/p&gt;
&lt;h3&gt;Les pièges classiques de l&amp;#8217;accessibilité&lt;/h3&gt;
&lt;p&gt;Souvent, on place assez bien les nouveaux métiers dans la chaîne de production (le designer arrive au début,
le contrôleur qualité à la fin d&amp;#8217;une itération). On oublie souvent le caractère transversal de l&amp;#8217;accessibilité.
On risque souvent de négliger des aspects importants, et risquer de prendre des décisions qui auront des
conséquences lourdes.&lt;/p&gt;
&lt;p&gt;La pire situation étant bien souvent de planifier l&amp;#8217;accessibilité en fin de parcours. L&amp;#8217;accessibilité est
importante lors de la définition des besoins par exemple, ou les premières étapes de conception. L&amp;#8217;intégrateur est
alors un peu obligé de faire le travail des autres, alors qu&amp;#8217;il n&amp;#8217;en a généralement pas les compétences. En plus,
on ne pose pas toutes les bonnes questions sur les choix technologiques.&lt;/p&gt;
&lt;p&gt;Autre coup classique&amp;#160;: désigner un champion de l&amp;#8217;accessibilité&amp;#160;: ce sont des décisions qui se prennent tout au
long du projet, donc qu&amp;#8217;une personne seule ne peut pas prendre (sa légitimité sera rapidement remise en question).&lt;/p&gt;
&lt;p&gt;Les exigences seules sont insuffisantes&amp;#160;: ne validez pas que les critères techniques. Souvent, une personne
développe les compétences et va tester. Mais la validation de l&amp;#8217;expérience utilisateur doit se faire avec un
véritable utilisateur (simuler au mieux une situation réelle).&lt;/p&gt;
&lt;p&gt;Il ne faut pas non plus confondre accessibilité et conformité. Ces notions ne sont pas interchangeables. L&amp;#8217;accessibilité est
une démarche subjective alors que la conformité est objective (elle répond à des critères).&lt;/p&gt;
&lt;p&gt;La notion de qualité ne relève pas de machines&amp;#160;! Alors évitons de présumer que les outils feront le travail.
L&amp;#8217;accessibilité fait appel au bon jugement, et implique une évaluation humaine. Il faut donc évaluer soi-même
les assertions publicitaires sur l&amp;#8217;accessibilité de certains CMS. Ceci mène au piège suivant&amp;#160;: on sous-estime
l&amp;#8217;impact des plateformes. Les licences coûteuses ne sont pas synonymes d&amp;#8217;accessibilité. Les solutions libres
sont souvent plus faciles à modifier, il est donc plus facile d&amp;#8217;adapter le produit pour mieux tenir compte
des contraintes d&amp;#8217;accessibilité.&lt;/p&gt;
&lt;h3&gt;Que gagne-t-on à être accessible &amp;#8220;dans la chaine de production&amp;#8221;&amp;#160;?&lt;/h3&gt;
&lt;p&gt;On gagne souvent beaucoup de temps. Par exemple, quand le rédacteur choisit les images, il peut préciser un
texte alternatif dans la foulée. Alors qu&amp;#8217;en fin de chaine, il faudra relancer le processus. Le temps c&amp;#8217;est de
l&amp;#8217;argent&amp;#160;: gagner du temps de travail, c&amp;#8217;est donc gagner de l&amp;#8217;argent.&lt;/p&gt;
&lt;p&gt;On gagne aussi dans la relation avec le client&amp;#160;: poser les questions liées à l&amp;#8217;accessibilité en fin de chaine,
c&amp;#8217;est gérer ce genre de choses en période de stress, de pic de travail, etc.&lt;/p&gt;
&lt;p&gt;Enfin, on gagne en relations internes&amp;#160;: on évite de pousser la charge sur le dernier maillon de la chaine, tous
découvriront comment améliorer la démarche de qualité et d&amp;#8217;accessibilité.&lt;/p&gt;
&lt;h3&gt;Au bon moment pour les bonnes personnes&amp;#160;:&lt;/h3&gt;
&lt;p&gt;Plus d&amp;#8217;informations sur le site d&amp;#8217;&lt;a href=&quot;http://accessibiliteweb.com/presentations/2010/parisweb/accessibilite-chaine-production&quot; hreflang=&quot;fr&quot; onclick=&quot;window.open(this.href); return false;&quot;&gt;accessibilité web&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Je n&amp;#8217;ai pas pris de notes pour la session Questions/Réponses. Désolé&amp;#160;! On retiendra que beaucoup de monde proteste
à l&amp;#8217;idée de ne pas élire un responsable accessibilité. La réponse à ce sujet est&amp;#160;: &amp;#8220;un responsable OK, pas un
gendarme, car tout le monde va tenter de l&amp;#8217;éviter&amp;#8221;. D&amp;#8217;autre part, beaucoup s&amp;#8217;inquiètent de l’absence d&amp;#8217;intérêt pour
l&amp;#8217;accessibilité dans de nombreuses situations.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/%28Paris-Web-%21%29-4-L-accessibilit%C3%A9-dans-la-chaine-de-production#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/%28Paris-Web-%21%29-4-L-accessibilit%C3%A9-dans-la-chaine-de-production#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/177</wfw:commentRss>
      </item>
    
  <item>
    <title>(Paris Web !) #3 Let's interface !</title>
    <link>http://www.martiusweb.net/post/%28Paris-Web-%21%29-3-Let-s-interface-%21</link>
    <guid isPermaLink="false">urn:md5:eb68ea808f3b3bc07fdd8a535c785c14</guid>
    <pubDate>Thu, 14 Oct 2010 16:12:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>communication</category><category>entreprise</category><category>ParisWeb</category><category>évangélisme</category>    
    <description>&lt;p&gt;Cette conférence est la première en anglais, j&amp;#8217;ai essayé de la suivre sans traduction pour pouvoir prendre des notes. Je pense que ces notes ne seront pas très utiles car la conférence est très visuelle et interactive. La vidéo sera certainement disponible d&amp;#8217;ici quelques semaines.&lt;/p&gt;
&lt;p&gt;Conférence dirigée par Chris Heilmann (Tech evangelist chez Yahoo&amp;#160;!). Vous pouvez retrouver &lt;a hreflang=&quot;en&quot; href=&quot;http://www.slideshare.net/cheilmann/lets-interface&quot;&gt;les slides de la présentation&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;&amp;#8220;Je suis Chris et j&amp;#8217;aime cette conférence, j&amp;#8217;aime les organisateurs, j&amp;#8217;adore les autres orateurs, mais j&amp;#8217;ai
un problème&amp;#160;: la langue. Moi, je suis allemand, j&amp;#8217;habite en Angleterre et je parle un petit peu le français.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Paris web est une conférence plein de bon contenu, mais le monde ne le saura jamais car le monde ne parle pas
français. Et c&amp;#8217;est pourquoi nous continuons en anglais.&amp;#8221;&lt;/p&gt;
&lt;p&gt;C&amp;#8217;est assez facile de comprendre car il est allemand. Un petit troll pour Daniel Glazman pour le plaisir.&lt;/p&gt;
&lt;h3&gt;Problème de représentation&lt;/h3&gt;
&lt;p&gt;&amp;#8220;J&amp;#8217;ai du mal à me faire comprendre, l&amp;#8217;accent, la langue, alors j&amp;#8217;ai commencé à programmer des interfaces.
Les interfaces doivent être faciles pour les utilisateurs, qui ont des profils variés&amp;#160;: les utilisateurs finaux,
ou&amp;#8230; notre entreprise.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;L&amp;#8217;utilisateur se demande toujours comment l&amp;#8217;ordinateur peut nous aider, souvent on lui répond&amp;#160;: laisse,
l&amp;#8217;informatique c&amp;#8217;est pour nous, les informaticiens. L&amp;#8217;idée c&amp;#8217;est de produire une interface qui laisse l&amp;#8217;utilisateur
en faire ce qu&amp;#8217;il veut.&amp;#8221;&lt;/p&gt;
&lt;h3&gt;L&amp;#8217;interface pour communiquer&lt;/h3&gt;
&lt;p&gt;&amp;#8220;Avec la doc de Y!ui, on a tout, du monde l&amp;#8217;aime pour ça. Au contraire, W3schools est très light, mais
ne présente aucun contexte et toute l&amp;#8217;info n&amp;#8217;y est pas.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;N&amp;#8217;hésitez pas à produire une petite interface pour la présenter à votre boîte, c&amp;#8217;est votre chance&amp;#160;!!&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Prenons l&amp;#8217;exemple de Yahoo Placemaker, personne ne l&amp;#8217;utilise, alors que c&amp;#8217;est cool&amp;#160;! Voilà la doc, comment
comprendre l&amp;#8217;outil avec une doc très&amp;#8230; doc. J&amp;#8217;ai donc créé une interface qui montre ce que ça fait. Faire une
petite interface montre ce que ça fait de bien et on a commencer à voir l&amp;#8217;intérêt.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Voici un petit bout de code qui place sur une carte (google map) du contenu detecté dans la page.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Présentation de jolis outils qui utilisent ces APIs. Les sources sont sur github. &amp;#8220;Github is a paradox, it&amp;#8217;s
a social network for developpers&amp;#160;!&amp;#8221;&lt;/p&gt;
&lt;h3&gt;You can do that&lt;/h3&gt;
&lt;p&gt;&amp;#8220;Focus sur les objectifs, mettez vous à plusieurs, utilisez github, c&amp;#8217;est super cool&amp;#160;!&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Il ne faut pas hésiter à faire ça pour ses produits mais aussi les produits des autres, pendant une conférence,
j&amp;#8217;ai pris quelques extensions de firefox pour bidouiller l&amp;#8217;interface de stack overflow. Quand on tape une question,
j&amp;#8217;utilise une API qui permet de retrouver les tags pour cette question. Je présentait mes trucs en me mettant à
leur niveau&amp;#160;: j&amp;#8217;ai fait un truc utile pour eux, ils m&amp;#8217;ont écouté.&amp;#8221;&lt;/p&gt;
&lt;h3&gt;Screenr&lt;/h3&gt;
&lt;p&gt;Screenr est un outil qui permet de faire des screencasts prêt à être twittés, l&amp;#8217;idée c&amp;#8217;est&amp;#160;: montrez avec une
vidéo plutôt qu&amp;#8217;un long blabla (on connait tous le &amp;#8220;ce bouton à gauche, non l&amp;#8217;autre&amp;#8230; le troisième à gauche).&lt;/p&gt;
&lt;p&gt;&amp;#8220;La doc est souvent bordélique. Montrez des exemples et la technologie en action.&amp;#8221;&lt;/p&gt;
&lt;h3&gt;Et les données&lt;/h3&gt;
&lt;p&gt;&amp;#8220;TED Talks&amp;#160;: David McCandless. Le branding c&amp;#8217;est bien, mais l&amp;#8217;info est utile aussi&amp;#160;! Montrez aussi les données,
racontez leur histoire. Transmettez l&amp;#8217;info avec une histoire et des illustrations, des graphiques. C&amp;#8217;est facile de
trouver et transformer l&amp;#8217;info, regardez un peu YQL&amp;#8230;&amp;#8221;&lt;/p&gt;
&lt;p&gt;YQL est une sorte de langage de requête facilitant la récupération et la transformation de données stockées un
peu partout.&lt;/p&gt;
&lt;p&gt;Chris montre beaucoup d&amp;#8217;exemples difficiles à décrire, la conférence sera en vidéo de toute façon.&lt;/p&gt;
&lt;p&gt;Il montre comment il peut faire des interfaces intéressantes avec les données du Gardian balancées sur
un Google spreadsheet et transformées avec YQL.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Vous n&amp;#8217;avez pas besoin de faire plein de trucs tordus, prenez Google charts par exemple, c&amp;#8217;est super simple
à utiliser, et en plus là, la doc est accessible.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Regardez un peu les sites programmableweb et heroku.com.&amp;#8221;&lt;/p&gt;
&lt;h3&gt;Pas besoin d&amp;#8217;être un super dév&amp;#160;!&lt;/h3&gt;
&lt;p&gt;&amp;#8220;Yahoo Firehose Search&amp;#8221; permet d&amp;#8217;utiliser tout Yahoo et d&amp;#8217;autres sites comme vimeo, twitter, etc pour chercher un
tag dans ces réseaux sociaux.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;You are never too small to metter.&amp;#8221; (Sarkozy + Carla en photo)&lt;/p&gt;
&lt;p&gt;Du bel évangélisme qui se vit plus que se raconte, surtout en live&amp;#160;! Allez voir sur http://developer-evangelism.com
(par l&amp;#8217;orateur).&lt;/p&gt;
&lt;h3&gt;Questions&lt;/h3&gt;
&lt;h4&gt;Si je met mes vidéos sur youtube et tout ces jolis services, mon client va raller&amp;#160;!&lt;/h4&gt;
&lt;p&gt;R: Il faut lui dire &amp;#8220;vous gardez le meilleur caché, et le pire visible, oups&amp;#160;!&amp;#8221;.&lt;/p&gt;
&lt;h4&gt;Vous allez directement au code, quels sont pour vous les liens entre développeur et le designer&amp;#160;?&lt;/h4&gt;
&lt;p&gt;Chez Yahoo, ils commencent par des prototypes papier pour &amp;#8220;tout dire&amp;#8221;. Ensuite, les développeurs commencent à
prototyper, les designers pondent leurs mockups. Les gens ne s&amp;#8217;attendent pas mutuellement.&lt;/p&gt;
&lt;h4&gt;C&amp;#8217;est cool d&amp;#8217;être tech-evangelist chez Yahoo&amp;#160;?&lt;/h4&gt;
&lt;p&gt;J&amp;#8217;ai posé cette question&amp;#160;!&lt;/p&gt;
&lt;p&gt;R: &amp;#8220;It&amp;#8217;s fucking cool&amp;#160;! Avant d&amp;#8217;être tech-evangelist, il faut commencer par bosser dans une agence ou tu souffres un peu et
voit l&amp;#8217;environnement dans lequel les gens évoluent. Sinon, le pied c&amp;#8217;est que tu peux passer d&amp;#8217;une techno à l&amp;#8217;autre, toucher un peu
à tout et c&amp;#8217;est super cool.&amp;#8221;&lt;/p&gt;
&lt;p&gt;BTW, il m&amp;#8217;a offert le joli bouquin à gagner &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/%28Paris-Web-%21%29-3-Let-s-interface-%21#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/%28Paris-Web-%21%29-3-Let-s-interface-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/176</wfw:commentRss>
      </item>
    
  <item>
    <title>(Paris Web !) #2 Javascript Server Side (ssJS), par où commencer ?</title>
    <link>http://www.martiusweb.net/post/%28Paris-Web-%21%29-2-Javascript-Server-Side-%28ssJS%29%2C-par-o%C3%B9-commencer</link>
    <guid isPermaLink="false">urn:md5:298152e34146a443a6dadba053c558ac</guid>
    <pubDate>Thu, 14 Oct 2010 14:20:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>Apache</category><category>Javascript</category><category>Node.Js</category><category>ParisWeb</category>    
    <description>&lt;p&gt;OK, là je m&amp;#8217;y retrouve un peu mieux, et je me sens en terrain familier, ou presque&amp;#160;: on parle d&amp;#8217;exécuter du javascript côté serveur. Ma dernière tentative&amp;#8230; ah oui&amp;#160;! Un module PHP expérimental qui embarquait Tracemonkey&amp;#160;!&lt;/p&gt;
&lt;p&gt;On va faire un point sur l&amp;#8217;état de l&amp;#8217;utilisation de JS côté serveur. Javascript est-il destiné au client-side&amp;#160;?&lt;/p&gt;
&lt;p&gt;Conférence dirigée par Quentin Adam.&lt;/p&gt;    &lt;h3&gt;Pourquoi mettre du JS server side&amp;#160;?!&lt;/h3&gt;
&lt;p&gt;JS server-side est en fait déjà bien présent, et très lié aux technos no-SQL (bases de données
sans SQL). À l&amp;#8217;origine, Javascript a été créé pour le serveur-side, pour le serveur HTTP de netscape.&lt;/p&gt;
&lt;p&gt;Le plus gros intérêt de JS server-side, c&amp;#8217;est de limiter le nombre de langages dans une application web,
On jongle déjà avec trois langages côté client, et côté serveur, n&amp;#8217;en parlons pas.&lt;/p&gt;
&lt;p&gt;C&amp;#8217;est pas toujours évident pour un développeur Java (par exemple) de s&amp;#8217;adapter au front&amp;#160;! Introduire
Javascript un peu partout dans les projets web va permettre d&amp;#8217;unifier les compétences, les outils de
développement et de débug. L&amp;#8217;auteur suggère qu&amp;#8217;on gagnera(it) beaucoup en productivité.&lt;/p&gt;
&lt;p&gt;À priori, je ne suis pas franchement d&amp;#8217;accord avec tout ce qui se raconte pour le moment. Soit.&lt;/p&gt;
&lt;p&gt;Par exemple, on code deux fois les objets métiers&amp;#160;: un pour le serveur, un pour le client. Avec ssJS,
on devrait pouvoir partager le code.&lt;/p&gt;
&lt;p&gt;A terme, on pourrait voir le web comme une plateforme de développement globale&amp;#160;: les nouvelles API sont
assez excitantes et vont en ce sens&amp;#160;: local storage, XUL (Application lourde avec front JS).&lt;/p&gt;
&lt;h3&gt;Javascript&amp;#160;: un langage, des moteurs.&lt;/h3&gt;
&lt;p&gt;On voulait faire ECMAscript un standard global, mais tout le monde n&amp;#8217;a pas suivi.&lt;/p&gt;
&lt;p&gt;Regardons un peu le moteur Rhino&amp;#160;: codé en Java à la suite d&amp;#8217;un accord avec Sun. Le projet n&amp;#8217;a pas
franchement rencontré beaucoup de succès. La fondation Mozilla a récupéré Rhino quand Netscape a disparu.&lt;/p&gt;
&lt;p&gt;Rhino est inclus dans les SDK java aujourd&amp;#8217;hui. C&amp;#8217;est un peu le moteur à la base de la tendance ssJS.&lt;/p&gt;
&lt;h3&gt;Moteur JS n&amp;#8217;est pas Navigateur&amp;#160;!&lt;/h3&gt;
&lt;p&gt;Le moteur Javascript n&amp;#8217;est pas le navigateur&amp;#160;: on commence à voir les limites (actuelles) de la solution.
La plupart des API (comme DOM) ne sont pas accessibles server-side. Les frameworks Javascript actuels utilisent
beaucoup le DOM, et doivent s&amp;#8217;adapter.&lt;/p&gt;
&lt;h3&gt;Sous le capôt&lt;/h3&gt;
&lt;p&gt;Les requêtes HTTP vont être transformées en événements Javascript&amp;#160;: on peut les voir comme des web-sockets.&lt;/p&gt;
&lt;p&gt;Un aspect intéressant de cette vision, c&amp;#8217;est qu&amp;#8217;on peut abonner plusieurs utilisateurs à un même fil d&amp;#8217;exécution,
c&amp;#8217;est à dire, calculer une réponse un fois, et lier tous les événements à ce même calcul. On optimise clairement
la sollicitation des ressources.&lt;/p&gt;
&lt;h4&gt;APE&amp;#160;: Ajax Push Engine&lt;/h4&gt;
&lt;p&gt;Ape est basé sur le/les moteurs Javascript de Mozilla, qui ont été intégrés dans un module Apache. C&amp;#8217;est un outil
permettant de faire du web temps réel sans les sockets (par exemple). Ils ont poussé les développeurs de Mootools
à créer Mootols Server-side, qu&amp;#8217;ils utilisent comme base pour le framework.&lt;/p&gt;
&lt;p&gt;APE est un excellent moyen de commencer à travailler sur les événements serveur (ce qui ne se fait pas, par exemple,
en PHP et en Java).&lt;/p&gt;
&lt;h4&gt;Node.js&lt;/h4&gt;
&lt;p&gt;Google a présenté V8. Node.js fait partie des expérimentations de portage de V8 côté serveur.  Node.js est porté
par la communauté Ruby. Node.js s&amp;#8217;inspire des packages Ruby dans son architecture&amp;#160;: de nombreux développeurs on créé
des bibliothèques qui couvrent de nombreux besoins. Par contre, on ne peut pas dire que Node.js soit franchement
stable (API comme projets basés sur Node.js).&lt;/p&gt;
&lt;p&gt;Par contre, Node.js permet de faire &amp;#8220;ce qu&amp;#8217;on veut&amp;#8221;, pas seulement du HTTP. Node.js utilise beaucoup Git (NDLR:
troll sur git, bien sûr) et github comme forge pour récupérer les différents packages.&lt;/p&gt;
&lt;p&gt;On retient deux défauts majeurs&amp;#160;: l&amp;#8217;écosystème est difficile à qualifier, et Node.js est mono-thread.&lt;/p&gt;
&lt;p&gt;On cite le framework Node.js&amp;#160;: Express (semblable à Sinatra en Ruby).&lt;/p&gt;
&lt;h3&gt;Normaliser le ssJS&amp;#160;?&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.commonjs.com/&quot; hreflang=&quot;en&quot; onclick=&quot;window.open(this.href); return false;&quot;&gt;CommonJs&lt;/a&gt;
est un consortium qui cherche à standardiser un peu tout ça. Oh et la production pour des grands comptes&amp;#8230; c&amp;#8217;est
quand même pas pour tout de suite.&lt;/p&gt;
&lt;h3&gt;Questions/réponses&lt;/h3&gt;
&lt;h4&gt;J&amp;#8217;ai plutôt l&amp;#8217;impression qu&amp;#8217;on va vers le polyglotte&amp;#160;: un langage par besoin.&lt;/h4&gt;
&lt;p&gt;R: C&amp;#8217;est vrai pour beaucoup de cas. Mais quand on est dans un processus qui n&amp;#8217;est pas métier, c&amp;#8217;est à dire sur
l&amp;#8217;aspect clairement &amp;#8220;application&amp;#8221;, on arrête de &amp;#8220;doubler&amp;#8221; le développement.&lt;/p&gt;
&lt;p&gt;NDLR&amp;#160;: il n&amp;#8217;est clairement pas fan des outils de génération de code, qui ne produisent pas un code &amp;#8220;très propre&amp;#8221;.
Mais je trouve son jugement un peu sévère au sujet de Google Web Toolkit.&lt;/p&gt;
&lt;h4&gt;Vous ne pensez pas que l&amp;#8217;intégrateur front et le développeur back sont deux métiers différents&amp;#160;? Les problématiques ne sont clairement pas les mêmes&amp;#160;!&lt;/h4&gt;
&lt;p&gt;Question posée par votre serviteur. Je pense que je n&amp;#8217;aurai pas dû préciser que je suis étudiant, il a répondu &amp;#8220;ouais enfin, pour un blog, on s&amp;#8217;en tamponne&amp;#8221;.
Oups, merci et au suivant.&lt;/p&gt;
&lt;p&gt;R: la question ne doit pas se poser comme ça, unification&amp;#160;! Un seul langage&amp;#160;!&lt;/p&gt;
&lt;h4&gt;Un thread pour plusieurs requêtes, c&amp;#8217;est cool mais&amp;#8230; personne ne fait la même requête, si&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: Si on prend l&amp;#8217;exemple de twitter, je ne suis pas d&amp;#8217;accord&amp;#160;: un twitt bien suivi contient un lien,
et bim&amp;#160;! Tout le monde fait la même requête.&lt;/p&gt;
&lt;h4&gt;Moi je voudrais parler de &amp;#8220;JSS&amp;#8221;, Javascript Starsheet qu&amp;#8217;on a un peu tous oublié&amp;#160;!&lt;/h4&gt;
&lt;p&gt;JSS permet de faire de la génération de feuilles de styles avec Javascript. Va-t-on TOUT faire
en JS et faire disparaître les autres langages&amp;#160;?&lt;/p&gt;
&lt;p&gt;R (du public)&amp;#160;: NON&amp;#160;!&lt;/p&gt;
&lt;p&gt;R: On va commencer à faire de javascript un peu partout, par contre, on en a de moins en moins
besoin puisque certains langages sont de mieux en mieux &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;R (de Daniel Galzman, Chairman au W3C \o/ ça la FOUT MAL :p): juste pour dire, euh, écrire des
styles en javascript, on a abandonné parce que, euh, facteur 40 côté performances&amp;#160;! On en est tous revenu, même au
W3C&amp;#160;!&lt;/p&gt;
&lt;h4&gt;Comment ça se passe quand on &amp;#8220;met des requêtes en attente&amp;#8221;&amp;#160;? Comment on gère la mémoire, tout ça&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: la mémoire ça coute rien, je bosse dans le cloud et on s&amp;#8217;en carre un peu de la mémoire. Par contre, c&amp;#8217;est
vrai qu&amp;#8217;on va commencer à manipuler les processus idle, c&amp;#8217;est un peu plus complexe (mais on est pas en attente
active).&lt;/p&gt;
&lt;h4&gt;Des APIs pour le web-offline&amp;#160;? Je pense aussi à Gears.&lt;/h4&gt;
&lt;p&gt;R: Gears est mort, google le dit&amp;#160;: ils veulent aller vers les standards. Le web-offline c&amp;#8217;est bien, pour
plein de raisons, mais niveau API, il manque encore beaucoup.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Il y a des tonnes de projets de ssJS, et beaucoup de trolls, mais vous pouvez beaucoup vous amuser dès maintenant&amp;#160;!&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/%28Paris-Web-%21%29-2-Javascript-Server-Side-%28ssJS%29%2C-par-o%C3%B9-commencer#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/%28Paris-Web-%21%29-2-Javascript-Server-Side-%28ssJS%29%2C-par-o%C3%B9-commencer#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/175</wfw:commentRss>
      </item>
    
  <item>
    <title>(Paris Web !) #1 La conception universelle : ou votre site web s'adaptera à tous les besoins.</title>
    <link>http://www.martiusweb.net/post/%28Paris-Web-%21%29-1-La-conception-universelle-%3A-ou-votre-site-web-s-adaptera-a-tous-les-besoins.</link>
    <guid isPermaLink="false">urn:md5:ec43de78da60f224165b397c179021ca</guid>
    <pubDate>Thu, 14 Oct 2010 14:13:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>accessibilité</category><category>Adobe Flash</category><category>HTML 5</category><category>ParisWeb</category><category>W3C</category>    
    <description>&lt;p&gt;Je suis à Paris Web pour trois jours, je vais essayer de raconter ce que je vois au mieux. Tout est posé brut en fonction de ce que j’entends (j&amp;#8217;essaierais de faire une relecture clean quand je serais un peu plus reposé). Soyez indulgent, il est possible (voir probable) que je n&amp;#8217;ai pas tout suivi&amp;#160;!&lt;/p&gt;
&lt;p&gt;Retrouvez tous les billets sous le tag &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.martiusweb.net/tag/ParisWeb&quot;&gt;ParisWeb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cette première conférence est dirigée par Matt May, Responsable accessibilité chez Adobe (rien que ça). Sa conférence est en français bien qu&amp;#8217;il soit anglophone, ce qui rendait le tout parfois un peu difficile à suivre.&lt;/p&gt;    &lt;p&gt;Matt May commence par quelques points de repère de l&amp;#8217;histoire de la
problématique d&amp;#8217;accessibilité en guise d&amp;#8217;introduction, il nous parle des
années 90, d&amp;#8217;HTML2 et des attributs alt (&amp;lt;img alt&amp;gt;) et summary
(&amp;lt;table summary&amp;gt;).
&lt;/p&gt;
&lt;p&gt;alt est devenu un attribut d&amp;#8217;accessibilité grâce à l&amp;#8217;amélioration des
technos périphériques. En fait, alt n&amp;#8217;était pas tout à fait prévu pour
être &amp;#8220;accessible&amp;#8221;, mais plus pour suivre le trait sémantique prévu.&lt;/p&gt;
&lt;p&gt;En 1999, WCAG 1.0, norme d&amp;#8217;accessibilité est arrivée&amp;#160;: très dure et limitée
à HTML.&lt;/p&gt;
&lt;p&gt;En puis en 2000 les mobiles qui peuvent être connectés à internet commencent
à arriver. Exit HTML, bonjour WML&amp;#160;! On devait créer deux sites&amp;#160;: un
&amp;#8220;classique&amp;#8221; et un pour le mobile. Alors est arrivé XHTML. Le web mobile a
vraiment explosé avec l&amp;#8217;iPhone, car le navigateur approchait efficacement
la navigation sur un PC. Maintenant, les tablettes arrivent&amp;#160;! Bientôt, on
aura Google TV, les &amp;#8220;expériences utilisateur&amp;#8221; varient de plus en plus&amp;#160;!&lt;/p&gt;
&lt;p&gt;Aujourd&amp;#8217;hui les outils permettant d&amp;#8217;accéder au web se multiplient&amp;#160;: comment
se débrouiller pour concevoir un front qui passe sur tout ces outils&amp;#160;?&lt;/p&gt;
&lt;h3&gt;La conception universelle, c&amp;#8217;est quoi&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Concevoir des produits et des environnements pour qu&amp;#8217;ils soient utilisables par
toutes les personnes, dans la mesure du possible, sans recourir à des
adaptations ou à la conception spécialisée.&lt;/p&gt;
&lt;p&gt;On s&amp;#8217;est inspiré du monde de l&amp;#8217;architecture pour en définir les principes&amp;#160;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une utilisation égalitaire&amp;#160;: tout le monde doit pouvoir accéder au web de la
même manière.&lt;/li&gt;
&lt;li&gt;la flexibilité d&amp;#8217;utilisation&amp;#160;: par exemple, lire un site web sur son mobile
avec le soleil dans le dos&amp;#8230; on ne voit rien&amp;#160;!&lt;/li&gt;
&lt;li&gt;Une utilisation simple et intuitive&amp;#160;: besoin d&amp;#8217;exemples&amp;#160;? Mais si&amp;#160;: le
clavier virtuel, la loupe, etc&amp;#8230; Tout le monde découvre des outils présents
sur PC depuis longtemps, pour les handicaps&amp;#160;!&lt;/li&gt;
&lt;li&gt;La tolérance de l&amp;#8217;erreur&amp;#160;: il faut prévoir les erreurs simples, on a
souvent un peut de mal à s&amp;#8217;y retrouver.&lt;/li&gt;
&lt;li&gt;Peu d&amp;#8217;effort physique&amp;#160;: par exemple, prèsque 10% des personnes (aux USA)
ont du mal à utiliser une souris. On arrive à 25-30% chez les personnes
agées. Avec les mobiles, les boutons sont très petits&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il faut imaginer qu&amp;#8217;on s&amp;#8217;attend à un nouveau type de nouveauté dans peu de temps (1, 2 ans)&amp;#160;:
on supporte déjà trois types d&amp;#8217;ecrans, à quand un quatrième&amp;#160;?&lt;/p&gt;
&lt;h3&gt;Les outils&lt;/h3&gt;
&lt;p&gt;Dans le bâtiment, on pense à choisir les matériaux qu&amp;#8217;on utilise, ils ont tous leurs propriétés, et
construire un bâtiment en verre, seulement du verre, c&amp;#8217;est plutôt&amp;#8230; fragile.&lt;/p&gt;
&lt;p&gt;Dans le web, c&amp;#8217;est pareil, on a HTML, CSS, Javascript, Canvas, etc il faut choisir l&amp;#8217;outil
qui colle au besoin. On utilise encore trop souvent HTML pour faire de la mise en page (quelle idée&amp;#160;!)&lt;/p&gt;
&lt;p&gt;Matt compare les navigateurs avec les bases des bâtiments&amp;#160;: les bâtiments sont bâtis sur&amp;#8230;
et les sites marchent sur&amp;#8230; (Un petit trololo au passage)
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;du béton &amp;#8230; Mozilla (Gecko),&lt;/li&gt;
&lt;li&gt;des roues &amp;#8230; Webkit&lt;/li&gt;
&lt;li&gt;de la boue &amp;#8230; IE&amp;#160;!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La comparaison continue avec les utilisateurs&amp;#160;: il faut penser aux différents handicaps et les assistances
qu&amp;#8217;ils utilisent.&lt;/p&gt;
&lt;h3&gt;Évoluer&amp;#160;!&lt;/h3&gt;
&lt;p&gt;N&amp;#8217;oublions pas qu&amp;#8217;il faut faire évoluer notre métier&amp;#160;: les outils changent, il faut penser à créer des
solutions&amp;#160;! Et surtout, nous ne sommes pas seuls pour le faire&amp;#160;! En tant qu&amp;#8217;utilisateurs des normes du W3C, par
exemple, nous sommes tout à fait légitimes pour apporter notre retour aux auteurs des spécifications&amp;#160;!&lt;/p&gt;
&lt;h3&gt;Questions-réponses&lt;/h3&gt;
&lt;h4&gt;Que vouliez vous dire par &amp;#8220;prévoir l&amp;#8217;entropie&amp;#8221;&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: L&amp;#8217;idée c&amp;#8217;est qu&amp;#8217;il faut savoir s&amp;#8217;adapter&amp;#160;: on s&amp;#8217;adapte souvent en fonction de nos statistiques d&amp;#8217;utilisateurs
par exemple&amp;#8230; c&amp;#8217;est un peu limitatif&amp;#160;! On ne prévoit pas les utilisateurs, que l&amp;#8217;on ne connait pas encore, et
qui vont commencer à utiliser des nouveaux outils (lecteurs d&amp;#8217;écrans, nouveaux mobiles, IE9 pour Windows Phone 7&amp;#160;!)&lt;/p&gt;
&lt;h4&gt;C&amp;#8217;est pas vraiment une question mais plus un remerciement&amp;#8230;&lt;/h4&gt;
&lt;p&gt;&amp;#8230;l&amp;#8217;accessibilité touche tout le monde à un moment ou à un autre&amp;#160;: parfois on est simplement fatigué,
etc.. ça marche aussi&amp;#160;!&lt;/p&gt;
&lt;p&gt;R: c&amp;#8217;est pour cela que je suis ici&amp;#160;!&lt;/p&gt;
&lt;h4&gt;Pensez vous que le &amp;#8220;design universel&amp;#8221; va remplacer tout ce qu&amp;#8217;on subit comme contraintes sur l&amp;#8217;accessibilité,
l&amp;#8217;adaptation du design, etc&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: J&amp;#8217;espère que oui, la &amp;#8220;conception universelle&amp;#8221; progresse. Par exemple, maintenant, même si ce n&amp;#8217;est pas très
&amp;#8220;politiquement correct&amp;#8221;, on voit bien que l&amp;#8217;accessibilité et ce genre de problématiques sont au centre de toutes
les attentions, car aujourd&amp;#8217;hui l&amp;#8217;utilisateur &amp;#8220;handicapé&amp;#8221; est celui qui a des moyens&amp;#160;: il achète un mobile&amp;#160;!
Les personnes souffrant d&amp;#8217;un handicap réél étaient malheureusement un peu sous considérées&amp;#8230;&lt;/p&gt;
&lt;h4&gt;&amp;#8220;Open trololo&amp;#8221;&amp;#160;: vous parlez d&amp;#8217;accessibilité, je répond norme. Pourquoi avez vous parlé de Flash&amp;#160;?&lt;/h4&gt;
&lt;p&gt;R: Je suis &amp;#8220;Monsieur Adobe Accessibility&amp;#8221;&amp;#160;! Je ne veux pas faire de la pub pour flash, j&amp;#8217;ai aussi travaillé pour
le W3C. Ce qui est important, c&amp;#8217;est de connaître les propriétés de chacune de ces technologies, par exemple, il
y a la balise video (40% des navigateurs) et flash (&amp;gt;98% de pénétration, Apple i* inclus). Aujourd&amp;#8217;hui, pour faire des sous-titres
standardisés et fonctionnels, aujourd&amp;#8217;hui il faut utiliser flash. Il faut savoir que si on en a besoin, ça existe.&lt;/p&gt;
&lt;p&gt;On sait que plus tard, on va passer au standard. Mais aujourd&amp;#8217;hui flash est à considérer.&lt;/p&gt;
&lt;h4&gt;Il y a-t-il des outils qui permettent de mesurer l&amp;#8217;accessibilité&amp;#160;?&lt;/h4&gt;
&lt;p&gt;Mmmh, oui et non&amp;#160;: on regarde les stats pour voir ce qui existe, on regarde les outils des utilisateurs, les outils des
développeurs, et on va tenter de s&amp;#8217;adapter avec des fallbacks. Il n&amp;#8217;y a PAS de réponse absolue.&lt;/p&gt;
&lt;h4&gt;Pensez vous que pour cette conception, il faut adapter les outils existant ou pousser les nouveaux outils&amp;#160;?&lt;/h4&gt;
&lt;p&gt;Je pense avoir compris la question. C&amp;#8217;est important de savoir que les systèmes de fallback ne sont pas basés sur
les standards eux-même mais sur l&amp;#8217;observation (comprendre: les limites des navigateurs). Il faut aujourd&amp;#8217;hui tenir
compte des capacités de chaque navigateur. À ce niveau, il faut s&amp;#8217;adapter d&amp;#8217;un navigateur à l&amp;#8217;autre. Le plus important
c&amp;#8217;est qu&amp;#8217;on créé des sites avec une structure qui suive les normes.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/%28Paris-Web-%21%29-1-La-conception-universelle-%3A-ou-votre-site-web-s-adaptera-a-tous-les-besoins.#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/%28Paris-Web-%21%29-1-La-conception-universelle-%3A-ou-votre-site-web-s-adaptera-a-tous-les-besoins.#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/174</wfw:commentRss>
      </item>
    
  <item>
    <title>Peut-on commencer un projet avec Zend Framework ou Symfony en ce moment ?</title>
    <link>http://www.martiusweb.net/post/Peut-on-commencer-un-projet-avec-Zend-Framework-ou-Symfony</link>
    <guid isPermaLink="false">urn:md5:8619ec52072957e51c3b5b7a7d835ad7</guid>
    <pubDate>Sat, 02 Oct 2010 18:08:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Programmation PHP</category>
        <category>développeur</category><category>framework</category><category>Insa de Lyon</category><category>namespaces</category><category>nouveau</category><category>php 5.3</category><category>Symfony</category><category>Zend Framework</category>    
    <description>&lt;p&gt;Zend vient d&amp;#8217;annoncer la disponibilité de leur certification pour PHP 5.3. On peut en comprendre que l&amp;#8217;adoption à grande échelle de la dernière version du langage par les entreprises est proche. Parallèlement, les secondes versions des frameworks Zend et Symfony sont en phase active de développement et annoncent qu&amp;#8217;ils sont conçus pour cette version de PHP et les suivantes&amp;#160;: ils utiliseront abondamment des fonctionnalités qui n&amp;#8217;existent qu&amp;#8217;à partir de PHP 5.3.&lt;/p&gt;
&lt;p&gt;Ces frameworks passent en nouvelles versions majeures et on annonce déjà quelques migraines pour ceux qui envisagent de migrer. On est donc en pleine période de flottement, et je me suis posé quelques questions sur les choix à notre disposition pour commencer un projet.&lt;/p&gt;    &lt;h3&gt;Le contexte&lt;/h3&gt;
&lt;p&gt;Au bureau des étudiants de l&amp;#8217;Insa, l&amp;#8217;équipe des &amp;#8220;Orgas IF&amp;#8221; (informaticiens) est en pleine ébullition&amp;#160;: des développements d&amp;#8217;applications spécifiques sont à l&amp;#8217;ordre du jour, et dans l&amp;#8217;idéal, si ces applications pouvaient tenir un paquet d&amp;#8217;années, ça serait bien. Il faut dire que l&amp;#8217;infrastructure informatique du BDE à de quoi faire pâlir la &amp;#8220;DSI&amp;#8221; de quelques PME (j&amp;#8217;espère que certains se feront un plaisir de confirmer dans les commentaires, sait-on jamais&amp;#160;!) et que tout le monde a à cœur d&amp;#8217;être efficace. En bref, au BDE, on veut mettre à profit le talent des futurs ingénieurs en informatique pour proposer des outils de gestion aux principales manifestations que l&amp;#8217;association encadre.&lt;/p&gt;
&lt;p&gt;On en arrive à un point où nos applications (de gestion) seront développées en client léger, et PHP est la technologie retenue&amp;#160;: open-source (comprendre, les libristes sont contents et le budget n&amp;#8217;explose pas), les compétences sont là et la mise en place se fait rapidement. On veut faire les choses bien, développer des applications stables et qui tiendront la route, on pense donc à utiliser un framework&amp;#160;: CakePHP semble avoir été abandonné, personne ne connait Code Igniter, on en est donc à Zend ou Symfony&amp;#160;?&lt;/p&gt;
&lt;h3&gt;PHP 5.3 pose-t-il problème&amp;#160;?&lt;/h3&gt;
&lt;p&gt;PHP 5.3 est arrivé &lt;a hreflang=&quot;en&quot; href=&quot;http://www.php.net/archive/2009.php#id2009-06-30-1&quot;&gt;le 30 juin 2009&lt;/a&gt;, avec le support du concept de &lt;em&gt;namespaces&lt;/em&gt; et des &lt;em&gt;fonctions anonymes&lt;/em&gt; comme premières grandes nouveautés. Zend Framework 2, tout comme Symfony 2 sont conçus pour PHP 5.3&amp;#160;: l&amp;#8217;organisation des classes des deux projets reposera sur l&amp;#8217;utilisation des namespaces, et l&amp;#8217;architecture de Symfony 2 place le pattern &lt;em&gt;Dependency Injection&lt;/em&gt; (cher à Fabien Potencier) comme concept central, celui-ci repose sur les fonctions anonymes (Edit 16/10&amp;#160;: la Dependency Injection ne repose pas sur les fonctions lambda, il &lt;em&gt;peut éventuellement&lt;/em&gt; les utiliser).&lt;/p&gt;
&lt;p&gt;Devoir maintenir nos serveurs vers une version à jour de PHP n&amp;#8217;est pas un souci. Au contraire, on en est à la troisième mineure de PHP 5.3 et le tout est suffisamment stable pour sauter le pas. D&amp;#8217;autant plus que d&amp;#8217;après Pascal Martin, on appréciera &lt;a hreflang=&quot;fr&quot; href=&quot;http://blog.pascal-martin.fr/post/bench-php-5.2-vs-php-5.3-cpu&quot;&gt;un gain sensible en terme de performances&lt;/a&gt;. La question de PHP 5.3 est réglée.&lt;/p&gt;
&lt;h3&gt;Zend, Symfony&amp;#160;? Symfony, Zend&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Le problème, c&amp;#8217;est que Symfony 2 est prévu pour Mars 2011, Zend Framework pour (il me semble) un vague &amp;#8220;fin 2010&amp;#8221;, et que le choix d&amp;#8217;un framework, tout comme le début de nos développements, doit se faire à peu près maintenant.&lt;/p&gt;
&lt;p&gt;Symfony 2 est une réécriture intégrale, je pense qu&amp;#8217;une migration de Symfony 1 vers 2 est presque impossible&amp;#160;: même Doctrine passe en version 2 et d&amp;#8217;après ce que j&amp;#8217;en ai vu (&lt;a hreflang=&quot;en&quot; href=&quot;http://www.doctrine-project.org/blog/php-5-3-and-doctrine-2-0-teaser&quot;&gt;notamment dans le billet teaser&lt;/a&gt;) on peut considérer que la rupture de compatibilité est effectivement au rendez-vous. J&amp;#8217;avais un peu plus d&amp;#8217;espoir avec Zend Framework 2&amp;#160;: une rupture de compatibilité s&amp;#8217;impose par l&amp;#8217;apparition des namespaces, mais l&amp;#8217;outil de Ralph Schindler (&lt;a hreflang=&quot;en&quot; href=&quot;http://github.com/ralphschindler/PHPTools&quot;&gt;PHP Tools&lt;/a&gt;) semblait faciliter le pas. Mais ça ne suffira pas&amp;#160;: des packages risquent d&amp;#8217;être renommés, et ceux-ci vont effectivement évoluer. A en voir l&amp;#8217;introduction du &lt;a hreflang=&quot;en&quot; href=&quot;http://framework.zend.com/wiki/display/ZFDEV2/Zend+Framework+2.0+Requirements&quot;&gt;Zend Framework 2 requirements&lt;/a&gt;, les choses vont bouger.&lt;/p&gt;
&lt;p&gt;Symfony 1.4 sera supporté jusque novembre 2012. et je n&amp;#8217;ai pas réussi à trouver des informations claires au sujet de ZF 1.10. J&amp;#8217;ai l&amp;#8217;impression que deux ans de support pour symfony 1.4 ne seront clairement pas suffisants&amp;#160;: si on veut faire les choses proprement, ça n&amp;#8217;est pas pour recommencer de zéro dans deux ans. Et à vrai dire, j&amp;#8217;aimerai bien qu&amp;#8217;un expert me parle un peu de la migration d&amp;#8217;une mineure à l&amp;#8217;autre avec Symfony 1&amp;#160;: j&amp;#8217;ai vu de gros changements (Forms framework, changement de l&amp;#8217;ORM par défaut) et des docs qui avaient du mal à suivre (nous n&amp;#8217;avons ni les moyens ni le temps de suivre de véritables formations).&lt;/p&gt;
&lt;p&gt;Là, je suis coincé et j&amp;#8217;en arrive au titre du billet&amp;#160;: peut-on commencer un projet avec Symfony 1.4 ou ZendFramework 1.10 dans l&amp;#8217;état actuel des choses, au risque de devoir reprendre une grosse part de nos développements d&amp;#8217;ici quelques mois ou années pour pouvoir ensuite apporter des évolutions fonctionnelles à nos productions&amp;#160;?&lt;/p&gt;
&lt;h3&gt;Peut-on commencer à travailler avec les futures versions&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Un petit avant-propos&amp;#160;: je n&amp;#8217;ai pas eu le temps de suivre les mailing-lists, wiki et autres lieux de discussion de la communauté. Je risque donc de dire quelques bêtises sur certains aspects (notamment sur les points précis des changements à attendre). N&amp;#8217;hésitez pas à me corriger dans les commentaires.&lt;/p&gt;
&lt;p&gt;On est à peu près à un semestre d&amp;#8217;une version stable de chacun des deux frameworks (j&amp;#8217;ai du mal à croire à un ZF2 stable avant 2011). La &lt;a hreflang=&quot;en&quot; href=&quot;http://framework.zend.com/issues/browse/ZF?report=com.atlassian.jira.plugin.system.project:roadmap-panel#selectedTab=com.atlassian.jira.plugin.system.project%3Aroadmap-panel&quot;&gt;roadmap du ZendFramework&lt;/a&gt; me semble être une bonne source d&amp;#8217;informations pour faire un état des lieux. De nombreuses tâches impliquant des renommages de méthodes ou de classes (y compris dans le Bootstrap, aïe) semblent prévues, c&amp;#8217;est plutôt mauvais signe.&lt;/p&gt;
&lt;p&gt;Côté Symfony, il me semble que les fondations sont plutôt stables et que les grandes lignes ne bougeront plus (il y a déjà pas mal de doc à ce sujet sur &lt;a hreflang=&quot;en&quot; href=&quot;http://docs.symfony-reloaded.org&quot;&gt;Symfony-Reloaded&lt;/a&gt;). Mais les récents mouvements sur le dépôt du projet semblent indiquer que de nombreux composants ne sont pas encore développés&amp;#160;: c&amp;#8217;est clairement en plein travaux et j&amp;#8217;ai du mal à croire qu&amp;#8217;on puisse commencer à construire un projet sans manquer de matière.&lt;/p&gt;
&lt;p&gt;Autant dire tout de suite qu&amp;#8217;on risque d&amp;#8217;avoir pas mal de boulot pour migrer d&amp;#8217;une version non stable à une finale en plein pic de travail sur le fonctionnel. Il est bien trop tôt pour envisager de travailler avec ces versions.&lt;/p&gt;
&lt;h3&gt;Comment envisager l&amp;#8217;avenir avec les versions actuelles&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Il me semble avoir compris que symfony 1.4 sera la dernière mineure de la branche 1.x, il ne faudrait donc pas s&amp;#8217;attendre à plus que des corrections de bugs et de failles. Zend Framework 1.11 semble lui avoir un avenir&amp;#160;: la roadmap prévoit une mineure suivant la 1.10 (ou peut-être ai-je mal compris). Mais peut-être repousse-t-on le problème&amp;#160;?&lt;/p&gt;
&lt;p&gt;Le problème est-il pris par le bon bout&amp;#160;? Finalement, peut-être qu&amp;#8217;on a complétement loupé les critères sur lesquels faire notre choix. Pour l&amp;#8217;instant, je pense qu&amp;#8217;il faudra, selon le contexte et les besoins de l&amp;#8217;application, choisir l&amp;#8217;un des frameworks dans une version stable et faire l&amp;#8217;impasse sur les questions relatives au long terme.&lt;/p&gt;
&lt;p&gt;Il me reste deux questions pour lesquelles je pense manquer de recul pour répondre&amp;#160;: Les migrations vers de nouvelles versions sont-elles nécessaires&amp;#160;? Quel est l&amp;#8217;apport d&amp;#8217;une migration sur un projet&amp;#160;?&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Peut-on-commencer-un-projet-avec-Zend-Framework-ou-Symfony#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Peut-on-commencer-un-projet-avec-Zend-Framework-ou-Symfony#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/173</wfw:commentRss>
      </item>
    
  <item>
    <title>MySQL : activer/désactiver une contrainte d'unicité sur certains tuples</title>
    <link>http://www.martiusweb.net/post/MySQL-activer-desactiver-contrainte-unicite-UNIQUE</link>
    <guid isPermaLink="false">urn:md5:0df646cc54a32bb0375b1ccbd2c2315a</guid>
    <pubDate>Sat, 21 Aug 2010 12:52:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Programmation PHP</category>
        <category>bases de données</category><category>définition de données</category><category>MySQL</category><category>optimisation</category><category>programmation</category>    
    <description>&lt;p&gt;La situation n&amp;#8217;est pas courante, mais elle peut arriver&amp;#160;: dans une table de votre base de données, vous souhaitez vérifier qu&amp;#8217;une valeur est unique, mais seulement dans certains cas. Il existe un moyen plus simple que de tordre son modèle pour obtenir ce résultat. La solution n&amp;#8217;est pas miraculeuse mais a le mérite d&amp;#8217;être assez simple à mettre en œuvre.&lt;/p&gt;    &lt;p&gt;Imaginons un modèle un peu bateau&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;une table de véhicules, dont certains n&amp;#8217;acceptent qu&amp;#8217;un occupant, d&amp;#8217;autres plusieurs,&lt;/li&gt;
&lt;li&gt;une table d&amp;#8217;usagers, tous présents dans un et un seul véhicule.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On obtient un schéma semblable à celui-ci&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;(table) véhicule&amp;#160;:
&lt;ul&gt;&lt;li&gt;id_véhicule (clé primaire)&lt;/li&gt;
&lt;li&gt;nom_véhicule&lt;/li&gt;
&lt;li&gt;&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(table) usager&amp;#160;:
&lt;ul&gt;&lt;li&gt;id_usager (clé primaire)&lt;/li&gt;
&lt;li&gt;id_véhicule (clé étrangère)&lt;/li&gt;
&lt;li&gt;nom_usager&lt;/li&gt;
&lt;li&gt;&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il est impossible, avec ce schéma, de vérifier si un véhicule ne devant accueillir qu&amp;#8217;un seul usager ne dépasse pas sa capacité&amp;#160;: il faut vérifier que l&amp;#8217;identifiant de ce véhicule (id_véhicule) ne soit présent qu&amp;#8217;une fois dans la table. Ajouter une contrainte d&amp;#8217;unicité sur notre table usager interdirait de fait d&amp;#8217;avoir des véhicules accueillant plusieurs usagers.&lt;/p&gt;
&lt;p&gt;On peut aussi ajouter un champ id_usager, qui serait une clé étrangère dans notre table véhicule, qui ne serait renseignée que pour les véhicules monoplaces. Mais on se retrouve à devoir vérifier dans les deux tables (véhicule et usager) pour obtenir notre ou nos usager(s).&lt;/p&gt;
&lt;p&gt;L&amp;#8217;autre solution que j&amp;#8217;ai rencontrée avec Magento (et plus précisément dans la gestion des règles de promotion associées à un ou plusieurs coupons de réduction) consiste à conditionner l&amp;#8217;activation de la contrainte d&amp;#8217;unicité à la valeur d&amp;#8217;un champ. La méthode est simple&amp;#160;: dans notre cas, on placera la contrainte d&amp;#8217;unicité sur le champ id_vehicule et un nouveau champ qu&amp;#8217;on appellera exclusif. Si la valeur de ce champ exclusif est NULL, alors l&amp;#8217;absence de valeur rend impossible de tester la l&amp;#8217;unicité des valeurs de se couple. Si la valeur de ce champ est donnée (il faut qu&amp;#8217;elle soit unique, j&amp;#8217;y reviens plus bas) alors la contrainte d&amp;#8217;unicité est activée et l&amp;#8217;identifiant du véhicule est contrôlé.&lt;/p&gt;
&lt;p&gt;Cette méthode permet d&amp;#8217;obtenir la liste des utilisateurs en effectuant la requête sur la seule table usager, et c&amp;#8217;est là sont principal intérêt&amp;#160;: on obtient des meilleurs performances à la lecture. En contrepartie, le schéma de la base conserve une valeur de plus.&lt;/p&gt;
&lt;p&gt;J&amp;#8217;ai quelques doutes sur l&amp;#8217;intérêt de cette méthode&amp;#160;: pour moi il s&amp;#8217;agit essentiellement d&amp;#8217;une manière de modifier les contraintes métier d&amp;#8217;un système associé à un schéma de base de données existant. D&amp;#8217;ailleurs, dans la mesure ou notre champ exclusif pourra souvent accueillir plusieurs valeurs, la contrainte d&amp;#8217;unicité n&amp;#8217;est que partielle. Dans Magento, le champ est de type tinyint(1), il est donc possible d&amp;#8217;associer 10 &amp;#8220;usagers&amp;#8221; à un véhicule supposément réservé à un seul.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/MySQL-activer-desactiver-contrainte-unicite-UNIQUE#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/MySQL-activer-desactiver-contrainte-unicite-UNIQUE#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/171</wfw:commentRss>
      </item>
    
  <item>
    <title>Utiliser Bayes pour développer un filtre anti-spam</title>
    <link>http://www.martiusweb.net/post/Utiliser-Bayes-pour-un-filtre-anti-spam</link>
    <guid isPermaLink="false">urn:md5:c0ef7b1cf33fffef34ad23f573f0d3ff</guid>
    <pubDate>Thu, 29 Jul 2010 14:00:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>algorithme</category><category>anti-spam</category><category>bayes</category><category>probabilités</category><category>programmation</category>    
    <description>&lt;p&gt;En révisant mes cours de probabilités, je me suis dit qu&amp;#8217;un bon petit exercice pour une application concrète à l&amp;#8217;informatique pourrait être de réaliser un filtre anti-spam utilisant une méthode désormais courante&amp;#160;: le filtre de Bayes (dans une version naïve). Je vais essayer d&amp;#8217;expliquer la théorie, et qui sait, peut-être proposer une implémentation&amp;#8230; un peu plus tard&amp;#160;!&lt;/p&gt;    &lt;h3&gt;La formule de Bayes&lt;/h3&gt;
&lt;p&gt;La formule de Bayes (de Thomas Bayes, qui l&amp;#8217;a trouvée) se base sur la notion de probabilité conditionnelle, c&amp;#8217;est à dire, la probabilité qu&amp;#8217;un évènement se produise sachant qu&amp;#8217;un autre s&amp;#8217;est produit. Nous allons nous intéresser à un cas particulier de cette formule, vous pouvez vous intéresser aux détails sur &lt;a hreflang=&quot;fr&quot; href=&quot;http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Bayes&quot;&gt;l&amp;#8217;article Théorème de Bayes de Wikipedia&lt;/a&gt;. Par ailleurs, je me suis inspiré de &lt;a hreflang=&quot;en&quot; href=&quot;http://en.wikipedia.org/wiki/Bayesian_spam_filtering&quot;&gt;l&amp;#8217;article Bayesian spam filtering sur de wikipedia&lt;/a&gt; également.&lt;/p&gt;
&lt;p&gt;Considérons l&amp;#8217;ensemble des messages que l&amp;#8217;on peut les répartir en deux catégories&amp;#160;: les &lt;em&gt;spams&lt;/em&gt; et les &lt;em&gt;hams&lt;/em&gt; (non-spams). L&amp;#8217;un est le complément de l&amp;#8217;autre, c&amp;#8217;est à dire que tout message est dans l&amp;#8217;une et une seule des deux catégories.&lt;/p&gt;
&lt;p&gt;Considérons ensuite l&amp;#8217;évènement &amp;#8220;le message contient le mot &lt;em&gt;foo&lt;/em&gt;&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Nous cherchons à déterminer la probabilité que le message soit un spam, sachant qu&amp;#8217;il contient le mot &lt;em&gt;foo&lt;/em&gt; (on notera cette probabilité &lt;em&gt;Ps&lt;/em&gt;). Pour pouvoir écrire la formule facilement on notera ainsi&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;p(foo/spam), la probabilité que dans un message on trouve le mot &amp;#8220;&lt;em&gt;foo&lt;/em&gt;&amp;#8221; sachant que c&amp;#8217;est un spam,&lt;/li&gt;
&lt;li&gt;p(spam), la probabilité qu&amp;#8217;un message soit un spam,&lt;/li&gt;
&lt;li&gt;p(foo/ham), la probabilité que l&amp;#8217;on trouve le mot &amp;#8220;&lt;em&gt;foo&lt;/em&gt;&amp;#8221; dans un ham,&lt;/li&gt;
&lt;li&gt;p(ham), la probabilité qu&amp;#8217;un message ne soit pas un spam.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On a alors&amp;#160;:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Ps = {p(foo/spam) times p(spam)} over {p(foo/spam) times p(spam) + p(foo/ham) times p(ham)}&quot; alt=&quot;&quot; src=&quot;http://www.martiusweb.net/public/articles/bayes/bayes1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nous obtenons donc une sorte de &amp;#8220;valeur potentielle d&amp;#8217;un mot comme spam&amp;#8221;, mais notre filtre ne peut pas se baser sur l&amp;#8217;analyse d&amp;#8217;un seul mot. Il faut donc effectuer ce calcul sur chaque mot d&amp;#8217;un message et évaluer le &amp;#8220;potentiel de spam&amp;#8221; de ce message.&lt;/p&gt;
&lt;p&gt;En réalité, on va exclure les mots &amp;#8220;neutres&amp;#8221; dont la probabilité calculée avoisine les 0.5, c&amp;#8217;est à dire qu&amp;#8217;il y a presque autant de chance que ce mot soit contenu dans un spam que dans un ham. On s&amp;#8217;intéressera en fait à une liste restreinte de mots, ceux dont la probabilité est proche de 0 (n&amp;#8217;est presque jamais dans un spam) ou de 1(presque toujours dans un spam).&lt;/p&gt;
&lt;p&gt;Pour calculer le potentiel de spam, nous allons considérer (naïvement) que les mots sont indépendants dans un message, ce qui est naturellement faux, puisque les mots constituent des phrases et sont liés les uns aux autres. On utilisera la formule suivante&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;P = {Ps times Ps2 times ... times PsN} over {Ps times Ps2 times ... times PsN + (1-Ps) times (1-Ps2) times ... times (1-PsN)}&quot; alt=&quot;&quot; src=&quot;http://www.martiusweb.net/public/articles/bayes/bayes2.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On a au numérateur le produit des probabilités qu&amp;#8217;un mot du message soit dans un spam (d&amp;#8217;après les calculs précédents).&lt;/p&gt;
&lt;p&gt;Au dénominateur on a ce même produit additionné au produit des probabilités contraires (la probabilité que le mot ne soit pas dans un spam).&lt;/p&gt;
&lt;p&gt;Si un mot est présent plusieurs fois dans le message analysé, on peut inclure sa valeur plusieurs fois dans la formule, pour la rendre plus juste.&lt;/p&gt;
&lt;h3&gt;Cette méthode est naïve&amp;#160;!&lt;/h3&gt;
&lt;p&gt;Cette méthode est assez naïve puisqu&amp;#8217;elle se base sur un certain nombre de suggestions fausses. Il est alors possible de tromper le filtre en insérant de nombreux mots dont la valeur de spam est très faible afin de fausser le calcul. Afin d&amp;#8217;améliorer encore un peu plus notre algorithme, nous pourrions considérer des chaînes de mots plutôt que des mots, permettant de mieux considérer le contexte.&lt;/p&gt;
&lt;p&gt;Par exemple, si le mot &amp;#8220;viagra&amp;#8221; est très souvent contenu dans un spam, le mot &amp;#8220;amour&amp;#8221; sera (idéalement&amp;#160;!) dans un ham. Pourtant &amp;#8220;amour avec viagra&amp;#8221; ne fait pas de doute sur sa qualité de &amp;#8220;mot à spam&amp;#8221;.&lt;/p&gt;
&lt;h3&gt;Feed the filter&lt;/h3&gt;
&lt;p&gt;Il est impossible de connaître par avance les valeurs potentielles de spam de tous les mots que l&amp;#8217;on trouvera dans une boîte mail, il va donc falloir éduquer le filtre.&lt;/p&gt;
&lt;p&gt;Le principe est donc de constituer une base de données contenant les mots considérés et leur fréquence dans des messages que l&amp;#8217;utilisateur aura enregistré comme spams et non spams.&lt;/p&gt;
&lt;p&gt;On doit donc enregistrer&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;le mot,&lt;/li&gt;
&lt;li&gt;le nombre de fois ou le mot a été trouvé dans un spam,&lt;/li&gt;
&lt;li&gt;le nombre de fois ou le mot a été trouvé dans un ham,&lt;/li&gt;
&lt;li&gt;le nombre total de spams analysés,&lt;/li&gt;
&lt;li&gt;le nombre total de hams analysés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On obtient p(foo/spam) (la probabilité que le mot &lt;em&gt;foo&lt;/em&gt; soit dans un spam) en divisant le nombre de fois où le mot a été trouvé dans un spam par le nombre de spams analysés. p(foo/ham) s&amp;#8217;obtient de la même manière.&lt;/p&gt;
&lt;h3&gt;Le problème des mots inconnus&lt;/h3&gt;
&lt;p&gt;Bien souvent, un e-mail contiendra un mot inconnu&amp;#160;: soit parce que la base de données n&amp;#8217;est pas encore suffisamment complète, soit parce que le mot est mal orthographié. Nous ne connaissons alors pas la probabilité qu&amp;#8217;un tel mot soit contenu dans un spam, et pire, notre potentiel de spam Ps devient incalculable et n&amp;#8217;a pas de sens (la probabilité que le mot soit dans un spam est nulle&amp;#8230; tout comme la probabilité qu&amp;#8217;il soit dans un ham&amp;#160;!).&lt;/p&gt;
&lt;p&gt;La seule solution qui s&amp;#8217;offre à nous et d&amp;#8217;exclure ce mot de nos calculs et de le compter une fois que le statut du message qui le contient est connu.&lt;/p&gt;
&lt;h3&gt;Passer à l&amp;#8217;implémentation&lt;/h3&gt;
&lt;p&gt;Nous avons maintenant une bonne base théorique, et c&amp;#8217;est suffisant pour proposer un filtre naïf capable de nous donner des valeurs qualifiant le potentiel de spam d&amp;#8217;un message. Il nous reste maintenant à choisir des valeurs initiales, et à regarder les limites de ce filtre.&lt;/p&gt;
&lt;p&gt;Nous devons réfléchir aux valeurs &lt;em&gt;p(spam)&lt;/em&gt; et &lt;em&gt;p(ham)&lt;/em&gt;, respectivement probabilités qu&amp;#8217;un message soit un spam ou non. On peut utiliser les valeurs enregistrées dans notre base&amp;#160;: &lt;em&gt;p(spam)&lt;/em&gt; correspond aux nombre de messages collectés comme spam sur le nombre total de messages analysés. Cependant, ces valeurs seront très certainement incohérentes dans un premier temps (le filtre n&amp;#8217;a pas suffisamment appris). Je suggère de considérer qu&amp;#8217;en dessous d&amp;#8217;un certain nombre de messages analysés, le filtre sera neutre et considérera que &amp;#8220;globalement&amp;#8221;, la proportions de spams et de ham est identique&amp;#160;: &lt;em&gt;p(spam)=p(ham)=0,5&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Nous devrons également choisir la valeur P (entre 0 et 1) à partir de laquelle on considérera que le message analysé est un spam. Plus la valeur sera proche de 0, plus le filtre sera sévère. Un environnement peu spammé peut se contenter d&amp;#8217;un seuil à 0,5, sur un formulaire en ligne ou une adresse e-mail de contact, prendre un seuil plus bas (0,3 ou 0,4) sera plus efficace.&lt;/p&gt;
Il faut bien comprendre que notre filtre sera parfaitement inutile sans une phase d&amp;#8217;apprentissage consistante&amp;#160;: nous devons déterminer une base conséquente de mots dont la probabilité de présence dans un spam sera vraiment élevée. Il est toujours possible de commencer avec une liste noire de mots dont la probabilité &lt;em&gt;p(mot/spam)&lt;/em&gt; sera fixée à une valeur élevée (0,8-0,9).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;De nombreux systèmes anti-spam reposent sur cette technique, même si les formules sont souvent adaptées et pondérées pour être ajustés à la réalité. On pourra, je pense, utiliser la version présentée dans cette article dans un environnement moyennement spammé comme un blog.&lt;/p&gt;
&lt;p&gt;Soyons tout de même attentif, lors de l&amp;#8217;implémentation, aux performances&amp;#160;: notre base de données risque de gonfler très rapidement&amp;#160;!&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Utiliser-Bayes-pour-un-filtre-anti-spam#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Utiliser-Bayes-pour-un-filtre-anti-spam#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/164</wfw:commentRss>
      </item>
    
  <item>
    <title>Ne sacrifiez pas votre code !</title>
    <link>http://www.martiusweb.net/post/Ne-sacrifiez-pas-votre-code</link>
    <guid isPermaLink="false">urn:md5:0f7cf4da315ba966c98dea072fae2e83</guid>
    <pubDate>Sun, 11 Apr 2010 16:20:00 +0200</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>accessibilité</category><category>balises</category><category>référencement</category><category>réseau</category><category>SEO</category><category>W3C</category><category>xhtml</category>    
    <description>&lt;p&gt;Google vient d&amp;#8217;exciter les fous-furieux de la SEO (ces gens qui veulent toujours optimiser une page web pour la faire grimper dans les résultats de recherches). Les ingénieurs de la firme ont annoncé qu&amp;#8217;à partir de maintenant, l&amp;#8217;algorithme de calcul de pertinence, choisissant l&amp;#8217;ordre dans lequel les résultats sont affichés, allait tenir compte de la &amp;#8220;vitesse de la page&amp;#8221;. Tout de suite, tout le monde s&amp;#8217;emballe, on annonce tout et surtout n&amp;#8217;importe quoi. Faisons un peu de tri&amp;#8230;&lt;/p&gt;    &lt;h3&gt;Analysons un peu l&amp;#8217;annonce&lt;/h3&gt;
&lt;p&gt;Je disais donc que Google venait d&amp;#8217;annoncer que la vitesse de la page allait être prise en compte dans les calculs de pertinence de résultats. C&amp;#8217;est ce qu&amp;#8217;on entend et lit à répétition sur divers blogs et sites internet d&amp;#8217;information. Pour autant, l&amp;#8217;annonce, sous cette forme, manque cruellement de précision.&lt;/p&gt;
&lt;p&gt;La vitesse d&amp;#8217;une page est une notion qui n&amp;#8217;a presque aucun sens si on ne lui apporte pas un peu de nuance&amp;#160;: une première distinction que l&amp;#8217;on peut faire concerne la différence entre la vitesse côté serveur et côté client. Pour le serveur, la vitesse de la page correspond à la vitesse à laquelle la requête HTTP va être analysée, la page générée, renvoyée et le temps que le volume de données soit reçu par le client. Si on s&amp;#8217;intéresse maintenant au &amp;#8220;côté client&amp;#8221;, on aura le délai nécessaire pour que la page soit reçue (l&amp;#8217;aspect réseau est donc à cheval entre les deux côtés) et le temps qu&amp;#8217;il faudra pour que la page soit interprétée et affichée par le navigateur. Pour le client, une page affichée ne correspond que très rarement à un seul aller-retour entre son poste et le serveur&amp;#160;: les feuilles de styles, fichiers sources javascript et images sont autant de requêtes qui devront être traitées.&lt;/p&gt;
&lt;p&gt;Il serait bon de savoir ce que les &lt;em&gt;crawlers&lt;/em&gt; de Google seront effectivement en mesure d&amp;#8217;analyser&amp;#160;: les mesures de vitesse seront-elles empiriques ou théoriques&amp;#160;? Quels facteurs parmi ceux que je viens de citer seront concernés&amp;#160;? La vitesse pour google est-elle la même que pour le visiteur, le vrai, humain&amp;#160;?&lt;/p&gt;
&lt;h3&gt;Ce qui va changer&lt;/h3&gt;
&lt;p&gt;D&amp;#8217;après les chiffres que j&amp;#8217;ai pu lire dans l&amp;#8217;&lt;a hreflang=&quot;en&quot; href=&quot;http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html&quot;&gt;annonce officielle&lt;/a&gt;, le paramètre vitesse affecte environ 1% des résultats de recherche (sur l&amp;#8217;index actuel, c&amp;#8217;est à dire, avec les pages telles qu&amp;#8217;elles sont aujourd&amp;#8217;hui). La pondération de ce paramètre sera d&amp;#8217;ailleurs particulièrement faible en comparaison des critères de pertinence du contenu.&lt;/p&gt;
&lt;p&gt;Le bon côté, c&amp;#8217;est qu&amp;#8217;il est probable que les pages immondes au possible des gros sites &lt;em&gt;corporate&lt;/em&gt; (allez, au hasard, orange.fr, voyages-sncf.com, &amp;#8230;) subissent à un moment ou à un autre un remaniement vers le mieux, grâce à l&amp;#8217;orgueil blessé de leurs concepteurs&amp;#160;; autant dire que pour l&amp;#8217;instant, malgré les nombreux reproches des utilisateurs, rien n&amp;#8217;a bougé, je n&amp;#8217;ai donc pas beaucoup d&amp;#8217;espoir sur ce point.&lt;/p&gt;
&lt;p&gt;Ce que j&amp;#8217;aime beaucoup moins, ce sont les nombreux risques de dérives portées par les bouchers de l&amp;#8217;optimisation&amp;#160;: on coupe dans la conception, le code et on nettoie par le vide, autant que possible, pour ne garder que des bouts. C&amp;#8217;est le point essentiel de mon article, et j&amp;#8217;y reviens dans un instant.&lt;/p&gt;
&lt;p&gt;Enfin, l&amp;#8217;utilisateur sera peut-être gagnant si les développeurs s&amp;#8217;emploient effectivement à améliorer les performances de leurs pages, mais le grand gagnant est -comme toujours- Google. Je pense vraiment que ce nouveau choix technique a pour but d&amp;#8217;inciter les développeurs à effectivement améliorer &amp;#8220;la vitesse des pages&amp;#8221;, et ces petites améliorations qui s&amp;#8217;accumulent, représenteront un gain de ressources et d&amp;#8217;immobilisation de leurs serveurs qui ne se néglige pas.&lt;/p&gt;
&lt;h3&gt;Le code sacrifié sur l&amp;#8217;autel du grand G.&lt;/h3&gt;
&lt;p&gt;On est maintenant au fond de mon propos&amp;#160;: pour de multiples raisons j&amp;#8217;ai peur que cette annonce entraîne des pratiques contre-productives pour la majorité d&amp;#8217;entre nous (je veux dire, nous utilisateurs d&amp;#8217;internet, pas seulement nous les développeurs web).&lt;/p&gt;
&lt;p&gt;Pour aider les développeurs à optimiser leurs pages pour gagner des micropoints auprès des robots, de nombreux outils d&amp;#8217;analyse et de &lt;em&gt;benchmarking&lt;/em&gt; sont à notre disposition. Ceux-ci apportent de nombreux conseils,&amp;nbsp; mais qui, définitivement, ne nous concernent pas tous. C&amp;#8217;est au concepteur de connaître le véritable intérêt des différents critères d&amp;#8217;analyse proposés par ces outils. Pour donner un petit exemple&amp;#160;: &lt;em&gt;Yahoo! Slow&lt;/em&gt; suggère d&amp;#8217;utiliser des &lt;em&gt;Content Delivery Network&lt;/em&gt; (côté &lt;em&gt;Google Page Speed&lt;/em&gt; on est un peu plus sobre est on suggère de &amp;#8220;paralléliser les téléchargements grâce à l&amp;#8217;utilisation de plusieurs domaines&amp;#8221;). Je devrais faire quelques tests pour compléter ma connaissance du sujet, mais ma première réaction est &amp;#8220;Mes problèmes ne sont pas ceux de G. et/ou Y!&amp;#8221;&amp;#160;: à l&amp;#8217;échelle de ce modeste site, par exemple, ai-je un intérêt à doubler mon parc de serveurs (j&amp;#8217;en ai un seul), simplement pour transférer plus rapidement les quelques images et feuilles de styles qui composent la page&amp;#160;?&lt;/p&gt;
&lt;p&gt;Par ailleurs, cette règle &lt;em&gt;(màj&amp;#160;: paralléliser les téléchargements grâce à plusieurs domaines)&lt;/em&gt; contredit celle qui me suggère de minimiser le nombre de domaines utilisés pour réduire le nombre de requêtes DNS&amp;#8230;&lt;/p&gt;
&lt;p&gt;Le pire n&amp;#8217;est pas proposé par ces outils&amp;#160;: il y a le concept du &lt;em&gt;tuning&lt;/em&gt; de code, prôné par exemple par &lt;em&gt;HTMLminify&lt;/em&gt;. Le principe est assez simple&amp;#160;: minimiser au possible le poids de la page, d&amp;#8217;une part en supprimant les caractères inutiles (espaces, commentaires, etc), et d&amp;#8217;autre part en s&amp;#8217;affranchissant des règles syntaxiques et des standards, en supprimant par exemple les balises les plus élémentaires et qui n&amp;#8217;ont pas d&amp;#8217;impact direct sur l&amp;#8217;affichage&amp;#160;: &lt;del&gt;DocType&lt;/del&gt;, balises de fermantes et même la balise &amp;lt;html&amp;gt;&amp;#160;!&lt;/p&gt;
&lt;p&gt;D&amp;#8217;une part, on sacrifie la qualité du code&amp;#160;: lisibilité, facilité de maintenance, debbugage, etc. Ces problèmes n&amp;#8217;existent plus si on adopte une stratégie de mise en production avec pré-compilation, ces optimisations extrêmes n&amp;#8217;apparaissent plus sur le code manipulé en développement.&lt;/p&gt;
&lt;p&gt;Par contre, d&amp;#8217;autres soucis bien plus dangereux ne disparaissent pas. On casse le caractère standard du code, au risque de rendre la page illisible par de nombreux navigateurs. On se dira qu&amp;#8217;à priori on peut se débrouiller pour obtenir la même interprétation de la part des différents navigateurs. C&amp;#8217;est sans compter sur la multiplication des nouveaux terminaux mobiles&amp;#160;; et il est fort possible que les prochains navigateurs adoptent des stratégies d&amp;#8217;analyse plus proches des standards, et que les résultats deviennent très surprenant à l&amp;#8217;avenir. Je vous laisse imaginer les coûts de maintenance. On peut ajouter les navigateurs accessibles qui utilisent de nombreuses informations contenues dans la page pour permettre à une personne souffrant d&amp;#8217;un handicap de consulter un site internet, ces informations ne sont souvent pas utilisées sur d&amp;#8217;autres navigateurs.&lt;/p&gt;
&lt;p&gt;Pour les autres outils d&amp;#8217;analyse, comme les &lt;em&gt;parsers&lt;/em&gt; XML, on peut directement abandonner toute chance de s&amp;#8217;en sortir.&lt;/p&gt;
&lt;p&gt;Enfin, ces optimisations permettent de minimiser le poids de la page, et donc le temps de transit sur le réseau. Par contre, une fois la page arrivée chez le client, le résultat devient clairement contre-productif&amp;#160;: le navigateur devra interpréter la page en &lt;em&gt;Quirks mode&lt;/em&gt;, et utilisera nettement plus de ressource pour essayer de nettoyer, corriger et transformer le code de manière à le rendre conforme aux règles syntaxiques&amp;#160;: c&amp;#8217;est du temps perdu pour que la page soit affichée. &lt;/p&gt;
&lt;p&gt;La discussion à se sujet est déjà en cours sur &lt;a hreflang=&quot;fr&quot; href=&quot;http://blog.sitxpress.com/htmlminify-mort-standards-w3c&quot;&gt;Sitxpress&lt;/a&gt;, où &lt;a hreflang=&quot;fr&quot; href=&quot;http://blog.sitxpress.com/htmlminify-mort-standards-w3c/#comment-604&quot;&gt;le commentaire de mon ami Adrian&lt;/a&gt; reformule mon propos.&lt;/p&gt;
&lt;p&gt;Nous avons donc réfléchi au point de vue des développeurs, des moteurs de recherche, des utilisateurs. Il reste encore deux catégories d&amp;#8217;acteurs qui ne doivent pas être oubliées. D&amp;#8217;une part, les chercheurs du W3C&amp;#160;: ceux-ci utilisent toute leur énergie pour standardiser le web, le rendre accessible et le faire évoluer. Sacrifier les standards, c&amp;#8217;est aussi un peu sacrifier leur travail. D&amp;#8217;autre part, pensons aussi aux concepteurs des moteurs utilisés par nos navigateurs. L&amp;#8217;analyse, l&amp;#8217;interprétation et l&amp;#8217;harmonisation du code HTML non standard (et pire, ne respectant pas les règles syntaxiques) représente une montagne de travail de conception et de développement, c&amp;#8217;est à dire&amp;#160;: un gaspillage d&amp;#8217;argent et de ressources qui ne seront pas destinées à l&amp;#8217;implémentation de nouvelles fonctionnalités comme les très attendues nouveautés de standard HTML 5.&lt;/p&gt;
&lt;p&gt;Ma conclusion sera aussi simple que brève&amp;#160;: optimiser, c&amp;#8217;est important, mais pas au point de faire n&amp;#8217;importe quoi. J&amp;#8217;en profite pour faire un peu d&amp;#8217;auto-promo, car c&amp;#8217;est le discours que je tiens dans mon article sur l&amp;#8217;optimisation d&amp;#8217;une application en PHP 5 dans le magazine PHP Solutions de ce moi-ci.&lt;/p&gt;
&lt;p&gt;Màj&amp;#160;: Merci à &lt;a hreflang=&quot;fr&quot; href=&quot;http://openspace.over-blog.fr/article-google-seo-developpeur-l-equation-empoisonnee-48542388.html&quot;&gt;Agathe, d&amp;#8217;Open21 pour le relai de l&amp;#8217;information&lt;/a&gt;&amp;#160;!&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Ne-sacrifiez-pas-votre-code#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Ne-sacrifiez-pas-votre-code#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/162</wfw:commentRss>
      </item>
    
  <item>
    <title>Nouveaux brouillons pour HTML 5 publiés par le W3C</title>
    <link>http://www.martiusweb.net/post/Nouveaux-brouillons-pour-HTML-5-publi%C3%A9s-par-le-W3C</link>
    <guid isPermaLink="false">urn:md5:d1478eb4a7221830d1acb8143254a9a8</guid>
    <pubDate>Fri, 05 Mar 2010 20:43:00 +0100</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Les articles</category>
        <category>HTML 5</category><category>navigateurs</category><category>SVG</category><category>W3C</category>    
    <description>    &lt;p&gt;Le W3C, organisme de définition et de normalisation des langages qui font le web, a publié aujourd&amp;#8217;hui sept documents sur HTML 5.&lt;/p&gt;
&lt;p&gt;Ceux-ci sont toujours à l&amp;#8217;état de &amp;#8220;brouillons&amp;#8221; (&lt;em&gt;drafts&lt;/em&gt;), qui ont pour objectif, notamment, de permettre aux navigateurs de se préparer à implémenter les nouvelles fonctionnalités et de recueillir des commentaires de la part des contributeurs/utilisateurs.&lt;/p&gt;
&lt;p&gt;Les principaux documents sont le brouillon de &lt;a hreflang=&quot;en&quot; href=&quot;http://www.w3.org/TR/2010/WD-html5-20100304/&quot;&gt;la spécification HTML 5&lt;/a&gt;, les &lt;a hreflang=&quot;en&quot; href=&quot;http://www.w3.org/TR/2010/WD-html5-diff-20100304/&quot;&gt;différences entre HTML 4 et HTML 5&lt;/a&gt;, ou encore le document de &lt;a hreflang=&quot;en&quot; href=&quot;http://www.w3.org/TR/2010/WD-html-markup-20100304/&quot;&gt;spécification du langage HTML&lt;/a&gt;, se voulant être la référence du langage pour les intégrateurs souhaitant se conformer aux standards HTML. Contrairement à la spécification HTML 5, celui-ci ne vise pas a détailler le comportement prévu des navigateurs vis à vis des balises.&lt;/p&gt;
&lt;p&gt;On apprend également que les canevas 2D et micro-données, jusqu&amp;#8217;alors intégrés à HTML 5 ont maintenant leurs propres spécifications&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.w3.org/TR/2010/WD-2dcontext-20100304/&quot;&gt;HTML Canvas
2D Context&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.w3.org/TR/2010/WD-microdata-20100304/&quot;&gt;HTML
Microdata&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enfin, les deux derniers documents concernent l&amp;#8217;intégration du &lt;a hreflang=&quot;en&quot; href=&quot;http://www.w3.org/TR/2010/WD-rdfa-in-html-20100304/&quot;&gt;framework RDF en HTML 5&lt;/a&gt; et &lt;a hreflang=&quot;en&quot; href=&quot;http://www.w3.org/TR/2010/WD-html-bidi-20100304/&quot;&gt;la réalisation de pages bi-directionnelles&lt;/a&gt; (dont le texte va de gauche à droite et droite à gauche).&lt;/p&gt;
&lt;p&gt;L&amp;#8217;information &lt;a hreflang=&quot;en&quot; href=&quot;http://www.w3.org/News/2010#entry-8735&quot;&gt;vient bien sûr du W3C&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Nouveaux-brouillons-pour-HTML-5-publi%C3%A9s-par-le-W3C#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Nouveaux-brouillons-pour-HTML-5-publi%C3%A9s-par-le-W3C#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/157</wfw:commentRss>
      </item>
    
  <item>
    <title>PHP et les sessions : durée de vie, utilisation avancée et quelques subtilités</title>
    <link>http://www.martiusweb.net/post/PHP-sessions-lifetime-utilisation-avancee-subtilites</link>
    <guid isPermaLink="false">urn:md5:27d7234e6187e3c324f00e2e195e10e5</guid>
    <pubDate>Thu, 18 Feb 2010 16:21:00 +0100</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Programmation PHP</category>
        <category>Ajax</category><category>php</category><category>programmation</category><category>réseau</category><category>sessions</category>    
    <description>&lt;p&gt;PHP met à disposition un ensemble de fonctions permettant de manipuler un mécanisme de sessions&amp;#160;: un moyen efficace de conserver des données entre deux requêtes avec lequel vous êtes probablement familier. On s&amp;#8217;en passe difficilement sur un site internet interactif&amp;#160;!&lt;/p&gt;
&lt;p&gt;Bien que ce mécanisme soit assez simple à manipuler, il reste néanmoins quelques subtilités qu&amp;#8217;il faut connaître pour en profiter pleinement et éviter des erreurs regrettables. On s&amp;#8217;intéressera tout particulièrement à la durée de vie des sessions.&lt;/p&gt;    &lt;p&gt;Le mécanisme des sessions de PHP peut se comprendre assez simplement. Le serveur attribue un identifiant unique à l&amp;#8217;utilisateur, qui sera retransmis à chaque requête (par le biais d&amp;#8217;un cookie ou d&amp;#8217;une variable dans l&amp;#8217;URL). PHP utilisera cet identifiant pour retrouver les données de l&amp;#8217;utilisateur qu&amp;#8217;il stocke sur le serveur.&lt;/p&gt;
&lt;p&gt;Dans un script php, une session démarre lors d&amp;#8217;un appel à la fonction &lt;code&gt;session_start()&lt;/code&gt;, cet appel est implicite si la directive &lt;code&gt;session.auto_start&lt;/code&gt; du &lt;code&gt;php.ini&lt;/code&gt; vaut &lt;code&gt;on&lt;/code&gt;. Si aucun identifiant de session n&amp;#8217;a été transmis dans la requête, alors PHP générera une valeur aléatoire renvoyée à l&amp;#8217;utilisateur. Si un identifiant existe, PHP remplira la variable globale &lt;code&gt;$_SESSION&lt;/code&gt; des données enregistrées.&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Initialisation des sessions&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/session_start&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;session_start&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On accède à une variable de session, et&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// on l'écrit si elle n'existe pas encore&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;!&lt;/span&gt;&lt;a href=&quot;http://www.php.net/isset&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;isset&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'foo'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'foo'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'bar'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/echo&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'foo'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// La variable est utilisable dans le script courant&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Les fonctions &lt;code&gt;session_register()&lt;/code&gt; et &lt;code&gt;session_unset()&lt;/code&gt; ne doivent plus être utilisées (elles sont considérées comme obsolètes).&lt;/p&gt;
&lt;h3&gt;Gestion des accès concurrents&lt;/h3&gt;
&lt;p&gt;Les données de sessions sont protégées en écritures&amp;#160;: cela signifie qu&amp;#8217;un seul script à la fois sera en mesure de les modifier. Ce comportement peut ralentir l&amp;#8217;exécution de requêtes simultanées (avec les frames ou Ajax par exemple), l&amp;#8217;enregistrement de la session sera retardé en attendant le (ou les) autre(s) script(s) soi(en)t terminé(s). Pour limiter cette attente, vous pouvez appeler explicitement la fonction &lt;code&gt;session_write_close()&lt;/code&gt; (ou son alias &lt;code&gt;session_commit()&lt;/code&gt;).&lt;/p&gt;
&lt;h3&gt;Sécurité&lt;/h3&gt;
&lt;p&gt;Fondamentalement, l&amp;#8217;implémentation des sessions en PHP ne souffre pas de problèmes de sécurité, mais vous devrez néanmoins veiller à la manière dont vous les utiliserez. En effet, dans la mesure où une session est basée sur un identifiant transmis sur internet entre l&amp;#8217;utilisateur et le serveur, cette donnée est très sensible. Si une personne mal intentionnée obtient l&amp;#8217;identifiant de session d&amp;#8217;un autre utilisateur, il devient assez facile d&amp;#8217;usurper son identité.&lt;/p&gt;
&lt;p&gt;Il existe plusieurs techniques (simples ou plus compliquées) permettant d&amp;#8217;obtenir l&amp;#8217;identifiant de session d&amp;#8217;un utilisateur&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;la capture&amp;#160;: c&amp;#8217;est simplement le vol de l&amp;#8217;identifiant en le lisant chez l&amp;#8217;utilisateur (risque qui doit être contrôlé par l&amp;#8217;utilisateur),&lt;/li&gt;
&lt;li&gt;la divination&amp;#160;: l&amp;#8217;identifiant est deviné par la personne mal intentionnée (pratiquement impossible),&lt;/li&gt;
&lt;li&gt;la fixation&amp;#160;: le pirate choisit et force l&amp;#8217;identifiant de la session (que l&amp;#8217;on peut éviter simplement).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;D&amp;#8217;une manière générale, on évitera de transmettre l&amp;#8217;identifiant de session dans l&amp;#8217;URL par sécurité (pour prévenir de la fixation). D&amp;#8217;ailleurs, c&amp;#8217;est assez mauvais pour le référencement. Ce comportement peut être désactivé avec la directive &lt;code&gt;session.use_only_cookies&lt;/code&gt; à vrai. Bien entendu, un utilisateur interdisant l&amp;#8217;utilisation des cookies ne pourra pas utiliser les sessions.&lt;/p&gt;
&lt;p&gt;Dans tous les cas, quand le niveau de sensibilité d&amp;#8217;une session est modifié (par exemple, quand l&amp;#8217;utilisateur s&amp;#8217;authentifie ou qu&amp;#8217;il obtient de nouveaux droits d&amp;#8217;accès), une bonne pratique consiste à générer de nouveau cet identifiant de session avec la fonction &lt;code&gt;session_regenerate_id()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Par défaut, les données de sessions de PHP sont stockées dans un simple fichier de texte (dans le répertoire &lt;code&gt;/tmp&lt;/code&gt; sous linux). Tous les scripts PHP peuvent lire ces fichiers car toute exécution de PHP est réalisée par un même utilisateur (à moins que le &lt;code&gt;safe_mode&lt;/code&gt; soit activé). Sur un hébergeur mutualisé, il est peut-être plus prudent de stocker les données de sessions dans une base de données. Consultez la documentation de la fonction &lt;a hreflang=&quot;fr&quot; href=&quot;http://fr.php.net/manual/fr/function.session-set-save-handler.php&quot; onclick=&quot;window.open(this.href); return false;&quot;&gt;&lt;code&gt;session_set_save_handler()&lt;/code&gt;&lt;/a&gt; pour en savoir plus sur la personnalisation de la gestion du stockage des données de sessions.&lt;/p&gt;
&lt;h3&gt;Durée de vie&lt;/h3&gt;
&lt;p&gt;L&amp;#8217;un des points les plus délicats à appréhender dans le mécanisme des sessions concerne la durée de vie. Dans cette section, nous allons voir qu&amp;#8217;il y a plusieurs facteurs qui permettent de déterminer la durée de vie d&amp;#8217;une session.&lt;/p&gt;
&lt;p&gt;On doit, dans un premier temps, distinguer le cas pour lequel l&amp;#8217;identifiant de session est transmis par l&amp;#8217;URL de celui où un cookie est utilisé.&lt;/p&gt;
&lt;p&gt;Dans le premier cas, la session existera tant que l&amp;#8217;identifiant sera transmis par l&amp;#8217;URL. En fait, même recopiant la même adresse dans un autre navigateur, la session sera retrouvée.&lt;/p&gt;
&lt;p&gt;Si on utilise un cookie, la durée de vie d&amp;#8217;une session dépendra de la durée de vie d&amp;#8217;un cookie. Cette durée est définie à l&amp;#8217;aide de la directive &lt;code&gt;session.cookie_lifetime&lt;/code&gt;. Si cette valeur vaut 0, alors le cookie sera maintenu par le navigateur tant que ce dernier ne sera pas quitté par l&amp;#8217;utilisateur.&lt;/p&gt;
&lt;p&gt;La plupart des directives de manipulation des sessions définies dans la configuration de PHP peuvent être modifiées dynamiquement pour un script, à condition que ces modifications interviennent avant le démarrage d&amp;#8217;une session avec &lt;code&gt;session_start()&lt;/code&gt;. Si le démarrage automatique est actif, vous ne pourrez pas manipuler ces valeurs. Pour pouvoir faire quelques tests, j&amp;#8217;ai utilisé la fonction &lt;a hreflang=&quot;fr&quot; href=&quot;http://fr.php.net/session_set_cookie_params&quot; onclick=&quot;window.open(this.href); return false;&quot;&gt;&lt;code&gt;session_set_cookie_params()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le script qui suit affiche la durée de vie restante du cookie de session et une chaine de caractère définie à la création de la session. Tant que cette valeur ne change pas, cela signifie que la session utilisée est toujours la même.&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Durée de vie de la session (Time To Live)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$ttl&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/session_set_cookie_params&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;session_set_cookie_params&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$ttl&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/session_start&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;session_start&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;!&lt;/span&gt;&lt;a href=&quot;http://www.php.net/isset&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;isset&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'foo'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;||&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;!&lt;/span&gt;&lt;a href=&quot;http://www.php.net/isset&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;isset&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'bar'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'bar'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;a href=&quot;http://www.php.net/uniqid&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;uniqid&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'foo'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;a href=&quot;http://www.php.net/time&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;time&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$ttl&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/echo&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'TTL de la session ('&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'bar'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;') : '&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$_SESSION&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'foo'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;-&lt;/span&gt;&lt;a href=&quot;http://www.php.net/time&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;time&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;
&lt;p&gt;Voici quelques tests que j&amp;#8217;ai effectué&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;En choisissant la valeur 10 pour la variable &lt;code&gt;$ttl&lt;/code&gt; et en actualisant régulièrement la page, on voit la valeur TTL diminuer puis la session se renouveler (nouvelle chaine de caractère affichée);&lt;/li&gt;
&lt;li&gt;En choisissant la valeur 60, j&amp;#8217;ai eu le temps de relancer mon navigateur avant la suppression du cookie, et de constater que la session était toujours active;&lt;/li&gt;
&lt;li&gt;En choisissant la valeur 0, la session était toujours active plus d&amp;#8217;une heure après sa création, mais elle n&amp;#8217;a pas résisté à la fermeture d&amp;#8217;un navigateur.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Ramasse-miettes&lt;/h3&gt;
&lt;p&gt;Nous avons vu ce qui causait la mort d&amp;#8217;une session du côté du client, mais lorsque le cookie est supprimé, ou que l&amp;#8217;identifiant n&amp;#8217;est plus transmis, les données stockées sur le serveur ne sont pas supprimées pour autant.&lt;/p&gt;
&lt;p&gt;PHP a donc mis en place un système de ramasse-miettes (ou &lt;em&gt;garbage collector&lt;/em&gt; en anglais) chargé de supprimer ces données persistantes au bout d&amp;#8217;un certain temps. Cependant, ce temps n&amp;#8217;est pas nécessairement le même que celui de la durée de vie du cookie.&lt;/p&gt;
&lt;p&gt;La durée de vie des données sur le serveur est définie par la directive &lt;code&gt;session.gc_maxlifetime&lt;/code&gt;. Si les données ont été supprimées du serveur avant que la session ait expirée chez le client, cette dernière est tout de même réinitialisée. Il faut donc considérer (et c&amp;#8217;est bien théorique, voir ci-dessous) que la durée de vie réelle d&amp;#8217;une session est la plus petite des valeurs entre la durée de vie du cookie et la durée de vie des données sur le serveur.&lt;/p&gt;
&lt;p&gt;La donnée ne sera effectivement supprimée que lorsque le ramasse-miette sera appelé. Cette action est effectuée aléatoirement lors du démarrage de la session, la probabilité de son déclenchement est défini par deux directives&amp;#160;: &lt;code&gt;session.gc_probability&lt;/code&gt; et &lt;code&gt;session.gc_divisor&lt;/code&gt;. On a donc&amp;#160;:&lt;/p&gt;
&lt;pre&gt;probabilité d'appel = gc_probability/gc_divisor&lt;/pre&gt;&lt;p&gt;Les valeurs par défaut sont respectivement 1 et 100, la probabilité est donc 1/100.&lt;/p&gt;
&lt;h3&gt;Assurer la durée de vie de la session&lt;/h3&gt;
&lt;p&gt;Si vous choisissez de modifier la durée de vie de la session du côté du client (avec &lt;code&gt;session_set_cookie_params()&lt;/code&gt;), il faudra appliquer les mêmes règles au ramasse-miettes. Cette opération ne peut être effectuée qu&amp;#8217;en modifiant la directive &lt;code&gt;session.gc_maxlifetime&lt;/code&gt; de &lt;code&gt;php.ini&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il est tout à fait possible de faire cette modification avec la fonction &lt;code&gt;ini_set()&lt;/code&gt;, mais il faudra prendre certaines précautions. En effet&amp;#160;: l&amp;#8217;appel à &lt;code&gt;ini_set()&lt;/code&gt; modifie dynamiquement la configuration, ainsi, lors d&amp;#8217;une autre exécution, PHP considérera la valeur écrite statiquement dans les fichiers de configuration. Au passage, ce raisonnement est également valable lorsque la valeur de la directive est modifiée dans un fichier htaccess. Afin de garantir la durée de vie souhaitée à nos données de sessions, la méthode la plus simple consiste à les rendre inconnues pour un autre script&amp;#160;; autrement dit, s&amp;#8217;affranchir plus profondément de la configuration statique de PHP.&lt;/p&gt;
&lt;p&gt;La solution la plus simple consiste à choisir un autre répertoire de stockage des données de session, un sous-répertoire par exemple&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$ttl&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;3600&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Une heure, en secondes&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$local_sessions_save_path&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;a href=&quot;http://www.php.net/ini_get&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;ini_get&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'session.save_path'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/monsiteweb'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/session_set_cookie_params&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;session_set_cookie_params&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$ttl&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/ini_set&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;ini_set&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'session.gc_maxlifetime'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$ttl&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/ini_set&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;ini_set&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'session.save_path'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$local_sessions_save_path&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/session_start&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;session_start&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;Avec cette solution, le garbage collector appelé dans le contexte d&amp;#8217;un autre script supprimera les sessions périmées dans le répertoire défini par &lt;code&gt;session.save_path&lt;/code&gt;, et non le sous répertoire que nous avons choisi. Pensez quand même à créer ce sous-répertoire&amp;#160;!&lt;/p&gt;
&lt;h3&gt;Liaison d&amp;#8217;autres données à la session&lt;/h3&gt;
&lt;p&gt;Dans certains cas, on peut souhaiter sauvegarder des donnés liées à une session sans utiliser la variable &lt;code&gt;$_SESSION&lt;/code&gt;&amp;#160;: un fichier envoyé par l&amp;#8217;utilisateur, des données temporaires dans une base de données, etc.&lt;/p&gt;
&lt;p&gt;Ces données ne seront pas supprimées par l&amp;#8217;implémentation par défaut du ramasse-miettes. Nous allons donc devoir surcharger le gestionnaire de sessions par défaut, composé de six fonctions, qui se chargeront de&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;l&amp;#8217;ouverture de la session,&lt;/li&gt;
&lt;li&gt;la fermeture,&lt;/li&gt;
&lt;li&gt;la lecture des données de session,&lt;/li&gt;
&lt;li&gt;l&amp;#8217;écriture,&lt;/li&gt;
&lt;li&gt;la suppression de la session,&lt;/li&gt;
&lt;li&gt;le ramasse-miettes/garbage collector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Une fois ces fonctions créés, il faudra les déclarer au moteur PHP avec &lt;a onclick=&quot;window.open(this.href); return false;&quot; hreflang=&quot;fr&quot; href=&quot;http://php.net/manual/fr/function.session-set-save-handler.php&quot;&gt;&lt;code&gt;session_set_save_handler()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans la suite de cet article, je vais surcharger le gestionnaire de sessions en reprenant le fonctionnement de celui apr défaut de PHP. Il est d&amp;#8217;ailleurs très largement issu de l&amp;#8217;exemple donné dans la documentation officielle. Dans certains cas, il aurait été utile de sauvegarder les données dans la base de données.&lt;/p&gt;
&lt;p&gt;J&amp;#8217;ai choisi d&amp;#8217;utiliser une classe statique (&lt;code&gt;MySessionHandler&lt;/code&gt;) pour centraliser ces fonctions, mais ce n&amp;#8217;est pas une obligation. &lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; MySessionHandler&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  protected &lt;span style=&quot;color: #ff0000&quot;&gt;$save_path&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * On interdit la construction, puisque ce n'est pas nécessaire.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; __construct&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Nous placerons ici les méthodes développées à la suite&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h4&gt;Ouverture de la session&lt;/h4&gt;
&lt;p&gt;La fonction d&amp;#8217;ouverture sera appelée avec deux paramètres&amp;#160;: le chemin de sauvegarde et le nom de la session. Ces données seront transmises par le moteur de PHP. Cette fonction se chargera de conserver, pour le script courant, le répertoire de sauvegarde des sessions. Dans la mesure où cette donnée est transmise par le moteur de PHP lui-même, les autres fonctions de manipulation des sessions que nous avons vu avant sont toujours fonctionnelles.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#8217;avons pas besoin de l&amp;#8217;identifiant de session pour cette implémentation.&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * Méthode d'ouverture de la session, c'est&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @param string $save_path&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @param string $session_name&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @return bool&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;a href=&quot;http://www.php.net/static&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;static&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; open&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$save_path&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$session_name&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    self&lt;span style=&quot;color: #66cc66;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$save_path&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$save_path&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;
&lt;h4&gt;Fermeture de la session&lt;/h4&gt;
&lt;p&gt;Cette méthode est la plus simple&amp;#160;: puisque rien de particulier n&amp;#8217;est effectué à l&amp;#8217;ouverture de la session, on ne fait &lt;em&gt;rien&lt;/em&gt; à la fermeture&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * Fermeture de la session, exécutée à la fin du script&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @return bool&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;a href=&quot;http://www.php.net/static&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;static&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; close&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h4&gt;Lecture des données&lt;/h4&gt;
&lt;p&gt;La lecture des données consiste à récupérer les données écrites dans un fichier avant une précédente fermeture. Il faut donc vérifier que la session existait déjà, et n&amp;#8217;a pas été supprimée.&lt;/p&gt;
&lt;p&gt;Cette fonction doit impérativement retourner une chaine de caractères (&lt;code&gt;string&lt;/code&gt;). Le moteur de PHP se charge lui-même de la sérialisation/désérialisation des données avant et après la lecture/écriture. Nous retournons donc directement le bloc de données lu, sans modifications&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * Lecture des données de session sérialisées.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @param string $id identifiant de la session&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @return string&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;a href=&quot;http://www.php.net/static&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;static&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; read&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #ff0000&quot;&gt;$return&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #ff0000&quot;&gt;$sess_file&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; self&lt;span style=&quot;color: #66cc66;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$save_path&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/sess_'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.php.net/is_readable&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;is_readable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$sess_file&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;       &lt;span style=&quot;color: #ff0000&quot;&gt;$return&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;a href=&quot;http://www.php.net/file_get_contents&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;file_get_contents&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$sess_file&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$return&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h4&gt;Écriture des données&lt;/h4&gt;
&lt;p&gt;De la même manière, on écrira le bloc de données transmis par PHP directement dans le fichier de session. La méthode prendra deux paramètres&amp;#160;: l&amp;#8217;identifiant de session, et le bloc de données.&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * Écriture des données de la session.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @param string $id&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @param string $data&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @return bool&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;a href=&quot;http://www.php.net/static&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;static&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; write&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #ff0000&quot;&gt;$res&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #ff0000&quot;&gt;$sess_file&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; self&lt;span style=&quot;color: #66cc66;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$save_path&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/sess_'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.php.net/is_writable&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;is_writable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$sess_file&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;      &lt;span style=&quot;color: #ff0000&quot;&gt;$res&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; file_put_contents&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$sess_file&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$res&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;h4&gt;Destruction de la session et garbage collector&lt;/h4&gt;
&lt;p&gt;La suppression des données de session peut être effectuée à deux moments&amp;#160;: lors de sa destruction explicite (avec &lt;code&gt;session_destroy()&lt;/code&gt;) ou au passage du &lt;em&gt;garbage collector&lt;/em&gt;. Nous allons donc implémenter une méthode &lt;code&gt;delete()&lt;/code&gt; qui supprimera une session, et qui sera appelée par &lt;code&gt;destroy()&lt;/code&gt; et &lt;code&gt;gc()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans cet exemple, on supposera que certaines données, stockées dans un répertoire data/sessions/[identifiant de session] sont d&amp;#8217;autres données liées aux session que nous souhaitons supprimer. On peut également imaginer devoir supprimer des données dans une base de données.&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * Suppression des données d'une session.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @param string $id&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @return void&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  protected &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; delete&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;a href=&quot;http://www.php.net/unlink&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;unlink&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;self&lt;span style=&quot;color: #66cc66;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$save_path&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/sess_'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// on suppose ici que le répertoire de session n'a pas de sous-répertoire.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #ff0000&quot;&gt;$sess_dir&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'data/sessions/'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #ff0000&quot;&gt;$to_delete&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; scandir&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$sess_dir&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #b1b100;&quot;&gt;foreach&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$to_delete&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$file&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;      &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$file&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'.'&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;||&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$file&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'..'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;      &lt;a href=&quot;http://www.php.net/unlink&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;unlink&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$sess_dir&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$file&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;a href=&quot;http://www.php.net/rmdir&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;rmdir&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$sess_dir&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * Destruction de la session.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @param string $id&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @return bool&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;a href=&quot;http://www.php.net/static&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;static&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; destroy&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    self&lt;span style=&quot;color: #66cc66;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;delete&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * Ramasse-miettes&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; * @param int $maxlifetime&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;nbsp; */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;a href=&quot;http://www.php.net/static&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;static&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; gc&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$maxlifetime&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #ff0000&quot;&gt;$toDelete&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;a href=&quot;http://www.php.net/glob&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;glob&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;self&lt;span style=&quot;color: #66cc66;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$save_path&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/sess_*'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #b1b100;&quot;&gt;foreach&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$toDelete&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;      self&lt;span style=&quot;color: #66cc66;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;delete&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$id&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;
&lt;h4&gt;Attention à l&amp;#8217;identifiant de session&amp;#160;!&lt;/h4&gt;
Dans notre exemple ci-dessus, on se base sur l&amp;#8217;identifiant de session pour connaître les fichiers associés à une session. N&amp;#8217;oubliez pas que cette pratique n&amp;#8217;est pas nécessairement idéale, puisque par sécurité, cet identifiant risque d&amp;#8217;être modifié&amp;#160;!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;Attention, cet article permet de comprendre quelques points importants, mais ne prétend naturellement être complet (on en est même loin&amp;#160;!). N&amp;#8217;oubliez pas de faire vos propres tests et de lire d&amp;#8217;autres articles pour en savoir plus, et plus particulièrement sur la sécurité, car je ne l&amp;#8217;ai développé que pour mettre en garde quand à l&amp;#8217;existence de risques liés aux sessions.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/PHP-sessions-lifetime-utilisation-avancee-subtilites#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/PHP-sessions-lifetime-utilisation-avancee-subtilites#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/153</wfw:commentRss>
      </item>
    
  <item>
    <title>Facebook distribue sous licence open-source un traducteur PHP vers C++</title>
    <link>http://www.martiusweb.net/post/Facebook-distribue-sous-licence-open-source-un-traducteur-PHP-vers-C</link>
    <guid isPermaLink="false">urn:md5:2488d50dec5bc4f981b9d7b09e542cc3</guid>
    <pubDate>Tue, 02 Feb 2010 23:41:00 +0100</pubDate>
    <dc:creator>Martin Richard</dc:creator>
        <category>Programmation PHP</category>
        <category>développeur</category><category>optimisation</category><category>php</category><category>programmation</category><category>serveur</category>    
    <description>&lt;p&gt;&lt;img style=&quot;margin: 0 0 1em 1em; float: right;&quot; alt=&quot;&quot; src=&quot;http://www.martiusweb.net/public/articles/.31_sq.jpg&quot; /&gt;L&amp;#8217;équipe des développeurs de Facebook a annoncé aujourd&amp;#8217;hui la distribution (dans un futur proche) d&amp;#8217;un outil permettant de traduire en C++ et compiler du code PHP&amp;#160;: &lt;em&gt;HipHop for PHP&lt;/em&gt;. D&amp;#8217;après l&amp;#8217;annonce officielle, cet outil permettrait à Facebook de réduire de près de 50% en moyenne la sollicitation du processeur sur la plupart des pages du service, dont le front-end a été essentiellement développé avec PHP.&lt;/p&gt;    &lt;p&gt;PHP est un langage de programmation qui offre de nombreux avantages&amp;#160;: une syntaxe souple, facile à apprendre et comprendre, une grande variété d&amp;#8217;outils simplifiant le développement, une bibliothèque de fonction couvrant la plupart des besoins des développeurs d&amp;#8217;applications web et c&amp;#8217;est un produit libre. Ces avantages se traduisent facilement en excellents rapports coûts/temps de développement, ce qui rend le choix de PHP dans un processus de développement agile encore plus pertinent.&lt;/p&gt;
&lt;p&gt;D&amp;#8217;un autre côté, PHP est un langage interprété&amp;#160;: le fichier source sera de nouveau lu et traduit en langage machine avant chaque exécution. Des outils permettent de mettre en cache une partie de ce traitement (les &lt;em&gt;optimiseurs d&amp;#8217;opcode&lt;/em&gt;) améliorent sensiblement les performances d&amp;#8217;une exécution.&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Pour les équipes d&amp;#8217;ingénieurs de  Facebook, ce n&amp;#8217;était probablement pas suffisant, car ils ont développé en interne &lt;em&gt;HipHop for PHP&lt;/em&gt;, afin de permettre à un script PHP d&amp;#8217;approcher les performances d&amp;#8217;un programme compilé en C++.&lt;/p&gt;
&lt;h3&gt;Des compilateurs PHP existent déjà, quelle est donc la valeur ajoutée de HipHop&amp;#160;?&lt;/h3&gt;
&lt;p&gt;Contrairement à &lt;a hreflang=&quot;en&quot; href=&quot;http://www.roadsend.com/home/index.php&quot;&gt;Roadsend&lt;/a&gt; ou &lt;a hreflang=&quot;en&quot; href=&quot;http://www.phpcompiler.org/&quot;&gt;phpcompiler&lt;/a&gt;, HipHop n&amp;#8217;est pas à proprement parler un compilateur. L&amp;#8217;outil est en fait une chaine de traitement qui mènent à une version compilée, mais passant par une phase de traduction du langage en C++ optimisé pour les besoins. On supposera déjà qu&amp;#8217;il est pratiquement inutile d&amp;#8217;essayer d&amp;#8217;analyser et modifier directement ce code C++ généré. Ce dernier sera compilé par le compilateur Gnu, g++.&lt;/p&gt;
&lt;p&gt;La traduction s&amp;#8217;effectue en trois étapes majeures&amp;#160;:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Une analyse statique permet de collecter les informations sur les déclarations et les dépendances entre les fichiers composant le script&amp;#160;: à priori, une table des symboles (classes/méthodes/fonctions) est dressée.&lt;/li&gt;
&lt;li&gt;Une seconde analyse permet de choisir le type C++ optimal utilisé pour les symboles et variables (j&amp;#8217;en reparle un peu plus bas).&lt;/li&gt;
&lt;li&gt;Enfin, les instructions en PHP sont traduites en C++. Cette opération est essentiellement une conversion syntaxique (les deux langages sont assez proches du point de vue de la syntaxe).&lt;/li&gt;
&lt;/ol&gt;
&lt;a href=&quot;http://www.martiusweb.net/public/articles/HipHop_transformation_process.png&quot;&gt;&lt;img title=&quot;Processus de conversion de PHP en C++ par HipHop&quot; style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://www.martiusweb.net/public/articles/.HipHop_transformation_process_m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;Quelles sont les limites&amp;#160;?&lt;/h3&gt;
&lt;p&gt;A priori, la quasi-totalité de la grammaire du langage a été retranscrite, il est même probable que la plupart des librairies soient utilisables, dans la mesure où celles-ci, tout comme le moteur Zend de PHP, sont écrites en C.&lt;/p&gt;
&lt;p&gt;La plupart des gains réalisés proviennent de l&amp;#8217;optimisation de la &amp;#8220;magie&amp;#8221; de PHP, c&amp;#8217;est à dire, l&amp;#8217;ensemble des instructions qui nécessitent une évaluation dynamique. L&amp;#8217;exemple le plus évident est probablement le transtypage à la volée. En effet, dans la mesure où PHP est un langage faiblement typé, il est possible de manipuler une variable sans restreindre son type&amp;#160;: on peut facilement passer d&amp;#8217;un entier à une chaine de caractères, par exemple. Cette souplesse à un coût, puisque le moteur PHP doit évaluer et déterminer le type de l&amp;#8217;information manipulée (coût CPU), et en stocker une copie dans les principaux types (coût mémoire).&lt;/p&gt;
&lt;p&gt;HipHop ne remplacera naturellement pas le travail
d&amp;#8217;optimisation du développeur, il est même possible de s&amp;#8217;imposer
quelques nouvelles contraintes, comme limiter les transtypages implicites.&lt;/p&gt;
&lt;p&gt;Par ailleurs quelques fonctionnalités propres à un langage interprétés n&amp;#8217;ont pas été portées en raison de la complexité de l&amp;#8217;opération et du faible gain, comme la fonction &lt;code&gt;eval()&lt;/code&gt;. On peut tout de même supposer que les noms de symbôles obtenus dynamiquement (voir ci-dessous) fonctionneront, puisque je suppose qu&amp;#8217;on peut relativement facilement remplacer le mécanisme par des pointeurs sur fonctions en C++.&lt;/p&gt;
&lt;pre class=&quot;php sourcecode php&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Manipulation dynamique de symbole : on instancie une&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// classe dont le nom est stocjé dans une variable&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$classe&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'PDO'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;$monObjet&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;$classe&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// on vient d'appeler le constructeur de la classe PDO&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;
&lt;h3&gt;En savoir plus&lt;/h3&gt;
&lt;p&gt;
Pour ce soir (heure française), on doit se contenter de cette annonce&amp;#160;: on ne sait pas encore exactement quelle licence sera choisie (on sait néanmoins que l&amp;#8217;outil sera opensource), le code n&amp;#8217;est pas encore disponible et le wiki mis en place n&amp;#8217;est pas encore public. J&amp;#8217;espère donc avoir rapidement l&amp;#8217;occasion et le temps de faire des tests et des comparatifs de performance (avec un framework comme symfony par exemple).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Mise à jour&amp;#160;:&lt;/em&gt; La licence retenue est la licence de PHP, le projet sera bientôt disponible publiquement sur &lt;a hreflang=&quot;en&quot; href=&quot;http://github.com/facebook/hiphop-php/wikis&quot;&gt;&lt;em&gt;le github de facebook&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;HipHop for PHP serait déjà utilisé en production sur Facebook, on peut donc supposer que la première version mis à disposition sera déjà stable et bien avancée.&lt;/p&gt;
&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://developers.facebook.com/news.php?blog=1&amp;amp;story=358&quot;&gt;Annonce officielle sur le blog des développeurs de Facebook&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.martiusweb.net/post/Facebook-distribue-sous-licence-open-source-un-traducteur-PHP-vers-C#comment-form</comments>
      <wfw:comment>http://www.martiusweb.net/post/Facebook-distribue-sous-licence-open-source-un-traducteur-PHP-vers-C#comment-form</wfw:comment>
      <wfw:commentRss>http://www.martiusweb.net/feed/atom/comments/152</wfw:commentRss>
      </item>
    
</channel>
</rss>
