<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.sorcellerieweb.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/">
<channel>
  <title>Sorcellerie Web</title>
  <link>http://blog.sorcellerieweb.net/</link>
  <description>Bienvenue dans l'antre d'un sorcier du web. Ici vous seront dévoilées les formules les plus secrètes, les potions les plus goutues, les sorts les plus faramineux pour en mettre plein la vue à vos collègues nerds avec votre sorcellerie web niveau 36. Ou au moins à mettre en ligne un gif animé.</description>
  <language>fr</language>
  <pubDate>Tue, 15 Jul 2008 11:46:58 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Widget Gtalk</title>
    <link>http://blog.sorcellerieweb.net/post/2008/02/27/Widget-Gtalk</link>
    <guid isPermaLink="false">urn:md5:c5c9912f4687c8792b0dac747dc45788</guid>
    <pubDate>Wed, 27 Feb 2008 12:05:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Bave de crapaud</category>
        <category>jabber</category><category>widget</category>    
    <description>    &lt;p&gt;Je viens de découvrir (&lt;a href=&quot;http://winsa.free.fr/wordpress/?p=311&quot; hreflang=&quot;fr&quot;&gt;via Koops&lt;/a&gt;) que Google &lt;a href=&quot;http://www.google.com/talk/service/badge/New&quot; hreflang=&quot;fr&quot;&gt;propose un widget
Gtalk&lt;/a&gt; pour blog permettant aux visiteurs de la page sur laquelle il est
embarqué de vous contacter sur votre messagerie. (Gtalk est son service jabber
fournir avec chaque adresse Gmail).&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Ma première réaction :&lt;/dt&gt;
&lt;dd&gt;Wouah, super pratique, je vais le coller illico un peu partout, notamment
sur &lt;a href=&quot;http://netvibes.com/fredbird&quot;&gt;mon univers netvibes&lt;/a&gt;.&lt;/dd&gt;
&lt;dt&gt;Deuxième réaction :&lt;/dt&gt;
&lt;dd&gt;Combien de temps avant de me faire spammer ma messagerie instantanée ?&lt;/dd&gt;
&lt;/dl&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2008/02/27/Widget-Gtalk#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2008/02/27/Widget-Gtalk#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/214445</wfw:commentRss>
      </item>
    
  <item>
    <title>Actu Webappkit</title>
    <link>http://blog.sorcellerieweb.net/post/2008/02/15/Actu-Webappkit</link>
    <guid isPermaLink="false">urn:md5:8e7274c07a04fff55d102367def1b679</guid>
    <pubDate>Fri, 15 Feb 2008 21:57:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Golems</category>
            
    <description>    &lt;p&gt;La version 0.10.1 est disponible depuis quelques jours. Le site web vient
d'être mis à jour.&lt;/p&gt;
&lt;blockquote&gt;Webappkit est un système de paquets et un meta-framework pour PHP.
C'est un logiciel libre et gratuit, taillé pour le développement
agile.&lt;/blockquote&gt;
&lt;a href=&quot;http://webappkit.net&quot;&gt;Pour en savoir plus.&lt;/a&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Ali Baba et les 40 mauvaises pratiques du programmeur (PHP)</title>
    <link>http://blog.sorcellerieweb.net/post/2008/02/12/Ali-Baba-et-les-40-mauvaises-pratiques-du-programmeur-PHP</link>
    <guid isPermaLink="false">urn:md5:a5669d17509f7bda50723b8ce730483e</guid>
    <pubDate>Thu, 14 Feb 2008 18:39:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Bave de crapaud</category>
        <category>php</category><category>pratique</category>    
    <description>&lt;p&gt;Je suis tombé via le &lt;a href=&quot;http://www.galaxie-php.info/&quot; hreflang=&quot;fr&quot;&gt;planet PHP&lt;/a&gt; sur une liste de &lt;a href=&quot;http://reinholdweber.com/?p=19&quot; hreflang=&quot;en&quot;&gt;40 points qui font un mauvais programmeur PHP&lt;/a&gt;. Je vais
essayer de la traduire et de la commenter.&lt;/p&gt;    &lt;dl&gt;
&lt;dt&gt;1 - Ne pas commenter son code proprement suivant un standard comme &lt;a href=&quot;http://www.phpdoc.org/&quot; hreflang=&quot;en&quot;&gt;phpDoc&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;C'est le service minimum en matière de commentaires. Il est vital de savoir
ce qu'une fonction attend en parametre et ce qu'elle retourne. De plus, cela
permet la génération d'une documentation; et certains éditeurs tels que
&lt;a href=&quot;http://www.activestate.com/komodo_ide&quot; hreflang=&quot;en&quot;&gt;Komodo edit&lt;/a&gt;
s'en servent pour afficher une aide en ligne lorsque vous y faites appel .&lt;/dd&gt;
&lt;dt&gt;2 - Ne pas voir le bénéfice d'un bon outil de développement intégré tel que
Zend Studio ou Eclipse.&lt;/dt&gt;
&lt;dd&gt;Ces usines à gaz ? Non, désolé.&lt;/dd&gt;
&lt;dt&gt;3 - N'avoir jamais utilisé d'outil de contrôle de versions tel que &lt;a href=&quot;http://subversion.tigris.org/&quot; hreflang=&quot;en&quot;&gt;Subversion&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Plus que la qualité du programmeur, je crois que c'est surtout une question
de projet. Pour une appli professionnelle ou un projet open source, c'est
vital, mais on n'a pas toujours un serveur subversion sous la main pour un site
perso....&lt;/dd&gt;
&lt;dt&gt;4 - Ne pas adopter de convention de codage et de nommage et s'y tenir, au
moins à l'échelle d'un projet.&lt;/dt&gt;
&lt;dd&gt;Qui ne s'est pas déjà arraché les cheveux avec le nom des fonctions natives
php (avec ou sans underscore), et pire l'ordre des arguments qui varie d'une
fonction à l'autre ?&lt;/dd&gt;
&lt;dt&gt;5 - Ne pas adopter une méthodologie constante&lt;/dt&gt;
&lt;dd&gt;Faudrait déjà en avoir une. Personnellement, je suis plutôt habitué à
&lt;a href=&quot;http://www.cafenware.org/la-rache&quot; hreflang=&quot;fr&quot;&gt;La Rache&lt;/a&gt;.&lt;/dd&gt;
&lt;dt&gt;6 - Ne pas échapper ou valider les variables pour les requêtes SQL&lt;/dt&gt;
&lt;dd&gt;Là c'est plus de la mauvaise programmation, c'est l'amour du risque.&lt;/dd&gt;
&lt;dt&gt;7 - Ne pas planifier l'application avant de commencer à coder.&lt;/dt&gt;
&lt;dd&gt;Dans un monde idéal, les utilisateurs sauraient ce qu'ils veulent les
spécifications ne changeraient pas tous les trois mois. Dans un monde
idéal.&lt;/dd&gt;
&lt;dt&gt;8 - Ne pas pratiquer le développement dirigé par les tests.&lt;/dt&gt;
&lt;dd&gt;Les test unitaires, c'est bon. Mangez-en.&lt;/dd&gt;
&lt;dt&gt;9 - Désactiver l'affichage des erreurs&lt;/dt&gt;
&lt;dd&gt;La première fois qu'on l'active, ça fait mal. Mais après, c'est tellement
bon. Et surtout, cela permet généralement de préparer en douceur la prochaine
mise à jour de PHP.&lt;/dd&gt;
&lt;dt&gt;10 - Ne pas voir les bénéfices d'un débogueur&lt;/dt&gt;
&lt;dd&gt;Il n'y a qu'un débogueur ici, c'est moi. Sans rire, pour un langage web
interprété, le débogueur, c'est un petit coup de rafraichissement de la page.
Non ?&lt;/dd&gt;
&lt;dt&gt;11 - Ne pas refactoriser son code&lt;/dt&gt;
&lt;dd&gt;On peut faire autrement ? Mon nom est Refactoring. Constant
Refactoring.&lt;/dd&gt;
&lt;dt&gt;12 - Ne pas séparer les couches de traitement en utilisant un motif tel que
MVC.&lt;/dt&gt;
&lt;dd&gt;Ou MVT. Elementaire, mon cher Django.&lt;/dd&gt;
&lt;dt&gt;13 - Ne pas connaitre les acronymes KISS, DRY, MVC, OOP, REST&lt;/dt&gt;
&lt;dd&gt;Mouais, pas besoin de connaitre les acronymes pour pratiquer.&lt;/dd&gt;
&lt;dt&gt;14 - Ne pas retourner de contenu mais faire des print() depuis les
fonctions et classes&lt;/dt&gt;
&lt;dd&gt;Autrement dit, éviter les effets de bord. Et appliquer le principe de la
séparation des couches de traitement.&lt;/dd&gt;
&lt;dt&gt;15 - Ne pas connaitre les avantages des tests unitaires et des tests en
général&lt;/dt&gt;
&lt;dd&gt;On avait pas dit DRY ? cf #8&lt;/dd&gt;
&lt;dt&gt;16 - Retourner du html au lieu de données / objets&lt;/dt&gt;
&lt;dd&gt;Pareil, voir #14&lt;/dd&gt;
&lt;dt&gt;17 - Coder en dur les messages et les parametres de configuration&lt;/dt&gt;
&lt;dd&gt;Coder en dur, c'est mal&lt;/dd&gt;
&lt;dt&gt;18 - Ne pas optimiser ses requetes SQL&lt;/dt&gt;
&lt;dd&gt;Je veux bien, mais qui le fait vraiment au lieu de juste le prétendre
?&lt;/dd&gt;
&lt;dt&gt;19 - Ne pas utiliser __autoload()&lt;/dt&gt;
&lt;dd&gt;J'ai la malchance de maintenir des applications PHP4. Mais j'ai mieux
qu'autoload : &lt;a href=&quot;http://webappkit.net&quot;&gt;Webappkit&amp;quot;&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;20 - Ne pas autoriser la gestion intelligente des erreurs&lt;/dt&gt;
&lt;dd&gt;???&lt;/dd&gt;
&lt;dt&gt;21 - Utiliser GET au lieu de POST pour toutes les actions de
destruction&lt;/dt&gt;
&lt;dd&gt;Ca, c'est pour les applications accessibles aux moteurs de recherche. Qui
suivront tous les liens en GET qu'ils trouveront. Et ne savent pas si cela
correspond à un document ou une action sur un document. Trop dur pour
vous.&lt;/dd&gt;
&lt;dt&gt;22 - Ne pas savoir se servir des expressions régulières&lt;/dt&gt;
&lt;dd&gt;Qui voudrait se priver de si belles migraines ?&lt;/dd&gt;
&lt;dt&gt;23 - N'avoir jamais entendu parler d'injection SQL ou de scripting
multisites&lt;/dt&gt;
&lt;dt&gt;24 - Ne pas permettre de configurer simplement ses classes, que ce soit par
arguments passés au constructeur, via des méthodes dédiées ou des
constantes&lt;/dt&gt;
&lt;dd&gt;Je suis moi-même un fanatique de la configurabilité. Un bon script
générique avec une configuration spécifique peut parfois permettre de
s'économiser bien des lignes de code. C'est ce qui a présidé au concept des
Outils (&lt;em&gt;Tools&lt;/em&gt;) pour Webappkit.&lt;/dd&gt;
&lt;dt&gt;25 - Ne pas connaitre les bénéfices et limitations de la programmation
orienté objet&lt;/dt&gt;
&lt;dd&gt;J'ai du mal à me souvenir de ma brève période procédurale puis
fonctionnelle...&lt;/dd&gt;
&lt;dt&gt;26 - Mal utiliser la POO&lt;/dt&gt;
&lt;dt&gt;27 - Penser que du code réutilisable implique du code POO&lt;/dt&gt;
&lt;dd&gt;Parfois une bonne fonction peut suffire, mais ça devient rare...&lt;/dd&gt;
&lt;dt&gt;28 - Mal choisir ses valeurs par défaut&lt;/dt&gt;
&lt;dt&gt;29 - Ne pas avoir un unique fichier de configuration&lt;/dt&gt;
&lt;dd&gt;Pas d'accord. Les premières versions de webappkit fonctionnaient comme cela
et pour de grosses applis, cela devient un enfer à maintenir. D'autant que tout
n'est pas forcément utilisé et ralentit donc inutilement le tout.&lt;/dd&gt;
&lt;dt&gt;30 - Croire masquer le contenu d'un script en le renommant .inc au lieu de
.php&lt;/dt&gt;
&lt;dt&gt;31 - Ne pas utiliser une couche d'abstraction de base de données.&lt;/dt&gt;
&lt;dd&gt;Je plaide coupable. Je suis masochiste et je préfère faire mon SQL à la
main.&lt;/dd&gt;
&lt;dt&gt;32 - Se répéter. Si vous devez faire du copier-coller de code, il y a sans
doute une erreur de design.&lt;/dt&gt;
&lt;dt&gt;33 - don't make a function/class/method do just one thing and don't make
them interact.&lt;/dt&gt;
&lt;dd&gt;Moi pas compris. Toi parler moi ?&lt;/dd&gt;
&lt;dt&gt;34 - Ne pas se servir des mécanismes objets tels qu'interface, héritage
multiple et (modifeurs d'accès ?)&lt;/dt&gt;
&lt;dt&gt;35 - Ne pas optimiser l'architectire de son application en suivant les
motifs de conceptions éprouvés.&lt;/dt&gt;
&lt;dt&gt;36 - Ne pas autoriser les chemins relatifs&lt;/dt&gt;
&lt;dd&gt;Les chemins absolus, c'est le mal. Vous brulerez en enfer pour cela.&lt;/dd&gt;
&lt;dt&gt;37 - Polluer l'espace de nommage global en en préfixant pas ses noms de
fonctions.&lt;/dt&gt;
&lt;dt&gt;38 - Ne pas autoriser le prefixage des tables de sa base de données&lt;/dt&gt;
&lt;dt&gt;39 - Utiliser un moteur de gabarits séparé&lt;/dt&gt;
&lt;dd&gt;Hein ? Quoi ? Qu'est-ce qu'il entend par &amp;quot;séparé&amp;quot; ?&lt;/dd&gt;
&lt;dt&gt;40 - Ne pas s'inspirer des frameworks PHP existants&lt;/dt&gt;
&lt;dd&gt;Les frameworks Python, ça compte ?&lt;/dd&gt;
&lt;/dl&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2008/02/12/Ali-Baba-et-les-40-mauvaises-pratiques-du-programmeur-PHP#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2008/02/12/Ali-Baba-et-les-40-mauvaises-pratiques-du-programmeur-PHP#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/208332</wfw:commentRss>
      </item>
    
  <item>
    <title>Fichiers de configuration</title>
    <link>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration</link>
    <guid isPermaLink="false">urn:md5:6141a8df36266042717321c4a8302074</guid>
    <pubDate>Fri, 07 Dec 2007 16:27:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>ini</category><category>php</category><category>pratique</category><category>python</category><category>xml</category><category>yaml</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/advanced-directory.png&quot; alt=&quot;configuration-48x48&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Lorsqu'on développe une application
ou un composant de manière à pouvoir le réutiliser, il est nécessaire de
pouvoir définir une configuration d'environnement de manière séparée du code.
Cela peut être fait par inclusion d'un fichier se contentant de déclarer un
suite de variables ou de constantes dans le language de l'application (c'est le
cas des fichiers urls.py et settings.py de Django). Mais il est généralement
préférable d'utiliser un format qui puisse être lu et modifié par un
non-programmeur.&lt;/p&gt;    &lt;h3&gt;Le format INI&lt;/h3&gt;
&lt;p&gt;A la fois très simple et très largement utilisé, le &lt;a href=&quot;http://fr.wikipedia.org/wiki/Fichier_INI&quot;&gt;format INI&lt;/a&gt; permet de définir des
paires clefs/valeur, éventuellement organisées par sections. Il est
suffisamment intuitif pour être modifié par quelqu'un qui n'en connait pas la
syntaxe.&lt;/p&gt;
&lt;p&gt;C'est le format de configuration de PHP, et une &lt;a href=&quot;http://fr.php.net/manual/fr/function.parse-ini-file.php&quot;&gt;fonction native&lt;/a&gt;
permet de lire un tel fichier et de récupérer directement les données stockées
dans un tableau associatif, à deux dimensions en activant le support des
sections.&lt;/p&gt;
&lt;p&gt;Python dispose du module &lt;a href=&quot;http://docs.python.org/lib/module-ConfigParser.html&quot;&gt;ConfigParser&lt;/a&gt;, qui
supporte une syntaxe un peu plus évoluée.&lt;/p&gt;
&lt;h3&gt;Le format XML&lt;/h3&gt;
&lt;p&gt;Le patriarche des formats de structuration et d'échange de données. Plus
qu'un format de fichier, &lt;a href=&quot;http://fr.wikipedia.org/wiki/Xml&quot;&gt;XML&lt;/a&gt; est
une grammaire dont dérivent des zillions de syntaxes, qu'elles soient
standardisées ou propriétaires. Très largement utilisé pour la configuration
d'application, ce n'est pourtant pas forcément des plus simples à éditer. De
plus, il est généralement assez lourd à manipuler en programmation, ce qui
n'est pas terrible en termes de performance. Surtout dans le cadre d'une
application web, si celle-ci doit lire le fichier à chaque requete...&lt;/p&gt;
&lt;h3&gt;Le format YAML&lt;/h3&gt;
&lt;p&gt;Si vous avez besoin de données de configuration plus élaborées, notamment
s'il vous faut plus de deux niveaux de données ou des textes sur plusieurs
lignes, il y a le &lt;a href=&quot;http://fr.wikipedia.org/wiki/Yaml&quot;&gt;format YAML&lt;/a&gt;.
Celui-ci se veut une alternative à XML, qui soit à la fois plus concise (donc
plus légère à stocker) et plus lisible pour un être humain. Ce qui en fait un
candidat idéal pour des fichiers de configuration. Comme en Python,
l'indentation y joue un rôle clef.&lt;/p&gt;
&lt;p&gt;Contrairement à INI, il n'est pas supporté nativement par PHP, mais la
&lt;a href=&quot;http://spyc.sourceforge.net/&quot;&gt;librairie Spyc&lt;/a&gt; permet de convertir
ces fichiers en tableaux de données et inversement.&lt;/p&gt;
&lt;p&gt;Python dispose de la librairie &lt;a href=&quot;http://pyyaml.org/&quot;&gt;PyYaml&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/183556</wfw:commentRss>
      </item>
    
  <item>
    <title>Détecter les préférences du navigateur</title>
    <link>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur</link>
    <guid isPermaLink="false">urn:md5:510611bfcda35e6c51595ad2ad8b719d</guid>
    <pubDate>Mon, 03 Dec 2007 19:34:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>ergonomie</category><category>http</category><category>i18n</category><category>php</category>    
    <description>&lt;p&gt;Il bien plus agréable pour l'internaute de disposer directement du contenu
qui le concerne (langue, navigateur, OS...) plutot que de devoir fouiller le
site web pour l'obtenir. Cela améliore son expérience de navigation, et donc
l'attrait pour votre site.&lt;/p&gt;    &lt;p&gt;Beaucoup d'entre nous se sont habitués à chercher, en arrivant sur un site,
s'il n'en existait pas une version dans sa propre langue. On cherche alors où
sont les petits drapeaux, les micro-liens avec code de langue sur deux
caractères, etc. Et beaucoup d'utilisateurs ne les trouvent pas, et quittent le
site immédiatement, faute de pratiquer la langue affichée. Pourtant, quand le
contenu d'un site est traduit, le plus gros du travail est fait; pourquoi ne
pas l'afficher directement dans la langue spécifiée par l'internaute pour son
navigateur ?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/bookmarklets_delicious_oper.png&quot; alt=&quot;bookmarklets_delicious_oper.png&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Ceci est également valable pour d'autres
préférences. La &lt;a href=&quot;http://www.mozilla-europe.org/fr/products/firefox/&quot;&gt;page de téléchargement de
Firefox&lt;/a&gt; par exemple est non seulement traduite dans la langue de
l'internaute, mais la version proposée au téléchargement est celle
correspondant à son système d'exploitation. Tout aussi efficace, la &lt;a href=&quot;http://del.icio.us/help/buttons&quot;&gt;page de &lt;em lang=&quot;en&quot;&gt;bookmarklets&lt;/em&gt;&lt;/a&gt; pour &lt;a href=&quot;http://del.icio.us&quot;&gt;Del.icio.us&lt;/a&gt;
est automatiquement adaptée au navigateur en cours. Ceci est possible grâce aux
données de préférences et d'environnement utilisateur transmises par le
navigateur au serveur web via les en-têtes HTTP.&lt;/p&gt;
&lt;p&gt;Outre les préférences de langue, et les particularités eventuelles de
l'environnement système d'exploitation/navigateur, il peut être souhaitable de
détecter le support de javascript, surtout pour les sites utilisant ajax pour
certaines de leurs fonctionnalités. Tout comme le support de flash. La liste
est longue, car les possibilités d'HTTP sont encore largement
sous-utilisées.&lt;/p&gt;
&lt;p&gt;Bien evidemment, il faut garder à l'esprit que ces données ne sont pas
fiables, et ne doivent être utilisées que pour définir la version du contenu
par défaut, et toujours permettre à l'utilisateur de modifier ces réglages si
possible via des liens et des contrôles manuels.&lt;/p&gt;
&lt;p&gt;Pour ce qui est de PHP, vous pouvez utiliser un de mes bouts de script (
&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP&quot; hreflang=&quot;en&quot;&gt;getting browser language settings with php&lt;/a&gt;), ou la &lt;a href=&quot;http://phpsniff.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;classe phpsniff&lt;/a&gt; qui semble
bien plus complete (pas encore utilisée, je viens de tomber dessus).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2007/12/03/#&quot; title=&quot;Additious&quot;&gt;&lt;img src=&quot;http://www.additious.com/images/additious_boutons/additious_orange.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/181418</wfw:commentRss>
      </item>
    
  <item>
    <title>Optimisation PHP : les chaines de caractères</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres</link>
    <guid isPermaLink="false">urn:md5:20089db4b87600f50fa4ca0d8edabb4f</guid>
    <pubDate>Fri, 30 Nov 2007 12:16:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>optimisation</category><category>php</category>    
    <description>&lt;p&gt;Voici une petite astuce concernant les chaînes de caractères pour optimiser
vos scripts PHP, que certains découvriront peut-être. Prenez l'habitude
d'utiliser les apostrophes (&lt;q lang=&quot;en&quot;&gt;simple quotes&lt;/q&gt;)
plutôt que les guillemets (&lt;q lang=&quot;en&quot;&gt;double quotes&lt;/q&gt;). Ceci
parce que les chaines entre guillemets peuvent contenir des variables qui
seront évalués à l'éxécution. Par exemple :&lt;/p&gt;    &lt;pre&gt;
&lt;code&gt;$uper_riche='Picsou';

// ceci affiche : Bonjour, je suis Picsou
echo &amp;quot;Bonjour, je suis $uper_riche&amp;quot;;

// alors que ceci affiche : Bonjour, je suis $uper_riche
echo 'Bonjour, je suis $uper_riche';

// on peut utiliser les accolades pour acceder à des noms complexes
$Picsou-&amp;gt;neveux=array('Riri','Fifi','Loulou');
// ceci affichera : Le second neveu de Picsou est Fifi, il en a trois
echo &amp;quot;Le second neveu de Picsou est {$Picsou-&amp;gt;neveux[1]}, il en a trois&amp;quot;;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Ce qui double son travail, car le code est d'abord interprété une première
fois à la lecture du script et découpé en blocs sémantiques (&lt;q lang=&quot;en&quot;&gt;chunks&lt;/q&gt;) : variables, chaines, instructions etc. Une chaine
entre apasotrophes sera alors conservée telle quelle jusqu'à la fin de
l'execution du script, alors qu'une chaine entre guillemets devra être
interprétée à chaque évaluation. Par conséquent, il vaut mieux les éviter
autant que possible. Par exemple :&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/**
* on construit une chaine de caracteres dynamiques en separant bien les chunks variables des blocs statiques
*/
$html='&amp;lt;p&amp;gt;Bonjour, je suis '.$uper_riche.'&amp;lt;/p&amp;gt;';

/**
* on ne force pas l'evaluation du parametre passe a une fonction
*/
echo 'Qui est le plus riche ? '.strtoupper('picsou !');

/**
* idem pour les clefs d'un tableau associatif
*/
echo $personnages['picsou']['neveux'][1];&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;C'est le genre de petites choses qui peuvent paraitre évidentes une fois
devenues une habitude, mais qui ensuite évitent de plomber vos scripts
inutilement.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/180560</wfw:commentRss>
      </item>
    
  <item>
    <title>Webappkit : un système de paquets pour PHP</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/27/Webappkit</link>
    <guid isPermaLink="false">urn:md5:c2fc088ac22ce88cd2654d3685782998</guid>
    <pubDate>Wed, 28 Nov 2007 00:14:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Golems</category>
        <category>php</category><category>webappkit</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/php-logo.png&quot; alt=&quot;logo PHP&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Le but de &lt;a href=&quot;http://webappkit.net&quot; hreflang=&quot;en&quot;&gt;Webappkit&lt;/a&gt;, c'est de faciliter la réutilisation et le partage
de briques logicielles PHP pour les applications web. Pour les développeurs,
cela permet de se concentrer sur le code spécifique de l'application en
facilitant l'intégration de librairies génériques existantes. Pour les
&lt;em&gt;simples bidouilleurs&lt;/em&gt; ou webmestres, de créer leur site en assemblant
des applications existantes telles que blog, forum, suivi statistique etc.&lt;/p&gt;    &lt;p&gt;C'est un de mes projets, et un logiciel libre hébergé sur &lt;a href=&quot;http://code.google.com/p/webappkit/&quot; hreflang=&quot;en&quot;&gt;Google Code&lt;/a&gt;.
Initialement, il s'agissait d'un meta-framework permettant de définir une pile
de scripts à exécuter pour une url ou une branche du site. Depuis la version
0.8, j'ai changé d'approche pour me concentrer sur un système de paquets nommés
&lt;em&gt;kits&lt;/em&gt; et qui peuvent contenir de la simple librairie (avec gestion des
dépendances) à l'application complète.&lt;/p&gt;
&lt;p&gt;Tout naturellement, j'ai organisé mes propres librairies sous formes de
kits. Elles sont incluses dans l'archive disponible au téléchargement, et je
les détaillerai ici prochainement. &lt;a href=&quot;http://code.google.com/p/webappkit/downloads/list&quot; hreflang=&quot;en&quot;&gt;Télécharger
webappkit&lt;/a&gt; (la version actuelle est 0.9 alpha). Le projet dispose de
&lt;a href=&quot;http://blog.webappkit.net/&quot; hreflang=&quot;en&quot;&gt;son propre blog&lt;/a&gt; (en
anglais), pour en suivre l'actualité, ainsi qu'un &lt;a href=&quot;http://groups.google.com/group/webappkit&quot;&gt;groupe de discussion google&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Utiliser un kit de librairie&lt;/h3&gt;
&lt;p&gt;Commençons par détailler l'usage le plus simple : un kit de librairie.
Concrètement, les kits sont des dossiers à regrouper dans un même repertoire
accessible par vos scripts (généralement webappkit/). Pour charger un kit, il
faut alors appeler :&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
/**
* inclusion des librairies du base de webappkit
*/
include_once('webappkit/include-me.php');
/**
* les librairies du kit sont alors incluses, ainsi que les dependances
*/
Webappkit::loadKit('mon_kit');
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Les kits peuvent également être organisés en arborescence, un kit contenant
lui même des kits ;il est alors possible de charger directement un sous-kit si
l'on n'a pas besoin du paquet total. D'ailleurs, charger un kit ne chargera pas
nécessairement tous ses sous-kits, il est possible de définir les sous-kits qui
seront chargés lors de l'appel du kit parent.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
/**
* chargement d'un sous-kit
*/
Webappkit::loadKit('mon_kit.un_sous_kit');
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Dans les prochains billets, je détaillerai les usages plus avancés, ainsi
que la construction des kits.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/27/Webappkit#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/27/Webappkit#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/179575</wfw:commentRss>
      </item>
    
  <item>
    <title>Sorcellerie Web</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/24/Sorcellerie-Web</link>
    <guid isPermaLink="false">urn:md5:3a9171b1601eed8a44c0628fc6b8ca72</guid>
    <pubDate>Tue, 27 Nov 2007 12:30:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Le chat du sorcier</category>
            
    <description>&lt;p&gt;Il y a dix ans, j'achetais un modem. C'était bien sûr en &lt;acronym title=&quot;Reseau Telephonique Commuté&quot;&gt;RTC&lt;/acronym&gt;, qui me permettait de foncer sur
les autoroutes de l'information à la vitesse royale de 33,6Ko/s. Quelques
semaines plus tard, j'achetais un livre de référence sur HTML (alors en version
3) et bricolais mon premier site web au bloc-notes. A vrai dire, je
n'envisageais même pas encore la possibilité qu'il puisse exister un logiciel
permettant de le faire autrement. Et puis il faut dire que j'aime bien mettre
les mains dans le cambouis, histoire de comprendre comment ça marche.&lt;/p&gt;    &lt;p&gt;J'ai fini par en faire ma profession : développeur web. Comme c'est souvent
assez vague pour les non-informaticiens, j'ai coutume de dire que je suis
dresseur d'ordinateurs, ou encore que je passe ma journée à écrire des formules
magiques, des sorts qui sont lancés chaque fois que la page web est appelée.
Comme la sorcellerie, le développement met en jeu des languages et des procédés
incompréhensibles pour les &lt;em&gt;non-initiés&lt;/em&gt;. Par contre, il n'y a rien de
secret pour qui veut apprendre - a condition de ne pas être rebuté par les gros
grimoires, et d'avoir la patience de subir quelques messages d'erreur avant de
pouvoir réaliser son propre golem.&lt;/p&gt;
&lt;p&gt;Libriste convaincu, je tiens ce carnet pour partager mon expérience, mais
aussi quelques &lt;a href=&quot;http://blog.sorcellerieweb.net/category/astuces&quot; hreflang=&quot;fr&quot;&gt;astuces&lt;/a&gt; et
&lt;a href=&quot;http://blog.sorcellerieweb.net/category/scripts&quot; hreflang=&quot;fr&quot;&gt;scripts&lt;/a&gt;, &lt;a href=&quot;http://blog.sorcellerieweb.net/category/outils&quot; hreflang=&quot;fr&quot;&gt;outils pratiques&lt;/a&gt; et autres bavardages
techniques, en espérant qu'ils vous soient utiles.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/24/Sorcellerie-Web#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/24/Sorcellerie-Web#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178477</wfw:commentRss>
      </item>
    
  <item>
    <title>Petit guide à l'usage du developpeur agile</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/07/Petit-Guide-a-lusage-du-developpeur-agile</link>
    <guid isPermaLink="false">urn:md5:af2f4075dbf7490ccc335b57d40d8922</guid>
    <pubDate>Fri, 23 Nov 2007 10:16:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Bave de crapaud</category>
        <category>livre</category><category>pratique</category><category>python</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://programmation-python.org/guide&quot;&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/.python-guide-developpeur-agile_t.jpg&quot; alt=&quot;python-guide-developpeur-agile.png&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;&lt;/a&gt; Il etait déjà dans ma liste Amazon,
mais &lt;a href=&quot;http://www.biologeek.com/journal/index.php/envie-de-developper-agilement-en-python-suivez-le-guide&quot; hreflang=&quot;fr&quot;&gt;une critique de BioloGeek&lt;/a&gt; m'a décidé à l'acheter sur le
champ. Et je ne regrette pas. Plus qu'un ouvrage sur Python, il traite pour
l'essentiel de méthodologie et de bonnes pratiques de développement. Beaucoup
de conseils sont génériques et transposables à d'autres language comme le
PHP.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/07/Petit-Guide-a-lusage-du-developpeur-agile#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/07/Petit-Guide-a-lusage-du-developpeur-agile#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178152</wfw:commentRss>
      </item>
    
  <item>
    <title>Tester Django - modifier ses modèles</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/19/Tester-Django-modifier-ses-modeles</link>
    <guid isPermaLink="false">urn:md5:1db68f4f22cfe59c3a29c429afdb509c</guid>
    <pubDate>Mon, 19 Nov 2007 17:16:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Artefacts</category>
        <category>django</category><category>firefox</category><category>python</category><category>sqlite</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/django-180.png&quot; alt=&quot;logo Django&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Ce week-end, j'ai repris mes tests de
&lt;a href=&quot;http://djangoproject.com&quot; hreflang=&quot;en&quot;&gt;Django&lt;/a&gt;, un framework web
en &lt;a href=&quot;http://python.org&quot; hreflang=&quot;en&quot;&gt;Python&lt;/a&gt;. (Ou comment occuper
son week-end par temps pourri et grève des transports). Histoire de me
simplifier la vie et remettre à plus tard l'installation et la configuration de
MySQL sur mon Mac, j'ai opté pour le stockage SQLite (qui est inclus d'office).
Voici un bref compte-rendu, ainsi qu'une petite astuce pour les premiers stades
d'un développement avec Sqlite&lt;/p&gt;    &lt;p&gt;Tout naturellement, je suis parti dans la ré-implémentation incrémentale
d'un de mes projets PHP. Ce qui signifie commencer avec des modèles de données
très simples, et les enrichir au fur et à mesure. Avec Django, la définition
des modèles de données se fait par la rédaction de classes modèles, et la
création des tables de la base se fait via un utilitaire en ligne de commande :
&lt;code&gt;python manage.py syncdb&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Or cette commande ne crée que les tables n'existant pas encore et ne met pas
à jour la structure des tables existantes, ce qui fait que très vite on se
retrouve avec des tables dont la structure ne correspond plus au modèle, et une
erreur du type &lt;cite&gt;no such column&lt;/cite&gt;. J'ai cru un instant que la commande
&lt;code&gt;python manage.py flush&lt;/code&gt; vidait la base et donc supprimait les
tables, mais elle ne vide apparemment que les données et conserve la structure
des tables existantes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/sqlite_manager.png&quot; alt=&quot;SQLite Manager (extenson firefox)&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;C'est là qu'une fois de plus, Firefox m'a
servi de couteau suisse du développement. En cherchant un utilitaire pour
inspecter le contenu de la base Sqlite, je suis tombé &lt;a href=&quot;https://addons.mozilla.org/fr/firefox/addon/5817&quot; hreflang=&quot;en&quot;&gt;SQLite
Manager&lt;/a&gt;, une extension permettant d'administrer entièrement une base Sqlite
! Du coup, ça m'a permis de supprimer la table associée à chaque fois que je
modifiais un modèle, et la recréer ensuite via &lt;code&gt;syncdb&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour ce qui est de Django, je ne suis pas déçu. Cela faisait longtemps que
je le surveillais du coin de l'oeil, et même un peu plus puisque j'ai réalisé
une implémentation partielle de son moteur de templates en PHP (actuellement
incluse dans &lt;a href=&quot;http://blog.sorcellerieweb.net/post/2007/11/19/&quot; hreflang=&quot;en&quot;&gt;webappkit&lt;/a&gt;, mon système de paquetages
pour applis web PHP). En pratique, c'est encore mieux qu'attendu et la qualité
et la richesse de la documentation y est pour quelque chose. Ainsi bien sûr que
les qualités du language Python, qui a pas mal d'avance sur PHP a la fois en
fonctionnalités et en cohérence.&lt;/p&gt;
&lt;p&gt;Quelques liens supplémentaires :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://django-fr.org&quot; hreflang=&quot;fr&quot;&gt;Django-fr&lt;/a&gt;, proposant une
partie de la documentation en français&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.djangobook.com/&quot; hreflang=&quot;en&quot;&gt;Django Book&lt;/a&gt; un livre
en ligne (a paraitre prochainement)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.b-list.org/&quot; hreflang=&quot;en&quot;&gt;The B-list&lt;/a&gt; un blog très
riche en informations et astuces de développement.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ma.gnolia.com/people/fredbird/tags/django&quot; hreflang=&quot;en&quot;&gt;Mes signets Django sur Magnolia&lt;/a&gt; comme ça je ne recopie pas tous mes
liens ici ;)&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/19/Tester-Django-modifier-ses-modeles#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/19/Tester-Django-modifier-ses-modeles#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178155</wfw:commentRss>
      </item>
    
  <item>
    <title>Afficher son adresse email, mais la protéger du spam</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/08/Afficher-son-adresse-email-mais-la-proteger-du-spam</link>
    <guid isPermaLink="false">urn:md5:c2badf6d7cbb91597775503e69ec052a</guid>
    <pubDate>Thu, 08 Nov 2007 10:05:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>css</category><category>html</category><category>spam</category>    
    <description>    &lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/astuce-48x48.png&quot; alt=&quot;astuce-48x48.png&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Comment donner son adresse de courriel à
ses visiteurs, tout en la cachant aux yeux des moteurs cherchant des adresses à
spammer ? Un usage courant est d'injecter des blocs parasites dans l'adresse,
tels que identifiant[pas-de-spam-svp]@[enlevez-ceci]domaine.net. Ce qui n'est
pas très lisible. Ma parade, c'est de masquer ces parasites avec une simple
règle CSS. Ce qui donne :&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;HTML :
&amp;lt;a href=&amp;quot;mailto:identifiant@[enlevez-ceci]domaine.net&amp;quot;&amp;gt;
    identifiant@&amp;lt;span class=&amp;quot;junk&amp;quot;&amp;gt;[enlevez-ceci]&amp;lt;/span&amp;gt;domaine.net
&amp;lt;/a&amp;gt;&lt;/code&gt;

&lt;code&gt;CSS :
.junk {
    display: none;
}&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Et affichera : &lt;a href=&quot;mailto:identifiant@[enlevez-ceci]domaine.net&quot;&gt;identifiant@domaine.net&lt;/a&gt;. Il
faudra toujours supprimer à la main les blocs parasites en cas de clic sur le
lien ou de copier-coller, mais l'adresse sera plus facile à noter :)&lt;/p&gt;
.</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/08/Afficher-son-adresse-email-mais-la-proteger-du-spam#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/08/Afficher-son-adresse-email-mais-la-proteger-du-spam#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178158</wfw:commentRss>
      </item>
    
  <item>
    <title>Une cinquième colonne chez Google ?</title>
    <link>http://blog.sorcellerieweb.net/post/2007/06/27/Une-cinquieme-colonne-chez-Google</link>
    <guid isPermaLink="false">urn:md5:d08fe1d194b9577c254ec77b35e732f6</guid>
    <pubDate>Wed, 27 Jun 2007 13:21:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Bave de crapaud</category>
        <category>google</category>    
    <description>&lt;p&gt;Un rebond sur la théorie qui veut que le tueur de Google viendra de
l'intérieur.&lt;/p&gt;    &lt;blockquote cite=&quot;http://winsa.free.fr/wordpress/?p=112&quot;&gt;
&lt;p&gt;En sachant que Google autorise 20% du temps de travail pour la recherche de
nouvelles idées je vous laisse imaginé combien de projets intéressants naissent
des labos de Google.&lt;/p&gt;
&lt;p&gt;A première vue Google est vraiment la société du moment avec un chiffre
d’affaire en hausse constante. Et pourtant il se pourrait bien que la menace
vienne de l’intérieur lorsque l’ont sait qu’il y’a énormément de personne douée
au sein Google et que les idées intéressantes doivent pleuvoir, mais seulement
un faible pourcentage d’entre elle sont retenu. Il en reste donc pour les
employés qui pourrait saisir l’occasion de tenter leur chance.&lt;/p&gt;
&lt;p&gt;-- &lt;a href=&quot;http://winsa.free.fr/wordpress/?p=112&quot;&gt;Koops&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La citation ci-dessus résume &lt;a href=&quot;http://www.googlinside.com/index.php/2007/06/26/140-la-fin-de-google&quot; hreflang=&quot;fr&quot;&gt;la traduction&lt;/a&gt; d'un &lt;a href=&quot;http://www.pbs.org/cringely/pulpit/2007/pulpit_20070524_002134.html&quot; hreflang=&quot;en&quot;&gt;article en anglais&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il y a tout d'abord une petite inexactitude dans la source. Les employés de
Google ne sont pas tenus de passer 20% de leur temps à trouver de nouvelles
idées pour Google, mais peuvent s'ils le souhaitent employer 20% de leur temps
sur un projet de leur choix, qu'il s'agisse d'un projet open source, d'un
projet perso ou de tester leur idée géniale de nouveau produit Google. Ce qui
évente un peu le concept d'une armée secrète minant le géant de l'intérieur :
celui-ci n'en a cure.&lt;/p&gt;
&lt;p&gt;Par ailleurs, il n'est pas suffisant d'avoir une idée géniale pour
concurrencer Google (ou n'importe quelle firme informatique). Si Google rachète
et assimile peu à peu tous les services web à succès, c'est par un phénomène
classique de concentration que je vois difficilement s'inverser. C'est une loi
similaire à celle de la gravitation : une fois qu'un corps aquiert une masse
suffisante pour piéger et attirer à lui la matière environnante, le phénomène
ne fait que s'accélerer.&lt;/p&gt;
&lt;p&gt;Google ne dispose pas seulement d'une bonne part des brillants cerveaux de
la Silicon Valley. Il dispose aussi de l'infrastructure matérielle suffisante
pour faire tourner une floppée de services web à l'échelle mondiale. Et
notamment, une seule instance de son OS maison (un dérivé de linux) tournant
sur plus de cent mille serveurs.&lt;/p&gt;
&lt;p&gt;De plus, le phénomène de concentration ne s'arrête pas aux ressources
productives, matérielles et humaines; mais également aux consommateurs et à
leurs données. Il existe plusieurs centaines de moteurs de recherche, mais pour
beaucoup d'internautes, le web c'est google et le concept de signet leur est
étranger : il suffit d'une recherche sur le moteur en page d'accueil pour
retrouver tous leurs sites habituels.&lt;/p&gt;
&lt;p&gt;Et une fois créé un compte Google, la pente de la facilité nous amène à lui
confier de plus en plus de nos besoins : pourquoi multiplier les comptes
d'accès quand un seul compte nous offre courriel, édition et stockage de
documents en ligne, messagerie instantanée, agenda, groupes de discussion,
stockage de favoris, stockage et publication de photos, lecteur de flux, blog,
edition et hébergement de pages web ?&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/06/27/Une-cinquieme-colonne-chez-Google#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/06/27/Une-cinquieme-colonne-chez-Google#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178153</wfw:commentRss>
      </item>
    
  <item>
    <title>Adultère programmé</title>
    <link>http://blog.sorcellerieweb.net/post/2006/11/23/Adultere-programme</link>
    <guid isPermaLink="false">urn:md5:f8cfb57f5092cd144312582265af019e</guid>
    <pubDate>Thu, 23 Nov 2006 10:10:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Le chat du sorcier</category>
            
    <description>&lt;p&gt;C'était une histoire d'amour qui durait depuis 6 ans. Très vite séduit par
sa souplesse, sa fiabilité (il faut dire que mon ex etait plutot du genre
capricieuse) et l'étendue de ses capacités, j'avais vite changé de crèmerie...
Il faut dire aussi que j'etais passé à autre chose, je voulais jouer dans la
cour des grands et conquérir le monde qui s'offrait à moi.&lt;/p&gt;
&lt;p&gt;Mais voilà, à force on finit par se lasser, et puis on finit par se rendre
compte que tout n'est pas aussi rose qu'on le croyait. Et puis on a de
nouvelles exigences, on en veut toujours plus...&lt;/p&gt;
&lt;p&gt;Depuis quelques temps déjà j'avais remarqué son coté sexy, voire carrément
hot. Mais en ayant sous le capot avec ça, et plutot mature. Seulement nous ne
bossions pas dans le même domaine. Mais maintenant...&lt;/p&gt;    &lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/python-logo.png&quot; alt=&quot;logo Python&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;...maintenant que &lt;a href=&quot;http://fr.wikipedia.org/wiki/Python_%28langage%29&quot; hreflang=&quot;fr&quot;&gt;Python&lt;/a&gt; se
démocratise sur le web, qui est mon aire de jeu, j'ai décidé de m'offrir une
petite aventure. Je vais y aller doucement et tester &lt;a href=&quot;http://www.djangoproject.com/&quot; hreflang=&quot;en&quot;&gt;Django&lt;/a&gt; avant de coder mon
propre moteur ;)&lt;/p&gt;
&lt;p&gt;Il faut dire que j'en ai un peu marre d'avoir à coder mes propres classes de
base, et ce dans un language qui est loin d'etre vraiment fait pour la
programmation objet. Coder pour pour la plaisir, c'est gratifiant pour l'estime
de soi et un bon exercice pour se perfectionner en programmation. A vrai dire,
j'ai même été assez loin puisque j'ai commencé à développer mon propre &lt;a href=&quot;http://webappkit.net&quot; hreflang=&quot;en&quot;&gt;moteur d'applications web en PHP&lt;/a&gt;. Ce
qui prend pas mal de temps et d'energie. D'autant qu'avec les limitations de
PHP, je ne suis jamais vraiment content du résultat.&lt;/p&gt;
&lt;p&gt;Mais j'ai aussi des projets d'application web (comme &lt;a href=&quot;http://quizzgeek.net&quot; hreflang=&quot;fr&quot;&gt;quizzgeek&lt;/a&gt;), et c'est surtout cela qu'
j'ai envie de faire avancer en ce moment. Alors j'ai décidé d'essayer de les
implémenter en python, en utilisant un framework existant, histoire de me faire
la main.&lt;/p&gt;
&lt;p&gt;Je vais perdre pas mal de temps au début, mais je pense que l'investissement
peut en valoir le coup. C'est assez excitant (pour un geek), ça me rappelle
quand j'étais passé d'actionscript (le language de script de Flash) à PHP. Et
c'est le moment ou jamais. Après un démarrage foireux (plantages à répétititon
de l'hébergement au moment du mini-buzz), quizzgeek s'est rendormi. Et mes
autres projets n'ont de concret que le nom de domaine listé dans mon admin
gandi ;).&lt;/p&gt;
&lt;p&gt;P.S. Pour ceux que ça intéresse, j'ai commencé par développer une
implémentation en PHP du moteur de templates de django. Elle est en pièce
jointe à ce billet. Je ferai peut être un billet dessus prochainement.&lt;/p&gt;</description>
    
          <enclosure url="http://blog.sorcellerieweb.net/public/php/djtpl.wak.2007-06-25.zip"
      length="23422" type="application/zip" />
    
    
          <comments>http://blog.sorcellerieweb.net/post/2006/11/23/Adultere-programme#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2006/11/23/Adultere-programme#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178157</wfw:commentRss>
      </item>
    
  <item>
    <title>PHP : classe datapath</title>
    <link>http://blog.sorcellerieweb.net/post/php-class-datapath-fr</link>
    <guid isPermaLink="false">urn:md5:062935f8aaf6675b0bb5d9b1111be388</guid>
    <pubDate>Wed, 25 Oct 2006 15:58:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Potions</category>
        <category>php</category>    
    <description>&lt;p&gt;Cette classe permet d'accéder à une variable multidimensionnelle (tableaux
et objets) via une syntaxe d'adressage. Le but etant de pouvoir manipuler
dynamiquement de tels objets.&lt;/p&gt;    &lt;p&gt;Toutes les methodes de cette classe sont à usage statique, et travaillent
directement sur une référence de la variable à manipuler.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
$data=array(
  'membres'=&amp;gt;array(
    array('nom'=&amp;gt;'dupont','prenom'=&amp;gt;'michel')
    , array('nom'=&amp;gt;'martin','prenom'=&amp;gt;'roselyne')));

// ceci va afficher roselyne
echo datapath::get($data,'membres.1.prenom');

// ceci ajoute un element
$membre=array('nom'=&amp;gt;'dupuis','prenom'=&amp;gt;'pascal');
datapath::set($data,$membre,'membres.2');
&lt;/code&gt;
&lt;/pre&gt;
&lt;h3&gt;Méthodes publiques&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;string&lt;/em&gt; &lt;strong&gt;separator&lt;/strong&gt;([&lt;em&gt;string&lt;/em&gt; $new]) :
retourne le separateur actuel de segments de chemin (&lt;q&gt;.&lt;/q&gt; par defaut&lt;/li&gt;
&lt;li&gt;&lt;em&gt;mixed&lt;/em&gt; &lt;strong&gt;get&lt;/strong&gt;(mixed &amp;amp;$data, string $path) :
retourne l'element pointé par le chemin $path.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bool&lt;/em&gt; &lt;strong&gt;set&lt;/strong&gt;(mixed &amp;amp;$data, mixed $value, string
$path) : definit la valeur de l'element pointé par le chemin $path au sein de
la variable $data.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bool&lt;/em&gt; &lt;strong&gt;setRef&lt;/strong&gt;(mixed &amp;amp;$data, mixed $ref, string
$path) : definit par référence la valeur de l'élément pointé par le chemin
$path au sein de la variable $data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quelques methodes supplémentaires sont prévues, notamment en ce qui concerne
l'itération, l'application de fonctions, tri, test etc.&lt;/p&gt;
&lt;p&gt;Est également prévu une extension de la syntaxe, avec l'ajout de jokers
et/ou de selecteurs de valeur à la xpath.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit 28/11/2007&lt;/strong&gt; : &lt;a href=&quot;http://blog.sorcellerieweb.net/public/php/datapath.wak.zip&quot; hreflang=&quot;fr&quot;&gt;Télécharger le &lt;em&gt;kit&lt;/em&gt; de la classe&lt;/a&gt; (voir le billet
&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2007/11/27/Webappkit&quot; hreflang=&quot;fr&quot;&gt;Webappkit&lt;/a&gt;)&lt;/p&gt;</description>
    
          <enclosure url="http://blog.sorcellerieweb.net/public/php/datapath.wak.zip"
      length="16840" type="application/zip" />
    
    
          <comments>http://blog.sorcellerieweb.net/post/php-class-datapath-fr#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/php-class-datapath-fr#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178162</wfw:commentRss>
      </item>
    
  <item>
    <title>hello world</title>
    <link>http://blog.sorcellerieweb.net/post/2006/10/20/hello-world</link>
    <guid isPermaLink="false">urn:md5:fb19be7a1711d0c4382b488aa7d53883</guid>
    <pubDate>Fri, 20 Oct 2006 15:27:00 +0000</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Le chat du sorcier</category>
            
    <description>    &lt;p&gt;Me voilà qui multiplie les blogs tel jesus les pains, à moins que ce ne soit
les poissons. Enfin bref. Bienvenue sur ce blog à vocation professionnelle, où
je traiterai bien évidemment de mon domaine qui est le développement web. Mes
bacs à sable se nomment PHP, MySQL, XHTML, CSS, et bien d'autres noms barbares
pour la plupart des gens. Pas pour vous j'imagine, ou alors c'est que vous êtes
perdu(e).&lt;/p&gt;
&lt;p&gt;Je suis l'auteur du noyau générique &lt;a href=&quot;http://webappkit.net&quot; hreflang=&quot;en&quot;&gt;webAppKit&lt;/a&gt;, et du quizz en ligne collaboratif &lt;a href=&quot;http://quizzgeek.net&quot; hreflang=&quot;fr&quot;&gt;quizzGeek&lt;/a&gt;. Chacun de ces deux projets
a déjà son propre blog (&lt;a hreflang=&quot;en&quot; href=&quot;http://blog.webappkit.net&quot;&gt;webappkit&lt;/a&gt;, &lt;a hreflang=&quot;fr&quot; href=&quot;http://blog.quizzgeek.net&quot;&gt;quizzgeek&lt;/a&gt; , merci Gandi !), donc je parlerai
surtout ici de choses plus générales, dont quelques librairies génériques sur
lesquelles ils s'appuient; et que j'ai également la plupart du temps commises.
Un sous-domaine dédié sera probablement prochainement mis en place.&lt;/p&gt;
&lt;p&gt;Tout ça permettra de ne pas mystifier les quelques visiteurs de mon &lt;a href=&quot;http://fredbird.org&quot; hreflang=&quot;fr&quot;&gt;blog personnel&lt;/a&gt; lorsque de temps à autre
je me fends d'un billet technique. Du coup, les billets en question ont été
importé ici. Bonne lecture si vous les découvrez.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Intelligence artificielle, internet et assistant personnel</title>
    <link>http://blog.sorcellerieweb.net/post/2006/07/26/Intelligence-artificielle-internet-et-assistant-personnel</link>
    <guid isPermaLink="false">urn:md5:f850986e0bf28c0c0dd6f4f6c62c4409</guid>
    <pubDate>Wed, 26 Jul 2006 20:10:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Boule de cristal</category>
        <category>ia</category><category>jabber</category>    
    <description>&lt;p&gt;Suite à une discussion sur Jabber avec &lt;a href=&quot;http://fastclemmy.com&quot; hreflang=&quot;fr&quot;&gt;Fastclemmy&lt;/a&gt; où celui-ci me parle de son idée de bot jabber
comme interface avec un compte de stockage de signets sur &lt;a href=&quot;http://blogmarks.net&quot; hreflang=&quot;fr&quot;&gt;blogmarks&lt;/a&gt;...&lt;/p&gt;    &lt;p&gt;Beaucoup de services web existent déjà pour le stockage et l'organisation de
votre vie numérique : webmails, signets collaboratifs, agendas, calendriers,
&lt;em&gt;to-do lists&lt;/em&gt;, lecteurs de flux, etc. Les plus geeks d'entre nous ont
ainsi une multiplicité de comptes et d'interfaces web à consulter. Et
d'ailleurs, les moins geeks d'entre nous n'ont probablement tout simplement pas
idée de tous ces outils et pas l'envie, le courage ou le besoin d'apprendre à
maitriser toutes ces interfaces. Cependant, la plupart des ces services (je
veux dire, ceux qui ne sont pas &lt;cite&gt;has been avant d'avoir été&lt;/cite&gt;)
proposent des &lt;acronym title=&quot;Application Programming Interface&quot;&gt;API&lt;/acronym&gt;
permettant un accès automatisé.&lt;/p&gt;
&lt;p&gt;J'ai alors entraperçu dans ma boule de cristal ce qui pourrait être monnaie
courante d'ici, mettons, une décennie, et ce pour le &lt;em&gt;commun des
mortels&lt;/em&gt; :&lt;/p&gt;
&lt;p&gt;Un bot, c'est à dire un programme d'intelligence articielle, accèdera pour
vous à toutes ces interfaces, suite à des demandes effectuées en language
naturel via un protocole de messagerie instantanée (standard bien sur, c'est à
dire &lt;a href=&quot;http://fr.wikipedia.org/wiki/Jabber&quot; hreflang=&quot;fr&quot;&gt;jabber&lt;/a&gt;).
Cet assistant personnel aura accès via le web à tous vos contenus et services,
et pourra chercher à votre place, reserver des billets, verifier votre
disponibilité dans votre agenda, filtrer vos emails, vous avertir d'un contenu
interessant dans vos flux de syndication, d'une attaque de spam sur votre blog.
La difficulté ici réside bien entendu dans la partie intelligence artificielle,
c'est à dire dans la traduction entre language naturel et instructions
executées. On peut imaginer un systeme d'apprentissage, d'autant que chaque
utilisateur aura sa propre manière d'exprimer ses requetes.&lt;/p&gt;
&lt;p&gt;Question implémentation, l'&lt;acronym title=&quot;Intelligence Artificielle&quot;&gt;IA&lt;/acronym&gt; pourrait résider sur un serveur et
être accédée via un client jabber standard, ou résider sur un programme client
(c'est à dire au sein de l'ordinateur/&lt;acronym title=&quot;Portable Digital Assistant&quot;&gt;PDA&lt;/acronym&gt;/téléphone et accéder soit
directement aux services, soit via jabber à un simple &lt;em&gt;pont&lt;/em&gt; de
ceentralisation d'accès aux services. On pensera bien sûr à coupler l'interface
de dialogue à un système de reconnaissance et de synthèse vocale, afin de
dialoguer avec son assistant comme avec un... secrétaire particulier.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2006/07/26/Intelligence-artificielle-internet-et-assistant-personnel#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2006/07/26/Intelligence-artificielle-internet-et-assistant-personnel#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178168</wfw:commentRss>
      </item>
    
  <item>
    <title>xml-rpc blah blah blah</title>
    <link>http://blog.sorcellerieweb.net/post/2006/05/11/xml-rpc-blah-blah-blah</link>
    <guid isPermaLink="false">urn:md5:79892ce403f31858068dd265f59d3662</guid>
    <pubDate>Thu, 11 May 2006 20:08:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Bave de crapaud</category>
        <category>xml</category>    
    <description>&lt;p&gt;Je soupçonne les concepteurs de la &lt;a href=&quot;http://www.xmlrpc.com/spec&quot; hreflang=&quot;en&quot;&gt;spécification&lt;/a&gt; &lt;acronym title=&quot;eXtensible Markup Language - Remote Procedure Call&quot;&gt;XML-RPC&lt;/acronym&gt; d'avoir
oeuvré en fonction des limitations de leur propre implémentation initiale... Je
travaille en ce moment sur une librairie en php et je trouve le format assez
torturé.&lt;/p&gt;    &lt;p&gt;Par nature le &lt;acronym title=&quot;eXtensible Markup Language&quot;&gt;XML&lt;/acronym&gt; est
un format &lt;em&gt;bavard&lt;/em&gt; puisqu'on retrouve le nom de chaque element dans le
tag de fermeture, alors qu'avec ses règles strictes d'imbrication un simple
&amp;lt;/&amp;gt; aurait suffi. De plus, les concepteurs de dialecte XML sont souvent
des gens un poil anxieux qui multiplient les éléments, je ne sais pas trop
pourquoi.&lt;/p&gt;
&lt;p&gt;Mais alors le xml-rpc, c'est franchement le bordel. Bon, il y a de quoi
vouloir etre prevoyant puisqu'il s'agit d'un language
&lt;strong&gt;générique&lt;/strong&gt; pour faire des appels de procedure distante. (par
exemple, les fameux &lt;em&gt;ping&lt;/em&gt; et &lt;em&gt;trackback&lt;/em&gt; des blogs). Mais quand
je vois :&lt;/p&gt;
&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt; &amp;lt;methodResponse&amp;gt; &amp;lt;fault&amp;gt;
&amp;lt;value&amp;gt; &amp;lt;struct&amp;gt; &amp;lt;member&amp;gt; &amp;lt;name&amp;gt;faultCode&amp;lt;/name&amp;gt;
&amp;lt;value&amp;gt;&amp;lt;int&amp;gt;4&amp;lt;/int&amp;gt;&amp;lt;/value&amp;gt; &amp;lt;/member&amp;gt;
&amp;lt;member&amp;gt; &amp;lt;name&amp;gt;faultString&amp;lt;/name&amp;gt;
&amp;lt;value&amp;gt;&amp;lt;string&amp;gt;Too many parameters.&amp;lt;/string&amp;gt;&amp;lt;/value&amp;gt;
&amp;lt;/member&amp;gt; &amp;lt;/struct&amp;gt; &amp;lt;/value&amp;gt; &amp;lt;/fault&amp;gt;
&amp;lt;/methodResponse&amp;gt;&lt;/code&gt;
&lt;p&gt;Au lieu de, par exemple, ça :&lt;/p&gt;
&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt; &amp;lt;methodResponse&amp;gt; &amp;lt;fault&amp;gt;
&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; &amp;lt;desc&amp;gt;Too many parameters.&amp;lt;/desc&amp;gt;
&amp;lt;/fault&amp;gt; &amp;lt;/methodResponse&amp;gt;&lt;/code&gt;
&lt;p&gt;Je me dis que la volonté initiale de simplicité s'est un peu perdue en
route... J'ai du mal à comprendre cette volonté de se passer totalement
d'attributs et d'intercaler des éléments inutiles comme le &amp;lt;data&amp;gt; entre
un &amp;lt;array&amp;gt; et les &amp;lt;value&amp;gt;. Le pire, c'est encore le type des
&amp;lt;value&amp;gt; qui est un élément s'intercalant entre l'élément et son contenu,
et optionnel avec ça !!! Il aurait été tellement plus logique d'utiliser un
attribut. Pfff...&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2006/05/11/xml-rpc-blah-blah-blah#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2006/05/11/xml-rpc-blah-blah-blah#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178167</wfw:commentRss>
      </item>
    
  <item>
    <title>Ciao Firefox</title>
    <link>http://blog.sorcellerieweb.net/post/2005/11/19/Ciao-Firefox</link>
    <guid isPermaLink="false">urn:md5:24051f59dd41b11526ce09929d8e93df</guid>
    <pubDate>Sat, 19 Nov 2005 15:58:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Artefacts</category>
        <category>firefox</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/gnome-browser-48x48.png&quot; alt=&quot;gnome-browser-48x48.png&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Attention, demi-troll ! Non, je
n'ai pas désinstallé &lt;a href=&quot;http://www.mozilla-europe.org/fr/products/firefox/&quot; hreflang=&quot;fr&quot;&gt;firefox&lt;/a&gt;,
&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2005/10/16/Bye-Bye-Suzie&quot; hreflang=&quot;fr&quot;&gt;contrairement à
Suzie&lt;/a&gt;. Et je n'ai pas l'intention de le faire, du moins dans l'immédiat. Et
je continuerai vraisemblablement à l'utiliser quotidiennement.&lt;/p&gt;    &lt;p&gt;Mais je ne poste pas ce billet sous firefox. Pourquoi ? Parce que je suis
sous &lt;a href=&quot;http://ubuntu-fr.org&quot; hreflang=&quot;fr&quot;&gt;Ubuntu&lt;/a&gt;, et que firefox y
rame sévèrement. Sur certains sites, le défilement des pages devient
franchement &lt;em&gt;escargotesque&lt;/em&gt;. Je suppose que le ralentissement est dû à
l'implémentation linux de la couche d'abstraction multi-plate-formes, puisque
je ne rencontre pas le problème sous windoze, à configuration équivalente. J'ai
donc voulu tester un navigateur plus intégré au bureau (un peu comme explorer
pour windoze). Il s'agit d'&lt;a href=&quot;http://www.gnome.org/projects/epiphany/&quot; hreflang=&quot;en&quot;&gt;epiphany&lt;/a&gt;, un fork de &lt;a href=&quot;http://galeon.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;galeon&lt;/a&gt;, le navigateur initial de &lt;a href=&quot;http://www.gnomefr.org/&quot; hreflang=&quot;fr&quot;&gt;gnome&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Après quelques heures d'essai, je suis plutôt convaincu. Plus de problèmes
de ralentissement, un peu moins de consommation mémoire, bien que le moteur de
rendu soit le même, gecko. La plupart des fonctionnalités de base de firefox
sont là : onglets (mobiles, comme prévu pour firefox 1.5), gestionnaire de
téléchargement, personnalisation de l'interface, barre de recherche etc. Il
inclut également un système d'extensions, bien qu'encore peu fourni. On n'y
trouve hélas pas &lt;a href=&quot;http://chrispederick.com/work/webdeveloper/&quot; hreflang=&quot;en&quot;&gt;web developper&lt;/a&gt;, mais quelques outils pour la validation du
code html et le déboguage javascript sont disponibles. Pas de gestion des fils
(flux) de syndication par contre, &lt;a href=&quot;http://ploum.frimouvy.org/?2005/11/19/79-ne-perdez-plus-le-fil-syndiquez-vous&quot; hreflang=&quot;fr&quot;&gt;qui passe par un agrégateur externe&lt;/a&gt;, &lt;a href=&quot;http://liferea.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;liferea&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mais outre les meilleures performances, le motif de mon adoption est sa
gestion des signets, qui est à peu de choses près (l'interfaçage avec &lt;a href=&quot;http://blogmarks.net&quot; hreflang=&quot;en&quot;&gt;blogmarks&lt;/a&gt; par exemple) celle dont je
rêve pour firefox : par hiérarchie plate, c'est à dire par mots-clefs (ou tags,
traduits par &lt;q&gt;sujets&lt;/q&gt; dans l'interface. ctrl+D pour un nouveau signet, on
coche un ou plusieurs mots clefs ou on en saisit un nouveau, et le signet est
indexé. Il est alors disponible via chacun de ses mots-clefs dans le menu
signet, via ceux de ses mots clefs qu'on aura mis dans la &lt;em&gt;barre
personnelle&lt;/em&gt;, ainsi que par une liste déroulante lors de la saisie du début
d'un mot clef dans la barre d'adresse. Beaucoup plus efficace que la gestion
par dossiers, de mon point de vue, et de quoi séduire quelques surfeurs sous
gnome.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2005/11/19/Ciao-Firefox#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2005/11/19/Ciao-Firefox#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/179227</wfw:commentRss>
      </item>
    
  <item>
    <title>Bye Bye Suzie</title>
    <link>http://blog.sorcellerieweb.net/post/2005/10/16/Bye-Bye-Suzie</link>
    <guid isPermaLink="false">urn:md5:15906544e46f5051333e233c85a6279f</guid>
    <pubDate>Sun, 16 Oct 2005 16:00:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Artefacts</category>
        <category>linux</category>    
    <description>&lt;p&gt;Surfant sur la vague blogosphérique (&lt;a href=&quot;http://standblog.org/blog/2004/11/29/93113845-eloge-de-la-simplicite-2-la-distribution-linux&quot; hreflang=&quot;fr&quot;&gt;Standblog&lt;/a&gt;, &lt;a href=&quot;http://ploum.frimouvy.org/?2005/10/13/73-breezy-pitez-vous&quot; hreflang=&quot;fr&quot;&gt;Ploum&lt;/a&gt;, &lt;a href=&quot;http://mitternachts-lied.net/blog/index.php/2005/10/13/233-le-zoo-s-agrandit&quot; hreflang=&quot;fr&quot;&gt;Mitternacht&lt;/a&gt;, &lt;a href=&quot;http://dyingculture.net/blog/2005/10/13/492-sortie-d-ubuntu-510&quot; hreflang=&quot;fr&quot;&gt;Dying Culture&lt;/a&gt; etc), j'ai changé de distribution linux pour &lt;a href=&quot;http://ubuntu-fr.org&quot; hreflang=&quot;fr&quot;&gt;Ubuntu&lt;/a&gt; (5.10, &lt;acronym title=&quot;blaireau dans le vent&quot;&gt;Breezy Badger&lt;/acronym&gt;).&lt;/p&gt;    &lt;p&gt;J'avais déjà testé cette distrib lors de mon précédent changement mais je
l'avais laissée de coté pour des problèmes de reconnaissance matériels, et
&lt;a href=&quot;http://massart.org&quot; hreflang=&quot;fr&quot;&gt;un ami&lt;/a&gt; m'avait chaudement
recommandé la fiabilité teutonne. C'est ainsi qu'après avoir installé
périodiquement des &lt;a href=&quot;http://www.redhat.fr/&quot; hreflang=&quot;fr&quot;&gt;Red Hat&lt;/a&gt;
puis des &lt;a href=&quot;http://www.mandriva.com/&quot;&gt;Mandrake&lt;/a&gt; je m'étais tourné vers
la &lt;a href=&quot;http://www.suse.de/fr/&quot; hreflang=&quot;fr&quot;&gt;SuSE&lt;/a&gt;. Je ne pouvais plus
me servir de la distribution française car elle était devenu incapable
d'installer correctement lilo sur mon MBR, rendant de fait la cohabitation
impossible avec l'&lt;a href=&quot;http://www.microsoft.com/france/windows&quot; hreflang=&quot;fr&quot;&gt;OS de Redmond&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sur le point d'installer &lt;a href=&quot;http://www.opensuse.org&quot; hreflang=&quot;en&quot;&gt;openSuse&lt;/a&gt; 10.0, j'ai d'abord testé le &lt;a href=&quot;http://www.framasoft.net/article3306.html&quot; hreflang=&quot;fr&quot;&gt;live-cd de Breezy
Badger&lt;/a&gt; (vraiment bien fait : si vous insérez la galette sous windoze un
menu vous propose même d'y installer quelques logiciels libres dont firefox),
et les progrès réalisés ainsi que quelques déceptions accumulées m'ont décidé
pour un nouveau changement, et je ne le regrette pas. Voici un bref comparatif
des deux distributions, après une petite semaine d'utilisation coté ubuntu et
environ un an (?) coté Suse.&lt;/p&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;Sur ce point, Suse mène encore haut la main. Son installeur est de loin le
meilleur de ceux que j'ai pu tester, meilleur que ceux de Red Hat et Mandriva
(le nouveau nom de la Mandrake). Entièrement graphique comme ceux de
&lt;em&gt;ces&lt;/em&gt; rivales, mais au lieu de procéder par étape (un tunnel de clics
sur &lt;q&gt;continuer&lt;/q&gt;), la configuration suggérée est calculée en un seul écran
offrant alors de modifier les points qui doivent l'être. Superbement efficace,
que ce soit pour le débutant confiant ou le geek maniaque.&lt;/p&gt;
&lt;p&gt;A coté la Ubuntu fait vraiment pâle figure. Je n'avais pas vu un installeur
en mode texte pour linux depuis bien longtemps. Fort heureusement, il y a
beaucoup d'étapes qui sautent grâce à la configuration automatique du matériel,
mais il reste l'ecueil du partitionnement avec un outil texte (partman)
franchement pas intuitif pour qui n'est pas à l'aise avec ça, et même alors (il
faut préciser explicitement que &lt;q&gt;/&lt;/q&gt; est amorçable, pour les autres outils
ça va de soi...). Qui plus est, ma première tentative d'installation a planté
en cours de route et j'ai du recommencer. Et c'est plutot long, a tel point que
je me suis demandé si les paquets n'étaient pas compilés à l'installation...
Pour couronner le tout, j'ai du ré-associer en ligne de commande (&lt;q&gt;chown&lt;/q&gt;)
les dossiers de &lt;q&gt;/home&lt;/q&gt; avec les utilisateurs existants, chose que Suse me
proposait et réglait dès l'installation et la création des utilisateurs.&lt;/p&gt;
&lt;p&gt;Au final, je doute que la Ubuntu soit installable par un utilisateur
débutant qui n'aurait pas un geek sous la main pour le faire à sa place. Il y a
des efforts à faire sur ce terrain dans la prochaine version pour espérer
contrer Vista.&lt;/p&gt;
&lt;h3&gt;Performances&lt;/h3&gt;
&lt;p&gt;La Suse m'exaspérait par la lenteur de son démarrage, plusieurs minutes sur
mon système (probablement un problème de configuration, mais la lenteur du
demarrage de Suse est un fait avéré). Ubuntu est bien plus rapide, peut être un
peu plus lente que windoze XP mais c'est comparable. Il semblerait que la Suse
10 soit plsu rapide que les précédentes, mais je ne l'ai pas testée.&lt;/p&gt;
&lt;p&gt;Par contre, j'ai l'impression que Ubuntu sous gnome rame plus vite que Suse
sous KDE, peut être est-ce dû à &lt;a href=&quot;http://beaglewiki.org&quot; hreflang=&quot;en&quot;&gt;beagle&lt;/a&gt; ou mon usage intensif de firefox mais avec une paire de
sessions ouvertes et 3-4 programmes ouverts sous chacune d'elles on commence à
percevoir les délais de réaction (Celeron 2.2ghz, 512Mo &lt;acronym title=&quot;mémoire vive&quot;&gt;ram&lt;/acronym&gt;).&lt;/p&gt;
&lt;p&gt;Question stabilité, j'ai pu voir la Suse planter sévèrement plusieurs fois
sans explication mais je manque encore de recul pour affirmer que la Ubuntu est
exempte de ce défaut. Par contre, attention en ce qui concerne l'installation
de packages multiverse, susceptibles de foutre un tel bordel qu'il sera parfois
plus simple de tout réinstaller (à moins de savoir réparer les dégats en ligne
de commande).&lt;/p&gt;
&lt;h3&gt;Usage&lt;/h3&gt;
&lt;p&gt;Autant le dire tout de suite, c'est là que Ubuntu se démarque. Si un outil
de configuration central à la Yast ou DrakConf (tiens, comment l'ont ils
renommé celui-là ?) fait bizarrement défaut, multipliant les entrés dans le
menu des paramètres système, pour le reste je suis très agréablement
surpris.&lt;/p&gt;
&lt;p&gt;Ubuntu n'est pas exempte de petits défauts, et nécessite encore quelques
incursions dans la ligne de commande, mais il est possible d'obtenir rapidement
un système fonctionnel, y compris pour le multimedia. Ce n'est pas encore
utilisable par tous, mais pour les geeks ou au contraire les utilisateurs
cherchant un systeme fiable pour un usage web/bureautique, c'est tout à fait
jouable.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2005/10/16/Bye-Bye-Suzie#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2005/10/16/Bye-Bye-Suzie#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/179228</wfw:commentRss>
      </item>
    
  <item>
    <title>Some CSS-related javascript utility functions</title>
    <link>http://blog.sorcellerieweb.net/post/2005/09/16/Some-CSS-related-javascript-utility-functions</link>
    <guid isPermaLink="false">urn:md5:c4d5bc270f36d349ab3e78ac2d6b5dd3</guid>
    <pubDate>Fri, 16 Sep 2005 20:04:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>code-source</category><category>css</category><category>javascript</category>    
    <description>&lt;p&gt;Hi folks. Nothing very bright or revolutionary, but here is a tiny library
to play with CSS and javascript. More elaborate tricks to come. Hope it
helps.&lt;/p&gt;    &lt;ul&gt;
&lt;li&gt;bool hasClass(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;cName&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool hasClasses(DOM &lt;var&gt;obj&lt;/var&gt;, array &lt;var&gt;classes&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool addClass(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;cName&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool removeClass(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;cName&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool swapClasses(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;class1&lt;/var&gt;, string
&lt;var&gt;class2&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool switchClass(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;to&lt;/var&gt;, string
&lt;var&gt;from&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;array getElementsByClassName(string &lt;var&gt;className&lt;/var&gt;, [DOM
&lt;var&gt;container&lt;/var&gt;],[string &lt;var&gt;tag&lt;/var&gt;])&lt;/li&gt;
&lt;/ul&gt;
&lt;code&gt;/* CSS-related javascript functions by Fred Bird http://fredbird.org
License : Public Domain file version 16/09/2005 09:30:45 */ /* has the DOM
object a certain class ? obj = DOM object, cName = a class name */ function
hasClass(obj,cName) { return new RegExp('\\b'+cName+'\\b').test(obj.className);
} /* has the DOM object a set of classes ? obj = DOM object, classes=array of
class names */ function hasClasses(obj,classes) { for (f=0;
f&amp;lt;classes.length; f++) { if (!hasClass(obj,classes[i])) return false; }
return true; } /* add a class to a DOM object if necessary obj = DOM object,
cName = a class name */ function addClass(obj,cName) { if
(!hasClass(obj,cName)) { obj.className+=obj.className?' '+cName:cName; } return
true; } /* removes a class from a DOM object obj = DOM object, cName = a class
name */ function removeClass(obj,cName) { if (!hasClass(obj,cName)) return
false; var rep=obj.className.match(' '+cName)?' '+cName:cName;
obj.className=obj.className.replace(rep,''); return true; } /* swap two classes
for a DOM object, whatever provided order */ function
swapClasses(obj,class1,class2) { if (hasClass(obj,class1)) {
removeClass(obj,class1); addClass(obj,class2); return true; } if
(hasClass(obj,class2)) { removeClass(obj,class2); addClass(obj,class1); return
true; } return false; } /* sets class 'to' to the DOM object obj, removes class
'from' if necessary */ function switchClass(obj,to,from) { if
(hasClass(obj,from)) removeClass(obj,from); addClass(obj,to); return true; } /*
returns an array of DOM objects having the provided class name within object
'container' and with tag name 'tag' some code from
http://www.webmasterworld.com/forum91/1757.htm (unbugged) */ function
getElementsByClassName(className,container,tag) { // default container to
document container=container||document; // default tag to * tag=tag||'*'; //
listing container descendants var all =
container.all||container.getElementsByTagName(tag); var found=new Array(); //
searching for targets for (f=0; f&amp;lt;all.length; f++) { var el=all[f]; if
(hasClass(all[f],className)) { found.push(all[f]); } } return found; }&lt;/code&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2005/09/16/Some-CSS-related-javascript-utility-functions#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2005/09/16/Some-CSS-related-javascript-utility-functions#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178161</wfw:commentRss>
      </item>
    
</channel>
</rss>