ZZZ http://zzz.rezo.net/ une sorte de fatras... fr SPIP - www.spip.net <span class="caps">ZZZ</span> http://zzz.rezo.net/local/cache-vignettes/L144xH93/siteon0-21452.png http://zzz.rezo.net/ 93 144 Petit topo sur les listes de rezo.net http://zzz.rezo.net/Petit-topo-sur-les-listes-de-rezo.html http://zzz.rezo.net/Petit-topo-sur-les-listes-de-rezo.html 2010-04-08T20:41:32Z text/html fr Fil Logiciels libres Web Email <p>Invité à témoigner comme « acteur » dans une journée d'études à la BNF portant sur « l'archivage du web politique et militant » (), j'ai commencé par prendre quelques notes me permettant de présenter le système de mailing-listes de rezo.net. Les voici, à peine rédigées & publiées à l'arrache. L'histoire des mailing-listes de rezo () remonte aux grèves de nov-déc 1995, où l'expérience de la liste Conflits-L, créée et gérée par samizdat (), démontre les qualités des mailing-listes en matière d'information (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> / <a href="http://zzz.rezo.net/+-Logiciels-libres-+.html" rel="tag">Logiciels libres</a>, <a href="http://zzz.rezo.net/+-Web-+.html" rel="tag">Web</a>, <a href="http://zzz.rezo.net/+-Email-+.html" rel="tag">Email</a> <div class='rss_chapo'><p>Invité à témoigner comme « acteur » dans une journée d'études à la <span class="caps">BNF</span> portant sur « l'archivage du web politique et militant » (<a href="http://calenda.revues.org/nouvelle16163.html" class='spip_url spip_out' rel='external'>http://calenda.revues.org/nouvelle1...</a>), j'ai commencé par prendre quelques notes me permettant de présenter le système de mailing-listes de rezo.net. Les voici, à peine rédigées & publiées à l'arrache.</p></div> <div class='rss_texte'><p><strong>L'histoire</strong> des mailing-listes de rezo (<a href="http://listes.rezo.net/" class='spip_url spip_out' rel='external'>http://listes.rezo.net/</a>) remonte aux grèves de nov-déc 1995, où l'expérience de la liste Conflits-L, créée et gérée par samizdat (<a href='http://www.samizdat.net/' class='spip_url spip_out' rel='external'>www.samizdat.net</a>), démontre les qualités des mailing-listes en matière d'information militante et indépendante.</p> <p>Lorsque, fin juillet 1996, les sans-papiers se mobilisent autour de Saint-Bernard, Marc Chemillier m'approche pour que je l'aide à créer un site pour le mouvement. Ce sera <a href="http://bok.net/pajol/" class='spip_out' rel='external'>bok.net/pajol</a> (aujourd'hui archivé en version « statique »), et on créera de suite une mailing-liste associée, zpajol (le "z" permettant d'inscrire cette liste tout en bas du fichier de configuration du système de messagerie).</p> <p>La liste zpajol a connu plusieurs hébergeurs avant de se stabiliser sur rezo ; en 1999, on la passe (sur le serveur ada) sous le logiciel Mailman. Cette expérience me convainc d'installer Mailman sur mon serveur, ce qui aboutit à la naissance de listes.rezo.net.</p> <p>Ce serveur trouvera rapidement une autre utilité, avec la mise au point de <span class="caps">SPIP</span>, et sa publication officielle en juillet 2001. Les développeurs et utilisateurs se coordonnent et s'informent via une mailing-list spip@rezo.net, qui essaimera (pour les communautés d'utilisateurs dans différentes langues, spip-dev pour les développeurs, et plus tard spip-zone pour les développeurs de squelettes et de plugins).</p> <p>En dépit des difficultés techniques inhérentes à la gestion de forts volumes d'email (spam etc), le serveur fonctionne de façon relativement fiable, toujours juste en-deça de la limite à laquelle il craquerait. Il attire donc des gens qui ont expérimenté des <span class="caps">ML</span> ailleurs, ou qui connaissent celles des sans-papiers ou celle de <span class="caps">SPIP</span>. La tonalité (technico- ou militante) reste donnée, même si certains collectifs plus littéraires ou autres se forment.</p> <p>La procédure de création d'une liste reste toujours centralisée. Cela passe par une demande indiquant la nature du projet, le nom souhaité pour la liste, ainsi que les coordonnées d'un responsable à contacter en cas de pépin. Et c'est validé — ou pas — par un collectif réuni sur la liste listes@rezo.net ; en pratique toutefois ce collectif est un peu atone.</p> <p>Si le nombre de messages échangés mensuellement sur la liste zpajol est relativement stable sur les 10 ans de son histoire (env. 250), le nombre total de mails traités par le serveur explose avec l'augmentation du nombre de listes.</p> <dl class='spip_document_34 spip_documents spip_documents_center'> <dt><img src='http://zzz.rezo.net/local/cache-vignettes/L500xH375/chex-mailz-1ac97.jpg' width='500' height='375' alt='JPEG - 50.5 ko' style='height:375px;width:500px;' /></dt> </dl> <p><strong>Quelques stats :</strong></p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> rezo héberge 505 listes, dont seulement 139 sont publiques ; c'est la partie émergée de l'iceberg</p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> zpajol : 1000 abonnés<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> utilisateurs de spip : 1600 abonnés<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> toutes les listes spip : 5600 abonnés<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> le <span class="caps">RESF</span> utilise de plus en plus rezo, a 37 000 adresses emails dans sa base<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> nos archives contiennent 887 270 messages dans 10440 mailboxes, en provenance de 113 239 émetteurs différents ; pour un total sur le disque dur de 34 Go.</p> <p>Les usages sont mutiples y compris au sein d'un même collectif ; exemple type, pour une association :<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> presse ;<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> membres ;<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> bureau ;<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> signataires des pétitions.</p> <p>Exemple type pour un collectif technique :<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> listes ouvertes dans chaque langue<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> thématiques variées utilisateur / développeur / traducteur du logiciel<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> liste locale (groupe de montpellier, groupe de belgique etc)</p> <p><strong>Les problématiques</strong> sont nombreuses et de différents ordres :</p> <p>— technique (gestion des volumes d'abonnés, de flux de messages, et de stock d'archives) ;<br />— juridique (responsabilité, requêtes de police)<br />— éthique (gestion de données personnelles, spam, règles de nétiquette)<br />— historique : il faut mettre en balance, d'une part, le « droit à l'oubli » — d'un contributeur qui se serait un peu trop emporté, et dont le message sortirait dans les premières pages de google lors d'une recherche sur son nom — et, d'autre part, la constitution d'un corpus intéressant les chercheurs, sociologues et historiens du temps présent, sur la formation d'un mouvement politique ou d'un collectif technique</p> <p>Du côté technique, un gros chantier, mené par Nahuel, a récemment abouti à un nouveau logiciel de mise en ligne d'archives d mailing-listes, nommé <a href="http://www.arbrows.org/" class='spip_out' rel='external'>arbrows</a>.</p> <p>Sur le dernier point (historique vs. privacy), notre politique est celle de l'anonymisation des contributions (respectueuse des personnes qui en font la demande), de préférence à leur suppression (qui tuerait la valeur de référence des archives).</p> <p>Il est à noter que chaque responsable de liste doit régler de manière délibérée 1) le fait que la liste est archivée (par défaut, elle ne l'est pas), et 2) le fait que ses archives sont publiques (et donc indexées par Google).</p> <h3 class='h3 spip'>* * *</h3> <p>Le rôle d'hébergeur militant de listes.rezo.net consiste donc à mettre en place une plate-forme facilitant les échanges et les discussions politiques et technologiques.</p> <p>Le point le plus inquiétant, à mon sens, est la centralisation excessive que cet outil induit. Internet est censé permettre d'échanger sans hébergeur centralisant les discussions, et je crois que notre tâche devrait être d'évoluer vers des outils décentralisés, aussi peu nominatifs que possible. La centralisation a une valeur d'efficacité immédiate, qui se paie sur le plan tactique par 1) le pouvoir donné au serveur 2) la constitution d'un « point névralgique » en cas de pannes, de hacking, ou de saisie judiciaire.</p> <p>Une autre réflexion importante porte sur la relation à l'outil : la manière dont la technique (dans ce cas, la façon dont Mailman est codé) impose des « normes » de fonctionnement d'un collectif.</p></div> Antipublicité http://zzz.rezo.net/Antipublicite.html http://zzz.rezo.net/Antipublicite.html 2009-10-08T12:14:08Z text/html fr Fil Web Publicité <p>Peut-être arrivez-vous sur cette page après avoir lu la mention « Attention, vous surfez sans protection anti-publicité ! » Voici une liste d'outils qui permettent d'éliminer les publicités dans votre navigateur Web : Firefox : L'extension Adblock Plus est un must. Documentation Installation Safari : Safari Adblock est un plugin basé sur Adblock Plus. Chrome Il existe désormais Adblock+ et Adthwart. Internet Explorer, etc. : Pour les autres navigateurs, il n'existe souvent pas de solution (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> / <a href="http://zzz.rezo.net/+-Web-+.html" rel="tag">Web</a>, <a href="http://zzz.rezo.net/+-Publicite-+.html" rel="tag">Publicité</a> <div class='rss_texte'><p>Peut-être arrivez-vous sur cette page après avoir lu la mention <strong>« Attention, vous surfez sans protection anti-publicité ! »</strong></p> <p><i>Voici une liste d'outils qui permettent d'éliminer les publicités dans votre navigateur Web :</i></p> <hr class="spip" /> <p><strong>Firefox :</strong></p> <p>L'extension Adblock Plus est un must.<br />— <a href="http://adblockplus.org/fr/" class='spip_out' rel='external'>Documentation</a><br />— <a href="http://adblockplus.org/fr/installation" class='spip_out' rel='external'>Installation</a></p> <hr class="spip" /> <p><strong>Safari :</strong></p> <p><a href="http://burgersoftware.com/fr/safariadblock" class='spip_out' rel='external'>Safari Adblock</a><br class='autobr' /> est un plugin basé sur Adblock Plus.</p> <hr class="spip" /> <p><strong>Chrome</strong></p> <p>Il existe désormais <a href="https://chrome.google.com/extensions/detail/gighmmpiobklfepjocnamgkkbiglidom?hl=fr" class='spip_out' rel='external'>Adblock+</a> et <a href="https://chrome.google.com/extensions/detail/cfhdojbkjhnklbpkdaibdccddilifddb?hl=fr" class='spip_out' rel='external'>Adthwart</a>.</p> <hr class="spip" /> <p><strong>Internet Explorer, etc. :</strong></p> <p>Pour les autres navigateurs, il n'existe souvent pas de solution sous forme de plugin ; on peut alors installer un proxy spécialisé dans le filtrage anti-publicitaire. Il en existe plusieurs. L'installation se fait en deux temps : tout d'abord, l'installation du proxy, qui tourne en tâche de fond sur l'ordinateur ; puis la configuration des paramètres du navigateur, pour lui faire utiliser ce proxy.<br />— Privoxy : <a href="http://www.privoxy.org/" class='spip_url spip_out' rel='external'>http://www.privoxy.org/</a><br />— BFilter : <a href="http://bfilter.sourceforge.net/" class='spip_url spip_out' rel='external'>http://bfilter.sourceforge.net/</a></p> <p> </p> <p>N'hésitez pas à me signaler d'autres techniques pour surfer sans publicité, je mettrai cet article à jour avec vos suggestions.</p></div> Je suis fan de YAML http://zzz.rezo.net/Je-suis-fan-de-YAML.html http://zzz.rezo.net/Je-suis-fan-de-YAML.html 2009-09-13T21:31:15Z text/html fr Fil <p>YAML. Son nom est l'acronyme de la phrase auto-référente « YAML Ain't Markup Language ». Truc de geeks, donc. Mais il ne faut pas s'arrêter à ça ! Définition YAML se définit comme « un standard de sérialisation de données pour tous les langages, facile à utiliser pour les humains ». standard : signifie qu'il n'y a pas d'approximation ou d'hésitation à avoir sur le contenu écrit en YAML. sérialisation de données : consiste à transformer une structure de données simple ou complexe en un fichier texte. Qu'il (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> <div class='rss_texte'><p><span class="caps">YAML</span>. Son nom est l'acronyme de la phrase auto-référente « <span class="caps">YAML</span> Ain't Markup Language ». Truc de geeks, donc. Mais il ne faut pas s'arrêter à ça !</p> <h3 class='h3 spip'>Définition</h3> <p><span class="caps">YAML</span> se définit comme <i>« un standard de sérialisation de données pour tous les langages, facile à utiliser pour les humains ».</i><br />— <i>standard :</i> signifie qu'il n'y a pas d'approximation ou d'hésitation à avoir sur le contenu écrit en <span class="caps">YAML</span>.<br />— <i>sérialisation de données :</i> consiste à transformer une structure de données simple ou complexe en un fichier texte. Qu'il s'agisse d'une chaîne de caractères, d'un tableau, d'une liste de tableaux, d'un objet... toute variable peut être écrite sous forme d'un document <span class="caps">YAML</span>.<br />— <i>tous les langages :</i> <span class="caps">YAML</span> existe déjà en C, Java, Python, Ruby, Perl, Javascript, etc. Son implémentation en <span class="caps">PHP</span> est cependant encore relativement faible.<br />— <i>human-friendly :</i> c'est le plus important à mes yeux. Une structure de données transposée en <span class="caps">YAML</span> est très agréable à lire, facile à comprendre, et surtout facile à éditer.</p> <h3 class='h3 spip'>Comparaison sur un exemple</h3> <p>Grâce à son incomparable <a href='http://zzz.rezo.net/L-API-de-per-sonn-es.html' class='spip_in'><span class="caps">API</span></a>, le site <a href='http://zzz.rezo.net/http/per.sonn.es/' class='spip_out'><code class='spip_code' dir='ltr'>per.sonn.es</code></a> propose plusieurs affichages possibles du profil de ses membres, ce qui va nous permettre de les comparer :</p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <strong><span class="caps">XML</span></strong> est la reine des formats de sérialisation. Un fichier <span class="caps">XML</span>, ça fait pro. Mais ses désavantages sont nombreux : c'est verbeux (chaque bloc ouvert doit être fermé), fragile (si on l'édite à la main, on a toutes les chances de le rendre invalide), complexe (ajouter un élément relève de la pratique divinatoire). Voici le profil de Jean Valjean dans la syntaxe <span class="caps">XML</span>/<span class="caps">RDF</span> : <a href="http://per.sonn.es/Jean+Valjean.rdf" class='spip_url spip_out' rel='external'>http://per.sonn.es/Jean+Valjean.rdf</a></p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <strong><span class="caps">JSON</span></strong> est la représentation des données sous forme de variable javascript. Elle est beaucoup plus légère que <span class="caps">XML</span>, et a l'avantage de se traiter de façon très simple en... javascript, ce qui en a fait la star des <i>mashups</i> du Web 2.0. Inconvénients : les commentaires sont formellement interdits ; les caractères accentués se codent sous la forme <code class='spip_code' dir='ltr'>\u00e9</code> ; un <code class='spip_code' dir='ltr'>array</code> transcodé en <span class="caps">JSON</span> puis décodé peut devenir un <code class='spip_code' dir='ltr'>object</code>. <a href="http://per.sonn.es/Jean+Valjean.json" class='spip_url spip_out' rel='external'>http://per.sonn.es/Jean+Valjean.json</a></p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <strong><span class="caps">YAML</span></strong> pour sa part est lisible, voire même esthétique, tout en étant concis et facile à éditer à la main. Un bon dessin valant mieux qu'un long discours, voici : <a href="http://per.sonn.es/Jean+Valjean.yaml" class='spip_url spip_out' rel='external'>http://per.sonn.es/Jean+Valjean.yaml</a></p> <h3 class='h3 spip'>Utilisations possibles</h3> <p><span class="caps">YAML</span> est parfois présenté comme un format de choix pour enregistrer des <strong>fichiers de configuration</strong>. Par exemple, pour configurer deux connexions à des serveurs <span class="caps">SQL</span>, on peut écrire le <span class="caps">YAML</span> suivant :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code># dev server<br /> development:<br /> adapter: mysql<br /> database: 125moz<br /> username: root<br /> password: x0089<br /> socket: /tmp/mysql.sock<br /> # prod server<br /> production:<br /> adapter: mysql<br /> database: 178moz<br /> username: root<br /> password: x672323<br /> socket: /var/run/mysqld/mysqld.sock</code></div> <p>Il n'est pas besoin d'une expérience informatique très profonde pour voir tout de suite que ce texte comporte des commentaires (cachés derrière le symbole <code class='spip_code' dir='ltr'>#</code>), et deux listes de propriétés, l'une nommée <code class='spip_code' dir='ltr'>development</code>, l'autre nommée <code class='spip_code' dir='ltr'>production</code>.</p> <p> </p> <p><span class="caps">YAML</span> peut aussi servir de format d'<strong>échange de données</strong> entre deux programmes : l'<span class="caps">API</span> de <code class='spip_code' dir='ltr'>per.sonn.es</code> en montre un exemple.</p> <p> </p> <p><span class="caps">YAML</span> est aussi un format à envisager pour la <strong>sauvegarde de données</strong>, destinée par exemple à une édition hors-ligne. Si <code class='spip_code' dir='ltr'>per.sonn.es</code> proposait de modifier un profil, il suffirait à Jean Valjean d'enregistrer la page <a href="http://per.sonn.es/Jean+Valjean.yaml" class='spip_url spip_out' rel='external'>http://per.sonn.es/Jean+Valjean.yaml</a>, de l'éditer, puis, une fois son <span class="caps">C.V.</span> peaufiné, de renvoyer le texte édité au format <span class="caps">YAML</span> vers le site, pour faire la mise à jour de son profil.</p> <h3 class='h3 spip'>Expressivité</h3> <p>Bien que très simple à lire, <span class="caps">YAML</span> offre une expressivité très complète. Il est en effet possible d'exprimer, toujours avec la même simplicité, des choses qui sont souvent complexes, voire impossibles, à réaliser dans les autres formats :<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> données « binaires » tels que des images (penser à l'horrible <code class='spip_code' dir='ltr'><![CDATA[ ... ]]></code> de <span class="caps">XML</span>) ;<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> adressage d'une donnée par référence (voir l'écriture <code class='spip_code' dir='ltr'>&id001 / *id001</code> sur le fichier <a href="http://pygments.org/demo/1513/" class='spip_url spip_out' rel='external'>http://pygments.org/demo/1513/</a> ;<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> les objets se sérialisent aussi bien que les listes et tableaux.</p> <h3 class='h3 spip'>Références Web</h3> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> Le site officiel : <a href="http://yaml.org/" class='spip_url spip_out auto' rel='nofollow external'>http://yaml.org/</a></p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <span class="caps">YAML</span> 1.2, spécification complète (avec des exemples) : <a href="http://www.yaml.org/spec/1.2/spec.html" class='spip_url spip_out auto' rel='nofollow external'>http://www.yaml.org/spec/1.2/spec.html</a></p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> tutoriel rapide : “Can You Learn <span class="caps">YAML</span> in Five Minutes ?” <a href="http://yaml.kwiki.org/?YamlInFiveMinutes" class='spip_url spip_out' rel='external'>http://yaml.kwiki.org/?YamlInFiveMinutes</a></p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> Reference Card, tout <span class="caps">YAML</span> en une page (elle-même écrite en <span class="caps">YAML</span>) : <a href="http://yaml.org/refcard.html" class='spip_url spip_out auto' rel='nofollow external'>http://yaml.org/refcard.html</a></p> <h3 class='h3 spip'>Implémentation <span class="caps">PHP</span></h3> <p>Utilisant beaucoup <span class="caps">PHP</span> je me suis tourné vers l'implémentation de <span class="caps">YAML</span> faite par Fabien Potencier pour Symfony : elle est facile à installer et, bien que n'implémentant pas toutes les spécifications, semble fonctionner raisonnablement bien pour des structures simples (des tableaux de chaînes de caractères, par exemple), à condition que le fichier ne soit pas trop gros.</p> <p>Le site Symfony <span class="caps">YAML</span> permet de télécharger ce composant indépendamment du reste de Symfony : <a href="http://components.symfony-project.org/yaml/" class='spip_url spip_out' rel='external'>http://components.symfony-project.o...</a>.</p> <p>Pour charger en mémoire une structure sérialisée dans un fichier il suffit de deux lignes de code :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>require_once('/chemin/vers/lib/yaml/sfYaml.class.php');<br /> $conf = sfYaml::load('conf.yaml');</code></div> <p>Pour faire l'opération inverse (bien pratique pour convertir des données qu'on vient de lire depuis un autre format) :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>require_once('/chemin/vers/lib/yaml/sfYaml.class.php');<br /> $text = sfYaml::dump($conf);<br /> fwrite(..., $text);</code></div> <p>Je viens aussi de packager cette librairie sous la forme d'un plugin <span class="caps">SPIP</span> qui fournit deux fonctions : <code class='spip_code' dir='ltr'>yaml_encode()</code> et <code class='spip_code' dir='ltr'>yaml_decode()</code>.</p> <h3 class='h3 spip'>Conclusion</h3> <p>Avec tous ces avantages, <span class="caps">YAML</span> est désormais mon format de prédilection pour tout ce que je faisais alors avec des « petits fichiers texte ad hoc ».</p> <p>Pour modérer cet enthousiasme, il faut toutefois reconnaître deux faiblesses : l'absence de documentation en français, et le support médiocre de <span class="caps">YAML</span> en <span class="caps">PHP</span>. Deux points qui pourraient être améliorés rapidement.</p></div> Installer XCache pour PHP http://zzz.rezo.net/Installer-XCache-pour-PHP.html http://zzz.rezo.net/Installer-XCache-pour-PHP.html 2009-04-09T07:06:18Z text/html fr Fil Web <p>A force de constater des plantages EACCELERATOR : PHP crashed je me suis dit qu'il fallait essayer le cache opcode concurrent, XCache (pour savoir à quoi sert un cache opcode, se reporter à la section XCache de l'article de papygeek ). L'installation est un peu compliquée par le fait que ma version de Debian (etch) n'a pas encore intégré XCache, et qu'il faut donc le compiler et l'installer « à la main ». Heureusement il m'a suffi de suivre les notes d'installation de Pierre-Yves Landuré pour obtenir (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> / <a href="http://zzz.rezo.net/+-Web-+.html" rel="tag">Web</a> <div class='rss_texte'><p>A force de constater des plantages <code class='spip_code' dir='ltr'>EACCELERATOR: PHP crashed</code> je me suis dit qu'il fallait essayer le cache opcode concurrent, <a href="http://xcache.lighttpd.net/" class='spip_out' rel='external'>XCache</a> (pour savoir à quoi sert un cache opcode, se reporter à la section XCache de l'article de papygeek <a href="http://www.papygeek.com/wordpress/wordpress-optimiser-son-blog-avec-un-systeme-de-cache/" class='spip_url spip_out' rel='external'>http://www.papygeek.com/wordpress/w...</a>).</p> <p>L'installation est un peu compliquée par le fait que ma version de Debian (etch) n'a pas encore intégré XCache, et qu'il faut donc le compiler et l'installer « à la main ». Heureusement il m'a suffi de suivre les notes d'installation de Pierre-Yves Landuré <a href="http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-xcache-sur-debian-4-0-etch" class='spip_url spip_out' rel='external'>http://howto.landure.fr/gnu-linux/d...</a> pour obtenir sans tracas :<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> un module <code class='spip_code' dir='ltr'>/usr/lib/php5/20060613+lfs/xcache.so</code><br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> un fichier de configuration <code class='spip_code' dir='ltr'>/etc/php5/conf.d/xcache.ini</code></p> <p>Pour résumer les opérations :</p> <form action='' method='get'><div> <input type='hidden' name='exec' value='' /> <textarea readonly='readonly' cols='40' rows='26' class='spip_cadre' dir='ltr'>apt-get install php5-dev VERSION=1.2.2 wget http://xcache.lighttpd.net/pub/Releases/$VERSION/xcache-$VERSION.tar.gz --output-document=/tmp/xcache-$VERSION.tar.gz tar --directory=/tmp -xzf /tmp/xcache-$VERSION.tar.gz cd /tmp/xcache-$VERSION phpize --clean phpize ./configure --enable-xcache make make install ls /usr/lib/php5/20060613+lfs/ -altr cp /tmp/xcache-$VERSION/xcache.ini /etc/php5/conf.d/xcache.ini sed -i -e 's/^zend_extension_ts.*/; \0/' -e "s|^\(zend_extension =\).*|\1 $(/usr/bin/find /usr/lib/php5 -name xcache.so | /usr/bin/head --lines=1)|" /etc/php5/conf.d/xcache.ini sed -i -e 's/^\(xcache\.size[ ]*=\).*/\1 128M/' -e 's/^\(xcache\.var_size[ ]*=\).*/\1 64M/' /etc/php5/conf.d/xcache.ini apachectl graceful</textarea></div></form> <p>Dans la configuration <code class='spip_code' dir='ltr'>/etc/php5/conf.d/xcache.ini</code> j'ai fait les modifications suivantes :<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <code class='spip_code' dir='ltr'>xcache.size = 128M</code> taille totale du cache (le panneau d'administration de xcache permet de voir comment on le remplit, et d'affiner cette valeur).<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <code class='spip_code' dir='ltr'>xcache.count = 4</code> nombre de <span class="caps">CPU</span> du serveur, qu'on peut obtenir avec<br class='manualbr' /><code class='spip_code' dir='ltr'># cat /proc/cpuinfo |grep -c processor</code></p> <p>j'ai aussi installé un login/mot de passe d'admin, pour autoriser le panneau d'administration :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>xcache.admin.enable_auth = On<br /> xcache.admin.user = "toto"<br /> xcache.admin.pass = "42f3579b3dafe8df6268ddb602967523"</code></div> <p>(la valeur du <code class='spip_code' dir='ltr'>pass</code> est le md5 du mot de passe choisi).</p> <p>Enfin, pour installer le panneau d'administration quelque part :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code># mv /tmp/xcache-$VERSION/admin/ chemin/vers/web/xcache-admin</code></div> <h3 class='h3 spip'>* * *</h3> <p>Avec ça j'espère éviter les crashes récurrents que me donne eaccelerator, pour une amélioration de performances similaire <a href="http://www.spip-blog.net/Les-jantes-en-acier-chrome.html" class='spip_url spip_out' rel='external'>http://www.spip-blog.net/Les-jantes...</a> (environ 3 fois plus de pages servies par seconde).</p> <p>Second bénéfice, à tester : les fonctions <code class='spip_code' dir='ltr'>xcache_get()</code>, <code class='spip_code' dir='ltr'>xcache_set()</code> etc. de l'<a href="http://xcache.lighttpd.net/wiki/XcacheApi" class='spip_out' rel='external'><span class="caps">API</span> XCache</a>, qui permettent de très simplement mémoriser des données en mémoire vive pour les passer d'un script <span class="caps">PHP</span> au suivant (<i>Cf.</i> <a href='http://zzz.rezo.net/Utiliser-xcache-pour-accelerer-n.html' class='spip_in'>Utiliser <code class='spip_code' dir='ltr'>xcache</code> pour accélérer n'importe quel script <span class="caps">PHP</span></a>).</p></div> Créer une base de connaissances avec SPIP http://zzz.rezo.net/Creer-une-base-de-connaissances.html http://zzz.rezo.net/Creer-une-base-de-connaissances.html 2009-03-14T11:41:52Z text/html fr Fil Biens publics Logiciels libres Web <p>Comme tout forum de support logiciel, celui de SPIP (forum.spip.org) est confronté à un problème : les gens ne cherchent pas toujours de réponse avant de poser leur question. Cela conduit à une multiplication de questions redondantes, et à la fragmentation des réponses. Comme on a abandonné l'idée messianique de changer l'humain pour qu'il se conforme à la machine, on va essayer d'adapter la machine : pour cela forum.spip.org est le premier à introduire la technologie « réponse immédiate à la question (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> / <a href="http://zzz.rezo.net/+-Biens-publics-+.html" rel="tag">Biens publics</a>, <a href="http://zzz.rezo.net/+-Logiciels-libres-+.html" rel="tag">Logiciels libres</a>, <a href="http://zzz.rezo.net/+-Web-+.html" rel="tag">Web</a> <div class='rss_texte'><p>Comme tout forum de support logiciel, celui de <span class="caps">SPIP</span> (<a href="http://forum.spip.org/" class='spip_out' rel='external'>forum.spip.org</a>) est confronté à un problème : les gens ne cherchent pas toujours de réponse avant de poser leur question. Cela conduit à une multiplication de questions redondantes, et à la fragmentation des réponses.</p> <p>Comme on a abandonné l'idée <del>messianique</del> [<a href='#nb1' class='spip_note' rel='footnote' title='Justement pas « messianique », me fait-on remarquer obligeamment, puisque (...)' id='nh1'>1</a>] de changer l'humain pour qu'il se conforme à la machine, on va essayer d'adapter la machine : pour cela forum.spip.org est le premier à introduire la technologie « réponse immédiate à la question posée ».</p> <p>Comment ça marche ? Tout simplement, lorsque le visiteur pose une nouvelle question, la prévisualisation du forum inclut un squelette qui effectue une recherche sur l'ensemble des forums existants, avec comme termes de recherche les mots saisis dans les champs « sujet » et « texte » du forum.</p> <p>Et propose alors les 5 résultats les plus « pertinents » :</p> <p><span class='spip_document_17 spip_documents spip_documents_center'> <img src='http://zzz.rezo.net/local/cache-vignettes/L500xH317/Image_1-4-2784d.png' width='500' height='317' alt="" style='height:317px;width:500px;' /></span></p> <p>Cela a été rendu techniquement possible par le plugin <a href="http://www.spip-contrib.net/Fulltext" class='spip_out' rel='external'>Fulltext</a> ; ensuite, pour intégrer ce système dans le forum il a suffi de modifier le squelette de prévisu comme dans <a href="http://zone.spip.org/trac/spip-zone/browser/_squelettes_/forum.spip.org/formulaires/" class='spip_url spip_out' rel='external'>http://zone.spip.org/trac/spip-zone...</a></p> <p>Ajout dans <code class='spip_code' dir='ltr'>formulaires/inc-forum_previsu.html</code> :</p> <form action='' method='get'><div> <input type='hidden' name='exec' value='' /> <textarea readonly='readonly' cols='40' rows='7' class='spip_cadre' dir='ltr'>[(#REM) Si on est en train de creer une nouvelle question, suggerer des pistes] [(#ENV{id_forum}|non) [(#SET{recherche,[(#ENV*{titre}) ]#ENV*{texte}})] [(#INCLUDE{fond=formulaires/suggerer-reponse}{recherche=#GET{recherche}|textebrut})] ]</textarea></div></form> <p>Le squelette effectuant les suggestions se trouve ici : <a href="http://zone.spip.org/trac/spip-zone/browser/_squelettes_/forum.spip.org/formulaires/suggerer-reponse.html" class='spip_url spip_out' rel='external'>http://zone.spip.org/trac/spip-zone...</a>.</p></div> <hr /> <div class='rss_notes'><div id='nb1'> <p>[<a href='#nh1' class='spip_note' title='Notes 1' rev='footnote'>1</a>] Justement pas « messianique », me fait-on remarquer obligeamment, puisque toute l'idée du messianisme, au sens propre comme au sens figuré, est de sauver l'homme par l'homme.</p> </div></div> @font-face http://zzz.rezo.net/font-face.html http://zzz.rezo.net/font-face.html 2009-03-10T10:58:34Z text/html fr Baroug Web <p>Les possibilités typographiques du design sur Internet sont globalement misérables. Quelques polices système utilisables, et c'est tout : tout bon manuel dira qu'en utiliser d'autres, c'est mal, et que de toute façon, ça ne marche pas. C'est vrai. Les solutions du type images typographiques fonctionnent globalement bien — mais elles génèrent, comme leur nom l'indique, des images, et ne sont donc pas appropriées pour le texte, en-dehors d'un peu de titraille ou des menus. Face à cette misère policière (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> / <a href="http://zzz.rezo.net/+-Web-+.html" rel="tag">Web</a> <div class='rss_texte'><p>Les possibilités typographiques du design sur Internet sont globalement misérables. Quelques polices système utilisables, et c'est tout : tout bon manuel dira qu'en utiliser d'autres, c'est mal, et que de toute façon, ça ne marche pas. C'est vrai.</p> <p>Les solutions du type <a href="http://www.spip.net/fr_article3325.html" class='spip_out' rel='external'>images typographiques</a> fonctionnent globalement bien — mais elles génèrent, comme leur nom l'indique, des images, et ne sont donc pas appropriées pour le texte, en-dehors d'un peu de titraille ou des menus.</p> <p>Face à cette misère policière existe une issue : <a href="http://www.css3.info/preview/web-fonts-with-font-face/" class='spip_out' rel='external'><code class='spip_code' dir='ltr'>@font-face</code></a>. Cette propriété des <a href="http://fr.wikipedia.org/wiki/Feuilles_de_style_en_cascade" class='spip_out' rel='external'><span class="caps">CSS</span></a> permet, une fois qu'on a placé des polices de caractères dans un répertoire adéquat de son serveur, d'utiliser celles-ci sans que le visiteur n'ait à les installer sur son ordinateur. Il faut néanmoins utiliser un navigateur compatible — un Safari récent et bientôt, Firefox [<a href='#nb1' class='spip_note' rel='footnote' title='https://developer.mozilla.org/en/CS...' id='nh1'>1</a>] —, qui téléchargera et interprétera les fontes.</p> <p>Cette technique a elle aussi des limites : impossible de l'utiliser avec des polices commerciales, puisque les fontes placées sur le serveur pour <code class='spip_code' dir='ltr'>@font-face</code> seront librement téléchargeables. Et même les polices « gratuites » ne se laissent pas toutes distribuer ainsi. Il n'empêche : ça marche bien, et c'est une joie de voir autre chose que de l'Helvetica-Georgia-Verdana-Lucida sur une page web.</p> <h3 class='h3 spip'>How to</h3> <p>Il faut donc d'abord installer les fontes sur notre gentil serveur. A priori, dans un répertoire /polices, par exemple. Cela fait, il faut déclarer chacune d'entre elle comme une classe <span class="caps">CSS</span>, toujours la même <code class='spip_code' dir='ltr'>@font-face</code>. Par exemple, sur ce site est installée la police <a href="http://new.myfonts.com/fonts/larabie/coolvetica/" class='spip_out' rel='external'>Coolvetica</a>, du prolifique Ray Larabie. (On l'utilise pour les titres et quelques autres trucs). Déclarons-la gaiement :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>@font-face { <br /> font-family:coolvetica;<br /> src:url(peaulisses/coolvetica.ttf);<br /> format("truetype");<br /> }</code></div> <p>On indique un nom, qu'on utilisera pour la nommer dans les classes et id comme n'importe quelle autre police, ici la Coolvetica. On précise ou elle est située. Et éventuellement, le format — apparemment ce n'est pas indispensable mais bon, hein.</p> <p>Si l'on veut utiliser plusieurs polices de cette manière, chacune doit être déclarée dans une déclaration <code class='spip_code' dir='ltr'>@font-face</code> indépendante. Ainsi :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>@font-face {<br /> font-family:coolvetica; <br /> src:url(peaulisses/coolvetica.ttf);<br /> format("truetype");<br /> }<br /> @font-face {<br /> font-family:larabiefont;<br /> src:url(peaulisses/larabiefont.otf);<br /> format("opentype");<br /> }</code></div> <p>Pof.</p> <blockquote class="spip"> <h3 class='h3 spip'>« Le gras, c'est la vie »</h3> <p>La police ainsi choisie peut n'avoir qu'une seule graisse. Dans ce cas, s'il s'agit par exemple d'un gras, et que le gentil internaute venant butiner sur notre belle page n'utilise pas un navigateur compatible avec <code class='spip_code' dir='ltr'>@font-face</code>, la police qu'il verra à la place ne sera pas en gras, et toute l'harmonie de notre belle page sera menacée. Car si l'on donne l'attribut <code class='spip_code' dir='ltr'>font-weight: bold;</code> à la class ou l'id où se trouve notre police, elle sera déformée par un immonde gras informatique. Ce qui est totalement proscrit. C'est mal. Bouh.</p> <p>Heureusement, une solution existe : déclarer dans le <code class='spip_code' dir='ltr'>@font-face</code> de la police une graisse. Voilà donc le <code class='spip_code' dir='ltr'>@font-face</code> complet déclarant la sympathique Coolvetica :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>@font-face {<br /> font-family:coolvetica; <br /> src:url(peaulisses/coolvetica.ttf);<br /> format("truetype");<br /> font-weight: bold;<br /> }</code></div> <p>Une bien meilleure dégradation, pour employer un terme associé au javascript.</p> <p>Hélas, l'astuce ne semble pas fonctionner avec d'autres propriétés comme <code class='spip_code' dir='ltr'>letter-spacing</code>. Peut-être dans une future évolution de <code class='spip_code' dir='ltr'>@font-face</code> ?</p> </blockquote> <p>Et c'est tout ! Comme je l'ai dit plus haut, pour l'utiliser ensuite, on la place normalement, comme d'habitude, dans une liste de polices possible, du genre <code class='spip_code' dir='ltr'> {font-family: coolvetica, helvetica, arial, sans-serif; } </code>. Chose merveilleuse, de cette façon, le sympathique visiteur qui surfe avec un navigateur qui ne supporte pas encore <code class='spip_code' dir='ltr'>@font-face</code> verra la Lucida à la place de la Coolvetica. Tout marchera dont malgré tout. En moins joli.</p> <p>Maintenant, il faudrait que de généreux typographes aient conscience de la nécessité de créer de nouvelles polices libres, pour le bien esthétique commun. Go go go !</p></div> <hr /> <div class='rss_notes'><div id='nb1'> <p>[<a href='#nh1' class='spip_note' title='Notes 1' rev='footnote'>1</a>] <a href="https://developer.mozilla.org/en/CSS/@font-face" class='spip_url spip_out' rel='external'>https://developer.mozilla.org/en/<span class="caps">CS</span>...</a></p> </div></div> URL canonique http://zzz.rezo.net/URL-canonique.html http://zzz.rezo.net/URL-canonique.html 2009-02-23T17:54:54Z text/html fr Fil Web <p>Je demandais hier sur #spip si quelqu'un connaissait un standard pour signaler l'URL canonique d'une page Web. S'koi ? Si on est en train de lire une page sur un site, on peut l'avoir abordée par plusieurs adresses : http://monsite.tld/article12 http://monsite.tld/Mon-titre-d-article http://www.monsite.tld/article12.html?couleur=bleu http://www.monsite.tld/article12.html?post=1 http://www.monsite.tld/article12.html?PHPSESSID=a2c5fe78 Tout ça, ce sont des URLs valables, qui affichent (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> / <a href="http://zzz.rezo.net/+-Web-+.html" rel="tag">Web</a> <div class='rss_texte'><p>Je demandais hier sur <a href="http://www.spip.net/irc" class='spip_out' rel='external'>#spip</a> si quelqu'un connaissait un standard pour signaler l'<span class="caps">URL</span> canonique d'une page Web. S'koi ? Si on est en train de lire une page sur un site, on peut l'avoir abordée par plusieurs adresses :<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <code class='spip_code' dir='ltr'>http://monsite.tld/article12</code><br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <code class='spip_code' dir='ltr'>http://monsite.tld/Mon-titre-d-article</code><br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <code class='spip_code' dir='ltr'>http://www.monsite.tld/article12.html?couleur=bleu</code><br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <code class='spip_code' dir='ltr'>http://www.monsite.tld/article12.html?post=1</code><br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <code class='spip_code' dir='ltr'>http://www.monsite.tld/article12.html?PHPSESSID=a2c5fe78</code></p> <p>Tout ça, ce sont des URLs valables, qui affichent bien le même article. Mais si je veux mettre des gens (ou des robots) d'accord sur ce qu'est la « vraie » adresse de cet article, il faut que je l'annonce, d'une manière ou d'une autre.</p> <p>Cette problématique concerne au premier chef les moteurs de recherche et d'indexation (mais pas seulement). Or il se trouve que pas plus tard que la semaine dernière les trois poids lourds Google, Yahoo et Live (Microsoft) annonçaient que leurs algorithmes allaient accepter qu'on leur parle de l'<span class="caps">URL</span> canonique d'une page.</p> <p><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <a href="http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html" class='spip_url spip_out' rel='external'>http://googlewebmastercentral.blogs...</a><br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> <a href="http://www.seomoz.org/blog/canonical-url-tag-the-most-important-advancement-in-seo-practices-since-sitemaps" class='spip_url spip_out' rel='external'>http://www.seomoz.org/blog/canonica...</a></p> <p>C'est bien fait, et c'est simple à mettre en œuvre. En gros, pour toute page <span class="caps">HTML</span> qui peut avoir plusieurs adresses, on va indiquer laquelle est la principale, en insérant dans son <code class='spip_code' dir='ltr'><head>...</head></code> une balise :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code><link rel="canonical"<br /> href="http://www.monsite.tld/URL-canonique" /></code></div> <p>Les algorithmes qui le souhaitent sauront donc que la page <code class='spip_code' dir='ltr'>http://www.monsite.tld/article12</code> qui mentionne ce lien doit en fait être considérée comme étant à l'adresse canonique <code class='spip_code' dir='ltr'>http://www.monsite.tld/URL-canonique</code>. Et feront leurs calculs (PageRank...) et affichages (résultats de recherche...) en tenant compte de cette information.</p> <h3 class='h3 spip'>* * *</h3> <p>Autre exemple d'usage (qui était celui qui avait suscité ma question) : lorsqu'on veut participer aux sites de partage de bookmarks type delicious.com, il importe que les différents partageurs se mettent d'accord sur une adresse unique, de manière à pouvoir discuter de la même chose, même s'ils l'ont vue dans un contexte différent. Le plugin <span class="caps">SPIP</span> <a href="http://www.spip-contrib.net/Social-tags" class='spip_out' rel='external'>Social Tags</a> en tient compte.</p> <p>Dans le squelette <span class="caps">SPIP</span> <code class='spip_code' dir='ltr'>article.html</code>, il suffit d'indiquer dans la partie <code class='spip_code' dir='ltr'><head>..</head></code> le code suivant [<a href='#nb1' class='spip_note' rel='footnote' title='Intégré à la branche dev de SPIP ; on peut utiliser le patch http://trac.rezo.net/t' id='nh1'>1</a>] :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code><link rel="canonical"<br /> href="[(#URL_ARTICLE|url_absolue)]" /></code></div> <p>Pour que Google considère qu'un (vieux) lien vers <code class='spip_code' dir='ltr'>http://monsite.tld/a1.html</code> pointe en fait vers <code class='spip_code' dir='ltr'>http://www.monsite.tld/Titre-article</code> (<span class="caps">URL</span> canonique de l'article si on a activé les URLs « propres »). Ou que SocialTags indique le nouvel <span class="caps">URL</span> dans delicious quand on clique sur l'icone, même si le navigateur indique <code class='spip_code' dir='ltr'>http://www.monsite.tld/Titre-article?PHPSESSID=12345</code>.</p> <blockquote class="spip"> <h3 class='h3 spip'><span class="caps">URL</span> canonique et permalien</h3> <p>C'est bien gentil ces URLs canoniques, mais quelle est la différence avec le permalien ?</p> <p>L'idée du « permalien » d'un article, c'est d'avoir un lien qui référencera <i>toujours</i> cet article ; ainsi, sur un blog, on veut que les gens qui référencent un article ne fassent pas un lien vers la page d'accueil — alors que celle-ci va tourner au fur et à mesure de l'ajout de nouveaux articles — mais plutôt un lien vers une page précise qui affichera toujours l'article dans deux semaines, quand il ne sera plus sur la page d'accueil.</p> <p>Bien sûr le permalien pointera en général vers l'<span class="caps">URL</span> canonique de l'article, ce qui fait qu'en pratique, ces deux propriétés ont la même valeur.</p> <p>Cependant, les deux notions ne sont pas identiques. On peut imaginer qu'un permalien nous redirige vers l'<span class="caps">URL</span> canonique, laquelle peut changer au cours du temps. Par exemple, lorsque <span class="caps">SPIP</span> sera racheté par la Mozilla Corp., l'<span class="caps">URL</span> canonique de l'article de l'article <a href="http://www.spip.net/fr_article1475.html" class='spip_out' rel='external'>« Est-ce que je peux... »</a>, qui est actuellement <code class='spip_code' dir='ltr'>http://www.spip.net/fr_article1475.html</code>, deviendra (sur ordre du département marketing) <code class='spip_code' dir='ltr'>https://spip.mozcorp.world/Est-ce-que-je-peux.html</code>.</p> <p>L'<span class="caps">URL</span> canonique de cet article aura donc changé. Mais <code class='spip_code' dir='ltr'>http://www.spip.net/fr_article1475.html</code> est et restera un permalien : il affichera toujours le bon article (soit directement, soit en renvoyant le lecteur vers le site <code class='spip_code' dir='ltr'>mozcorp.world</code>).</p> <p>Autrement dit :<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> un permalien (il peut y en avoir plusieurs pour un même article) est un lien qui pointe <i>toujours</i> vers cet article (cette « ressource », en jargon webique). On le code sous la forme <code class='spip_code' dir='ltr'><a rel="bookmark" href="..."></code>. Tant qu'il permet de retrouver la ressource, fût-ce à travers des modifications de formatage des URLs, des redirections et des changements de noms de domaine, c'est un permalien.<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> l'<span class="caps">URL</span> canonique d'une ressource quant à elle est <i>unique</i> (mais pas forcément permanente) : elle signale l'adresse « standard » où il faut aller chercher cette page, même si on l'a trouvée ailleurs. On la référence à l'intérieur de l'entête de la page sous la forme <code class='spip_code' dir='ltr'><link rel="canonical" href="..." /></code>.</p> </blockquote></div> <hr /> <div class='rss_notes'><div id='nb1'> <p>[<a href='#nh1' class='spip_note' title='Notes 1' rev='footnote'>1</a>] Intégré à la branche dev de <span class="caps"><span class="caps">SPIP</span></span> ; on peut utiliser le patch <a href="http://trac.rezo.net/trac/spip/changeset/13773" class='spip_url spip_out' rel='external'>http://trac.rezo.net/trac/spip/chan...</a> si on veut l'utiliser tout de suite en version 2.0 stable.</p> </div></div> Campagne pour l'éradication d'IE 6 http://zzz.rezo.net/Campagne-pour-l-eradication-d-IE-6.html http://zzz.rezo.net/Campagne-pour-l-eradication-d-IE-6.html 2009-02-20T17:14:03Z text/html fr Fil Web <p>De nombreux sites Internet norvégiens viennent de lancer une campagne d'information visant à éradiquer Internet Explorer 6, ce navigateur obsolète mais encore très utilisé, qui ruine la vie des webmestres et empêche les utilisateurs de tirer le meilleur parti d'Internet. Comme eux, nous pensons qu'il est temps de tourner la page ! Voici le code à insérer juste après la balise de vos pages pour afficher cet avertissement en français chez vos visiteurs utilisant IE 6 (et eux uniquement !) : (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> / <a href="http://zzz.rezo.net/+-Web-+.html" rel="tag">Web</a> <div class='rss_texte'><p>De nombreux sites Internet norvégiens viennent de lancer une campagne d'information visant à éradiquer Internet Explorer 6, ce navigateur obsolète mais encore très utilisé, qui ruine la vie des webmestres et empêche les utilisateurs de tirer le meilleur parti d'Internet.</p> <p>Comme eux, nous pensons qu'il est temps de tourner la page !</p> <p><span class='spip_document_8 spip_documents spip_documents_center'> <img src='http://zzz.rezo.net/local/cache-vignettes/L500xH394/ie6-warning-screen-fr-5840b.png' width='500' height='394' alt="" style='height:394px;width:500px;' /></span></p> <p>Voici le code à insérer juste après la balise <code class='spip_code' dir='ltr'><body></code> de vos pages pour afficher cet avertissement en français chez vos visiteurs utilisant <span class="caps">IE</span> 6 (et eux uniquement !) :</p> <form action='' method='get'><div> <input type='hidden' name='exec' value='' /> <textarea readonly='readonly' cols='40' rows='33' class='spip_cadre' dir='ltr'><!--[if lte IE 6]> <style type="text/css"> #ie6msg{border:3px solid #090; margin:8px 0; background:#cfc; color:#000;} #ie6msg h4{margin:8px; padding:0;} #ie6msg p{margin:8px; padding:0;} #ie6msg p a.getie7{font-weight:bold; color:#006;} #ie6msg p a.ie6expl{font-weight:normal; color:#006;} </style> <div id="ie6msg"> <h4>Savez-vous que votre navigateur est obsolète ?</h4> <p>Pour naviguer de la manière la plus satisfaisante sur notre site, nous recommandons que vous procédiez à une mise à jour de votre navigateur. La version actuelle est <a class="getie7" href="http://www.microsoft.com/windows/downloads/ie/getitnow.mspx">Internet Explorer 7</a> et <a class="getie7" href="http://www.microsoft.com/windows/Internet-explorer/beta/default.aspx">Internet Explorer 8</a> est disponible en version beta. La mise à jour est gratuite. Si vous utilisez un PC au travail, veuillez contacter votre service informatique.</p> <p>Si vous le souhaitez, vous pouvez aussi essayer d'autres navigateurs Web populaires comme par exemple <a class="ie6expl" href="http://mozilla.com">FireFox</a>, <a class="ie6expl" href="http://www.opera.com">Opera</a> ou <a class="ie6expl" href="http://www.apple.com/safari/download/">Safari</a></p> </div> <![endif]--></textarea></div></form> <p><small><a href='http://zzz.rezo.net/IMG/txt/ie6-warning-fr.txt' class='spip_in' type='text/plain'>Télécharger ce code</a></small></p> <p>Libre à vous de modifier le texte ou les styles selon votre humeur et vos goûts, ou de placer le bloc <span class="caps">IE6</span> dans la marge de votre site, ou en pied de page. Mais la campagne sera d'autant plus efficace qu'elle sera reconnaissable au premier coup d'œil.</p> <p>Pour en savoir plus, un wiki a été ouvert à l'adresse <a href="http://ie6.forteller.net/" class='spip_url spip_out' rel='external'>http://ie6.forteller.net/</a> ; vous y trouverez le même code dans d'autres langues. Il existe des plugins pour votre blog sous Drupal ou Wordpress <a href="http://ie6.forteller.net/index.php?title=Main_Page#Tools" class='spip_url spip_out' rel='external'>http://ie6.forteller.net/index.php?...</a>. Un plugin pour <a href="http://www.spip-contrib.net/Changez-de-navigateur" class='spip_out' rel='external'><span class="caps">SPIP</span></a> vient de voir le jour.</p> <p>Une fois la campagne activée sur votre site, vous pouvez le signaler sur la page <a href="http://ie6.forteller.net/index.php?title=List#France_2" class='spip_url spip_out' rel='external'>http://ie6.forteller.net/index.php?...</a>, avec une copie d'écran.</p></div> <hr /> <div class='rss_notes'><div id='nb2-'> <p>Cet article est délibérément placé dans le domaine public : recopiez-le et modifiez-le à votre convenance ; le code aussi est libre de droits : mettez-le partout où vous voulez.</p> </div></div> $('.robots-nocontent') .remove(); http://zzz.rezo.net/robots-nocontent-remove.html http://zzz.rezo.net/robots-nocontent-remove.html 2009-02-11T09:06:24Z text/html fr Fil Web <p>Si l'on utilise Yahoo (et en particulier son API de recherche appelée BOSS) pour indexer un site (ou plusieurs), il peut être utile de masquer les blocs de navigation, de manière à ne pas perturber les résultats des recherches par des titres superflus. Pour cela, depuis juin 2007, le robot de Yahoo prend en compte la classe robots-nocontent, qui lui dit que le texte contenu dans les blocs portant cette classe n'est pas du « contenu », autrement dit qu'il ne doit pas servir à l'indexation. Par (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> / <a href="http://zzz.rezo.net/+-Web-+.html" rel="tag">Web</a> <div class='rss_texte'><p>Si l'on utilise Yahoo (et en particulier son <span class="caps">API</span> de recherche appelée <a href="http://developer.yahoo.com/search/boss/" class='spip_out' rel='external'><span class="caps">BOSS</span></a>) pour indexer un site (ou plusieurs), il peut être utile de masquer les blocs de navigation, de manière à ne pas perturber les résultats des recherches par des titres superflus.</p> <p>Pour cela, depuis juin 2007, le robot de Yahoo prend en compte la classe <code class='spip_code' dir='ltr'>robots-nocontent</code>, qui lui dit que le texte contenu dans les blocs portant cette classe n'est pas du « contenu », autrement dit qu'il ne doit pas servir à l'indexation.</p> <p>Par exemple pour demander à Yahoo d'ignorer le texte présent dans la<br class='manualbr' /><code class='spip_code' dir='ltr'><div class="navigation"></code>,<br class='manualbr' />il suffit de transformer le code en<br class='manualbr' /><code class='spip_code' dir='ltr'><div class="navigation robots-nocontent"></code>.</p> <p>Pour visionner le résultat (sur un site utilisant jQuery), on peut se rendre sur la page ainsi marquée, ouvrir la console de Firebug, et taper la commande suivante :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>$('.robots-nocontent').remove();</code></div> <p>Elle fait disparaître de l'écran tous les blocs que Yahoo ignorera.</p> <p>On peut essayer sur <a href="http://www.monde-diplomatique.fr/carnet/2009-02-10-Hopital" class='spip_url spip_out' rel='external'>http://www.monde-diplomatique.fr/ca...</a></p></div> Mailman, postfix et VERP http://zzz.rezo.net/Mailman-postfix-et-VERP.html http://zzz.rezo.net/Mailman-postfix-et-VERP.html 2009-01-10T23:09:05Z text/html fr Fil <p>Attention article démesurément technologique et barbant... Le gestionnaire de mailing-lists Mailman (utilisé sur listes.rezo.net) sait traiter les messages d'erreur (« bounces ») que le serveur reçoit lorsqu'une des adresses email abonnées à une liste ne fonctionne plus. Le but est de désinscrire ces adresses afin de ne pas surcharger le serveur avec des emails abandonnés. Une difficulté est que ces messages sont parfois ambigus : lorsque, par exemple, trois adresses sont fausses dans le même (...)</p> - <a href="http://zzz.rezo.net/-Documentation-.html" rel="directory">Documentation</a> <div class='rss_texte'><p><i>Attention article démesurément technologique et barbant...</i></p> <p>Le gestionnaire de mailing-lists <a href='http://www.list.org/' class='spip_out' rel='external'>Mailman</a> (utilisé sur <a href="http://listes.rezo.net/" class='spip_out' rel='external'>listes.rezo.net</a>) sait traiter les messages d'erreur (« bounces ») que le serveur reçoit lorsqu'une des adresses email abonnées à une liste ne fonctionne plus. Le but est de désinscrire ces adresses afin de ne pas surcharger le serveur avec des emails abandonnés.</p> <p>Une difficulté est que ces messages sont parfois ambigus :<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> lorsque, par exemple, trois adresses sont fausses dans le même domaine, il arrive que ce domaine ne renvoie qu'un seul message d'erreur indiquant, dans un format non standardisé, les trois adresses ;<br /><img src='http://zzz.rezo.net/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt="-" style='height:11px;width:8px;' /> autre exemple : lorsque l'adresse <code class='spip_code' dir='ltr'>toto@domaine.tld</code> est abonnée, mais que son propriétaire l'a redirigée vers <code class='spip_code' dir='ltr'>toto2@un-autre.tld</code>, et que cette seconde adresse est devenue fausse elle aussi, le serveur recevra une erreur de <code class='spip_code' dir='ltr'>un-autre.tld</code> sans avoir aucun moyen de deviner que c'est <code class='spip_code' dir='ltr'>toto@domaine.tld</code> qui en est la cause.</p> <p>La solution à ce problème est le « chemin d'adresse de retour variable dans l'enveloppe », en anglais Variable Envelope Return Paths — <span class="caps">VERP</span> (ouf !) [<a href='#nb2-1' class='spip_note' rel='footnote' title='Cf. http://postfix.traduc.org/index.php....' id='nh2-1'>1</a>].</p> <p>De quoi s'agit-il ? Le protocole <span class="caps">SMTP</span> dit qu'un email a le bon goût d'être entouré d'une <i>enveloppe.</i> Laquelle dit deux choses, et seulement deux :</p> <ol class="spip"><li> qui est l'émetteur : <code class='spip_code' dir='ltr'>MAIL FROM: <emetteur@listes.tld></code></li> <li> qui est (sont) le(s) destinataire(s). Une ou plusieurs ligne du type :<br class='manualbr' /><code class='spip_code' dir='ltr'>RCPT TO: <destinataire1@domaine1.tld></code><br class='manualbr' /><code class='spip_code' dir='ltr'>RCPT TO: <destinataire2@domaine2.tld></code></li> </ol> <p>Le reste (sujet, contenu du message, pièces jointes, entêtes divers) se trouve « à l'intérieur » de l'enveloppe, après une commande <code class='spip_code' dir='ltr'>DATA</code> et, pour nos histoires, ne nous intéresse pas : le rôle du gestionnaire de mailing-liste (Mailman) est de créer le message, de le mettre dans la bonne enveloppe, et de donner cette enveloppe à l'« agent de transport » (Mail Transport Agent, <span class="caps">MTA</span>), en l'occurrence le serveur <a href='http://www.postfix.org/' class='spip_out' rel='external'>postfix</a>, qui se charge alors d'envoyer l'enveloppe à son (ses) destinataire(s).</p> <p>Traditionnellement, l'enveloppe d'un message émis depuis la liste <code class='spip_code' dir='ltr'>test@rezo.net</code> et destiné à <code class='spip_code' dir='ltr'>toto@domaine.tld</code> sera de la forme :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>MAIL FROM: <test-bounces@rezo.net><br /> RCPT TO: <toto@domaine.tld></code></div> <p>Derrière l'adresse <code class='spip_code' dir='ltr'>test-bounces</code> réside un script qui reçoit les messages d'erreur de type « erreur de remise de message » (c'est-à-dire, dans le jargon du mail, les bounces).</p> <p>Si on emploie <span class="caps">VERP</span>, l'enveloppe sera transformée de la manière suivante :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>MAIL FROM: <test-bounces+toto=domaine.tld@rezo.net><br /> RCPT TO: <toto@domaine.tld></code></div> <p>On voit que les bounces de l'adresse <code class='spip_code' dir='ltr'>toto@domaine.tld</code> seront distribués de façon non ambigüe à <code class='spip_code' dir='ltr'>test-bounces+toto=domaine.tld@rezo.net</code>. Le script d'analyse des bounces saura donc avec certitude que ce message d'erreur est lié à l'adresse <code class='spip_code' dir='ltr'>toto@domaine.tld</code>, sans même avoir à lire le contenu du message d'erreur.</p> <p>Ca, c'est pour <span class="caps">VERP</span>. Maintenant, l'énorme inconvénient de <span class="caps">VERP</span> est qu'il n'est plus possible de faire une seule enveloppe adressée à plusieurs destinataires. Or, lorsqu'on envoie un même mail sur une liste de plusieurs centaines de milliers de destinataires, il est utile de ne pas avoir à créer un message + une enveloppe par email, ne serait-ce que pour éviter de saturer le serveur.</p> <p>Heureusement, postfix accepte qu'on lui donne un même message pour plusieurs destinataires dans une seule enveloppe, en le chargeant de produire lui-même les enveloppes <span class="caps">VERP</span> au moment où il se connecte aux serveurs des destinataires. Pour cela il faut que Mailman lui donne l'instruction <code class='spip_code' dir='ltr'>XVERP</code> au moment de l'envoi. C'est à ça que sert le patch suivant : <a href="http://lists.freebsd.org/pipermail/freebsd-ports-bugs/2007-October/128777.html" class='spip_url spip_out' rel='external'>http://lists.freebsd.org/pipermail/...</a>, que l'on retrouve dans une version plus à jour en <a href="http://www.mail-archive.com/mailman-users@python.org/msg52169.html" class='spip_url spip_out' rel='external'>http://www.mail-archive.com/mailman...</a>.</p> <p>Une fois ce patch appliqué aux fichiers <code class='spip_code' dir='ltr'>Mailman/Defaults.py</code> et <code class='spip_code' dir='ltr'>Mailman/Handlers/SMTPDirect.py</code>, il faut configurer Mailman (fichier <code class='spip_code' dir='ltr'>~mailman/Mailman/mm_cfg.py</code>) de manière à ce qu'il l'utilise :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>VERP_PROBES = Yes<br /> VERP_PASSWORD_REMINDERS = Yes<br /> VERP_PERSONALIZED_DELIVERIES = Yes<br /> VERP_DELIVERY_INTERVAL = 1<br /> VERP_CONFIRMATIONS = Yes<br /> VERP_STYLE = 'Postfix'</code></div> <p>Ajouter également à <code class='spip_code' dir='ltr'>/etc/postfixmain.cf</code> une ligne pour autoriser les clients locaux (en l'occurrence, Mailman), à exploiter l'extension <code class='spip_code' dir='ltr'>XVERP</code> :</p> <div style='text-align: left;' class='spip_code' dir='ltr'><code>smtpd_authorized_verp_clients=127.0.0.0/8</code></div> <p>Dès lors les mails passent en « une seule enveloppe » [<a href='#nb2-2' class='spip_note' rel='footnote' title='En réalité, n enveloppes destinées chacune à un maximum de 500 (...)' id='nh2-2'>2</a>] de Mailman vers postfix, lequel les émet ensuite en <span class="caps">VERP</span> vers les différents destinataires.</p></div> <hr /> <div class='rss_notes'><div id='nb2-1'> <p>[<a href='#nh2-1' class='spip_note' title='Notes 2-1' rev='footnote'>1</a>] <i>Cf.</i> <a href="http://postfix.traduc.org/index.php/VERP_README.html" class='spip_url spip_out' rel='external'>http://postfix.traduc.org/index.php...</a>.</p> </div> <div id='nb2-2'> <p>[<a href='#nh2-2' class='spip_note' title='Notes 2-2' rev='footnote'>2</a>] En réalité, <i>n</i> enveloppes destinées chacune à un maximum de 500 destinataires.</p> </div></div>