<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://mirmodynamics.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Mirmo Dynamics - Tag - configuration</title>
  <link>http://mirmodynamics.com/</link>
  <atom:link href="http://mirmodynamics.com/feed/tag/configuration/rss2" rel="self" type="application/rss+xml"/>
  <description>Si tu kiffes pas reunoi, t'écoutes pas et puis c'est tout.</description>
  <language>en</language>
  <pubDate>Sun, 14 Mar 2010 19:59:01 +0100</pubDate>
  <copyright>2003-2009 &amp;copy; Geoffrey Bachelet</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>symfony: use your own View class</title>
    <link>http://mirmodynamics.com/post/2009/02/23/symfony%3A-use-your-own-View-class</link>
    <guid isPermaLink="false">urn:md5:1ee2dba1b9237504be3a017c9a957bd2</guid>
    <pubDate>Mon, 23 Feb 2009 20:57:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Symfony</category>
        <category>configuration</category><category>extending</category><category>module.yml</category><category>sfConfig</category><category>sfPHPView</category><category>symfony</category><category>view</category>    
    <description>    &lt;p&gt;The view class name in symfony is determined per-module, it means that you need to use a module-level configuration setting via the &lt;code&gt;module.yml&lt;/code&gt; configuration file. Say you want to use the &lt;code&gt;myView&lt;/code&gt; class to handle your view in the &lt;code&gt;default&lt;/code&gt; module of your &lt;code&gt;frontend&lt;/code&gt; application, create the file &lt;code&gt;sf_root_dir/apps/frontend/config/module.yml&lt;/code&gt; and put the following in it:&lt;/p&gt;

&lt;pre&gt;
default:
  view_class:  my
&lt;/pre&gt;


&lt;p&gt;Symfony will add the &lt;code&gt;View&lt;/code&gt; suffix for you. Of course, you have to take care of making this class available to the framework. The &lt;code&gt;sf_root_dir/apps/frontend/lib/myView.class.php&lt;/code&gt; file would be a good place for this.&lt;/p&gt;


&lt;p&gt;As often with &lt;code&gt;sfConfig&lt;/code&gt;, you could have put the &lt;code&gt;module.yml&lt;/code&gt; config file in &lt;code&gt;sf_root_dir/config/&lt;/code&gt; to make it global to your whole project.&lt;/p&gt;


&lt;p&gt;&lt;acronym&gt;PS&lt;/acronym&gt;: extending the &lt;code&gt;sfPHPView&lt;/code&gt; class could be a good idea to get you started too ;)&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2009/02/23/symfony%3A-use-your-own-View-class#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2009/02/23/symfony%3A-use-your-own-View-class#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/1175</wfw:commentRss>
      </item>
    
  <item>
    <title>A specific stylesheet for each module</title>
    <link>http://mirmodynamics.com/post/2008/10/15/A-specific-stylesheet-for-each-module</link>
    <guid isPermaLink="false">urn:md5:3d62ec1a3d453aff01166ab7a3582263</guid>
    <pubDate>Wed, 15 Oct 2008 00:43:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Symfony</category>
        <category>configuration</category><category>css</category><category>stylesheets</category><category>symfony</category><category>tips</category><category>yaml</category>    
    <description>    &lt;p&gt;So this is the first post of the newly opened &lt;a href=&quot;http://mirmodynamics.com/category/symfony&quot;&gt;symfony category&lt;/a&gt; of this blog, and I want to make things clear right now: you (most likely) won't find (yet) any &lt;strong&gt;pro&lt;/strong&gt;tip or high level symfony tutorials here, as I'm still in the process of learning symfony. The good news though is that I'm currently assigned an 1.2-DEV project, so you may get some insight at what's up in the dev branch of the framework (especially regarding sfForm) :-)&lt;/p&gt;


&lt;p&gt;If your are looking for more complete material on the subject, please redirect yourself to &lt;a href=&quot;http://www.symfony-project.org/&quot;&gt;the official website&lt;/a&gt; (where you can find the documentation and a very interesting blog) or &lt;a href=&quot;http://www.aide-de-camp.org/&quot;&gt;Fabien's blog&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;That said, I think it could be interesting to post all the little things I learn everyday that make development with symfony easier for the everyday php developper that you might be if you made it this far into this post ;-)&lt;/p&gt;


&lt;p&gt;Soooo, let's begin the show, with some yaml magic. Yaml I said ? Yaml I said. For those not knowing yet, yaml is the format of choice for symfony's configurations file. So what's the point between configuration files and stylesheets ? Let's say you've got a symfony application (say, frontend), and you'd like a particular module (say, news) in this application to have its own stylesheet in addition of the defaults stylesheets you defined already. Very simple, you start by creating the adequate configuration file:&lt;/p&gt;

&lt;pre&gt;
cd apps/frontend/modules/news/
mkdir config
vi config/view.yml
&lt;/pre&gt;


&lt;p&gt;All you have to do know is declare the stylesheet:&lt;/p&gt;

&lt;pre&gt;
all:
  stylesheets: [news]
&lt;/pre&gt;


&lt;p&gt;And that's all, no helper call in the layout, your &lt;code&gt;news.css&lt;/code&gt; will automagically be appended to the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of your generated html. You can also declare multiples css, or control which actions get a particular css, and even specify to which media they apply:&lt;/p&gt;

&lt;pre&gt;
all:
  stylesheets: [news, news_print: { media: print }]
list:
  stylesheets: [list]
&lt;/pre&gt;


&lt;p&gt;Handy, heh.&lt;/p&gt;


&lt;p&gt;But that's not all ! If you're not that much into yaml, you can use a view helper, directly into your template:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?php use_stylesheet('news'); ?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Or even add it from the controller:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?php $this-&amp;gt;getResponse()-&amp;gt;addStylesheet('news'); ?&amp;gt;
&lt;/pre&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2008/10/15/A-specific-stylesheet-for-each-module#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2008/10/15/A-specific-stylesheet-for-each-module#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/1142</wfw:commentRss>
      </item>
    
  <item>
    <title>Linux + gVim + Rox-filer = Mon IDE.</title>
    <link>http://mirmodynamics.com/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE</link>
    <guid isPermaLink="false">urn:md5:024270855ec063e421b28cf4d62f4906</guid>
    <pubDate>Tue, 28 Nov 2006 22:39:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>clichés</category><category>configuration</category><category>environnement</category><category>interfaces utilisateurs</category><category>opinions</category><category>organisation</category><category>php</category><category>svn</category><category>ubuntu</category><category>unix</category><category>vim</category><category>way of life</category>    
    <description>&lt;p&gt;Une des questions cruciales qui se pose à tout développeur à au moins un moment de sa vie (souvent plusieurs en fait) est le choix d'un environnement de développement. J'en ai testé pas mal, plus ou moins longtemps, et bien que je ne sois jamais complètement satisfait, l'idée de &lt;em&gt;perdre du temps&lt;/em&gt; à développer le mien m'indispose. J'ai donc opté pour l'environnement qui me va le mieux: Linux + gVim + Rox-filer.&lt;/p&gt;


&lt;p&gt;Note: je ne couvre pas ici les fonctionnalités de débuging avancé, que je n'utilise pas encore, mais pour lesquelles j'ai déjà en tête des solutions qui me conviendront bien mieux que les outils intégrés à un quelconque &lt;acronym&gt;IDE&lt;/acronym&gt; (je pense fortement à Xdebug).&lt;/p&gt;    &lt;h3&gt;Comment définir un IDE ?&lt;/h3&gt;


&lt;p&gt;Commençons par le début: qu'est-ce qu'un &lt;acronym&gt;IDE&lt;/acronym&gt; ? Acronyme de &lt;em&gt;Integrated Development Environment&lt;/em&gt;, le terme peut prendre pas mal de signification selon la personne à laquelle on s'adresse. Pour certains, &lt;em&gt;le plus c'est le mieux&lt;/em&gt;, alors que pour d'autre, &lt;em&gt;le moins c'est le pas plus mal finalement&lt;/em&gt;. On pourra citer quelques exemples connus d'&lt;acronym&gt;IDE&lt;/acronym&gt; &lt;em&gt;full-featured&lt;/em&gt;, tels que les incournables &lt;em&gt;Zend Studio&lt;/em&gt;, &lt;em&gt;Eclipse&lt;/em&gt; et autres &lt;em&gt;phpEdit&lt;/em&gt;, mais ce n'est pas le but de cet article. Ici, je vais vous expliquer pourquoi et comment j'utilise quotidiennement gVim et Rox-filer, et le tout sous Ubuntu.&lt;/p&gt;


&lt;p&gt;Revenons en à nos moutons, un environnement de développement, c'est constitué de quelques briques primordiales:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Un éditeur de code&lt;/li&gt;
&lt;li&gt;Un navigateur de fichier&lt;/li&gt;
&lt;li&gt;Un truc qui fait tourner tout ça&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Peu importe qu'ils soient &lt;em&gt;intégrés&lt;/em&gt; ou non, finalement. Personnellement, je suis un fervent adepte du précepte &lt;em&gt;une tâche, un outil&lt;/em&gt;, donc je preferre qu'ils soient dissociés.&lt;/p&gt;


&lt;h3&gt;L'éditeur de code: gVim&lt;/h3&gt;


&lt;p&gt;Certains perdent leurs moyens à la simple évocation de son nom, &lt;em&gt;vim&lt;/em&gt; n'est pourtant rien de plus que le plus puissant des éditeurs de fichier aujourd'hui disponible dans le monde (un troll s'est malicieusement glissé dans cette affirmation, saurez-vous le retrouver ?). Ce qui déroute au premier abord dans &lt;em&gt;vim&lt;/em&gt;, c'est finalement ce qui fait toute sa puissance: le mode &lt;em&gt;commande&lt;/em&gt;. J'ai longtemps utilisé &lt;a href=&quot;http://bluefish.openoffice.nl/index.html&quot;&gt;bluefish&lt;/a&gt;, et finalement las de ses quelques bugs bien énervants (wtf syntax color ?), j'ai décidé de faire le grand pas, et d'utiliser &lt;em&gt;vim&lt;/em&gt;. J'avais bien sur déjà une expérience de cet éditeur, mais retenez bien que le meilleur moyen de maitriser un outil aussi puissant que &lt;em&gt;vim&lt;/em&gt;, ce n'est pas de se jeter à corps perdu dans la doc, mais c'est d'investir du temps incrémentiellement: commencer à utiliser &lt;em&gt;vim&lt;/em&gt;, et quand on souhaite faire quelque chose qu'on ne sait pas faire, lire &lt;a href=&quot;http://vimdoc.sf.net/&quot;&gt;la doc correspondante&lt;/a&gt;&lt;sup&gt;[&lt;a href=&quot;http://mirmodynamics.com/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE#pnote-723-1&quot; id=&quot;rev-pnote-723-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;. Pour finir, j'ai traduit il y a quelque temps un excellent tutoriel sur &lt;em&gt;vim&lt;/em&gt;: &lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2004/05/08/150-ledition-efficace-avec-vim&quot;&gt;L'édition efficace avec vim&lt;/a&gt;, donc n'hésitez pas.&lt;/p&gt;


&lt;h4&gt;Un .vimrc qu'il est joli&lt;/h4&gt;


&lt;p&gt;Comme la plupart des applications &lt;em&gt;*nix&lt;/em&gt;, &lt;em&gt;vim&lt;/em&gt; autorise l'utilisation d'un fichier &lt;em&gt;~/.vimrc&lt;/em&gt;. S'il peut paraitre compliqué au premier abord d'élaborer un &lt;em&gt;.vimrc&lt;/em&gt; efficace, il ne faut pas se décourager, car comme d'habitude, il y a tout ce qu'il faut sur le net. J'en veux pour preuve &lt;a href=&quot;http://schlitt.info/applications/blog/index.php?/archives/488-Comfortable-PHP-editing-with-VIM-5.html&quot;&gt;les excellents articles&lt;/a&gt; de &lt;a href=&quot;http://schlitt.info/&quot;&gt;Tobias Schlitt&lt;/a&gt; à ce sujet.&lt;/p&gt;


&lt;p&gt;Pour info, quelques directives de configuration utiles qu'on peut trouver dans mon &lt;em&gt;.vimrc&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;
&amp;quot; Supprime un buffer de la mémoire via le raccourci clavier Ctrl+W
noremap &amp;lt;C-W&amp;gt; :bdel!&amp;lt;CR&amp;gt;

&amp;quot; Active l'indentation automatique
set autoindent

&amp;quot; Active les plugins de type de fichier
filetype plugin on

&amp;quot; Active la coloration syntaxique
syntax on

&amp;quot; Thème de couleur pour gVim
colorscheme desert

&amp;quot; Utiliser des tabs de 4 caractères pour l'indentation
set noexpandtab tabstop=4 shiftwidth=4

&amp;quot; Activer la souris (molette, sélection, etc)
set mouse=a

&amp;quot; Afficher des infos dans la barre de status
set ruler
set laststatus=2

&amp;quot; Activer la numérotation des lignes
set number

&amp;quot; Utiliser la recherche incrémentielle
set incsearch

&amp;quot; Ne pas surligner les résultats de recherche
set nohlsearch
&lt;/pre&gt;


&lt;p&gt;Quelques unes (beaucoup en fait) de ces directives sont tirées du &lt;em&gt;.vimrc&lt;/em&gt; de Tobias.&lt;/p&gt;


&lt;p&gt;Dernier détail pour les réfractaires de la ligne de commande, &lt;em&gt;gVim&lt;/em&gt; s'execute en &lt;em&gt;mode graphique&lt;/em&gt;, avec une interface &lt;acronym&gt;GTK&lt;/acronym&gt; conviviale qui permet d'apprendre les raccourcis aisément, et qui gère la souris (défilement à la molette, etc, et d'ailleurs, même en console ça gère la souris, il suffit d'un &lt;code&gt;:set mouse=&amp;quot;a&amp;quot;&lt;/code&gt; pour l'activer).&lt;/p&gt;


&lt;h4&gt;Un ftplugin pour le PHP&lt;/h4&gt;


&lt;p&gt;Ce qu'on appelle &lt;em&gt;ftplugin&lt;/em&gt; dans &lt;em&gt;vim&lt;/em&gt; permet de configurer &lt;em&gt;vim&lt;/em&gt; en fonction du type de fichier que l'on édite. Tobias fournit un &lt;em&gt;ftplugin&lt;/em&gt; spécialisé dans l'édition du &lt;acronym&gt;PHP&lt;/acronym&gt; plutôt bien foutu, qui gère la plupart des &lt;em&gt;features convi-enabled&lt;/em&gt; des soit disants &lt;acronym&gt;IDE&lt;/acronym&gt; évolués:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complétion des fonctions&lt;/li&gt;
&lt;li&gt;Complétion des mots-clés&lt;/li&gt;
&lt;li&gt;Auto-fermeture des crochets, parenthèses, etc.&lt;/li&gt;
&lt;li&gt;Auto-génération des docblocks PHPDoc&lt;/li&gt;
&lt;li&gt;Vérification de syntaxe du fichier édité&lt;/li&gt;
&lt;li&gt;Et d'autres trucs merveilleux !&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La classe non ?&lt;/p&gt;


&lt;h3&gt;Un navigateur de fichier kirox (tm)&lt;/h3&gt;


&lt;p&gt;C'est pas moi qui le dit, en fait c'est comme le port-salut, &lt;a href=&quot;http://rox.sf.net/&quot;&gt;rox-filer&lt;/a&gt; rox, c'est tout. Pour ceux que ma puissance de persuasion ne suffit pas, et bien &lt;em&gt;rox-filer&lt;/em&gt; offre tout ce que vous pourriez attendre d'un gestionnaire de fichier moderne:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigation spatiale avec technologie &lt;em&gt;oupas&lt;/em&gt; (tm)&lt;/li&gt;
&lt;li&gt;Prévisualisation des images&lt;/li&gt;
&lt;li&gt;Personnalisation (aisée !) des applications utilisées pour lancer les fichiers (en fonction du mimetype)&lt;/li&gt;
&lt;li&gt;Navigation one-click (&lt;em&gt;oupas&lt;/em&gt; (tm))&lt;/li&gt;
&lt;li&gt;Navigation aisée au clavier&lt;/li&gt;
&lt;li&gt;Monitorage des fichiers en cours d'utilisation (ils apparaissent en &lt;strong&gt;gras&lt;/strong&gt;, ce qui est pratique).&lt;/li&gt;
&lt;li&gt;Et j'en passe et des meilleurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bref, il fait tout ce que ferait un &lt;em&gt;filebrowser&lt;/em&gt; intégré, mais en mieux, puisqu'il est dédié dès le début à cette tache. Afin de le faire interragir au mieux avec gVim, j'utilise la &lt;em&gt;Run action&lt;/em&gt; suivante sur le mimetype &lt;code&gt;text/*&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;gvim --servername ash0 --remote-silent-tab &amp;quot;$@&amp;quot;&lt;/pre&gt;


&lt;p&gt;Qui permet d'ouvrir le fichier dans un nouveau tab de &lt;em&gt;vim&lt;/em&gt;, en créant une instance d'un server &lt;em&gt;vim&lt;/em&gt; à la volée si il n'existe pas déjà (ici le server s'appelle &lt;code&gt;ash0&lt;/code&gt;, mais vous pouvez bien évidemment en changer le nom).&lt;/p&gt;


&lt;h3&gt;Une distribution du bien: Ubuntu&lt;/h3&gt;


&lt;p&gt;Et parcequ'il faut bien faire tourner tout ça, j'utilise un système d'exploitation &lt;em&gt;du bien&lt;/em&gt; (tm): GNU/Linux. Mais comme j'ai la flemme, j'utilise une configuration &lt;em&gt;convi-enabled&lt;/em&gt;: &lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt;. Pas besoin de s'étaler je pense, Ubuntu c'est &lt;strong&gt;bien&lt;/strong&gt;, tout le monde en conviendra.&lt;/p&gt;


&lt;h3&gt;Un window-manager léger et puissant: fluxbox&lt;/h3&gt;


&lt;p&gt;Le choix du gestionnaire de fenêtre peut par contre préter a controverse. En effet, c'est ici avant tout une question de gout et de puissance de machine. J'ai personellement un penchant pour les logiciels puissants et légers. Là je vous vois venir avec vos gros sabots: &lt;em&gt;tout le monde veut ce genre de logiciel&lt;/em&gt;. Et bien j'ai envie de répondre que non. La majorité des &lt;em&gt;neo-geeks&lt;/em&gt; de la génération Ubuntu s'en donnent à coeur joie sous Gnome et/ou KDE, qui est loin de ce qu'il convient d'appeler un logiciel &lt;em&gt;puissant et léger&lt;/em&gt;, sous prétexte que les autres &lt;acronym&gt;WM&lt;/acronym&gt; (à part &lt;acronym&gt;KDE&lt;/acronym&gt;), &lt;em&gt;saitrocomplicai&lt;/em&gt;. Bon là ok, j'amalgame surement un peu (beaucoup même, tous les gens sous Gnome ne sont pas des &lt;em&gt;neo-geek&lt;/em&gt;, et l'inverse également), mais il manquait un peu de trollitude dans cet article. Bref, quand on veut, on peut, et comme les gens ne switchent pas de Gnome à un &lt;acronym&gt;WM&lt;/acronym&gt; plus puissant et plus léger, j'en conclus (peut-être à tord hein) qu'ils ne veulent pas.&lt;/p&gt;


&lt;p&gt;Tout ça pour dire que j'utilise &lt;a href=&quot;http://www.fluxbox.org/&quot;&gt;fluxbox&lt;/a&gt;, et ce depuis ma plus tendre enfance. Fluxbox est léger (osez prétendre le contraire...) et puissant: il permet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;de reconfigurer l'intégralité du comportement de vos fenêtres&lt;/li&gt;
&lt;li&gt;une gestion fine et puissante des raccourcis claviers (j'ai pu reconfigurer les touches &lt;em&gt;convi&lt;/em&gt; de mon clavier &lt;em&gt;convi&lt;/em&gt; en quelques minutes dans mon &lt;code&gt;.fluxbox/keys&lt;/code&gt; grâce à &lt;code&gt;xev&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;de controler facilement quelles applications se lancent au démarrage&lt;/li&gt;
&lt;li&gt;de controler encore plus facilement sur quels bureaux se lancent les sus-citées applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par exemple, mon &lt;code&gt;.fluxbox/startup&lt;/code&gt; démarre sur le premier bureau quelques terminaux, un gaim et un exaile; sur le deuxième bureau un firefox sur le troisième bureau: sylphee, et sur le quatrième bureau, un rox-filer. A coté de ça, je dispose de raccourcis claviers conviviaux pour lancer mes logiciels favoris: le terminal (Mod4&lt;sup&gt;[&lt;a href=&quot;http://mirmodynamics.com/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE#pnote-723-2&quot; id=&quot;rev-pnote-723-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;+e), rox-filer (Mod4+r), etc. J'ai également à ma disposition des raccourcis claviers pour gérer mes fenêtres: maximiser (horizontalement (Ctrl+Alt+H), verticalement -Ctrl+Alt+V), ou les deux (Ctrl+Alt+M)), &lt;em&gt;enrouler&lt;/em&gt; (Mod4+S), &lt;em&gt;sticker&lt;/em&gt; (Ctrl+Alt+S), enlever les décorations (Ctrl+Alt+T), et j'en passe.&lt;/p&gt;


&lt;p&gt;Enfin, et le plus important pour moi, fluxbox est &lt;em&gt;non-intrusif&lt;/em&gt;. Par défaut, un bureau standard de mon fluxbox ne contient rien. Pas de barre des taches, pas d'icones, pas de menu, &lt;strong&gt;rien&lt;/strong&gt;. Question de gout je vous l'accorde, mais là encore, notez que &amp;quot;c'est faisable&amp;quot;: fluxbox ne vous impose rien, et surtout pas les choix discutables car subjectifs des développeurs.&lt;/p&gt;


&lt;h3&gt;Subversion en ligne de commande&lt;/h3&gt;


&lt;p&gt;Enfin, j'utilise le client subversion en ligne de commande. D'une part parceque je ne connais pas de client digne de ce nom en &lt;acronym&gt;GTK&lt;/acronym&gt; (ma religion m'interdit d'utiliser &lt;acronym&gt;Qt&lt;/acronym&gt;), d'autre part pour profiter pleinement de la puissance qu'offre un shell quand on sait un minimum s'en servir. Pouvoir passer mes commandes &lt;code&gt;svn&lt;/code&gt; dans des &lt;code&gt;awk&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, et autres &lt;code&gt;grep&lt;/code&gt; (surtout &lt;code&gt;grep&lt;/code&gt; en fait), ça n'a pas de prix, et je pense vraiment qu'aucune interface graphique n'arrivera jamais à la cheville de la puissance d'un shell.&lt;/p&gt;


&lt;p&gt;Deuxième avantage à utiliser &lt;code&gt;svn&lt;/code&gt; en ligne de commande: le jour où je serais obligé de le faire, je saurais le faire.&lt;/p&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;


&lt;p&gt;Voilà, vous savez (presque) tout de mes habitudes de travail (il reste pas mal de domaines à couvrir quand même, je n'ai pas parlé par exemple de mes extensions firefox favorites, ni de mon utilisation intensive de trac, et encore moins des tests unitaires, peut-être une prochaine fois), et j'espère vous avoir donné l'envie de regarder d'un peu plus près ces outils à la réputation peut-être un peu geek, mais d'une puissance incomparable une fois maitrisés :-)&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://mirmodynamics.com/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE#rev-pnote-723-1&quot; id=&quot;pnote-723-1&quot;&gt;1&lt;/a&gt;] :help &lt;em&gt;commande&lt;/em&gt; est en général d'une grande utilité&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://mirmodynamics.com/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE#rev-pnote-723-2&quot; id=&quot;pnote-723-2&quot;&gt;2&lt;/a&gt;] Le petit nom de la touche Windows&lt;/p&gt;&lt;/div&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/723</wfw:commentRss>
      </item>
    
  <item>
    <title>ViewHelper de génération d'urls</title>
    <link>http://mirmodynamics.com/post/2006/11/24/ViewHelper-de-generation-durls</link>
    <guid isPermaLink="false">urn:md5:c86ea8dd7be65bd1b6c3bd524fa962e3</guid>
    <pubDate>Fri, 24 Nov 2006 20:27:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>configuration</category><category>howto</category><category>i18n</category><category>organisation</category><category>php</category><category>zend framework</category>    
    <description>    &lt;p&gt;Pré-requis: &lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2006/10/31/Howto%3A-Utiliser-Zend_Controller_RewriteRouter-avec-Zend_Config&quot;&gt;Zend_Controller_RewriteRouter&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Nous allons voir aujourd'hui comment générer automagiquement des &lt;acronym&gt;URL&lt;/acronym&gt;s à partir des routes définies dans le &lt;em&gt;RewriteRouter&lt;/em&gt;, ainsi que les avantages que cela présente. Le &lt;code&gt;Helper&lt;/code&gt; que nous allons utiliser nécessite le stockage du routeur dans le registre:&lt;/p&gt;

&lt;pre&gt;
Zend::register('router', $router);
&lt;/pre&gt;


&lt;p&gt;Avant de voir le &lt;code&gt;Helper&lt;/code&gt; lui même, un petit &lt;em&gt;Use Case&lt;/em&gt;. Admettons que vous développiez une application de gestion de petites annonces, vous aurez à un moment ou un autre à créer un lien quelconque pour, par exemple, créer une annonce, et en voir les détails. Disons que vous ayez des routes route du genre (je zappe les &lt;code&gt;defaults&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;
announceCreate.route = /announce/create
announceDetails.route = /announce/:id/details
&lt;/pre&gt;


&lt;p&gt;L'objectif est de pouvoir créer les liens grâce au code suivant (à partir de la view):&lt;/p&gt;

&lt;pre&gt;
&amp;lt;a href=&amp;quot;&amp;lt;?php echo $this-&amp;gt;href('announceCreate'); ?&amp;gt;&amp;quot;&amp;gt;Créer une annonce&amp;lt;/a&amp;gt;
&amp;lt;a href=&amp;quot;&amp;lt;?php echo $this-&amp;gt;href('announceDetails', array('id' =&amp;gt; $announce-&amp;gt;id)); ?&amp;gt;&amp;quot;&amp;gt;Voir l'annonce&amp;lt;/a&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Et comme le &lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt; est bien fait, c'est très simple à réaliser sous forme de &lt;code&gt;ViewHelper&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
class Zend_View_Helper_Href {
	
	/**
	 * Returns the href to a given route
	 *
	 * @param string $routeName
	 * @param array $args
	 * @return string
	 */
	
	public function href($routeName, $args = array()) {
		try {
			return Zend::registry('router')-&amp;gt;getRoute($routeName)-&amp;gt;assemble($args);
		} catch (Zend_Controller_Router_Exception $e) {
			return '#404';
		}
	}
}
&lt;/pre&gt;


&lt;p&gt;Tellement simple que pour combler un peu je vous offre le &lt;em&gt;docblock&lt;/em&gt; qui va avec ;-)&lt;/p&gt;


&lt;p&gt;Là où ça devient &lt;strong&gt;très&lt;/strong&gt; pratique, c'est quand on souhaite localiser les &lt;acronym&gt;URL&lt;/acronym&gt;s. Par exemple, imaginons que vous souhaitiez &lt;em&gt;françiser&lt;/em&gt; les &lt;acronym&gt;URL&lt;/acronym&gt;s pour, par exemple, améliorer votre référencement. Vous n'avez qu'a définir un jeu de routes &lt;em&gt;fr_FR&lt;/em&gt;, par exemple ainsi:&lt;/p&gt;

&lt;pre&gt;
[routes_fr_FR]
announceCreate.route = /annonce/creer
announceDetails.route = /annonce/:id/details

[routes_en_UK]
announceCreate.route = /announce/create
announceDetails.route = /announce/:id/details

[routes:route_fr_FR]
announceCreate.defaults.controller = announce
announceCreate.defaults.action = create

announceDetails.defaults.controller = announce
announceDetails.defaults.action = details
&lt;/pre&gt;


&lt;p&gt;L'utilisation de l'héritage géré par &lt;code&gt;Zend_Config&lt;/code&gt; nous permet ici d'éviter la redondance des &lt;code&gt;defaults&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Elle est pas belle la vie ?&lt;/p&gt;


&lt;p&gt;Note: cette fonctionnalitée est prévue pour être &lt;em&gt;builtin&lt;/em&gt; plus tard.&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/11/24/ViewHelper-de-generation-durls#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/11/24/ViewHelper-de-generation-durls#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/725</wfw:commentRss>
      </item>
    
  <item>
    <title>Discussion sur l'optimisation en PHP chez NiKo</title>
    <link>http://mirmodynamics.com/post/2006/11/23/Discussion-sur-loptimisation-en-PHP-chez-NiKo</link>
    <guid isPermaLink="false">urn:md5:967d08dda8033faf171a3edb213844a8</guid>
    <pubDate>Thu, 23 Nov 2006 13:40:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>bonnes pratiques</category><category>clichés</category><category>configuration</category><category>environnement</category><category>optimisation</category><category>organisation</category><category>way of life</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://www.prendreuncafe.com/blog/post/2006/11/22/12-astuces-optimisation-performances-php&quot;&gt;Une petite discussion sur l'optimisation en PHP&lt;/a&gt; à lieu en ce moment chez NiKo ! Ce n'est pas souvent que je &lt;em&gt;link&lt;/em&gt; directement comme ça, donc dites vous que quand je le fais, c'est que ça en vaut la peine ;-)&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/11/23/Discussion-sur-loptimisation-en-PHP-chez-NiKo#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/11/23/Discussion-sur-loptimisation-en-PHP-chez-NiKo#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/724</wfw:commentRss>
      </item>
    
  <item>
    <title>Howto: Utiliser Zend_Controller_RewriteRouter avec Zend_Config</title>
    <link>http://mirmodynamics.com/post/2006/10/31/Howto%3A-Utiliser-Zend_Controller_RewriteRouter-avec-Zend_Config</link>
    <guid isPermaLink="false">urn:md5:58ec785aef55507ca8784ce7b8d798b3</guid>
    <pubDate>Tue, 31 Oct 2006 20:26:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>bootstrap</category><category>configuration</category><category>controlleurs</category><category>doc</category><category>howto</category><category>ini</category><category>MVC</category><category>php</category><category>zend framework</category>    
    <description>&lt;p&gt;Comme je le disais plus bas, le Zend Framework Preview 0.2.0 est dans les bacs ! Cette nouvelle mouture apporte son lot de nouveautés, et nous allons nous pencher sur une des plus interressantes: le &lt;em&gt;RewriteRouter&lt;/em&gt;. Le &lt;em&gt;RewriteRouter&lt;/em&gt; est un routeur pour le composant &lt;acronym&gt;MVC&lt;/acronym&gt; du Zend Framework qui va nous permettre de configurer nos &lt;acronym&gt;URL&lt;/acronym&gt; comme dans Ruby on Rails, c'est à dire (en gros), via un fichier de configuration, et c'est là que &lt;em&gt;Zend_Config&lt;/em&gt; entre en jeu.&lt;/p&gt;    &lt;h3&gt;Mettre en place le routeur&lt;/h3&gt;


&lt;p&gt;C'est bien beau tout ça, mais pour l'utiliser, il faut déjà en informer le controlleur. Pour cela, rien de plus simple, on utilise la méthode &lt;code&gt;addRouter&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;$router = new Zend_Controller_RewriteRouter;
$controller = Zend_Controller_Front::getInstance();
$controller-&amp;gt;setRouter($router);&lt;/pre&gt;


&lt;p&gt;Le &lt;em&gt;RewriteRouter&lt;/em&gt; est pré-configuré avec deux routes qui permettent d'assurer la compatibilité descendante avec l'ancien routeur, donc jusque là, tout va bien.&lt;/p&gt;


&lt;h3&gt;Déclarer les routes&lt;/h3&gt;


&lt;p&gt;Nous utiliserons un fichier de configuration dédié aux routes, que nous appellerons sobrement &lt;em&gt;routes.ini&lt;/em&gt;, et que nous placerons dans &lt;code&gt;app/&lt;/code&gt;, à coté de son compagnon &lt;em&gt;config.ini&lt;/em&gt;. Ce fichier de configuration contiendra une unique section &lt;code&gt;[routes]&lt;/code&gt;, qui contiendra à son tour les multiples définitions de routes que nous souhaitons y caser. Une route se compose de 5 éléments principaux:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;L'identifiant de la route. C'est un identifiant interne utilisé par le &lt;code&gt;RewriteRouter&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;l'&lt;acronym&gt;URL&lt;/acronym&gt; de la route, c'est ce qui permet au routeur de reconnaitre la route à utiliser,&lt;/li&gt;
&lt;li&gt;les valeurs par défauts des variables,&lt;/li&gt;
&lt;li&gt;les requirements de la route, qui permettent de déterminer si une route est bien formée ou non.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sans plus attendre, un petit exemple: la route qui &lt;em&gt;pourrait&lt;/em&gt; permettre d'accéder à un billet dans dotclear 2:&lt;/p&gt;


&lt;pre&gt;post.route = post/:year/:month/:day/:title
post.reqs.year = &amp;quot;\d+&amp;quot;
post.reqs.month = &amp;quot;\d+&amp;quot;
post.reqs.day = &amp;quot;\d+&amp;quot;
post.reqs.title = &amp;quot;[a-zA-Z0-9_:-]&amp;quot;+
post.defaults.controller = post
post.defaults.action = view
post.defaults.title =&lt;/pre&gt;


&lt;p&gt;Elle &lt;em&gt;pourrait&lt;/em&gt; seulement, car en fait, la regexp du &lt;code&gt;title&lt;/code&gt; est trop restrictive (une &lt;acronym&gt;URL&lt;/acronym&gt; peut contenir d'autres caractères que ceux là), et de plus, les &lt;acronym&gt;URL&lt;/acronym&gt; stockées par dotclear 2 en base de données comprennent tout ce qui se trouve après &lt;code&gt;post/&lt;/code&gt; (par exemple le champs &lt;code&gt;post_url&lt;/code&gt; de ce billet contient: &lt;code&gt;2006/10/31/Howto:-Utiliser-Zend_Controller_RewriteRouter-avec-Zend_Config&lt;/code&gt;).&lt;/p&gt;


&lt;p&gt;Cela étant dit, la route que nous venons de décrire s'appliquera aux &lt;acronym&gt;URL&lt;/acronym&gt;s suivantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/post/2006/30/10/ZendFramework&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/post/42/2006/56/Foobar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/post/2006/30/10/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais pas à:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/post/2006/Foobar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/post/Foobar/2006/30/01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On note donc d'ores et déjà:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;que la validation des composants d'une route se fait par expression régulière&lt;/li&gt;
&lt;li&gt;qu'on peut ommettre le dernier composant d'une route si il possède une valeur par défaut (récursivement)&lt;/li&gt;
&lt;li&gt;qu'on ne peut pas modifier l'ordre des composants d'une route&lt;/li&gt;
&lt;li&gt;qu'on doit spécifier manuellement le nom du controlleur et de l'action à utiliser&lt;/li&gt;
&lt;li&gt;et c'est déjà pas mal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Décortiquons maintenant une &lt;acronym&gt;URL&lt;/acronym&gt;: &lt;code&gt;/post/2006/30/10/ZendFramework&lt;/code&gt;. Le routeur va diviser cette &lt;acronym&gt;URL&lt;/acronym&gt; ainsi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controller: &lt;code&gt;post&lt;/code&gt; (d'après les &lt;em&gt;defaults&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Action: &lt;code&gt;view&lt;/code&gt; (d'après les &lt;em&gt;defaults&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Paramètres: &lt;code&gt;year&lt;/code&gt;: 2006, &lt;code&gt;month&lt;/code&gt;: 30, &lt;code&gt;day&lt;/code&gt;: 10, &lt;code&gt;title&lt;/code&gt;: ZendFramework (d'après l'&lt;acronym&gt;URL&lt;/acronym&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les paramètres ainsi détectés seront disponibles via la méthode &lt;code&gt;$this-&amp;gt;_getParam($name);&lt;/code&gt; a l'intérieur du controlleur.&lt;/p&gt;


&lt;p&gt;Dernier point de ce chapitre, une déclaration de route peut comporter deux variables spéciales: &lt;code&gt;:controller&lt;/code&gt; et &lt;code&gt;:action&lt;/code&gt;, qui servent respectivement à détecter le controller et l'action à utiliser dans l'url. Par exemple, la route &lt;em&gt;builtin&lt;/em&gt; &lt;code&gt;compat&lt;/code&gt; chargé d'assurer la compatibilité descendante se déclare ainsi:&lt;/p&gt;


&lt;pre&gt;compat.route = :controller/:action
compat.defaults.controller = index
compat.defaults.action = index&lt;/pre&gt;


&lt;h3&gt;Assembler le tout&lt;/h3&gt;


&lt;p&gt;Dernière étape, transférer directement toutes ces déclarations dans le Routeur: n'y allons pas par quatre chemin:&lt;/p&gt;


&lt;pre&gt;$router-&amp;gt;addConfig(new Zend_Config_Ini('/path/to/routes.ini', null), 'routes');&lt;/pre&gt;


&lt;p&gt;C'est aussi simple que ça. Ce qui nous donne, en prenant en compte le morceau de code du début de l'article:&lt;/p&gt;


&lt;pre&gt;$router = new Zend_Controller_RewriteRouter;
$router-&amp;gt;addConfig(new Zend_Config_Ini($routes_path, null), 'routes');
$controller = Zend_Controller_Front::getInstance();
$controller-&amp;gt;setRouter($router);&lt;/pre&gt;


&lt;p&gt;And voilà. Je ne saurais que vous conseiller la lecture du &lt;a href=&quot;http://framework.zend.com/manual/en/zend.controller.rewriterouter.html&quot;&gt;manuel&lt;/a&gt; pour plus d'informations (sachant qu'en fait, &lt;code&gt;addRoute&lt;/code&gt; attend en deuxième argument une instance de &lt;code&gt;Zend_Controller_Router_Route&lt;/code&gt;, mais qui s'instancie avec les paramètres qu'ils passent à &lt;code&gt;addRoute&lt;/code&gt;, petite coquille du manuel :p).&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/10/31/Howto%3A-Utiliser-Zend_Controller_RewriteRouter-avec-Zend_Config#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/10/31/Howto%3A-Utiliser-Zend_Controller_RewriteRouter-avec-Zend_Config#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/710</wfw:commentRss>
      </item>
    
  <item>
    <title>Mettre en place un SSO avec Invision Power Board</title>
    <link>http://mirmodynamics.com/post/2006/10/24/Mettre-en-place-un-SSO-avec-Invision-Power-Board</link>
    <guid isPermaLink="false">urn:md5:e31ee19b3caa179f39e785cafe1ae2d1</guid>
    <pubDate>Wed, 25 Oct 2006 23:02:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>configuration</category><category>hack</category><category>howto</category><category>ip.board</category><category>php</category><category>sso</category><category>work</category>    
    <description>&lt;p&gt;Rien de plus simple, tout est déjà prévu. Après l'installation de votre forum &lt;acronym&gt;IPB&lt;/acronym&gt;, nous allons enregistrer une nouvelle méthode de login. Pour se faire, dans le panneau d'administration, nous nous dirigeons vers &lt;em&gt;Tools and Settings&lt;/em&gt;, puis dans &lt;em&gt;Create New Log In&lt;/em&gt; du menu &lt;em&gt;Log In Manager&lt;/em&gt;. On se retrouve devant un formulaire (assez explicite) que je vous laisse le soin de remplir. On dira juste que nous appellerons cette méthode de login &lt;em&gt;Mon SSO&lt;/em&gt; (&lt;em&gt;Log In Title&lt;/em&gt;) et qu'il vivra dans le répertoire &lt;code&gt;mon_sso&lt;/code&gt; (&lt;em&gt;Log In Files Folder Name&lt;/em&gt;). Pour que votre méthode de login soit active, vous devez cocher &lt;em&gt;Log In Enabled&lt;/em&gt;, et il est toujours bon de passer en mode &lt;em&gt;On-Fail&lt;/em&gt;, ainsi que d'autoriser la création d'utilisateurs (&lt;em&gt;Log In Allow Member Creation&lt;/em&gt;), qui créera automagiquement les utilisateurs dans la base locale d'&lt;acronym&gt;IPB&lt;/acronym&gt;.&lt;/p&gt;    &lt;p&gt;Ensuite on met les mains dans le camboui. Dans le répertoire &lt;code&gt;sources/loginauth/&lt;/code&gt; de votre installation, il doit exister un repertoire &lt;code&gt;external/&lt;/code&gt;, qui nous servira de base. On commence donc par le dupliquer:&lt;/p&gt;


&lt;pre&gt;cp -r external mon_sso&lt;/pre&gt;


&lt;p&gt;Puis on regarde un peu ce qu'il y a dedans:&lt;/p&gt;


&lt;pre&gt;mon_sso/
	auth.php
	conf.php
	index.html&lt;/pre&gt;


&lt;p&gt;Le fichier &lt;code&gt;index.html&lt;/code&gt; n'est qu'un empécheur de tourner en rond pour les gens qui explorent un peu trop les arbos web. Le premier fichier qui nous interresse est &lt;code&gt;conf.php&lt;/code&gt;, il contient les informations relatives à la base de données distantes. Là encore, c'est assez explicite et bien commenté. Le seul petit truc à savoir est que l'utilisateur qui se connectera à la base a besoin des droits &lt;em&gt;SELECT&lt;/em&gt; sur &lt;strong&gt;toute&lt;/strong&gt; la table, pas seulement sur les champs login / pass.&lt;/p&gt;


&lt;p&gt;Dans le meilleur des cas, votre &lt;acronym&gt;SSO&lt;/acronym&gt; est prêt :p Le fichier &lt;code&gt;auth.php&lt;/code&gt; contient les méthodes appelées par le gestionnaire d'identification. Vous pouvez avoir besoin de modifier &lt;code&gt;__compare_password&lt;/code&gt;, pour la vérification du mot de passe (j'ai par exemple changé la méthode de cryptage qui est md5 par défaut).&lt;/p&gt;


&lt;p&gt;A ce stade, vos utilisateurs peuvent s'identifier, mais le forum leur demande quand même leur mail et quelques infos que j'ai oublié. Il est bien évidemment possible d'éviter ça :-)
Dans la méthode &lt;code&gt;authenticate&lt;/code&gt;, vers la fin, quand un utilisateur local est créé, la main est passée à la méthode &lt;code&gt;create_local_member&lt;/code&gt;, qui redirige ensuite vers l'écran de complétion du compte. C'est là que nous intervenons. La méthode &lt;code&gt;create_local_member&lt;/code&gt; n'est pas implémenté dans &lt;code&gt;login_method&lt;/code&gt;, mais dans &lt;code&gt;login_core&lt;/code&gt;, qui se trouve dans le fichier &lt;code&gt;sources/loginauth/login_core.php&lt;/code&gt;, nous commençons par la copier/coller dans notre &lt;code&gt;login_method&lt;/code&gt;, puis nous modifions sa déclaration pour lui permettre de recevoir &lt;code&gt;$remote_member&lt;/code&gt; en paramètre:&lt;/p&gt;


&lt;pre&gt;function create_local_member( $remote_member )
{&lt;/pre&gt;


&lt;p&gt;Cette méthode permet de piocher dans les informations récupérées dans la base distante. Dans la partie &lt;em&gt;Populate member table(s)&lt;/em&gt;, par défaut, un faux mail est créé:&lt;/p&gt;


&lt;pre&gt;$email_tmp = $username.'@'.$timenow;&lt;/pre&gt;


&lt;p&gt;Qu'on peut remplacer par le mail qu'on a déjà potentiellement dans la base distante (disons que le champs s'appelle &lt;code&gt;mail&lt;/code&gt;):&lt;/p&gt;


&lt;pre&gt;$email_tmp = $remote_member['mail'];&lt;/pre&gt;


&lt;p&gt;On peut ensuite récupérer les champs que l'on veut pour les ajouter au membre local, par exemple dans mon cas, le &lt;code&gt;display_name&lt;/code&gt; (&lt;code&gt;nickname&lt;/code&gt; chez moi):&lt;/p&gt;


&lt;pre&gt;$display_name = $remote_member['nickname'];&lt;/pre&gt;


&lt;p&gt;en les rajoutant dans le tableau &lt;code&gt;$member&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Les deux derniers appels de méthode dans &lt;code&gt;create_local_member&lt;/code&gt;, &lt;code&gt;$this-&amp;gt;ipsclass-&amp;gt;DB-&amp;gt;do_insert&lt;/code&gt; et &lt;code&gt;$this-&amp;gt;ipsclass-&amp;gt;print-&amp;gt;redirect_screen&lt;/code&gt; sont à commenter, et on rajouter avant le bout de code suivant:&lt;/p&gt;


&lt;pre&gt;$this-&amp;gt;return_code = 'SUCCESS';
return;&lt;/pre&gt;


&lt;p&gt;Retour dans &lt;code&gt;authenticate&lt;/code&gt;, dans la partie &lt;em&gt;Got no member - but auth passed - create?&lt;/em&gt;, on modifie la première partie du &lt;code&gt;if&lt;/code&gt; ainsi:&lt;/p&gt;


&lt;pre&gt;if ( $this-&amp;gt;allow_create )
{
	$this-&amp;gt;create_local_member( $remote_member );
	$this-&amp;gt;_load_member($username);

	if ( $this-&amp;gt;member['id'] )
	{
		$this-&amp;gt;return_code = 'SUCCESS';
	}
	else
	{
		$this-&amp;gt;return_code = 'NO_USER';
	}
	return;
}&lt;/pre&gt;


&lt;p&gt;And voilà, nos utilisateurs peuvent désormais s'identifier sans avoir a re-entrer des informations que l'on possède déjà :-)&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/10/24/Mettre-en-place-un-SSO-avec-Invision-Power-Board#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/10/24/Mettre-en-place-un-SSO-avec-Invision-Power-Board#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/693</wfw:commentRss>
      </item>
    
  <item>
    <title>Relayer un stream audio avec icecast2</title>
    <link>http://mirmodynamics.com/post/2006/10/20/Relayer-un-stream-audio-avec-icecast2</link>
    <guid isPermaLink="false">urn:md5:0df1adaf1cd213b3a277c6eb891f838d</guid>
    <pubDate>Fri, 20 Oct 2006 22:05:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Geekeries</category>
        <category>bidouille</category><category>configuration</category><category>doc</category><category>howto</category><category>optimisation</category><category>rigolo</category><category>ubuntu</category><category>unix</category><category>way of life</category><category>work</category>    
    <description>    &lt;p&gt;Pour économiser la bande passante au boulot, j'ai décidé de relayer le stream &lt;em&gt;Club !&lt;/em&gt; de &lt;a href=&quot;http://1.fm/&quot;&gt;1.fm&lt;/a&gt; sur le &lt;acronym&gt;LAN&lt;/acronym&gt;. Après avoir vainement tenté d'utiliser streamripper (on verra plus tard pourquoi vainement), j'ai sorti l'artillerie lourde: &lt;a href=&quot;http://www.icecast.org/&quot;&gt;icecast2&lt;/a&gt;:&lt;/p&gt;


&lt;pre&gt;sudo apt-get install icecast2&lt;/pre&gt;


&lt;p&gt;Si on sait un peu lire, le script de post-configuration nous incite à aller fourrer notre nez dans &lt;code&gt;/etc/default/icecast2&lt;/code&gt;, où l'on apprend (vers la fin) que icecast est désactivé par défaut à cause de la directive &lt;code&gt;ENABLED=false&lt;/code&gt;. C'est en fait une feinte pour nous pousser à configurer le bousin (de toute façon si on le configure pas, il marchera pas). Direction &lt;code&gt;/etc/icecast2/icecast.xml&lt;/code&gt; donc, pour un brin de configuration (les explications qui suivent se basent sur le fichier par défaut d'une installation sur une ubuntu).&lt;/p&gt;


&lt;p&gt;La première partie qui nous interresse s'intitule &lt;code&gt;authentication&lt;/code&gt; (vers la ligne 23). Elle contient les informations d'authentification pour les clients qui se connectent en tant que source (&lt;code&gt;source-password&lt;/code&gt;), les serveurs qui se connectent en tant que slave (&lt;code&gt;relay-password&lt;/code&gt;, en fait je ne suis pas sur à 100%, c'est une déduction) et pour l'interface d'administration (&lt;code&gt;admin-user&lt;/code&gt; et &lt;code&gt;admin-password&lt;/code&gt;). Une fois ces informations modifiées, direction la directive &lt;code&gt;hostname&lt;/code&gt;, qu'on remplira avec au choix, le nom de la machine, son ip, etc. J'ai personellement mis l'ip privée de ma machine (&lt;code&gt;172.16.x.y&lt;/code&gt;), pour que ça correspondent à la prochaine directive qui nous interresse: &lt;code&gt;listen-socket&lt;/code&gt;. Ici on définit le port et l'ip sur laquelle icecast va écouter. En gros, si vous spécifier &lt;code&gt;127.0.0.1&lt;/code&gt;, votre serveur de streaming ne sera accessible qu'en local. On y met donc en général la même chose que dans &lt;code&gt;hostname&lt;/code&gt; (&lt;code&gt;172.16.x.y&lt;/code&gt; par exemple), avec un port qui va bien, libre de préférence (&lt;code&gt;8000&lt;/code&gt; par défaut).&lt;/p&gt;


&lt;p&gt;Maintenant on passe a la partie qui nous interresse vraiment, la section &lt;code&gt;relay&lt;/code&gt;. Rien de bien compliqué ici. Le stream que je souhaite relayer se trouve là: http://64.62.253.223:8060/, or icecast nous demande un &lt;code&gt;server&lt;/code&gt;, un &lt;code&gt;port&lt;/code&gt;, un &lt;em&gt;point de montage&lt;/em&gt; (&lt;code&gt;mount&lt;/code&gt;) et un &lt;em&gt;point de montage local&lt;/em&gt; (&lt;code&gt;local-mount&lt;/code&gt;). Vous avez déjà compris qu'on arrive a cette configuration:&lt;/p&gt;


&lt;pre&gt;   &amp;lt;relay&amp;gt;
       &amp;lt;server&amp;gt;64.62.253.223&amp;lt;/server&amp;gt;
       &amp;lt;port&amp;gt;8060&amp;lt;/port&amp;gt;
       &amp;lt;mount&amp;gt;/&amp;lt;/mount&amp;gt;
       &amp;lt;local-mount&amp;gt;/1.fm&amp;lt;/local-mount&amp;gt;
       &amp;lt;on-demand&amp;gt;0&amp;lt;/on-demand&amp;gt;
       &amp;lt;relay-shoutcast-metadata&amp;gt;1&amp;lt;/relay-shoutcast-metadata&amp;gt;
   &amp;lt;/relay&amp;gt;&lt;/pre&gt;


&lt;p&gt;Ainsi parés, il ne nous reste plus qu'a lancer modifier la directive &lt;code&gt;ENABLED=false&lt;/code&gt; en &lt;code&gt;ENABLED=true&lt;/code&gt; dans &lt;code&gt;/etc/default/icecast2&lt;/code&gt; et à lancer icecast:&lt;/p&gt;


&lt;pre&gt;sudo /etc/init.d/icecast2 start&lt;/pre&gt;


&lt;p&gt;Si vous avez bien tout fait, vous devriez pouvoir streamer depuis &lt;code&gt;http://172.16.x.y:8000/1.fm&lt;/code&gt;, et vos collègues également ! Vous pouvez avoir une vue d'ensemble du serveur ainsi que quelques options d'administration en vous rendant sur l'interface d'admin: http://172.16.x.y:8000/ et en utilisant &lt;code&gt;admin-user&lt;/code&gt; et &lt;code&gt;admin-password&lt;/code&gt; pour vous authentifier.&lt;/p&gt;


&lt;p&gt;A cela on peut ajouter un petit &lt;code&gt;streamripper&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;streamripper http://172.16.x.y:8000/1.fm -d ~/streamripped&lt;/pre&gt;


&lt;p&gt;Pour enregistrer. En parlant de streamripper, j'avais tenté au début de relayer avec &lt;code&gt;streamripper -r&lt;/code&gt;, mais malgrès les apparences du &lt;code&gt;netstat -pl&lt;/code&gt; (&lt;code&gt;*:8000 LISTEN&lt;/code&gt;), il ne bind qu'en local, donc impossible d'en faire profiter les collègues :-)&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/10/20/Relayer-un-stream-audio-avec-icecast2#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/10/20/Relayer-un-stream-audio-avec-icecast2#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/692</wfw:commentRss>
      </item>
    
  <item>
    <title>Un forum qu'il est bien: Invision Power Board</title>
    <link>http://mirmodynamics.com/post/2006/10/20/Un-forum-quil-est-bien%3A-Invision-Power-Board</link>
    <guid isPermaLink="false">urn:md5:2749882577f14d005c5bea0531e5a0f6</guid>
    <pubDate>Fri, 20 Oct 2006 14:13:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Geekeries</category>
        <category>clichés</category><category>configuration</category><category>php</category><category>way of life</category><category>work</category>    
    <description>    &lt;p&gt;Alors au taf on va déployer des forums sur l'ensemble des sites du groupe, et donc après un rapide tour des forums disponibles (tant libres que commerciaux), on a choisi &lt;a href=&quot;http://www.invisionpower.com/&quot;&gt;Invision Power Board&lt;/a&gt;. Après une matinée de trifouillage, j'ai l'intime conviction que nous avons fait le bon choix. En effet, avec Invision Power Board, on peut mettre en place un &lt;acronym&gt;SSO&lt;/acronym&gt; en moins d'une heure tout en&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;buvant son café&lt;/li&gt;
&lt;li&gt;lisant ses &lt;acronym&gt;RSS&lt;/acronym&gt;&lt;/li&gt;
&lt;li&gt;discutant avec son chef&lt;/li&gt;
&lt;li&gt;glandant sur &lt;acronym&gt;IRC&lt;/acronym&gt;&lt;/li&gt;
&lt;li&gt;rigolant avec les collègues&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Et ça, c'est pas avec des forums libres que c'est possible.&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/10/20/Un-forum-quil-est-bien%3A-Invision-Power-Board#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/10/20/Un-forum-quil-est-bien%3A-Invision-Power-Board#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/690</wfw:commentRss>
      </item>
    
  <item>
    <title>Gestion de la configuration: Zend_Config</title>
    <link>http://mirmodynamics.com/post/2006/08/30/Gestion-de-la-configuration%3A-Zend_Config</link>
    <guid isPermaLink="false">urn:md5:99872ef7ee75ca14d379b3a9d56bbd7d</guid>
    <pubDate>Mon, 04 Sep 2006 22:57:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>configuration</category><category>ini</category><category>zend framework</category>    
    <description>    &lt;p&gt;Il existe au bas mot autant de manières de gérer la configuration d'une application qu'il y a de développeurs: fichier &lt;acronym&gt;INI&lt;/acronym&gt;, variables, constantes, fichier &lt;acronym&gt;XML&lt;/acronym&gt;, etc. Le composant &lt;code&gt;Zend_Config&lt;/code&gt; développé par &lt;a href=&quot;http://www.akrabat.com/&quot;&gt;Rob Allen&lt;/a&gt; propose une approche simple et élégante basée sur un fichier &lt;acronym&gt;INI&lt;/acronym&gt; qui permet de mettre en place aisément plusieurs environnements de configuration. Commençons par rappeler qu'un fichier &lt;code&gt;INI&lt;/code&gt; s'écrit le plus simplement du monde en associant un nom de variable (composante gauche) à une valeur (composante droite) en leur interposant un signe d'égalité:&lt;/p&gt;


&lt;pre&gt;name = value&lt;/pre&gt;


&lt;p&gt;On peut également y ajouter des sections, qui permettent de structurer le fichier:&lt;/p&gt;


&lt;pre&gt;[database]
hostname = localhost
username = unprivilegieduser
password = someobscurepassword
database = mydatabase&lt;/pre&gt;


&lt;p&gt;Venons en au vif du sujet, l'utilisation proprement dite du sus-cité composant. N'y allons pas par quatre chemins, balançons directement un petit bout de code:&lt;/p&gt;


&lt;pre&gt;Zend::loadClass('Zend_Config');
Zend::loadClass('Zend_Config_Ini');

$config = new Zend_Config(Zend_Config_Ini::load('mon/fichier/ini', 'section'));&lt;/pre&gt;


&lt;p&gt;Rien de bien compliqué, on indique a &lt;code&gt;Zend_Config_Ini&lt;/code&gt; un fichier &lt;acronym&gt;INI&lt;/acronym&gt; à charger, et plus précisément quelle section de ce fichier nous interresse, puis il transmet les informations &lt;em&gt;qui vont bien&lt;/em&gt; à &lt;code&gt;Zend_Config&lt;/code&gt;, qui s'occupe de nous créer un bel objet de configuration.  L'objet &lt;code&gt;$config&lt;/code&gt; contient dès lors les valeurs du fichier &lt;acronym&gt;INI&lt;/acronym&gt; comme autant de variables membres. Par exemple, si on utilise le fichier &lt;acronym&gt;INI&lt;/acronym&gt; détaillé plus haut, on pourrait faire:&lt;/p&gt;


&lt;pre&gt;echo $config-&amp;gt;username;&lt;/pre&gt;


&lt;p&gt;Ce qui afficherai &lt;code&gt;unprivilegieduser&lt;/code&gt;. Simple non ? Simple, mais ne nous leurrons pas, ce n'est pas là l'usage que l'on fera de ce composant. En effet, quoi de plus rébarbatif que de devoir charger chaque section d'un fichier &lt;acronym&gt;INI&lt;/acronym&gt; ? La vraie puissance de ce système réside dans le fait qu'il permet d'avoir des &lt;em&gt;environnement de configuration&lt;/em&gt; séparés. Remanions légèrement notre fichier de configuration:&lt;/p&gt;


&lt;pre&gt;; Developement environement configuration
[dev]
db.hostname = localhost
db.username = unprivilegieduser
db.password = someobscurepassword
db.database = mydatabase

; Production configuration
[prod]
db.hostname = db.monsite.fr
db.username = someobscureuser
db.password = somereallyobscurepassword
db.database = mydatabase&lt;/pre&gt;


&lt;p&gt;Comme &lt;code&gt;Zend_Config_Ini&lt;/code&gt; fait bien les choses, il analysera chaque nom de variable pour créer une arborescence d'objets en utilisant le &lt;code&gt;.&lt;/code&gt; (point) comme séparateur. On aura ainsi:&lt;/p&gt;


&lt;pre&gt;$config = new Zend_Config(Zend_Config_Ini::load('./example.ini', 'dev'));
echo $config-&amp;gt;db-&amp;gt;username;&lt;/pre&gt;


&lt;p&gt;Il ne reste plus qu'a déterminer une manière de savoir quand on se trouve dans l'environnement de production ou dans celui de développement, il existe quelques méthodes pour cela:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un fichier &lt;code&gt;.htaccess&lt;/code&gt; avec une directive &lt;code&gt;SetEnv DEV 1&lt;/code&gt;, qui donnera la variable &lt;code&gt;$_ENV['DEV']&lt;/code&gt; dans le script&lt;/li&gt;
&lt;li&gt;un test sur l'&lt;acronym&gt;IP&lt;/acronym&gt; du serveur (&lt;acronym&gt;IP&lt;/acronym&gt; locale, serveur de développement, &lt;acronym&gt;IP&lt;/acronym&gt; publique pour le serveur de production)&lt;/li&gt;
&lt;li&gt;un test sur la variable &lt;code&gt;$_SERVER['HTTP_HOST']&lt;/code&gt; (&lt;code&gt;dev.monsite.fr&lt;/code&gt;, etc)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A titre personnel, j'utilise la solution du &lt;code&gt;.htaccess&lt;/code&gt;, qui peut s'implémenter comme ça:&lt;/p&gt;


&lt;pre&gt;$section = isset($_ENV['DEV']) ? 'dev' : 'prod';
$config = new Zend_Config(Zend_Config_Ini::load('./example.ini', $section));&lt;/pre&gt;


&lt;p&gt;On peut bien entendu enregistrer notre instance de &lt;code&gt;$config&lt;/code&gt; dans le &lt;code&gt;Zend_Registry&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;Zend::register('config', $config);&lt;/pre&gt;


&lt;p&gt;Ce qui nous permettra d'y avoir accès en toute simplicité par la suite:&lt;/p&gt;


&lt;pre&gt;$config = Zend::registry('config');&lt;/pre&gt;


&lt;p&gt;(Commentaires et Trackbacks sur &lt;a href=&quot;http://phpmafia.net/zend/post/2006/09/04/Gestion-de-la-configuration&quot;&gt;PHP Mafia&lt;/a&gt;)&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>