<?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 - librairie</title>
  <link>http://mirmodynamics.com/</link>
  <atom:link href="http://mirmodynamics.com/feed/tag/librairie/rss2" rel="self" type="application/rss+xml"/>
  <description>Rien de grand ne se fit jamais sans enthousiasme.</description>
  <language>en</language>
  <pubDate>Wed, 03 Dec 2008 17:01:33 +0100</pubDate>
  <copyright>2003-2008 &amp;copy; Geoffrey Bachelet</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Incubated</title>
    <link>http://mirmodynamics.com/post/2006/11/01/Incubated</link>
    <guid isPermaLink="false">urn:md5:7a9cdfbfea0dc5e4f1cc96795fdb0db3</guid>
    <pubDate>Wed, 01 Nov 2006 16:10:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Geekeries</category>
        <category>bonnes pratiques</category><category>doc</category><category>google</category><category>librairie</category><category>microformats</category><category>optimisation</category><category>organisation</category><category>php</category><category>sso</category><category>svn</category><category>sécurité</category><category>ubuntu</category><category>unit testing</category><category>unix</category><category>way of life</category>    
    <description>&lt;p&gt;Les liens interressants (ou pas) de la semaine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://microformats.org/&quot; title=&quot;http://microformats.org/&quot;&gt;http://microformats.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.georss.org/&quot; title=&quot;http://www.georss.org/&quot;&gt;http://www.georss.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.thinkvitamin.com/features/ajax/create-a-searchable-google-map&quot; title=&quot;http://www.thinkvitamin.com/features/ajax/create-a-searchable-google-map&quot;&gt;http://www.thinkvitamin.com/feature...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://features.launchpad.net/distros/ubuntu/+specs&quot; title=&quot;https://features.launchpad.net/distros/ubuntu/+specs&quot;&gt;https://features.launchpad.net/dist...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://iwantmyopenid.org/bounty&quot; title=&quot;http://iwantmyopenid.org/bounty&quot;&gt;http://iwantmyopenid.org/bounty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://devzone.zend.com/node/view/id/1113&quot; title=&quot;http://devzone.zend.com/node/view/id/1113&quot;&gt;http://devzone.zend.com/node/view/i...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://weierophinney.net/matthew/uploads/php_development_best_practices.pdf&quot; title=&quot;http://weierophinney.net/matthew/uploads/php_development_best_practices.pdf&quot;&gt;http://weierophinney.net/matthew/up...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;    &lt;p&gt;J'ai pas mal entendu parler des microformats ces derniers temps, sans vraiment prendre le temps de me pencher dessus. &lt;a href=&quot;http://www.microformats.org/&quot;&gt;microformats.org&lt;/a&gt; présente l'occasion de se plonger dedans et de comprendre que finalement, les microformats peuvent être un facteur de développement non négligeable pour un site ou une application web. &lt;a href=&quot;http://www.georss.org/&quot;&gt;GeoRSS&lt;/a&gt; de son côté propose une implémentation &lt;em&gt;simple&lt;/em&gt; et &lt;em&gt;puissante&lt;/em&gt; (c'est eux qui le disent) du &lt;a href=&quot;http://en.wikipedia.org/wiki/Geotagging&quot;&gt;Geotagging&lt;/a&gt;. A voir si on ne peut pas coupler tout ça avec quelques pirouettes sur &lt;a href=&quot;http://mirmodynamics.com/post/2006/11/01/&quot;&gt;Google Maps&lt;/a&gt;...&lt;/p&gt;


&lt;p&gt;Pendant ce temps, chez Canonical, on établit déjà les &lt;a href=&quot;https://features.launchpad.net/distros/ubuntu/+specs&quot;&gt;specifications fonctionnelles de Feisty Fawn&lt;/a&gt;, et c'est assez prometteur :-)&lt;/p&gt;


&lt;p&gt;Enfin, dans le petit monde du &lt;acronym&gt;PHP&lt;/acronym&gt; et du webdev en général, il n'est jamais trop tard pour souligner l'existence de protocoles d'authentification centralisée libres comme &lt;a href=&quot;http://openid.net/&quot;&gt;OpenID&lt;/a&gt;, qui de plus à lancé un &lt;em&gt;concours&lt;/em&gt; d'implémentation sous forme de &lt;a href=&quot;http://iwantmyopenid.org/bounty&quot;&gt;bounties&lt;/a&gt; ! On notera également les débuts de &lt;a href=&quot;http://devzone.zend.com/node/view/id/1113&quot;&gt;l'extension d' input filtering pour PHP&lt;/a&gt;, qui promet de simplifier grandement la validation de données externes dans les applis &lt;acronym&gt;PHP&lt;/acronym&gt;. Enfin, &lt;a href=&quot;http://weierophinney.net/matthew/uploads/php_development_best_practices.pdf&quot;&gt;les slides de la conférences PHP Best Practices&lt;/a&gt; qui a eu lieu à la ZendCon, c'est vraiment rempli de bons conseils.&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/11/01/Incubated#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/11/01/Incubated#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/711</wfw:commentRss>
      </item>
    
  <item>
    <title>Bootstrap CLI</title>
    <link>http://mirmodynamics.com/post/2006/10/13/Bootstrap-CLI</link>
    <guid isPermaLink="false">urn:md5:1e9ff0bf3342af30f0bcc1b219d7f60a</guid>
    <pubDate>Fri, 13 Oct 2006 18:31:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>arborescence</category><category>bootstrap</category><category>CLI</category><category>howto</category><category>librairie</category><category>organisation</category><category>surclassage</category><category>zend framework</category>    
    <description>&lt;p&gt;Nous avons parcouru dernièrement la création du bootstrap &lt;acronym&gt;HTTP&lt;/acronym&gt; qui sert de socle à une application utilisant le Zend Framework. Le même principe peut s'appliquer aux scripts &lt;acronym&gt;CLI&lt;/acronym&gt;, mais comme les besoins sont fondamentalements différents, l'implémentation sera elle aussi complètement différente. Nous viserons les objectifs suivants:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ne pas être obligé d'executer le bootstrap en ligne de commande&lt;/li&gt;
&lt;li&gt;Simplifier au maximum l'écriture ultérieure des scripts &lt;acronym&gt;CLI&lt;/acronym&gt;&lt;/li&gt;
&lt;li&gt;Définir un jeu d'options de ligne de commande obligatoire&lt;/li&gt;
&lt;li&gt;Mettre en place un environnement d'execution&lt;/li&gt;
&lt;/ol&gt;    &lt;p&gt;La tentation serait de créer un système qui obligerait ce genre de commandes:&lt;/p&gt;


&lt;pre&gt;$ php batch/bootstrap.php monscript&lt;/pre&gt;


&lt;p&gt;Pour executer, par exemple, le script &lt;code&gt;batch/monscript.php&lt;/code&gt;. Cela simplifierait grandement les choses, mais c'est moche, et puis on peut faire autrement, donc on ne va pas se priver ! Nous utiliserons a cette fin la fonction magique &lt;code&gt;register_shutdown_function&lt;/code&gt;, qui s'occupera d'appeler une fonction qui executera les scripts &lt;em&gt;ad hoc&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;Avant d'aller plus loin, l'arborescence de fichiers que nous allons utiliser:&lt;/p&gt;


&lt;pre&gt;batch/
	monscript.php
	runtime.php
library/
	Zend.php
	My/
		Batch.php&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;runtime.php&lt;/code&gt; sera le fichier à inclure dans chaque script, tandis que &lt;code&gt;My/Batch.php&lt;/code&gt; contiendra la classe d'abstraction &lt;code&gt;My_Batch&lt;/code&gt;, qui définira les comportements par défaut de nos scripts.&lt;/p&gt;


&lt;p&gt;Voici donc la première partie de notre bootstrap, &lt;code&gt;batch/runtime.php&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;ini_set('include_path', get_include_path().PATH_SEPARATOR.realpath(dirname(__FILE__).'/../library/'));

require_once 'Zend.php';
require_once 'My/Batch.php';

register_shutdown_function(array('My_Batch', 'runAll'));&lt;/pre&gt;


&lt;p&gt;Bien sur, cette méthode nous oblige à définir un format à respecter pour les fonctions à executer par la suite, nous partirons donc sur les bases suivantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chaque batch doit être constitué d'une classe dont le nom commence par &lt;code&gt;My_Batch_&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Chaque batch doit posséder une méthode executable &lt;code&gt;run&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce qui nous donne donc:&lt;/p&gt;


&lt;pre&gt;abstract class My_Batch {
	static public function runAll() {
		$classes = get_declared_classes();
		foreach($classes as $className) {
			if (preg_match('/^My_Batch_(.+)$/', $className, $matches) &amp;amp;&amp;amp; method_exists($className, 'run')) {
				try {
					$batch = new $className;
					$batch-&amp;gt;run();
				} catch (Exception $e) {
					die(sprintf(&amp;quot;%s: %s\n&amp;quot;, $matches[1], $e-&amp;gt;getMessage()));
				}
			}
		}
	}
	
	abstract public function run();
}&lt;/pre&gt;


&lt;p&gt;On en profite pour catcher toute Exception indésirable pour la transformer en un &lt;code&gt;die&lt;/code&gt;, bien plus lisible dans un terminal qu'une backtrace :-)&lt;/p&gt;


&lt;p&gt;Maintenant que nous avons résolu les points 1 et 2, attaquons nous à la suite. Le problème principal que j'ai rencontré lors de l'établissement d'un environnement d'execution, c'est que la gestion de la configuration repose en grande partie sur la valeur de &lt;code&gt;$_SERVER['HTTP_HOST']&lt;/code&gt;, qui n'est bien évidemment pas disponible en &lt;acronym&gt;CLI&lt;/acronym&gt; :-) Il me faut donc forcer le passage en argument du nom de la configuration à utiliser. C'est très simple à faire, grace a la méthode que nous avons employé: il suffit de vérifier la présence de cet argument dans le constructeur de &lt;code&gt;My_Batch&lt;/code&gt; :-)&lt;/p&gt;


&lt;pre&gt;public function __construct() {
	foreach($GLOBALS['argv'] as $i =&amp;gt; $arg) {
		switch ($arg) {
			case '--configname':
			case '-c':
				$this-&amp;gt;_args['configname'] = $GLOBALS['argv'][$i+1];
			break;
		}
	}
	if (!isset($this-&amp;gt;_args['configname'])) {
		throw new Exception('-c or --configname is mandatory');
	}
}&lt;/pre&gt;


&lt;p&gt;Voilà, le gros du travail est fait. Pour le reste, c'est la routine, mise en place d'un environnement avec &lt;code&gt;Zend_Config&lt;/code&gt; et &lt;code&gt;Zend_Db&lt;/code&gt;, a la suite dans le constructeur:&lt;/p&gt;


&lt;pre&gt;	$this-&amp;gt;_config = new Zend_Config(
		Zend_Config_Ini::load(
			dirname(__FILE__).'/../../app/config.ini',
			$this-&amp;gt;_args['configname']
		)
	);
	
	$this-&amp;gt;_db = Zend_Db::factory(
		$this-&amp;gt;_config-&amp;gt;db-&amp;gt;adapter,
		$this-&amp;gt;_config-&amp;gt;db-&amp;gt;config-&amp;gt;asArray()
	);
	
	Zend_Db_Table::setDefaultAdapter($this-&amp;gt;_db);&lt;/pre&gt;


&lt;p&gt;Enfin, voila un exemple de script utilisant ce bootstrap:&lt;/p&gt;


&lt;pre&gt;require_once 'path/to/runtime.php';

class My_Batch_MonScript extends My_Batch {
	public function run() {
		// le code ici
	}
}&lt;/pre&gt;


&lt;p&gt;And voila !&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/10/13/Bootstrap-CLI#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/10/13/Bootstrap-CLI#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/666</wfw:commentRss>
      </item>
    
  <item>
    <title>Intégrer une librairie tierce</title>
    <link>http://mirmodynamics.com/post/2006/09/06/Integrer-une-librairie-tierce</link>
    <guid isPermaLink="false">urn:md5:b7c80f8c23ebbc4e829967932241ecde</guid>
    <pubDate>Wed, 06 Sep 2006 23:21:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>librairie</category><category>organisation</category><category>phpmailer</category><category>tiers</category><category>zend framework</category>    
    <description>&lt;p&gt;Il arrive forcément un moment dans un projet où le besoin de fonctionnalités avancées dans un domaine particulier (mail, réseau, etc) se fait sentir. En général, l'utilisation d'une librairie tierce s'avère nécessaire et pose quelques légers et irritants problèmes, particulièrement au niveau de la convention de nommage des classes et de l'arborescence des répertoires qui devient rapidement bordélique. Nos objectifs seront donc:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utiliser une librairie tierce&lt;/li&gt;
&lt;li&gt;Respecter la convention de nommage Zend&lt;/li&gt;
&lt;li&gt;Avoir un arborescence propre&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ça tombe bien, c'est très simple à réaliser :-)&lt;/p&gt;    &lt;p&gt;Pour ce faire, il convient de prendre nos objectifs à rebours, commençons donc par l'arborescence. Nous allons classer nos librairies par site, ce qui est une méthode assez courante. Admettons que vous ayez une arborescence de base (plus de précisions sur l'arboresence basique dans un prochain article):&lt;/p&gt;


&lt;pre&gt;app/
library/
	Zend/
	Zend.php
www/&lt;/pre&gt;


&lt;p&gt;Nous allons stocker nos librairies dans &lt;code&gt;library/ext/&lt;/code&gt;, comme &lt;strong&gt;ext&lt;/strong&gt;erne, et en fonction du domaine où on peut les trouver. Prenons le cas de l'excellent &lt;code&gt;PHPMailer&lt;/code&gt;, qui est hébergé sur http://phpmailer.sourceforge.net/. Nous stockerons cette librairie dans &lt;code&gt;library/ext/net/sourceforge/phpmailer/&lt;/code&gt;, ce qui résoud la problèmatique de l'arborescence.&lt;/p&gt;


&lt;p&gt;Pour attaquer la 2ème problèmatique (convention de nommage), nous allons créer un nouveau répertoire dans &lt;code&gt;library&lt;/code&gt; qui contiendra nos extensions au framework. Ce répertoire nous sera très utile par la suite. Nous l'appellerons ici &lt;code&gt;Extensions&lt;/code&gt;, mais cela peut-être n'importe quel nom qui peut vous sembler approprié, &lt;code&gt;Monappli&lt;/code&gt; par exemple. Une fois ce répertoire créé, nous pouvons passer aux choses sérieuses, et créer notre classe &lt;code&gt;Extensions_Mailer&lt;/code&gt; dans &lt;code&gt;library/Extensions/Mailer.php&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;require_once dirname(__FILE__).'/../ext/net/sourceforge/phpmailer/class.phpmailer.php';

class Extensions_Mailer extends PHPMailer {

}&lt;/pre&gt;


&lt;p&gt;Et voilà, tous nos problèmes sont résolus. Notre classe est désormais reconnue par &lt;code&gt;Zend::loadClass&lt;/code&gt;, ce qui finalement était bien le but de l'opération:&lt;/p&gt;


&lt;pre&gt;Zend::loadClass('Extensions_Mailer');
$mailer = new Extensions_Mailer;&lt;/pre&gt;


&lt;p&gt;L'objet &lt;code&gt;$mailer&lt;/code&gt; est donc une instance de &lt;code&gt;Extensions_Mailer&lt;/code&gt;, qui n'est finalement que la classe &lt;code&gt;PHPMailer&lt;/code&gt; renommée ! Cela permet également au passage de surclasser &lt;code&gt;PHPMailer&lt;/code&gt; pour y ajouter nos propres fonctions.&lt;/p&gt;</description>
    
    
    
          <comments>http://mirmodynamics.com/post/2006/09/06/Integrer-une-librairie-tierce#comment-form</comments>
      <wfw:comment>http://mirmodynamics.com/post/2006/09/06/Integrer-une-librairie-tierce#comment-form</wfw:comment>
      <wfw:commentRss>http://mirmodynamics.com/feed/atom/comments/593</wfw:commentRss>
      </item>
    
</channel>
</rss>