<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>La Case de l&#039;Oncle Tom &#187; php</title>
	<atom:link href="http://case.oncle-tom.net/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://case.oncle-tom.net</link>
	<description>Développement Web, bonnes pratiques et performances</description>
	<lastBuildDate>Sun, 25 Dec 2011 19:33:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="search"
           href="http://case.oncle-tom.net/opensearch"
           type="application/opensearchdescription+xml"
           title="Content Search" />		<item>
		<title>Créer une vignette d&#8217;un PDF avec Image Magick</title>
		<link>http://case.oncle-tom.net/2009/thumbnail-pdf-image-magick/</link>
		<comments>http://case.oncle-tom.net/2009/thumbnail-pdf-image-magick/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 05:00:24 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[image magick]]></category>
		<category><![CDATA[imagick]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1374</guid>
		<description><![CDATA[Les PDF c&#8217;est chouette pour transmettre des documents non-modifiables. Mais parfois, c&#8217;est aussi pratique de pouvoir en suggérer leur contenu. C&#8217;est d&#8217;autant plus pertinent si vous en proposez à télécharger et que la couverture alléchante dispose d&#8217;un fort pouvoir de conviction. Par chance, nous n&#8217;avons pas besoin de faire le sale travail à la main. [...]]]></description>
			<content:encoded><![CDATA[<p>Les <acronym title="Portable Document Format">PDF</acronym> c&#8217;est chouette pour transmettre des documents non-modifiables. Mais parfois, c&#8217;est aussi pratique de pouvoir en suggérer leur contenu. C&#8217;est d&#8217;autant plus pertinent si vous en proposez à télécharger et que la couverture alléchante dispose d&#8217;un fort pouvoir de conviction.</p>
<img class="size-full wp-image-1376" title="Exemple de couverture PDF" src="http://case.oncle-tom.net/images/2009/06/pdf-sample-cover.png" alt="Exemple de couverture PDF" width="281" height="374" />
<p>Par chance, nous n&#8217;avons pas besoin de faire le sale travail à la main. Du genre prendre une capture d&#8217;écran de la première page du <acronym title="Portable Document Format">PDF</acronym> ou je ne sais quelle autre astuce impliquant travail et effort. <strong>Image Magick</strong> est là pour nous aider et à plus forte raison, <strong>Imagick</strong>. Il s&#8217;agit d&#8217;une librairie native à <acronym title="Pre-Hypertext Processing">PHP</acronym> se basant sur l&#8217;<acronym title="Application Programming Interface">API</acronym> d&#8217;Image Magick.</p>
<p>Vous me direz : oui mais Image Magick c&#8217;est fait pour manipuler des images. Certes mais <em>un <acronym title="Portable Document Format">PDF</acronym>, c&#8217;est un peu comme une image</em>.</p>
<p><span id="more-1374"></span></p>
<h3>Convertir un <acronym title="Portable Document Format">PDF</acronym> mono-page</h3>
<p>Partons d&#8217;un cas simple : votre <acronym title="Portable Document Format">PDF</acronym> ne contient qu&#8217;une page. Le code est d&#8217;une grande simplicité :</p>
<pre><code class="php">&lt;?php
$im = new Imagick('/chemin/vers/pdf-mono-page.pdf');
$im-&gt;writeImage('/chemin/vers/couverture.png');</code></pre>
<p>2 lignes ont suffit à créer notre prévisualisation. Cette manipulation enregistre une image au format <acronym title="Portable Network Graphics">PNG</acronym> sans aucune compression. Nous pourrions l&#8217;activer et régler le taux de compression avec 2 lignes supplémentaires :</p>
<pre><code class="php">$im-&gt;setCompression(Imagick::COMPRESSION_LZW);
$im-&gt;setCompressionQuality(90);</code></pre>
<p>LZW est un algorithme de compression sans perte utilisé entre autre par <acronym title="Portable Network Graphics">PNG</acronym> et <acronym title="Graphics Interchange Format">GIF</acronym>. On aurait pu choisir du <acronym title="Joint Photographics Experts Group">JPEG</acronym> sans perte ou une autre <a href="http://fr.php.net/manual/en/imagick.constants.php">constante de compression d&#8217;Image Magick</a>.</p>
<h3>Convertir un <acronym title="Portable Document Format">PDF</acronym> multi-pages</h3>
<p>Que se passerait-il si notre code précédent était utilisé sur un <acronym title="Portable Document Format">PDF</acronym> contenant plus d&#8217;une page ? Et bien seule la dernière page du document serait enregistrée. En fait, toutes les pages seraient enregistrées jusqu&#8217;à la dernière (pas terrible côté performances donc).<br />
L&#8217;<acronym title="Application Programming Interface">API</acronym> d&#8217;Image Magick nous permet toutefois de connaître le nombre d&#8217;images impliquées et d&#8217;en définir l&#8217;index. Depuis PHP5, Imagick fournit des méthodes propres aux interfaces Iterator et Traversable.</p>
<p>Notre code bouge &#8230; mais pas tant que ça. Disons que nous souhaitons prévisualiser la 6ème page du document (donc l&#8217;index 5) :</p>
<pre><code class="php">$im = new Imagick('/chemin/vers/pdf-multi-pages.pdf');
$im-&gt;setIteratorIndex(5);
$im-&gt;setCompression(Imagick::COMPRESSION_LZW);
$im-&gt;setCompressionQuality(90);
$im-&gt;writeImage('/chemin/vers/couverture.png');</code></pre>
<p>Une petite ligne de plus fait l&#8217;affaire. Pour compter le nombre d&#8217;images contenues dans le document ouvert, un appel à la méthode getNumberImages fera l&#8217;affaire.</p>
<h3>Convertir directement avec Image Magick : convert</h3>
<p>Pour les amateurs du shell ou les détracteurs de <acronym title="Pre-Hypertext Processing">PHP</acronym>, on peut arriver aux mêmes résultats en 1 ligne de commande. L&#8217;outil de conversion est fourni par <a href="http://www.imagemagick.org/script/convert.php">convert</a>. Sa documentation et ses options sont particulièrement riches. On peut tout faire &#8230; ou presque !</p>
<pre><code class="bash">convert /chemin/vers/pdf-mono-page.pdf /chemin/vers/couverture.png
convert /chemin/vers/pdf-multi-pages.pdf[5] /chemin/vers/couverture.png</code></pre>
<p>La seule différence réside dans les crochets suivant le nom du fichier d&#8217;entrée. Vous avez bien sûr deviné qu&#8217;il s&#8217;agit de l&#8217;index du document <acronym title="Portable Document Format">PDF</acronym> que l&#8217;on convertit. Si on ne précise rien, <strong>convert</strong> convertira toutes les pages du document mais cette fois, en les exportant dans des fichiers uniques (pas de réécriture qui tienne).</p>
<h3>Conclusion</h3>
<p><strong>Image Magick est vraiment une application sympathique</strong>. Les possibilités de manipulation offertes surpassent à mes yeux largement celles de la librairie GD (qui est toujours mieux que rien).</p>
<p>Cette manipulation permettrait aussi de décomposer les multiples images composant un <acronym title="Graphics Interchange Format">GIF</acronym> animé ou un APNG. Ou inversement, nous pourrions créer une animation à partir de plusieurs images. Ou encore créer une vignette carrée et centrée. Les possibilités ne manquent pas.</p>
<p>C&#8217;était également une autre façon de <em>teaser</em> le projet le plus chronophage qui m&#8217;ait été donné de connaître mais bon, en septembre c&#8217;est dans les bacs. Toujours pas d&#8217;idées sur le sujet couvert ? <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2009/thumbnail-pdf-image-magick/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>WordPress en tant que dépendance SVN</title>
		<link>http://case.oncle-tom.net/2008/wordpress-svn-external/</link>
		<comments>http://case.oncle-tom.net/2008/wordpress-svn-external/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 06:00:59 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[bonne pratique]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[codex]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[wordpress mu]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1237</guid>
		<description><![CDATA[Mettre à jour WordPress était pénible jusqu&#8217;à l&#8217;arrivée de la version 2.7. On bénéficie désormais de la mise à jour automatique : un clic, ça télécharge et ça déploie. Il existe cependant une méthode alternative reposant sur Subversion (SVN). C&#8217;est la méthode idéale pour tout développeur WordPress ou gestionnaire de blogs. C&#8217;est celle que j&#8217;emploie [...]]]></description>
			<content:encoded><![CDATA[<p>Mettre à jour WordPress était pénible jusqu&#8217;à l&#8217;arrivée de la version 2.7. On bénéficie désormais de la mise à jour automatique : un clic, ça télécharge et ça déploie.</p>
<p><img class="aligncenter size-full wp-image-912" title="Logo WordPress" src="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png" alt="" width="273" height="66" /></p>
<p>Il existe cependant une <strong>méthode alternative reposant sur Subversion</strong> (<acronym title="Subversion">SVN</acronym>). C&#8217;est la méthode idéale pour tout développeur WordPress ou gestionnaire de blogs. C&#8217;est celle que j&#8217;emploie depuis la version 2.6 grâce notamment à la constante WP_CONTENT.</p>
<p>Explications et application concrète.</p>
<p><span id="more-1237"></span></p>
<p>Avant toute chose, sachez que <strong>ce tutorial est optimisé pour les personnes qui versionnent entièrement leur projet</strong>. Il n&#8217;est pas question ici d&#8217;avoir une arborescence libre et de procéder à des <em>checkout</em> un peu partout. C&#8217;est possible mais pas du plus grand intérêt.</p>
<p>L&#8217;avantage évident ici est de pouvoir déployer son blog n&#8217;importe où en un rien de temps.</p>
<h3>Structure des fichiers</h3>
<p>Installer WordPress en tant que dépendance <acronym title="Subversion">SVN</acronym> revient à mélanger 2 techniques :</p>
<ul>
<li><a href="http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory">Installer WordPress dans son propre répertoire<br />
</a></li>
<li><a href="http://codex.wordpress.org/Installing_WordPress_With_Clean_Subversion_Repositories">Installer WordPress proprement depuis <acronym title="Subversion">SVN</acronym></a></li>
</ul>
<p>Je suis pénible donc je n&#8217;ai pas spécialement envie de modifier un fichier <em>core</em> ou autre chose que <em>wp-config.php</em>. Tout le contraire de ce qu&#8217;indique la première méthode.</p>
<p>La seconde explication m&#8217;a toutefois posé légèrement problème puisqu&#8217;un peu brutale et posant soucis chez OVH.</p>
<img class="size-full wp-image-1254" title="Arborescence fichier avec WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-basic-filetree.png" alt="Arborescence fichier avec WordPress SVN" width="329" height="298" />
<p>Celles et ceux qui voient la capture d&#8217;écran ci-dessus peuvent constater que <em>tout WordPress</em> a été déplacé dans un sous-répertoire <em>wordpress</em> au même niveau que wp-content.<br />
On ne garde à la racine que le fichier <em>.htaccess</em> et <em>wp-config.php</em>.</p>
<p>Sur le répertoire racine, j&#8217;ai appliqué ces propriétés pour WordPress 2.7 :</p>
<ul>
<li><kbd>svn:ignore</kbd> :<kbd><br />
</kbd></p>
<pre><code class="svn">wp-config.php</code></pre>
</li>
<li><kbd>svn:externals</kbd> :<kbd><br />
</kbd></p>
<pre><code class="svn">wordpress http://svn.automattic.com/wordpress/branches/2.7</code></pre>
</li>
</ul>
<p>Je ne versionne volontairement pas le fichier wp-config.php car c&#8217;est le seul fichier susceptible de changer d&#8217;une instance à une autre. Je le récupère depuis wordpress/wp-config-sample.php et je le personnalise selon mes besoins.<br />
Et puis versionner des mots de passe &#8230; qui y tient ?</p>
<h3>Configuration</h3>
<p>Après cette restructuration, on aura toutefois besoin de configurer 2-3 bricoles. Vraiment rien de méchant promis.</p>
<h4>Le .htaccess</h4>
<p>Voici ma configuration. Elle peut être aisément déportée dans votre déclaration de <em>Virtual Host</em> pour des raisons de performance. Sur un serveur mutualisé vous n&#8217;avez en général pas accès à ce dernier type de configuration.</p>
<pre><code>&lt;IfModule mod_rewrite.c&gt;
Options -Multiviews -Indexes +FollowSymlinks
RewriteEngine On
RewriteBase /
# Moving to dependency
RewriteRule ^(index.php|wp-[a-z0-9-]+\.php|xmlrpc.php)?$ wordpress/$1 [L]
RewriteRule ^(wp-admin|wp-includes)/(.*)$ wordpress/$1/$2 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . wordpress/index.php [L]
&lt;/IfModule&gt;
# BEGIN WordPress
# END WordPress</code></pre>
<p>Ce fichier est très inspiré de la <a href="http://codex.wordpress.org/Installing_WordPress_With_Clean_Subversion_Repositories">configuration <acronym title="Subversion">SVN</acronym> proposée sur le Codex WordPress</a>. Seulement voilà, cette renvoie tout sur <em>index.php</em> &#8230; et omet ainsi tous les accès aux fichiers situés à la racine, avec entre autre :</p>
<ul>
<li>wp-cron.php</li>
<li>wp-link-opml.php</li>
<li>wp-trackback.php</li>
<li>xmlrpc.php</li>
</ul>
<p>Je vous fais grâce des contrôleurs de flux (Atom, <acronym title="Really Simple Syndication">RSS</acronym> &amp; cie) et des appels en directs à <em>index.php</em> effectués par certains plugins.</p>
<p>Donc non on ne peut pas vraiment se passer de ces fichiers. D&#8217;où ces 2 règles :</p>
<ul>
<li>
<pre><code>RewriteRule ^(index.php|wp-[a-z0-9-]+\.php|xmlrpc.php)?$ wordpress/$1 [L]
</code></pre>
<p>On capte tous les fichiers <acronym title="Pre-Hypertext Processing">PHP</acronym> (les contrôleurs) originellement situés à la racine de WordPress.</li>
<li>
<pre><code>RewriteRule ^(wp-admin|wp-includes)/(.*)$ wordpress/$1/$2 [QSA,L]</code></pre>
<p>Et là c&#8217;est pour le confort de conserver les adresses initiales &#8230; mais aussi pour éviter de modifier un bout de paramétrage dans l&#8217;admin. Le jour où vous décidez de rebasculer à l&#8217;ancien système, ça se fera sans douleur <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<p>Enfin, pourquoi avoir poussé les commentaires WordPress vers le bas ? Tout simplement pour <strong>éviter que nos règles personnalisées soient écrasées par WordPress</strong> lors d&#8217;une mise à jour des permaliens. Nos règles primeront toujours ainsi.</p>
<h4>Le fichier wp-config.php</h4>
<p>Dans le fichier <em>wp-config.php</em>, nous n&#8217;allons rien modifier. Nous allons juste ajouter forcer 2 paramètres. Ils indiqueront à WordPress où se trouve le véritable répertoire <em>wp-content</em> (renommable mais je ne jouerai pas avec).</p>
<img class="size-full wp-image-1262" title="wp-config.php modifié pour WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-wpconfig.png" alt="wp-config.php modifié pour WordPress SVN" width="600" height="266" />
<h4>Le blog</h4>
<p>Bon j&#8217;ai menti un peu toute à l&#8217;heure en indiquant qu&#8217;on ne toucherait qu&#8217;à <em>wp-config.php</em>. Cependant la modification est on ne peut plus mineure et ne concerne que l&#8217;upload de medias.</p>
<p>En effet si on ne touche pas à l&#8217;emplacement des fichiers envoyés, WordPress considère qu&#8217;ils sont uploadés dans wordpress/wp-content/uploads. C&#8217;est fort gênant mais heureusement, en préfixant le chemin par ../ ou en tapant un chemin absolu tout rentrera dans l&#8217;ordre.</p>
<img class="size-full wp-image-1261" title="Correction de chemin pour WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-file-uploads-fix.png" alt="Correction de chemin pour WordPress SVN" width="600" height="74" />
<p>À noter qu&#8217;il s&#8217;agit du <strong>seul paramétrage hors d&#8217;un fichier</strong>. Si j&#8217;avais pu m&#8217;en passer je l&#8217;aurais fait.</p>
<h3>Dépendance <acronym title="Subversion">SVN</acronym> pour la traduction</h3>
<p>C&#8217;est en tombant sur un autre <a href="http://sunfox.org/blog/2007/05/28/installation-svn-de-wordpress-et-de-ses-plugins/">article traitant de svn:externals pour WordPress</a> que j&#8217;ai été interpelé sur la prise en charge des langues via <acronym title="Subversion">SVN</acronym> également.<br />
Le système n&#8217;est pas parfait puisqu&#8217;on ne peut gérer qu&#8217;une seule langue par ce biais là. Ça ne conviendra donc pas aux blogs multilingues.</p>
<img class="size-full wp-image-1260" title="Dépendance SVN pour les traductions WordPress" src="http://case.oncle-tom.net/images/2008/12/wordpress-i18n-svn-external.png" alt="Dépendance SVN pour les traductions WordPress" width="550" height="104" />
<p>La technique consiste à transformer <code>wp-content/languages</code> en <kbd>svn:externals</kbd>.<br />
Ça donnerait ceci pour la version française de WordPress 2.7, au niveau du <kbd>svn:externals</kbd> du répertoire <code>wp-content</code> :</p>
<pre><code class="svn">languages http://svn.automattic.com/wordpress-<acronym title="internationalisation">i18n</acronym>/fr_FR/branches/2.7/messages/</code></pre>
<p><strong>Simple et efficace</strong> mais ça reste encore de la bricole.</p>
<h3>Cas particulier : plugins et <acronym title="internationalisation">i18n</acronym></h3>
<p>Je vous expose le problème mais malheureusement vous ne pourrez pas y faire grand chose. Par contre ami développeurs, pour rendre votre code de plugin 100% portable, merci de prendre note <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Le chargement des traductions s&#8217;effectue à l&#8217;aide de la fonction load_plugin_textdomain(). Elle prenait seulement 2 paramètres jusqu&#8217;à l&#8217;arrivée de WordPress 2.6. Ça n&#8217;a pas été crié sur les toits mais elle prend désormais 3 &#8230; et c&#8217;est du 3ème argument qu&#8217;il faut utiliser désormais :</p>
<ol>
<li><code class="php">$domain</code> : l&#8217;espace de nom des traduction (inchangé)</li>
<li><code class="php">$abs_rel_path</code> : chemin relatif par rapport à l&#8217;emplacement de WordPress (déprécié, on y mettait <code>PLUGINDIR.'/'.dirname(plugin_basename(__FILE__))</code> en général)</li>
<li><code class="php">$plugin_rel_path</code> :  chemin relatif par rapport à l&#8217;emplacement des plugins (c&#8217;est qui nous intéresse ; <code>dirname(plugin_basename(__FILE__))</code> nous suffira désormais)</li>
</ol>
<p>Vous trouverez un <a href="http://codex.wordpress.org/Writing_a_Plugin#Internationalizing_Your_Plugin">exemple sur le Codex, du côté de l&#8217;internationalisation des plugins</a>.<br />
Un exemple de code pérenne :</p>
<pre><code class="php">load_plugin_textdomain('votreplugin', dirname(plugin_basename(__FILE__)), dirname(plugin_basename(__FILE__)));</code></pre>
<p>Et si jamais vous utilisez votre plugin en lien symbolique ça ne fonctionnera pas &#8230; mais on s&#8217;éloigne du sujet <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Et pour WordPress Mu ?</h3>
<p>Je ne m&#8217;attarderai pas dessus mais les manipulations sont sensiblement les mêmes. Je n&#8217;ai pas encore eu l&#8217;occasion d&#8217;essayer mais j&#8217;ose imaginer qu&#8217;il n&#8217;y a pas tant de différences que ça <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Conclusion</h3>
<p>Le jour où vous souhaitez migrer vers une autre version majeure de WordPress, c&#8217;est simple :<strong> il suffit de changer les externals vers le tag adéquat</strong>.</p>
<p>Pourquoi ne pas utiliser le <em>trunk</em> directement me demanderez-vous ? Le trunk de WordPress est plutôt instable puisque c&#8217;est là que se construit la prochaine version de manière systématique. L&#8217;utilisation des <strong>branches permet de bénéficier des correctifs</strong> sans avoir à modifier le moindre external.<br />
Si vous avez un grand besoin de stabilité, alors utilisez les <em>tags</em> qui sont en principe figés.</p>
<p>On remarquera aussi que malgré son âge, <strong>WordPress commence à peine à proposer des solutions d&#8217;industrialisation</strong>.<br />
Les liens symboliques sont en effet très mal gérés. Tentez d&#8217;utiliser un seul répertoire source pour plusieurs blogs avec des liens symboliques et tout s&#8217;effondre.</p>
<p>La preuve en est aussi avec le <strong>manque de ressources disponibles sur le Web</strong> et traitant ce sujet. Ça m&#8217;étonnerait d&#8217;être le premier à vouloir déployer du WordPress via <acronym title="Subversion">SVN</acronym>.<br />
Les choses s&#8217;améliorent mais pour le côté <cite>code is poetry</cite>, on en est encore loin.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/wordpress-svn-external/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Configuration d&#8217;Apache, MySQL et PHP à base de liens symboliques</title>
		<link>http://case.oncle-tom.net/2008/configuration-apache-mysql-php-symlinks/</link>
		<comments>http://case.oncle-tom.net/2008/configuration-apache-mysql-php-symlinks/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 06:00:50 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apparmor]]></category>
		<category><![CDATA[bonne pratique]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symlink]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1198</guid>
		<description><![CDATA[J&#8217;ai récemment passé mon poste de développement de Debian Testing vers Ubuntu 8.10. Comme toute installation from scratch, il faut passer par la case configuration. J&#8217;ai déjà expliqué comment modifier l&#8217;emplacement des données d&#8217;un serveur MySQL mais cette fois-ci on va aller encore plus loin : on ne va pas toucher aux fichiers de configuration [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai récemment passé mon poste de développement de Debian Testing vers Ubuntu 8.10. Comme toute installation <em>from scratch</em>, il faut passer par la case configuration.</p>
<p><img class="aligncenter size-full wp-image-1247" title="Configuration PHP personnalisée" src="http://case.oncle-tom.net/images/2008/12/php-custom.png" alt="" width="499" height="64" /></p>
<p>J&#8217;ai déjà expliqué comment <a href="http://case.oncle-tom.net/2008/05/04/modifier-emplacement-donnees-serveur-mysql/">modifier l&#8217;emplacement des données d&#8217;un serveur MySQL</a> mais cette fois-ci on va aller encore plus loin :</p>
<ul>
<li>on ne va pas toucher aux fichiers de configuration par défaut</li>
<li>on va pouvoir conserver toute notre configuration sur une partition séparée</li>
<li>on va être tranquille pour les éventuelles futures réinstallations</li>
</ul>
<p>C&#8217;est pas très compliqué à mettre en œuvre et au final, tout le monde y gagne !</p>
<p><span id="more-1198"></span></p>
<h3>Organisation du répertoire /home</h3>
<p>Le titre de l&#8217;article le suggère bien, cet article se consacre à la configuration des serveurs et programmes suivants :</p>
<ul>
<li>Apache 2</li>
<li><acronym title="Pre-Hypertext Processing">PHP</acronym> 5</li>
<li>MySQL 5</li>
<li>AppArmor (installé et activé par défaut depuis Ubuntu 8.04)</li>
</ul>
<p>Pour des raisons évidentes de facilité, j&#8217;ai donc créé un répertoire qui rassemble toutes mes configurations spécifiques. En voici son arborescence :</p>
<ul>
<li><strong>~/config</strong>
<ul>
<li>/<em>apache2</em>
<ul>
<li>sites-available
<ul>
<li>000-default-custom</li>
<li>local.monprojet.com</li>
<li>etc.</li>
</ul>
</li>
</ul>
</li>
<li>/<em>apparmor</em>
<ul>
<li>usr.sbin.mysqld-custom</li>
</ul>
</li>
<li>/<em>mysql</em>
<ul>
<li>my-custom.cnf</li>
</ul>
</li>
<li>/<em>php5</em>
<ul>
<li>php-custom.ini</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Nous écrirons dans ces fichiers uniquement les points de configuration que l&#8217;on souhaite adapter. C&#8217;est plus simple à maintenir. Qui plus est, si les fichiers de configuration sont mis à jour par leur serveur respectif, nos fichiers resteront à l&#8217;abri.</p>
<p>Un des <em>moto</em> de Debian c&#8217;est la <strong>configuration à base de fichiers</strong>. Vous trouverez régulièrement des répertoires ayant un nom suivant le motif <em>application.d</em>. Donc plutôt que d&#8217;avoir 1 seul fichier de configuration, on a 1 fichier initial plus des configurations additionnelles dans ces fameux répertoires &laquo;&nbsp;.d&nbsp;&raquo;.</p>
<h3>Configuration d&#8217;Apache</h3>
<p><img class="aligncenter size-full wp-image-1246" title="Logo Apache" src="http://case.oncle-tom.net/images/2008/12/apache-logo.gif" alt="" width="248" height="70" /></p>
<p>Pour Apache la démarche est la suivante :</p>
<ol>
<li>créer les <em>Virtual Host</em> dans son répertoire personnel</li>
<li>lier les fichiers dans <em>sites-available</em></li>
<li>activer les sites à l&#8217;aide de la commande <em>a2ensite</em></li>
<li>recharger Apache</li>
</ol>
<p>La seule étape par rapport à d&#8217;habitude c&#8217;est qu&#8217;on ne crée par les <em>Virtual Host</em> directement dans /etc/apache2/sites-available et qu&#8217;on les lie depuis notre répertoire personnel.<br />
Admettons que je souhaite créer un <em>Virtual Host</em> pour une instance locale de mon blog. Je vais procéder ainsi :</p>
<ol>
<li><kbd>gedit ~/conf/apache2/sites-available/local.case.oncle-tom.net</kbd><br />
J&#8217;y ai placé une configuration somme toute minimaliste :</p>
<pre><code class="text">&lt;VirtualHost *:80&gt;
ServerName local.case.oncle-tom.net
DocumentRoot /home/oncletom/workspace/case.oncle-tom.net
ErrorLog /var/log/apache2/error.case.oncle-tom.net.log
LogLevel warn
CustomLog /var/log/apache2/access.case.oncle-tom.net.log combined
ServerSignature On
&lt;/VirtualHost&gt;</code></pre>
</li>
<li><kbd>sudo ln -s ~/conf/apache2/sites-available/local.case.oncle-tom.net /etc/apache2/sites-available/local.case.oncle-tom.net</kbd></li>
<li><kbd>sudo a2ensite local.case.oncle-tom.net</kbd></li>
<li><kbd>sudo service apache2 reload</kbd></li>
</ol>
<p>On se fendra de l&#8217;ajout d&#8217;un hôte local dans le fichiers <em>hosts</em> pour coller au plus près à l&#8217;instance de production. Toutefois je ne connais pas d&#8217;autre moyen que de modifier le fichier d&#8217;origine :-/ Si vous avez une solution je suis preneur.</p>
<h3>Configuration de MySQL</h3>
<p><img class="aligncenter size-full wp-image-744" title="Logo MySQL" src="http://case.oncle-tom.net/images/2007/08/powered-by-mysql-167x86.png" alt="" width="167" height="86" /></p>
<p>Pour MySQL c&#8217;est un peu plus compliqué car on va également en profiter pour déplacer l&#8217;emplacement par défaut des données. Pourquoi ? Pour les placer sur une partition qui ne craindra pas les formattages et les réinstallation système.<br />
Si vous aviez déjà suivi ma <a href="http://case.oncle-tom.net/2008/05/04/modifier-emplacement-donnees-serveur-mysql/">procédure de déplacement des données MySQL</a> : oubliez là. Celle-ci est largement plus aboutie.</p>
<p>Avant de se jeter à corps perdu dans les manipulations, voici la démarche entreprise :</p>
<ol>
<li>créer le fichier de configuration MySQL</li>
<li>créer le répertoire qui accueillera les données MySQL</li>
<li>lier la base <em>mysql</em> d&#8217;origine</li>
<li>modifier la configuration d&#8217;AppArmor</li>
<li>recharger la configuration des serveurs AppArmor et MySQL</li>
</ol>
<p>C&#8217;est déjà un peu plus long mais là encore, il n&#8217;y a pas grand chose à faire en fin de compte :</p>
<ol>
<li><kbd>gedit ~/conf/mysql/my-custom.cnf</kbd><br />
On y indique le nouvel emplacement de ses données MySQL :</p>
<pre><code class="text">[mysqld]
datadir            = /home/oncletom/Apps/mysql</code></pre>
</li>
<li><kbd>mkdir /home/oncletom/Apps/mysql<br />
sudo chown mysql:mysql /home/oncletom/Apps/mysql</kbd></li>
<li><kbd>ln -s /var/lib/mysql/mysql /home/oncletom/Apps/mysql/mysql</kbd></li>
<li><kbd>sudo gedit /etc/apparmor.d/usr.bin.mysql</kbd><br />
J&#8217;y ai remplacé</p>
<pre><code class="text">/var/lib/mysql/ r,
/var/lib/mysql/** rwk,</code></pre>
<p>par l&#8217;ancien chemin + le nouvel emplacement des données MySQL</p>
<pre><code class="text">/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/home/oncletom/Apps/mysql/ r,
/home/oncletom/Apps/mysql/** rwk,</code></pre>
</li>
<li><kbd>sudo service apparmor reload &amp;&amp; sudo service mysql reload</kbd></li>
</ol>
<p>Si vous avez bien suivi toutes mes explications, vous vous demanderez pourquoi j&#8217;ai modifié le profil existant de MySQL dans AppArmor au lieu de lier un nouveau profil ?<br />
Je me suis rendu compte qu&#8217;au démarrage de l&#8217;<acronym title="Operating System">OS</acronym>, <strong>AppArmor ne chargeait pas le profil personnalisé</strong> et bloquait le démarrage de MySQL. J&#8217;ai créé un <a href="http://ubuntuforums.org/showthread.php?t=977830">sujet sur Ubuntu Forums</a> après une lecture de la <a href="https://help.ubuntu.com/community/AppArmor">documentation AppArmor</a> mais pas de nouvelles. Là aussi je suis preneur car en relançant les serveurs à la main, tout fonctionne.</p>
<p>Ensuite à vous de repeupler vos bases de données à partir d&#8217;un dump. Si vous procédez à un déplacement des répertoires, n&#8217;oubliez pas de tout préserver : propriétaire et permissions ! Ça se passe avec l&#8217;option <em>-a</em> de <em>cp</em> par exemple.</p>
<h3>Configuration de <acronym title="Pre-Hypertext Processing">PHP</acronym></h3>
<p><img class="aligncenter size-full wp-image-1245" title="Logo PHP" src="http://case.oncle-tom.net/images/2008/12/php.gif" alt="" width="120" height="67" /></p>
<p>Fort heureusement pour <acronym title="Pre-Hypertext Processing">PHP</acronym> c&#8217;est plus simple puisqu&#8217;il n&#8217;y a qu&#8217;un seul petit lien symbolique à faire.<br />
À noter que la configuration modifiée sera répercutée sur toutes les configurations de <acronym title="Pre-Hypertext Processing">PHP</acronym>, que ça soit pour Apache, en CLI ou <acronym title="Common Gateway Interface">CGI</acronym>.</p>
<ol>
<li><kbd>gedit ~/conf/php/my-custom.ini</kbd><br />
J&#8217;ai ai mis par exemple :</p>
<pre><code class="text">memory_limit = 64M</code></pre>
</li>
<li><kbd>sudo ln -s ~/conf/php/my-custom.ini /etc/php5/conf.d/my-custom.ini</kbd></li>
</ol>
<p>Et voilà c&#8217;est tout pour <acronym title="Pre-Hypertext Processing">PHP</acronym>. Il faut bien entendu recharger votre serveur Web (Apache ou Lighttpd par exemple) pour qu&#8217;ils prennent en compte la modification.</p>
<h3>Conclusion</h3>
<p>J&#8217;ai déjà appliqué cette méthode par 2 fois et que dire si ce n&#8217;est que tout va plus vite ainsi !<br />
Vos fichiers de configuration restent accessibles depuis votre gestionnaire de fichiers (pas besoin de passer en <em>sudo</em> pour sauvegarder les changements). Ils sont préservés de toute réinstallation impromptue.</p>
<p><strong>Vous ne touchez que de manière minimaliste aux fichiers de configuration d&#8217;origine</strong> :</p>
<ul>
<li>/etc/hosts pour ajouter un nom d&#8217;hôte (utile seulement si vous ne souhaitez pas utiliser <em>localhost</em>)</li>
<li>/etc/apparmor.d/usr.bin.mysql pour la raison évoquée plus haut &#8230; sinon on s&#8217;en serait passé</li>
</ul>
<p>J&#8217;ai cherché à faire pareil avec <em>phpmyadmin</em> mais il ne semble pas y avoir de mécanisme de ce type. Dommage.</p>
<p>J&#8217;imagine qu&#8217;il doit y avoir des moyens similaires avec d&#8217;autres serveurs et d&#8217;autres langages. Vous procédez à un reparamétrage systématique ou bien vous utilisez une technique de ce genre ?</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/configuration-apache-mysql-php-symlinks/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Conventions de programmation : la nécessaire maturité</title>
		<link>http://case.oncle-tom.net/2008/conventions-de-programmation-necessaire-maturite/</link>
		<comments>http://case.oncle-tom.net/2008/conventions-de-programmation-necessaire-maturite/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 05:00:04 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[coding standards]]></category>
		<category><![CDATA[conventions]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpdoc]]></category>
		<category><![CDATA[symfony]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1014</guid>
		<description><![CDATA[Tout développeur, que ce soit à l&#8217;école ou en apprenant sur le tas, écrit du code. J&#8217;espère n&#8217;avoir perdu personne à ce stade de l&#8217;explication Inconsciemment on cherchera à utiliser un style d&#8217;écriture avec lequel on se sent à l&#8217;aise, qu&#8217;on pourra et saura relire facilement et dans le meilleur des cas, qui pourra être [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><img class="size-full wp-image-1028" title="Exemple de code PHP" src="http://case.oncle-tom.net/images/2008/07/sample-php-code.png" alt="Exemple" width="500" height="184" /></p>
<p>Tout développeur, que ce soit à l&#8217;école ou en apprenant sur le tas, écrit du code. J&#8217;espère n&#8217;avoir perdu personne à ce stade de l&#8217;explication <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>Inconsciemment on cherchera à utiliser un style d&#8217;écriture avec lequel on se sent à l&#8217;aise</strong>, qu&#8217;on pourra et saura relire facilement et dans le meilleur des cas, qui pourra être relu par une autre personne sans avoir à engager d&#8217;interprète.</p>
<p>Tout développeur tend donc à utiliser des <a href="http://fr.wikipedia.org/wiki/Convention_de_nommage_(programmation)">conventions de programmation</a> (<em>coding standards</em>), que ce soit en <acronym title="HyperText Markup Language">HTML</acronym>, <acronym title="Pre-Hypertext Processing">PHP</acronym>, <acronym title="Cascading Style Sheets">CSS</acronym>, JavaScript ou même en Cobol. Et <strong>utiliser des conventions, c&#8217;est bien</strong> !</p>
<p><span id="more-1014"></span></p>
<h3>Quelle convention de nommage adopter ?</h3>
<p>Avant de choisir une convention, encore faudrait-il savoir quelles conventions existent :</p>
<ul>
<li>pas de convention</li>
<li><a href="http://fr.wikipedia.org/wiki/Notation_hongroise">convention hongroise</a></li>
<li><a href="http://pear.php.net/manual/fr/standards.php">convention PEAR</a></li>
<li><a href="http://www.symfony-project.org/book/1_0/02-Exploring-Symfony-s-Code">convention symfony</a></li>
<li><a href="http://framework.zend.com/manual/fr/coding-standard.html">convention Zend Framework</a></li>
<li><a href="http://codex.wordpress.org/WordPress_Coding_Standards">convention WordPress</a> (que j&#8217;abhorre)</li>
<li>etc.</li>
</ul>
<p>Autant dire qu&#8217;il y a de tout et pour tous les goûts.<br />
Ce qu&#8217;il faut retenir d&#8217;<strong>une convention c&#8217;est qu&#8217;elle explicite des règles de développement</strong> :</p>
<ul>
<li>sur le nommage des éléments</li>
<li>sur l&#8217;indentation des éléments</li>
<li>sur les structures de contrôle (if, else, tout ça quoi)</li>
<li>sur la syntaxe des commentaires</li>
<li>sur la syntaxe de la documentation (le code auto-documenté c&#8217;est bon !)</li>
<li>sur l&#8217;organisation des fichiers, éventuellement</li>
</ul>
<p>C&#8217;est pour ça que partir sur une <strong>convention parfaite sur le papier mais inapplicable est une vaste fumisterie</strong>. L&#8217;idéal étant de pouvoir reprendre du code dans un projet sans avoir eu besoin de lire la documentation pour en comprendre l&#8217;organisation.</p>
<p>Mon conseil : <strong>essayez, choisissez</strong> mais ne prenez pas non plus trop laxiste en terme de notation.<br />
Une chose est sure : quand on a essayé une belle</p>
<h3>Mes conventions de nommage en <acronym title="Pre-Hypertext Processing">PHP</acronym></h3>
<p style="text-align:center"><a href="http://case.oncle-tom.net/images/2008/07/eclipse-php-code-sample.png"><img class="size-medium wp-image-1022" title="Exemple de code PHP dans Eclipse" src="http://case.oncle-tom.net/images/2008/07/eclipse-php-code-sample-300x207.png" alt="Exemple de code PHP dans Eclipse" width="300" height="207" /></a></p>
<p>J&#8217;avoue, la notation utilisée dans <a href="http://www.symfony-project.org/">symfony</a> m&#8217;a tellement plu que je la réutilise quasiment partout. Ci-dessus, une illustration montrant du code pour un <a href="http://case.oncle-tom.net/code/wordpress/">plugin WordPress</a> (en <acronym title="Pre-Hypertext Processing">PHP</acronym> 4 malheureusement &#8230;). Elle en présente un bon aperçu.</p>
<h4>Notation</h4>
<p>J&#8217;utilise UpperCamelCase pour le nommage des classes <em>sauf</em> s&#8217;il y a un préfixe qui, lui, reste en minuscule.<br />
<em>Exemples</em> : <code>class AmazonWidgetsShortcodes</code>, <code>class sfUploader</code>.</p>
<p>Pour ce qui est méthodes de classes, j&#8217;utilise lowerCamelCase. Comme ça on sait qu&#8217;on reste dans un objet et c&#8217;est pas plus mal.</p>
<p>Enfin, pour les fonctions orphelines, <em>helpers</em> &amp; cie, c&#8217;est tout en minuscule séparé par des underscore (un nom particulier à ça ? <em>lowered_and_underscored</em> ? <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )<br />
<em>Exemple</em> : <code>add_filter()</code></p>
<h4>Indentation</h4>
<p>Dans l&#8217;indentation il y a 2 camps : celui des espaces et celui des tabulations.</p>
<p>J&#8217;ai suivi celui des <strong>espaces</strong> pour une simple et bonne raison : 1 tabulation a une taille différente selon les éditeurs, que ça soit votre IDE, votre shell ou n&#8217;importe quel logiciel de texte. L&#8217;idéal est d&#8217;avoir un rendu identique dans tous les éditeurs sans paramétrage.</p>
<p>En revanche, là encore je suis mais j&#8217;aime, je suis sur une <strong>tabulation à 2 espaces</strong> : c&#8217;est bête mais je trouve ça plus esthétique et on arrive moins rapidement à la limite de 80 caractères.</p>
<p>Cette &laquo;&nbsp;limite&nbsp;&raquo; n&#8217;est que virtuelle mais ouvrez un terminal, 80 lignes par défaut. C&#8217;est plus confortable de rester en-dessous de ce nombre. Ceci dit je fais quelques exceptions, des fois <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h4>Structures de contrôle</h4>
<p>On pourrait résumer à <cite>1 ligne = 1 action</cite> et 2 types d&#8217;utilisation.</p>
<p>Tout d&#8217;abord les structures dans le code à proprement parler :</p>
<ul>
<li>un espace entre l&#8217;opérateur et la parenthèse ouvrante</li>
<li>un retour à la ligne à chaque accolade</li>
<li>pas d&#8217;espaces dans les lignes vides (résidus d&#8217;indentation)</li>
<li>systématiquement les accolades, même en cas de ligne unique après l&#8217;opérateur</li>
<li>opérateur ternaire quand ça reste simple, pas trop long et plus lisible</li>
</ul>
<p>Côté templating en revanche j&#8217;utilise la <a href="http://fr.php.net/manual/fr/control-structures.alternative-syntax.php">syntaxe alternative de <acronym title="Pre-Hypertext Processing">PHP</acronym></a> à raison d&#8217;un opérateur par ligne :</p>
<pre><code class="php">&lt;ol class="posts"&gt;
&lt;?php foreach($posts as $post): ?&gt;
  &lt;li id="post-&lt;?php echo $post-&gt;getId() ?&gt;"&gt;
    &lt;a href="&lt;?php $post-&gt;getPermalink() ?&gt;"&gt;
      &lt;?php echo $post-&gt;getTitle() ?&gt;
    &lt;/a&gt;
  &lt;/li&gt;
&lt;?php endforeach ?&gt;
&lt;/ol&gt;</code></pre>
<h4>Syntaxe de la documentation</h4>
<p>Enfin, pour terminer sur la partie <acronym title="Pre-Hypertext Processing">PHP</acronym>, <a href="http://www.phpdoc.org/">PHPDoc</a> est surpuissante en plus d&#8217;être simple à utiliser. Comble du bonheur, sa syntaxe est réutilisable dans d&#8217;autres langages.</p>
<p>PHPDoc est le principe du <strong>code autodocumenté</strong> :</p>
<ol>
<li>vous commentez votre code avec la syntaxe PHPDoc</li>
<li>vous générez sa documentation avec le programme PHPDoc (en <acronym title="HyperText Markup Language">HTML</acronym>, <acronym title="Portable Document Format">PDF</acronym> etc.)</li>
</ol>
<p>L&#8217;idéal est de <strong>documenter en même temps qu&#8217;on produit le code</strong>. Par principe on revient rarement sur son propre code juste pour le loisir de le décrire, par manque de temps ou par flemme.</p>
<h3>Mes conventions de nommage en JavaScript</h3>
<p style="text-align:center"><a href="http://case.oncle-tom.net/images/2008/07/eclipse-javascript-code-sample.png"><img class="size-medium wp-image-1021" title="Exemple de code JavaScript dans Eclipse" src="http://case.oncle-tom.net/images/2008/07/eclipse-javascript-code-sample-300x288.png" alt="Exemple de code JavaScript dans Eclipse" width="300" height="288" /></a></p>
<p>Ne vous inquiétez pas, je ne vais pas tout recommencer pour JavaScript <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Je suis à peu près la même logique qu&#8217;en <acronym title="Pre-Hypertext Processing">PHP</acronym> à part pour les accolades.</p>
<p>En effet si je conserve un comportement similaire pour les structures de contrôles (1 accolade par ligne) :</p>
<ul>
<li>je ne fais pas de retour à la ligne sur les accolades/parenthèse ouvrante d&#8217;une fonction/objet anonyme</li>
<li>je ne fais pas de retour à la ligne après une accolade/parenthèse fermante s&#8217;il y a une virgule ou parenthèse après</li>
</ul>
<pre><code class="javascript">var OncleTom = {
  age:      25,
  pensee:   function(){
    return this.age * Math.random()
  }
};</code></pre>
<h3>Mes conventions de nommage en <acronym title="Cascading Style Sheets">CSS</acronym></h3>
<p style="text-align:center"><img class="aligncenter size-full wp-image-879" title="Folding en CSS" src="http://case.oncle-tom.net/images/2008/02/css-folding.png" alt="" width="500" height="138" /></p>
<p>Inutile de paraphraser ce que j&#8217;ai déjà écris dans mon article sur les <a href="http://case.oncle-tom.net/2008/02/26/bonnes-pratiques-codage-css/">bonnes pratiques de codage <acronym title="Cascading Style Sheets">CSS</acronym></a>.</p>
<p>Deux lectures en une oui <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Conclusion</h3>
<p>Bon au final on voit que ce n&#8217;est pas si compliqué que ça d&#8217;apporter un brin de rigueur.<br />
On pourra même s&#8217;amuser à compléter le tout par la disposition des méthodes et fonctions d ans un fichier par ordre alphabétique (j&#8217;en connais un que ça fera sourire <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ).</p>
<p>Les vues <em>Outline</em> fournissent un plan du code et certains logiciels ne semblent pas disposer d&#8217;une fonction de tri. Et au cas où un jour vous n&#8217;auriez pas votre IDE favori sous le nez, ça ne mange pas de pain de fonctionner ainsi.</p>
<p style="text-align:center"><img class="size-full wp-image-1020" title="Plan de code dans Eclipse (Outline)" src="http://case.oncle-tom.net/images/2008/07/eclipse-outline.png" alt="Plan de code dans Eclipse (Outline)" width="334" height="288" /></p>
<p>Que l&#8217;on travaille seul à plusieurs, et à plus fortes raison dans ce dernier cas, l&#8217;utilisation de notations et conventions est un gage de qualité. Ça rend le travail plus facilement interopérable avec d&#8217;autres développeurs, plus facile à relire, plus facile à maintenir.</p>
<p><strong>Ça n&#8217;empêchera jamais des bugs</strong> ou de sortir du mauvais code mais c&#8217;est ça, c&#8217;est une autre histoire.</p>
<p>Enfin, j&#8217;aimerais terminer cet article en écrivant qu&#8217;il a fait l&#8217;objet d&#8217;une <a href="http://blog.damienalexandre.fr/index.php?post/2008/07/19/Mes-conventions-de-programmation">chaîne par le Padawan PHPiste Damien Alexandre</a>. C&#8217;était l&#8217;occasion de faire une réponse qui passe inaperçue <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Ça ne m&#8217;empêchera en revanche pas de refiler la patate chaude à <a href="http://prendreuncafe.com/blog/">NicoDePrendreUnCafé</a>, de tenter d&#8217;insuffler de l&#8217;activité au blog de <a href="http://lacot.org/blog">Xavier Lacot</a>, de Spipifier <a href="http://www.gasteroprod.com">Gastero Prod</a>, d&#8217;extirper une technique ninja pyjama à <a href="http://shiii.org/">remouk</a> et pourquoi pas lire avec attention l&#8217;avis pythonien de <a href="http://www.biologeek.com/journal/">David Larlet</a> ?</p>
<p>Et <em>just for fun</em>, un petit coup d&#8217;électrode à un de mes futurs étudiants, <a href="http://blog.thierry.poinot.fr/">Thierry Poinot</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/conventions-de-programmation-necessaire-maturite/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Livre blanc sur les frameworks PHP : présentation et explications</title>
		<link>http://case.oncle-tom.net/2008/livre-blanc-frameworks-php-presentation-et-explications/</link>
		<comments>http://case.oncle-tom.net/2008/livre-blanc-frameworks-php-presentation-et-explications/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 05:00:55 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[admin generator]]></category>
		<category><![CDATA[bonne pratique]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[clever age]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[entreprises]]></category>
		<category><![CDATA[ez components]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[livre blanc]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[scaffolding]]></category>
		<category><![CDATA[symfony]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=926</guid>
		<description><![CDATA[Il existe 4 phases dans la vie d&#8217;un développeur : celle où il aime tout créer lui-même celle où il aime utiliser un outil déjà tout prêt celle où il aime concevoir son outil avec d&#8217;autres outils tout prêt celle où il aime que les autres conçoivent pour lui (mais là il est patron ou [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><a href="http://www.clever-age.com/veille/publications/livres-blancs/livre-blanc-frameworks-php-pour-l-entreprise.html"><img class="aligncenter size-full wp-image-927" title="Couverture du livre blanc «Frameworks PHP pour l\'entreprise»" src="http://case.oncle-tom.net/images/2008/06/couverture-livre-blanc.png" alt="Couverture du livre blanc «Frameworks PHP pour l\'entreprise»" width="141" height="200" /></a></p>
<p>Il existe 4 phases dans la vie d&#8217;un développeur :</p>
<ol>
<li>celle où il aime <strong>tout créer</strong> lui-même</li>
<li>celle où il aime <strong>utiliser un outil</strong> déjà tout prêt</li>
<li>celle où il aime <strong>concevoir son outil</strong> avec d&#8217;autres outils tout prêt</li>
<li>celle où il aime que <strong>les autres conçoivent pour lui</strong> (mais là il est patron ou armé d&#8217;une horde de stagiaires <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</li>
</ol>
<p>Les <em>frameworks</em> font partie de cette troisième catégorie. Ils existent dans à peu près tous les langages : <acronym title="Cascading Style Sheets">CSS</acronym>, <acronym title="Pre-Hypertext Processing">PHP</acronym>, JavaScript, Java, C#, Python, Ruby etc.<br />
Mon discours portera sur les frameworks <acronym title="Pre-Hypertext Processing">PHP</acronym>, parce que c&#8217;est mon langage de prédilection mais aussi parce qu&#8217;un <a href="http://www.clever-age.com/veille/publications/livres-blancs/livre-blanc-frameworks-php-pour-l-entreprise.html">livre blanc sur les frameworks <acronym title="Pre-Hypertext Processing">PHP</acronym> pour l&#8217;entreprise</a> est récemment sorti. Il parlera aussi bien aussi bien aux décisionnels qu&#8217;aux développeurs, à leur compte ou pour celui d&#8217;une entreprise.<br />
<span id="more-926"></span></p>
<h3>De l&#8217;intérêt d&#8217;utiliser un framework</h3>
<p>Un <em>framework</em> est littéralement ce que l&#8217;on peut appeler un socle logiciel : il propose des fonctionnalités de base et vous les utilisez pour concevoir votre propre application.</p>
<p>J&#8217;essaierai de faire court en énumérant une liste de quelques points à faire valoir dans l&#8217;utilisation d&#8217;un framework pour concevoir une application Web :</p>
<ul>
<li><strong>développement accéléré</strong></li>
<li><em>convention over configuration</em> : suivez les rails des conventions plutôt que de tout paramétrer</li>
<li><acronym title="Don't Repeat Yourself">DRY</acronym> : écrivez le code une fois et réutilisez-le pour éviter le copier-coller (sans parler des gains de maintenabilité)</li>
<li><strong>mutualisation du code</strong> : un même socle pour plusieurs applications</li>
<li>concentration du développement sur le <strong>code métier</strong></li>
<li>le framework vous décharge des tâches pénibles : sécurité, gestion des <acronym title="Uniform Resource Locator">URL</acronym>, gestion des permissions utilisateur, manipulation des bases de données, gestion du cache, accès aux fichiers etc.</li>
<li><strong>génération automatique</strong> d&#8217;interfaces (<em>admin generator</em>), de base de données (<em>ORM</em>), de modules/applications (<em>scaffolding</em>) etc.</li>
<li><strong>vecteur d&#8217;apprentissage</strong> individuel et collectif</li>
<li>bénéfices de tout le travail d&#8217;une communauté &#8230; et de celui que vous réinjecterez</li>
</ul>
<p><em>A contrario</em>, on pourra critiquer les frameworks pour leur plus forte consommation en ressources qu&#8217;un développement maison.<br />
Ce n&#8217;est évidemment pas une raison valable pour passer à côté d&#8217;autant plus qu&#8217;il existe de nombreuses solutions pour palier/réduire ce problème avec les gestionnaires de cache et les accélérateurs de code.</p>
<p style="text-align:center"><img class="aligncenter size-full wp-image-928" title="Exemple d'arborescence de projet symfony" src="http://case.oncle-tom.net/images/2008/06/exemple-application-symfony.png" alt="Exemple d'arborescence de projet symfony" width="344" height="474" /></p>
<h3>Framework <acronym title="Pre-Hypertext Processing">PHP</acronym> ou <acronym title="Content Management System">CMS</acronym> ?</h3>
<p>Maintenant vous me direz : <strong>pourquoi développer un logiciel avec un framework au lieu d&#8217;utiliser un bon <acronym title="Content Management System">CMS</acronym> des familles</strong> ou tout autre logiciel faisant son office ?<br />
Ce n&#8217;est à mon sens pas la bonne question à se poser : <strong>un framework n&#8217;est pas une fin en soi</strong>. Le choix du logiciel dépendra essentiellement du besoin, immédiat et futur. Vous aurez beau avoir le meilleur développeur d&#8217;un <acronym title="Content Management System">CMS</acronym> de votre pays, si le choix de la solution technique est déjà erroné, il ne suffira pas à éviter la catastrophe.</p>
<p>J&#8217;ai beaucoup accroché à cette formule le jour où je l&#8217;ai entendu : si vous estimez à au moins 50% l&#8217;utilisation de spécifiques dans une solution logicielle existante de type <acronym title="Content Management System">CMS</acronym>, vous faites fausse route. Le spécifique EST votre solution, le <acronym title="Content Management System">CMS</acronym> devient une simple fonctionnalité.<br />
Dans le cas d&#8217;un développement spécifique, le choix d&#8217;un framework est dans ce cas naturellement prescrit.</p>
<p>Dans tous les cas, <strong>ce sont vos besoins qui doivent vous guider vers le choix d&#8217;une solution</strong> et non l&#8217;inverse. Ne partez pas surtout d&#8217;une solution pour tenter d&#8217;y combler vos besoins.</p>
<h3>Les principaux frameworks <acronym title="Pre-Hypertext Processing">PHP</acronym></h3>
<p>Le <a href="http://www.clever-age.com/veille/publications/livres-blancs/livre-blanc-frameworks-php-pour-l-entreprise.html">livre blanc sur les frameworks <acronym title="Pre-Hypertext Processing">PHP</acronym></a> expose en détail les frameworks majeurs en <acronym title="Pre-Hypertext Processing">PHP</acronym> avec leurs avantages, inconvénients et surtout une <strong>grille comparative</strong> permettant de mettre à bout à bout leurs différentes fonctionnalités.</p>
<p>Toutefois on peut retenir ces noms de frameworks <acronym title="Pre-Hypertext Processing">PHP</acronym> :</p>
<ul>
<li><a href="http://cakephp.org/">CakePHP</a></li>
<li><a href="http://codeigniter.com/">CodeIgniter</a></li>
<li><a href="http://ez.no/fr/ezcomponents">EZ Components</a></li>
<li><a href="http://pear.php.net/">PEAR</a></li>
<li><a href="http://www.symfony-project.org/">symfony</a></li>
<li><a href="http://framework.zend.com/">Zend Framework</a></li>
</ul>
<p>On pourrait classer ces frameworks en 2 catégories :</p>
<ul>
<li>les <strong>briques logicielles</strong> : ils se présentent comme des briques indépendantes qu&#8217;on peut utiliser à souhait dans n&#8217;importe quel projet, y compris d&#8217;autres frameworks. C&#8217;est notamment le cas de <em>PEAR</em>, <em>EZ Components</em> et <em>Zend Framework</em> ;</li>
<li>les <strong>frameworks à proprement parler</strong> : ils imposent une structure particulière et des lignes directrices de développement pour être plus efficace. On citera dans ce cas <em>symfony</em>, <em>CodeIgniter</em> et <em>CakePHP</em></li>
</ul>
<h3>symfony : champion toutes catégories</h3>
<p style="text-align:center"><img class="size-full wp-image-929" title="Écran de première installation de symfony" src="http://case.oncle-tom.net/images/2008/06/symfony-first-install.gif" alt="Écran de première installation de symfony" /></p>
<p>Lors de la lecture du <a href="http://www.clever-age.com/veille/publications/livres-blancs/livre-blanc-frameworks-php-pour-l-entreprise.html">livre blanc sur les frameworks <acronym title="Pre-Hypertext Processing">PHP</acronym></a>, vous remarquerez très probablement que le framework <em>symfony</em> a tout pour plaire. C&#8217;est en effet à l&#8217;heure où j&#8217;écris ces lignes le framework <acronym title="Pre-Hypertext Processing">PHP</acronym> le plus abouti et le plus intéressant à analyser.<br />
Il jouit d&#8217;une excellente réputation, d&#8217;une incroyable stabilité et d&#8217;une communauté très active, quantitativement et qualitativement parlant. Si on ne devait en garder qu&#8217;un, ça serait lui.</p>
<p>Pourquoi j&#8217;apprécie énormément symfony :</p>
<ul>
<li>une documentation fonctionnelle <strong>et</strong> une documentation de l&#8217;<acronym title="Application Programming Interface">API</acronym> complètes</li>
<li>utilisation intensive de fichiers <acronym title="Yet Another Markup Language"><acronym title="Yet Another Markup Language">YAML</acronym></acronym> pour le paramétrage</li>
<li>les fonctionnalités d&#8217;<strong>amin generator</strong>, de gestion de base de données avec l&#8217;ORM <a href="http://propel.phpdb.org/">Propel</a> et les outils d&#8217;automatisation qui en découlent</li>
<li><strong>facilité d&#8217;intégration d&#8217;Ajax</strong> sans pondre une seule ligne de JavaScript</li>
<li>grand confort de développement</li>
<li>des conventions inspirées des plus grands (Ruby on Rails, Django etc.)</li>
</ul>
<h3>Conclusion</h3>
<p>Développeurs : <strong>renseignez-vous et intéressez-vous à au moins un framework</strong>. C&#8217;est bien pour le CV et vous gagnerez du temps.<br />
Décideurs : <strong>exigez de savoir quelle solution on vous préconise</strong> et surtout, pourquoi celle-là. À plus forte raison si votre projet comporte beaucoup de besoins spécifiques, demandez s&#8217;il s&#8217;agit d&#8217;un framework et si ce n&#8217;est pas le cas, pourquoi ça n&#8217;a pas été envisagé. Vous gagnerez aussi du temps et j&#8217;espère de l&#8217;argent.</p>
<p><strong>Les frameworks sont aujourd&#8217;hui partout</strong> et ont acquis une certaine maturité. Ces lettres de noblesse les rendent utilisables aussi bien pour des petits besoins que ceux d&#8217;entreprises, peu importe leur taille. Les gains de temps et l&#8217;incitation à la production de qualité sont des facteurs non-négligeables pour la pérennité de vos applications.<em></em></p>
<p><em>Attention</em> toutefois : un mauvais développeur et/ou une mauvaise conception prédomineront toujours. Votre fromage industriel aura toujours le même goût, peu importe la qualité du pain <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Je radote mais j&#8217;espère que vous trouverez suffisamment d&#8217;informations pour vous convaincre dans le <a href="http://www.clever-age.com/veille/publications/livres-blancs/livre-blanc-frameworks-php-pour-l-entreprise.html">livre blanc des frameworks <acronym title="Pre-Hypertext Processing">PHP</acronym> pour l&#8217;entreprise</a>. C&#8217;est ce genre de publications qui me font aimer la société dans laquelle je travaille <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/livre-blanc-frameworks-php-presentation-et-explications/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

